From 62466df1b565c1034484ad993861c0b321c55148 Mon Sep 17 00:00:00 2001 From: alexandredevely <12896316+alexandredevely@users.noreply.github.com> Date: Sat, 9 Mar 2024 17:08:47 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20abcdeskt?= =?UTF-8?q?opio/docs@921c19d6907a22aeedc9a7fdbf5aa12f2902bcb6=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/3.0/update_frontend_image/index.html | 2 +- search/search_index.json | 2 +- sitemap.xml.gz | Bin 2419 -> 2419 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/3.0/update_frontend_image/index.html b/common/3.0/update_frontend_image/index.html index 0e5f3415b..e3509bcaf 100644 --- a/common/3.0/update_frontend_image/index.html +++ b/common/3.0/update_frontend_image/index.html @@ -3808,7 +3808,7 @@

Update the ui.json with your own
  "name": "acmedesktop.io",
   "projectNameSplitedHTML": "<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>",
 
-

An change the color x11bgcolor

+

Change the color @x11bgcolor with your own.

diff --git a/search/search_index.json b/search/search_index.json index 48c9712c5..94010b387 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"abcdesktop.io is a cloud native desktop service built on and for Kubernetes.","text":"

abcdesktop.io is a cloud native desktop service built on and for Kubernetes. abcdesktop.io is also a complete work environment accessible from a simple HTML 5 web browser, without any installation. Like serverless does, desktopless computing allocates desktop resources on demand. Each user\u2019s application runs as a container to reduce attack surface.

abcdeskop.io is an open source and free solution that offers seamless access to secure desktops and applications on any device, follow the https://github.com/abcdesktopio links.

This flexible working environment simplifies usage like

"},{"location":"#quick-online-preview","title":"Quick online preview","text":"

You can discover abcdesktop.io desktopless services on the demo website. https://demo.abcdesktop.io instance is a quick example to illustrate how the abcdesktop.io project works. Your desktopless is ready to run for 10 minutes, and will be terminated by the garbage collector after 10 minutes. It requires an OpenID Connect provider to sign-in like (Google, Facebook, Github). The security policy for Internet network prevents requests from your abcdesktop being allowed. Printer service (using cups) and sound service (using pulseaudio) inside the kubernetes pods are enabled.

To reach the demo website, follow the link https://demo.abcdesktop.io

"},{"location":"#abcdesktopio-a-container-vdi-service","title":"abcdesktop.io:\u00a0a container VDI service","text":"

abcdesktop.io provides a way to run graphics software securely isolated in a container, and use a web browser HTML5 as display device. Because containers are lightweight and run without the extra load of an operating system, you can run many graphical applications on a single kernel or even on a kubernetes cluster.

"},{"location":"#quick-installation-for-kubernetes","title":"Quick installation for kubernetes","text":"

You can watch the youtube video sample. This video describes the Quick installation process.

Download and extract the latest release automatically (Linux or macOS) or read the step by step installation process abcdesktop for kubernetes

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh | sh -\n
"},{"location":"#adopters","title":"Adopters","text":"

Here are some of the organizations we know are using abcdesktop.io. If you\u2019re using Abcdesktop and aren\u2019t on this list, please submit a pull request!

Adopters Name Description Public applications repository Embl The European Molecular Biology Laboratory is an intergovernmental organization dedicated to molecular biology research and is supported by 28 member states, one prospect state, and one associate member state https://git.embl.de/ysun/abcdesktop-apps/ Orange Telecommunications operator and digital service provider. Orange serves 287 million customers, individuals, professionals, and large companies Orange uses common public and private business applications"},{"location":"#features","title":"Features","text":""},{"location":"#applications","title":"Applications","text":""},{"location":"#supported-web-browser-html","title":"Supported web browser HTML","text":"

abcdesktop.io uses many modern web technologies. However these are the minimum versions we are currently aware of:

"},{"location":"#copy-and-paste-features","title":"Copy and Paste features","text":"

To fully use copy and paste features, from your local device to your abcdesktop (and vice versa), choose Chrome, Chromium or Microsoft Edge Chromium. The copy and paste feature is also supported on Firefox with a dedicated abcdesktop extension.

Web browser Clipboard sync Chrome Yes, built in support Chromium Yes, built in support Microsoft Edge Chromium Yes, built in support Firefox Yes, install the dedicated abcdesktop extension Safari No, the clipboard access is not allowed by the user agent or the platform in the current context, possibly because the user denied permission"},{"location":"#not-supported-web-browser","title":"Not supported web browser","text":"

abcdesktop.io does NOT support Microsoft Internet Explorer from version 1.x to 11.x. If you need a Microsoft web browser use Microsoft Edge. Edge is based on the Chromium open-source project. Chromium forms the basis of Google Chrome, so the new Edge feels very similar to Google Chrome.

"},{"location":"#release-history","title":"Release history","text":"Release Status Date Requirements Applications \u00a0Documentation 1.1 deprecated 09/15/2021 dockerd for personnal use and kubernetes An application is a docker container removed 2.9 deprecated 29/08/2022 require kubernetes < 1.24 and dockerd as container engine An application is a pod or a docker container removed 3.0 deprecated 09/03/2022 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container Release 3.1 stable 10/03/2023 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container, change PVC and PV support Release 3.2 stable 01/02/2024 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container, WebRTC sound support Release"},{"location":"#github-repositories","title":"Github repositories","text":"

abcdesktop has 42 repositories available. Follow the code on GitHub https://github.com/abcdesktopio to get the source code.

"},{"location":"adopters/","title":"Adopters","text":"

Here are some of the organizations we know are using abcdesktop.io.

Adopters Name Description Public applications repository Embl The European Molecular Biology Laboratory is an intergovernmental organization dedicated to molecular biology research and is supported by 28 member states, one prospect state, and one associate member state https://git.embl.de/ysun/abcdesktop-apps/ Orange Telecommunications operator and digital service provider. Orange serves 287 million customers, individuals, professionals, and large companies Orange uses common public and private business applications

If you\u2019re using Abcdesktop and aren\u2019t on this list, please submit a pull request to add entry in this list.

"},{"location":"applicationsformat/","title":"Application image format","text":"

abcdesktop.io uses OCI container image format and add some labels to describe the application. Labels add metadata to the container image.

"},{"location":"applicationsformat/#requirements","title":"Requirements","text":""},{"location":"applicationsformat/#labels","title":"Labels","text":"

Docker images applications for abcdesktop use docker's LABELS as metadata. To select only abcdesktop applications from standard docker images, all abcdesktop's applications must have a label 'oc.type' set to the value 'app'.

LABEL oc.type=app\n
"},{"location":"applicationsformat/#label-descriptions","title":"Label descriptions","text":"Label name Type Description Sample oc.icon string icon filename use by the web interface for the application, MUST suffix in .svg format writer.svg oc.icondata string icon file SVG data uuencoded PD94b...C9zdmc+Cg== oc.keyword string keywords use by the web application search engine separated by comma(,) firefox,mozilla,web,internet oc.desktopfile string .desktop gnome file name /usr/share/applications/firefox.desktop oc.cat string category use by the web application store, choose one value of the default list [ 'office', 'games', 'graphics', 'development', 'utilities', 'education' ] office oc.launch string X11 Windows Class name. It MUST be unique use the command 'wmctrl -lx' to can the right name oc.template string Template name to use FROM in the DockerFile oc.template.gtk.firefox oc.path string Path to the application binary /usr/bin/firefox oc.args string arguments added to the command --open oc.name string Name of the application Firefox oc.displayname string Display Name show by Web interface Firefox oc.type string Always set to the value 'app' app oc.mimetype string MimeType supported by the application separated by semicolon(;) text/html;text/xml;application/xml;application/rss+xml;video/webm oc.showinview string Set to the dock to add this app in dock dock oc.fileextensions string Supported extensions file, separated by semicolon(;) htm;html;xml;gif oc.legacyfileextensions string Legacy file extensions, separated by semicolon(;) htm;html;xml oc.host_config dict dictionary of resources (see resources details) { 'shm_size': '1g' }

Example for Firefox application

LABEL oc.icon=\"firefox.svg\"\nLABEL oc.keyword=\"firefox,mozilla,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.launch=\"Navigator.Firefox\"\nLABEL oc.template=\"oc.template.gtk.firefox\"\nLABEL oc.name=\"Firefox\"\nLABEL oc.displayname=\"Firefox\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\n
"},{"location":"applicationsformat/#host_config-resource-description","title":"host_config resource description","text":"

host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

For example you can set low cpu and memory values to an application like the great X11 xeyes.

{   \n    \"mem_limit\":  \"32M\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n

Read the dedicated chapter for resource description, to get more informations on host_config

"},{"location":"applicationsformat/#inspect-an-abcdesktop-docker-images","title":"Inspect an abcdesktop docker images","text":"

To download an abcdesktop docker image, run the command

docker pull abcdesktopio/firefox.d\n

To inspect the labels in the docker image, run docker inspect

docker inspect abcdesktopio/firefox.d:latest\n

Read the labels section :

\"Labels\": {\n                \"architecture\": \"x86_64\",\n                \"oc.cat\": \"office\",\n                \"oc.desktopfile\": \"firefox.desktop\",\n                \"oc.displayname\": \"Firefox\",\n                \"oc.fileextensions\": \"htm;html;xml;gif\",\n                \"oc.icon\": \"firefox.svg\",\n                \"oc.icondata\": \"PD94b.. CUT HERE ...C9zdmc+Cg==\",\n                \"oc.keyword\": \"firefox,mozilla,web,internet\",\n                \"oc.launch\": \"Navigator.Firefox\",\n                \"oc.legacyfileextensions\": \"htm;html;xml\",\n                \"oc.mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n                \"oc.name\": \"Firefox\",\n                \"oc.path\": \"/usr/bin/firefox\",\n                \"oc.showinview\": \"dock\",\n                \"oc.template\": \"oc.template.gtk.firefox\",\n                \"oc.type\": \"app\",\n                \"oc.usedefaultapplication\": \"true\",\n                \"release\": \"5\",\n                \"vcs-ref\": \"master\",\n                \"vcs-type\": \"git\",\n                \"version\": \"1.2\"\n }\n
"},{"location":"applicationsformat/#the-inheritance-of-the-images","title":"The inheritance of the images","text":"

All abcdesktop applications use by default the oc.template.gtk images name.

"},{"location":"applicationsformat/#the-inheritance-of-the-classes","title":"The inheritance of the classes.","text":"

By default, oc.templace.gtk is the main image for all applications. For example oc.template.gtk.firefox use the oc.template.gtk image. oc.template.gtk.firefox.acme use the oc.template.gtk.firefox.

+------------------------------+\n|oc.template.gtk.firefox.acme  |\n+---------------+--------------+\n                |\n                |\n+---------------+--------------+\n|oc.template.gtk.firefox       |\n+---------------+--------------+\n                |\n                |\n+---------------+--------------+\n|oc.template.gtk               |\n+---------------+--------------+\n
"},{"location":"architecture/","title":"Architecture in docker mode","text":""},{"location":"architecture/#abcdesktop-workflow-with-ldap-auth","title":"abcdesktop workflow (with LDAP Auth)","text":"
  1. User login, get a user JWT
  2. Create a user POD (or a container) and retrieve a Desktop JWT
  3. Run, the user is connected to his own POD (or container)

    • All JWT are signed with RSA keys.
    • All JWT payload are encrypted with RSA keys
"},{"location":"architecture/#services-infrastructure","title":"Services Infrastructure","text":"

The service infrastructure is based on :

The user creates a pod user

"},{"location":"architecture/#roles-summary","title":"Roles summary","text":""},{"location":"architecture/#pyos","title":"pyos","text":"

pyos is the core abcdesktop service act as a control plane. Pyos is a stateless services, Pyos's roles are :

When a new user is authenticated, a dedicated user container is created. When the user starts an application (like LibreOffice for example) a dedicated application container is created.

"},{"location":"architecture/#nginx","title":"nginx","text":"

nginx container act as web server and websocket reverse proxy.

"},{"location":"architecture/#mongo","title":"mongo","text":"

mongo is used by pyos to store user profil informations. The profil informations are :

"},{"location":"architecture/#memcached","title":"memcached","text":"

memcache stores progress text message information during login process. memcache datas are set and get only by the control plane.

"},{"location":"architecture/#ocuser","title":"oc.user","text":"

oc.user is the name of the user's container image. oc.user runs the X11 graphical service. oc.user is based on ubuntu distribution.

"},{"location":"architecture/#applications","title":"applications","text":"

All applications are containers or pods, and share a graphical socket with the user's container

"},{"location":"buildapplications.wine/","title":"Build abcdesktop docker image for Microsoft Windows using Wine","text":""},{"location":"buildapplications.wine/#requirements","title":"Requirements","text":"

abcdesktop can run Microsoft Windows applications using Wine.

"},{"location":"buildapplications.wine/#wine-embedded-in-octemplategtkwine-image","title":"wine embedded in oc.template.gtk.wine image","text":"

To run Windows applications abcdesktop use wine. A dedicated image template source is ready to use as source of others Windows applications. This template is named abcdesktopio/oc.template.gtk.wine.

Start pulling this template image, if you don't have already done in the previous exercice :

docker pull abcdesktopio/oc.template.gtk.wine\n

This image embeded the architecture format win32 win64. By default the WINEARCH is set to win32. The playonlinux package is all ready installed.

"},{"location":"buildapplications.wine/#change-the-odconfig-configuration-file","title":"Change the od.config configuration file","text":""},{"location":"buildapplications.wine/#the-homedirectorytype-option","title":"The homedirectorytype option","text":"

To share the home directory /home/balloonvolume data between containers, set the desktop.homedirectorytype to 'volume' in your od.config file.

Edit your own od.config file as described in the chapter Edit your configuration file in docker mode, and make sure that desktop.homedirectorytype is set to 'volume'

desktop.homedirectorytype: 'volume' \n

If need, run the docker-compose restart command in your abcdesktop directory where the od.config and the docker-compose.yml are located.

docker-compose restart\n
"},{"location":"buildapplications.wine/#build-a-new-windows-putty-inside-a-docker-container","title":"Build a new windows putty inside a docker container","text":"

In this exercice we are going to install and run putty.exe for Windows inside a docker container for abcdesktop.

PuTTY is an SSH and telnet client, developed originally by Simon Tatham for the Microsoft Windows platform.

Start an abcdesktop session. You can use an authenticated session using an authentication provider external or explicit, or you can do this exercice using Anonymous Authentification also know as the authentication provider implicit.

In this exercice we choose an Anonymous authentification, DO NOT CLOSE YOUR WEB BROWSER, you should not be able de reconnect with the same user context, and have to restart this exercice again.

Login using the Anonymous authentification provider.

Click on the menu and choose settings options

On the Settings dialog box, choose System option

Choose the User container tabs, and select the hostname value.

Copy this value into your clipboard. The hostname use the docker containerid value.

Keep your web browser open, and open a terminal shell on your server, to run docker shell commmand.

Run the docker inspect -f \"{{ .HostConfig.Binds }}\" and add your CONTAINER ID as parameter.

CONTAINER_ID=5719b77d3f2a\ndocker inspect -f \"{{ .HostConfig.Binds }}\" $CONTAINER_ID\n

where CONTAINER_ID is your own containerid value.

For example

docker inspect -f \"{{ .HostConfig.Binds }}\" 5719b77d3f2a\n

You should read the volume name starting by the prefix tmp- with your uuid value, and a second volume name starting by the prefix home- with your uuid:

[tmp-57be1e5b-0b14-4c05-ae79-75e9a03c77be:/tmp home-57be1e5b-0b14-4c05-ae79-75e9a03c77be:/home/balloon]\n

We are using the /tmp volume and the /home/balloon volume of your container.

If your are using an anonymous authentification, the name of your container id is formated as an uuid, for example a32deda7-324f-4ee4-9e51-51c1aaf66bcf. The name of the tmp volume is tmp-a32deda7-324f-4ee4-9e51-51c1aaf66bcf and the name of tmp volume is home-a32deda7-324f-4ee4-9e51-51c1aaf66bcf

If your are using an LDAP authentification, the name of your container id is a string equal to the username, for example hermes. The name of the tmp volume is tmp-hermes and the name of tmp volume is home-hermes.

Replace in the command the string TMP_VOLUMENAME by your own tmp volume name.

Replace in the command the string HOME_VOLUMENAME by your own home volume name.

docker run -it -v TMP_VOLUMENAME:/tmp  -v HOME_VOLUMENAME:/home/balloon --user balloon abcdesktopio/oc.template.gtk.wine bash\n

For example with an anonymous user:

docker run -it -v tmp-a32deda7-324f-4ee4-9e51-51c1aaf66bcf:/tmp -v home-a32deda7-324f-4ee4-9e51-51c1aaf66bcf:/home/balloon --user balloon abcdesktopio/oc.template.gtk.wine bash \n

Great, you have started a new docker container. The oc.user container and your new container is sharing the same volume mounted as /tmp. You get a prompt inside the new docker container.

To run a command as administrator (user \"root\"), use \"sudo <command>\".\nSee \"man sudo_root\" for details.\n\nballoon@721263d5dece:~$ \n

Init the wine directory

wineboot --init\n

After few seconds you should read on the standard error

0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0014:err:ole:get_local_server_stream Failed: 80004002\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0012:err:ole:get_local_server_stream Failed: 80004002\nCould not find Wine Gecko. HTML rendering will be disabled.\nCould not find Wine Gecko. HTML rendering will be disabled.\nwine: configuration in L\"/composer/.wine\" has been updated.\n

And now download putty.exe from the web site https://www.putty.org/.

In this example, we use the 64 bits binary format

balloon@8e48719ae72f:~$ wget https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\n

Start the putty.exe with wine, with the command wine putty.exe

balloon@5719b77d3f2a:~$ wine putty.exe\n

After few seconds you should read on the standard error

0009:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.\n

The wine prefix is WINEPREFIX=/composer/.wine, all files used by wine are stored in /composer/.wine directory.

On abcdesktop display, wine is starting the application putty, after few seconds, Putty is running :

You can use this Putty Windows application to connect to another host using ssh or telnet protocol.

The application Putty is opened and is running in the background. At the right corner, write in the search bar the keyword shell Click on the Web Shell icon, a new Terminal WebShell is now opened :

Run the command to list each X11 windows and get the WMClass name.

wmctrl -lx \n

Read the WM_CLASS of the Putty Wine application: putty.exe.Wine

Then exit the web shell and quit on the Putty application. Wine has created a configuration directory in the default directory /composer/.wine.

"},{"location":"buildapplications.wine/#build-the-new-puttyd-image-for-abcdesktop","title":"Build the new putty.d image for abcdesktop","text":"

In this chapter we are going to build a new docker image for abcdesktop

The new image is the putty.

Create a directory named build, and create a directory icons inside build

mkdir build\nmkdir build/icons\ncd build\n

To build your own json file.

Create a json file named applist.json, inside build directory, and add the content to the json file.

[\n{\n    \"template\": \"abcdesktopio/oc.template.gtk.wine\",\n    \"preruncommands\": [ \n        \"ENV WINEARCH=win64\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\" ],\n    \"args\": \"/composer/bin/putty.exe\",\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"icon\": \"putty.svg\",\n    \"keyword\": \"putty,ssh,terminal\",\n    \"launch\": \"putty.exe.Wine\",\n    \"name\": \"putty-wine\",\n    \"displayname\": \"Putty Wine\",\n    \"path\": \"/usr/bin/wine\"\n}\n]\n

To fill the data inside the json file :

name Type Data cat string utilities icon string putty.svg keyword string putty,ssh,terminal launch string putty.exe.Wine name string putty path string /usr/bin/wine args string /composer/bin/putty.exe template string abcdesktopio/oc.template.gtk.wine

You can read the following help lines.

Save the putty icon file on SVG format to the icons directory.

wget -O icons/putty.svg https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/putty.svg\n
"},{"location":"buildapplications.wine/#build-putty-your-from-applistjson","title":"Build putty your from applist.json","text":"

To build your new image, download the make.js script file. make.js is located in the oc.apps repository. Look at https://github.com/abcdesktopio/oc.apps if you can not download this file.

Save make.js it to you build directory. make.js is a nodejs JavaScript file. Node.js\u00ae is a JavaScript runtime built on Chrome's V8 JavaScript.

If you don't have already nodejs installed on your system, go to the website nodejs download website and follow the instructions to install nodejs.

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/make.js\n

In the build directory, you should have

drwxr-xr-x   5 devuser  staff   160 Mar 11 15:15 .\ndrwxr-xr-x+ 31 devuser  staff   992 Mar 11 15:15 ..\n-rw-r--r--   1 devuser  staff   497 Mar 11 15:15 applist.json\ndrwxr-xr-x   3 devuser  staff    96 Mar 11 15:02 icons\n-rw-r--r--   1 devuser  staff  6112 Mar 11 15:12 make.js\n\n./icons:\ntotal 8\ndrwxr-xr-x  3 devuser  staff    96 Mar 11 15:02 .\ndrwxr-xr-x  5 devuser  staff   160 Mar 11 15:15 ..\n-rw-r--r--  1 devuser  staff  1909 Oct 31  2015 putty.svg\n

Run the command make.js

node make.js\n

make.js build a new DockerFile for putty application. Remember, all application images use container images.

You should get the output

{\n  template: 'abcdesktopio/oc.template.gtk.wine',\n  preruncommands: [\n    'ENV WINEARCH=win64',\n    'USER $BUSER',\n    'RUN wineboot --init',\n    'RUN echo disable > $WINEPREFIX/.update-timestamp', \n    'RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe'\n  ],\n  args: '/composer/bin/putty.exe',\n  cat: 'utilities',\n  debpackage: '',\n  icon: 'putty.svg',\n  keyword: 'putty,ssh,terminal',\n  launch: 'putty.exe.Wine',\n  name: 'putty-wine',\n  displayname: 'Putty Wine',\n  path: '/usr/bin/wine'\n}\n

The new files putty-wine.d has been generated :

Read the content of the Dockerfile putty-wine.d. List all labels, and confirm that the icon file is uuencoded format. Uuencoding is a form of binary-to-text encoding.

Now it's time to build your putty app. Run the command docker build command.

docker build  --build-arg TAG=latest -f putty-wine.d -t putty-wine.d .\n

You should read on the standard ouput

[+] Building 21.6s (10/10) FINISHED                                                                                      \n => [internal] load build definition from putty-wine.d                                                              0.0s\n => => transferring dockerfile: 12.46kB                                                                             0.0s\n => [internal] load .dockerignore                                                                                   0.0s\n => => transferring context: 2B                                                                                     0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk.wine:dev                                    0.0s\n => CACHED [1/6] FROM docker.io/abcdesktopio/oc.template.gtk.wine:dev                                               0.0s\n => [2/6] RUN wineboot --init                                                                                      10.9s\n => [3/6] RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe             0.6s \n => [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                9.2s \n => [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                0.4s \n => [6/6] WORKDIR /home/balloon                                                                                     0.0s \n => exporting to image                                                                                              0.4s \n => => exporting layers                                                                                             0.3s \n => => writing image sha256:2cbe019726e67ecb83af74e944ff932705086e632ab4a57dec719be5e7e654cd                        0.0s \n => => naming to docker.io/library/putty-wine.d                                                                     0.0s\n

Now, your new image is ready to run.

"},{"location":"buildapplications.wine/#run-your-putty-for-abcdesktop","title":"Run your putty for abcdesktop","text":"

The API server does not know that you have built your new 2048 application. You have to send a message to the API server, to update the API Server images cache list.

Using your web browser or a curl command, call a http request to notify the API Server

http://localhost/API/manager/buildapplist\n

This http request return a json object, with all docker images details :

Reloead your web browser connected on the abcdesktop website, and log your again as anonymous.

In the search area, type putty. Click on the Putty Application.

Wine is starting your Putty application :

Great, you have build a abcdesktop image for Putty, build the application image Putty. You can push this image to your own private docker registry.

"},{"location":"buildapplications.wine/#optional-add-a-persistant-userreg-and-systemreg-windows-registry-files","title":"Optional add a persistant user.reg and system.reg windows registry files","text":"

This is a quick and dirty solution, but it works fine

Your wine configuration is stored in /composer/.wine, and by default user.reg and system.reg are located in the WINEPREFIX directory. The user.reg and system.reg files build when wine starts.

To make a copy of fresh running putty-wine.d image. Start your putty-wine.d image and using a shell located the new user.reg and system.reg files

docker ps -a | grep putty-wine\n65d95f4e7717   putty-wine.d:latest                               \"/composer/appli-doc\u2026\"   16 seconds ago   Up 15 seconds                                                                                                    anonymous-putty-wine-7877d100de0b4363ad24240d67032c8c\n

Then copy files using the docker cp command

CONTAINERID=65d95f4e7717\ndocker cp $CONTAINERID:/composer/.wine/user.reg .\ndocker cp $CONTAINERID:/composer/.wine/system.reg .\n

Add them to your default putty-wine.d image using applist.json file :

[\n{\n    \"template\": \"abcdesktopio/oc.template.gtk.wine\",\n    \"preruncommands\": [ \n        \"ENV WINEARCH=win64\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n        \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine\" ],\n    \"args\": \"/composer/bin/putty.exe\",\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"icon\": \"putty.svg\",\n    \"keyword\": \"putty,ssh,terminal\",\n    \"launch\": \"putty.exe.Wine\",\n    \"name\": \"putty-wine\",\n    \"displayname\": \"Putty Wine\",\n    \"path\": \"/usr/bin/wine\"\n}\n]\n

Rebuild your Dockerfile

node make.js\n
{\n  template: 'abcdesktopio/oc.template.gtk.wine',\n  preruncommands: [\n    'ENV WINEARCH=win64',\n    'USER $BUSER',\n    'RUN wineboot --init',\n    'RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe',\n    'RUN echo disable > $WINEPREFIX/.update-timestamp',\n    'COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine'\n  ],\n  args: '/composer/bin/putty.exe',\n  cat: 'utilities',\n  debpackage: '',\n  icon: 'putty.svg',\n  keyword: 'putty,ssh,terminal',\n  launch: 'putty.exe.Wine',\n  name: 'putty-wine',\n  displayname: 'Putty Wine',\n  path: '/usr/bin/wine'\n}\nBuilding putty.exe.Wine\n

Run the command docker build command.

docker build  --build-arg TAG=latest -f putty-wine.d -t putty-wine.d .\n

Now your wine keep your registry's updates.

"},{"location":"buildapplicationsgnulinux/","title":"Build your own application image","text":"

abcdesktop use docker image format with some labels to describe the application.

"},{"location":"buildapplicationsgnulinux/#requirements","title":"Requirements","text":""},{"location":"buildapplicationsgnulinux/#build-your-own-application-image_1","title":"Build your own application image","text":"

In this chapter we are going to build a new docker image for abcdesktop

The new image is the game 2048.

Create a directory named build, and create a directory icons inside build

mkdir build\nmkdir build/icons\ncd build\n

To build your own image create first a json file.

Create a json file named applist.json, inside build directory, and add the content to the json file.

[\n  {\n    \"cat\": \"games\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"2048_logo.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048\",\n    \"displayname\": \"2048\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  }\n]\n

To fill the data inside the json file :

name Type Data cat string games debpackage string 2048-qt icon string 2048_logo.svg keyword string 2048 launch string 2048-qt.2048-qt name string 2048 path string /usr/games/2048-qt template string abcdesktopio/oc.template.gtk

You can read the following help lines, or fill the json missing value by yourself.

Save the 2048 icon file on SVG format to the icons directory. You should have this file in the icons directory as the output of the ls icons command :

2048_logo.svg\n
"},{"location":"buildapplicationsgnulinux/#build-your-new-image-2048","title":"Build your new image 2048","text":"

To build your new image, download the make.js script file. make.js is located in the oc.apps repository. Look at https://github.com/abcdesktopio/oc.apps if you can not download this file.

Save make.js it to you build directory. make.js is a nodejs JavaScript file. Node.js\u00ae is a JavaScript runtime built on Chrome's V8 JavaScript.

If you don't have already nodejs installed on your system, go to the website nodejs download website and follow the instructions to install nodejs.

In the build directory, you should have

drwxr-xr-x   5 devuser  staff   160 Mar 11 15:15 .\ndrwxr-xr-x+ 31 devuser  staff   992 Mar 11 15:15 ..\n-rw-r--r--   1 devuser  staff   265 Mar 11 15:15 applist.json\ndrwxr-xr-x   3 devuser  staff    96 Mar 11 15:02 img\n-rw-r--r--   1 devuser  staff  8036 Mar 11 15:12 make.js\n\n./img:\ntotal 8\ndrwxr-xr-x  3 devuser  staff    96 Mar 11 15:02 .\ndrwxr-xr-x  5 devuser  staff   160 Mar 11 15:15 ..\n-rw-r--r--  1 devuser  staff  1909 Oct 31  2015 2048_logo.svg\n

Run the command make.js

node make.js\n

make.js build a new DockerFile for the 2048 application. Remember, all application images use container images.

You should get the output

{\n  cat: 'games',\n  debpackage: '2048-qt',\n  icon: '2048_logo.svg',\n  keyword: '2048',\n  launch: '2048-qt.2048-qt',\n  name: '2048',\n  displayname: '2048',\n  path: '/usr/games/2048-qt',\n  template: 'abcdesktopio/oc.template.gtk'\n}\nBuilding 2048-qt.2048-qt\n{\n  cat: 'games',\n  debpackage: '2048-qt',\n  icon: '2048_logo.svg',\n  keyword: '2048',\n  launch: '2048-qt.2048-qt',\n  name: '2048',\n  displayname: '2048',\n  path: '/usr/games/2048-qt',\n  template: 'abcdesktopio/oc.template.gtk'\n}\nBuilding documentation 2048-qt.2048-qt\n        - '2048'   : '2048.md'\n

The new files 2048.d and 2048.md have been generated :

Read the content of the Dockerfile 2048.d. List all labels, and confirm that the icon file is uuencoded format. Uuencoding is a form of binary-to-text encoding.

Now it's time to build your 2048 app. Run the command docker build command.

docker build  --build-arg TAG=latest -f 2048.d -t 2048.d .\n

You should read the output :

[+] Building 32.0s (10/10) FINISHED                                                                                                                                                                 \n => [internal] load build definition from 2048.d                                                                                                                                               0.0s\n => => transferring dockerfile: 33B                                                                                                                                                            0.0s\n => [internal] load .dockerignore                                                                                                                                                              0.0s\n => => transferring context: 2B                                                                                                                                                                0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:latest                                                                                                                 1.4s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:latest@sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb                                                           0.4s\n => => resolve docker.io/abcdesktopio/oc.template.gtk:latest@sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb                                                           0.0s\n => => sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb 4.50kB / 4.50kB                                                                                                 0.0s\n => => sha256:f3c3f03bd0b5cda9f56703a4ba1b9d96d5ff2be3c03bee1831ce30dc98bb3b62 8.93kB / 8.93kB                                                                                                 0.0s\n => [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends 2048-qt && apt-get clean                                                           27.5s\n => [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections                                                                                                   0.5s\n => [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                                                                                           0.5s \n => [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                                                                                           0.4s \n => [6/6] WORKDIR /home/balloon                                                                                                                                                                0.0s \n => exporting to image                                                                                                                                                                         1.1s \n => => exporting layers                                                                                                                                                                        1.1s \n => => writing image sha256:a861af06b7f0dfa19fcde19ee8848bfee65807f852b082d9314e68676966895a                                                                                                   0.0s\n => => naming to docker.io/library/2048.d\n

Check that your image is ready on your system:

Run the docker images command

docker images\n

You should read on the stdout more lines, only 2048.d is listed here :

REPOSITORY                           TAG                                                     IMAGE ID       CREATED              SIZE\n2048.d                               latest                                                  a861af06b7f0   About a minute ago   1.17GB\n

The total image size of 2048.d is 1.17GB.

The 2048.d does not use 1.17GB, but only the difference between the 2048 image and the source image abcdesktopio/oc.template.gtk.

"},{"location":"buildapplicationsgnulinux/#update-the-cache-application-list","title":"Update the cache application list","text":"

The API server receives a new image event from docker. To run the new applications just refresh you web browser page.

"},{"location":"buildapplicationsgnulinux/#run-your-new-application","title":"Run your new application","text":"

Return to your abcdesktop website http://localhost and log in as Anonymous.

At the right corner, write in the search bar the keyword 2048

Click on the 2048 icon, and start your first abcdesktop application :

Great it's a good job, you have build your own abcdesktop 2048 application.

Now you can spent a lot of time to reach the 2048 score. Have fun !

"},{"location":"buildapplicationsgnulinux/#get-launch-and-path-values","title":"Get launch and path values","text":"

To get the X11 class name of the 2048 game, we need to install it on a Linux host. You can use abcdesktop as a Linux host or choose your own.

If you want to use abcdesktop as a GNU/Linux host

Open the url http://localhost, in your web browser, to start a simple abcdesktop container. You will use this container to install the 2048 application and fill the missing values launch and path.

http://localhost\n

You should see the abcdesktop.io home page.

Press the Connect with Anonymous access, have look

At the right corner, write in the search bar the keyword shell

Click on the Web Shell icon, a new Terminal WebShell is now opened :

Run the command

sudo apt-get update \n

The default password is lmdpocpetit ( if your admin did not change it, otherwise ask to the administrator )

Run the installation command

sudo apt-get install -y 2048-qt \n

You should read the output, during the installation process

On Ubuntu, the games are installed in a dedicated directory /usr/games.

Read the file list of the 2048-qt Ubuntu package

/usr/games/2048-qt\n/usr/share/applications/2048-qt.desktop\n/usr/share/doc/2048-qt/changelog.Debian.gz\n/usr/share/doc/2048-qt/copyright\n/usr/share/man/man6/2048-qt.6.gz\n/usr/share/menu/2048-qt\n/usr/share/pixmaps/2048-qt.xpm\n

Start the 2048 game binary 2048-qt in background.

/usr/games/2048-qt & \n

The new 2048 window is opening in the background. You can minimise the shell window to play to the 2048 game, but this is not the goal of this chapter. To show the shell window again, click on the shell icon on the upper right corner.

Run the command to list each X11 windows and get the WMClass name.

wmctrl -lx \n

wmctrl is a command that can be used to interact with an X Window manager, and can query the window manager for information, and it can request that certain window management actions be taken.

Great, look at the third value, this is what we are looking for :

You can now close your web browser and fill your json file, by yourself

"},{"location":"buildapplicationsgnulinux/#gimp","title":"GIMP","text":"

The applist.json is a array of application object. Add a new application object in the array, and fill the value for the new application.

By yourself, you have to run this exercice again, for the Gimp application. Gimp is Gnu Image Manipulation Program.

New applist.json data, and build your own Gimp abcdesktop.io application.

[\n  {\n    \"cat\": \"games\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"2048_logo.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048\",\n    \"displayname\": \"2048\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  },\n  {\n    \"cat\": \"\",\n    \"debpackage\": \"\",\n    \"icon\": \"\",\n    \"keyword\": \"\",\n    \"launch\": \"t\",\n    \"name\": \"\",\n    \"displayname\": \"\",\n    \"path\": \"\",\n    \"template\": \"\"\n  }\n\n]\n

You should get data entries like:

[\n  {\n    \"cat\": \"games\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"2048_logo.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048\",\n    \"displayname\": \"2048\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  },\n  {\n    \"cat\": \"graphics\",\n    \"debpackage\": \"gimp\",\n    \"icon\": \"gimp.svg\",\n    \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"gimp.Gimp\",\n    \"name\": \"Gimp\",\n    \"path\": \"/usr/bin/gimp\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  }\n\n]\n
"},{"location":"buildapplicationsgnulinux/#add-mimetype-fileextensions-and-desktopfile-entries","title":"Add MimeType, FileExtensions and desktopfile entries","text":"

abcdesktop support MimeType, File Extensions and Desktop Entry Specification entries from Gnome.

    \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n    \"fileextensions\": \"dds\",\n    \"legacyfileextensions\":\"dds\",\n    \"desktopfile\":\"/usr/share/applications/gimp.desktop\"\n

These entries allow user to use the file manager choice Open with and Open with Other Application

and list Recommended Applications

The Gimp Json data shows

{\n    \"cat\": \"graphics\",\n    \"debpackage\": \"gimp\",\n    \"icon\": \"gimp.svg\",\n    \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"gimp.Gimp\",\n    \"name\": \"Gimp\",\n    \"path\": \"/usr/bin/gimp\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n    \"fileextensions\": \"dds\",\n    \"legacyfileextensions\":\"dds\",\n    \"desktopfile\":\"/usr/share/applications/gimp.desktop\"\n}\n

Have a look to the complete applist.json file. abcdesktop applist.json contains description to build all default abcdesktop applications.

"},{"location":"buildapplicationsgnulinux/#using-the-alpine-docker-image","title":"Using the Alpine Docker image","text":""},{"location":"buildapplicationsgnulinux/#musl-memory","title":"musl memory","text":"

musl versus glibc

"},{"location":"changelog/","title":"abcdesktop change log","text":"

Logs of all notable changes made to abcdesktop.io

"},{"location":"changelog/#commits-on-jun-22-2023","title":"Commits on Jun 22, 2023","text":""},{"location":"changelog/#ocuser-heartbeat","title":"oc.user heartbeat","text":""},{"location":"changelog/#commits-on-jun-16-2023","title":"Commits on Jun 16, 2023","text":""},{"location":"changelog/#ocuser-ocpyos-change-default-namespace","title":"oc.user, oc.pyos change default namespace","text":""},{"location":"changelog/#commits-on-jun-9-2023","title":"Commits on Jun 9, 2023","text":""},{"location":"changelog/#ocpyos-clusterrole-and-role","title":"oc.pyos: ClusterRole and role","text":""},{"location":"changelog/#commits-on-may-24-2023","title":"Commits on May 24, 2023","text":""},{"location":"changelog/#add-new-label-role-for-each-core-service","title":"add new label role for each core service","text":""},{"location":"changelog/#commits-on-may-17-2023","title":"Commits on May 17, 2023","text":""},{"location":"changelog/#replace-daemonset-by-deployment","title":"Replace daemonset by deployment","text":"

-- replace daemonset by deployment for oc.nginx and oc.pyos pods https://github.com/abcdesktopio/oc.user/commit/f498e2ab2a5f0af5525a16b5d108c8a1a1f22442

"},{"location":"faq/","title":"FAQ","text":"

List of questions and answers relating to abcdesktop.io

A Kubernetes Cloud provider can be Amazon EKS, DigitalOcean DOKS, Azur AKS, Google GKE, or any of others cloud provider with a Kubernetes service.

"},{"location":"faq/#networking","title":"Networking","text":"

This list of questions and answers is relating network, talking about

"},{"location":"faq/#how-can-i-reach-my-new-service-on-a-kubernetes-cloud-provider","title":"How can I reach my new service on a Kubernetes cloud provider ?","text":"

I was attempting to deploy the ABCDesktop (kubernetes-version-3.0) for testing my setup with a few of my own desktop applications. Everything worked fine when tested locally in my Ubuntu (22.04) machine. I then thought to deploy the setup in a Kubernetes cloud provider with 3 nodes cluster. How can I reach my new hosted service on a Kubernetes cloud provider (Amazon EKS, Digital Ocean, Azur AKS, Google GKE) ?

We use the kubectl port-forward to the nginx pod

NGINX_POD_NAME=$(kubectl get pods -l run=nginx-od -o jsonpath={.items..metadata.name} -n abcdesktop)\nkubectl port-forward $NGINX_POD_NAME --address 0.0.0.0 80:80 -n abcdesktop\n

Then open your web browser to reach the http://localhost

Then open your web browser, you get the home page, login using LDAP auth or Anonymous auth.

Then login, and you get a pod user.

For the first time, you may get a timeout error, if container images can't be downloaded in less than 180 seconds on the worker node.

"},{"location":"faq/#how-can-i-expose-my-new-service-with-an-external-ip-address","title":"How can I expose my new service with an external IP address ?","text":"

I was attempting to deploy the abcesktop (kubernetes-version-3.0) for testing my setup with a few of my own desktop applications. Everything worked fine when tested locally in my Ubuntu (22.04) machine. I then thought to deploy the setup in a Kubernetes cloud provider with 3 nodes cluster. How can I expose my new service with an external IP address ?

To expose the service with an external IP address, we need to update the nginx service type. The default type on your own desktop is type: NodePort, the nginx service type on a Kubernetes cloud provider becomes type: LoadBalancer.

Delete the previous abcdesktop's nginx service

kubectl delete service nginx -n abcdesktop\n

Create a new nginx service yaml file named nginx-lb.yaml The new nginx service type is LoadBalancer

kind: Service\napiVersion: v1\nmetadata:\n  name: nginx\n  namespace: abcdesktop\nspec:\n  type: LoadBalancer\n  selector:\n    run: nginx-od\n  ports:\n  - protocol: TCP\n    port: 80\n    targetPort: 80\n    name: http\n

Apply the nginx service type LoadBalancer

kubectl apply -f nginx-lb.yaml\nservice/nginx created\n

Wait for an EXTERNAL-IP from you kubernetes cloud provider

kubectl get service nginx -n abcdesktop\nNAME    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE\nnginx   LoadBalancer   10.245.105.75   <pending>     80:31581/TCP   64s\n

You get the EXTERNAL-IP for your LoadBalancer

kubectl get service nginx -n abcdesktop\nNAME        TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)           AGE\nnginx       LoadBalancer   10.245.172.53    161.35.246.4   80:30443/TCP      2m36s\n

In case, the LoadBalancer service returns the EXTERNAL-IP 161.35.246.4 Then open your web browser to reach this EXTERNAL-IP 161.35.246.4.

Login using Philip J. Fry

And you should get the fry desktop

"},{"location":"faq/#how-can-i-expose-my-new-service-with-ingress-controller","title":"How can I expose my new service with Ingress Controller ?","text":"

A Kubernetes Ingress Controller acts as a reverse proxy.

In the Ingress, define a path to the abcdesktop's nginx service.

apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: ingress-demo\n  namespace: abcdesktop\nspec:\n  rules:\n    - host: demo.digital.pepins.net\n      http:\n        paths:\n          - path: /\n            pathType: Prefix\n            backend:\n              service:\n                name: nginx\n                port:\n                  number: 80\n  ingressClassName: nginx\n

The request path: / is proxyfied to service named nginx in abcdesktop namespace.

"},{"location":"faq/#how-to-prevent-the-connection-from-closing-after-60-seconds-of-inactivity","title":"How to prevent the connection from closing after 60 seconds of inactivity ?","text":"

My desktop is disconnected after 60 seconds of inactivity, and the message \"Your abcdesktop session has been disconnected. Please reload this page\" appears.

The message Your abcdesktop session has been disconnected. Please reload this page appears when the websockify websocket is disconnected.

Add an heartbeat value to send a ping to the client every INTERVAL seconds

Edit the od.config file, add to the desktop.envlocal option 'WEBSOCKIFY_HEARTBEAT':'30'

desktop.envlocal: { 'WEBSOCKIFY_HEARTBEAT':'30', 'LIBOVERLAY_SCROLLBAR':'0', 'UBUNTU_MENUPROXY':'0', 'X11LISTEN':'tcp' }\n

In this case, the command /usr/bin/websockify sends a ping to the client every 30 seconds. This command runs in the user's pod.

Update the configmap abcdesktop-config

kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n

Restart the pyos pod

kubectl delete pods -l run=pyos-od -n abcdesktop\n

To get more informations how to Keepalive in websockets

Timeout is a main feature to preserve from unnecessary network bandwidth.

"},{"location":"faq/#how-to-prevent-the-connection-from-closing-after-60-seconds-of-inactivity-with-an-ingress-controller","title":"How to prevent the connection from closing after 60 seconds of inactivity with an Ingress Controller ?","text":"

My desktop is disconnected after 60 seconds of inactivity, and the message Your abcdesktop session has been disconnected. Please reload this page appears.

To prevent the connection from closing after 60 seconds of inactivity through Ingress Controller, make sure the Ingress Controller isn't configured to automatically terminate long connections. The default value nginx's ingress controller is 60 seconds.

Update the default values for nginx.ingress.kubernetes.io/proxy-read-timeout and nginx.ingress.kubernetes.io/proxy-send-timeout annotations to more than 60 seconds.

apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: ingress-demo\n  namespace: abcdesktop\n  annotations:\n    nginx.ingress.kubernetes.io/proxy-read-timeout: \"3600\"\n    nginx.ingress.kubernetes.io/proxy-send-timeout: \"3600\"\nspec:\n  rules:\n    - host: demo.digital.pepins.net\n      http:\n        paths:\n          - path: /\n            pathType: Prefix\n            backend:\n              service:\n                name: nginx\n                port:\n                  number: 80\n  ingressClassName: nginx\n
"},{"location":"faq/#applications","title":"Applications","text":"

This list of questions and answers is relating abcdesktop's applications, talking about

"},{"location":"faq/#how-to-delete-all-applications","title":"How to delete all applications ?","text":"

To delete all applications use the images endpoint, replace localhost:30443 by your own datas

curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images/\n

It returns a json list of all deleted applications

[\"abcdesktopio/2048-alpine.d:3.0\", \"abcdesktopio/2048-ubuntu.d:3.0\", \"abcdesktopio/apachedirectorystudio.d:3.0\", \"abcdesktopio/astromenace.d:3.0\", \"abcdesktopio/base.d:3.0\", \"abcdesktopio/beekeeperstudio.d:3.0\", \"abcdesktopio/blender.d:3.0\", \"abcdesktopio/bless.d:3.0\", \"abcdesktopio/blobby.d:3.0\", \"abcdesktopio/boxes.d:3.0\", \"abcdesktopio/calculator.d:3.0\", \"abcdesktopio/chess.d:3.0\", \"abcdesktopio/chimerax.d:dev\", \"abcdesktopio/chrome.d:3.0\", \"abcdesktopio/chromium.d:3.0\", \"abcdesktopio/citrix.d:3.0\", \"abcdesktopio/cloudfoundry.d:3.0\", \"abcdesktopio/cmd.exe.d:3.0\", \"abcdesktopio/corsix-th.d:3.0\", \"abcdesktopio/cuda.d:dev\"]\n
"},{"location":"faq/#how-to-add-an-application","title":"How to add an application ?","text":"

To add an application : - get the json file of an application - push the json file to the abcdesktop's images endpoint

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine.d.3.0.json\n

The first start will pull the 2048 image, so it can take a while.

"},{"location":"faq/#how-to-get-the-json-file-of-a-containerized-application","title":"How to get the json file of a containerized application ?","text":"

To get the json file of a containerized application, you can use docker command or crictl command

docker inspect abcdesktopio/2048-alpine.d:3.0 > 2048-alpine.json\n
crictl inspecti abcdesktopio/2048-alpine.d:3.0 > 2048-alpine.json\n
"},{"location":"faq/#my-application-doesnt-start-how-to-get-log-files","title":"My application doesn't start. How to get log files ?","text":"

Open the webshell and read the logs files.

The log files are /tmp/lastcmd.log, /tmp/lastcmdenv.log and /tmp/NAME OF THE APPLICATION.log.

"},{"location":"guiappsoddocker/","title":"GUI application with containers","text":""},{"location":"guiappsoddocker/#other-related-projets-about-vdi-and-containers","title":"Other related projets about VDI and containers","text":"

A lot of different projets already exists using containers as a VDI. I just write list of projets, you can explore them :

"},{"location":"guiappsoddocker/#x11-window-system-architecture","title":"X11 window system architecture","text":"

In a *nix system a GUI application has the role of \u201cX client\u201d. Each time it redraws its content a sequence of graphics commands is encoded into the X protocol using a library (usually Xlib) and transmitted into the X11 socket. At the other end an X server reads such commands from the socket and renders them onto a display. [ source HW accelerated GUI apps on Docker]

"},{"location":"guiappsoddocker/#containerizing-a-gui-app","title":"Containerizing a GUI app","text":"

Taking a look at the X window system architecture it\u2019s clear that in order to make our containerized GUI apps capable of drawing on a screen we need to give it write access to the X11 socket, and we need an X server to consume and render the graphics commands onto a display.

We can approach this problem from three angles:

"},{"location":"guiappsoddocker/#all-in-one-container","title":"All in one container","text":""},{"location":"guiappsoddocker/#separated-container","title":"Separated container","text":""},{"location":"guiappsoddocker/#abcdesktop-choices","title":"abcdesktop choices","text":"

To guarantee isolation, abcdesktop/io.io run X11 server and X11 client in separated container. X11 server and X11 client share the socket as unix file socket on a dedicated external shared volume.

Local is best, thus server and application need to run on the same node, if it can.

"},{"location":"guiappsoddocker/#html5-web-browser-as-remote-display","title":"HTML5 Web Browser as remote DISPLAY","text":"

The Web Browser does not support X11 protocol. We need a graphical desktop system to paint the virtual DISPLAY in a <canvas> HTML element.

"},{"location":"guiappsoddocker/#replace-x11-server-from-xorg-by-a-xvnc","title":"Replace X11 Server from X.org, by a Xvnc.","text":"

Xvnc is the X VNC (Virtual Network Computing) server. It is based on a standard X server, but it has a virtual screen rather than a physical one. X applications display themselves on it as if they were using a normal X display, but they can only be accessed via a VNC. So Xvnc is really two servers in one. To the applications it is an X server, and to the remote VNC users it is a VNC server.

"},{"location":"guiappsoddocker/#convert-vnc-tcp-socket-in-to-a-websocket","title":"Convert VNC TCP socket in to a WebSocket","text":"

The web browser does not support VNC (RFB Protocol) and the TCP socket natively. We need to translate TCP socket, into a WebSocket. This can be done using :

"},{"location":"guiappsoddocker/#use-a-vnc-javascript-client","title":"Use a VNC Javascript client","text":"

The web browser receives the RFB protocol in the WebSocket and then paints the data into a canvas.

"},{"location":"overview/","title":"abcdesktop overview","text":"

abcdesktop is based on kubernetes, from the abcdesktop infrastructure to the user applications. At the login page, the user chooses a login provider and authenticates himself, then abcdesktop engine creates a pod for this user.

"},{"location":"overview/#abcdesktop-applications","title":"abcdesktop applications","text":"

An application can run as ephemeral container or as pod.

"},{"location":"overview/#abcdesktop-design","title":"abcdesktop design","text":""},{"location":"overview/#abcdesktop-services","title":"abcdesktop services","text":""},{"location":"overview/#abcdesktop-pod-user","title":"abcdesktop pod user","text":""},{"location":"overview/#applications","title":"applications","text":""},{"location":"rdgp/","title":"Rdgp","text":"

Privacy Notice: protecting your personal data

The changes to the French and European regulation on the protection of personal data come into force on 25 May 2018.

If you want to interact with abcdesktop via www.abcdesktop.io and other corporate sites, personal data will be collected about you in order to process your request and/or send you the desired information.

In this case, abcdesktop is committed to the protection, confidentiality and security of personal data.

This Privacy Notice provides information on how abcdesktop, and its potential subcontractors or partners, process your personal data in this context.

This document may be supplemented by specific information in the case of a specific service where appropriate (e.g. shareholders club) or in a commercial context. If you are an abcdesktop customer, you will also find a dedicated personal data protection policy on the website demo.abcdesktop.io.

Why does abcdesktop process your personal data collected on abcdesktop.io and on its corporate websites? On demo.abcdesktop.io, you can ask a question or receive specific abcdesktop information (for example a press release). abcdesktop processes the personal data collected via the contact forms in place for these purposes. Some websites may require additional information which is processed specifically to enable access to a private or dedicated space, such as shareholders club.

We only process your personal data once we have your consent in the context of you request.

Your data is only kept for the length of time needed to fulfil your request. This takes into account your unsubscription to certain newsletters or sending out press releases.

What types of data are processed? abcdesktop may be required to process your personal data which we collect directly via the online form. It includes identity data, such as your name, surname, email address and sometimes your telephone number and postal address if necessary.

Who can see your data? Data collected about you is intended for abcdesktop\u2019s internal services and if any, service providers. In the case of a legal procedure, processed data may also be communicated to the relevant authorities.

Is your data processed outside the European Union? The data collected may be processed outside the European Union if deemed necessary and according to the nature of your request. In this case, abcdesktop will take all necessary steps to protect your data.

What are your rights? You have the right to withdraw your consent and stop any future use of your data. You can exercise your right to obtain information and access to the data, to rectify them in case of inaccurate data related to you and to delete the data when conditions are fulfilled.

How can you contact the Data Protection Officer? If you wish to exercise your rights over your data, you can write to the following address along with proof of identity:

Orange Sa Attention: Data Protection Officer (DPO) 78 rue Olivier de Serres 75505 Paris Cedex 15

Possibility to make a request to the Data protection authority, the CNIL in France: If your interaction with abcdesktop is not satisfactory, you can also lodge a complaint with the Commission Nationale de l\u2019Informatique et des Libert\u00e9s (CNIL), which is the regulatory authority in charge of personal data protection in France.

How is your data secured? Orange ensures your data remains secure and confidential, including certain processing carried out by subprocessor.

For this purpose, the appropriate technical and organisational measures are in place to prevent the loss, misuse, alteration and deletion of your personal data. These measures are adapted according to the level of sensitivity of this processed data and the level of risk that the processing or implementation of it presents.

Modification of the personal data protection notice This Privacy Notice is subject to change.

"},{"location":"requirements/","title":"Requirements","text":""},{"location":"requirements/#prerequisites-for-setup-abcdesktop","title":"Prerequisites for setup abcdesktop","text":""},{"location":"requirements/#release-3x-stable","title":"Release 3.X [ stable ]","text":""},{"location":"requirements/#supported-architectures","title":"Supported Architectures","text":"

Our images support only architectures x86-64. The architectures supported by this image is:

Architecture Tag x86-64 amd64-latest

arm-64 is in progress.

"},{"location":"requirements/#gnulinux","title":"GNU/Linux","text":"

The recommended distrubution is Ubuntu 22.04.2 LTS

"},{"location":"requirements/#macosx","title":"MacOS/X","text":"

Use Docker Desktop with kubernetes, https://www.docker.com/products/docker-desktop/

"},{"location":"requirements/#microsoft-windows","title":"Microsoft Windows","text":"

Use Docker Desktop with kubernetes, https://www.docker.com/products/docker-desktop/

"},{"location":"runapplications.wine/","title":"Run docker image for Windows using Wine","text":""},{"location":"runapplications.wine/#requirements","title":"Requirements","text":""},{"location":"runapplications.wine/#winehq","title":"WineHQ","text":"

Wine (originally an acronym for \"Wine Is Not an Emulator\") is a compatibility layer capable of running Windows applications on several POSIX-compliant operating systems, such as Linux, macOS, & BSD. Instead of simulating internal Windows logic like a virtual machine or emulator, Wine translates Windows API calls into POSIX calls on-the-fly, eliminating the performance and memory penalties of other methods and allowing you to cleanly integrate Windows applications into your desktop.

To run Windows applications abcdesktop.io use WineHQ. A dedicated image template source is ready to use as source of others Windows applications. This image template is named abcdesktopio/oc.template.gtk.wine.50

Start pulling this template image :

docker pull abcdesktopio/oc.template.gtk.wine\n

Look at the Dockerfile to build the abcdesktopio/oc.template.gtk.wine on the https://hub.docker.com/ web site.

For a better support, we are using the 32 bits library, as i386 libs on GNU/Linux. Your can read in the Dockerfile, how the abcdesktopio/oc.template.gtk.wine is created.

Dockerfile information :

dpkg --add-architecture i386 aptitude install -y wine

"},{"location":"runapplications.wine/#run-notepadexe-for-windows-in-a-docker-container","title":"Run notepad.exe for Windows in a Docker container","text":"

In this chapter we are going to run notepad.exe for Windows inside a docker container for abcdesktop.io.

Start an abcdesktop session. You can use an authenticated session using an authentication provider external or explicit, or you can do this exercice using Anonymous Authentification also know as the authentication provider implicit.

In this chapter we choose an Anonymous, DO NOT CLOSE YOUR WEB BROWSER, you should not be able de reconnect with the same user context, and have to restart this exercice at the begining, else you can choose to configure abcdesktop with ldap authentification.

Login using the Anonymous authentification provider.

Keep your web browser open, then on your host, open a terminal shell window and run the command

docker ps --filter ancestor=abcdesktopio/oc.user.18.04\n

The option --filter ancestor=abcdesktopio/oc.user.18.04 ask to filter only container with the image ancestor set with value abcdesktopio/oc.user.18.04 You should read the container with the image named abcdesktopio/oc.user.18.04

docker ps --filter ancestor=abcdesktopio/oc.user.18.04\nCONTAINER ID   IMAGE                        COMMAND                  CREATED         STATUS         PORTS                                                            NAMES\n86df3ff126ac   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   3 minutes ago   Up 3 minutes   4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp  g-5f4300d2-7c8e-43c6-89ab-f85bd8b68138\n

Read the values CONTAINER ID and NAMES

In this example, the CONTAINER ID is 86df3ff126ac and the NAME is g-5f4300d2-7c8e-43c6-89ab-f85bd8b68138.

We are using the /tmp volume of this CONTAINER ID 86df3ff126ac

Using an anonymous authnetification, the name of your container id is an UUID, for example 57be1e5b-0b14-4c05-ae79-75e9a03c77be. The name of the tmp volume is tmp-57be1e5b-0b14-4c05-ae79-75e9a03c77be

Run a docker inspect -f \"{{ .HostConfig.Binds }}\" and add your CONTAINER ID as parameter.

docker inspect -f \"{{ .HostConfig.Binds }}\" CONTAINER_ID\n

For example

docker inspect -f \"{{ .HostConfig.Binds }}\" 86df3ff126ac\n

You should read the volume name starting by tmp- with your uuid concatened

[tmp-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/tmp home-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/home/balloon]\n

Note: if your are using an LDAP authentification, the name of your container id is the username, for example hermes. The name of the tmp volume is tmp-hermes

Now, start a new docker container with the same HostConfig.Bings as your oc.user container. The -v parameter is the first entry of the result in the previous command docker inspect -f \"{{ .HostConfig.Binds }}\"

docker run -it -v TMP_VOLUMENAME:/tmp  --user balloon abcdesktopio/oc.template.gtk.wine bash\n

For example with an Anonymous user:

docker run -it -v  tmp-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/tmp --user balloon abcdesktopio/oc.template.gtk.wine bash \n

Great, you have started a new docker container. The oc.user containter and your new container are sharing the same volume mounted as /tmp. You get a prompt inside the new docker container.

To run a command as administrator (user \"root\"), use \"sudo <command>\".\nSee \"man sudo_root\" for details.\n\nballoon@8684ae888f74:~$\n

And now start the notepad.exe with wine

balloon@8684ae888f74:/$ wine notepad\n

After few seconds you should read on the standard error

balloon@8684ae888f74:/$  wine notepad\n0015:err:clipboard:convert_selection Timed out waiting for SelectionNotify event\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0014:err:ole:get_local_server_stream Failed: 80004002\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0012:err:ole:get_local_server_stream Failed: 80004002\nCould not find Wine Gecko. HTML rendering will be disabled.\nwine: configuration in L\"/composer/.wine\" has been updated.\n

And the notepad window should be open inside your Web browser

This Windows application is running inside a docker container on abcdesktop.io desktop.

In the Terminal shell press CTRL+C to stop the wine notepad process, then type exit to quit your shell in container.

^C0032:fixme:console:CONSOLE_DefaultHandler Terminating process 8 on event 0\nballoon@4c4d806557dc:~$ exit\nexit\n

It's time to build your own abcdesktop application image. Read the next chapter Build abcdesktop.io docker image for Windows using Wine.

"},{"location":"1.0/features/","title":"abcdesktop release 1.0","text":"

The abcdesktop release 1.0 has started in May 2015

"},{"location":"1.0/config/authentification-rules/","title":"Authentification rules configuration","text":"

All auth providers support rules configuration

A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )

"},{"location":"1.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"

A rule is a dictionary object with :

Example :

To test if the user source IP address is equal to 8.8.8.1/32

'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n
"},{"location":"1.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"

conditions is a list of condition. All condition are always tested, as a logical AND. The result must be equal to the expected value.

"},{"location":"1.0/config/authentification-rules/#examples","title":"Examples:","text":""},{"location":"1.0/config/authentification-rules/#example-true-and-true-expected-true","title":"Example (TRUE and TRUE) expected TRUE:","text":"

To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnet80'\n}\n

Add the labels 'shipcrewandnet80', if the 'expected' value is True

"},{"location":"1.0/config/authentification-rules/#example-true-and-true-expected-false","title":"Example (TRUE and TRUE) expected FALSE:","text":"

To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : False,\n    'label': 'noshipcrewandnet80'\n}\n

Add the labels 'noshipcrewandnonet80', if the 'expected' value is False

"},{"location":"1.0/config/authentification-rules/#example-true-and-false-expected-true","title":"Example (TRUE and FALSE) expected TRUE:","text":"

To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : False } ], \n    'expected' : True,\n    'label': 'noshipcrewandnet80'\n}\n

Add the labels 'noshipcrewandnet80', if the 'expected' value is True

"},{"location":"1.0/config/authentification-rules/#example-false-and-true-expected-true","title":"Example (FALSE and TRUE) expected TRUE:","text":"

To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : False },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnonet80'\n}\n

Add the labels 'shipcrewandnonet80', if the 'expected' value is True

"},{"location":"1.0/config/authentification-rules/#the-condition-value","title":"The condition value","text":"name description example boolean always true or false 'boolean' : 'true' httpheader test a HTTP header value 'httpheader': memberOf test if the LDAP user object is member of group 'memberOf': [ 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'] network test if the client user IP Address is in a network subnet 'network': [ '1.2.3.4/24'] primarygroupid test if the LDAP user object has a attibute primaryGroupID and is equal to value 'primarygroupid': '513'"},{"location":"1.0/config/authentification-rules/#condition-boolean","title":"condition boolean","text":"

This condition is a dummy condition; Only use to force a label or to disable a test.

'boolean': boolean\n

The commun usage is

'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : True,\n                 'label': 'dummy'\n}\n

or alway False

'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : False,\n                 'label': 'dummy'\n}\n
"},{"location":"1.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"

This condition is test if a HTTP Header value is equal to a string.

'httpheader': dict\n

example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'

\n 'rule-httpheader': { \n        'conditions' : [ \n            {   'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n                'expected' : True  } ],\n        'expected' : True,\n        'label': 'chromemaxosx112' }\n\n
"},{"location":"1.0/config/authentification-rules/#condition-network","title":"condition network","text":"

This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.

'network': string\n

example

To test if the user source IP address is equal to 8.8.8.1/32

'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n

To test if the user source IP address is in the subnet 10.0.0.0/8

'rule-localnet': { \n    'conditions' : [   { 'network': '10.0.0.0/8', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'localnet' }\n

To test if the user source IP address is NOT in the subnet 192.168.0.0/24

'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : False } ],\n                         'expected' : True,\n                         'label': 'no192168net' }\n

same as

'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : True } ],\n                         'expected' : False,\n                         'label': 'no192168net' }\n
"},{"location":"1.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"

To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork a separated rule.

'policies': {\n    'acl' : {},\n    'rules' : { \n          'rule-privatenetwork-10': {   'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-fe80':{  'conditions' : [ { 'network': 'fe80::/10',     'expected' : True } ], \n                                                'expected'   : True, \n                                                'label': 'privatenetwork' }\n    }\n}                       \n
"},{"location":"1.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"

This condition test if the user is a member of a LDAP Distinguished Name.

'memberOf': string\n
 'rule-sample': { 'conditions':  [ \n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewgrp'\n}\n
"},{"location":"1.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"

This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.

'primarygroupid': string\n

To check is a user is memberof a DOMAIN\\USER the primary group id is 513

'rule-domainuser': {    'conditions':  [ { 'primarygroupid': '513', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'domainuser'\n}\n

However, if the user needed to be seen as a Domain Admin for POSIX, the PrimaryGroupID is 512, the RID for that group.

'rule-posixdomainadmin': {  'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'posixdomainadmin'\n}\n

The Enterprise Admins group, 519, is also used to grant this level in POSIX.

'rule-enterpriseadmin': {   'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'enterpriseadmin'\n}\n
"},{"location":"1.0/config/authentification/","title":"Authentification","text":""},{"location":"1.0/config/authentification/#configuration-file","title":"Configuration file","text":"

The authentification configuration is set in the od.config file. In this chapter you will need to update the od.config configuration file. This update differs depending on the configuration docker mode or kubernetes mode.

Read the Update your configuration file and apply the new configuration file section to make change in od.config file for docker, or edit the abcdesktop.yaml file for kubernetes cluster.

"},{"location":"1.0/config/authentification/#the-dictionary-authmanagers","title":"The dictionary authmanagers","text":"

The authmanagers is defined as a dictionnary object :

authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

The od.config defines 3 kinds of entries in the authmanagers object :

"},{"location":"1.0/config/authentification/#related-authmanagers","title":"Related authmanagers","text":"authmanagers type Description external OAuth 2.0 Authentification explicit LDAP, LDAPS and Active Directory Authentification implicit Anonymous Authentification"},{"location":"1.0/config/authentification/#hands-on","title":"Hands-on","text":""},{"location":"1.0/config/authentification/#requirements","title":"Requirements","text":"

You should have read the hands-on :

"},{"location":"1.0/config/authentification/#change-authmanagers-configuration","title":"Change authmanagers configuration","text":"

Edit your od.config pyos configuration file, and set the value to the authmanagers dictionnay with empty values for implicit, explicit, and external, as describe :

authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

Save your new od.config file.

The config file od.config has changed and od.py running inside the container should restart. If it doesn't, restart your docker-compose to ake sure that the od.py the your new od.config file.

docker-compose restart

Start your web browser and open the URL http://localhost

The Web home page should only show the title abcdesktop.io. There is no authmanagers available.

Great you can now add some value to authenticate your users.

"},{"location":"1.0/config/authentification/#authmanagers-implicit","title":"authmanagers implicit:","text":"

implicit is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers implicit Section.

"},{"location":"1.0/config/authentification/#authmanagers-explicit","title":"authmanagers explicit:","text":"

explicit is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers explicit Section.

"},{"location":"1.0/config/authentification/#authmanagers-external","title":"authmanagers external:","text":"

external is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers external Section.

"},{"location":"1.0/config/authentification/#authmanagers-configuration-sample","title":"Authmanagers configuration sample","text":"

In the authmanagers implicit section, authmanagers explicit section, and authmanagers external section, you have learned how to defined the providers. You can set a complete authmanagers dictionnary as described for example :

authmanagers: {\n  'external': {\n    'providers': {\n      'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'client_id':     'XXXXXXX', \n        'client_secret': 'YYYYYYY', \n        'dialog_url': 'https://www.facebook.com/dialog/oauth?client_id={client_id}&redirect_uri={callback_url}&response_type=code',\n        'auth_url': 'https://graph.facebook.com/v2.3/oauth/access_token?code={code}&redirect_uri={callback_url}&client_id={client_id}&client_secret={client_secret}',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?access_token={access_token}&fields=picture.width(400),name',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        }\n      },\n      'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'client_id':      'AAAAAAAA', \n        'client_secret':  'BBBBBBBB',\n        'dialog_url': 'https://api.orange.com/oauth/v2/authorize?client_id={client_id}&redirect_uri={callback_url}&scope=openid+profile+offline_access&response_type=code&prompt=login+consent&state={callba\nck_url}',\n        'auth_url': 'https://api.orange.com/openidconnect/fr/v1/token?code={code}&redirect_uri={callback_url}&grant_type=authorization_code', \n        'userinfo_url': 'https://api.orange.com/openidconnect/v1/userinfo',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n      },\n      'mobileorange': { \n        'displayname': 'Mobile Connect', \n        'enabled': False,\n        'client_id':     'CCCCCCCC', \n        'client_secret': 'DDDDDDDD',\n        'basic_auth': True,\n        'dialog_url': 'https://api.orange.com/oauth/v2/authorize?client_id={client_id}&redirect_uri={callback_url}&scope=openid+profile&response_type=code&prompt=login+consent&state=&state={callback_url}'\n,\n        'auth_url': 'https://api.orange.com/oauth/v2/token?code={code}&redirect_uri={callback_url}&grant_type=authorization_code', \n        'userinfo_url': 'https://api.orange.com/oauth/v2/authorize',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n      },\n      'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id':     'EEEEEEEE.apps.googleusercontent.com', \n        'client_secret': 'FFFFFFFF',\n        'scope': 'https://www.googleapis.com/auth/userinfo.email',\n        'dialog_url': 'https://accounts.google.com/o/oauth2/v2/auth?client_id={client_id}&redirect_uri={callback_url}&response_type=code&scope={scope}',\n        'auth_url': 'https://oauth2.googleapis.com/token?code={code}&grant_type=authorization_code&redirect_uri={callback_url}&scope={scope}&client_id={client_id}&client_secret={client_secret}',\n        'userinfo_url': 'https://openidconnect.googleapis.com/v1/userinfo?access_token={access_token}',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n      }\n    }\n  },\n  'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n  }}\n\n\nadconfig : { 'AD': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                        'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                        'domain'        : 'AD',\n                        'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                             'servers'  : [ '192.168.1.12', '192.168.1.13'  ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                             'query_dcs'    : True\n}}\n
"},{"location":"1.0/config/authexplicit-activedirectory/","title":"Authentification explicit for Microsoft Active Directory services","text":""},{"location":"1.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

For example :

'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}"},{"location":"1.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"

The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN and defined in the config_ref with the exact same value.

Providers :

The provider is formated as a dictionnary

{ 'AD': { 'config_ref': 'adconfig', 'enabled': True } }

Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

The adconfig is a dictionnary. For example :

adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n

If this example, the Microsoft Active Directory value are set to :

Variable name Value for example USERDOMAINADUSERDNSDOMAINAD.DOMAIN.LOCAL

For Active Directory authmanagers, replace the variable name with your own value.

Variable name Type Description Example default boolean Use this domain as default domain True ldap_basedn string LDAP Base Distinguished Names DC=ad,DC=domain,DC=localldap_fqdn string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.localdomain_fqdn string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCALservers list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]kerberos_realm string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL

The explicit authentification is support LDAP and LDAPS bind.

The Microsoft Active Directory value are set to :

Variable name Value USERDOMAINADUSERDNSDOMAINAD.DOMAIN.LOCAL

For Active Directory authmanagers, replace the variable name with your own value.

Variable name Description Example ldap_basedn Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=localldap_fqdn Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.localdomain_fqdn Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCALservers Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]kerberos_realm Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL"},{"location":"1.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"

The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)

"},{"location":"1.0/config/authexplicit-activedirectory/#site","title":"Site","text":"

This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.

Variable name Type Defautl value site_subnetdn string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') )site_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=subnet)site_attrs list ['cn', 'siteObject', 'location']"},{"location":"1.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"

This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location is the join key to match local printer for the user.

Variable name Type Defautl value printer_printerdn string OU=Applications + config.get('basedn')printer_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=printQueue)site_attrs list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]

Great, you have check how the explicit Authentification configuration works.

"},{"location":"1.0/config/authexplicit-ldap/","title":"Authentification explicit for LDAP Directory Services","text":""},{"location":"1.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

For example :

'explicit': {\n    'show_domains': True,\n    'providers': {\n      'LDAP': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n}\n

In this example, ldapconfig dict must have a key LDAP

Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string not used by ldap, only used by Active Directory providers dictionnary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}"},{"location":"1.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"

The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set with the same value in providers configuration and config_ref.

Providers :

The provider is formated as a dictionnary

{ 'planet': { 'config_ref': 'ldapconfig', 'enabled': True } }

Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

The ldapconfig is a dictionnary.

For example :

ldapconfig : { 'planet': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ '192.168.8.195' ],\n                        'secure'        : False,\n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n           }}\n\n}\n
"},{"location":"1.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default boolean Use this domain as default domain True ldap_protocol string protocol type. ldap or ldaps for LDAP directory services ldaptls_require_cert boolean The default value is False. tls_require_cert apply only if ldap_protocol is set to ldaps. Allow LDAPS connection if the ldaps server hostname does not match CommonName peer certificate. In production, set this value to True This will disable the ldap option call : ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) False basedn string LDAP Base Distinguished Names ou=people,dc=planetexpress,dc=comservers list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. [ '192.168.1.12', '192.168.1.13' ] IP Address or FQDN values scope LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope being one of SCOPE_BASE (to search the object itself), SCOPE_ONELEVEL (to search the object\u2019s immediate children), or SCOPE_SUBTREE (to search the object and all its descendants). ldap.SCOPE_SUBTREEtimeout integer ldap time out in second 10 exec_timeout integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos auth credentials. the exec timeout is used to run external command line. 10 users_ou string Users Organisation Unit ou=people,dc=planetexpress,dc=comattrs list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s))group_filter string LDAP filter to find group object (&(objectClass=Group)(cn=%s))group_attrs string LDAP filter to find group object (&(objectClass=Group)(cn=%s))"},{"location":"1.0/config/authexplicit-ldap/#hands-on-configure-auth-using-an-openldap-for-docker","title":"Hands-on : Configure Auth using an OpenLDAP for Docker","text":""},{"location":"1.0/config/authexplicit-ldap/#requirements","title":"Requirements","text":"

You should have all read and done the hands-on :

"},{"location":"1.0/config/authexplicit-ldap/#openldap-docker-image-for-testing","title":"OpenLDAP Docker Image for testing","text":"

To configure abcdesktop.io to use an explicit authentification, we need a directory service. We use an OpenLDAP Docker Image for testing with provioned values.

Read the OpenLDAP Docker Image for testing documentation on the url abcdesktop OpenLDAP Docker Image for testing

"},{"location":"1.0/config/authexplicit-ldap/#update-the-docker-composeyml-file","title":"Update the docker-compose.yml file","text":"

Update the docker-compose.yml file to add an ldap as directory server

The specific openldap section is describe as a service. The new complete docker-compose.yml file is now :

version: '3'\nservices:\n  pyos:\n    depends_on:\n      - memcached\n      - mongodb\n    image: 'abcdesktopio/oc.pyos'\n    networks:\n      - netback\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n      - /Users/alexandredevely/src/abcdesktop/od.config:/var/pyos/od.config\n  speedtest:\n    image: 'abcdesktopio/oc.speedtest'\n    networks:\n      - netuser\n  nginx:\n    depends_on:\n      - memcached\n      - pyos\n    image: 'abcdesktopio/oc.nginx'\n    ports:\n      - '80:80'\n      - '443:443'\n    networks:\n      - netuser\n      - netback\n  memcached:\n    image: memcached\n    networks:\n      - netback\n  mongodb:\n    image: mongo\n    networks:\n      - netback\n  openldap:\n    image: abcdesktopio/oc.openldap\n    networks:\n      - netback\nnetworks:\n  netuser:\n    driver: bridge\n  netback:\n    internal: true\n
"},{"location":"1.0/config/authexplicit-ldap/#update-the-odconfig-configuration-file","title":"Update the od.config configuration file","text":"

Update the od.config configuration file.

Add the explicit entry to the dictionary authmanagers.

authmanagers: {\n  'external': {\n  },\n  'explicit': {\n    'show_domains': True,\n    'providers': {\n      'planet': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n  }}\n\n\n

Note: the config_ref is ldapconfig.

Add a new dictionnary object named ldapconfig to the configuration file. These values come from the LDAP structure of OpenLDAP Docker Image for testing

ldapconfig : { 'planet': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ 'openldap' ],\n                        'secure'        : False,\n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n           }}\n

Note: the server name is the name of the service entry

Save your new od.config file.

The config file od.config has changed and od.py running inside the container should restart. If it doesn't, restart your docker-compose to make sure that the od.py the your new od.config file.

docker-compose restart

Open the URL:http://localhost

The authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

"},{"location":"1.0/config/authexplicit-ldap/#the-ldap-structure-of-openldap-docker-image-for-testing","title":"The LDAP structure of OpenLDAP Docker Image for testing","text":""},{"location":"1.0/config/authexplicit-ldap/#basedn","title":"BaseDN","text":"

The basedn is dc=planetexpress,dc=com

"},{"location":"1.0/config/authexplicit-ldap/#admin-account","title":"admin account","text":"

The admin account is described as

Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"1.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":""},{"location":"1.0/config/authexplicit-ldap/#users","title":"Users","text":""},{"location":"1.0/config/authexplicit-ldap/#cnhubert-j-farnsworthoupeopledcplanetexpressdccom","title":"cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hubert J. Farnsworth sn Farnsworth description Human displayName Professor Farnsworth employeeType Owner employeeType Founder givenName Hubert jpegPhoto JPEG-Photo (630x507 Pixel, 26780 Bytes) mail professor@planetexpress.com mail hubert@planetexpress.com ou Office Management title Professor uid professor userPassword professor"},{"location":"1.0/config/authexplicit-ldap/#cnphilip-j-fryoupeopledcplanetexpressdccom","title":"cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry"},{"location":"1.0/config/authexplicit-ldap/#cnjohn-a-zoidbergoupeopledcplanetexpressdccom","title":"cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn John A. Zoidberg sn Zoidberg description Decapodian displayName Zoidberg employeeType Doctor givenName John jpegPhoto JPEG-Photo (343x280 Pixel, 26438 Bytes) mail zoidberg@planetexpress.com ou Staff title Ph. D. uid zoidberg userPassword zoidberg"},{"location":"1.0/config/authexplicit-ldap/#cnhermes-conradoupeopledcplanetexpressdccom","title":"cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hermes Conrad sn Conrad description Human employeeType Bureaucrat employeeType Accountant givenName Hermes mail hermes@planetexpress.com ou Office Management uid hermes userPassword hermes"},{"location":"1.0/config/authexplicit-ldap/#cnturanga-leelaoupeopledcplanetexpressdccom","title":"cn=Turanga Leela,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Turanga Leela sn Turanga description Mutant employeeType Captain employeeType Pilot givenName Leela jpegPhoto JPEG-Photo (429x350 Pixel, 26526 Bytes) mail leela@planetexpress.com ou Delivering Crew uid leela userPassword leela"},{"location":"1.0/config/authexplicit-ldap/#groups","title":"Groups","text":""},{"location":"1.0/config/authexplicit-ldap/#cnadmin_staffoupeopledcplanetexpressdccom","title":"cn=admin_staff,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn admin_staff member cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com member cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com"},{"location":"1.0/config/authexplicit-ldap/#cnship_crewoupeopledcplanetexpressdccom","title":"cn=ship_crew,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn ship_crew member cn=Turanga Leela,ou=people,dc=planetexpress,dc=com member cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com member cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"},{"location":"1.0/config/authexplicit-ldap/#insert-the-user-credentials","title":"Insert the user credentials","text":"

Start your web browser and open the URL http://localhost

The Web home page contains the new input values Login and Password to authenticate this user.

You can use for example on user of the list above.

Credentials Value Login Turanga Leela Password leela

Insert the login credentials :

Turanga Leela as login and leela as password, then click on the Sign in button.

Look at the top of the sreen. The user name is Turanga Leela:

"},{"location":"1.0/config/authexplicit-ldap/#applications-remainted","title":"Applications remainted","text":"

Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :

I like this amazing project abcdesktop.io\n

Do not save your file and just close your web browser.

Start your web browser again, and open the same URL http://localhost, and log in with the same account: Turanga Leela as login and leela as password, then click on the Sign in button.

The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io

All applications are maintained.

Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.

"},{"location":"1.0/config/authexplicit/","title":"Authentification explicit","text":""},{"location":"1.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit:","text":"

explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

The explicit authentification support the directory services ldap, ldaps, and Microsoft Active Directory.

Configuration sample for Microsoft Active Directory

For example :

'explicit': {\n    'show_domains': True,\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n
"},{"location":"1.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"

If the authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

"},{"location":"1.0/config/authexplicit/#ldap-authmanagers","title":"LDAP authmanagers :","text":"

Read the specific chapter on LDAP LDAP and LDAPS explicit authmanagers

"},{"location":"1.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"

Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers

Great, you have check how the explicit Authentification configuration works.

"},{"location":"1.0/config/authexternal/","title":"Authentification external","text":""},{"location":"1.0/config/authexternal/#requirements","title":"Requirements","text":"

To use external Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.

"},{"location":"1.0/config/authexternal/#library","title":"Library","text":"

abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.

"},{"location":"1.0/config/authexternal/#authmanagers-external","title":"authmanagers external:","text":"

external authentification use OAuth 2.0 authenticaton.

The external authentification configuration is defined as a dictionary object and contains a list of external provider.

Sample providers entry using the Google OAuth 2.0 authentification service.

'external': {\n    'providers': {\n    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n}\n

The variable values client_id and client_secret have been set to obfuscate value 'XXX'. The FQDN is refered to the public server FQDN.

Variable name Type Description Sample displayname string Display Name show in Web front Googleenabled boolean LDAP Base Distinguished Names Trueclient_id string client id XXX-YYY.apps.googleusercontent.comclient_secret string client secret XXXscope list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ]userinfo_url string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix string redirect URL https://hostname.domain.local/API/auth/oauthredirect_uri_querystring string URL query string manager=external&provider=googleauthorization_base_url string callback URL https://accounts.google.com/o/oauth2/v2/authtoken_url string token URL https://oauth2.googleapis.com/token

The complete redirect url concats the two values redirect_uri_prefix and redirect_uri_querystring.

"},{"location":"1.0/config/authexternal/#orange-oauth-20","title":"Orange OAuth 2.0","text":"

Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.

"},{"location":"1.0/config/authexternal/#orange-application","title":"Orange Application","text":"

Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section

'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'openid', 'form_filling' ],\n        'client_id': 'XXX',\n        'client_secret': 'YYY',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=orange',\n        'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n        'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n        'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n      }\n
"},{"location":"1.0/config/authexternal/#facebook-oauth-20","title":"Facebook OAuth 2.0","text":"

Facebook's OAuth is supported for authentication.

"},{"location":"1.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"

Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API

'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'XXX', \n        'client_secret': 'YYY', \n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        }\n
"},{"location":"1.0/config/authexternal/#google-oauth-20","title":"Google OAuth 2.0","text":"

Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.

"},{"location":"1.0/config/authexternal/#google-application","title":"Google Application","text":"

Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]

'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n

Great, you have check how the implicit Authentification configuration works.

"},{"location":"1.0/config/authimplicit/","title":"Authentification implicit","text":""},{"location":"1.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit:","text":"

implicit is the easyest configuration mode, and is used as 'Anonymous' authentification.

The provider is defined as a dictionnary object and contains an anononymous provider.

anononymous provider always permit authentification, and create a uuid as userid. anononymous provider is used to skip the authentification process in a demonstration mode.

'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n

anononymous provider always permit authentification, and create a uuid as userid.

Set in your configuration file the authmanagers dictionnary as described

authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { \n     'providers': {\n         'anonymous': {\n           'displayname': 'Anonymous',\n           'caption': 'Anonymous',\n           'userid': 'anonymous',\n           'username': 'Anonymous'\n      } \n   }\n}\n

Update your configuration file and apply the new configuration file

Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :

Press the Sign-In Anonymously button.

Then, choose the settings in the menu at the upper right corner

Choose the System in the settings control panel.

Then choose User containers

This screen show you the hostname.

You can read the hostname. In the example the hostname is f097ab7aac57, from the container id.

Using a shell, run the command docker ps -a

docker ps -a\n

Find a running container with the containerid previously identified.

In this example the containerid is f097ab7aac57

f097ab7aac57   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   8 minutes ago    Up 8 minutes               4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp   g-06b686a5-c98d-4889-b73d-3455f692e6c2\n

Run the command docker inspect CONTAINERID, replace the string CONTAINERID with your container id value.

For example docker inspect f097ab7aac57

docker inspect f097ab7aac57\n

Locate the Mounts description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and

 \"Mounts\": [\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/tmp\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            },\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/home/balloon\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            }\n        ],\n\n

When the anonymous container is removed, the anonymous home directory is deleted.

Great, you have check how the implicit Authentification configuration works.

"},{"location":"1.0/config/balloon/","title":"balloon user entry in od.config","text":"

balloon is the default generic user.

The balloon user is created inside the oc.user container

The default values are

balloon Default Values nameballoonuid4096gid4096homedirectory/home/balloon

If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"1.0/config/controllers/","title":"Controllers","text":""},{"location":"1.0/config/controllers/#controllers_1","title":"Controllers","text":"

abcdesktop.io use a Model\u2013view\u2013controller (usually known as MVC) is a software design pattern commonly used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.

Controller Description AccountingController accounting data json and ebnf format AuthController authenticate user ComposerController CRUD main services (like createDesktop, runApplication) CoreController get configuration and user message info ManagerController manage pyos PrinterController CRUD printer object StoreController CRUD key value data UserController retrieve user information"},{"location":"1.0/config/controllers/#access-permission","title":"Access Permission","text":"

The AccountingController and ManagerController access is protected with a source ip address filter. The access control filter is defined in a dictionary. Each dictionary entry use the controller name and with an entry permitip. The permitip is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]. If permitip is not set or the controller name is not set, all ip source address are allowed the send a request to the controller.

The controllers dictionnary is defined in the od.config file. By default the configuration permit private network defined in rfc1918 and rfc4193. Get more information about the private network.

By default others controllers access is enabled, without ip restriction.

    controllers : { \n        'AccountingController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'AuthController' :      { 'permitip': None },\n        'ComposerController' :  { 'permitip': None },\n        'CoreController' :      { 'permitip': None },\n        'ManagerController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'PrinterController' :   { 'permitip': None },\n        'StoreController' :     { 'permitip': None },\n        'UserController' :      { 'permitip': None }\n    } \n

If the source ip address is not allowed, the response is a HTTP status code 403 Forbidden

{\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
"},{"location":"1.0/config/editconfig/","title":"Edit pyos core service configuration file","text":"

Update the Pyos core service configuration file depends, if your are running abcdesktop.io on native Docker (Non-Cluster Host) or in Kubernetes mode.

This chapter 'Edit Pyos configuration file', apply only for native Docker (Non-Cluster Host), read the dedicated chapter if you are running abcdesktop.io with a kubernetes cluster.

"},{"location":"1.0/config/editconfig/#edit-pyos-code-service-configuration-file-in-docker-mode","title":"Edit Pyos code service configuration file in docker mode","text":""},{"location":"1.0/config/editconfig/#requirements","title":"Requirements","text":""},{"location":"1.0/config/editconfig/#download-sample-configuration-file","title":"Download sample configuration file","text":"

Create a directotry named abcdesktop in your home directory.

cd\nmkdir -p abcdesktop\n

To edit you configuration file in abcdesktop.io docker mode, download the sample configuration file and save it as od.config where docker-compose.yml file is located.

Download sample configuration file od.config then rename the od.config.reference file as od.config

"},{"location":"1.0/config/editconfig/#stop-your-docker-compose","title":"Stop your docker-compose","text":"
 docker-compose down\n

You should read on the standart output

Removing open_nginx_1     ... done\nRemoving open_pyos_1      ... done\nRemoving open_memcached_1 ... done\nRemoving open_speedtest_1 ... done\nRemoving open_mongodb_1   ... done\nNetwork netuser is external, skipping\nNetwork netback is external, skipping\n
"},{"location":"1.0/config/editconfig/#edit-your-docker-composeyml","title":"Edit your docker-compose.yml","text":"

Edit your docker-compose.yml to add a volumes entry to pyos services

Example : My working directory is /home/alex/abcdesktop

Add the new entry in volumes

 volumes:\n      - /home/alex/abcdesktop/od.config:/var/pyos/od.config\n

For example, the docker-compose.yml contains

version: '3'\nservices:\n  pyos:\n    depends_on:\n      - memcached\n      - mongodb\n    image: 'abcdesktopio/oc.pyos'\n    networks:\n      - netback\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n      - /home/alex/abcdesktop/od.config:/var/pyos/od.config\n  speedtest:\n    image: 'abcdesktopio/oc.speedtest'\n    networks:\n      - netuser\n  nginx:\n    depends_on:\n      - memcached\n      - pyos\n    image: 'abcdesktopio/oc.nginx'\n    ports:\n      - '80:80'\n      - '443:443'\n    networks:\n      - netuser\n      - netback\n  memcached:\n    image: memcached\n    networks:\n      - netback\n  mongodb:\n    image: mongo\n    networks:\n      - netback\nnetworks:\n  netuser:\n    driver: bridge\n  netback:\n    internal: true\n
"},{"location":"1.0/config/editconfig/#edit-your-configuration-file","title":"Edit your configuration file","text":"

Now, it's time to make a change in your od.config file.

Download the od.config file and save it to your abcdesktop local directory.

To make change, edit your own od.config file

vim od.config \n

Change the defaultbackgroundcolors in the desktop options.

Locate the line desktop.defaultbackgroundcolors and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'

desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF',  '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n

Save your local oc.config file.

Run your docker-compose

To restart your docker-compose, run the command

 docker-compose up\n

When the od.config change, od.py reload this configuration file automatically.

You should read at the standard ouput of docker-compose

Starting abcdesktop_speedtest_1 ... done\nStarting abcdesktop_mongodb_1   ... done\nStarting abcdesktop_memcached_1 ... done\nStarting abcdesktop_openldap_1  ... done\nStarting abcdesktop_pyos_1      ... done\nStarting abcdesktop_nginx_1     ... done\n[ lines cut here ]\n
"},{"location":"1.0/config/editconfig/#check-that-the-new-colors-are-painted-in-front","title":"Check that the new colors are painted in front :","text":"

Open the url http://localhost, in your web browser, to start a simple abcdesktop.io container.

http://localhost\n

You should see the abcdesktop.io home page.

Press the Sign-in Anonymously, have look

At the right top corner, click on the menu and choose Settings, then click on Screen Colors

Choose your colors and you should have it as background color :

Great, you can easily update your configuration file od.config. We will make some changes during the next exercices.

"},{"location":"1.0/config/frontjs/","title":"dock configuration in od.config","text":""},{"location":"1.0/config/frontjs/#menu-setting","title":"Menu Setting","text":"

The menu can be changed using the dictionnary object menuconfig

menuconfig : {\n    'settings'  : True, \n    'appstore'  : True, \n    'screenshot'    : True, \n    'download'  : True, \n    'logout'        : True, \n    'disconnect'    : True \n}\n
"},{"location":"1.0/config/frontjs/#default-dock-config","title":"default dock config","text":"

The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock option is a dictionnary read by the front web as a json object.

docker entry Descriptions filemanager FileManager application terminal Terminal application webshell HTML 5, terminal application based on xterm.js webshorcut Web browser url launch inside the container
dock : {       \n    'filemanager':  {       'args': None,\n                            'showinview': u'dock',\n                            'name': u'FileManager',\n                            'keyword': u'files,file manager',\n                            'launch': u'nautilus.Nautilus',\n                            'displayname': u'FileManager',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,office',\n                            'id': u'filemanager.d',\n                            'icon': u'pantheon-files-icons.svg' },\n    'terminal':     {       'args': '',\n                            'name': u'TerminalBuiltin',\n                            'keyword': u'terminal,shell,bash,builtin,pantheon',\n                            'launch': u'qterminal.qterminal',\n                            'displayname': u'Terminal Builtin',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,development',\n                            'id': u'terminalbuiltin.d',\n                            'hideindock': True,\n                            'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n    'webshell':     {       'name': u'WebShell',\n                            'keyword': u'terminal,shell,webshell,bash',\n                            'launch': u'frontendjs.webshell',\n                            'displayname': u'Web Shell',\n                            'execmode': u'frontendjs',\n                            'cat': u'utilities,development',\n                            'id': u'webshell.d',\n                            'icon': u'webshell.svg' }\n}\n
"},{"location":"1.0/config/frontjs/#additional-applications","title":"Additional applications","text":"

This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' } add

'webshortcut':  {   'name': u'xlogo',\n                    'showinview': u'dock',\n                    'keyword': u'xlogo',\n                    'execmode': u'builtin',\n                    'launch': u'/usr/bin/xlogo',\n                    'displayname': u'xlogo',\n                    'execmode': u'builtin',\n                    'cat': u'utilities',\n                    'id': u'xlogo.d',\n                    'icon': u'xlogo.svg',\n                    'hideindock': False,\n                    'args': '' \n}\n
"},{"location":"1.0/config/host_config/","title":"host_config resource description","text":"

host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

The same host_config format is reused in a multiple configuration files. host_config is present in applist.json file to build application image, and in od.config to set default running values in desktop and in application.

For example you can set low cpu and memory values to an application like the great X11 xeyes.

{   \n    \"mem_limit\":  \"32M\", \n    \"shm_size\":   \"OM\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n
"},{"location":"1.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period int The length of a CPU period in microseconds. cpu_quota int Microseconds of CPU time that the container can get in a CPU period. cpu_shares int CPU shares relative weight. cpuset_cpus str CPUs in which to allow execution 0 3 0 1 . cpuset_mems str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules list A list of cgroup rules to apply to the container. device_read_bps bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops IO per second Limit read rate from a device. device_write_bps bytes per second Limit write rate from a device. device_write_iops IO per second Limit write rate from a device. devices list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode str Set the IPC mode for the container. mem_limit float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation float or str Memory soft limit mem_swappiness int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable bool Whether to disable OOM killer. oom_score_adj int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size str or int Size of /dev/shm e.g. 1G. cap_add list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}for example to permit the call ptrace: SYS_PTRACE, trace arbitrary processes using ptrace, and SYS_ADMIN, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop list of str Drop kernel capabilities. dns list Set custom DNS servers. dns_opt list Additional options to be added to the container\u2019s resolv.conf file dns_search list DNS search domains. extra_hosts dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add list List of additional group names and/or IDs that the container process will run as. isolation str Isolation technology to use. Default: None. pid_mode str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged bool Give extended privileges to this container. security_opt list A list of string values to customize labels for MLS systems such as SELinux. storage_opt dict Storage driver options per container as a key value mapping. sysctls dict Kernel parameters to set in the container. ulimits list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode str Sets the UTS namespace mode for the container. Supported values are: host runtime str Runtime to use with this container. network_mode str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"1.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"1.0/config/host_config/#auto_remove","title":"auto_remove","text":"

The auto_remove is use to remove or not remove an abcdesktop container application or desktop.

For example, when an application container is exited, do we need to remove the container, by running the docker rm command ?

By default the auto_remove is True. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False. Set this value to False only to troubleshoot an application.

In production this value MUST be set to True

"},{"location":"1.0/config/host_config/#cpu_period-cpu_quota","title":"cpu_periodcpu_quota","text":"

cpu_period Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.

cpu-quota impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.

"},{"location":"1.0/config/host_config/#privileged","title":"privileged","text":"

The privileged option runs a user container in privileged mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.

"},{"location":"1.0/config/host_config/#ipc_mode","title":"ipc_mode","text":"

The ipc_mode value is a string, the default value is 'shareable'. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.

value description '' Use daemon default. 'none' Own private IPC namespace. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system IPC namespace.

If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"1.0/config/host_config/#security_opt","title":"security_opt","text":"

The securityopt option allow to set the security_opt default value for a docker application container. security_opt is the docker parameter.

Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.

Syscall Description acct Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT. add_key Prevent containers from using the kernel keyring, which is not namespaced. bpf Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN. clock_adjtime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clock_settime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clone Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN for CLONE_* flags, except CLONE_USERNS. create_module Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE. delete_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. finit_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. get_kernel_syms Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. init_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. ioperm Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. iopl Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. kcmp Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. kexec_file_load Sister syscall of kexec_load that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT. kexec_load Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT. keyctl Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN. mbind Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. mount Deny mounting, already gated by CAP_SYS_ADMIN. move_pages Syscall that modifies kernel memory and NUMA settings. name_to_handle_at Sister syscall to open_by_handle_at. Already gated by CAP_DAC_READ_SEARCH. nfsservctl Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH. perf_event_open Tracing/profiling syscall, which could leak a lot of information on the host. personality Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root Deny pivot_root, should be privileged operation. process_vm_readv Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. process_vm_writev Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. ptrace Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE, because it could leak a lot of information on the host. query_module Deny manipulation and functions on kernel modules. Obsolete. quotactl Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN. reboot Don't let containers reboot the host. Also gated by CAP_SYS_BOOT. request_key Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. setns Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN. settimeofday Time/date is not namespaced. Also gated by CAP_SYS_TIME. stime Time/date is not namespaced. Also gated by CAP_SYS_TIME. swapon Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. swapoff Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. sysfs Obsolete syscall. _sysctl Obsolete, replaced by /proc/sys. umount Should be a privileged operation. Also gated by CAP_SYS_ADMIN. umount2 Should be a privileged operation. Also gated by CAP_SYS_ADMIN. unshare Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN, with the exception of unshare --user. uselib Older syscall related to shared libraries, unused for a long time. userfaultfd Userspace page fault handling, largely needed for process migration. ustat Obsolete syscall. vm86 In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN. vm86old In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN.

Read security_opt from the docker website.

"},{"location":"1.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilities cap_addcap_drop","text":"

This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :

securityContext:\n      capabilities:\n        desktop.capabilities\n

For example

    { \n        'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n    }\n

Permit a container to call ptrace:

Read the docker run command informations Docker run reference

By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.

Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.

Further reference information is available on the capabilities(7) - Linux man page

Set this value only to troubleshoot an application.

In production this value MUST be set to an empty dict {}

"},{"location":"1.0/config/jira/","title":"JIRA configuration","text":"

abcdesktop.io support JIRA

"},{"location":"1.0/config/jira/#jira-option","title":"JIRA option","text":"

In od.config add the jira option. jira option is a dictionary with the entries :

entry sample value \u00a0\u00a0 url https://domainexample.atlassian.net/ project_id ABCD username account@domain.local apikey XXXXXXXXXXXXXXXXXXXX

And fill the dictionary

jira : { \n            'url':          'https://domainexample.atlassian.net/',\n            'project_id':   'ABCD',\n            'username':     'account@domain.local',\n            'apikey' :      'XXXXXXXXXXXXXXXXXXXX' }\n

Then apply the new configuration file od.config by retrasting the daemon.

When jira option is set, a new icon issue appears at the top.

Click on the issue icon, a new window is appear.

Fill Summary and Your Report values

Then press the Send button. A notification message appears on the left top corner.

Log into your jira server, and check your backlog

Great you added a new issue tracking.

"},{"location":"1.0/config/language/","title":"Language entry in od.config","text":"

The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US

"},{"location":"1.0/config/language/#language-in-abcdesktopio-ocuser","title":"Language in abcdesktop.io oc.user","text":"

The language list must match with the oc.user local packages all ready installed.

If the language is not found, the default value is set to en_US

The oc.user.18.04 is built-in with the default language package :

apt-get install -y \\\n    language-pack-en \\\n    language-pack-fr \\\n    && locale-gen    \\\n    && apt-get clean\n

The full supported language list is set by default

language : [  'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n

This list must match with the Accept-Language request HTTP header.

"},{"location":"1.0/config/language/#language-in-abcdesktopio-applications","title":"Language in abcdesktop.io Applications","text":"

abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language request HTTP header. If the language is not found, the default value is set to en_US.

Hands-on:

Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.

"},{"location":"1.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language to en_US :","text":"

The launch LibreOffice Writer. The menu is set to en_US LibreOffice Writer use English/US en_US language.

"},{"location":"1.0/config/language/#set-the-web-browsers-default-language-to-fr_fr","title":"Set the web browser's default language to fr_FR :","text":"

You can keep the same abcdesktop.io users session, you do not need to logout.

The launch LibreOffice Writer. The menu is set to fr_FR LibreOffice Writer use French fr_FRlanguage.

Great you have change the language settings of applications running inside an abcdesktop docker container

"},{"location":"1.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"1.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"

By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.

Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:

sudo vi /etc/rsyslog.conf\n

Uncomment the following lines and save file :

module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n

"},{"location":"1.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"

Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:

sudo systemctl restart rsyslog\n

"},{"location":"1.0/config/logging/","title":"Logging configuration in od.config","text":"

The logging configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.

logging dict use the python logging module logging module

The syslog and graylog protocol messaging are supported too.

The default features for each handlers are :

handler Features console log message using a logging.StreamHandler to the stream: ext://sys.stdout formated as standard cherrypy_console log message using a logging.StreamHandler to the stream: ext://sys.stdout formatted as access cherrypy_access log message using a logging.StreamHandler to the file stream logs/access.log formatted as access cherrypy_trace log message using a logging.StreamHandler to the stream: logs/trace.log formatted as standard

Sub modules used by od.py can log information too.

Sub module Default Values docker.utils.config{ 'level': 'INFO' },urllib3.connectionpool{ 'level': 'ERROR'},

The logging sample configuration :

#              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
"},{"location":"1.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"1.0/config/stack/#stackmode","title":"stack.mode","text":"

stack.mode describes how abcdesktop.io can manage user's containers and application.

stack.mode Description standalone Use a dockerd only, this is for personal usage kubernetes Use a kubernetes services"},{"location":"1.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"

stack.kubernetesdefaultdomain is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes.

The default value is abcdesktop.svc.cluster.local

If option value mongodb or memcached are set, the values are NOT overridden, and keep unchanged.

If option value mongodb or memcached are set to None (by default), then stack.kubernetesdefaultdomain is used to complete the FQDN of mongodb and memcached servers name. This value is concatenated to the server hostname.

Hostname FQDN mongodbmongodb.abcdesktop.svc.cluster.localmemcachedmemcached.abcdesktop.svc.cluster.local

The dns resolution need a running core-dnsis the namespace kube-system

stack.kubernetesdefaultdomain is used also if desktop.desktopuseinternalfqdn: True

The pod name FQDN is built using the $podid.desktop.$stack.kubernetesdefaultdomain

For example, by default :

c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local

"},{"location":"1.0/config/syslog/","title":"Syslog configuration in od.config","text":""},{"location":"1.0/config/syslog/#add-syslog-server-support","title":"Add syslog server support","text":"
   'filters': [ 'odcontext' ],\n

syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.

syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.

"},{"location":"1.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"

Those running linux can simply modify their syslog configuration file following linux syslog config steps

For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :

docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
[2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
"},{"location":"1.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"

To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)

"},{"location":"1.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"

In handlers entry add the following lines:

        ,\n        'syslog': {\n          'class': 'logging.handlers.SysLogHandler',\n          'filters': [ 'odcontext' ],\n          'formatter': 'syslog',\n          'socktype': 2,\n          'address' : [ '192.168.0.52', 514 ]\n        }\n

Replace 192.168.0.52 ip address by your local IP Addresse.

You can get your local IP address using the following command:

hostname -I | cut -d ' ' -f1\n
"},{"location":"1.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"

In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog' handler in handlers list:

        '': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'INFO'\n        }\n\n       'cherrypy.error': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'ERROR',\n          'propagate': False\n        }\n
"},{"location":"1.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"
#              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    },\n    'syslog': {\n       'class': 'logging.handlers.SysLogHandler',\n       'filters': [ 'odcontext' ],\n       'formatter': 'syslog',\n       'socktype': 2,\n       'address' : [ '192.168.0.52', 514 ]\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
"},{"location":"1.0/config/syslog/#restart-pods","title":"Restart Pods","text":"

To restart Pods, we will delete and recreate all pods

"},{"location":"1.0/config/syslog/#delete-pods","title":"Delete pods","text":"

To delete pods, execute the following command:

kubectl delete -f abcdesktop.yaml\n
"},{"location":"1.0/config/syslog/#create-pods","title":"Create pods","text":"

To create pods, execute the following command:

kubectl create -f abcdesktop.yaml\n
"},{"location":"1.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"

At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:

tail /var/log/syslog\n

If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.

"},{"location":"1.0/config/webrtc/","title":"Sound server configuration","text":"

By default abcdesktop use the module-http-protocol-tcp from pulseaudio sound server to send wav data to the web browser

"},{"location":"1.0/config/webrtc/#pulseaudio-http-stream-by-default","title":"pulseaudio http stream (by default)","text":"

By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)

In terminal webshell run the command :

pactl -s /tmp/.pulse.sock list short modules\n
balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
"},{"location":"1.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"

To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)

abcdesktop update the pulseaudio configuration, and add module-rtp-send. The module-rtp-send pusleaudio send to the destination_ip (in this example 1.2.3.4)

pactl -s /tmp/.pulse.sock list short modules\n
balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0       module-augment-properties\n1       module-null-sink        sink_name=rtp  format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2       module-native-protocol-unix     auth-group=balloon socket=/tmp/.pulse.sock\n3       module-always-sink\n4       module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n

The sink_name is rtp, and the source for the module-rtp-send is rtp.monitor.

The default source is rtp.monitor

Source #\n        State: RUNNING\n        Name: rtp.monitor\n        Description: Monitor of RTP Multicast Sink\n        Driver: module-null-sink.c\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Owner Module: 5\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Base Volume: 65536 / 100% / 0.00 dB\n        Monitor of Sink: rtp\n        Latency: 0 usec, configured 160000 usec\n        Flags: DECIBEL_VOLUME LATENCY \n        Properties:\n                device.description = \"Monitor of RTP Multicast Sink\"\n                device.class = \"monitor\"\n                device.icon_name = \"audio-input-microphone\"\n        Formats:\n                pcm\n

The default output is

\nSource Output #0\n        Driver: module-rtp-send.c\n        Owner Module: 9\n        Client: n/a\n        Source: 4\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n        Corked: no\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Buffer Latency: 0 usec\n        Source Latency: 0 usec\n        Resample method: n/a\n        Properties:\n                media.name = \"RTP Monitor Stream\"\n                rtp.source = \"0.0.0.0\"\n                rtp.destination = \"1.2.3.4\"\n                rtp.mtu = \"1280\"\n                rtp.port = \"5119\"\n                rtp.ttl = \"1\"\n

By default, the format is pcm

Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n

To change the default format update the values in od.config file.

 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n

To get the 'audiopt' and 'audiortpmap' values, read the web pages

"},{"location":"1.0/config/webrtc/#requirements","title":"Requirements","text":""},{"location":"1.0/config/webrtc/#install-a-janus-server","title":"Install a janus server","text":""},{"location":"1.0/config/webrtc/#install-janus","title":"Install janus","text":"

Install a janus service from meetecho.com on a server

apt-get install janus\n
"},{"location":"1.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"

Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.

certificates: {\n    cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n    cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n    cert_pwd = \"secretpassphrase\"\n}\n
"},{"location":"1.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"

Update the od.config file, for example :

# WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
"},{"location":"1.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"

webrtc.enable is a boolean. The default value is False. Set this value to True to enable webrtc services for pulseaudio.

"},{"location":"1.0/config/webrtc/#webrtcserver","title":"webrtc.server","text":"

webrtc.server is a dict. The default value is None. Set all dictionnary values to enable webrtc access for pulseaudio and for the web browser client.

The hostip value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.

'hostip': '1.2.3.4'\n

The host value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn. This fqdn is used by the web browser.

webrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
"},{"location":"1.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"1.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"

The http request path is /API/manager

Path Params Response type /API/manager/buildapplist None Json object /API/manager/updateactivedirectorysite None Json object /API/manager/garbagecollector expirein=, force=False Json object"},{"location":"1.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"

buildapplist ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps. abcdesktop.io

Params Type Description None None None

example :

curl http://localhost/API/manager/buildapplist\n

Return the complete array if json images objects ready to run.

{\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
"},{"location":"1.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None

example :

curl http://localhost/API/manager/updateactivedirectorysite\n
"},{"location":"1.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein integer number in seconds since the container create date time force boolean garbage the container even if a user is connected

example :

curl \"http://localhost/API/manager/garbagecollector?expirein=9473\"\ncurl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"\n
"},{"location":"1.0/setup/k8smacosinstallation/","title":"MacOS/X Kubernetes","text":""},{"location":"1.0/setup/k8smacosinstallation/#enable-kubernetes-on-macosx","title":"Enable Kubernetes on MacOS/X","text":"

Click on the Docker icon in MacOS/X menu bar.

Then choose Preferences...

The following window should appear :

Choose Kubernetes, then check the Enable Kubernetes

Kubernetes stay in Starting state during few minutes. Please wait to download all container images and for kubernetes installation process.

On the bottom you should read next Docker Running Kubernetes Running

Great, you have installed Kubernetes on MacOS/X.

"},{"location":"1.0/setup/k8smacosinstallation/#run-the-new-kubectl-command","title":"Run the new kubectl command","text":"

Open a Terminal, then run the command kubectl version

% kubectl version\nClient Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:16:51Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"darwin/amd64\"}\nServer Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:07:57Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"linux/amd64\"}\n

Run the command kubectl get pods

% kubectl get pods\nNo resources found.\n

Great, the kubectl command works. It's time to deploy abcdesktop.io

"},{"location":"1.0/setup/k8swindows10installation/","title":"Windows 10 Kubernetes Installation","text":""},{"location":"1.0/setup/k8swindows10installation/#enable-kubernetes-on-windows-10","title":"Enable Kubernetes on Windows 10","text":"

Click on the Docker Desktop icon in the windows tray.

The following menu should appear, choose Settings :

The following window should appear :

Choose Kubernetes, then check the Enable Kubernetes

Press the Apply and Restart button. Please wait to download all container images and for kubernetes installation process.

On the bottom you should read next Docker Running and Kubernetes Running.

Great, you have installed Kubernetes on Windows 10.

"},{"location":"1.0/setup/k8swindows10installation/#run-the-new-kubectl-command","title":"Run the new kubectl command","text":"

Open a Terminal cmd.exe, then run the command kubectl version

Client Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:16:51Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"windows/amd64\"}\nServer Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:07:57Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"linux/amd64\"}\n

Run the command kubectl get pods

kubectl get pods\nNo resources found.\n

Great, the kubectl command works. It's time to deploy abcdesktop.io

"},{"location":"1.0/setup/kubernetes_secure_etcd/","title":"Secure Etcd secrets database","text":"

This chapter is optional you can skip it if you think that's your kubernetes etcd database access is secured.

Etcd secrets database is the place where all k8s secrets are stored. By default secrets are stored in plain text. If an attacker can access Etcd database, he know then all your secrets.

To secure secrets, we will crypt them at API server level. All secrets will be stored encrypted in Etcd and then be uncrypted at API server level when accessed by Kubernetes.

"},{"location":"1.0/setup/kubernetes_secure_etcd/#availbale-encryption-providers","title":"Availbale Encryption Providers","text":"

Here are officials available encryption providers (Kubernetes Official page ):

Providers for Kubernetes encryption at restNameEncryptionStrengthSpeedKey LengthOther ConsiderationsidentityNoneN/AN/AN/AResources written as-is without encryption. When set as the first provider, the resource will be decrypted as new values are written.aescbcAES-CBC with PKCS#7 paddingStrongestFast32-byteThe recommended choice for encryption at rest but may be slightly slower than secretbox.secretboxXSalsa20 and Poly1305StrongFaster32-byteA newer standard and may not be considered acceptable in environments that require high levels of review.aesgcmAES-GCM with random nonceMust be rotated every 200k writesFastest16, 24, or 32-byteIs not recommended for use except when an automated key rotation scheme is implemented.kmsUses envelope encryption scheme: Data is encrypted by data encryption keys (DEKs) using AES-CBC with PKCS#7 padding, DEKs are encrypted by key encryption keys (KEKs) according to configuration in Key Management Service (KMS)StrongestFast32-bytesThe recommended choice for using a third party tool for key management. Simplifies key rotation, with a new DEK generated for each encryption, and KEK rotation controlled by the user.

aesgcm provider seem's a bit complex to be used. kms provider needs to use a dedicated container and will not work out of the box. For abcdesktop we will use aescbc provider

"},{"location":"1.0/setup/kubernetes_secure_etcd/#aescbc-encryption-configuration","title":"aescbc encryption configuration","text":""},{"location":"1.0/setup/kubernetes_secure_etcd/#create-configuration-directory","title":"create configuration directory","text":"

In /etc/kubernetes directory, create a directory named aescbc:

sudo mkdir /etc/kubernetes/aescbc\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#create-configuration-file","title":"Create configuration file","text":"

Create aescbc yaml configuration file:

sudo vi /etc/kubernetes/aescbc/encrypt_config.yaml\n
apiVersion: apiserver.config.k8s.io/v1\nkind: EncryptionConfiguration\nresources:\n  - resources:\n    - secrets\n    providers:\n    - aescbc:\n        keys:\n        - name: key1\n          secret: vKZm8oL19mucMS8qKXW4P9wSpab5H7LrLtOOPUUcvQk=\n    - identity: {}\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#change-secret-key","title":"Change secret key","text":"

Secret key can be generated using the following command:

head -c 32 /dev/urandom | base64\n

In encrypt_config.yaml, replace secret for key1 in aescbc.keys section

"},{"location":"1.0/setup/kubernetes_secure_etcd/#change-rights-on-directory-and-file","title":"Change rights on directory and file","text":"

As the encryption key is also the key that will uncrypt Etcd, we will try to protect it as much as possible by changing rights on directory and file:

sudo chmod -R 600 /etc/kubernetes/aescbc\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#configure-kubernetes-api-server","title":"Configure Kubernetes Api Server","text":"

Encryption will be done at Kubernetes Api Server level. We will now configure this server to crypt secrets

"},{"location":"1.0/setup/kubernetes_secure_etcd/#configure-kube-apiserveryaml","title":"configure kube-apiserver.yaml","text":"

Edit kube-apiserver.yaml configuration file:

vim /etc/kubernetes/manifests/kube-apiserver.yaml\n

In spec.containers.command section add:

    - --encryption-provider-config=/etc/kubernetes/aescbc/encrypt_config.yaml\n

In spec.containers.volumeMounts section add:

    - mountPath: /etc/kubernetes/aescbc\n      name: aescbc-config\n      readOnly: true\n

In spec.volumes section add:

  - hostPath:\n      path: /etc/kubernetes/aescbc\n      type: DirectoryOrCreate\n    name: aescbc-config\n

save the file

"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-api-server","title":"verify api server","text":"

When saving file, Kubernetes will detect changes and restart Api Server. This can be verified using the following command:

kubectl -n kube-system get pods\n
NAME                             READY   STATUS    RESTARTS   AGE\ncoredns-66bff467f8-69b8r         1/1     Running   0          21h\ncoredns-66bff467f8-74j9n         1/1     Running   0          21h\netcd-cube05                      1/1     Running   0          21h\nkube-apiserver-cube05            1/1     Running   0          6s\nkube-controller-manager-cube05   1/1     Running   1          21h\nkube-flannel-ds-amd64-p9xhq      1/1     Running   0          20h\nkube-proxy-8xk5g                 1/1     Running   0          21h\nkube-scheduler-cube05            1/1     Running   1          21h\n

At this state, all created secrets will be crypted in etcd

"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secrets-encryption","title":"Verify secrets encryption","text":""},{"location":"1.0/setup/kubernetes_secure_etcd/#create-a-secret","title":"Create a secret","text":"
kubectl create secret generic secret1 -n default --from-literal=mykey=mydata\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secret-creation","title":"Verify secret creation","text":"
sudo kubectl -n default describe secret secret1\n
Name:         secret1\nNamespace:    default\nLabels:       <none>\nAnnotations:  <none>\n\nType:  Opaque\n\nData\n====\nmykey:  6 bytes\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secret-encryption","title":"Verify secret encryption","text":"

To verify secret encryption we will install etcd client package

apt-get install etcd-client\n

Run the following command:

ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \\\n--cert=/etc/kubernetes/pki/etcd/ca.crt --key=/etc/kubernetes/pki/etcd/ca.key \\\n--endpoints=https://localhost:2379 get /registry/secrets/default/secret1\n

Output will appear with the following text k8s:enc:aescbc:v1:key1: followed by binary values.

Secrets are now encoded with aescbc v1 provider using key1

"},{"location":"1.0/setup/novnc/","title":"Use noVNC as VNC Client","text":""},{"location":"1.0/setup/novnc/#requirements","title":"Requirements","text":"

AbcDeskopio use the amazing projet noVNC. noVNC is a VNC client JavaScript library. Before you start using noVNC get some information about it:

"},{"location":"1.0/setup/novnc/#novnc-description","title":"noVNC description","text":"

noVNC is an open source VNC client. noVNC is both a VNC client JavaScript library as well as an application built on top of that library. noVNC runs well in any modern browser including mobile browsers (iOS and Android). Many companies, projects and products have integrated noVNC including OpenStack, OpenNebula, LibVNCServer, and ThinLinc. See the Projects and Companies wiki page for a more complete list with additional info and links.

"},{"location":"1.0/setup/novnc/#browser-requirements","title":"Browser Requirements","text":"

noVNC uses many modern web technologies so a formal requirement list is not available. However these are the minimum versions we are currently aware of:

"},{"location":"1.0/setup/novnc/#features","title":"Features","text":""},{"location":"1.0/setup/novnc/#create-a-shared-volume-myshared","title":"Create a shared volume myshared","text":"

Before creating containers, we need a shared volume, to share data and unix socket between containers. Run the docker volume create command.

docker volume create myshared \n
"},{"location":"1.0/setup/novnc/#start-the-first-container-myx11server","title":"Start the first container myx11server","text":"

Start the first graphical container named myx11server and forward the tcp port 6081 to the 6081 container tcp port.

Note: We do not need the default 5900 VNC tcp port any more.

docker run -it -v myshared:/tmp --name myx11server -p 6081:6081 ubuntu:latest bash\n\n

You should see a prompt like :

root@6de36e574877:/#\n

Install the package wget Install the library files for tigervnc.

Package list:

Those packages are used by tigervnc. We need to install them.

apt-get update\napt-get install -y wget\napt-get install -y libx11-6 xkb-data x11-xkb-utils xauth libfile-readbackwards-perl netbase libaudit1 libbsd0 libgcrypt20 libgl1 libgnutls30 libjpeg8 libpam0g libpixman-1-0 libselinux1 libstdc++6 libsystemd0 libunwind8 libxau6 libxdmcp6 libxfont2 zlib1g libgl1-mesa-dri xfonts-base x11-xserver-utils xfonts-100dpi xfonts-scalable \n

Download the last tigervnc X11 graphics server from the bintray.com web site

 wget \"https://bintray.com/tigervnc/stable/download_file?file_path=tigervnc-1.10.1.x86_64.tar.gz\" -O tigervnc-1.10.1.x86_64.tar.gz\n

Untar the tigervnc-1.10.1.x86_64.tar.gz file in the container's root file system

cd /\ntar -xvf tigervnc-1.10.1.x86_64.tar.gz\ncp -r /tigervnc-1.10.1.x86_64/usr/* /usr/\n

Start the tigervnc release 1.10. The tigervnc release 1.10 support the option rfbunixpath used by ws-tcp-bridge in next section

Xvnc :0 -rfbunixpath /tmp/.x11vnc -SecurityTypes=none &\n

You should read the output

Xvnc TigerVNC 1.10.0 - built Dec 20 2019 07:12:07\nCopyright (C) 1999-2019 TigerVNC Team and many others (see README.rst)\nSee https://www.tigervnc.org for information on TigerVNC.\nUnderlying X server release 12001000, The X.Org Foundation\n\n\nTue Mar  3 11:05:48 2020\n vncext:      VNC extension running!\n vncext:      Listening for VNC connections on /tmp/.x11vnc (mode 0600)\n vncext:      created VNC server for screen 0\n

Check that the Xvnc TigerVNC release is 1.10.0.

Great, you have installed an X11 server inside a docker container, and the Xvnc server is listening for VNC connections on /tmp/.x11vnc.

"},{"location":"1.0/setup/novnc/#install-the-ws-tcp-bridge","title":"Install the ws-tcp-bridge","text":"

ws-tcp-bridge translate websocket to tcp and have to listen on websocket tcp port 6081 and forward to local unix socket unix:/tmp/.x11vnc.

ws-tcp-bridge is a nodejs server, then we need to install nodejs and npm.

Before, install the package gcc g++ make curl

apt-get install -y gcc g++ make curl \n

Install nodejs and npm

curl -sL https://deb.nodesource.com/setup_13.x | bash -\n
apt-get install -y nodejs\n

Install ws-tcp-bridge

npm install ws-tcp-bridge -g\n

Start ws-tcp-bridge with the parameters --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc in background

Add the & at the end of the command line to run this process in background

/usr/bin/ws-tcp-bridge --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc &\n

You should read on the standard output

proxy mode ws -> tcp\nforwarding port 6081 to unix:/tmp/.x11vnc\n

Great, ws-tcp-bridge is running and forward websocket to Xvnc unix socket

"},{"location":"1.0/setup/novnc/#get-the-ip-address-on-your-first-container-myx11server","title":"Get the ip address on your first container myx11server","text":"

On the container myx11server, to get the container local IP Address, install the package net-tools package

apt-get install -y net-tools\n

And run the ifconfig command

ifconfig eth0\neth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500\n        inet 172.17.0.2 netmask 255.255.0.0  broadcast 172.17.255.255\n        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)\n        RX packets 65149  bytes 95569807 (95.5 MB)\n        RX errors 0  dropped 0  overruns 0  frame 0\n        TX packets 20880  bytes 1159982 (1.1 MB)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n

Write here the ip address of your container myx11server:

IP Address of myx11server _ . . _ .

"},{"location":"1.0/setup/novnc/#create-a-new-container-webserver","title":"Create a new container webserver","text":"

Open a new shell window and start a new docker container named mywebserver, forward the tcp port 80 to the container tcp port 80.

docker run -it --name mywebserver -p 80:80 ubuntu:latest\n

You should see a prompt like:

root@96df62a73e4f:/# \n

Install nginx webserver, run the command

apt-get update\napt-get install -y nginx-extras\n

Install the git and vim package, run the command

apt-get install -y git vim\n

Clone the novnc git on github.com, inside the nginx's root directory.

cd /var/www/html\ngit clone https://github.com/novnc/noVNC.git\n

You should read on the standart output

Cloning into 'noVNC'...\nremote: Enumerating objects: 26, done.\nremote: Counting objects: 100% (26/26), done.\nremote: Compressing objects: 100% (21/21), done.\nremote: Total 10395 (delta 8), reused 13 (delta 5), pack-reused 10369\nReceiving objects: 100% (10395/10395), 9.01 MiB | 7.15 MiB/s, done.\nResolving deltas: 100% (7310/7310), done.\n

Start the nginx web server

nginx\n

The web server nginx is running in backgound.

Great, nginx web server is running, now we need to configure the proxy pass rule with the myx11server container's ip address.

"},{"location":"1.0/setup/novnc/#check-that-the-container-webserver-can-ping-the-container-myx11server","title":"Check that the container webserver can ping the container myx11server","text":"

Install the ping command, run the command

apt-get install -y iputils-ping\n

Get the myx11server container's ip address write before and replace xxx.xxx.xxx.xxx with the myx11server container's ip address

ping -c 5 xxx.xxx.xxx.xxx\n

In this example, i replace xxx.xxx.xxx.xxx by 172.17.0.2

ping -c 5 172.17.0.2\nPING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.\n64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.108 ms\n64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.365 ms\n64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.206 ms\n64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.181 ms\n64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.206 ms\n\n--- 172.17.0.2 ping statistics ---\n5 packets transmitted, 5 received, 0% packet loss, time 4074ms\nrtt min/avg/max/mdev = 0.108/0.213/0.365/0.084 ms\n

The container webserver should receive package from the myx11server container

"},{"location":"1.0/setup/novnc/#edit-the-nginx-configuration-file","title":"Edit the nginx configuration file","text":"

Edit the nginx configuration file /etc/nginx/sites-enabled/default with the vim editor.

vim /etc/nginx/sites-enabled/default\n

In the server section, after the line location you should found :

    location / {\n        # First attempt to serve request as file, then\n        # as directory, then fall back to displaying a 404.\n        try_files $uri $uri/ =404;\n    }\n

Add a /websockify route to proxyfied the websocket http request to your myx11server container.

    location = /websockify {\n        proxy_buffering              off;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header Upgrade         $http_upgrade;\n        proxy_set_header Connection      \"upgrade\";\n        proxy_pass                       http://XXX.XXX.XXX.XXX:6081/;\n    }\n

You have to replace the line

proxy_pass       http://XXX.XXX.XXX.XXX:6081/;\n

by the ip address of your myx11server container, for example replace http://XXX.XXX.XXX.XXX:6081/ with http://172.17.0.2:6081/

proxy_pass       http://172.17.0.2:6081/;\n

The complete server section in the nginx file is for example

server {\n    listen 80 default_server;\n    listen [::]:80 default_server;\n\n    # SSL configuration\n    #\n    # listen 443 ssl default_server;\n    # listen [::]:443 ssl default_server;\n    #\n    # Note: You should disable gzip for SSL traffic.\n    # See: https://bugs.debian.org/773332\n    #\n    # Read up on ssl_ciphers to ensure a secure configuration.\n    # See: https://bugs.debian.org/765782\n    #\n    # Self signed certs generated by the ssl-cert package\n    # Don't use them in a production server!\n    #\n    # include snippets/snakeoil.conf;\n\n    root /var/www/html;\n\n    # Add index.php to the list if you are using PHP\n    index index.html index.htm index.nginx-debian.html;\n\n    server_name _;\n\n    location / {\n        # First attempt to serve request as file, then\n        # as directory, then fall back to displaying a 404.\n        try_files $uri $uri/ =404;\n    }\n\n    location = /websockify {\n        proxy_buffering              off;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header Upgrade         $http_upgrade;\n        proxy_set_header Connection      \"upgrade\";\n        proxy_pass           http://172.17.0.2:6081/; # change this line \n    }\n\n\n    # pass PHP scripts to FastCGI server\n    #\n    #location ~ \\.php$ {\n    #   include snippets/fastcgi-php.conf;\n    #\n    #   # With php-fpm (or other unix sockets):\n    #   fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;\n    #   # With php-cgi (or other tcp sockets):\n    #   fastcgi_pass 127.0.0.1:9000;\n    #}\n\n    # deny access to .htaccess files, if Apache's document root\n    # concurs with nginx's one\n    #\n    #location ~ /\\.ht {\n    #   deny all;\n    #}\n}\n

Now, it's time to reload your nginx configuration, by running the command

nginx -s reload\n
"},{"location":"1.0/setup/novnc/#connect-to-your-nginx-website","title":"Connect to your nginx website","text":"

Run a web browser like Google Chrome or Firefox and go to your nginx website. If you run the nginx website on a separated host replace the name with your hostname or his ip address.

Go to the URL http://localhost or the ip address of your own server

In this exercice in use localhost in the screenshot because all containers are running on my desktop, you may have to replace localhost by ip address, or the fully qualified domain name of your own server.

http://localhost\n

or

http://YOUR_SERVER_IP_ADDRESS\n

You should read the Welcome to nginx! message in your web browser

Go to the noVNC URL http://localhost/noVNC/vnc.html

http://localhost/noVNC/vnc.html\n

Remember, remplace localhost by your fully qualified domain name if need

You should read the Welcome to nginx! message in your web browser

To change the connection settings, click on the settings icon and choose Advanced You have to fill the WebSocket properties as follow:

Then, press the Connect Button

"},{"location":"1.0/setup/novnc/#install-libreoffice-as-a-docker-application","title":"Install libreoffice as a docker application","text":"

On your host, where your container myx11server is running. Open a new shell window and start a new docker container named mylibreoffice.

docker run -it -v myshared:/tmp --name mylibreoffice ubuntu:latest\n

You should see a prompt like :

root@96df62a73e4f:/# \n

To install libreoffice application, run the install libreoffice command in your mylibreoffice container.

apt-get update\napt-get install -y libreoffice\n

Run the soffice command to start Libreoffice

export DISPLAY=:0.0\nsoffice --writer\n

You should read the output

(soffice:7412): dbind-WARNING **: 16:32:03.928: Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-HN3KrNpoAq: Connection refused\n

On the web browser, the application Libreoffice Writer should appear.

Type some text data like 'Hello, I am running inside a docker container'

"},{"location":"1.0/setup/novnc/#install-the-windows-manager-openbox-on-your-myx11server-container","title":"Install the windows manager openbox on your myx11server container","text":"

To move, resize, close, the windows applications, we need a windows manager. abcdesktop is the windows manager. OpenBox is a lightweight, powerful, and highly configurable stacking window manager with extensive standards support.

Run the install openbox command in your myx11server container.

apt-get install -y openbox\n

Set the DISPLAY environment variable to :0.0 and start openbox in background

export DISPLAY=:0.0\nopenbox &\n

Now, you can move the Libreoffice windows. All windows are decorated.

Great you have installed the novnc gateway, and you just need a HTML Web browser to use a Libreoffice

"},{"location":"1.0/setup/retrieve_all_images/","title":"Get all applications for abcdesktop","text":"

Lot of application are ready to use for abcdesktop. All applications are opensource.

You can download the image list from the applist file, or run the command the pull command where $APP is the name of your application.

docker pull abcdesktopio/$APP.d\n

for example to download libreoffice calc, run the command

docker pull abcdesktopio/calc.d\n

Read the list of all applications on the application list page

"},{"location":"1.0/setup/uninstalldockermode/","title":"Uninstall abcdesktop.io for non-cluster hosts","text":""},{"location":"1.0/setup/uninstalldockermode/#commands-to-uninstall-abcdesktopio","title":"Commands to uninstall abcdesktop.io","text":"

Go to the abcdesktop directory (where the docker-compose.yml is located), and run the bash commands :

echo \"starting abcdesktop uninstall commands\"\ndocker-compose -p abcdesktop down\necho \"stop and remove abcdesktop services\"\ndocker-compose rm -s -v -f\necho \"remove all abcdesktop user container\"\ndocker ps --filter \"label=type=x11server\" -q | xargs docker stop\ndocker ps --filter \"label=type=x11server\" -q | xargs docker rm\necho \"remove all abcdesktop images\"\ndocker images --filter=reference='abcdesktopio/*:*' --format \"{{.Repository}}:{{.Tag}}\"  | xargs docker rmi\necho \"remove all user volumes\"\ndocker volume ls -f label=type=x11server -q | xargs docker volume rm\necho \"abcdesktop is uninstalled\"\n

Great, you have uninstalled abcdesktop in non-cluster hosts.

"},{"location":"1.0/setup/vnc/","title":"abcdesktop.io from scratch","text":"

The goal of this chapter is to learn how abcdesktop.io works. You should not repeat the process in production, but prefer use a Dockerfile and the docker build command.

"},{"location":"1.0/setup/vnc/#requirements","title":"Requirements","text":""},{"location":"1.0/setup/vnc/#create-a-shared-volume-myshared","title":"Create a shared volume myshared","text":"

Before creating containers, we need a shared volume, to share data and unix socket between containers. Run the docker volume create command.

docker volume create myshared \n
"},{"location":"1.0/setup/vnc/#start-the-first-container-myx11server","title":"Start the first container myx11server","text":"

Start the first graphical container named myx11server, forward the tcp port 5900 to the container.

docker run -it -v myshared:/tmp --name myx11server -p 5900:5900 ubuntu:latest bash\n\n

You should see a prompt like :

root@6de36e574877:/#\n

Install the X11 graphics server tigervnc

apt-get update\napt-get install -y tigervnc-standalone-server tigervnc-xorg-extension\n

Start the X11 graphics server tigervnc

 Xvnc :0 -SecurityTypes=none &\n

You should read the output

Xvnc TigerVNC 1.7.0 - built Dec  5 2017 09:25:01\nCopyright (C) 1999-2016 TigerVNC Team and many others (see README.txt)\nSee http://www.tigervnc.org for information on TigerVNC.\nUnderlying X server release 11905000, The X.Org Foundation\n\n\nMon Mar  2 11:43:56 2020\n vncext:      VNC extension running!\n vncext:      Listening for VNC connections on all interface(s), port 5900\n vncext:      created VNC server for screen 0\n

Great, you have installed an X11 server inside a docker container, and the Xvnc server is listening for VNC connections on the tcp port 5900. Keep this container running.

We will use the host tcp port 5900 to connect VNC Client.

"},{"location":"1.0/setup/vnc/#use-vnc-client-to-connect-to-your-first-container-myx11server","title":"Use VNC client to connect to your first container myx11server","text":"

From your host or from another host, install a VNC client. You can use your prefered VNC Client for your operating system or the RealVNC's VNC Viewer. You can download the RealVNC's VNC Client, by following the link https://www.realvnc.com/fr/connect/download/viewer/

Run the VNC Viewer, and set the hostname where the container myx11server is running. In the following example.

Here I am using VNC Viewer on Mac OS/X and I did set the hostname to localhost.

This is a getting started guide to understand how abcdesktop works, so we did not set a password to protect the VNC access. This is not the best practices guide for production installations. As we did not set a password to protect the VNC access, you have to confirm the uncrypted connection warning dialog box and then press the Continue button.

This is just an example to understand how abcdesktop works, so we did not set a password to protect the VNC access.

You need to confirm the uncrypted connection warning dialog box. Press the Continue button.

A black screen should appear :

Keep this VNC Client running, we will use this display to show our applications later.

"},{"location":"1.0/setup/vnc/#install-an-x11-application-as-a-docker-application","title":"Install an x11 application as a docker application","text":"

On your host, where your container myx11server is running. Open a new shell window and start a new docker container named myapp. The myapp container access to the volume myshared and mount it to /tmp.

docker run -it -v myshared:/tmp --name myapp ubuntu:latest\n

You should see a prompt like :

root@96df62a73e4f:/# \n

To install standart application like xedit, xman or xeyes, install the package x11-apps.

Run those commands in your myx11server container.

apt-get update\napt-get install -y x11-apps\n

Set the DISPLAY environment variable to :0.0 and then start the xedit command.

export DISPLAY=:0.0\nxedit\n

On the VNC Viewer, the application xedit should appear.

Great, you can run a X11 application inside a dedicated docker container, and use your myx11server as DISPLAY. But you can't move, resize or close the xedit window.

"},{"location":"1.0/setup/vnc/#install-the-windows-manager-openbox-on-your-myx11server-container","title":"Install the windows manager openbox on your myx11server container","text":"

To move, resize, close, the windows applications, we need a windows manager. abcdesktop use the windows manager openbox. OpenBox is a lightweight, powerful, and highly configurable stacking window manager with extensive standards support.

Run the install openbox command in your myx11server container.

apt-get install -y openbox\n

Set the DISPLAY environment variable to :0.0 and then start openbox.

export DISPLAY=:0.0\nopenbox\n

The Openbox message appear to the sdterr

Openbox-Message: Unable to find a valid menu file \"/var/lib/openbox/debian-menu.xml\"\n

Now, you can move the window xedit. The windows are decorated.

"},{"location":"1.0/setup/vnc/#remove-the-myapp-container","title":"Remove the myapp container","text":"

Activate the window shell with your myapp running container, and press CTRL+C

root@9abc7da524a5:/# xedit \n^C\nroot@9abc7da524a5:/# exit\nexit\n

You can remove your docker container, to clean up your environment

docker rm myapp\n
"},{"location":"1.0/setup/vnc/#install-another-x11-application-as-a-docker-application","title":"Install another x11 application as a docker application","text":"

On your host, where your container myx11server is running, open a new shell window and start a new docker container named myapp.

docker run -it -v myshared:/tmp --name myfirefox ubuntu:latest\n

You should see a prompt like :

root@96df62a73e4f:/# \n

To install firefox application, run the install firefox command in your myfirefox container.

apt-get update\napt-get install -y firefox\n

Run the firefox command

export DISPLAY=:0.0\nfirefox\n

You should read the output

\n(firefox:1831): LIBDBUSMENU-GLIB-WARNING **: 14:42:14.737: Unable to get session bus: Failed to execute child process ?dbus-launch? (No such file or directory)\n

On the VNC Viewer, the application firefox should appear.

Check that firefox works and go to your favorite web site.

"},{"location":"1.0/setup/vnc/#clean-your-setup","title":"Clean your setup","text":"

To clean your work space, stop the running containers myapp myfirefox myx11server, then remove them. We also need to remove the shared volume myshared

Run the commands :

docker stop myfirefox myx11server\ndocker rm myfirefox myx11server\ndocker volume rm myshared\n\n

Keep the docker images ubuntu, we will use it in the next chapter

"},{"location":"1.0/setup/vnc/#next-chapter","title":"Next chapter","text":"

In the next chapter, we will replace the VNC Client by a web browser.

"},{"location":"2.0/features/","title":"abcdesktop release 2.0","text":"

The abcdesktop release 2.0 has started in May 2020

"},{"location":"2.0/config/authentification-rules/","title":"Authentification rules configuration","text":"

All auth providers support rules configuration

A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )

"},{"location":"2.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"

A rule is a dictionary object with :

Example :

To test if the user source IP address is equal to 8.8.8.1/32

'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n
"},{"location":"2.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"

conditions is a list of condition. All condition are always tested, as a logical AND. The result must be equal to the expected value.

"},{"location":"2.0/config/authentification-rules/#examples","title":"Examples:","text":""},{"location":"2.0/config/authentification-rules/#example-true-and-true-expected-true","title":"Example (TRUE and TRUE) expected TRUE:","text":"

To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnet80'\n}\n

Add the labels 'shipcrewandnet80', if the 'expected' value is True

"},{"location":"2.0/config/authentification-rules/#example-true-and-true-expected-false","title":"Example (TRUE and TRUE) expected FALSE:","text":"

To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : False,\n    'label': 'noshipcrewandnet80'\n}\n

Add the labels 'noshipcrewandnonet80', if the 'expected' value is False

"},{"location":"2.0/config/authentification-rules/#example-true-and-false-expected-true","title":"Example (TRUE and FALSE) expected TRUE:","text":"

To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : False } ], \n    'expected' : True,\n    'label': 'noshipcrewandnet80'\n}\n

Add the labels 'noshipcrewandnet80', if the 'expected' value is True

"},{"location":"2.0/config/authentification-rules/#example-false-and-true-expected-true","title":"Example (FALSE and TRUE) expected TRUE:","text":"

To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : False },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnonet80'\n}\n

Add the labels 'shipcrewandnonet80', if the 'expected' value is True

"},{"location":"2.0/config/authentification-rules/#the-condition-value","title":"The condition value","text":"name description example boolean always true or false 'boolean' : 'true' httpheader test a HTTP header value 'httpheader': memberOf test if the LDAP user object is member of group 'memberOf': [ 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'] network test if the client user IP Address is in a network subnet 'network': [ '1.2.3.4/24'] primarygroupid test if the LDAP user object has a attibute primaryGroupID and is equal to value 'primarygroupid': '513'"},{"location":"2.0/config/authentification-rules/#condition-boolean","title":"condition boolean","text":"

This condition is a dummy condition; Only use to force a label or to disable a test.

'boolean': boolean\n

The commun usage is

'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : True,\n                 'label': 'dummy'\n}\n

or alway False

'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : False,\n                 'label': 'dummy'\n}\n
"},{"location":"2.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"

This condition is test if a HTTP Header value is equal to a string.

'httpheader': dict\n

example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'

\n 'rule-httpheader': { \n        'conditions' : [ \n            {   'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n                'expected' : True  } ],\n        'expected' : True,\n        'label': 'chromemaxosx112' }\n\n
"},{"location":"2.0/config/authentification-rules/#condition-network","title":"condition network","text":"

This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.

'network': string\n

example

To test if the user source IP address is equal to 8.8.8.1/32

'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n

To test if the user source IP address is in the subnet 10.0.0.0/8

'rule-localnet': { \n    'conditions' : [   { 'network': '10.0.0.0/8', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'localnet' }\n

To test if the user source IP address is NOT in the subnet 192.168.0.0/24

'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : False } ],\n                         'expected' : True,\n                         'label': 'no192168net' }\n

same as

'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : True } ],\n                         'expected' : False,\n                         'label': 'no192168net' }\n
"},{"location":"2.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"

To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork a separated rule.

'policies': {\n    'acl' : {},\n    'rules' : { \n          'rule-privatenetwork-10': {   'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-fe80':{  'conditions' : [ { 'network': 'fe80::/10',     'expected' : True } ], \n                                                'expected'   : True, \n                                                'label': 'privatenetwork' }\n    }\n}                       \n
"},{"location":"2.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"

This condition test if the user is a member of a LDAP Distinguished Name.

'memberOf': string\n
 'rule-sample': { 'conditions':  [ \n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewgrp'\n}\n
"},{"location":"2.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"

This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.

'primarygroupid': string\n

To check is a user is memberof a DOMAIN\\USER the primary group id is 513

'rule-domainuser': {    'conditions':  [ { 'primarygroupid': '513', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'domainuser'\n}\n

However, if the user needed to be seen as a Domain Admin for POSIX, the PrimaryGroupID is 512, the RID for that group.

'rule-posixdomainadmin': {  'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'posixdomainadmin'\n}\n

The Enterprise Admins group, 519, is also used to grant this level in POSIX.

'rule-enterpriseadmin': {   'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'enterpriseadmin'\n}\n
"},{"location":"2.0/config/authexplicit-activedirectory/","title":"Authentification explicit for Microsoft Active Directory services","text":""},{"location":"2.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

For example :

'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}"},{"location":"2.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"

The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN and defined in the config_ref with the exact same value.

Providers :

The provider is formated as a dictionnary

{ 'AD': { 'config_ref': 'adconfig', 'enabled': True } }

Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

The adconfig is a dictionnary. For example :

adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n

If this example, the Microsoft Active Directory value are set to :

Variable name Value for example USERDOMAINADUSERDNSDOMAINAD.DOMAIN.LOCAL

For Active Directory authmanagers, replace the variable name with your own value.

Variable name Type Description Example default boolean Use this domain as default domain True ldap_basedn string LDAP Base Distinguished Names DC=ad,DC=domain,DC=localldap_fqdn string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.localdomain_fqdn string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCALservers list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]kerberos_realm string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL

The explicit authentification is support LDAP and LDAPS bind.

The Microsoft Active Directory value are set to :

Variable name Value USERDOMAINADUSERDNSDOMAINAD.DOMAIN.LOCAL

For Active Directory authmanagers, replace the variable name with your own value.

Variable name Description Example ldap_basedn Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=localldap_fqdn Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.localdomain_fqdn Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCALservers Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]kerberos_realm Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL"},{"location":"2.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"

The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)

"},{"location":"2.0/config/authexplicit-activedirectory/#site","title":"Site","text":"

This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.

Variable name Type Defautl value site_subnetdn string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') )site_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=subnet)site_attrs list ['cn', 'siteObject', 'location']"},{"location":"2.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"

This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location is the join key to match local printer for the user.

Variable name Type Defautl value printer_printerdn string OU=Applications + config.get('basedn')printer_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=printQueue)site_attrs list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]

Great, you have check how the explicit Authentification configuration works.

"},{"location":"2.0/config/authexplicit-ldap/","title":"Authentification explicit for LDAP Directory Services","text":""},{"location":"2.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

explicit authentification use a directory service. A bind operation is used to authenticate clients to the directory server, to establish an authorisation identity that will be used for subsequent operations processed on that connection.

The explicit authentification configuration is defined as a dictionary object and contains an explicit provider.

For example :

'explicit': {\n    'providers': {\n      'LDAP': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n}\n

In this example, ldapconfig dict must have a key LDAP

Variable name Type Description default_domain string set the default domain name, if user does not prefix the login by domain\\s. default_domain is only used by Active Directory provider providers dictionary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}"},{"location":"2.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"

The provider authentification configuration is defined as a dictionary object and must contain a key name. The key name must be set with the same value in provider configuration and config_ref.

The provider is formatted as a dictionary. Example for a provider defined as planet

 { 'planet': {  \n            'config_ref': 'ldapconfig',  \n            'enabled': True  \n        }\n }\n
Variable name Type Description config_ref string For increased readability , the configuration is defined in a dedicated and separated dictionary as (key,value) 'config_ref': 'planet', where key is config_ref and value is the dictionary variable name. enable boolean True to enable or False to disable the provider configuration

The ldapconfig is a dictionary.

For example :

ldapconfig : { \n  'planet': {    \n    'default'       : True, \n    'ldap_timeout'  : 15,\n    'ldap_protocol' : 'ldap',\n    'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n    'servers'       : [ 'ldap://192.168.8.195' ],\n    'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' } \n  } \n } \n}\n
"},{"location":"2.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default boolean Use this ldap configuration as default (if more than one ldap auth provider is defined) True auth_only boolean Do not run ldap queries, only use to run authentication False auth_type string authentification protocol to bind the ldap server. Values can be 'KERBEROS', 'NTLM' or 'SIMPLE' The default value is 'SIMPLE' basedn string LDAP base Distinguished Name ou=people,dc=planetexpress,dc=comservers list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. This entry must be prefixed by the protocol ldap or ldaps for each server [ 'ldap://192.168.1.12', 'ldaps://192.168.1.13' ] LDAP server address IP Address or FQDN value scope LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope being one of SCOPE_BASE (to search the object itself), SCOPE_ONELEVEL (to search the object\u2019s immediate children), or SCOPE_SUBTREE (to search the object and all its descendants). ldap.SCOPE_SUBTREEtimeout integer ldap time out in second 10 exec_timeout integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos keytab file the exec timeout is used to run external command line. 10 users_ou string Users Organisation Unit ou=people,dc=planetexpress,dc=comattrs list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s))group_filter string LDAP filter to find group object (&(objectClass=Group)(cn=%s))group_attrs string LDAP filter to find group object (&(objectClass=Group)(cn=%s))serviceaccount dictionary entries to defined service account credentials formatted like { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' } or { 'login': 'file://config/serviceaccount/login', 'password': 'file://config/serviceaccount/passwd' }"},{"location":"2.0/config/authexplicit-ldap/#ldap-service-account","title":"ldap service account","text":"

Ldap service account permits service account binding. A service account can be defined using clear text login and password data, or as file reference login and password starting by file://.

The file reference file:// for login and password is used to read kubernetes secret file data.

"},{"location":"2.0/config/authexplicit-ldap/#configure-auth-using-the-openldap-container","title":"Configure Auth using the OpenLDAP container","text":""},{"location":"2.0/config/authexplicit-ldap/#openldap-container-for-testing","title":"OpenLDAP container for testing","text":"

To configure abcdesktop to use an explicit authentification, we need a directory service. We use an OpenLDAP container for testing with provisioned values. docker-test-openldap from rroemhild works fine ans id very useful.

Read the OpenLDAP container for testing documentation on the url abcdesktop OpenLDAP Docker Image for testing

"},{"location":"2.0/config/authexplicit-ldap/#update-the-odconfig-configuration-file","title":"Update the od.config configuration file","text":"

Update the od.config configuration file.

Add the explicit entry to the dictionary authmanagers.

authmanagers: {\n  'external': {\n  },\n  'explicit': {\n    'show_domains': True,\n    'providers': {\n      'planet': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n  }}      \n

Note: the config_ref is ldapconfig.

Add a new dictionary object named ldapconfig to the configuration file. These values come from the LDAP structure of OpenLDAP Docker Image for testing

ldapconfig : { 'planet': {    \n                        'default'       : True, \n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ 'ldap://openldap' ] }}\n

Save your new od.config file.

Open the URL:http://localhost:30443

The authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

"},{"location":"2.0/config/authexplicit-ldap/#the-ldap-structure-of-openldap-container-for-testing","title":"The LDAP structure of OpenLDAP container for testing","text":""},{"location":"2.0/config/authexplicit-ldap/#basedn","title":"BaseDN","text":"

The basedn is dc=planetexpress,dc=com

"},{"location":"2.0/config/authexplicit-ldap/#admin-account","title":"admin account","text":"

The admin account is described as

Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"2.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":""},{"location":"2.0/config/authexplicit-ldap/#users","title":"Users","text":""},{"location":"2.0/config/authexplicit-ldap/#cnhubert-j-farnsworthoupeopledcplanetexpressdccom","title":"cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hubert J. Farnsworth sn Farnsworth description Human displayName Professor Farnsworth employeeType Owner employeeType Founder givenName Hubert jpegPhoto JPEG-Photo (630x507 Pixel, 26780 Bytes) mail professor@planetexpress.com mail hubert@planetexpress.com ou Office Management title Professor uid professor userPassword professor"},{"location":"2.0/config/authexplicit-ldap/#cnphilip-j-fryoupeopledcplanetexpressdccom","title":"cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry"},{"location":"2.0/config/authexplicit-ldap/#cnjohn-a-zoidbergoupeopledcplanetexpressdccom","title":"cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn John A. Zoidberg sn Zoidberg description Decapodian displayName Zoidberg employeeType Doctor givenName John jpegPhoto JPEG-Photo (343x280 Pixel, 26438 Bytes) mail zoidberg@planetexpress.com ou Staff title Ph. D. uid zoidberg userPassword zoidberg"},{"location":"2.0/config/authexplicit-ldap/#cnhermes-conradoupeopledcplanetexpressdccom","title":"cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hermes Conrad sn Conrad description Human employeeType Bureaucrat employeeType Accountant givenName Hermes mail hermes@planetexpress.com ou Office Management uid hermes userPassword hermes"},{"location":"2.0/config/authexplicit-ldap/#cnturanga-leelaoupeopledcplanetexpressdccom","title":"cn=Turanga Leela,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Turanga Leela sn Turanga description Mutant employeeType Captain employeeType Pilot givenName Leela jpegPhoto JPEG-Photo (429x350 Pixel, 26526 Bytes) mail leela@planetexpress.com ou Delivering Crew uid leela userPassword leela"},{"location":"2.0/config/authexplicit-ldap/#groups","title":"Groups","text":""},{"location":"2.0/config/authexplicit-ldap/#cnadmin_staffoupeopledcplanetexpressdccom","title":"cn=admin_staff,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn admin_staff member cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com member cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com"},{"location":"2.0/config/authexplicit-ldap/#cnship_crewoupeopledcplanetexpressdccom","title":"cn=ship_crew,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn ship_crew member cn=Turanga Leela,ou=people,dc=planetexpress,dc=com member cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com member cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"},{"location":"2.0/config/authexplicit-ldap/#insert-the-user-credentials","title":"Insert the user credentials","text":"

Start your web browser and open the URL http://localhost

The Web home page contains the new input values Login and Password to authenticate this user.

You can use for example on user of the list above.

Credentials Value Login Turanga Leela Password leela

Insert the login credentials :

Turanga Leela as login and leela as password, then click on the Sign in button.

Look at the top of the sreen. The user name is Turanga Leela:

"},{"location":"2.0/config/authexplicit-ldap/#applications-remainted","title":"Applications remainted","text":"

Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :

I like this amazing project abcdesktop.io\n

Do not save your file and just close your web browser.

Start your web browser again, and open the same URL http://localhost, and log in with the same account: Turanga Leela as login and leela as password, then click on the Sign in button.

The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io

All applications are maintained.

Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.

"},{"location":"2.0/config/authexplicit/","title":"Authentification explicit","text":""},{"location":"2.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit:","text":"

explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

The explicit authentification configuration is defined as a dictionary object and contains an explicit provider.

The explicit provider support the directory services ldap, ldaps, and Microsoft Active Directory, and SIMPLE, NTLM and KERBEROS protocols.

Configuration sample for Microsoft Active Directory with KERBEROS protocol :

'explicit': {\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'auth_type'     : 'KERBEROS'\n                       'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                       'servers'       : [ 'ldap://192.168.7.12' ],\n                       'kerberos_realm': 'AD.DOMAIN.LOCAL' } } }\n
"},{"location":"2.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"

If the authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

"},{"location":"2.0/config/authexplicit/#ldap-authmanagers","title":"LDAP authmanagers :","text":"

Read the specific chapter on LDAP explicit authmanagers

"},{"location":"2.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"

Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers

Great, you have check how the explicit Authentification configuration works.

"},{"location":"2.0/config/authexternal/","title":"Authentification external","text":""},{"location":"2.0/config/authexternal/#requirements","title":"Requirements","text":"

To use external Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.

"},{"location":"2.0/config/authexternal/#library","title":"Library","text":"

abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.

"},{"location":"2.0/config/authexternal/#authmanagers-external","title":"authmanagers external:","text":"

external authentification use OAuth 2.0 authenticaton.

The external authentification configuration is defined as a dictionary object and contains a list of external provider.

Sample providers entry using the Google OAuth 2.0 authentification service.

'external': {\n    'providers': {\n    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n}\n

The variable values client_id and client_secret have been set to obfuscate value 'XXX'. The FQDN is refered to the public server FQDN.

Variable name Type Description Sample displayname string Display Name show in Web front Googleenabled boolean LDAP Base Distinguished Names Trueclient_id string client id XXX-YYY.apps.googleusercontent.comclient_secret string client secret XXXscope list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ]userinfo_url string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix string redirect URL https://hostname.domain.local/API/auth/oauthredirect_uri_querystring string URL query string manager=external&provider=googleauthorization_base_url string callback URL https://accounts.google.com/o/oauth2/v2/authtoken_url string token URL https://oauth2.googleapis.com/token

The complete redirect url concats the two values redirect_uri_prefix and redirect_uri_querystring.

"},{"location":"2.0/config/authexternal/#orange-oauth-20","title":"Orange OAuth 2.0","text":"

Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.

"},{"location":"2.0/config/authexternal/#orange-application","title":"Orange Application","text":"

Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section

'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'openid', 'form_filling' ],\n        'client_id': 'XXX',\n        'client_secret': 'YYY',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=orange',\n        'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n        'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n        'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n      }\n
"},{"location":"2.0/config/authexternal/#facebook-oauth-20","title":"Facebook OAuth 2.0","text":"

Facebook's OAuth is supported for authentication.

"},{"location":"2.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"

Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API

'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'XXX', \n        'client_secret': 'YYY', \n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        }\n
"},{"location":"2.0/config/authexternal/#google-oauth-20","title":"Google OAuth 2.0","text":"

Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.

"},{"location":"2.0/config/authexternal/#google-application","title":"Google Application","text":"

Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]

'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n

Great, you have check how the implicit Authentification configuration works.

"},{"location":"2.0/config/authimplicit/","title":"Authentification implicit","text":""},{"location":"2.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit:","text":"

implicit is the easiest configuration mode, and is used as 'Anonymous' authentification.

The provider is defined as a dictionary object and contains an anonymous provider.

anonymous provider always permits authentification, and create a uuid as userid. anonymous provider is used to skip the authentification process in a demonstration mode.

'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n

anonymous provider always permit authentification, and create a uuid as userid.

Set in your configuration file the authmanagers dictionary as described

authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { \n     'providers': {\n         'anonymous': {\n           'displayname': 'Anonymous',\n           'caption': 'Anonymous',\n           'userid': 'anonymous',\n           'username': 'Anonymous'\n      } \n   }\n}\n

Update your configuration file and apply the new configuration file

Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :

Select the Sign-In Anonymously button.

Then, choose the settings in the menu at the upper right corner

Choose the System in the settings control panel.

Then choose User containers

This screen show you the hostname.

You can read the hostname. In the example the hostname is f097ab7aac57, from the container id.

Using a shell, run the command

kubectl get pods -n abcdesktop \n

Find a running container with the containerid previously identified.

In this example the containerid is f097ab7aac57

f097ab7aac57   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   8 minutes ago    Up 8 minutes               4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp   g-06b686a5-c98d-4889-b73d-3455f692e6c2\n

Run the command docker inspect CONTAINERID, replace the string CONTAINERID with your container id value.

For example docker inspect f097ab7aac57

docker inspect f097ab7aac57\n

Locate the Mounts description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and

 \"Mounts\": [\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/tmp\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            },\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/home/balloon\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            }\n        ],\n\n

When an anonymous user close his session, the anonymous home directory is deleted.

Great, you have check how the implicit Authentification configuration works.

"},{"location":"2.0/config/authmetaexplicit/","title":"Authentification metaexplicit for Microsoft Active Directory services with trust relationships","text":""},{"location":"2.0/config/authmetaexplicit/#authmanagers-metaexplicit-object","title":"authmanagers metaexplicit object","text":"

The metaexplicit authentification manager contains only one provider. The provider must be defined as metadirectory.

'metaexplicit': {\n    'providers': {\n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True\n       }\n}\n
Variable name Type Description providers dictionary { 'metadirectory': { 'config_ref': 'coporateconfig', 'enabled': True }}"},{"location":"2.0/config/authmetaexplicit/#metadirectory-provider-configuration","title":"metadirectory provider configuration","text":"

The metadirectory provider is defined as a dictionnary object and must contain key name. The key name must be set as the name of a dictionaryin the config_ref.

A metadirectory provider must contain a ldap attribut to describe the original DOMAIN and sAMaccountName. The ldap attribut is defined as join_key_ldapattribut.

coporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } } \n

Pyos binds the metadirectory ldap server with serviceaccount credentials Pyos read the ldap attribut description value to get the user's trusted domain.

For example :

description: AD\\john\n

Then pyos look for provider AD configuration and process authentification on domain AD

The metadirectory accounts can be disabled. The ldap attribut userAccountControl is not read on metaDirectory provider. The account can have the bit UF_ACCOUNT_DISABLE set or not.

A service account must defined for a metadirectory provider. The service account is used to bind the metadirectory.

"},{"location":"2.0/config/authmetaexplicit/#complete-example-with-a-metadirectory-provider-and-active-directory-user-domain","title":"Complete example with a metadirectory provider and active directory user domain","text":"

The user's domain mane is AD. The meta domain name is CORPORATE. The meta domain use a dedicated attribut join_key_ldapattribut

authmanagers: {\n  #\n  # define the meta explicit manager\n  # This is the trusted external forest for the followed domain\n  #\n  'metaexplicit': {\n    'providers': {\n      # define the metadirectory provider\n      # only one metadirectory provider is supported \n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True } \n    }\n  },\n\n  #        \n  # define the Active Directory provider for each DOMAIN\n  # define two domains in two disctinct forest with a trust relationship \n  # \n  'explicit': { \n    # define an Active Directory provider AD \n    'AD': {  'config_ref': 'adconfig', 'enabled': True },\n    # define an Active Directory provider ANOTHER\n    'ANOTHER': { 'config_ref': 'anotherconfig', 'enabled': True }  \n  }\n} # end of authmanagers\n\n# In this example ldap attribut's description contains AD\\myuser or ANOTHER\\myuser \ncoporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } }\n\n\n# \n# define the first DOMAIN AD\n# The adconfig ref for domain AD\n#\nadconfig : { 'AD': {  'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                      'domain'        : 'AD',\n                      'auth_type'     : 'NTLM',\n                      'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                      'servers'       : [ 'ldap://192.168.7.12' ] } }\n\n#\n# define the second DOMAIN ANOTHER\n# The anotherconfig ref for domain ANOTHER\n#\nanotherconfig : { 'ANOTHER': {\n                      'ldap_basedn'   : 'DC=another,DC=super,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.another.super.local',\n                      'domain'        : 'ANOTHER',\n                      'auth_type'     : 'KERBEROS',\n                      'domain_fqdn'   : 'ANOTHER.SUPER.LOCAL',\n                      'servers'       : [ 'ldap://192.168.10.12' ],\n                      'kerberos_realm': 'AD.SUPER.LOCAL' } }\n
"},{"location":"2.0/config/authmetaexplicit/#metadirectorysupport","title":"metadirectorysupport","text":"

metadirectory support the foreign security principal (FSP) to query security principal in the trusted external forest. These objects are created in the foreign security principals container of the domain. metadirectory support isMemberOf on foreign security principal.

The user's SID of domain 'AD' or 'ANOTHER' is NOT read. A new ldap bind is done using the trusted domain on metadirectory provider and not unsing the service account.

The ldap query is build : ( \"search_base={q.basedn}, search_scope={q.scope}, search_filter={filter}\" )

To get more information about foreign security principal (FSP), read :

"},{"location":"2.0/config/balloon/","title":"balloon user entry in od.config","text":"

balloon is the default generic user.

The balloon user is created inside the oc.user container

The default values are

balloon Default Values nameballoonuid4096gid4096homedirectory/home/balloon

If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"2.0/config/controllers/","title":"Controllers","text":""},{"location":"2.0/config/controllers/#controllers_1","title":"Controllers","text":"

abcdesktop.io use a Model\u2013view\u2013controller (usually known as MVC) is a software design pattern commonly used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.

Controller Description AccountingController accounting data json and ebnf format AuthController authenticate user ComposerController CRUD main services (like createDesktop, runApplication) CoreController get configuration and user message info ManagerController manage pyos PrinterController CRUD printer object StoreController CRUD key value data UserController retrieve user information"},{"location":"2.0/config/controllers/#access-permission","title":"Access Permission","text":"

The AccountingController and ManagerController access is protected with a source ip address filter. The access control filter is defined in a dictionary. Each dictionary entry use the controller name and with an entry permitip. The permitip is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]. If permitip is not set or the controller name is not set, all ip source address are allowed the send a request to the controller.

The controllers dictionnary is defined in the od.config file. By default the configuration permit private network defined in rfc1918 and rfc4193. Get more information about the private network.

By default others controllers access is enabled, without ip restriction.

    controllers : { \n        'AccountingController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'AuthController' :      { 'permitip': None },\n        'ComposerController' :  { 'permitip': None },\n        'CoreController' :      { 'permitip': None },\n        'ManagerController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'PrinterController' :   { 'permitip': None },\n        'StoreController' :     { 'permitip': None },\n        'UserController' :      { 'permitip': None }\n    } \n

If the source ip address is not allowed, the response is a HTTP status code 403 Forbidden

{\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
"},{"location":"2.0/config/desktop/","title":"desktop options in od.config","text":"

The od.config contains options to describe how the oc.user and applications containers have to be created. Options differ if abcdesktop.io is running in docker mode or in kubernetes mode.

"},{"location":"2.0/config/desktop/#desktopoptions","title":"desktop.options","text":"

All desktop options are defined in od.config file. Desktop options start with the prefix desktop., then add the name of the option.

Option name Type Sample desktop.usex11unixsocket boolean True desktop.defaultbackgroundcolors list [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ] desktop.homedirectorytype string 'volume' desktop.remotehomedirectorytype list [] desktop.persistentvolumeclaim string None desktop.allowPrivilegeEscalation boolean False desktop.securityopt list [ 'no-new-privileges', 'seccomp=unconfined' ] desktop.imagePullSecret string None desktop.image string 'abcdesktopio/oc.user.18.04:latest' desktop.imageprinter string 'abcdesktopio/oc.cupsd.18.04:latest' desktop.useprintercontainer boolean False desktop.soundimage string 'abcdesktopio/oc.pulseaudio.18.04' desktop.usesoundcontainer boolean False desktop.usecontainerimage boolean False desktop.initcontainerimage string 'abcdesktopio/oc.busybox' desktop.envlocal dictionary { 'DISPLAY': ':0.0', 'USER': 'balloon', 'LIBOVERLAY_SCROLLBAR': '0', 'UBUNTU_MENUPROXY': '0', 'HOME': '/home/balloon', 'LOGNAME': 'balloon' }desktop.nodeselector dictionary {}desktop.username string 'balloon' desktop.userid integer 4096 desktop.groupid integer 4096 desktop.userhomedirectory string '/home/balloon'desktop.useinternalfqdn boolean False desktop.uselocaltime boolean False desktop.host_config dictionary { 'auto_remove' : True, 'ipc_mode' : 'shareable', 'network_mode' : 'container', 'shm_size' : '128M', 'mem_limit' : '512M', 'cpu_period' : 100000, 'cpu_quota' : 150000, 'security_opt' : [ 'seccomp=unconfined' ] }desktop.application_config dictionary { 'auto_remove' : True, 'ipc_mode' : 'shareable', 'pid_mode' : True, 'network_mode' : 'container', 'shm_size' : '512M', 'mem_limit' : '2G', 'cpu_period' : 200000, 'cpu_quota' : 150000, 'security_opt' : [ 'seccomp=unconfined' ] }desktop.policies dictionary { 'rules':{}, 'max_app_counter':5 }desktop.webhookdict dictionary { 'firewall': '192.168.7.1' }"},{"location":"2.0/config/desktop/#desktopusex11unixsocket","title":"desktop.usex11unixsocket","text":"

The desktop.usex11unixsocket force the X11 server to use local unix socket. The name of the X11 unix socket is /tmp/.X11-unix/X0

You can disable this features, but you have to replace the default TigerVNC by another X11 Server and a VNC Server. You can choose (x.org + x11vnc) for example, but you need more CPU ressource than TigerVNC.

TigerVNC does not support to listen on TCP Port. TigerVNC is a X11 and a VNC Server.

Set the desktop.usex11unixsocket value to True in most case, and this should not be changed.

"},{"location":"2.0/config/desktop/#desktopshareipcnamespace","title":"desktop.shareipcnamespace","text":"

The type of desktop.shareipcnamespace is a string. The default value is 'shareable' This option permit user contain to share the ipc namespace with application

Value Description '' Use daemon\u2019s default. 'none' Own private IPC namespace, with /dev/shm not mounted. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system\u2019s IPC namespace.

If not specified, daemon default is used, which can either be 'private' or 'shareable', depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues.

Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built (typically C/OpenMPI, C++/using boost libraries) high performance applications for scientific computing and financial services industries.

If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using \"shareable\" mode for the main (i.e. \u201cdonor\u201d) container, and containers can access \"container:\".

Default value desktop.shareipcnamespace : 'shareable'

"},{"location":"2.0/config/desktop/#desktophomedirectory","title":"desktop.homedirectory","text":"

This option describes how the default home directory for user user ballon should be created :

"},{"location":"2.0/config/desktop/#desktoppersistentvolumeclaim","title":"desktop.persistentvolumeclaim","text":"

This value is only avalaible in kubernetes mode.

desktop.persistentvolumeclaim is the name of the Persistent Volume Claim if the desktop.homedirectory is set to 'persistentVolumeClaim'. The PVC (Persistent Volume Claim) must exist.

Run the kubectl get pvc command to list the persistent volume claim

NAME                                   STATUS   VOLUME                     CAPACITY   ACCESS MODES   STORAGECLASS           AGE\nabcdesktop-pvc                        Bound    abcdesktop-pv             5Gi        RWO            abcdesktop-standard   170d\n
"},{"location":"2.0/config/desktop/#desktopremotehomedirectorytype","title":"desktop.remotehomedirectorytype","text":"

desktop.remotehomedirectorytype is a list of string. Each string describe if the remount access to a directory is allowed. example [ 'cifs', 'webdav' ]

For each entry in the desktop.remotehomedirectorytype list, abcdesktop.io try to mount the remote file system using data from the implicit auth provider.

If desktop.remotehomedirectorytype contains 'cifs' and if the authentification provider get homeDrive and homeDirectory attributs then abcdesktop request the kubernetes abcdesktop/CIFS Driver to mount the remote filesystem. The user find a mount point named homeDrive value, and mounted to homeDirectory.

"},{"location":"2.0/config/desktop/#desktopallowprivilegeescalation","title":"desktop.allowPrivilegeEscalation","text":"

The desktop.allowPrivilegeEscalation option allow a user to run a sudo command. The execve system call can grant a newly-started program privileges that its parent did not have, such as the setuid or setgid Linux flags.

The default value is False You should only set desktop.allowPrivilegeEscalation to run sudo command.

In production this value MUST be set to False

"},{"location":"2.0/config/desktop/#desktopdefaultbackgroundcolors","title":"desktop.defaultbackgroundcolors","text":"

The desktop.defaultbackgroundcolors allow you to change the default background color.

The default value is a list of string [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]

The desktop.defaultbackgroundcolors length can contain up to 8 entries. To see the color

Open the url http://localhost, in your web browser, to start a simple abcdesktop.io container.

http://localhost\n

You should see the abcdesktop.io home page.

Press the Connect with Anonymous access, have look

At the right top corner, click on the menu and choose Settings, then click on Screen Colors

You should see the default background colors, for example :

"},{"location":"2.0/config/desktop/#desktopimagepullsecret","title":"desktop.imagePullSecret","text":"

The desktop.imagePullSecret is the name of the secret used by Kubernetes to access to the private registry. The type of desktop.imagePullSecret is a string. This option is only available in Kubernetes mode, and anly used if you need to store the abcdesktop docker image on a private registry.

kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=https://index.docker.io/v1/ --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=registry.mydomain.local:443 --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
"},{"location":"2.0/config/desktop/#desktopimage","title":"desktop.image","text":"

The desktop.image is the name of the X11 server container The default value is abcdesktopio/oc.user.18.04

"},{"location":"2.0/config/desktop/#desktopprinterimage","title":"desktop.printerimage","text":"

The desktop.printerimage is the name of the printer container The default value is abcdesktopio.oc.cupds.18.04

"},{"location":"2.0/config/desktop/#desktopuseprintercontainer","title":"desktop.useprintercontainer","text":"

The desktop.useprintercontainer is boolean, to use printer cupsd service as an separated container. This value is only available in kubernetes mode. The default value is False.

"},{"location":"2.0/config/desktop/#desktopsoundimage","title":"desktop.soundimage","text":"

The desktop.soundimage is the name of the sound container image The default value is abcdesktopio/oc.pulseaudio.18.04

"},{"location":"2.0/config/desktop/#desktopusesoundcontainer","title":"desktop.usesoundcontainer","text":"

The desktop.usesoundcontainer is boolean, to use pulseaudio service as a separated container. This value is only available in kubernetes mode. The default value is False.

"},{"location":"2.0/config/desktop/#desktopuseinitcontainer","title":"desktop.useinitcontainer","text":"

The desktop.useinitcontainer is boolean, to use init container. The default value is False. The code call the desktop.initcontainercommand list .

The initcontainerimage is a busybox shell, for example to make sure that the home directory belongs to user balloon.

/home/balloon must belong to balloon default user and balloon default group.

"},{"location":"2.0/config/desktop/#desktopinitcontainercommand","title":"desktop.initcontainercommand","text":"

The desktop.initcontainercommand runs the command at init container. The default value is None, the default type is list.

desktop.initcontainercommand example :

desktop.initcontainercommand : [ 'sh', '-c', 'chown 4096:4096 /home/balloon' ]\n

This option is used when presistent volume data mount a nfs storage. The uid and gid of /home/balloon must be set to the default value of (balloon:balloon) (4096:4096).

"},{"location":"2.0/config/desktop/#desktopinitcontainerimage","title":"desktop.initcontainerimage","text":"

The desktop.initcontainerimage is the name of the init container image. The default value is busybox.

"},{"location":"2.0/config/desktop/#desktopenvlocal","title":"desktop.envlocal","text":"

desktop.envlocal is a dictionary. desktop.envlocal contains a (key,value) added as environment variables to oc.user.

The default value is :

{ \n        'DISPLAY': ':0.0', \n        'USER': 'balloon', \n        'LIBOVERLAY_SCROLLBAR': '0',\n        'WINEARCH': 'win32',\n        'UBUNTU_MENUPROXY': '0',\n        'HOME': '/home/balloon',\n        'LOGNAME': 'balloon',\n        'PULSE_SERVER: '/tmp/.pulse.sock', \n        'CUPS_SERVER': '/tmp/.cups.sock' \n}\n

Add 'CUPS_SERVER: '/tmp/.cups.sock' only if desktop.useprintercontainer is True. Add 'PULSE_SERVER: '/tmp/.pulse.sock' only if desktop.usesoundcontainer is True.

"},{"location":"2.0/config/desktop/#desktopnodeselector","title":"desktop.nodeselector","text":"

desktop.nodeselector is a dictionary. This option permits to assign user pods to nodes. It specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). The most common usage is one key-value pair.

{ 'disktype': 'ssd' }\n
"},{"location":"2.0/config/desktop/#desktopusername","title":"desktop.username","text":"

desktop.username describes the balloon user created inside the oc.user container. The type of desktop.username is string. The default value is 'balloon'.

If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n

Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

"},{"location":"2.0/config/desktop/#desktopuserid","title":"desktop.userid","text":"

desktop.userid describes the uid of the user created inside the oc.user container. The type of desktop.userid is integer. The default value is 4096.

If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

ENV BUSER balloon\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n

Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

"},{"location":"2.0/config/desktop/#desktopgroupid","title":"desktop.groupid","text":"

desktop.groupid describes the gid of the user created inside the oc.user container. The type of desktop.userid is integer. The default value is 4096.

If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

RUN groupadd --gid 4096 $BUSER\n

Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

"},{"location":"2.0/config/desktop/#desktopuserhomedirectory","title":"desktop.userhomedirectory","text":"

desktop.userhomedirectory describes the homedirectory of the user created inside the oc.user container. The type of desktop.userhomedirectory is string. The default value is /home/balloon.

If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n

Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

"},{"location":"2.0/config/desktop/#desktopuselocaltime","title":"desktop.uselocaltime","text":"

The desktop.uselocaltime is boolean, to use host value of /etc/localtime. The default value is False. If desktop.uselocaltime is True, this add a volume mapping from host file /etc/localtime to container file /etc/localtime.

"},{"location":"2.0/config/desktop/#desktoppolicies","title":"desktop.policies","text":"

The desktop.policies is a dictionary.

Entry Description max_app_counter limit applications counter, without checking the docker container status rules rules dictionary 'rules': { 'volumes': { 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } }acl allow or denied desktop creation

Example

desktop.policies: { 'rules':\n    { 'volumes': \n        { 'domainuser':  \n            { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' },\n            'Mygroupteam':  { 'type': 'cifs', 'name': 'toto', 'unc': '//192.168.7.101/team', 'volumename': 'team' } \n            } \n        },\n      'acls' : {},\n      'max_app_counter' : 4  }\n
"},{"location":"2.0/config/desktop/#desktopapplication_config","title":"desktop.application_config","text":"

Default application host_config dictionary, maps the dictionary as arguments from docker API create_host_config

Define how the application can be run, read host_config description page to get more informations

"},{"location":"2.0/config/desktop/#desktophost_config","title":"desktop.host_config","text":"

Default desktop oc.user host_config dictionary, maps the dictionary as arguments from docker API create_host_config

Define how the oc.user container can be run, read host_config description page to get more informations

"},{"location":"2.0/config/desktop/#desktopwebhookdict","title":"desktop.webhookdict","text":"

desktop.webhookdict is a dictionary to add key/value to the command create and destroy in rules objects.

"},{"location":"2.0/config/desktop/#experimental-features","title":"Experimental features","text":""},{"location":"2.0/config/desktop/#desktopdesktopuseinternalfqdn","title":"desktop.desktopuseinternalfqdn","text":"

WARNING desktop.desktopuseinternalfqdn is an experimental feature, keep this value to False in production

desktop.desktopuseinternalfqdn describes the content of the payload data in the JWT Desktop Token. The default value is False.

Nginx front end act as a reverse proxy. This reverse proxy use the FQDN of the user's pod to route http request. If this value is set to False the payload data in the JWT Desktop Token contains the IP Address of the user Pod. If this value is set to True the payload data in the JWT Desktop Token contains the FQDN of the user Pod.

If you CAN NOT add endpoint_pod_names in the coredns configuration, you MUST set desktop.desktopuseinternalfqdn to False. This choice is less secure.

To set desktop.desktopuseinternalfqdn to True value, you have to update the coredns ConfigMap.

kind: ConfigMap\napiVersion: v1\nmetadata:\n  name: coredns\n  namespace: kube-system\ndata:\n  Corefile: |\n    .:53 {\n        log\n        errors\n        health\n        ready\n        kubernetes cluster.local in-addr.arpa ip6.arpa {\n           endpoint_pod_names\n           pods insecure\n           fallthrough in-addr.arpa ip6.arpa\n           transfer to * \n           ttl 30\n        }\n        prometheus :9153\n        forward . /etc/resolv.conf\n        cache 30\n        loop\n        reload\n        loadbalance\n    }\n
"},{"location":"2.0/config/editconfig/","title":"How to edit pyos core service configuration file","text":"

The pyos core service configuration file name is od.config

"},{"location":"2.0/config/editconfig/#edit-your-configuration-file","title":"Edit your configuration file","text":"

If the od.config file does not exist, download the default od.config file and save it as od.config to your abcdesktop local directory.

To make change, edit your own od.config file

vim od.config \n
"},{"location":"2.0/config/editconfig/#make-changes","title":"Make changes","text":"

Change the defaultbackgroundcolors option in the desktop options.

Locate the line desktop.defaultbackgroundcolors and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'

desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF',  '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n

Save your local file od.config.

"},{"location":"2.0/config/editconfig/#apply-changes","title":"Apply changes","text":"

To apply changes, you can replace the abcdesktop-config

kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

Or you can also use the replace command kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run | kubectl replace -n abcdesktop -f -

"},{"location":"2.0/config/editconfig/#restart-pyos-pods","title":"Restart pyos pods","text":"
kubectl delete pods -l run=pyos-od -n abcdesktop\npod \"pyos-od-6fc597d444-qgzhc\" deleted\n
"},{"location":"2.0/config/editconfig/#check-your-changes","title":"Check your changes","text":"

To check that the new colours are presents in front, open the url http://localhost:30443, in your web browser, to start a simple abcdesktop.io container.

http://localhost:30443\n

You should see the abcdesktop.io home page.

Press the Sign-in Anonymously, have look

At the right top corner, click on the menu and choose Settings, then click on Screen Colors

Choose your colour and you should have it as background colour :

Great, you can easily update your configuration file od.config.

"},{"location":"2.0/config/frontjs/","title":"dock configuration in od.config","text":""},{"location":"2.0/config/frontjs/#menu-setting","title":"Menu Setting","text":"

The menu can be changed using the dictionnary object menuconfig

menuconfig : {\n    'settings'  : True, \n    'appstore'  : True, \n    'screenshot'    : True, \n    'download'  : True, \n    'logout'        : True, \n    'disconnect'    : True \n}\n
"},{"location":"2.0/config/frontjs/#default-dock-config","title":"default dock config","text":"

The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock option is a dictionnary read by the front web as a json object.

docker entry Descriptions filemanager FileManager application terminal Terminal application webshell HTML 5, terminal application based on xterm.js webshorcut Web browser url launch inside the container
dock : {       \n    'filemanager':  {       'args': None,\n                            'showinview': u'dock',\n                            'name': u'FileManager',\n                            'keyword': u'files,file manager',\n                            'launch': u'nautilus.Nautilus',\n                            'displayname': u'FileManager',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,office',\n                            'id': u'filemanager.d',\n                            'icon': u'pantheon-files-icons.svg' },\n    'terminal':     {       'args': '',\n                            'name': u'TerminalBuiltin',\n                            'keyword': u'terminal,shell,bash,builtin,pantheon',\n                            'launch': u'qterminal.qterminal',\n                            'displayname': u'Terminal Builtin',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,development',\n                            'id': u'terminalbuiltin.d',\n                            'hideindock': True,\n                            'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n    'webshell':     {       'name': u'WebShell',\n                            'keyword': u'terminal,shell,webshell,bash',\n                            'launch': u'frontendjs.webshell',\n                            'displayname': u'Web Shell',\n                            'execmode': u'frontendjs',\n                            'cat': u'utilities,development',\n                            'id': u'webshell.d',\n                            'icon': u'webshell.svg' }\n}\n
"},{"location":"2.0/config/frontjs/#additional-applications","title":"Additional applications","text":"

This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' } add

'webshortcut':  {   'name': u'xlogo',\n                    'showinview': u'dock',\n                    'keyword': u'xlogo',\n                    'execmode': u'builtin',\n                    'launch': u'/usr/bin/xlogo',\n                    'displayname': u'xlogo',\n                    'execmode': u'builtin',\n                    'cat': u'utilities',\n                    'id': u'xlogo.d',\n                    'icon': u'xlogo.svg',\n                    'hideindock': False,\n                    'args': '' \n}\n
"},{"location":"2.0/config/host_config/","title":"host_config resource description","text":"

host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

The same host_config format is reused in a multiple configuration files. host_config is present in applist.json file to build application image, and in od.config to set default running values in desktop and in application.

For example you can set low cpu and memory values to an application like the great X11 xeyes.

{   \n    \"mem_limit\":  \"32M\", \n    \"shm_size\":   \"OM\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n
"},{"location":"2.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period int The length of a CPU period in microseconds. cpu_quota int Microseconds of CPU time that the container can get in a CPU period. cpu_shares int CPU shares relative weight. cpuset_cpus str CPUs in which to allow execution 0 3 0 1 . cpuset_mems str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules list A list of cgroup rules to apply to the container. device_read_bps bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops IO per second Limit read rate from a device. device_write_bps bytes per second Limit write rate from a device. device_write_iops IO per second Limit write rate from a device. devices list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode str Set the IPC mode for the container. mem_limit float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation float or str Memory soft limit mem_swappiness int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable bool Whether to disable OOM killer. oom_score_adj int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size str or int Size of /dev/shm e.g. 1G. cap_add list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}for example to permit the call ptrace: SYS_PTRACE, trace arbitrary processes using ptrace, and SYS_ADMIN, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop list of str Drop kernel capabilities. dns list Set custom DNS servers. dns_opt list Additional options to be added to the container\u2019s resolv.conf file dns_search list DNS search domains. extra_hosts dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add list List of additional group names and/or IDs that the container process will run as. isolation str Isolation technology to use. Default: None. pid_mode str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged bool Give extended privileges to this container. security_opt list A list of string values to customize labels for MLS systems such as SELinux. storage_opt dict Storage driver options per container as a key value mapping. sysctls dict Kernel parameters to set in the container. ulimits list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode str Sets the UTS namespace mode for the container. Supported values are: host runtime str Runtime to use with this container. network_mode str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"2.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"2.0/config/host_config/#auto_remove","title":"auto_remove","text":"

The auto_remove is use to remove or not remove an abcdesktop container application or desktop.

For example, when an application container is exited, do we need to remove the container, by running the docker rm command ?

By default the auto_remove is True. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False. Set this value to False only to troubleshoot an application.

In production this value MUST be set to True

"},{"location":"2.0/config/host_config/#cpu_period-cpu_quota","title":"cpu_periodcpu_quota","text":"

cpu_period Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.

cpu-quota impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.

"},{"location":"2.0/config/host_config/#privileged","title":"privileged","text":"

The privileged option runs a user container in privileged mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.

"},{"location":"2.0/config/host_config/#ipc_mode","title":"ipc_mode","text":"

The ipc_mode value is a string, the default value is 'shareable'. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.

value description '' Use daemon default. 'none' Own private IPC namespace. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system IPC namespace.

If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"2.0/config/host_config/#security_opt","title":"security_opt","text":"

The securityopt option allow to set the security_opt default value for a docker application container. security_opt is the docker parameter.

Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.

Syscall Description acct Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT. add_key Prevent containers from using the kernel keyring, which is not namespaced. bpf Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN. clock_adjtime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clock_settime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clone Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN for CLONE_* flags, except CLONE_USERNS. create_module Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE. delete_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. finit_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. get_kernel_syms Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. init_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. ioperm Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. iopl Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. kcmp Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. kexec_file_load Sister syscall of kexec_load that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT. kexec_load Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT. keyctl Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN. mbind Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. mount Deny mounting, already gated by CAP_SYS_ADMIN. move_pages Syscall that modifies kernel memory and NUMA settings. name_to_handle_at Sister syscall to open_by_handle_at. Already gated by CAP_DAC_READ_SEARCH. nfsservctl Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH. perf_event_open Tracing/profiling syscall, which could leak a lot of information on the host. personality Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root Deny pivot_root, should be privileged operation. process_vm_readv Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. process_vm_writev Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. ptrace Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE, because it could leak a lot of information on the host. query_module Deny manipulation and functions on kernel modules. Obsolete. quotactl Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN. reboot Don't let containers reboot the host. Also gated by CAP_SYS_BOOT. request_key Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. setns Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN. settimeofday Time/date is not namespaced. Also gated by CAP_SYS_TIME. stime Time/date is not namespaced. Also gated by CAP_SYS_TIME. swapon Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. swapoff Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. sysfs Obsolete syscall. _sysctl Obsolete, replaced by /proc/sys. umount Should be a privileged operation. Also gated by CAP_SYS_ADMIN. umount2 Should be a privileged operation. Also gated by CAP_SYS_ADMIN. unshare Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN, with the exception of unshare --user. uselib Older syscall related to shared libraries, unused for a long time. userfaultfd Userspace page fault handling, largely needed for process migration. ustat Obsolete syscall. vm86 In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN. vm86old In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN.

Read security_opt from the docker website.

"},{"location":"2.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilities cap_addcap_drop","text":"

This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :

securityContext:\n      capabilities:\n        desktop.capabilities\n

For example

    { \n        'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n    }\n

Permit a container to call ptrace:

Read the docker run command informations Docker run reference

By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.

Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.

Further reference information is available on the capabilities(7) - Linux man page

Set this value only to troubleshoot an application.

In production this value MUST be set to an empty dict {}

"},{"location":"2.0/config/jira/","title":"JIRA configuration","text":"

abcdesktop.io support JIRA

"},{"location":"2.0/config/jira/#jira-option","title":"JIRA option","text":"

In od.config add the jira option. jira option is a dictionary with the entries :

entry sample value \u00a0\u00a0 url https://domainexample.atlassian.net/ project_id ABCD username account@domain.local apikey XXXXXXXXXXXXXXXXXXXX

And fill the dictionary

jira : { \n            'url':          'https://domainexample.atlassian.net/',\n            'project_id':   'ABCD',\n            'username':     'account@domain.local',\n            'apikey' :      'XXXXXXXXXXXXXXXXXXXX' }\n

Then apply the new configuration file od.config by retrasting the daemon.

When jira option is set, a new icon issue appears at the top.

Click on the issue icon, a new window is appear.

Fill Summary and Your Report values

Then press the Send button. A notification message appears on the left top corner.

Log into your jira server, and check your backlog

Great you added a new issue tracking.

"},{"location":"2.0/config/language/","title":"Language entry in od.config","text":"

The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US

"},{"location":"2.0/config/language/#language-in-abcdesktopio-ocuser","title":"Language in abcdesktop.io oc.user","text":"

The language list must match with the oc.user local packages all ready installed.

If the language is not found, the default value is set to en_US

The oc.user.18.04 is built-in with the default language package :

apt-get install -y \\\n    language-pack-en \\\n    language-pack-fr \\\n    && locale-gen    \\\n    && apt-get clean\n

The full supported language list is set by default

language : [  'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n

This list must match with the Accept-Language request HTTP header.

"},{"location":"2.0/config/language/#language-in-abcdesktopio-applications","title":"Language in abcdesktop.io Applications","text":"

abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language request HTTP header. If the language is not found, the default value is set to en_US.

Hands-on:

Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.

"},{"location":"2.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language to en_US :","text":"

The launch LibreOffice Writer. The menu is set to en_US LibreOffice Writer use English/US en_US language.

"},{"location":"2.0/config/language/#set-the-web-browsers-default-language-to-fr_fr","title":"Set the web browser's default language to fr_FR :","text":"

You can keep the same abcdesktop.io users session, you do not need to logout.

The launch LibreOffice Writer. The menu is set to fr_FR LibreOffice Writer use French fr_FRlanguage.

Great you have change the language settings of applications running inside an abcdesktop docker container

"},{"location":"2.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"2.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"

By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.

Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:

sudo vi /etc/rsyslog.conf\n

Uncomment the following lines and save file :

module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n

"},{"location":"2.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"

Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:

sudo systemctl restart rsyslog\n

"},{"location":"2.0/config/logging/","title":"Logging configuration in od.config","text":"

The logging configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.

logging dict use the python logging module logging module

The syslog and graylog protocol messaging are supported too.

The default features for each handlers are :

handler Features console log message using a logging.StreamHandler to the stream: ext://sys.stdout formated as standard cherrypy_console log message using a logging.StreamHandler to the stream: ext://sys.stdout formatted as access cherrypy_access log message using a logging.StreamHandler to the file stream logs/access.log formatted as access cherrypy_trace log message using a logging.StreamHandler to the stream: logs/trace.log formatted as standard

Sub modules used by od.py can log information too.

Sub module Default Values docker.utils.config{ 'level': 'INFO' },urllib3.connectionpool{ 'level': 'ERROR'},

The logging sample configuration :

#              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
"},{"location":"2.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"2.0/config/stack/#stackmode","title":"stack.mode","text":"

stack.mode describes how abcdesktop.io can manage user's containers and application.

stack.mode Description standalone Use a dockerd only, this is for personal usage kubernetes Use a kubernetes services"},{"location":"2.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"

stack.kubernetesdefaultdomain is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes.

The default value is abcdesktop.svc.cluster.local

If option value mongodb or memcached are set, the values are NOT overridden, and keep unchanged.

If option value mongodb or memcached are set to None (by default), then stack.kubernetesdefaultdomain is used to complete the FQDN of mongodb and memcached servers name. This value is concatenated to the server hostname.

Hostname FQDN mongodbmongodb.abcdesktop.svc.cluster.localmemcachedmemcached.abcdesktop.svc.cluster.local

The dns resolution need a running core-dnsis the namespace kube-system

stack.kubernetesdefaultdomain is used also if desktop.desktopuseinternalfqdn: True

The pod name FQDN is built using the $podid.desktop.$stack.kubernetesdefaultdomain

For example, by default :

c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local

"},{"location":"2.0/config/syslog/","title":"Syslog configuration in od.config","text":""},{"location":"2.0/config/syslog/#add-syslog-server-support","title":"Add syslog server support","text":"
   'filters': [ 'odcontext' ],\n

syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.

syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.

"},{"location":"2.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"

Those running linux can simply modify their syslog configuration file following linux syslog config steps

For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :

docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
[2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
"},{"location":"2.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"

To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)

"},{"location":"2.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"

In handlers entry add the following lines:

        ,\n        'syslog': {\n          'class': 'logging.handlers.SysLogHandler',\n          'filters': [ 'odcontext' ],\n          'formatter': 'syslog',\n          'socktype': 2,\n          'address' : [ '192.168.0.52', 514 ]\n        }\n

Replace 192.168.0.52 ip address by your local IP Addresse.

You can get your local IP address using the following command:

hostname -I | cut -d ' ' -f1\n
"},{"location":"2.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"

In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog' handler in handlers list:

        '': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'INFO'\n        }\n\n       'cherrypy.error': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'ERROR',\n          'propagate': False\n        }\n
"},{"location":"2.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"
#              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    },\n    'syslog': {\n       'class': 'logging.handlers.SysLogHandler',\n       'filters': [ 'odcontext' ],\n       'formatter': 'syslog',\n       'socktype': 2,\n       'address' : [ '192.168.0.52', 514 ]\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
"},{"location":"2.0/config/syslog/#restart-pods","title":"Restart Pods","text":"

To restart Pods, we will delete and recreate all pods

"},{"location":"2.0/config/syslog/#delete-pods","title":"Delete pods","text":"

To delete pods, execute the following command:

kubectl delete -f abcdesktop.yaml\n
"},{"location":"2.0/config/syslog/#create-pods","title":"Create pods","text":"

To create pods, execute the following command:

kubectl create -f abcdesktop.yaml\n
"},{"location":"2.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"

At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:

tail /var/log/syslog\n

If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.

"},{"location":"2.0/config/webrtc/","title":"Sound server configuration","text":"

By default abcdesktop use the module-http-protocol-tcp from pulseaudio sound server to send wav data to the web browser

"},{"location":"2.0/config/webrtc/#pulseaudio-http-stream-by-default","title":"pulseaudio http stream (by default)","text":"

By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)

In terminal webshell run the command :

pactl -s /tmp/.pulse.sock list short modules\n
balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
"},{"location":"2.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"

To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)

abcdesktop update the pulseaudio configuration, and add module-rtp-send. The module-rtp-send pusleaudio send to the destination_ip (in this example 1.2.3.4)

pactl -s /tmp/.pulse.sock list short modules\n
balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0       module-augment-properties\n1       module-null-sink        sink_name=rtp  format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2       module-native-protocol-unix     auth-group=balloon socket=/tmp/.pulse.sock\n3       module-always-sink\n4       module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n

The sink_name is rtp, and the source for the module-rtp-send is rtp.monitor.

The default source is rtp.monitor

Source #\n        State: RUNNING\n        Name: rtp.monitor\n        Description: Monitor of RTP Multicast Sink\n        Driver: module-null-sink.c\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Owner Module: 5\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Base Volume: 65536 / 100% / 0.00 dB\n        Monitor of Sink: rtp\n        Latency: 0 usec, configured 160000 usec\n        Flags: DECIBEL_VOLUME LATENCY \n        Properties:\n                device.description = \"Monitor of RTP Multicast Sink\"\n                device.class = \"monitor\"\n                device.icon_name = \"audio-input-microphone\"\n        Formats:\n                pcm\n

The default output is

\nSource Output #0\n        Driver: module-rtp-send.c\n        Owner Module: 9\n        Client: n/a\n        Source: 4\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n        Corked: no\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Buffer Latency: 0 usec\n        Source Latency: 0 usec\n        Resample method: n/a\n        Properties:\n                media.name = \"RTP Monitor Stream\"\n                rtp.source = \"0.0.0.0\"\n                rtp.destination = \"1.2.3.4\"\n                rtp.mtu = \"1280\"\n                rtp.port = \"5119\"\n                rtp.ttl = \"1\"\n

By default, the format is pcm

Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n

To change the default format update the values in od.config file.

 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n

To get the 'audiopt' and 'audiortpmap' values, read the web pages

"},{"location":"2.0/config/webrtc/#requirements","title":"Requirements","text":""},{"location":"2.0/config/webrtc/#install-a-janus-server","title":"Install a janus server","text":""},{"location":"2.0/config/webrtc/#install-janus","title":"Install janus","text":"

Install a janus service from meetecho.com on a server

apt-get install janus\n
"},{"location":"2.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"

Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.

certificates: {\n    cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n    cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n    cert_pwd = \"secretpassphrase\"\n}\n
"},{"location":"2.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"

Update the od.config file, for example :

# WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
"},{"location":"2.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"

webrtc.enable is a boolean. The default value is False. Set this value to True to enable webrtc services for pulseaudio.

"},{"location":"2.0/config/webrtc/#webrtcserver","title":"webrtc.server","text":"

webrtc.server is a dict. The default value is None. Set all dictionnary values to enable webrtc access for pulseaudio and for the web browser client.

The hostip value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.

'hostip': '1.2.3.4'\n

The host value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn. This fqdn is used by the web browser.

webrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
"},{"location":"2.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"2.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"

The http request path is /API/manager

Path Params Response type /API/manager/buildapplist None Json object /API/manager/updateactivedirectorysite None Json object /API/manager/garbagecollector expirein=, force=False Json object"},{"location":"2.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"

buildapplist ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps. abcdesktop.io

Params Type Description None None None

example :

curl http://localhost/API/manager/buildapplist\n

Return the complete array if json images objects ready to run.

{\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
"},{"location":"2.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None

example :

curl http://localhost/API/manager/updateactivedirectorysite\n
"},{"location":"2.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein integer number in seconds since the container create date time force boolean garbage the container even if a user is connected

example :

curl \"http://localhost/API/manager/garbagecollector?expirein=9473\"\ncurl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"\n
"},{"location":"3.0/features/","title":"abcdesktop release 3.0","text":"

The abcdesktop release 3.0 has started in May 2022

"},{"location":"3.0/features/#architecture-abcdesktop-30","title":"Architecture abcdesktop 3.0","text":"

In release 3.0, the abcdesktop control plane uses only Kubernetes API. It doesn't depend to dockerd.

"},{"location":"3.0/features/#auth-service","title":"Auth service","text":"

Auth service supports LDAP Posix Account

"},{"location":"3.0/features/#user-pod","title":"User pod","text":""},{"location":"3.0/features/#applications","title":"Applications","text":"

Application can run as :

"},{"location":"3.0/features/#volumes","title":"Volumes","text":""},{"location":"3.0/features/#users-home-directories","title":"User's home directories","text":"

Define volumes to retain user's home directory files. User's home directory can be mounted as hostPath on each worker node or as persistentVolumeClaim. Get more informations about the persistentVolume and persistentVolumeClaim to retain user datas.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/","title":"application runtime Ephemeral container and Pod","text":"

An abcdesktop application can run as a kubernetes ephemeral container or as a pod.

An ephemeral container can access to share memory shm with the X11 server. An ephemeral container run always on the same node as the user pod, where the graphical container 'X11 server' is running. An ephemeral container does not prevent cpu and memory resource limits.

A pod can't access to share memory with the X11 server. An kubernetes pod can run on separated node from the user's pod node. For a pod, you can specify resource limits.

To describe the difference between ephemeral-container and pod-application, we use the game 2048, one instance come from alpine based on gtk, the second one come from ubuntu based on qt

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#requirements","title":"Requirements","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#start-a-shell-to-your-abcdesktop-server","title":"Start a shell to your abcdesktop server","text":"

Get a shell to your abcdestkop server.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#download-2048-alpine-and-2048-ubuntu-json-files","title":"Download 2048-alpine and 2048-ubuntu json files","text":"

Open a shell to your abcdesktop server

curl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl --output 2048-ubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d.3.0.json\n

Check that the json files are downloaded

$ ls -la *.json\n-rw-r--r-- 1 root root 29183 Dec 28 16:24 2048-alpine.d.3.0.json\n-rw-r--r-- 1 root root 29099 Dec 28 16:24 2048-ubuntu.d.3.0.json\n

Look at the label oc.containerengine for each json file

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#read-the-label-occontainerengine-for-2048-alpine","title":"Read the label oc.containerengine for 2048-alpine","text":"
cat 2048-alpine.d.3.0.json | jq -r '.[0].Config.Labels.\"oc.containerengine\"'\n

The response is ephemeral_container

ephemeral_container\n

This application 2048-alpine will start as an ephemeral_container

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#read-the-label-occontainerengine-for-2048-alpine_1","title":"Read the label oc.containerengine for 2048-alpine","text":"
cat 2048-ubuntu.d.3.0.json | jq -r '.[0].Config.Labels.\"oc.containerengine\"'\n

The response is pod_application

pod_application\n

This application 2048-ubuntu will start as a pod_application, it's a pod.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#put-2048-alpine-and-2048-ubuntu-applications-to-your-abcdesktop-service","title":"PUT 2048-alpine and 2048-ubuntu applications to your abcdesktop service","text":"
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-ubuntu.d.3.0.json\n

Each curl command returns a complete json document.

Wait for the pull pod are Ready

kubectl wait --for=condition=Ready pods --selector=type=pod_application --timeout=-1s -n abcdesktop\n

Wait for condition met

pod/pull-2048-alpine-install-4280c633e777dceb3f529f208b442c0dff891 condition met\npod/pull-2048-ubuntu-install-ee652f4ff381655768bcc09d54a9b62ab7684 condition met\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

Using a web browser, open the abcdesktop service url. If your are running abcdesktop on your local device, the url should be :

http://localhost:30443\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#choose-to-login-as-hermes","title":"Choose to login as hermes","text":"

Login in as the user Hermes Conrad

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#your-desktop-is-created","title":"Your desktop is created","text":"

Your desktop is created. By default your dock is empty.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#look-for-2048","title":"Look for 2048","text":"

In the search text area, write the keyword 2048

The two applications appear in the search result applications area.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#start-each-2048-application","title":"Start each 2048 application","text":"

Start 2048-ubuntu and 2048-alpine application

2048-ubuntu and 2048-alpine applications start. The application 2048-alpine can start quickly than the application 2048-ubuntu.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#lets-have-a-look-on-your-server-side","title":"Let's have a look on your server side","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#get-pod-application","title":"Get pod application","text":"

Get the running pod using kubectl get pods -n abcdesktop

kubectl get pods -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nhermes-app-2048-ubuntu-4dd6f    1/1     Running   0          8s\nhermes-db906                    4/4     Running   0          100s\nmemcached-od-57c57c4f9d-92fs2   1/1     Running   0          38m\nmongodb-od-f69ff6b5b-v6ztc      1/1     Running   0          38m\nnginx-od-58f86c4dc8-8n9lf       1/1     Running   0          25m\nopenldap-od-d66d66bf4-84lg8     1/1     Running   0          38m\npyos-od-5586b88767-gsdl8        1/1     Running   0          14m\nspeedtest-od-6c59bdff75-n6s66   1/1     Running   0          38m\n

The application 2048-ubuntu is listed as a pod. The application 2048-ubuntu is a pod. The prefix is the $userid-app for example hermes-app-2048-ubuntu-4dd6f, followed by the application name 2048-ubuntu and a uuid.

The application 2048-alpine is not a pod.

The application 2048-alpine is listed as an ephemeral container, inside the user pod hermes-db906

kubectl get pods hermes-db906  -o json -n abcdesktop | jq -r \".status.ephemeralContainerStatuses\"\n

The application 2048-alpine.d is listed in the .status.ephemeralContainerStatuses

[\n  {\n    \"containerID\": \"containerd://eb5c1c4c19e5581dfd6a7290f46b63ce073b318bc1f9980bd3e37153cb66e44b\",\n    \"image\": \"docker.io/abcdesktopio/2048-alpine.d:3.0\",\n    \"imageID\": \"docker.io/abcdesktopio/2048-alpine.d@sha256:2c3c46c22689b8f91cbd5ebd4d5f80c95bc5ba9b1e23f13aebb54121d2f6d590\",\n    \"lastState\": {},\n    \"name\": \"hermes-conrad-2048-alpine-1eef4\",\n    \"ready\": false,\n    \"restartCount\": 0,\n    \"state\": {\n      \"terminated\": {\n        \"containerID\": \"containerd://eb5c1c4c19e5581dfd6a7290f46b63ce073b318bc1f9980bd3e37153cb66e44b\",\n        \"exitCode\": 0,\n        \"finishedAt\": \"2023-05-17T14:38:13Z\",\n        \"reason\": \"Completed\",\n        \"startedAt\": \"2023-05-17T14:37:00Z\"\n      }\n    }\n  }\n]\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#ephemeral-container-versus-pod-application","title":"Ephemeral container versus Pod application","text":"

An ephemeral container can access to share memory shm with the X11 server. An ephemeral container run always on the same node as the X11 server.

A pod can't access to share memory with the X11 server. An Kubernetes pod can run on a separated node from the X11 server.

If your application need to share memory with X11 server, when you have to set the oc.containerengine label to ephemeral_container.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#compare-kubernetes-ephemeral-container-and-pod","title":"Compare kubernetes ephemeral container and pod","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#kubernetes-ephemeral-container","title":"Kubernetes ephemeral container","text":"

Use an ephemeral container to start an application have some advantages and some disadvantages.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#advantages","title":"advantages","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#disadvantages","title":"disadvantages","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#kubernetes-pod","title":"Kubernetes Pod","text":"

Use a kubernetes pod to start an application have some advantages and some disadvantages.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#advantages_1","title":"advantages","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#disadvantages_1","title":"disadvantages","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting","title":"Troubleshooting","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting-badshmseg-error","title":"Troubleshooting BadShmSeg error","text":"

If you configure 2048-alpine with gtk to start as a pod and not as an ephemeral container, you will get the BadShmSeg error

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#install-the-application-2048-alpine-with-error","title":"Install the application 2048-alpine-with-error","text":"
curl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-with-error.d.3.0.json\n2048-alpine-with-error.d.3.0.json\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#put-2048-alpine-with-error-applications-to-your-abcdesktop-service","title":"PUT 2048-alpine-with-error applications to your abcdesktop service","text":"
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine-with-error.d.3.0.json\n

Wait for the pulled pod are Ready

kubectl wait --for=condition=Ready pods --selector=type=pod_application_pull --timeout=-1s -n abcdesktop\n

Wait for condition met

pod/pull-2048-alpine-with-error-install-935509a58088531ae57756 condition met\n

Login to your abcdesktop service

Using a web browser, open the abcdesktop service url. If your are running abcdesktop on your local device, the url should be :

http://localhost:30443\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#choose-to-login-as-hermes_1","title":"Choose to login as hermes","text":"

Login in as the user Hermes Conrad

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#your-desktop-is-created_1","title":"Your desktop is created","text":"

Your desktop is created. By default your dock is empty.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#look-for-2048_1","title":"Look for 2048","text":"

In the search text area, write the keyword 2048

The three applications appear in the search result applications area.

Start the 2048 (alpine gtk with error) application. It uses shared segment with X Window System, it must run as an ephemeral container, but as a pod it fails. The application starts but exit after few seconds, the content of the application does not appear.

In the abcdesktop menu, choose Settings |\u00a0Tasks.

Then select the Logs button. The error was 'BadShmSeg (invalid shared segment parameter)'.

(org.gnome.TwentyFortyEight:36): Gdk-WARNING **: 10:14:26.185: The program 'org.gnome.TwentyFortyEight' received an X Window System error.\nThis probably reflects a bug in the program.\nThe error was 'BadShmSeg (invalid shared segment parameter)'.\n(Details: serial 820 error_code 128 request_code 131 (MIT-SHM) minor_code 3)\n(Note to programmers: normally, X errors are reported asynchronously;\nthat is, you will receive the error a while after causing it.\nTo debug your program, run it with the GDK_SYNCHRONIZE environment\nvariable to change this behavior. You can then get a meaningful\nbacktrace from your debugger if you break on the gdk_x_error() function.)\n

If you are running QT application, you can disable the X11 MIT Shared Memory Extension support. The MIT-SHM is an extension to the X server which allows faster transactions by using shared memory. Container isolation blocks it. Qt applications can be forced not to use the extension, by setting the variable QT_X11_NO_MITSHM value to 1.

QT_X11_NO_MITSHM=1 \n

Note your can also use QT_XCB_NO_MITSHM value to 1

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting-chromium-application","title":"Troubleshooting chromium application","text":"

For chromium application disabled shm-usage with the parameters --disable-dev-shm-usage

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting-cannot-open-display-or-could-not-connect-to-display-error","title":"Troubleshooting cannot open display or could not connect to display error","text":"

When you start an application the log file write cannot open display error

kubectl logs hermes-app-2048-ubuntu-c7360cd025d04813ad5e0af74b6df4ba  -n abcdesktop \n
qt.qpa.xcb: could not connect to display 172.17.0.10:0\nqt.qpa.plugin: Could not load the Qt platform plugin \"xcb\" in \"\" even though it was found.\nThis application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.\n\nAvailable platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.\n

Using the web shell inside an abcdesktop session, start netstat -a command line

The result should show that the process Xvnc is listening on tcp port number 6000

hermes:~$ netstat  -anp\nActive Internet connections (servers and established)\nProto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    \ntcp        0      0 0.0.0.0:6000            0.0.0.0:*               LISTEN      82/Xvnc               \n

If Xvnc is not listening on tcp port number 6000

Update od.config to make Xvnc listen on tcp port number 6000

Open your od.config file, and look at the desktop.envlocal option.

Add 'X11LISTEN': 'tcp' to the dictionary :

desktop.envlocal :  {   'DISPLAY'               : ':0.0',\n                        'SET_DEFAULT_WALLPAPER' : 'welcometoabcdesktop.png',\n                        'X11LISTEN'             : 'tcp' }\n

Save your local od.config file.

To apply changes, you can replace the abcdesktop-config

kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

Then restart pyos pod

kubectl delete pod -l run=pyos-od -n abcdesktop\n

You should read on stdout

pod \"pyos-od-5586b88767-mrf28\" deleted\n
"},{"location":"3.0/application/createsampleapplication/","title":"Create a sample application in release 3.0","text":""},{"location":"3.0/application/createsampleapplication/#requirements","title":"Requirements","text":""},{"location":"3.0/application/createsampleapplication/#goals","title":"Goals","text":""},{"location":"3.0/application/createsampleapplication/#git-clone-application-repository","title":"git clone application repository","text":"

The abcdesktop application repository is https://github.com/abcdesktopio/oc.apps

git clone https://github.com/abcdesktopio/oc.apps.git\ncd oc.apps\n

And install nodejs packages for oc.apps

npm install\n
"},{"location":"3.0/application/createsampleapplication/#create-a-samplejson-file","title":"Create a sample.json file","text":"

abcdesktop uses a json file description to build an application.

Create a sample.json file

{\n  \"tag\": \"3.0\",\n  \"acl\": { \"permit\": [ \"all\" ] },\n  \"cat\": \"development\",\n  \"icon\": \"small.svg\",\n  \"apkpackage\": \"xterm\",\n  \"keyword\": \"xterm,shell,cmd\",\n  \"launch\": \"xterm.XTerm\",\n  \"name\": \"Xterm\",\n  \"path\": \"/usr/bin/xterm\",\n  \"rules\": { \"homedir\": { \"default\": true } },\n  \"template\": \"abcdesktopio/oc.template.alpine.minimal\"\n}\n
"},{"location":"3.0/application/createsampleapplication/#make-a-dockerfile-from-the-samplejson-file","title":"make a Dockerfile from the sample.json file","text":"

make.js is a command line for abcdesktop. make.js read a json file and create a Dockerfile

The make.js options are :

npm i argparse npm notice created a lockfile as package-lock.json. You should commit this file. + argparse@2.0.1 added 1 package and audited 1 package in 0.837s found 0 vulnerabilities

node make.js -r 3.0 -d True  -f sample.json\n

Your read on stdout.

Namespace(dockerfile='True', release='3.0', applicationfile='sample.json')\nBuilding image for release=3.0\nRead database json file=sample.json\nOnly one file option to force output to dockerfile=True\nopening file sample.json\napplist.json entries: 1\n{ tag: '3.0',\n  acl: { permit: [ 'all' ] },\n  cat: 'development',\n  icon: 'small.svg',\n  apkpackage: 'xterm',\n  keyword: 'xterm,shell,cmd',\n  launch: 'xterm.XTerm',\n  name: 'Xterm',\n  path: '/usr/bin/xterm',\n  rules: { homedir: { default: true } },\n  template: 'abcdesktopio/oc.template.alpine.minimal' }\nBuilding xterm.XTerm\n

Read the Dockerfile

cat Dockerfile\n
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=3.0\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update xterm\nENV BUSER balloon\nLABEL oc.icon=\"small.svg\"\nLABEL oc.icondata=\"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xterm,xterm,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"xterm.XTerm\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nLABEL oc.name=\"Xterm\"\nLABEL oc.displayname=\"Xterm\"\nLABEL oc.path=\"/usr/bin/xterm\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"Xterm\"\nENV APPBIN \"/usr/bin/xterm\"\nENV APP \"/usr/bin/xterm\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nUSER balloon\nCMD [\"/composer/appli-docker-entrypoint.sh\"]\nWORKDIR /home/balloon\n
"},{"location":"3.0/application/createsampleapplication/#build-the-abcsample30-from-dockerfile","title":"build the abcsample:3.0 from Dockerfile","text":"
docker build -t abcsample:3.0 .\n
Sending build context to Docker daemon  44.21MB\nStep 1/29 : ARG TAG=3.0\nStep 2/29 : FROM abcdesktopio/oc.template.alpine.minimal:$TAG\n ---> 8528ff0674c7\nStep 3/29 : USER root\n ---> Using cache\n ---> 10372fb6f76c\nStep 4/29 : RUN apk add --no-cache --update xterm\n ---> Using cache\n ---> f222db3926f1\nStep 5/29 : LABEL oc.icon=\"small.svg\"\n ---> Running in 3303dde31f46\nRemoving intermediate container 3303dde31f46\n ---> 2cb2fac76cbd\nStep 6/29 : LABEL oc.icondata=\"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\"\n ---> Running in 65170013c043\nRemoving intermediate container 65170013c043\n ---> 52af61054ac3\nStep 7/29 : LABEL oc.keyword=\"xterm,xterm,shell,cmd\"\n ---> Running in ad13bedc4b0a\nRemoving intermediate container ad13bedc4b0a\n ---> 5bde38f46888\nStep 8/29 : LABEL oc.cat=\"development\"\n ---> Running in 238c24528439\nRemoving intermediate container 238c24528439\n ---> 886ede105940\nStep 9/29 : LABEL oc.launch=\"xterm.XTerm\"\n ---> Running in 1b2c45e68c29\nRemoving intermediate container 1b2c45e68c29\n ---> cf827822a393\nStep 10/29 : LABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\n ---> Running in 8adfa795a837\nRemoving intermediate container 8adfa795a837\n ---> 5e17811c5290\nStep 11/29 : LABEL oc.name=\"Xterm\"\n ---> Running in e2ed34859ca2\nRemoving intermediate container e2ed34859ca2\n ---> e3ed08726ea1\nStep 12/29 : LABEL oc.displayname=\"Xterm\"\n ---> Running in 636fa338c00f\nRemoving intermediate container 636fa338c00f\n ---> 0c756bf8c322\nStep 13/29 : LABEL oc.path=\"/usr/bin/xterm\"\n ---> Running in 2a7355d27588\nRemoving intermediate container 2a7355d27588\n ---> 06ae4c2fdaa7\nStep 14/29 : LABEL oc.type=app\n ---> Running in 0c6f5f1c9d07\nRemoving intermediate container 0c6f5f1c9d07\n ---> 4bd3f1462669\nStep 15/29 : LABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\n ---> Running in 1d836f666a9e\nRemoving intermediate container 1d836f666a9e\n ---> 28ed74393046\nStep 16/29 : LABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\n ---> Running in 3489fb9b8571\nRemoving intermediate container 3489fb9b8571\n ---> 902caf61d44f\nStep 17/29 : RUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi\n ---> Running in 0de74bad43c7\nRemoving intermediate container 0de74bad43c7\n ---> 720830424aeb\nStep 18/29 : RUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi\n ---> Running in 47b9a1b745e1\nRemoving intermediate container 47b9a1b745e1\n ---> 9f63628f1cb5\nStep 19/29 : ENV APPNAME \"Xterm\"\n ---> Running in d175a1ece669\nRemoving intermediate container d175a1ece669\n ---> 150c4cfe4aa3\nStep 20/29 : ENV APPBIN \"/usr/bin/xterm\"\n ---> Running in 997fee55d34e\nRemoving intermediate container 997fee55d34e\n ---> 425ac1a6e205\nStep 21/29 : ENV APP \"/usr/bin/xterm\"\n ---> Running in 53dd44a513fd\nRemoving intermediate container 53dd44a513fd\n ---> 7df215f71bec\nStep 22/29 : USER root\n ---> Running in 003691cdc4f2\nRemoving intermediate container 003691cdc4f2\n ---> 0af1892ae7ad\nStep 23/29 : RUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\n ---> Running in 47d3dff0120d\nRemoving intermediate container 47d3dff0120d\n ---> bd4bc4ebf2cf\nStep 24/29 : RUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\n ---> Running in 91dfbff4d2d2\nRemoving intermediate container 91dfbff4d2d2\n ---> 230d75aceb20\nStep 25/29 : RUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\n ---> Running in 4e0d720f0cfd\nRemoving intermediate container 4e0d720f0cfd\n ---> 2545327438db\nStep 26/29 : RUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\n ---> Running in 37770cba900b\nRemoving intermediate container 37770cba900b\n ---> 06ba8e872dfb\nStep 27/29 : RUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\n ---> Running in 88f16a8cbe63\nRemoving intermediate container 88f16a8cbe63\n ---> 7464bca775cd\nStep 28/29 : USER balloon\n ---> Running in b7ac37070372\nRemoving intermediate container b7ac37070372\n ---> e476af17dfbd\nStep 29/29 : CMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n ---> Running in 05b3b17a1c8c\nRemoving intermediate container 05b3b17a1c8c\n ---> e96d24e8088e\nSuccessfully built e96d24e8088e\nSuccessfully tagged abcsample:3.0\n
"},{"location":"3.0/application/createsampleapplication/#export-and-import-abcsample30","title":"export and import abcsample:3.0","text":"

abcdesktop is designed to use a private or public image registry. A registry is a mandatory service to manage kubernetes cluster with some nodes.

In this case, we suppose we don't have a registry, and we use the same host to build and run application. We need to offer the registry service manually, and copy container image.

Export the image to OCI image format

docker save abcsample:3.0 -o abcsample.tar\n

Import abcsample into the namespace k8s.io using ctr

ctr -n k8s.io images import abcsample.tar\n
unpacking docker.io/library/abcsample:3.0 (sha256:5ea681ec0e79928c15d9972f0ae3adfc197d55bfd27cd6cde8381a523c8ae8c0)...done\n
"},{"location":"3.0/application/createsampleapplication/#put-abcsample30-in-to-abcdesktop","title":"put abcsample:3.0 in to abcdesktop","text":"

Export the abcsample:3.0 image to OCI format

docker image inspect abcsample:3.0 > abcsample.json\n

Import the abcsample.json into abcdesktop endpoint /API/manager/image

curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @abcsample.json \n

Return a json document

[\n  {\n    \"home\": null,\n    \"cmd\": [\n      \"/composer/appli-docker-entrypoint.sh\"\n    ],\n    \"sha_id\": \"sha256:e96d24e8088ead49f0899498a377de88cf6b8b55f042bfe5dee4cfe385d71fe2\",\n    \"id\": \"abcsample:3.0\",\n    \"rules\": {\n      \"homedir\": {\n        \"default\": true\n      }\n    },\n    \"acl\": {\n      \"permit\": [\n        \"all\"\n      ]\n    },\n    \"launch\": \"xterm.XTerm\",\n    \"name\": \"Xterm\",\n    \"icon\": \"small.svg\",\n    \"icondata\": \"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\",\n    \"keyword\": \"xterm,xterm,shell,cmd\",\n    \"uniquerunkey\": null,\n    \"cat\": \"development\",\n    \"args\": null,\n    \"execmode\": null,\n    \"security_opt\": null,\n    \"showinview\": null,\n    \"displayname\": \"Xterm\",\n    \"mimetype\": [],\n    \"path\": \"/usr/bin/xterm\",\n    \"desktopfile\": null,\n    \"executablefilename\": \"xterm\",\n    \"usedefaultapplication\": null,\n    \"fileextensions\": [],\n    \"legacyfileextensions\": [],\n    \"host_config\": {},\n    \"secrets_requirement\": null,\n    \"run_inside_pod\": false,\n    \"image_pull_policy\": \"IfNotPresent\",\n    \"image_pull_secrets\": null\n  }\n]\n
"},{"location":"3.0/application/createsampleapplication/#run-the-new-application","title":"Run the new application","text":"

Open a web browser and go to abcdesktop service url.

Open a new abcdesktop session.

Look for your new application xterm

Start your new application xterm

The icon of then new application xterm is a green rect. It appears in the dock.

Logoff to free ressources.

You have created your own abcdesktop application, import the image, and start it. To get more details, look at the applist.json it describe all json applications for abcdesktop.

"},{"location":"3.0/application/createsampleapplication/#rebuild-all-images","title":"Rebuild all images","text":"

To rebuild all application in applist.json, run node make.js -r 3.0

node make.js -r 3.0\n

This command has create new '.d' files.

$ ls *.d\nls *.d\nalpine-2048.d            calculator.d    drawio.d               flare.d          hyper.d       kturtle.d       octave.d        remotedesktopmanager.d  terminal.d     winefile-wine.d  youtube.d\napachedirectorystudio.d  chess.d         edge.d                 frozen-bubble.d  impress.d     leocad.d        onlyoffice.d    rhythmbox.d             terminalpod.d  winemine-wine.d\nastromenace.d            chrome.d        elementary.terminal.d  gcompris.d       inkscape.d    librecad.d      openshift.d     robots.d                tetravex.d     winhelp-wine.d\natom.d                   chromium.d      eog.d                  gedit.d          kalzium.d     mahjongg.d      pinta.d         shotcut.d               thunderbird.d  winscp-wine.d\nbase.d                   citrix.d        evince.d               gelemental.d     kdiamond.d    math.d          planner.d       stellarium.d            ubuntu-2048.d  wireshark.d\nbeekeeperstudio.d        cloudfoundry.d  evolution.d            geogebra.d       kgeography.d  mathwar.d       postman.d       step.d                  vice.d         writer.d\nblender.d                cntlm.d         file-roller.d          gimagereader.d   kigo.d        minecraft.d     putty-unix.d    stress.d                vlc.d          xedit.d\nbless.d                  corsix-th.d     filelight.d            gimp.d           klickety.d    mines.d         putty-wine.d    sublime-text.d          vmmacos.d      xeyes.d\nblobby.d                 dia.d           filezilla.d            gnumeric.d       klotski.d     nautilus.d      qelectrotech.d  supertux2.d             vmrc.d         xman.d\nbrackets.d               doom.d          firefox-esr.d          golly.d          konsole.d     notepad-wine.d  remarkable.d    swell-foop.d            vmubuntu.d     xpad.d\ncalc.d                   draw.d          firefox.d              gretl.d          ksquares.d    notepadqq.d     remmina.d       teams.d                 vscode.d       xterm.d\n

Each .d file is a Dockerfile

Run make to build all applications (it can take more than 2 hours)

make\n
"},{"location":"3.0/config/authentification-rules/","title":"Authentification rules configuration","text":"

All auth providers support rules configuration

A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )

"},{"location":"3.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"

A rule is a dictionary object with :

Example :

To test if the user source IP address is equal to 8.8.8.1/32

'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n
"},{"location":"3.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"

conditions is a list of condition. All condition are always tested, as a logical AND. The result must be equal to the expected value.

"},{"location":"3.0/config/authentification-rules/#examples","title":"Examples:","text":""},{"location":"3.0/config/authentification-rules/#example-true-and-true-expected-true","title":"Example (TRUE and TRUE) expected TRUE:","text":"

To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnet80'\n}\n

Add the labels 'shipcrewandnet80', if the 'expected' value is True

"},{"location":"3.0/config/authentification-rules/#example-true-and-true-expected-false","title":"Example (TRUE and TRUE) expected FALSE:","text":"

To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : False,\n    'label': 'noshipcrewandnet80'\n}\n

Add the labels 'noshipcrewandnonet80', if the 'expected' value is False

"},{"location":"3.0/config/authentification-rules/#example-true-and-false-expected-true","title":"Example (TRUE and FALSE) expected TRUE:","text":"

To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : False } ], \n    'expected' : True,\n    'label': 'noshipcrewandnet80'\n}\n

Add the labels 'noshipcrewandnet80', if the 'expected' value is True

"},{"location":"3.0/config/authentification-rules/#example-false-and-true-expected-true","title":"Example (FALSE and TRUE) expected TRUE:","text":"

To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : False },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnonet80'\n}\n

Add the labels 'shipcrewandnonet80', if the 'expected' value is True

"},{"location":"3.0/config/authentification-rules/#the-condition-value","title":"The condition value","text":"name description example boolean always true or false 'boolean' : 'true' httpheader test a HTTP header value 'httpheader': memberOf test if the LDAP user object is member of group 'memberOf': [ 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'] network test if the client user IP Address is in a network subnet 'network': [ '1.2.3.4/24'] primarygroupid test if the LDAP user object has a attibute primaryGroupID and is equal to value 'primarygroupid': '513'"},{"location":"3.0/config/authentification-rules/#condition-boolean","title":"condition boolean","text":"

This condition is a dummy condition; Only use to force a label or to disable a test.

'boolean': boolean\n

The commun usage is

'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : True,\n                 'label': 'dummy'\n}\n

or alway False

'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : False,\n                 'label': 'dummy'\n}\n
"},{"location":"3.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"

This condition is test if a HTTP Header value is equal to a string.

'httpheader': dict\n

example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'

\n 'rule-httpheader': { \n        'conditions' : [ \n            {   'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n                'expected' : True  } ],\n        'expected' : True,\n        'label': 'chromemaxosx112' }\n\n
"},{"location":"3.0/config/authentification-rules/#condition-network","title":"condition network","text":"

This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.

'network': string\n

example

To test if the user source IP address is equal to 8.8.8.1/32

'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n

To test if the user source IP address is in the subnet 10.0.0.0/8

'rule-localnet': { \n    'conditions' : [   { 'network': '10.0.0.0/8', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'localnet' }\n

To test if the user source IP address is NOT in the subnet 192.168.0.0/24

'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : False } ],\n                         'expected' : True,\n                         'label': 'no192168net' }\n

same as

'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : True } ],\n                         'expected' : False,\n                         'label': 'no192168net' }\n
"},{"location":"3.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"

To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork a separated rule.

'policies': {\n    'acl' : {},\n    'rules' : { \n          'rule-privatenetwork-10': {   'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-fe80':{  'conditions' : [ { 'network': 'fe80::/10',     'expected' : True } ], \n                                                'expected'   : True, \n                                                'label': 'privatenetwork' }\n    }\n}                       \n
"},{"location":"3.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"

This condition test if the user is a member of a LDAP Distinguished Name.

'memberOf': string\n
 'rule-sample': { 'conditions':  [ \n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewgrp'\n}\n
"},{"location":"3.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"

This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.

'primarygroupid': string\n

To check is a user is memberof a DOMAIN\\USER the primary group id is 513

'rule-domainuser': {    'conditions':  [ { 'primarygroupid': '513', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'domainuser'\n}\n

However, if the user needed to be seen as a Domain Admin for POSIX, the PrimaryGroupID is 512, the RID for that group.

'rule-posixdomainadmin': {  'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'posixdomainadmin'\n}\n

The Enterprise Admins group, 519, is also used to grant this level in POSIX.

'rule-enterpriseadmin': {   'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'enterpriseadmin'\n}\n
"},{"location":"3.0/config/authentification/","title":"Authentification","text":""},{"location":"3.0/config/authentification/#configuration-file","title":"Configuration file","text":"

The authentification configuration is set in the od.config file. In this chapter you will need to update the od.config configuration file. This update differs depending on the configuration docker mode or kubernetes mode.

Read the Update your configuration file and apply the new configuration file section to make change in od.config file for kubernetes cluster.

"},{"location":"3.0/config/authentification/#the-dictionary-authmanagers","title":"The dictionary authmanagers","text":"

The authmanagers is defined as a dictionary object :

authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

The od.config defines four kinds of entries in the authmanagers object :

"},{"location":"3.0/config/authentification/#related-authmanagers","title":"Related authmanagers","text":"authmanagers type Description external For OAuth 2.0 authentification metaexplicit For Microsoft Active Directory Trusted relationship, with support of Foreign Security Principals and Special Identities explicit For LDAP, LDAPS, Active Directory Authentification, and Kerberos authentification implicit For anonymous authentification, for an always True Authentification, and SSL-client certificat"},{"location":"3.0/config/authentification/#hands-on","title":"Hands-on","text":""},{"location":"3.0/config/authentification/#requirements","title":"Requirements","text":"

You should have read the hands-on :

"},{"location":"3.0/config/authentification/#change-authmanagers-configuration","title":"Change authmanagers configuration","text":"

Edit your od.config pyos configuration file, and set the value to the authmanagers dictionary with empty values for implicit, explicit, and external, as describe :

authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

Save your new od.config file, and restart the pyos pod

Start your web browser and open the URL http://localhost:30443

The Web home page should only show the title abcdesktop.io. There is no authmanagers available.

Great you can now add some value to authenticate your users.

"},{"location":"3.0/config/authentification/#authmanagers-implicit","title":"authmanagers implicit:","text":"

implicit is the easiest configuration mode, and is used to run Anonymous authentification (always True). Read the authmanagers implicit Section.

"},{"location":"3.0/config/authentification/#authmanagers-explicit","title":"authmanagers explicit:","text":"

explicit is defined to use a directory service like LDAP. Read the authmanagers explicit Section.

"},{"location":"3.0/config/authentification/#authmanagers-metaexplicit","title":"authmanagers metaexplicit:","text":"

metaexplicit offers a support to Microsoft Active Directory Trusted relationship, with support of Foreign Security Principals and Special Identities. Read the authmanagers explicit Section.

"},{"location":"3.0/config/authentification/#authmanagers-external","title":"authmanagers external:","text":"

external use external OAuth 2.0 authentication, for example Google OAuth 2.0, or Github OAuth 2.0 Read the authmanagers external Section.

"},{"location":"3.0/config/authentification/#authmanagers-sample","title":"authmanagers sample","text":"

In the authmanagers implicit section, authmanagers explicit section, and authmanagers external section, you have learned how to defined the providers.

You can set a complete authmanagers dictionary as described with external, explicit and implicit

authmanagers: {\n   'external': {\n    'providers': {\n      'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      },\n      'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx', \n        'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        },\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      },\n      'github': {\n        'displayname': 'Github',\n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'read:user' ], \n        'client_id': 'xxxx',\n        'client_secret': 'xxxx',\n        'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=github',\n        'authorization_base_url': 'https://github.com/login/oauth/authorize',\n        'token_url': 'https://github.com/login/oauth/access_token',\n        'userinfo_url': 'https://api.github.com/user',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n    }\n  },\n  'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n  }}\n\n\nadconfig : { \n  'AD': { \n      'default' : True, \n      'ldap_timeout': 15,\n      'ldap_basedn': 'DC=ad,DC=domain,DC=local',\n      'ldap_fqdn': '_ldap._tcp.ad.domain.local',\n      'domain': 'AD',\n      'auth_type': 'KERBEROS',\n      'domain_fqdn': 'AD.DOMAIN.LOCAL',\n      'krb5_conf': '/etc/krb5.conf',\n      'servers'    :  [ 'ldap://192.168.7.12' ],\n      'kerberos_realm': 'AD.DOMAIN.LOCAL',\n      'serviceaccount': { 'login': 'svcaccount', 'password':'account' },\n     'auth_protocol' : { \n            'ntlm': True, \n            'cntlm': False, \n            'kerberos': True, \n            'citrix': False, \n            'localaccount': True },\n     'query_dcs' : False } } }\n
"},{"location":"3.0/config/authexplicit-activedirectory/","title":"Authentification explicit for Microsoft Active Directory services","text":""},{"location":"3.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

For example :

'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}"},{"location":"3.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"

The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN and defined in the config_ref with the exact same value.

Providers :

The provider is formated as a dictionnary

{ 'AD': { 'config_ref': 'adconfig', 'enabled': True } }

Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

The adconfig is a dictionnary. For example :

adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n

If this example, the Microsoft Active Directory value are set to :

Variable name Value for example USERDOMAINADUSERDNSDOMAINAD.DOMAIN.LOCAL

For Active Directory authmanagers, replace the variable name with your own value.

Variable name Type Description Example default boolean Use this domain as default domain True ldap_basedn string LDAP Base Distinguished Names DC=ad,DC=domain,DC=localldap_fqdn string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.localdomain_fqdn string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCALservers list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]kerberos_realm string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL

The explicit authentification is support LDAP and LDAPS bind.

The Microsoft Active Directory value are set to :

Variable name Value USERDOMAINADUSERDNSDOMAINAD.DOMAIN.LOCAL

For Active Directory authmanagers, replace the variable name with your own value.

Variable name Description Example ldap_basedn Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=localldap_fqdn Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.localdomain_fqdn Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCALservers Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]kerberos_realm Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL"},{"location":"3.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"

The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)

"},{"location":"3.0/config/authexplicit-activedirectory/#site","title":"Site","text":"

This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.

Variable name Type Defautl value site_subnetdn string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') )site_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=subnet)site_attrs list ['cn', 'siteObject', 'location']"},{"location":"3.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"

This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location is the join key to match local printer for the user.

Variable name Type Defautl value printer_printerdn string OU=Applications + config.get('basedn')printer_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=printQueue)site_attrs list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]

Great, you have check how the explicit Authentification configuration works.

"},{"location":"3.0/config/authexplicit-ldap/","title":"Authentification explicit for LDAP Directory Services","text":""},{"location":"3.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

For example :

'explicit': {\n    'show_domains': True,\n    'providers': {\n      'LDAP': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n}\n

In this example, ldapconfig dict must have a key LDAP

Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string not used by ldap, only used by Active Directory providers dictionnary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}"},{"location":"3.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"

The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set with the same value in providers configuration and config_ref.

Providers :

The provider is formated as a dictionnary

{ 'planet': { 'config_ref': 'ldapconfig', 'enabled': True } }

Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

The ldapconfig is a dictionnary.

For example :

ldapconfig : { 'planet': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ 'ldap://192.168.8.195' ],\n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n           }}\n\n}\n
"},{"location":"3.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default boolean Use this domain as default domain True tls_require_cert boolean The default value is False. tls_require_cert apply only if ldap server URI starts with ldaps. Allow LDAPS connection if the ldaps server hostname does not match CommonName peer certificate. In production, set this value to True This will disable the ldap option call : ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) False basedn string LDAP Base Distinguished Names ou=people,dc=planetexpress,dc=comservers list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. [ 'ldap://192.168.1.12', 'ldaps://myldap.domain.org' ] IP Address or FQDN values scope LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope being one of SCOPE_BASE (to search the object itself), SCOPE_ONELEVEL (to search the object\u2019s immediate children), or SCOPE_SUBTREE (to search the object and all its descendants). ldap.SCOPE_SUBTREEtimeout integer ldap time out in second 10 exec_timeout integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos auth credentials. the exec timeout is used to run external command line. 10 users_ou string Users Organisation Unit ou=people,dc=planetexpress,dc=comattrs list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s))group_filter string LDAP filter to find group object (&(objectClass=Group)(cn=%s))group_attrs string LDAP filter to find group object (&(objectClass=Group)(cn=%s))"},{"location":"3.0/config/authexplicit-ldap/#the-ldap-structure-of-openldap-for-testing","title":"The LDAP structure of openldap for testing","text":"

The authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

"},{"location":"3.0/config/authexplicit-ldap/#basedn","title":"BaseDN","text":"

The basedn is dc=planetexpress,dc=com

"},{"location":"3.0/config/authexplicit-ldap/#admin-account","title":"admin account","text":"

The admin account is described as

Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"3.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":""},{"location":"3.0/config/authexplicit-ldap/#users","title":"Users","text":""},{"location":"3.0/config/authexplicit-ldap/#cnhubert-j-farnsworthoupeopledcplanetexpressdccom","title":"cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hubert J. Farnsworth sn Farnsworth description Human displayName Professor Farnsworth employeeType Owner employeeType Founder givenName Hubert jpegPhoto JPEG-Photo (630x507 Pixel, 26780 Bytes) mail professor@planetexpress.com mail hubert@planetexpress.com ou Office Management title Professor uid professor userPassword professor"},{"location":"3.0/config/authexplicit-ldap/#cnphilip-j-fryoupeopledcplanetexpressdccom","title":"cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry"},{"location":"3.0/config/authexplicit-ldap/#cnjohn-a-zoidbergoupeopledcplanetexpressdccom","title":"cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn John A. Zoidberg sn Zoidberg description Decapodian displayName Zoidberg employeeType Doctor givenName John jpegPhoto JPEG-Photo (343x280 Pixel, 26438 Bytes) mail zoidberg@planetexpress.com ou Staff title Ph. D. uid zoidberg userPassword zoidberg"},{"location":"3.0/config/authexplicit-ldap/#cnhermes-conradoupeopledcplanetexpressdccom","title":"cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hermes Conrad sn Conrad description Human employeeType Bureaucrat employeeType Accountant givenName Hermes mail hermes@planetexpress.com ou Office Management uid hermes userPassword hermes"},{"location":"3.0/config/authexplicit-ldap/#cnturanga-leelaoupeopledcplanetexpressdccom","title":"cn=Turanga Leela,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Turanga Leela sn Turanga description Mutant employeeType Captain employeeType Pilot givenName Leela jpegPhoto JPEG-Photo (429x350 Pixel, 26526 Bytes) mail leela@planetexpress.com ou Delivering Crew uid leela userPassword leela"},{"location":"3.0/config/authexplicit-ldap/#groups","title":"Groups","text":""},{"location":"3.0/config/authexplicit-ldap/#cnadmin_staffoupeopledcplanetexpressdccom","title":"cn=admin_staff,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn admin_staff member cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com member cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com"},{"location":"3.0/config/authexplicit-ldap/#cnship_crewoupeopledcplanetexpressdccom","title":"cn=ship_crew,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn ship_crew member cn=Turanga Leela,ou=people,dc=planetexpress,dc=com member cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com member cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"},{"location":"3.0/config/authexplicit-ldap/#insert-the-user-credentials","title":"Insert the user credentials","text":"

Start your web browser and open the URL http://localhost

The Web home page contains the new input values Login and Password to authenticate this user.

You can use for example on user of the list above.

Credentials Value Login Turanga Leela Password leela

Insert the login credentials :

Turanga Leela as login and leela as password, then click on the Sign in button.

Look at the top of the sreen. The user name is Turanga Leela:

"},{"location":"3.0/config/authexplicit-ldap/#applications-remainted","title":"Applications remainted","text":"

Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :

I like this amazing project abcdesktop.io\n

Do not save your file and just close your web browser.

Start your web browser again, and open the same URL http://localhost, and log in with the same account: Turanga Leela as login and leela as password, then click on the Sign in button.

The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io

All applications are maintained.

Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.

"},{"location":"3.0/config/authexplicit/","title":"Authentification explicit","text":""},{"location":"3.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit:","text":"

explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

The explicit authentification support the directory services ldap, ldaps, and Microsoft Active Directory.

Configuration sample for Microsoft Active Directory

For example :

'explicit': {\n    'show_domains': True,\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n
"},{"location":"3.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"

If the authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

"},{"location":"3.0/config/authexplicit/#ldap-authmanagers","title":"LDAP authmanagers :","text":"

Read the specific chapter on LDAP LDAP and LDAPS explicit authmanagers

"},{"location":"3.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"

Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers

Great, you have check how the explicit Authentification configuration works.

"},{"location":"3.0/config/authexternal/","title":"Authentification external","text":""},{"location":"3.0/config/authexternal/#requirements","title":"Requirements","text":"

To use external Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.

"},{"location":"3.0/config/authexternal/#library","title":"Library","text":"

abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.

"},{"location":"3.0/config/authexternal/#authmanagers-external","title":"authmanagers external:","text":"

external authentification use OAuth 2.0 authenticaton.

The external authentification configuration is defined as a dictionary object and contains a list of external provider.

Sample providers entry using the Google OAuth 2.0 authentification service.

'external': {\n    'providers': {\n    'google': { \n    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }   \n   }\n}\n

The variable values client_id and client_secret have been set to obfuscate value 'xxxx'. The FQDN hostname.domain.local is referred to your public server FQDN.

Variable name Type Description Sample displayname string Display Name show in Web front Googleenabled boolean LDAP Base Distinguished Names Trueclient_id string client id XXX-YYY.apps.googleusercontent.comclient_secret string client secret XXXscope list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ]userinfo_url string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix string redirect URL https://hostname.domain.local/API/auth/oauthredirect_uri_querystring string URL query string manager=external&provider=googleauthorization_base_url string callback URL https://accounts.google.com/o/oauth2/v2/authtoken_url string token URL https://oauth2.googleapis.com/token

The complete redirect url concats the two values redirect_uri_prefix and redirect_uri_querystring.

"},{"location":"3.0/config/authexternal/#orange-oauth","title":"Orange OAuth","text":"

Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.

"},{"location":"3.0/config/authexternal/#orange-application","title":"Orange Application","text":"

Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section

 'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'openid', 'form_filling' ],\n        'client_id': 'xxxx',\n        'client_secret': 'xxxx',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=orange',\n        'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n        'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n        'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n
"},{"location":"3.0/config/authexternal/#facebook-oauth","title":"Facebook OAuth","text":"

Facebook's OAuth is supported for authentication.

"},{"location":"3.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"

Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API

'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx', \n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        },\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n
"},{"location":"3.0/config/authexternal/#google-oauth","title":"Google OAuth","text":"

Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.

"},{"location":"3.0/config/authexternal/#google-application","title":"Google Application","text":"

Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]

'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n
"},{"location":"3.0/config/authexternal/#github-oauth","title":"Github OAuth","text":"

GitHub's OAuth implementation supports the standard authorization code grant type and the OAuth 2.0 Device Authorization Grant for apps that don't have access to a web browser.

"},{"location":"3.0/config/authexternal/#github-oauth_1","title":"Github OAuth","text":"

Enable other users to authorize your OAuth App. Create your Github credentials here : authorizing-oauth-apps and set the correct credentials for Github Authentification API

'github': {\n        'displayname': 'Github',\n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'read:user' ], \n        'client_id': 'xxxx',\n        'client_secret': 'xxxx',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=github',\n        'authorization_base_url': 'https://github.com/login/oauth/authorize',\n        'token_url': 'https://github.com/login/oauth/access_token',\n        'userinfo_url': 'https://api.github.com/user',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n

Great, you have check how the implicit Authentification configuration works.

"},{"location":"3.0/config/authimplicit/","title":"Authentification implicit","text":""},{"location":"3.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit:","text":"

implicit is the easyest configuration mode, and is used as 'Anonymous' authentification.

The provider is defined as a dictionnary object and contains an anononymous provider.

anononymous provider always permit authentification, and create a uuid as userid. anononymous provider is used to skip the authentification process in a demonstration mode.

'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n

anononymous provider always permit authentification, and create a uuid as userid.

Set in your configuration file the authmanagers dictionnary as described

authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { \n     'providers': {\n         'anonymous': {\n           'displayname': 'Anonymous',\n           'caption': 'Anonymous',\n           'userid': 'anonymous',\n           'username': 'Anonymous'\n      } \n   }\n}\n

Update your configuration file and apply the new configuration file

Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :

Press the Sign-In Anonymously button.

Then, choose the settings in the menu at the upper right corner

Choose the System in the settings control panel.

Then choose User containers

This screen show you the hostname.

You can read the hostname. In the example the hostname is f097ab7aac57, from the container id.

Using a shell, run the command docker ps -a

docker ps -a\n

Find a running container with the containerid previously identified.

In this example the containerid is f097ab7aac57

f097ab7aac57   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   8 minutes ago    Up 8 minutes               4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp   g-06b686a5-c98d-4889-b73d-3455f692e6c2\n

Run the command docker inspect CONTAINERID, replace the string CONTAINERID with your container id value.

For example docker inspect f097ab7aac57

docker inspect f097ab7aac57\n

Locate the Mounts description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and

 \"Mounts\": [\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/tmp\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            },\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/home/balloon\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            }\n        ],\n\n

When the anonymous container is removed, the anonymous home directory is deleted.

Great, you have check how the implicit Authentification configuration works.

"},{"location":"3.0/config/authmetaexplicit/","title":"Authentification metaexplicit for Microsoft Active Directory services with trust relationships","text":""},{"location":"3.0/config/authmetaexplicit/#authmanagers-metaexplicit-object","title":"authmanagers metaexplicit object","text":"

The metaexplicit authentification manager contains only one provider. The provider must be defined as metadirectory.

'metaexplicit': {\n    'providers': {\n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True\n       }\n}\n
Variable name Type Description providers dictionary { 'metadirectory': { 'config_ref': 'coporateconfig', 'enabled': True }}"},{"location":"3.0/config/authmetaexplicit/#metadirectory-provider-configuration","title":"metadirectory provider configuration","text":"

The metadirectory provider is defined as a dictionnary object and must contain key name. The key name must be set as the name of a dictionaryin the config_ref.

A metadirectory provider must contain a ldap attribut to describe the original DOMAIN and sAMaccountName. The ldap attribut is defined as join_key_ldapattribut.

coporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } } \n

Pyos binds the metadirectory ldap server with serviceaccount credentials Pyos read the ldap attribut description value to get the user's trusted domain.

For example :

description: AD\\john\n

Then pyos look for provider AD configuration and process authentification on domain AD

The metadirectory accounts can be disabled. The ldap attribut userAccountControl is not read on metaDirectory provider. The account can have the bit UF_ACCOUNT_DISABLE set or not.

A service account must defined for a metadirectory provider. The service account is used to bind the metadirectory.

"},{"location":"3.0/config/authmetaexplicit/#complete-example-with-a-metadirectory-provider-and-active-directory-user-domain","title":"Complete example with a metadirectory provider and active directory user domain","text":"

The user's domain mane is AD. The meta domain name is CORPORATE. The meta domain use a dedicated attribut join_key_ldapattribut

authmanagers: {\n  #\n  # define the meta explicit manager\n  # This is the trusted external forest for the followed domain\n  #\n  'metaexplicit': {\n    'providers': {\n      # define the metadirectory provider\n      # only one metadirectory provider is supported \n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True } \n    }\n  },\n\n  #        \n  # define the Active Directory provider for each DOMAIN\n  # define two domains in two disctinct forest with a trust relationship \n  # \n  'explicit': { \n    # define an Active Directory provider AD \n    'AD': {  'config_ref': 'adconfig', 'enabled': True },\n    # define an Active Directory provider ANOTHER\n    'ANOTHER': { 'config_ref': 'anotherconfig', 'enabled': True }  \n  }\n} # end of authmanagers\n\n# In this example ldap attribut's description contains AD\\myuser or ANOTHER\\myuser \ncoporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } }\n\n\n# \n# define the first DOMAIN AD\n# The adconfig ref for domain AD\n#\nadconfig : { 'AD': {  'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                      'domain'        : 'AD',\n                      'auth_type'     : 'NTLM',\n                      'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                      'servers'       : [ 'ldap://192.168.7.12' ] } }\n\n#\n# define the second DOMAIN ANOTHER\n# The anotherconfig ref for domain ANOTHER\n#\nanotherconfig : { 'ANOTHER': {\n                      'ldap_basedn'   : 'DC=another,DC=super,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.another.super.local',\n                      'domain'        : 'ANOTHER',\n                      'auth_type'     : 'KERBEROS',\n                      'domain_fqdn'   : 'ANOTHER.SUPER.LOCAL',\n                      'servers'       : [ 'ldap://192.168.10.12' ],\n                      'kerberos_realm': 'AD.SUPER.LOCAL' } }\n
"},{"location":"3.0/config/authmetaexplicit/#metadirectorysupport","title":"metadirectorysupport","text":"

metadirectory support the foreign security principal (FSP) to query security principal in the trusted external forest. These objects are created in the foreign security principals container of the domain. metadirectory support isMemberOf on foreign security principal.

The user's SID of domain 'AD' or 'ANOTHER' is NOT read. A new ldap bind is done using the trusted domain on metadirectory provider and not unsing the service account.

The ldap query is build : ( \"search_base={q.basedn}, search_scope={q.scope}, search_filter={filter}\" )

To get more information about foreign security principal (FSP), read :

"},{"location":"3.0/config/balloon/","title":"balloon user entry in od.config","text":"

balloon is the default generic user.

The balloon user is created inside the oc.user container

The default values are

balloon Default Values nameballoonuid4096gid4096homedirectory/home/balloon

If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"3.0/config/cloudprovider.loadbalancing/","title":"Use http cloud provider LoadBalancer service","text":""},{"location":"3.0/config/cloudprovider.loadbalancing/#goals","title":"Goals","text":""},{"location":"3.0/config/cloudprovider.loadbalancing/#requirements","title":"Requirements","text":""},{"location":"3.0/config/cloudprovider.loadbalancing/#update-nginx-service-to-use-http-loadbalancer","title":"Update nginx service to use http LoadBalancer","text":"

Replace type: NodePortby type: LoadBalancer into the nginx service

Save this yaml as nginx.service.http.loadbalancer.yaml file name

kind: Service\napiVersion: v1\nmetadata:\n  name: nginx\n  namespace: abcdesktop\nspec:\n  type: LoadBalancer\n  selector:\n    run: nginx-od \n  ports:\n  - protocol: TCP\n    port: 80\n    targetPort: 80\n    name: http\n
# delete the previous nginx service\nkubectl delete service nginx -n abcdektop\n# create the new  nginx service\nkubectl apply -f nginx.service.http.loadbalancer.yaml\n

Wait few minutes to obtain an ip address LoadBalancer from your cloud provider service

kubectl get services -n abcdesktop\nNAME        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE\ndesktop     ClusterIP      None             <none>        <none>            57m\nmemcached   ClusterIP      10.245.247.50    <none>        11211/TCP         57m\nmongodb     ClusterIP      10.245.198.243   <none>        27017/TCP         57m\nnginx       LoadBalancer   10.245.172.53    <pending>     80:30443/TCP      57m\nopenldap    ClusterIP      10.245.109.131   <none>        389/TCP,636/TCP   57m\npyos        ClusterIP      10.245.94.15     <none>        8000/TCP          57m\nspeedtest   ClusterIP      10.245.67.168    <none>        80/TCP            57m\n

You get the EXTERNAL-IP for your LoadBalancer service

kubectl get services -n abcdesktop\nNAME        TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)           AGE\ndesktop     ClusterIP      None             <none>         <none>            61m\nmemcached   ClusterIP      10.245.247.50    <none>         11211/TCP         61m\nmongodb     ClusterIP      10.245.198.243   <none>         27017/TCP         61m\nnginx       LoadBalancer   10.245.172.53    161.35.246.4   80:30443/TCP      61m\nopenldap    ClusterIP      10.245.109.131   <none>         389/TCP,636/TCP   61m\npyos        ClusterIP      10.245.94.15     <none>         8000/TCP          61m\nspeedtest   ClusterIP      10.245.67.168    <none>         80/TCP            61m\n

Open your web browser to reach the abcdesktop service. In this case, the loadbalancing service returns the ip address 161.35.246.4

Login using Philip J. Fry

And you should get the fry desktop

"},{"location":"3.0/config/cloudprovider.loadbalancing/#troubleshooting-with-port-forward","title":"Troubleshooting with port-forward","text":"

Use the kubectl port-forward command and a forwarded local port to help troubleshooting issues.

Get the pod name for nginx

kubectl get pods -l run=nginx-od -n abcdesktop\nNAME                        READY   STATUS    RESTARTS   AGE\nnginx-od-69fb8fd8bb-qg4z2   1/1     Running   0          11h\n

Choose the nginx's pod, to forward local port 80 to nginx 80

kubectl port-forward nginx-od-69fb8fd8bb-qg4z2 --address 0.0.0.0 80:80 -n abcdesktop\nForwarding from 0.0.0.0:80 -> 80\n

Your localhost is listening on 0.0.0.0:80 and forward to the nginx port 80

Then open your web browser http://localhost, you should get the home page, login using LDAP auth or Anonymous auth should work.

Then login, and you get a pod user.

For the first time, you may get a time out error, if all container image can not be downloaded in less than 180 seconds on the worker node.

kubectl get pods -n abcdesktop                                                   \nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-bdcbbcb74-nhd68    1/1     Running   0          11h\nmongodb-od-d46d79476-fmbj5      1/1     Running   0          11h\nnginx-od-69fb8fd8bb-qg4z2       1/1     Running   0          11h\nopenldap-od-795c55f6db-wz7l4    1/1     Running   0          11h\npyos-od-988887859-8kwdx         1/1     Running   0          11h\nspeedtest-od-6b5f8584f5-cs69t   1/1     Running   0          11h\nfry-2cf3a                       4/4     Running   0          4m15s\n

The user fry gets the abcdesktop pod fry-2cf3a

"},{"location":"3.0/config/cloudprovider.loadbalancing/#update-nginx-service-to-use-loadbalancer-service-with-https","title":"Update nginx service to use LoadBalancer service with https","text":"

This example works on digitalocean cloud provider.

First of all, you need to get your loadbalancer-certificate-id

To list available certificates and their IDs, install doctl and run the command

doctl compute certificate list\n

Then define annotations on the abcdesktop nginx service like

  service.beta.kubernetes.io/do-loadbalancer-certificate-id: \"3619b45a-714b-455c-a01a-e92fc8a29cbb\"\n  service.beta.kubernetes.io/do-loadbalancer-protocol: \"https\"\n  service.beta.kubernetes.io/do-loadbalancer-disable-lets-encrypt-dns-records: \"false\"\n

Create a loadbalancing.yaml file, to update the default abcdestkop service/nginx You need to replace service.beta.kubernetes.io/do-loadbalancer-certificate-id with your own certificate value.

---         \nkind: Service \napiVersion: v1\nmetadata:   \n  name: nginx \n  namespace: abcdesktop\n  annotations:\n    service.beta.kubernetes.io/do-loadbalancer-certificate-id: \"3619b45a-714b-455c-a01a-e92fc8a29cbb\"\n    service.beta.kubernetes.io/do-loadbalancer-protocol: \"https\"\n    service.beta.kubernetes.io/do-loadbalancer-disable-lets-encrypt-dns-records: \"false\"\n  labels:\n    abcdesktop/role: nginx\nspec: \n  type: LoadBalancer\n  selector:\n    run: nginx-od\n  ports:\n  - protocol: TCP\n    port: 443\n    targetPort: 80\n    name: https\n---\n

Apply the new loadbalancing.yaml file

kubectl apply -f loadbalancing.yaml\n

You can read

service/nginx configured\n

Check the nginx/services

kubectl get service/nginx -n abcdesktop\n
NAME    TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)         AGE\nnginx   LoadBalancer   10.245.188.146   161.35.246.4    443:32086/TCP   28m\n

Now you can replace http by the secure protocol https

"},{"location":"3.0/config/controllers/","title":"Controllers","text":""},{"location":"3.0/config/controllers/#controllers_1","title":"Controllers","text":"

abcdesktop is based on the Model View Controller (usually known as MVC). This MVC is used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.

List of all abcdesktop's controllers and the description :

Controller Description AccountingController accounting data json format AuthController authenticate user ComposerController CRUD main services (like createDesktop, createApplication) CoreController get configuration and user message info ManagerController manage service (like add an application) UserController retrieve user information"},{"location":"3.0/config/controllers/#access-permission","title":"Access Permission","text":"

The controllers configuration is a dictionary, and is defined in the pyos's od.config file.

controllers : { \n    'AccountingController': { \n        'apikey': [ 'fPCdPNcCafec4lXm3M' ],\n        'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n    },\n    'ManagerController': { \n        'apikey': [ 'fQDbvjCafec4l', 'KzH23EZjCZSfsd9'],\n        'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n    },\n    'AuthController' :      { 'permitip': None },\n    'ComposerController' :  { 'permitip': None },\n    'CoreController' :      { 'permitip': None },\n    'UserController' :      { 'permitip': None }\n} \n

By default, AccountingController and ManagerController access are protected by ip source filters. The configuration permits private networks defined in rfc1918 and rfc4193. Get more information about the private network.

By default, others controllers access is enabled, without any restriction.

"},{"location":"3.0/config/controllers/#access-control-filter","title":"Access control filter","text":"

The access control filter configuration is defined in a json dictionary. Each dictionary entry use the controller name and with entries permitip and/or apikey.

If the source ip address is denied, the response is a HTTP status is 403 code 403 Forbidden

{\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
"},{"location":"3.0/config/controllers/#curl-http-requests-sample","title":"Curl http requests sample","text":""},{"location":"3.0/config/controllers/#curl-http-request-with-x-api-key","title":"Curl http request with X-API-Key","text":"

Add the http header X-API-Key: fQDbvjCafec4l to the curl command to list images

curl -X GET -H 'X-API-Key: fQDbvjCafec4l' -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images\n

The command returns

{}\n

Add the http header X-API-Key: fQDbvjCafec4l to the curl command to add new application

curl -X POST -H 'X-API-Key: fQDbvjCafec4l'  -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xeyes.d.3.0.json\n

The command returns

[\n {  \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \n    \"path\": \"/usr/bin/xeyes\", \n    \"sha_id\": \"sha256:4ed2e110042b80f1634d8f3ae66b793914db813f53cd88811285448602d7540e\", \n    \"id\": \"abcdesktopio/xeyes.d:3.0\", \n    \"rules\": {}, \n    \"acl\": {\"permit\": [\"all\"]}, \n    \"launch\": \"xeyes.XEyes\", \n    \"name\": \"xeyes\", \n    \"icon\": \"circle_xfce4-eyes.svg\", \n    \"keyword\": \"xeyes,eyes\", \n    \"uniquerunkey\": null, \n    \"cat\": \"utilities\", \n    \"args\": null, \n    \"execmode\": null, \n    \"showinview\": null, \n    \"displayname\": \"xeyes\", \n    \"home\": null, \n    \"desktopfile\": null, \n    \"executeclassname\": null, \n    \"executablefilename\": \"xeyes\", \n    \"usedefaultapplication\": false, \n    \"mimetype\": [], \n    \"fileextensions\": [], \n    \"legacyfileextensions\": [], \n    \"secrets_requirement\": null, \n    \"image_pull_policy\": \"IfNotPresent\", \n    \"image_pull_secrets\": null, \n    \"containerengine\": \"ephemeral_container\", \n    \"securitycontext\": {}\n }\n]\n
"},{"location":"3.0/config/controllers/#curl-http-request-forbidden","title":"Curl http request forbidden","text":"
curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images\n

The command returns

{\"status\": 403, \"message\": \"Request forbidden -- authorization will not help\"}\n
"},{"location":"3.0/config/desktop/","title":"desktop options in od.config","text":"

The od.config contains options to describe how the oc.user and applications containers have to be created.

"},{"location":"3.0/config/desktop/#desktopoptions","title":"desktop.options","text":"

All desktop options are defined in od.config file. Desktop options start with the prefix desktop., then add the name of the option.

Option name Type Sample desktop.defaultbackgroundcolors list ['#6EC6F0', '#CD3C14', '#4BB4E6' ] desktop.homedirectorytype string 'hostPath' desktop.remotehomedirectorytype list [] desktop.persistentvolumespec string None desktop.persistentvolumeclaimspec string None desktop.homedirectorytype string 'hostPath' desktop.envlocal dictionary { 'X11LISTEN':'tcp'}desktop.nodeselector dictionary {}desktop.username string 'balloon' desktop.userid integer 4096 desktop.groupid integer 4096 desktop.userhomedirectory string '/home/balloon'desktop.useinternalfqdn boolean False desktop.uselocaltime boolean False desktop.policies dictionary { 'rules':{}, 'max_app_counter':5 }desktop.webhookdict dictionary {}"},{"location":"3.0/config/desktop/#desktophomedirectory","title":"desktop.homedirectory","text":"

This option describes how to create the home directory for the user. The value can be defined as :

To get more information about user's home directory volume, read the volumes chapter

"},{"location":"3.0/config/desktop/#desktopremotehomedirectorytype","title":"desktop.remotehomedirectorytype","text":"

desktop.remotehomedirectorytype is a list of string. Each string describe if the remount access to a directory is allowed. example [ 'cifs', 'webdav' ]

For each entry in the desktop.remotehomedirectorytype list, abcdesktop.io try to mount the remote file system using data from the implicit auth provider.

If desktop.remotehomedirectorytype contains 'cifs' and if the authentification provider get homeDrive and homeDirectory attributs then abcdesktop request the kubernetes abcdesktop/CIFS Driver to mount the remote filesystem. The user find a mount point named homeDrive value, and mounted to homeDirectory.

"},{"location":"3.0/config/desktop/#desktopdefaultbackgroundcolors","title":"desktop.defaultbackgroundcolors","text":"

The desktop.defaultbackgroundcolors allow you to change the default background color.

The default value is a list of string [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]

The desktop.defaultbackgroundcolors length can contain up to 8 entries. To see the color

Open the url http://localhost:30443, in your web browser, to start a simple abcdesktop.io container.

http://localhost:30443\n

You should see the abcdesktop.io home page.

Press the Connect with Anonymous access, have look

At the right top corner, click on the menu and choose Settings, then click on Screen Colors

You should see the default background colors, for example :

"},{"location":"3.0/config/desktop/#desktopenvlocal","title":"desktop.envlocal","text":"

desktop.envlocal is a dictionary. desktop.envlocal contains a (key,value) added as environment variables to oc.user.

The default value is :

{ \n  'X11LISTEN': 'tcp'\n}\n
"},{"location":"3.0/config/desktop/#reserved-variables","title":"Reserved variables","text":"Variable Values Description X11LISTENtcp permit X11 to listen on tcp port, default is udpABCDESKTOP_RUN_DIR/var/run/desktop directory to write pid services ABCDESKTOP_LOG_DIR/var/log/desktop directory to write log files services DISABLE_REMOTEIP_FILTERINGdisabled disabled remote ip filtering inside pod user, default is disabled, change to enabled to remove core ip filtering SET_DEFAULT_WALLPAPERmyfile.jpeg name of file to set the user wallpaper, this file must exist in ~/.wallpapersSET_DEFAULT_COLOR#6EC6F0 Value of default colour saved in file ~/.store/currentColorSENDCUTTEXTenabled \u00a0Send clipboard changes to user. Set value to disabled to disable clipboard changes to user web browser. This value is overwrite by label ABCDESKTOP_LABEL_sendcuttext if exist SENDCUTTEXT=${ABCDESKTOP_LABEL_sendcuttext:-$SENDCUTTEXT}. The default value is enabledACCEPTCUTTEXTenabled \u00a0Accept clipboard updates from user. Set value to disabled to disable clipboard changes to user web browser. This value is overwrite by label ABCDESKTOP_LABEL_acceptcuttext if exist ACCEPTCUTTEXT=${ABCDESKTOP_LABEL_acceptcuttext:-$ACCEPTCUTTEXT}. The default value is enabled"},{"location":"3.0/config/desktop/#desktopnodeselector","title":"desktop.nodeselector","text":"

desktop.nodeselector is a dictionary. This option permits to assign user pods to nodes.

It specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). The most common usage is one key-value pair.

The value must be a string, by example 'true', and matches the labels node value.

desktop.nodeselector:  { 'abcdesktopworker': 'true' }\n

To set a label abcdesktopworker=true to a node

kubectl label node $YOUR_NODE abcdesktopworker=true\n

The commands returns

node/nodesample01 labeled\n

To list all labels on all nodes

kubectl -n abcdesktop get nodes --template '{{range .items}}{{.metadata.labels}}{{\"\\n\"}}{{end}}'\n

The commands returns

map[beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3cp01 kubernetes.io/os:linux node-role.kubernetes.io/control-plane: node.kubernetes.io/exclude-from-external-load-balancers:]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws01 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws02 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws03 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\n

desktop.nodeselector is used as selector by pyos to create user's pods and to pull container's images.

"},{"location":"3.0/config/desktop/#desktopusername","title":"desktop.username","text":"

desktop.username is the name of the default username inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.username is string. The default value is 'balloon'.

"},{"location":"3.0/config/desktop/#desktopuserid","title":"desktop.userid","text":"

desktop.userid describes the uid Number of the default user id number inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.userid is integer. The default value is 4096.

"},{"location":"3.0/config/desktop/#desktopgroupid","title":"desktop.groupid","text":"

desktop.groupid describes the gid Number of the default group id number inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.userid is integer. The default value is 4096.

"},{"location":"3.0/config/desktop/#desktopuserhomedirectory","title":"desktop.userhomedirectory","text":"

desktop.userhomedirectory describes the homedirectory of the user created inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entrycontainer. The type of desktop.userhomedirectory is string. The default value is /home/balloon.

"},{"location":"3.0/config/desktop/#desktopuselocaltime","title":"desktop.uselocaltime","text":"

The desktop.uselocaltime is boolean, to use host value of /etc/localtime. The default value is False. If desktop.uselocaltime is True, this add a volume mapping from host file /etc/localtime to container file /etc/localtime.

"},{"location":"3.0/config/desktop/#desktoppolicies","title":"desktop.policies","text":"

desktop.policies has a dictionary format.

Entry Description max_app_counter limit applications counter, without checking the docker container status rules rules dictionary 'rules': { 'volumes': { 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } }acl allow or denied desktop creation

Example

desktop.policies: { \n  'rules': { \n    'volumes': { \n      'domainuser':   { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' },\n      'Mygroupteam':  { 'type': 'cifs', 'name': 'toto', 'unc': '//192.168.7.101/team', 'volumename': 'team' } \n      } \n  },\n  'acls' : {},\n  'max_app_counter' : 4  \n}\n
"},{"location":"3.0/config/desktop/#desktopwebhookdict","title":"desktop.webhookdict","text":"

desktop.webhookdict is a dictionary to add key/value to the command create and destroy in rules objects.

"},{"location":"3.0/config/desktop/#experimental-features","title":"Experimental features","text":""},{"location":"3.0/config/desktop/#desktopdesktopuseinternalfqdn","title":"desktop.desktopuseinternalfqdn","text":"

WARNING desktop.desktopuseinternalfqdn is an experimental feature, keep this value to False in production

desktop.desktopuseinternalfqdn describes the content of the payload data in the JWT Desktop Token. The default value is False.

Nginx front end act as a reverse proxy. This reverse proxy use the FQDN of the user's pod to route http request. If this value is set to False the payload data in the JWT Desktop Token contains the IP Address of the user Pod. If this value is set to True the payload data in the JWT Desktop Token contains the FQDN of the user Pod.

If you CAN NOT add endpoint_pod_names in the coredns configuration, you MUST set desktop.desktopuseinternalfqdn to False. This choice is less secure.

To set desktop.desktopuseinternalfqdn to True value, you have to update the coredns ConfigMap.

kind: ConfigMap\napiVersion: v1\nmetadata:\n  name: coredns\n  namespace: kube-system\ndata:\n  Corefile: |\n    .:53 {\n        log\n        errors\n        health\n        ready\n        kubernetes cluster.local in-addr.arpa ip6.arpa {\n           endpoint_pod_names\n           pods insecure\n           fallthrough in-addr.arpa ip6.arpa\n           transfer to * \n           ttl 30\n        }\n        prometheus :9153\n        forward . /etc/resolv.conf\n        cache 30\n        loop\n        reload\n        loadbalance\n    }\n
"},{"location":"3.0/config/desktop.pod/","title":"desktop.pod","text":"

abcdesktop defines a user desktop as a group of user's containers. This is a main features of abcdesktop. Each container offers a service.

For example

"},{"location":"3.0/config/desktop.pod/#containers-in-the-user-pod","title":"containers in the user pod","text":"

Each service :

"},{"location":"3.0/config/desktop.pod/#default-desktoppod","title":"default desktop.pod","text":"
desktop.pod : { \n  'spec' : {\n    'shareProcessNamespace': True,\n    'shareProcessMemory': True,\n    'shareProcessMemorySize': '256Mi',\n    'securityContext': { \n      'supplementalGroups': [ '{{ supplementalGroups }}' ],\n      'runAsUser': '{{ uidNumber }}',\n      'runAsGroup': '{{ gidNumber }}',\n      'readOnlyRootFilesystem': False, \n      'allowPrivilegeEscalation': True\n    }\n  },  \n  'graphical' : { \n    'image': { 'default': 'abcdesktopio/oc.user.ubuntu:3.0' },\n    'imagePullPolicy': 'IfNotPresent',\n    'enable': True,\n    'acl': { 'permit': [ 'all' ] },\n    'waitportbin': '/composer/node/wait-port/node_modules/.bin/wait-port',\n    'resources': { \n            'requests': { 'memory': \"320Mi\", 'cpu': \"250m\"  }, \n            'limits':   { 'memory': \"1Gi\",   'cpu': \"1000m\" } \n    },\n    'shareProcessNamespace': True,\n    'tcpport': 6081,\n    'secrets_requirement' : [ 'abcdesktop/vnc', 'abcdesktop/kerberos']\n  },\n  'spawner' : { \n    'enable': True,\n    'tcpport': 29786,\n    'waitportbin' : '/composer/node/wait-port/node_modules/.bin/wait-port',\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'broadcast' : { \n    'enable': True,\n    'tcpport': 29784,\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'webshell' : { \n    'enable': True,\n    'tcpport': 29781,\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'printer' : { \n    'image': 'abcdesktopio/oc.cupsd:3.0',\n    'imagePullPolicy': 'IfNotPresent',\n    'enable': True,\n    'tcpport': 681,\n    # cupsd need to start as root\n    'securityContext': { 'runAsUser': 0 },\n    'resources': { \n      'requests': { 'memory': \"64Mi\", 'cpu': \"125m\" },  \n      'limits'  : { 'memory': \"512Mi\",  'cpu': \"500m\" } \n    },\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'printerfile' : { \n    'enable': True,\n    'tcpport': 29782,\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'filer' : { \n    'image': 'abcdesktopio/oc.filer:3.0',\n    'imagePullPolicy':  'IfNotPresent',\n    'enable': True,\n    'tcpport': 29783,\n    'acl':  { 'permit': [ 'all' ] } \n    },\n  'storage' : { \n    'image': 'k8s.gcr.io/pause:3.8',\n    'imagePullPolicy':  'IfNotPresent',\n    'enable': True,\n    'acl': { 'permit': [ 'all' ] },\n    'resources': { \n      'requests': { 'memory': \"32Mi\",  'cpu': \"100m\" },  \n      'limits'  : { 'memory': \"128Mi\", 'cpu': \"250m\" } \n    }\n  },\n  'sound': { \n    'image': 'abcdesktopio/oc.pulseaudio:3.0',\n    'imagePullPolicy': 'IfNotPresent',\n    'enable': False,\n    'tcpport': 4714,\n    'acl':  { 'permit': [ 'all' ] },\n    'resources': { \n      'requests': { 'memory': \"8Mi\",  'cpu': \"50m\"  },  \n      'limits'  : { 'memory': \"64Mi\", 'cpu': \"250m\" } \n    } \n  },\n  'init': { \n    'image': 'busybox',\n    'enable': True,\n    # 'imagePullSecrets': [ { 'name': name_of_secret } ]\n    'imagePullPolicy': 'IfNotPresent',\n    'securityContext': { 'runAsUser': 0 },\n    'acl':  { 'permit': [ 'all' ] },\n    'command':  [ 'sh', '-c',  'chmod 750 ~ && chown {{ uidNumber }}:{{ gidNumber }} ~ || true' ] \n  },\n  'ephemeral_container': {\n    'enable': True,\n    'securityContext': { \n        'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n        'readOnlyRootFilesystem': False, \n        'allowPrivilegeEscalation': True, \n        'runAsUser':                '{{ uidNumber }}',\n        'runAsGroup':               '{{ gidNumber }}'\n     },\n    'acl':  { 'permit': [ 'all' ] }\n  },\n  'pod_application' : {\n    'enable': True,\n    'securityContext': { \n        'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n        'readOnlyRootFilesystem': False, \n        'allowPrivilegeEscalation': True, \n        'runAsUser':                '{{ uidNumber }}',\n        'runAsGroup':               '{{ gidNumber }}'\n    },\n    # 'imagePullSecrets': [ { 'name': name_of_secret } ]\n    'acl':  { 'permit': [ 'all' ] } } }\n\n
"},{"location":"3.0/config/desktop.pod/#common-options","title":"common options","text":""},{"location":"3.0/config/desktop.pod/#enable","title":"enable","text":"

A container is added to the user pod if 'enable': True

"},{"location":"3.0/config/desktop.pod/#acl","title":"acl","text":"

The container is added to the user pod if acl matches. acl is based on tags and rules. Read the authentification-rules abcdesktop documentation to defined tags.

"},{"location":"3.0/config/desktop.pod/#pullpolicy","title":"pullpolicy","text":"

The image use the kubernetes pull policy values :

Read the pullpolicy kubernetes documentation to get more details.

"},{"location":"3.0/config/desktop.pod/#waitportbin","title":"waitportbin","text":"

waitportbin is a binary command line, embedded inside the container, to check if the container is ready to run. Commonly it uses the tcpport value.

The command is run with parameters :

/composer/node/wait-port/node_modules/.bin/wait-port -t {waitportbintimeout}*1000 {container_ipaddr}:{container_tcpport}\n
"},{"location":"3.0/config/desktop.pod/#waitportbintimeout","title":"waitportbintimeout","text":"

waitportbintimeout is the timeout in seconds to get waitportbin command result.

"},{"location":"3.0/config/desktop.pod/#image","title":"image","text":"

Image describe the container image name ( by default 'image': 'abcdesktopio/oc.user.ubuntu:3.0')

"},{"location":"3.0/config/desktop.pod/#imagepullsecrets","title":"imagePullSecrets","text":"

The imagePullSecret entry is the list of the secret name used by kubernetes to access to the private registry. The type of imagePullSecret is a list. This option is used if you need to store the abcdesktop docker image on your a private registry.

 imagePullSecret : [ { 'name': name_of_secret } ]\n
kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=https://index.docker.io/v1/ --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=registry.mydomain.local:443 --docker-username=XXXXXXX --docker-password=YYYYYYYU\n

The imagePullSecret become in this sample

 imagePullSecret : [ { 'name': 'abcdesktopregistrysecret' } ]\n
"},{"location":"3.0/config/desktop.pod/#resources","title":"resources","text":"

Resources come from the kubernetes resources containers management. Read the resources kubernetes documentation to get more details.

"},{"location":"3.0/config/desktop.pod/#spec-entry","title":"spec entry","text":"

spec entry defines the spec entry for a pod. All kubernetes entries are supported. Some of them are overwrited by abcdesktop.

'spec' : {\n    'shareProcessNamespace': True,\n    'shareProcessMemory': True,\n    'shareProcessMemorySize': '256Mi',\n    'securityContext': { \n      'supplementalGroups': [ '{{ supplementalGroups }}' ],\n      'runAsUser': '{{ uidNumber }}',\n      'runAsGroup': '{{ gidNumber }}',\n      'readOnlyRootFilesystem': False, \n      'allowPrivilegeEscalation': True\n    }\n
"},{"location":"3.0/config/desktop.pod/#init-container","title":"init container","text":"

init container run the init command. It changes access right to the user home directory. The init command runs as root by default with a securityContext 'securityContext': {'runAsUser':0, 'runAsGroup':0 }.

The command support {{ }} values. Values can be

Values are read from the previous ldap authentification.

Example

 'command':  [ 'sh', '-c',  'chmod 755 ~ && chown {{ uidNumber }}:{{ gidNumber }} ~ || true' ]\n
"},{"location":"3.0/config/editconfig/","title":"How to edit pyos core service configuration file","text":"

The pyos core service configuration file name is od.config

"},{"location":"3.0/config/editconfig/#edit-your-configuration-file","title":"Edit your configuration file","text":"

If the od.config file does not exist, download the default od.config file and save it as od.config to your abcdesktop local directory.

To make change, edit your own od.config file

vim od.config \n
"},{"location":"3.0/config/editconfig/#make-changes","title":"Make changes","text":"

Change the defaultbackgroundcolors option in the desktop options.

Locate the line desktop.defaultbackgroundcolors and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'

desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF',  '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n

Save your local file od.config.

"},{"location":"3.0/config/editconfig/#apply-changes","title":"Apply changes","text":"

To apply changes, you can replace the abcdesktop-config

kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

Or you can also use the replace command kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run | kubectl replace -n abcdesktop -f -

"},{"location":"3.0/config/editconfig/#restart-pyos-pods","title":"Restart pyos pods","text":"
kubectl delete pods -l run=pyos-od -n abcdesktop\npod \"pyos-od-6fc597d444-qgzhc\" deleted\n
"},{"location":"3.0/config/editconfig/#check-your-changes","title":"Check your changes","text":"

To check that the new colours are presents in front, open the url http://localhost:30443, in your web browser, to start a simple abcdesktop.io container.

http://localhost:30443\n

You should see the abcdesktop.io home page.

Press the Sign-in Anonymously, have look

At the right top corner, click on the menu and choose Settings, then click on Screen Colors

Choose your colour and you should have it as background colour :

Great, you can easily update your configuration file od.config.

"},{"location":"3.0/config/frontjs/","title":"dock configuration in od.config","text":""},{"location":"3.0/config/frontjs/#menu-setting","title":"Menu Setting","text":"

The menu can be changed using the dictionnary object menuconfig

menuconfig : {\n    'settings'  : True, \n    'appstore'  : True, \n    'screenshot'    : True, \n    'download'  : True, \n    'logout'        : True, \n    'disconnect'    : True \n}\n
"},{"location":"3.0/config/frontjs/#default-dock-config","title":"default dock config","text":"

The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock option is a dictionnary read by the front web as a json object.

docker entry Descriptions filemanager FileManager application terminal Terminal application webshell HTML 5, terminal application based on xterm.js webshorcut Web browser url launch inside the container
dock : {       \n    'filemanager':  {       'args': None,\n                            'showinview': u'dock',\n                            'name': u'FileManager',\n                            'keyword': u'files,file manager',\n                            'launch': u'nautilus.Nautilus',\n                            'displayname': u'FileManager',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,office',\n                            'id': u'filemanager.d',\n                            'icon': u'pantheon-files-icons.svg' },\n    'terminal':     {       'args': '',\n                            'name': u'TerminalBuiltin',\n                            'keyword': u'terminal,shell,bash,builtin,pantheon',\n                            'launch': u'qterminal.qterminal',\n                            'displayname': u'Terminal Builtin',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,development',\n                            'id': u'terminalbuiltin.d',\n                            'hideindock': True,\n                            'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n    'webshell':     {       'name': u'WebShell',\n                            'keyword': u'terminal,shell,webshell,bash',\n                            'launch': u'frontendjs.webshell',\n                            'displayname': u'Web Shell',\n                            'execmode': u'frontendjs',\n                            'cat': u'utilities,development',\n                            'id': u'webshell.d',\n                            'icon': u'webshell.svg' }\n}\n
"},{"location":"3.0/config/frontjs/#additional-applications","title":"Additional applications","text":"

This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' } add

'webshortcut':  {   'name': u'xlogo',\n                    'showinview': u'dock',\n                    'keyword': u'xlogo',\n                    'execmode': u'builtin',\n                    'launch': u'/usr/bin/xlogo',\n                    'displayname': u'xlogo',\n                    'execmode': u'builtin',\n                    'cat': u'utilities',\n                    'id': u'xlogo.d',\n                    'icon': u'xlogo.svg',\n                    'hideindock': False,\n                    'args': '' \n}\n
"},{"location":"3.0/config/host_config/","title":"host_config resource description","text":"

host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

The same host_config format is reused in a multiple configuration files. host_config is present in applist.json file to build application image, and in od.config to set default running values in desktop and in application.

For example you can set low cpu and memory values to an application like the great X11 xeyes.

{   \n    \"mem_limit\":  \"32M\", \n    \"shm_size\":   \"OM\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n
"},{"location":"3.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period int The length of a CPU period in microseconds. cpu_quota int Microseconds of CPU time that the container can get in a CPU period. cpu_shares int CPU shares relative weight. cpuset_cpus str CPUs in which to allow execution 0 3 0 1 . cpuset_mems str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules list A list of cgroup rules to apply to the container. device_read_bps bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops IO per second Limit read rate from a device. device_write_bps bytes per second Limit write rate from a device. device_write_iops IO per second Limit write rate from a device. devices list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode str Set the IPC mode for the container. mem_limit float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation float or str Memory soft limit mem_swappiness int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable bool Whether to disable OOM killer. oom_score_adj int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size str or int Size of /dev/shm e.g. 1G. cap_add list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}for example to permit the call ptrace: SYS_PTRACE, trace arbitrary processes using ptrace, and SYS_ADMIN, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop list of str Drop kernel capabilities. dns list Set custom DNS servers. dns_opt list Additional options to be added to the container\u2019s resolv.conf file dns_search list DNS search domains. extra_hosts dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add list List of additional group names and/or IDs that the container process will run as. isolation str Isolation technology to use. Default: None. pid_mode str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged bool Give extended privileges to this container. security_opt list A list of string values to customize labels for MLS systems such as SELinux. storage_opt dict Storage driver options per container as a key value mapping. sysctls dict Kernel parameters to set in the container. ulimits list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode str Sets the UTS namespace mode for the container. Supported values are: host runtime str Runtime to use with this container. network_mode str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"3.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"3.0/config/host_config/#auto_remove","title":"auto_remove","text":"

The auto_remove is use to remove or not remove an abcdesktop container application or desktop.

For example, when an application container is exited, do we need to remove the container, by running the docker rm command ?

By default the auto_remove is True. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False. Set this value to False only to troubleshoot an application.

In production this value MUST be set to True

"},{"location":"3.0/config/host_config/#cpu_period-cpu_quota","title":"cpu_periodcpu_quota","text":"

cpu_period Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.

cpu-quota impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.

"},{"location":"3.0/config/host_config/#privileged","title":"privileged","text":"

The privileged option runs a user container in privileged mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.

"},{"location":"3.0/config/host_config/#ipc_mode","title":"ipc_mode","text":"

The ipc_mode value is a string, the default value is 'shareable'. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.

value description '' Use daemon default. 'none' Own private IPC namespace. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system IPC namespace.

If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"3.0/config/host_config/#security_opt","title":"security_opt","text":"

The securityopt option allow to set the security_opt default value for a docker application container. security_opt is the docker parameter.

Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.

Syscall Description acct Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT. add_key Prevent containers from using the kernel keyring, which is not namespaced. bpf Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN. clock_adjtime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clock_settime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clone Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN for CLONE_* flags, except CLONE_USERNS. create_module Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE. delete_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. finit_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. get_kernel_syms Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. init_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. ioperm Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. iopl Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. kcmp Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. kexec_file_load Sister syscall of kexec_load that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT. kexec_load Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT. keyctl Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN. mbind Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. mount Deny mounting, already gated by CAP_SYS_ADMIN. move_pages Syscall that modifies kernel memory and NUMA settings. name_to_handle_at Sister syscall to open_by_handle_at. Already gated by CAP_DAC_READ_SEARCH. nfsservctl Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH. perf_event_open Tracing/profiling syscall, which could leak a lot of information on the host. personality Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root Deny pivot_root, should be privileged operation. process_vm_readv Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. process_vm_writev Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. ptrace Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE, because it could leak a lot of information on the host. query_module Deny manipulation and functions on kernel modules. Obsolete. quotactl Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN. reboot Don't let containers reboot the host. Also gated by CAP_SYS_BOOT. request_key Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. setns Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN. settimeofday Time/date is not namespaced. Also gated by CAP_SYS_TIME. stime Time/date is not namespaced. Also gated by CAP_SYS_TIME. swapon Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. swapoff Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. sysfs Obsolete syscall. _sysctl Obsolete, replaced by /proc/sys. umount Should be a privileged operation. Also gated by CAP_SYS_ADMIN. umount2 Should be a privileged operation. Also gated by CAP_SYS_ADMIN. unshare Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN, with the exception of unshare --user. uselib Older syscall related to shared libraries, unused for a long time. userfaultfd Userspace page fault handling, largely needed for process migration. ustat Obsolete syscall. vm86 In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN. vm86old In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN.

Read security_opt from the docker website.

"},{"location":"3.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilities cap_addcap_drop","text":"

This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :

securityContext:\n      capabilities:\n        desktop.capabilities\n

For example

    { \n        'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n    }\n

Permit a container to call ptrace:

Read the docker run command informations Docker run reference

By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.

Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.

Further reference information is available on the capabilities(7) - Linux man page

Set this value only to troubleshoot an application.

In production this value MUST be set to an empty dict {}

"},{"location":"3.0/config/jira/","title":"JIRA configuration","text":"

abcdesktop.io support JIRA

"},{"location":"3.0/config/jira/#jira-option","title":"JIRA option","text":"

In od.config add the jira option. jira option is a dictionary with the entries :

entry sample value \u00a0\u00a0 url https://domainexample.atlassian.net/ project_id ABCD username account@domain.local apikey XXXXXXXXXXXXXXXXXXXX

And fill the dictionary

jira : { \n            'url':          'https://domainexample.atlassian.net/',\n            'project_id':   'ABCD',\n            'username':     'account@domain.local',\n            'apikey' :      'XXXXXXXXXXXXXXXXXXXX' }\n

Then apply the new configuration file od.config by retrasting the daemon.

When jira option is set, a new icon issue appears at the top.

Click on the issue icon, a new window is appear.

Fill Summary and Your Report values

Then press the Send button. A notification message appears on the left top corner.

Log into your jira server, and check your backlog

Great you added a new issue tracking.

"},{"location":"3.0/config/language/","title":"Language entry in od.config","text":"

The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US

"},{"location":"3.0/config/language/#language-in-abcdesktopio-ocuser","title":"Language in abcdesktop.io oc.user","text":"

The language list must match with the oc.user local packages all ready installed.

If the language is not found, the default value is set to en_US

The oc.user.18.04 is built-in with the default language package :

apt-get install -y \\\n    language-pack-en \\\n    language-pack-fr \\\n    && locale-gen    \\\n    && apt-get clean\n

The full supported language list is set by default

language : [  'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n

This list must match with the Accept-Language request HTTP header.

"},{"location":"3.0/config/language/#language-in-abcdesktopio-applications","title":"Language in abcdesktop.io Applications","text":"

abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language request HTTP header. If the language is not found, the default value is set to en_US.

Hands-on:

Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.

"},{"location":"3.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language to en_US :","text":"

The launch LibreOffice Writer. The menu is set to en_US LibreOffice Writer use English/US en_US language.

"},{"location":"3.0/config/language/#set-the-web-browsers-default-language-to-fr_fr","title":"Set the web browser's default language to fr_FR :","text":"

You can keep the same abcdesktop.io users session, you do not need to logout.

The launch LibreOffice Writer. The menu is set to fr_FR LibreOffice Writer use French fr_FRlanguage.

Great you have change the language settings of applications running inside an abcdesktop docker container

"},{"location":"3.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"3.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"

By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.

Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:

sudo vi /etc/rsyslog.conf\n

Uncomment the following lines and save file :

module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n

"},{"location":"3.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"

Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:

sudo systemctl restart rsyslog\n

"},{"location":"3.0/config/logging/","title":"Logging configuration in od.config","text":"

The logging configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.

logging dict use the python logging module logging module

The syslog and graylog protocol messaging are supported too.

The default features for each handlers are :

handler Features console log message using a logging.StreamHandler to the stream: ext://sys.stdout formated as standard cherrypy_console log message using a logging.StreamHandler to the stream: ext://sys.stdout formatted as access cherrypy_access log message using a logging.StreamHandler to the file stream logs/access.log formatted as access cherrypy_trace log message using a logging.StreamHandler to the stream: logs/trace.log formatted as standard

Sub modules used by od.py can log information too.

Sub module Default Values docker.utils.config{ 'level': 'INFO' },urllib3.connectionpool{ 'level': 'ERROR'},

The logging sample configuration :

#              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
"},{"location":"3.0/config/networkpolicy/","title":"NetworkPolicy","text":""},{"location":"3.0/config/networkpolicy/#goals","title":"Goals","text":""},{"location":"3.0/config/networkpolicy/#authors","title":"Authors","text":"

jpxavier-oio has designed the network policy for abcdesktop.io

"},{"location":"3.0/config/networkpolicy/#requirements","title":"Requirements","text":""},{"location":"3.0/config/networkpolicy/#networkpolicy-description","title":"NetworkPolicy description","text":"

There are two sorts of isolation defined in abcdesktop : the NetworkPolicy rights and the NetworkPolicy permits.

"},{"location":"3.0/config/networkpolicy/#networkpolicy-example","title":"NetworkPolicy example","text":"

The NetworkPolicy examples describe the network policies for the internal memcached pod and the user's pods.

"},{"location":"3.0/config/networkpolicy/#networkpolicy-rights-and-permits-for-the-memcached","title":"NetworkPolicy rights and permits for the memcached.","text":"

The memcached service is listening on TCP port 11211. The NetworkPolicy for memcached service rights, named memcached-rights, allows pods with label run: memcached-od to expose the TCP port 11211.

apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: memcached-rights\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      run: memcached-od\n  policyTypes:\n  - Ingress\n  ingress:\n  - ports:\n    - protocol: TCP\n      port: 11211\n    from:\n    - podSelector:\n        matchLabels:\n          netpol/memcached: 'true'\n    - namespaceSelector:\n        matchLabels:\n          name: kube-monitor\n      podSelector:\n        matchLabels:\n          netpol/metrics: 'true'\n

The NetworkPolicy for memcached service permits, named memcached-permits, allows all pods with label netpol/memcached: 'true' to reach the TCP port 11211 to pods with label run: memcached-od.

apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: memcached-permits\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      netpol/memcached: 'true'\n  policyTypes:\n  - Egress\n  egress:\n  - ports:\n    - protocol: TCP\n      port: 11211\n    to:\n    - podSelector:\n        matchLabels:\n          run: memcached-od\n---\n
"},{"location":"3.0/config/networkpolicy/#networkpolicy-rights-and-permits-for-the-users-pods","title":"NetworkPolicy rights and permits for the user's pods.","text":"

The ocuser pod is listening on TCP ports :

The network policy for ocuser's pods rights is named ocuser-rights. It allows pods with label type: 'x11server' to expose the previous TCP ports.

The egress network policy allows :

apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: ocuser-rights\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      type: 'x11server'\n  policyTypes:\n  - Ingress\n  - Egress\n  ingress:\n  - from:\n    - podSelector:\n        matchLabels:\n          netpol/ocuser: 'true'\n    ports:\n    - protocol: TCP\n      port: 4714\n    - protocol: TCP\n      port: 6081\n    - protocol: TCP\n      port: 8000\n    - protocol: TCP\n      port: 29780\n    - protocol: TCP\n      port: 29781\n    - protocol: TCP\n      port: 29782\n    - protocol: TCP\n      port: 29783\n    - protocol: TCP\n      port: 29784\n    - protocol: TCP\n      port: 29785\n    # spawner_service_tcp_port\n    - protocol: TCP\n      port: 29786\n  egress:\n  # pod user can run dns query to all kube-system\n  - ports:\n    - protocol: TCP\n      port: 53\n    - protocol: UDP\n      port: 53\n    to:\n    - namespaceSelector:\n        matchLabels:\n          name: kube-system\n      podSelector:\n        matchLabels:\n          k8s-app: kube-dns\n# permit www website from pod user \n  - ports:\n    - protocol: TCP\n      port: 443\n    - protocol: TCP\n      port: 80\n# permit kerberos auth kinit\n  - ports:\n    - protocol: UDP\n      port: 88\n    - protocol: TCP\n      port: 88\n

The network policy for ocuser's pods permits is named ocuser-permits. It allows pods with label netpol/ocuser: 'true' to reach the user's pods services.

apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: ocuser-permits\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      netpol/ocuser: 'true'\n  policyTypes:\n  - Egress\n  egress:\n  - to:\n    - podSelector:\n        matchLabels:\n          type: 'x11server'\n    ports:\n    # default pulseaudio websocket audio without webrtc gateway\n    - protocol: TCP\n      port: 4714\n    # vnc websockify\n    - protocol: TCP\n      port: 6081\n    # reserved\n    - protocol: TCP\n      port: 29780\n    # xterm_tcp_port\n    - protocol: TCP\n      port: 29781\n    # printerfile_service_tcp_port\n    - protocol: TCP\n      port: 29782\n    # file_service_tcp_port\n    - protocol: TCP\n      port: 29783\n    # broadcast_tcp_port \n    - protocol: TCP\n      port: 29784\n    # reserved\n    - protocol: TCP\n      port: 29785\n    # spawner_service_tcp_port\n    - protocol: TCP\n      port: 29786\n
"},{"location":"3.0/config/networkpolicy/#apply-the-default-netpol-defaultyaml-file","title":"Apply the default netpol-default.yaml file","text":"

To apply the network policies run the command :

kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default.yaml\n

The command returns

networkpolicy.networking.k8s.io/abcdesktop-rights created\nnetworkpolicy.networking.k8s.io/memcached-rights created\nnetworkpolicy.networking.k8s.io/memcached-permits created\nnetworkpolicy.networking.k8s.io/mongodb-rights created\nnetworkpolicy.networking.k8s.io/mongodb-permits created\nnetworkpolicy.networking.k8s.io/speedtest-rights created\nnetworkpolicy.networking.k8s.io/speedtest-permits created\nnetworkpolicy.networking.k8s.io/pyos-rights created\nnetworkpolicy.networking.k8s.io/pyos-permits created\nnetworkpolicy.networking.k8s.io/nginx-rights created\nnetworkpolicy.networking.k8s.io/nginx-permits created\nnetworkpolicy.networking.k8s.io/ocuser-rights created\nnetworkpolicy.networking.k8s.io/ocuser-permits created\nnetworkpolicy.networking.k8s.io/authentication-permits created\nnetworkpolicy.networking.k8s.io/ldap-permits created\nnetworkpolicy.networking.k8s.io/ldap-rights created\nnetworkpolicy.networking.k8s.io/smtp-permits created\nnetworkpolicy.networking.k8s.io/https-permits created\nnetworkpolicy.networking.k8s.io/storage-permits created\nnetworkpolicy.networking.k8s.io/coredns-permits created\nnetworkpolicy.networking.k8s.io/apiserver-permits created\nnetworkpolicy.networking.k8s.io/graylog-permits created\n
"},{"location":"3.0/config/networkpolicy/#test-the-network-policies","title":"Test the network policies","text":"
curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n

This http request is denied by the network policy and you should get an error message

You should get an error message, the user's pod can't reach https://pyos.abcdesktop.svc.cluster.local:8000/API.

"},{"location":"3.0/config/networkpolicy/#disable-the-network-policies","title":"Disable the network policies","text":"

To disable the network policies, run the kubectl delete command :

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default.yaml\n
curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n

You should get a json document as http response

{}\n

You may need to update the netpol-default.yaml file with your own values.

"},{"location":"3.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"3.0/config/stack/#stackmode","title":"stack.mode","text":"

stack.mode describes how abcdesktop.io can manage user's containers and application.

stack.mode Description standalone Use a dockerd only, this is for personal usage kubernetes Use a kubernetes services"},{"location":"3.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"

stack.kubernetesdefaultdomain is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes.

The default value is abcdesktop.svc.cluster.local

If option value mongodb or memcached are set, the values are NOT overridden, and keep unchanged.

If option value mongodb or memcached are set to None (by default), then stack.kubernetesdefaultdomain is used to complete the FQDN of mongodb and memcached servers name. This value is concatenated to the server hostname.

Hostname FQDN mongodbmongodb.abcdesktop.svc.cluster.localmemcachedmemcached.abcdesktop.svc.cluster.local

The dns resolution need a running core-dnsis the namespace kube-system

stack.kubernetesdefaultdomain is used also if desktop.desktopuseinternalfqdn: True

The pod name FQDN is built using the $podid.desktop.$stack.kubernetesdefaultdomain

For example, by default :

c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local

"},{"location":"3.0/config/sudo-kubernetes/","title":"Sudo kubernetes","text":""},{"location":"3.0/config/sudo-kubernetes/#how-to-get-a-root-access-inside-a-container-running-kubernetes-abcdesktop","title":"How to get a root access inside a container running kubernetes abcdesktop ?","text":"

run the sudo command inside the user kubernetes pods

balloon@43c2ef50-a7b9-4e36-8a9d-8ac3ce80180e:~$ sudo bash\nsudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?\n
"},{"location":"3.0/config/sudo-kubernetes/#edit-the-odconfig-file","title":"Edit the od.config file","text":"

In the securityContext add the entry 'allowPrivilegeEscalation': True

desktop.pod : {\n  'spec'   : {\n    'shareProcessMemorySize': '512Mi',\n    'shareProcessMemory': True,\n    'shareProcessNamespace': True,\n    'securityContext': { \n      'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n      'readOnlyRootFilesystem': False, \n      'allowPrivilegeEscalation': True, \n      'runAsUser': '{{ uidNumber }}',\n      'runAsGroup': '{{ gidNumber }}',\n      'capabilities': { \n        'add': [ \"SYS_ADMIN\", \"CAP_SYS_ADMIN\", \"CAP_DAC_OVERRIDE\"]\n      }\n    }\n  }\n...\n
"},{"location":"3.0/config/sudo-kubernetes/#update-the-kubernetes-config-with-the-new-abcdesktopyaml","title":"Update the kubernetes config with the new abcdesktop.yaml","text":"
kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
"},{"location":"3.0/config/sudo-kubernetes/#restart-the-pyos-pod","title":"Restart the pyos pod","text":"

Delete the pyos pod

kubectl delete pods -l run=pyos-od  -n abcdesktop\npod \"pyos-od-5586b88767-gsdl8\" deleted\n
  1. Make sure that your user has done a logoff his pod, then login again and run terminal web shell

The default balloon password is lmdpocpetit

balloon@c182dc39-6a00-4869-8b01-2039f37c1eab:~$ sudo bash\n[sudo] password for balloon: \nroot@c182dc39-6a00-4869-8b01-2039f37c1eab:~# id\nuid=0(root) gid=0(root) groups=0(root),105(lpadmin)\nroot@c182dc39-6a00-4869-8b01-2039f37c1eab:~#  \n

After the sudo command, you get a root level inside the shell of the users's pod

In production this value should be set to False

"},{"location":"3.0/config/syslog/","title":"Syslog configuration in od.config","text":""},{"location":"3.0/config/syslog/#add-syslog-server-support","title":"Add syslog server support","text":"
   'filters': [ 'odcontext' ],\n

syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.

syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.

"},{"location":"3.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"

Those running linux can simply modify their syslog configuration file following linux syslog config steps

For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :

docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
[2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
"},{"location":"3.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"

To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)

"},{"location":"3.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"

In handlers entry add the following lines:

        ,\n        'syslog': {\n          'class': 'logging.handlers.SysLogHandler',\n          'filters': [ 'odcontext' ],\n          'formatter': 'syslog',\n          'socktype': 2,\n          'address' : [ '192.168.0.52', 514 ]\n        }\n

Replace 192.168.0.52 ip address by your local IP Addresse.

You can get your local IP address using the following command:

hostname -I | cut -d ' ' -f1\n
"},{"location":"3.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"

In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog' handler in handlers list:

        '': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'INFO'\n        }\n\n       'cherrypy.error': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'ERROR',\n          'propagate': False\n        }\n
"},{"location":"3.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"
#              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    },\n    'syslog': {\n       'class': 'logging.handlers.SysLogHandler',\n       'filters': [ 'odcontext' ],\n       'formatter': 'syslog',\n       'socktype': 2,\n       'address' : [ '192.168.0.52', 514 ]\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
"},{"location":"3.0/config/syslog/#restart-pods","title":"Restart Pods","text":"

To restart Pods, we will delete and recreate all pods

"},{"location":"3.0/config/syslog/#delete-pods","title":"Delete pods","text":"

To delete pods, execute the following command:

kubectl delete -f abcdesktop.yaml\n
"},{"location":"3.0/config/syslog/#create-pods","title":"Create pods","text":"

To create pods, execute the following command:

kubectl create -f abcdesktop.yaml\n
"},{"location":"3.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"

At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:

tail /var/log/syslog\n

If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.

"},{"location":"3.0/config/volumes/","title":"Define volumes to retain user's home directory files","text":"

To retain user's home directory files, you can define

"},{"location":"3.0/config/volumes/#define-persistentvolume-using-hostpath","title":"Define persistentVolume using hostPath","text":"

In your od.config file, define the new entries desktop.homedirectorytype desktop.persistentvolumespec desktop.persistentvolumeclaimspec

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\n\n# define how to create persistentvolume\ndesktop.persistentvolumespec: {\n            'storageClassName': '',\n            'capacity': { 'storage': '1Gi' },\n            'accessModes': [ 'ReadWriteOnce' ], \n            'hostPath': { 'path': '/mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}' } }\n\n# define how to create persistentvolumeclaim\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': '',\n            'resources': { \n              'requests': { \n                'storage': '1Gi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n

desktop.persistentvolumespec support template values. For example '/mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}'.

The list of all template values can be read at the end of this chapter

The user's home directory inside the pod is located on host to /mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}. The directory is created automatically by kubernetes.

The /mnt/abcdesktop_volumes/ content lists the provider name.

On the host, the new directory is created, where each home directory is located.

Read the new path for 'hostPath' persistent volumes

ls -la /mnt/abcdesktop_volumes/\ntotal 20\ndrwxr-xr-x   5 root root 4096 mai   12 12:40 .\ndrwxr-xr-x 106 root root 4096 mai   11 11:34 ..\ndrwxr-xr-x   3 root root 4096 mai   12 12:40 anonymous\ndrwxr-xr-x   3 root root 4096 mai   12 12:39 github\ndrwxr-xr-x   5 root root 4096 mai   12 12:40 google\n

For provider google, all users are listed.

ls -la /mnt/abcdesktop_volumes/google/\ntotal 20\ndrwxr-xr-x  5 root root 4096 mai   12 12:40 .\ndrwxr-xr-x  5 root root 4096 mai   12 12:40 ..\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:39 103464335761332102620\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:40 112026272437223559761\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:39 114102844260599245242\n

For provider google, list the user home directory for the user 103464335761332102620

ls -la /mnt/abcdesktop_volumes/google/103464335761332102620/\ntotal 76\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:39 .\ndrwxr-xr-x  5 root root 4096 mai   12 12:40 ..\n-rw-------  1 2048 2048   71 mai   12 12:39 .Xauthority\n-rw-rw-r--  1 2048 2048   12 janv. 27 18:36 .Xresources\ndrwxr-x---  3 2048 2048 4096 mai   12 12:39 .cache\ndrwxr-x---  6 2048 2048 4096 mai   12 12:39 .config\ndrwxrwxr-x  3 2048 2048 4096 janv. 27 18:36 .gconf\n-rw-r-----  1 2048 2048    0 mai   12 12:39 .gtk-bookmarks\n-rw-rw-r--  1 2048 2048  564 janv. 27 18:36 .gtkrc-2.0\ndrwxr-x---  3 2048 2048 4096 mai   12 12:39 .local\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 .store\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 .wallpapers\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Desktop\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Documents\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Downloads\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Music\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Pictures\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Public\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Templates\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Videos\n
"},{"location":"3.0/config/volumes/#list-of-all-template-values","title":"list of all template values","text":"

The template values can be one of them :

var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale template tag value tag value set by auth rules

Note: hostPath supports file permissions and the pod's init commands chown or chmod can be used. The hostPath can also be a mount point, using nfs.

"},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-storageclassname","title":"Define persistentVolumeClaim using storageClassName","text":"

To define a persistentVolumeClaim, update the od.config file and set

desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: <YOUR_PERSISTENT_VOLULME_CLAIM_SPEC>\n

desktop.persistentvolumeclaimspec is a dictionary. Get more information about PersistentVolume and PersistentVolumeClaim.

For example

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': 'mystorageclass',\n            'resources': { \n              'requests': { \n                'storage': '1Gi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n

Replace mystorageclass by storageclass of your cloud provider

kubectl get storageclass\n

The example output is as follows on the cloud provider aws.

NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE\ngp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false \n

The example output is as follows on the cloud provider digitalocean.

NAME                          PROVISIONER                    RECLAIMPOLICY          Immediate           false                  3h22m\ndo-block-storage (default)    dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-retain       dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\ndo-block-storage-xfs          dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-xfs-retain   dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\n
"},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-csi-driver-nfs","title":"Define persistentVolumeClaim using csi-driver-nfs","text":"

In this example, we use nfs to share user home directory with each worker node

Use the https://github.com/kubernetes-csi/csi-driver-nfs as a csi-driver-nfs with a nfs server as backend.

"},{"location":"3.0/config/volumes/#on-the-nfs-server","title":"On the nfs server","text":"

On the nfs server, create an export with the no_root_squash option

For example export /volume1/pods

/volume1/pods        192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
"},{"location":"3.0/config/volumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs","text":"

Run the install install-driver.sh command from kubernetes-csi/csi-driver-nfs GitHub repository.

curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n

Create a storage class file nfs-csi-sc-ds01.yaml,

Content of the default nfs-csi-sc-ds01.yaml

apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n  server: 192.168.7.101\n  share: /volume1/pods\n  mountPermissions: \"0755\"\n  # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n  # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n  # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n  - nfsvers=3\n
kubectl apply -f nfs-csi-sc-ds01.yaml\n

You read the response on stdout

storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n

Check the storage class nfs-csi-sc-ds01

kubectl get sc\nNAME                 PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE\nnfs-csi-sc-ds01      nfs.csi.k8s.io   Delete          Immediate           false                  18m\n
"},{"location":"3.0/config/volumes/#update-the-odconfig-file","title":"Update the od.config file","text":"

In your od.config file, define the entry desktop.persistentvolumeclaimspec

The PersistentVolume and PersistentVolumeClaim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': 'nfs-csi-sc-ds01',\n            'resources': { \n              'requests': { \n                'storage': '500Mi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n

Update the new config file and restart pyos pod

kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n
"},{"location":"3.0/config/volumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

Login as user (Philip J. Fry, fry)

The new desktop for Philip J. Fry is created.

Start the web shell command using the search bar

Using the web shell application start the df command

The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32

"},{"location":"3.0/config/volumes/#list-the-persistentvolume-and-persistentvolumeclaim","title":"List the PersistentVolume and PersistentVolumeClaim","text":"

List the new PersistentVolume

kubectl get pv \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS      REASON   AGE\npvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32   25Mi       RWO            Delete           Bound    abcdesktop/planet-fry-9372f   nfs-csi-sc-ds01            3m\n

List the new PersistentVolumeClaim

kubectl get pvc -n abcdesktop \nNAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE\nplanet-fry-9372f   Bound    pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32   25Mi       RWO            nfs-csi-sc-ds01   5m7s\n

Get the PersistentVolumeClaim's description

kubectl describe pvc planet-fry-9372f -n abcdesktop \nName:          planet-fry-9372f\nNamespace:     abcdesktop\nStorageClass:  nfs-csi-sc-ds01\nStatus:        Bound\nVolume:        pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32\nLabels:        access_provider=planet\n               access_providertype=ldap\n               access_userid=fry\nAnnotations:   pv.kubernetes.io/bind-completed: yes\n               pv.kubernetes.io/bound-by-controller: yes\n               volume.beta.kubernetes.io/storage-provisioner: nfs.csi.k8s.io\n               volume.kubernetes.io/storage-provisioner: nfs.csi.k8s.io\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      25Mi\nAccess Modes:  RWO\nVolumeMode:    Filesystem\nUsed By:       fry-87066\nEvents:\n  Type    Reason                 Age              From                                                        Message\n  ----    ------                 ----             ----                                                        -------\n  Normal  ExternalProvisioning   7m (x2 over 7m)  persistentvolume-controller                                 Waiting for a volume to be created either by the external provisioner 'nfs.csi.k8s.io' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.\n  Normal  Provisioning           7m               nfs.csi.k8s.io_kadmin_1c28f3c9-91ee-4aa0-b991-8c17c46133d3  External provisioner is provisioning volume for claim \"abcdesktop/planet-fry-9372f\"\n  Normal  ProvisioningSucceeded  7m               nfs.csi.k8s.io_kadmin_1c28f3c9-91ee-4aa0-b991-8c17c46133d3  Successfully provisioned volume pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32\n
"},{"location":"3.0/config/volumes/#set-quota-for-user-homedir","title":"Set quota for user homedir","text":"

Steps : - Define posixAccount in the ldap directory service - Define quota on the nfs server

The user fry has a posixAccount description in the embedded directory service cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com

Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry uidNumber 1049 gidNumber 2049 \u00a0homeDirectory: \u00a0/home/fry

On the nfs server, define a quota for uid fry. In this case, I use truenas as nfs server.

Create the fry user with the same attribute and value.

On the Storage |\u00a0Pools |\u00a0User Quotas, define a quota for the user fry

Set the quota value for fry

"},{"location":"3.0/config/volumes/#login-to-your-abcdesktop-service_1","title":"Login to your abcdesktop service","text":"

Delete previous pvc and pv for the fry user, if need.

Login as user (Philip J. Fry, fry)

The new desktop for Philip J. Fry is created.

Start the web shell command using the search bar

Using the web shell application start the dd commands

Run a dd command to reach the quota value (50 MiB is this case).

dd if=/dev/urandom of=quota-test-file\ndd: writing to 'quota-test-file': Disk quota exceeded\n1127945+0 records in\n1127944+0 records out\n577507328 bytes (578 MB, 551 MiB) copied, 14.6404 s, 39.4 MB/s\n

You should get the error Disk quota exceeded. The size of quota-test-file is over a the quota limit.

50 MB is 52,428,800 Bytes

ls -la quota-test-file \n-rw-r----- 1 fry fry 58720256 Aug 25 15:16 quota-test-file\n

The user should not be able to create new file

dd if=/dev/zero of=quota-test-file2\ndd: failed to open 'quota-test-file2': Disk quota exceeded\n

The nfs server has returned an error if the user tries to create more than 50 MiB.

"},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-k8s-csi-s3","title":"Define persistentVolumeClaim using k8s-csi-s3","text":"

In this example, we use s3 to share user home directory with each worker node

Use the https://github.com/yandex-cloud/k8s-csi-s3 as a CSI for S3 with minio as backend.

Follow https://github.com/yandex-cloud/k8s-csi-s3 setup guide and test with the sample pod to make sure that fuse mounts the S3 file system.

"},{"location":"3.0/config/volumes/#update-storageclassyaml-file","title":"Update storageclass.yaml file","text":"
---\nkind: StorageClass\napiVersion: storage.k8s.io/v1\nmetadata:\n  name: csi-s3\nprovisioner: ru.yandex.s3.csi\nparameters:\n  mounter: geesefs \n  # you can set mount options here, for example limit memory cache size (recommended)\n  options: \"--memory-limit 1000 --dir-mode 0777 --file-mode 0666 --setuid 0\"\n  # to use an existing bucket, specify it here:\n  # bucket: abcdesktop\n  csi.storage.k8s.io/provisioner-secret-name: csi-s3-secret\n  csi.storage.k8s.io/provisioner-secret-namespace: kube-system\n  csi.storage.k8s.io/controller-publish-secret-name: csi-s3-secret\n  csi.storage.k8s.io/controller-publish-secret-namespace: kube-system\n  csi.storage.k8s.io/node-stage-secret-name: csi-s3-secret\n  csi.storage.k8s.io/node-stage-secret-namespace: kube-system\n  csi.storage.k8s.io/node-publish-secret-name: csi-s3-secret\n  csi.storage.k8s.io/node-publish-secret-namespace: kube-system\n

Update the csi-s3 storage class to add --setuid 0 as options

kubectl delete sc csi-s3\nkubectl create -f storageclass.yaml\n
"},{"location":"3.0/config/volumes/#update-odconfig","title":"Update od.config","text":"

In your od.config file, define the entry desktop.persistentvolumeclaimspec

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': 'csi-s3',\n            'resources': { \n              'requests': { \n                'storage': '1Gi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n
"},{"location":"3.0/config/volumes/#init-command-options-has-no-file-permissions-support","title":"init command options has no file permissions support","text":"

By default the storageclass use mounter: geesefs. geesefs does not store file permissions and the init commands chown or chmod exit with no zero value, then the pod does not start. All files belongs to root, but with correct permissions options: \"--memory-limit 1000 --dir-mode 0777 --file-mode 0666 --setuid 0\".

Update the 'init' in desktop.pod dict

'init': { \n    'image': 'busybox',\n    'enable': True,\n    'pullpolicy':  'IfNotPresent',\n    'securityContext': {\n        'runAsUser':   0,\n        'runAsGroup':  0 \n    },\n    'acl':  { 'permit': [ 'all' ] },\n    'command':  [ 'sh', '-c',  'chown {{ uidNumber }}:{{ gidNumber }} ~ || true && chmod 750 ~ || true' ] \n  }\n

Apply the new configuration file and restart pyos pods

kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n

Login to abcdestkop service using your web browser.

List the persistent volumes

kubectl get pv\nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                             STORAGECLASS               REASON   AGE\npvc-81a65ed9-b98e-462c-86c6-36c89c3d4f1b   1Gi        RWO            Delete           Bound    abcdesktop/github-12896316-96cb5                  csi-s3                              2m46s\n

List the persistent volume claims

# kubectl get pvc -n abcdesktop\nNAME                                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE\ngithub-12896316-96cb5                  Bound    pvc-81a65ed9-b98e-462c-86c6-36c89c3d4f1b   1Gi        RWO            csi-s3                     2m21s\n
"},{"location":"3.0/config/webrtc/","title":"Sound server configuration","text":"

By default abcdesktop use the module-http-protocol-tcp from pulseaudio sound server to send wav data to the web browser

"},{"location":"3.0/config/webrtc/#pulseaudio-http-stream-by-default","title":"pulseaudio http stream (by default)","text":"

By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)

In terminal webshell run the command :

pactl -s /tmp/.pulse.sock list short modules\n
balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
"},{"location":"3.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"

To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)

abcdesktop update the pulseaudio configuration, and add module-rtp-send. The module-rtp-send pusleaudio send to the destination_ip (in this example 1.2.3.4)

pactl -s /tmp/.pulse.sock list short modules\n
balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0       module-augment-properties\n1       module-null-sink        sink_name=rtp  format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2       module-native-protocol-unix     auth-group=balloon socket=/tmp/.pulse.sock\n3       module-always-sink\n4       module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n

The sink_name is rtp, and the source for the module-rtp-send is rtp.monitor.

The default source is rtp.monitor

Source #\n        State: RUNNING\n        Name: rtp.monitor\n        Description: Monitor of RTP Multicast Sink\n        Driver: module-null-sink.c\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Owner Module: 5\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Base Volume: 65536 / 100% / 0.00 dB\n        Monitor of Sink: rtp\n        Latency: 0 usec, configured 160000 usec\n        Flags: DECIBEL_VOLUME LATENCY \n        Properties:\n                device.description = \"Monitor of RTP Multicast Sink\"\n                device.class = \"monitor\"\n                device.icon_name = \"audio-input-microphone\"\n        Formats:\n                pcm\n

The default output is

\nSource Output #0\n        Driver: module-rtp-send.c\n        Owner Module: 9\n        Client: n/a\n        Source: 4\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n        Corked: no\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Buffer Latency: 0 usec\n        Source Latency: 0 usec\n        Resample method: n/a\n        Properties:\n                media.name = \"RTP Monitor Stream\"\n                rtp.source = \"0.0.0.0\"\n                rtp.destination = \"1.2.3.4\"\n                rtp.mtu = \"1280\"\n                rtp.port = \"5119\"\n                rtp.ttl = \"1\"\n

By default, the format is pcm

Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n

To change the default format update the values in od.config file.

 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n

To get the 'audiopt' and 'audiortpmap' values, read the web pages

"},{"location":"3.0/config/webrtc/#requirements","title":"Requirements","text":""},{"location":"3.0/config/webrtc/#install-a-janus-server","title":"Install a janus server","text":""},{"location":"3.0/config/webrtc/#install-janus","title":"Install janus","text":"

Install a janus service from meetecho.com on a server

apt-get install janus\n
"},{"location":"3.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"

Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.

certificates: {\n    cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n    cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n    cert_pwd = \"secretpassphrase\"\n}\n
"},{"location":"3.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"

Update the od.config file, for example :

# WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
"},{"location":"3.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"

webrtc.enable is a boolean. The default value is False. Set this value to True to enable webrtc services for pulseaudio.

"},{"location":"3.0/config/webrtc/#webrtcserver","title":"webrtc.server","text":"

webrtc.server is a dict. The default value is None. Set all dictionnary values to enable webrtc access for pulseaudio and for the web browser client.

The hostip value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.

'hostip': '1.2.3.4'\n

The host value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn. This fqdn is used by the web browser.

webrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
"},{"location":"3.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"3.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"

The http request path is /API/manager

Path Params Response type /API/manager/buildapplist None Json object /API/manager/updateactivedirectorysite None Json object /API/manager/garbagecollector expirein=, force=False Json object"},{"location":"3.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"

buildapplist ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps. abcdesktop.io

Params Type Description None None None

example :

curl http://localhost/API/manager/buildapplist\n

Return the complete array if json images objects ready to run.

\n{\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
"},{"location":"3.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None

example :

curl http://localhost/API/manager/updateactivedirectorysite

"},{"location":"3.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein integer number in seconds since the container create date time force boolean garbage the container even if a user is connected

example :

curl \"http://localhost/API/manager/garbagecollector?expirein=9473\" curl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"

"},{"location":"3.0/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.0/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"

To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.

"},{"location":"3.0/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204-step-by-step","title":"Install Kubernetes on Ubuntu 22.04 (Step by Step)","text":"

These commands install the latest Kubernetes on a single node Ubuntu 22.04

"},{"location":"3.0/setup/k8slinuxinstallation/#step-0-disable-swap","title":"Step 0: Disable swap","text":"

Execute command swapoff to disable swap.

swapoff -a\n

Load the overlay and br_netfilter kernel modules

modprobe overlay\nmodprobe br_netfilter\n

Create the containerd.conf to load modules

cat >>/etc/modules-load.d/containerd.conf <<EOF\noverlay\nbr_netfilter\nEOF\n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-1-install-containerdio-from-docker-repository","title":"Step 1: Install containerd.io from docker repository","text":"

Install the containerd utility and required packages on node by running the following command as sudo in a Terminal :

Install common packages

apt-get install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates\n

Add source

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg\nadd-apt-repository \"deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\"\n

You will be prompted with a Y/n option in order to proceed with the installation.

apt update\napt install -y containerd.io\n

containerd.io will then be installed on your system.

"},{"location":"3.0/setup/k8slinuxinstallation/#step-2-configure-containerdio","title":"Step 2: Configure containerd.io","text":"

Configure containerd to use systemd as cgroup.

containerd config default > /etc/containerd/config.toml\nsed -i 's/SystemdCgroup \\= false/SystemdCgroup \\= true/g' /etc/containerd/config.toml\n

Enable the containerd utility by running the following command :

systemctl restart containerd\nsystemctl enable containerd\n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-3-add-the-kubernetes-signing-key","title":"Step 3: Add the Kubernetes signing key","text":"

Run the following command in order to get the Kubernetes signing key:

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - \n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-4-add-xenial-kubernetes-repository","title":"Step 4: Add Xenial Kubernetes Repository","text":"

Run the following commands in order to add the Xenial Kubernetes repository:

echo \"deb https://apt.kubernetes.io/ kubernetes-xenial main\" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list \napt-get update\n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-5-install-kubernetes","title":"Step 5: Install Kubernetes","text":"

Create kubernetes.conf for sysctl.d

cat >>/etc/sysctl.d/kubernetes.conf <<EOF\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1\nEOF\n

Reload your system sysctl changes

sysctl --system\n

Install the packages kubelet kubeadm kubectl

apt install -y kubelet kubeadm kubectl\n

K8s utilities will then be installed on your system.

You can check the version number of kubeadm and also verify the installation through the following command:

 kubeadm version -o yaml\n
clientVersion:\n  buildDate: \"2022-10-12T10:55:36Z\"\n  compiler: gc\n  gitCommit: 434bfd82814af038ad94d62ebe59b133fcb50506\n  gitTreeState: clean\n  gitVersion: v1.25.3\n  goVersion: go1.19.2\n  major: \"1\"\n  minor: \"25\"\n  platform: linux/amd64\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"

abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.

The abcdesktop infrastructure is using the contianers :

Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.0 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.0 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.0/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

You need to have a

You can run the Quick installation process or choose the Manually installation step by step

"},{"location":"3.0/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

Quick installation can be run on Linux or macOS operation system.

Download and extract the latest release automatically (Linux or macOS):

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.0.sh | bash\n

The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

"},{"location":"3.0/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

"},{"location":"3.0/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.0/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

We will create the abcdesktop namespace and set it as default :

kubectl create namespace abcdesktop\n

You should read on the standard output

namespace/abcdesktop created\n

Option : To use the namespace abcdestkop as default namespace kubectl config set-context $(kubectl config current-context) --namespace=abcdesktop

All kubectl commands will be executed with abcdesktop namespace. This will avoid to add \"-n abcdesktop\" to all commands.

"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

The following commands will let you create all necessary keys :

openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

Then, create the kubernetes secrets from the new key files:

kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

You should read on the standard output :

secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n

Only if you use a private registry or if the abcdesktop registry is private Create Secret to allow kubernetes to download abcdesktop images from docker registry. For this part you need to change docker-username and docker-password by credentials provided by project owner. If you don't have this values, you will have to build abcdesktop images by yourself.

change docker.json path if need /root/.docker/config.json kubectl create secret generic abcdesktopregistrysecret --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson -n abcdesktop

"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

You can verify secrets creation with the following command :

kubectl get secrets -n abcdesktop\n

You should read on the standard output :

NAME                           TYPE                                  DATA   AGE\ndefault-token-5zknd            kubernetes.io/service-account-token   3      6m6s\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"

Create a pod user to make sure that Kubernetes will find the docker images at startup time.

kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser.yaml\n

You should read on stdout

pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n

You can wait for user pod is Ready, this while take a while, for container images are downloading.

kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5  -n abcdesktop --timeout=-1s\n
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n

You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5. This container images are downloaded.

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser.yaml\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"

Download the od.config file. This is the main file for pyos control plane.

curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.0 --output od.config\n

Create the config map abcdesktop-config in the abcdesktop namespace

kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

You should read on sdtout

configmap/abcdesktop-config created\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"

abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

Run the command line

kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.0.yaml\n

You should read on the standard output

clusterrole.rbac.authorization.k8s.io/pyos-role created\nclusterrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

kubectl get pods -n abcdesktop\n

You should read on the standard output

NAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-57c57c4f9d-92fs2   1/1     Running   0          59m\nmongodb-od-f69ff6b5b-v6ztc      1/1     Running   0          59m\nnginx-od-58f86c4dc8-8n9lf       1/1     Running   0          59m\nopenldap-od-d66d66bf4-84lg8     1/1     Running   0          59m\npyos-od-5586b88767-6gdtk        1/1     Running   0          59m\nspeedtest-od-6c59bdff75-n6s66   1/1     Running   0          59m\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

Open your navigator to http://[your-ip-hostname]:30443/

abcdesktop homepage should be available :

Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

Great you have installed abcdesktop.io in Kubernetes mode. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the chapter add kubernetes contain

"},{"location":"3.0/setup/kubernetes_abcdesktop/#troubleshoot","title":"Troubleshoot","text":"

All kubernetes resources can be inspected to get more informations.

First list elements you want to verify, in the following case, we will inspect pods :

kubectl get pods -n abcdesktop\n
NAME                            READY   STATUS             RESTARTS   AGE\nnginx-od-db69c45fb-qnd4n        1/1     Running            0          92s\npyos-od-5586b88767-6gdtk        1/1     Running            0          92s\nmemcached-od-db69c45fb-mqt4n    1/1     Running            0          92s\nmongodb-od-ff874fcb5-sm6f7      1/1     Running            0          92s\nspeedtest-od-55c58fdd69-5znpr   0/1     ImagePullBackOff   0          92s\n

As we can see, status is \"ImagePullBackOff\" for speedtest-od pod. We will then ask kubernetes to describe the pod with the following command :

kubectl describe pod speedtest-od-55c58fdd69-t99ck -n abcdesktop

In this case, the important information part is at the end (it's not always the case, you can also look at \"Conditions:\" section) :

    Events:\n      Type     Reason   Age                    From             Message\n      ----     ------   ----                   ----             -------\n      Warning  Failed   7m6s (x4837 over 18h)  kubelet, cube05  Error: ImagePullBackOff\n      Normal   BackOff  2m9s (x4860 over 18h)  kubelet, cube05  Back-off pulling image \"registry.mydomain.local:443/oc.speedtest\"\n

As we can see, in this case, Kubernetes had a problem to pull oc.speedtest image from registry.

"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-the-deployments","title":"Verify the deployments","text":"
kubectl get deployment -n abcdesktop\n

You should read on the standard output

NAME           READY   UP-TO-DATE   AVAILABLE   AGE\nmemcached-od   1/1     1            1           10m\nmongodb-od     1/1     1            1           10m\nnginx-od       1/1     1            1           4m26s\nopenldap-od    1/1     1            1           10m\npyos-od        1/1     1            1           3m2s\nspeedtest-od   1/1     1            1           10m\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-service-ports","title":"Verify service ports","text":"
kubectl get services -n abcdesktop\n

You should read on the standard output

NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE\ndesktop     ClusterIP   None             <none>        <none>            11m\nmemcached   ClusterIP   10.107.106.62    <none>        11211/TCP         11m\nmongodb     ClusterIP   10.96.113.246    <none>        27017/TCP         11m\nnginx       NodePort    10.100.253.228   <none>        80:30443/TCP      11m\nopenldap    ClusterIP   10.105.69.239    <none>        389/TCP,636/TCP   11m\npyos        ClusterIP   10.98.97.186     <none>        8000/TCP          11m\nspeedtest   ClusterIP   10.109.48.166    <none>        80/TCP            11m\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-cluster-roles","title":"Verify cluster roles","text":"

cluster roles are disable by default

kubectl describe ClusterRole pyos-role -n abcdesktop\n

You should read on the standard output

Name:         pyos-role\nLabels:       <none>\nAnnotations:  <none>\nPolicyRule:\n  Resources                 Non-Resource URLs  Resource Names  Verbs\n  ---------                 -----------------  --------------  -----\n  pods/ephemeralcontainers  []                 []              [create get list watch update patch delete]\n  pods/exec                 []                 []              [create get list watch update patch delete]\n  persistentvolumes         []                 []              [get list create delete]\n  persistentvolumeclaims    []                 []              [get list update create delete]\n  configmaps                []                 []              [get list watch create update patch delete]\n  pods                      []                 []              [get list watch create update patch delete]\n  secrets                   []                 []              [get list watch create update patch delete]\n  events                    []                 []              [get list watch]\n  pods/log                  []                 []              [get list watch]\n  endpoints                 []                 []              [get list]\n  nodes                     []                 []              [get watch list]\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-cluster-role-bindind","title":"Verify Cluster Role Bindind","text":"

cluster roles Bindind are disable by default

kubectl describe ClusterRoleBinding pyos-rbac -n abcdesktop\n

You should read on the standard output

Name:         pyos-rbac\nLabels:       <none>\nAnnotations:  <none>\nRole:\n  Kind:  ClusterRole\n  Name:  pyos-role\nSubjects:\n  Kind            Name                 Namespace\n  ----            ----                 ---------\n  ServiceAccount  pyos-serviceaccount  abcdesktop\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#read-pyos-logs","title":"Read pyos logs","text":"
kubectl logs -l run=pyos-od -n abcdesktop --follow -n abcdesktop\n

You should read on the standard output

2023-05-17 13:29:08 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:18 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:28 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:38 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:48 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:58 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:08 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:18 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:28 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:38 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:48 od [INFO   ] __main__.trace_request:anonymous /healthz\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#rollout-deployment","title":"Rollout deployment","text":"

To rollout restart the abcdesktop deployment

kubectl rollout restart deployment -n abcdesktop\n

You should read on the standard output

deployment.apps/memcached-od restarted\ndeployment.apps/mongodb-od restarted\ndeployment.apps/nginx-od restarted\ndeployment.apps/openldap-od restarted\ndeployment.apps/pyos-od restarted\ndeployment.apps/speedtest-od restarted\n

Check the pods status

kubectl get pods -n abcdesktop\n

You should read on the standard output

NAME                            READY   STATUS        RESTARTS   AGE\nmemcached-od-64c56f9458-jcf9x   1/1     Running       0          32s\nmongodb-od-5b5cc9946d-q7fph     1/1     Running       0          32s\nnginx-od-58bdf79df4-skjsn       1/1     Running       0          32s\nopenldap-od-6dcc5d7f8b-g8gvj    1/1     Running       0          32s\npyos-od-784bd7b5c5-tdzxx        1/1     Running       0          32s\nspeedtest-od-5ff99b6579-st9jx   1/1     Running       0          32s\n
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

Quick installation can be run on Linux or macOS operation system.

Download and execute the pullapps-3.0.sh script :

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.0.sh | bash\n

This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

Now reconnect to your abcdesktop.

Open your navigator to http://[your-ip-hostname]:30443/

http://localhost:30443/\n

The new applications are installed, and ready to run.

"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

Add new application, require to send an application json document to the control-plane pyos.

"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/conf/tree/main/apps

curl https://raw.githubusercontent.com/abcdesktopio/conf/main/apps/2048.d.3.0.json --output 2048.json\n

The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

Send the 2048.json file to the images REST API

curl -X PUT -H 'Content-Type: text/javascript' http://[your-ip-hostname]:30443/API/manager/image -d @2048.json\n

The response is the json document.

[{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GETcurl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/imagePUTcurl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.jsonPOSTcurl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.jsonDELETEcurl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

kubectl get pods -n abcdesktop\n

The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

Then the pod STATUS become Running during 42 seconds.

NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

This pod is created to ask Kubernetes for pulling the container image.

"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

Now reconnect to your abcdesktop.

Open your navigator to http://[your-ip-hostname]:30443/

http://localhost:30443/\n

The new applications are installed, and ready to run.

"},{"location":"3.0/setup/kubernetesmode/","title":"Setup kubernetes for GNU/Linux","text":"

This section apply only to configure kubernetes for GNU/Linux.

abcdesktop.io support docker mode and kubernetes mode. In this section we will study how abcdesktop.io is working in kubernetes mode. The abcdesktop.io kubernetes mode is recommended for enterprise use, all user containers can be distributed on different hosts.

"},{"location":"3.0/setup/kubernetesmode/#requirements","title":"Requirements","text":"

Linux Requierements

"},{"location":"3.0/setup/kubernetesmode/#installation","title":"Installation","text":"

The following commands will let you prepare kubernetes on one node. In this case, all applications run on a single node. It's recommended to start with a single node.

"},{"location":"3.0/setup/kubernetesmode/#kubernetes-master-node","title":"Kubernetes Master Node","text":""},{"location":"3.0/setup/kubernetesmode/#step-1-disable-swap-memory-if-running","title":"Step 1: Disable swap memory (if running)","text":"

You need to disable swap memory on nodes as Kubernetes does not perform properly on a system that is using swap memory. Run the following command in order to disable swap memory.

swapoff -a\n

If you have some swaps in /etc/fstab, just comment them out. swapoff -a will disable all swaps temporarily.

systemctl mask dev-zram1.swap\nCreated symlink /etc/systemd/system/dev-zram1.swap \u2192 /dev/null.\n
"},{"location":"3.0/setup/kubernetesmode/#step-2-init-kubernetes","title":"Step 2: init kubernetes","text":"

Run the following command as sudo on the master node:

kubeadm init --pod-network-cidr=10.244.0.0/16\n

The process might take a minute or more depending on your internet connection.

To be able to manage your kubernetes server, you need to run the following commands as a regular user:

mkdir -p $HOME/.kube\ncp -i /etc/kubernetes/admin.conf $HOME/.kube/config\nchown $(id -u):$(id -g) $HOME/.kube/config\n
"},{"location":"3.0/setup/kubernetesmode/#step-3-permit-schedule","title":"Step 3: Permit Schedule","text":"

Taints are Kubernetes flags to prevent Pod Scheduling. Remove the taints on the master so that you can schedule pods on it.

kubectl taint node `hostname` node-role.kubernetes.io/control-plane:NoSchedule-\n

It should return the following string.

node/<your-hostname> untainted\n

Taints are Kubernetes flags to prevent Pod Scheduling.

Confirm that you now have a node in your cluster with the following command.

kubectl get nodes -o wide\n

It should return something like the following.

NAME      STATUS     ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME\nhostname  NotReady   control-plane   3m17s   v1.25.3   192.168.7.187   <none>        Ubuntu 22.04.1 LTS   5.15.0-52-generic   containerd://1.6.9\n
"},{"location":"3.0/setup/kubernetesmode/#step-4-deploy-flannel-through-the-master-node","title":"Step 4: Deploy flannel through the master node","text":"

A pod network is a medium of communication between the nodes of a network. We are deploying flannel network on our cluster through the following command:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml\n

It should return the following strings.

namespace/kube-flannel created\nclusterrole.rbac.authorization.k8s.io/flannel created\nclusterrolebinding.rbac.authorization.k8s.io/flannel created\nserviceaccount/flannel created\nconfigmap/kube-flannel-cfg created\ndaemonset.apps/kube-flannel-ds created\n
"},{"location":"3.0/setup/kubernetesmode/#check-node-status","title":"Check node status","text":"

Now when you see the status of the nodes, you will see that the master-node is ready :

kubectl get nodes -o wide\n
NAME      STATUS   ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME\nHostname  Ready    control-plane   4m12s   v1.25.3   192.168.7.187   <none>        Ubuntu 22.04.1 LTS   5.15.0-52-generic   containerd://1.6.9\n

At this step, there is no more Taints and your node is Ready.

Next step, continue with the setup abcdesktop for kubernetes.

"},{"location":"3.0/setup/requirements/","title":"Requirements","text":""},{"location":"3.0/setup/requirements/#prerequisites-for-abcdesktop-setup-in-release-3x","title":"Prerequisites for abcdesktop setup in release 3.x","text":""},{"location":"3.0/setup/requirements/#release-3x","title":"Release 3.x","text":"
$ kubectl version --output=yaml\n
serverVersion:\n  buildDate: \"2022-05-24T12:18:48Z\"\n  compiler: gc\n  gitCommit: 3ddd0f45aa91e2f30c70734b175631bec5b5825a\n  gitTreeState: clean\n  gitVersion: v1.24.1\n  goVersion: go1.18.2\n  major: \"1\"\n  minor: \"24\"\n  platform: linux/amd64\n
"},{"location":"3.0/setup/requirements/#microk8s-support","title":"microk8s support","text":"

microk8s is supported in abcdesktop release 3.0. The reverse proxy service need to enable dns service.

"},{"location":"3.0/setup/requirements/#microk8s-kubectl-version","title":"microk8s kubectl version","text":"
$ microk8s kubectl version --output=yaml\nclientVersion:\n  buildDate: \"2022-09-28T14:42:45Z\"\n  compiler: gc\n  gitCommit: 949b88ddc8b8cc540684c90c176f92ac9676e07c\n  gitTreeState: clean\n  gitVersion: v1.24.6-2+949b88ddc8b8cc\n  goVersion: go1.18.5\n  major: \"1\"\n  minor: 24+\n  platform: linux/amd64\nkustomizeVersion: v4.5.4\nserverVersion:\n  buildDate: \"2022-09-28T14:40:13Z\"\n  compiler: gc\n  gitCommit: 949b88ddc8b8cc540684c90c176f92ac9676e07c\n  gitTreeState: clean\n  gitVersion: v1.24.6-2+949b88ddc8b8cc\n  goVersion: go1.18.5\n  major: \"1\"\n  minor: 24+\n  platform: linux/amd64\n
"},{"location":"3.0/setup/requirements/#enable-dns-add-one-to-microk8s","title":"enable dns add one to microk8s","text":"
$ microk8s enable dns\n

You should ready on stdout

$ microk8s enable dns\nInfer repository core for addon dns\nEnabling DNS\nApplying manifest\nserviceaccount/coredns created\nconfigmap/coredns created\ndeployment.apps/coredns created\nservice/kube-dns created\nclusterrole.rbac.authorization.k8s.io/coredns created\nclusterrolebinding.rbac.authorization.k8s.io/coredns created\nRestarting kubelet\nDNS is enabled\n

Check microk8s status

$ microk8s status\nmicrok8s is running\nhigh-availability: no\n  datastore master nodes: 127.0.0.1:19001\n  datastore standby nodes: none\naddons:\n  enabled:\n    dns                  # (core) CoreDNS\n    ha-cluster           # (core) Configure high availability on the current node\n
"},{"location":"3.0/setup/requirements/#supported-architectures","title":"Supported Architectures","text":"

images support only architectures x86-64. The architectures supported by this image is:

Architecture Tag x86-64 amd64-latest"},{"location":"3.0/setup/requirements/#gnulinux","title":"GNU/Linux","text":"

The recommended distribution is Ubuntu 22.04.1 LTS (Jammy Jellyfish)

"},{"location":"3.0/setup/troubleshooting_core_services/","title":"Troubeshooting abcdesktop core services","text":""},{"location":"3.0/setup/troubleshooting_core_services/#troubeshooting-nginx-errors","title":"Troubeshooting nginx errors","text":""},{"location":"3.0/setup/troubleshooting_core_services/#read-pods-status","title":"Read pod's status","text":"
kubectl get pods -n abcdesktop\nNAME                           READY   STATUS             RESTARTS       AGE\nmemcached-od-78578c879-bb8qq   1/1     Running            0              164m\nmongodb-od-5b4dd4765f-ptw2j    1/1     Running            0              164m\nnginx-od-788c97cdc9-b4gbq      0/1     CrashLoopBackOff   36 (57s ago)   164m\nopenldap-od-65759b74dc-tbvfg   1/1     Running            0              164m\npyos-od-7d5d9457cf-jw6nk       1/1     Running            0              164m\nspeedtest-od-c94b56c88-48cvq   1/1     Running            0              164m\n

The pod nginx-od-788c97cdc9-b4gbq has CrashLoopBackOff status. This is wrong.

"},{"location":"3.0/setup/troubleshooting_core_services/#read-the-pods-log","title":"Read the pod's log","text":"
kubectl logs -l run=nginx-od -n abcdesktop\n
"},{"location":"3.0/setup/troubleshooting_core_services/#issue-with-an-error-in-nginx-configuration-file","title":"Issue with an error in nginx configuration file","text":"
running standart configuration file\nstarting nginx web server in foreground\nnginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\n

Nginx has failed to start. There is an error in the configuration file.

We need to fix the nginx-config ConfigMap in the yaml file.

"},{"location":"3.0/setup/troubleshooting_core_services/#start-the-pod-by-hands","title":"Start the pod by hands","text":"

If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

Update the container description to replace the default command by a sleep command

      - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:3.0\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

The container will start the command /usr/bin/sleep for 1d (one day).

A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/nginx-3.0.yaml\ndeployment.apps/nginx-od configured\n

Check that nginx pod has been updated and that the status is Running

kubectl get pods  -l run=nginx-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\nnginx-od-666df64f4-whtng   1/1     Running   0          2m30s\n

Nginx web service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the nginx web service by hands.

Run the command /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log

kubectl exec -n abcdesktop -it deployment/nginx-od -- bash\nroot@nginx-od-666df64f4-whtng:/# /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log\n

Nginx returns an explicit error, the /etc/nginx/sites-enabled/default file is wrong.

nginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\nroot@nginx-od-666df64f4-whtng:/# \n

It's time to fix the nginx-config ConfigMap in the yaml file.

"},{"location":"3.0/setup/troubleshooting_core_services/#troubeshooting-pyos-errors","title":"Troubeshooting pyos errors","text":""},{"location":"3.0/setup/troubleshooting_core_services/#read-pods-status_1","title":"Read pod's status","text":"
kubectl get pods -n abcdesktop\nNAME                            READY   STATUS             RESTARTS      AGE\nmemcached-od-5ff8844d56-sw9n5   1/1     Running            0             90m\nmongodb-od-77c945467d-c47nl     1/1     Running            0             90m\nnginx-od-666df64f4-wf99b        1/1     Running            0             22m\nopenldap-od-5bbdd75864-m6qmh    1/1     Running            0             90m\npyos-od-57946b67c4-m5zc9        0/1     CrashLoopBackOff   5 (17s ago)   3m18s\nspeedtest-od-7f5484966f-kxkw4   1/1     Running            0             90m\n

The pod pyos-od-57946b67c4-m5zc9 has CrashLoopBackOff status. This is wrong.

"},{"location":"3.0/setup/troubleshooting_core_services/#read-the-pods-log_1","title":"Read the pod's log","text":"
kubectl logs -l run=pyos-od -n abcdesktop\n
2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

It's time to fix the abcdesktop-config ConfigMap.

"},{"location":"3.0/setup/troubleshooting_core_services/#start-the-pod-by-hands_1","title":"Start the pod by hands","text":"

If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

Update the container description to replace the default command by a sleep command

      - name : pyos\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.pyos:3.0\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

The container will start the command /usr/bin/sleep for 1d (one day).

A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/pyos-3.0.yaml\ndeployment.apps/pyos-od configured\n

Check that pyos pod is Running

kubectl get pods  -l run=pyos-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\npyos-od-6cd679d6b8-css9q   1/1     Running   0          5s\n

Pyos service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the pyos service by hands.

Run the command cd /var/pyos && ./od.py

kubectl exec -n abcdesktop -it deployment/pyos-od -- bash\nroot@pyos-od-6cd679d6b8-css9q:/var/pyos# cd /var/pyos && ./od.py \n

od.py command returns the same explicit error, the od.config file is wrong.

2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

We need to fix the abcdesktop-config ConfigMap in the yaml file.

kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
"},{"location":"3.0/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

Uninstall abcdesktop for kubernetes

"},{"location":"3.0/setup/uninstall_kubernetes/#commands-to-uninstall-abcdesktop-release-30","title":"Commands to uninstall abcdesktop release 3.0","text":"

To uninstall abcdesktop. Choose run run the uninstall-3.0.sh bash script using a curl or run step by step uninstall commands manually.

"},{"location":"3.0/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

Quick uninstallation can be run on Linux or macOS operation system.

Download and extract the uninstall bash script (Linux or macOS):

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.0.sh | bash\n

You should read on stdout

starting abcdesktop uninstall commands start at 1669824908 epoch seconds\nstop and remove abcdesktop user pods\npod \"anonymous-33c30478-5cc0-4e18-b128-735694c98f3c\" deleted\nremove all services, pods\nclusterrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nclusterrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nstorageclass.storage.k8s.io \"storage-local-abcdesktop\" deleted\nconfigmap \"nginx-config\" deleted\ndeployment.apps \"memcached-od\" deleted\nsecret \"mongodb-secret\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\nremove all secrets\nsecret \"abcdesktopjwtdesktoppayload\" deleted\nsecret \"abcdesktopjwtdesktopsigning\" deleted\nsecret \"abcdesktopjwtusersigning\" deleted\nremove all configmaps\nconfigmap \"abcdesktop-config\" deleted\nconfigmap \"kube-root-ca.crt\" deleted\nremove all pvc\nNo resources found\nremove all pv\nNo resources found\nremove namespace\nnamespace \"abcdesktop\" deleted\nabcdesktop is uninstalled, in 48 seconds\n
"},{"location":"3.0/setup/uninstall_kubernetes/#run-step-by-step-uninstall-commands","title":"Run step by step uninstall commands","text":"

Run the bash commands from the uninstall-3.0.sh main content :

echo \"stop and remove abcdesktop user pods\"\nkubectl delete pods --selector=\"type=x11server\" -n abcdesktop\necho \"remove all services, pods\"\nkubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.0.yaml \necho \"remove all secrets\"\nkubectl delete secrets --all -n abcdesktop\necho \"remove all configmaps\"\nkubectl delete cm --all -n abcdesktop\necho \"remove all pvc\"\nkubectl delete pvc --all -n abcdesktop 2>/dev/null\necho \"remove namespace\"\nkubectl delete namespace abcdesktop\necho \"abcdesktop is uninstalled\"\n

The last command kubectl delete namespace can take few minutes.

Please wait for the output message:

abcdesktop is uninstalled\n

Great, you have uninstalled abcdesktop for kubernetes.

"},{"location":"3.1/config/persistentvolumes/","title":"Use PersistentVolume and PersistentVolumeClaim to retain user's home directory files","text":"

To retain user's home directory files, you can define

In most cases with managed providers, you do not need to create a Persistent Volume, just a Persistent Volume Claim. Even in a non-managed set up, the Persistent Volume is generally created by the cluster administrator while Persistent Volume Claim is used by the end-user. The Persistent Volume Claim is namespaced ressource.

Optionally, if you need a cluster administrator role, then abcdestkop can create Persistent Volume and Persistent Volume Claim.

"},{"location":"3.1/config/persistentvolumes/#define-clusterrole-only-if-you-need-to-create-persistent-volume","title":"Define ClusterRole only if you need to create Persistent Volume","text":"

Persistent Volume is a non-namespaced resource, so you need to update the pyos-role to ClusterRole to allow methods [ \"get\", \"list\", \"create\", \"patch\", \"delete\" ]

- apiGroups: [\"\"]\n  resources: [\"persistentvolumes\"]\n  verbs: [\"get\", \"list\", \"create\", \"patch\", \"delete\"] \n

Update the default pyos role to ClusterRole

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
"},{"location":"3.1/config/persistentvolumes/#define-persistent-volume-and-persistent-volume-claim","title":"Define persistent volume and persistent volume claim","text":"

To define Persistent Volume or Persistent Volume Claim, update the od.config file and set

desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: { YOUR PERSISTENT VOLUME DICT CONFIGURATION TEMPLATE - THIS CAN BE NONE }\ndesktop.persistentvolumeclaim: 'NAME OF AN EXISTING PVC' OR { YOUR PERSISTENT VOLUME CLAIM DICT CONFIGURATION TEMPLATE } \ndesktop.removepersistentvolume: False\ndesktop.removepersistentvolumeclaim: True\n
"},{"location":"3.1/config/persistentvolumes/#desktophomedirectorytype","title":"desktop.homedirectorytype","text":"

To use desktop.persistentvolume and desktop.persistentvolumeclaim values, the desktop.homedirectorytype must be set to persistentVolumeClaim

desktop.homedirectorytype: 'persistentVolumeClaim'\n
"},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolume-is-optional","title":"Define desktop.persistentvolume is optional","text":"

desktop.persistentvolume is optional and can be set to None, else the type of desktop.persistentvolume parameter must be a dict (dictionary).

If desktop.persistentvolume is None then abcdesktop does not create a persistent volume. The persistent volumes should already exist or created by another provisioning engine.

If desktop.persistentvolume is a dict then abcdesktop creates the persistent volume.

If you set desktop.persistentvolume to None, or if you create the persistent volume manualy, then you don't need to update the pyos role.

"},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim","title":"Define desktop.persistentvolumeclaim","text":"

The type of desktop.persistentvolumeclaim is dictionary or a string.

If desktop.homedirectorytype is set to 'persistentVolumeClaim', then desktop.persistentvolumeclaim must be defined as a dict or a str.

Kubernetes persistent volume is a namespaced resource, so you can keep the default rbac-role for pyos-role.

if desktop.persistentvolume option is defined then abcdesktop sets the persistent volume claim specification attribut volumeName value to the created persistent volume.

Get more information about PersistentVolume and PersistentVolumeClaim.

"},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-string","title":"Define desktop.persistentvolumeclaim as a string","text":"

All pods will share the same persistent volume claim, and the same persistent volume. The access mode must be ReadWriteMany, else only one pod (the first one) will bound the pvc.

Create a persistent volume

kubectl get pv -n abcdesktop\nNAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGE\npv-nfs   10Gi       RWX            Retain           Bound    abcdesktop/homedir         nfs-csi                 3d22h\n
kubectl describe pv pv-nfs \nName:            pv-nfs\nLabels:          <none>\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\n                 pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/homedir\nReclaim Policy:  Retain\nAccess Modes:    RWX\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      nfs-server.default.svc.cluster.local/share##\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir\nEvents:                <none>\n

Create a persistent volume claim

kubectl get pvc -n abcdesktop\nNAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE\nhomedir   Bound    pv-nfs   10Gi       RWX            nfs-csi        3d22h\n
kubectl describe pvc homedir -n abcdesktop\nName:          homedir\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        pv-nfs\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWX\nVolumeMode:    Filesystem\nUsed By:       fry-88a6e\n               hermes-7d84b\nEvents:        <none>\n

In the od.config file, set the values

desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: 'homedir'\ndesktop.removepersistentvolumeclaim: False\n

If you need to use subPath

desktop.persistentvolumeclaimforcesubpath: True\n

'subPath' is not supported for ephemeral container.

"},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-dictionary","title":"Define desktop.persistentvolumeclaim as a dictionary","text":"

in od.config file

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}',\n    },\n    'spec': {\n      'storageClassName': 'mystorageclass',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteMany' ] } }\n

Replace mystorageclass by storageclass of your cloud provider.

To list the storage classes

kubectl get storageclass\n
NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE\ngp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false \n
NAME                          PROVISIONER                    RECLAIMPOLICY          Immediate           false                  3h22m\ndo-block-storage (default)    dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-retain       dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\ndo-block-storage-xfs          dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-xfs-retain   dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\n
"},{"location":"3.1/config/persistentvolumes/#template-values-for-desktoppersistentvolumespec-and-desktoppersistentvolumeclaim","title":"Template values for desktop.persistentvolumespec and desktop.persistentvolumeclaim","text":"

Value defines inside {{ VALUE }} is replaced by the templated value keys:

The template values can be one of them :

var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale uuid a uniqu uuid template tag value tag value set by auth rules

The uuid have the same value for the persistent volume and for the persistent volume claim. uuid can be use for naming the PVC or the PV, or on all string values.

desktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}-{{ uuid }}',\n    },\n    'spec': {\n      'volumeName': '{{ provider }}-{{ userid }}-{{ uuid }}',\n      'storageClassName': 'nfs-csi',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteOnce' ] } }\n\ndesktop.persistentvolume: {\n    'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n    'spec': {\n    'storageClassName': 'nfs-csi',\n    'mountOptions': [\n      'nfsvers=3'\n    ],\n    'capacity': {\n      'storage': '10Gi'\n    },\n    'accessModes': [ 'ReadWriteOnce' ],\n    'csi': {\n      'driver': 'nfs.csi.k8s.io',\n      'readOnly': False,\n      'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n      'volumeAttributes': {\n          'server': '192.168.7.101',\n          'share': '/volume1/homedir/{{ userid }}'\n      } } } }\n

The variables persistentvolumeclaim and persistentvolume become

desktop.persistentvolumeclaim: {\n      'metadata': {'name': 'planet-fry-1841f'}, \n      'spec': {\n        'volumeName': 'planet-fry-1841f', \n        'storageClassName': 'nfs-csi', \n        'resources': {\n          'requests': {'storage': '1Gi'}\n        }, \n        'accessModes': ['ReadWriteOnce']\n      }\n}\ndesktop.persistentvolume: {\n     'metadata': { 'name': 'planet-fry-1841f'}, \n     'spec': {\n       'storageClassName': 'nfs-csi', \n       'mountOptions': ['nfsvers=3'], \n       'capacity': {'storage': '10Gi'}, \n       'accessModes': ['ReadWriteOnce'], \n       'csi': {\n         'driver': 'nfs.csi.k8s.io', \n         'readOnly': False, \n         'volumeHandle': '192.168.7.101#volume1#homedir#fry',\n         'volumeAttributes': {\n           'server': '192.168.7.101', \n           'share': '/volume1/homedir/fry'\n         }\n       }\n      }\n}\n
"},{"location":"3.1/config/persistentvolumes/#desktopremovepersistentvolume","title":"desktop.removepersistentvolume","text":"

During the remove desktop process, delete or not the persistent volume. The persistent volume can be delete only if the desktop.deletepersistentvolumeclaim is True.

The default value for desktop.removepersistentvolume is False.

"},{"location":"3.1/config/persistentvolumes/#desktopremovepersistentvolumeclaim","title":"desktop.removepersistentvolumeclaim","text":"

During the remove desktop process, delete or not the persistent volume claim.

The default value for desktop.removepersistentvolumeclaim is False.

"},{"location":"3.1/config/persistentvolumes/#define-persistentvolume-using-csi-driver-nfs","title":"Define persistentVolume using csi-driver-nfs","text":"

In this example, we use nfs protocol to share user home directory on each worker node

Use the https://github.com/kubernetes-csi/csi-driver-nfs as a csi-driver-nfs with a nfs server as backend.

"},{"location":"3.1/config/persistentvolumes/#on-the-nfs-server","title":"On the nfs server","text":"

On the nfs server, create an export with the no_root_squash option

For example export /volume1/pods

/volume1/pods        192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
"},{"location":"3.1/config/persistentvolumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs","text":"

Run the install install-driver.sh command from kubernetes-csi/csi-driver-nfs GitHub repository.

curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n

Create a storage class file nfs-csi-sc-ds01.yaml,

Content of the default nfs-csi-sc-ds01.yaml

apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n  server: 192.168.7.101\n  share: /volume1/pods\n  mountPermissions: \"0755\"\n  # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n  # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n  # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n  - nfsvers=3\n
kubectl apply -f nfs-csi-sc-ds01.yaml\n

You read the response on stdout

storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n

Check the storage class nfs-csi-sc-ds01

kubectl get sc\nNAME                 PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE\nnfs-csi-sc-ds01      nfs.csi.k8s.io   Delete          Immediate           false                  18m\n
"},{"location":"3.1/config/persistentvolumes/#update-the-odconfig-file","title":"Update the od.config file","text":"

In your od.config file, define the entry desktop.persistentvolumeclaim

The Persistent Volume and Persistent Volume Claim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.deletepersistentvolume: False\ndesktop.deletepersistentvolumeclaim: True\ndesktop.persistentvolume: {\n            'metadata': { 'name': '{{ provider }}-{{ userid }}' },\n            'spec': {\n            'storageClassName': 'nfs-csi',\n            'mountOptions': [\n              'nfsvers=3'\n            ],\n            'capacity': {\n              'storage': '10Gi'\n            },\n            'accessModes': [ 'ReadWriteOnce' ],\n            'csi': {\n              'driver': 'nfs.csi.k8s.io',\n              'readOnly': False,\n              'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n              'volumeAttributes': {\n                  'server': '192.168.7.101',\n                  'share': '/volume1/homedir/{{ userid }}'\n              } } } }\n\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'nfs-csi',\n              'volumeName': '{{ provider }}-{{ userid }}',\n              'resources': { \n                'requests': { \n                  'storage': '1Gi'\n                } \n            },\n            'accessModes': [ 'ReadWriteMany' ] } }\n

Update the new config file and restart pyos pods. Update the pyos role to allow

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n

abcdesktop creates PV and PVC for you.

"},{"location":"3.1/config/persistentvolumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

Login as user (Philip J. Fry, fry)

The new desktop for Philip J. Fry is created.

Start the web shell command using the search bar

Using the web shell application start the df command

The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32

"},{"location":"3.1/config/persistentvolumes/#list-the-persistentvolume-and-persistentvolumeclaim","title":"List the PersistentVolume and PersistentVolumeClaim","text":"

List the new PersistentVolume

kubectl get pv \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS      REASON   AGE\nplanet-fry                                 10Gi       RWO            Retain           Bound    abcdesktop/planet-fry         nfs-csi                    2m58s\n

List the new PersistentVolumeClaim

kubectl get pvc -n abcdesktop \nNAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE\nplanet-fry         Bound    planet-fry                                 10Gi       RWO            nfs-csi        107s\n

Get the persistent volume claim's description

kubectl describe pvc planet-fry  -n abcdesktop\nName:          planet-fry\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        planet-fry\nLabels:        access_provider=planet\n               access_providertype=ldap\n               access_userid=fry\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWO\nVolumeMode:    Filesystem\nUsed By:       fry-055f6\nEvents:        <none>\n

Get the persistent volume description

kubectl describe pv planet-fry\nName:            planet-fry\nLabels:          access_provider=planet\n                 access_providertype=ldap\n                 access_userid=fry\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/planet-fry\nReclaim Policy:  Retain\nAccess Modes:    RWO\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      192.168.7.101#volume1#homedir#fry\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir/fry\nEvents:                <none>\n
"},{"location":"3.1/config/persistentvolumes/#define-persistentvolume-using-storage-class-do-block-storage-on-digitalocean","title":"Define persistentVolume using storage class do-block-storage on digitalocean","text":""},{"location":"3.1/config/persistentvolumes/#update-odconfig-file","title":"Update od.config file","text":"

Update od.config file with the options

desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'do-block-storage',\n              'resources': {\n                'requests': {\n                  'storage': '1Gi'\n                }\n            },\n            'accessModes': [ 'ReadWriteOnce' ] } }\n

Update the configmap

kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n

Restart pyos pod

kubectl delete pods -l run=pyos-od -n abcdesktop\n

Login to your abcdesktop service, you should read on the html page, the status

b.Reading your persistent volume claim planet-fry, status is Pending, using storage class do-block-storage ....\nb.Creating your desktop\nb.Successfully assigned abcdesktop/fry-0d805 to pool-g8u8ddr44-yhh3i.................\nb.Your pod gets event SuccessfulAttachVolume AttachVolume.Attach succeeded for volume \"pvc-38899590-c94a-4849-a111-31ae7de624e1\" ..\nb.Started container i-planet-fry\nb.pending: x-planet-fry is starting\nb.Created container x-planet-fry\nb.Your pod fry-0d805 is Pending..\nc.Waiting for desktop graphical service 1/42........\nc.Waiting for desktop spawner service 1/42\nc.Waiting for desktop graphical service 2/42\nRock and roll\n

Read the new pod for fry the user fry

kubectl get pods  -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nfry-0d805                       4/4     Running   0          17m\nmemcached-od-5ff8844d56-lcn7p   1/1     Running   0          106m\nmongodb-od-77c945467d-97g8w     1/1     Running   0          106m\nnginx-od-7445969696-lpfhh       1/1     Running   0          106m\nopenldap-od-5bbdd75864-dprvl    1/1     Running   0          106m\npyos-od-7584db6787-chtdc        1/1     Running   0          19m\nspeedtest-od-7f5484966f-5pl6k   1/1     Running   0          106m\n

Read the pvc for fry

kubectl get pvc  -n abcdesktop\nNAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE\nplanet-fry   Bound    pvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            do-block-storage   17m\n

Read the pv for fry

kubectl get pv                \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS       REASON   AGE\npvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            Delete           Bound    abcdesktop/planet-fry   do-block-storage            17m\n
"},{"location":"3.1/config/persistentvolumes/#known-issues","title":"known issues","text":""},{"location":"3.1/config/persistentvolumes/#bound-a-volume-if-desktopdeletepersistentvolumeclaim-is-false","title":"Bound a volume if desktop.deletepersistentvolumeclaim is False","text":"

When desktop.deletepersistentvolumeclaim is True and desktop.deletepersistentvolume is False, if you create manually the persistent volumes, you may have to patch the claimRef of the persistent volumes to make it Available again.

kubectl get pv \nNAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                   STORAGECLASS   REASON   AGE\nplanet-fry  10Gi       RWO            Retain           Released   abcdesktop/planet-fry   nfs-csi                 4m1                           \n
kubectl patch pv planet-fry -p '{\"spec\":{\"claimRef\": null}}' \npersistentvolume/planet-fry patched\n
kubectl get pv \nNAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS   REASON   AGE\nplanet-fry    10Gi       RWO            Retain           Available              nfs-csi                 8m\n
"},{"location":"3.1/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.1/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"

To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.

"},{"location":"3.1/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204","title":"Install Kubernetes on Ubuntu 22.04","text":"

These commands install the latest Kubernetes on a single node Ubuntu 22.04. km is a command tools from https://github.com/jfv-opensource/kube-tools repository.

Clone kube-tools and run km --apply as root.

git clone https://github.com/jfv-opensource/kube-tools.git\ncd kube-tools\n./km --apply\n

kube-tools installs and configures all components. kube-tools runs a simple hello-world pods to check the pods execution.

Configure repositories & install packages\n2023-10-06 12:37:52 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Installing base needed packages\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Adding docker package repository signature\nGet:1 file:/etc/apt/apt-mirrors.txt Mirrorlist [142 B]\nGet:6 https://download.docker.com/linux/ubuntu jammy InRelease [48.9 kB]\nHit:7 https://packages.microsoft.com/ubuntu/22.04/prod jammy InRelease\nHit:2 http://azure.archive.ubuntu.com/ubuntu jammy InRelease\nHit:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates InRelease\nHit:4 http://azure.archive.ubuntu.com/ubuntu jammy-backports InRelease\nHit:5 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease\nGet:8 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [22.2 kB]\nHit:9 https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu jammy InRelease\nFetched 71.0 kB in 1s (71.4 kB/s)\nReading package lists...\nRepository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable'\nDescription:\nArchive for codename: jammy components: stable\nMore info: https://download.docker.com/linux/ubuntu\nAdding repository.\nAdding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\nAdding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\n2023-10-06 12:37:59 [OK] - fv-az1111-309: Adding docker package repository\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository signature\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository\n2023-10-06 12:38:03 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Installing kubectl\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Freezing kubernetes tools version\nConfigure system\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this session\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this file /etc/fstab\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module overlay\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module br_netfilter\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module load for containerd\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Installing containerd & kubernetes tools\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Freezing kubernetes tools version\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 1#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 2#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Restarting containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Enabling containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Configuring network for kubernetes\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Applying system configuration\nConfigure kubernetes\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Starting master node\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Writting kubernetes config file to /root/.kube/config\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Loading network configuration into cluster\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Allowing pods on master because of standalone node\n2023-10-06 12:38:54 [INFO] - fv-az1111-309: Waiting for node fv-az1111-309 condition=Ready during timeout=600s\n2023-10-06 12:39:01 [OK] - fv-az1111-309: Your cluster is Ready\nError from server (NotFound): serviceaccounts \"default\" not found\n2023-10-06 12:39:01 [INFO] - fv-az1111-309:  retry 1/10 default account service account is net yet created, sleeping for 5s\n2023-10-06 12:39:07 [OK] - fv-az1111-309: default account service account is created\n2023-10-06 12:39:07 [OK] - fv-az1111-309: create pod-helloworld\n2023-10-06 12:39:12 [OK] - fv-az1111-309: pod-helloworld says hello world\n2023-10-06 12:39:17 [OK] - fv-az1111-309: delete pod-helloworld\nConfiguration archive\n2023-10-06 12:39:17 [OK] - fv-az1111-309: Generating config archive\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"

abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.

The abcdesktop infrastructure is using the contianers :

Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.0 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.0 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.1/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

You need to have a

You can run the Quick installation process or choose the Manually installation step by step

"},{"location":"3.1/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

Quick installation can be run on Linux or macOS operation system.

Download and extract the latest release automatically (Linux or macOS):

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.1.sh | bash\n

You can read on stdout

[INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nGenerating RSA private key, 1024 bit long modulus\n..........+++++\n...+++++\ne is 65537 (0x10001)\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys create\nGenerating RSA private key, 1024 bit long modulus\n...+++++\n..................................+++++\ne is 65537 (0x10001)\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nGenerating RSA private key, 1024 bit long modulus\n.....+++++\n...............................................+++++\ne is 65537 (0x10001)\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.1.yaml\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.1\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-6dt28 Ready\n[OK] pod/memcached-od-5ff8844d56-6dt28 condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-r82kv Ready\n[OK] pod/mongodb-od-77c945467d-r82kv condition met\n[INFO] waiting for pod/nginx-od-7445969696-6z88w Ready\n[OK] pod/nginx-od-7445969696-6z88w condition met\n[INFO] waiting for pod/openldap-od-5bbdd75864-d5bpq Ready\n[OK] pod/openldap-od-5bbdd75864-d5bpq condition met\n[INFO] waiting for pod/pyos-od-7584db6787-vnp64 Ready\n[OK] pod/pyos-od-7584db6787-vnp64 condition met\n[INFO] waiting for pod/speedtest-od-7f5484966f-jsb2m Ready\n[OK] pod/speedtest-od-7f5484966f-jsb2m condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-6dt28   1/1     Running   0          40s\nmongodb-od-77c945467d-r82kv     1/1     Running   0          40s\nnginx-od-7445969696-6z88w       1/1     Running   0          40s\nopenldap-od-5bbdd75864-d5bpq    1/1     Running   0          38s\npyos-od-7584db6787-vnp64        1/1     Running   0          39s\nspeedtest-od-7f5484966f-jsb2m   1/1     Running   0          39s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

"},{"location":"3.1/setup/kubernetes_abcdesktop/#change-the-default-namespace","title":"Change the default namespace","text":"

You may need to replace the default namespace abcdesktop by your own. The install-3.1.sh bash script allow you to set the new namespace as an option.

wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.1.sh\nchmod 755 install-3.1.sh \n

Run install-3.1.sh

./install-3.1.sh --namespace superdesktop\n
[INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] use local file poduser.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-b75fb Ready\n[OK] pod/memcached-od-5ff8844d56-b75fb condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-t8cv7 Ready\n[OK] pod/mongodb-od-77c945467d-t8cv7 condition met\n[INFO] waiting for pod/nginx-od-b8c8c7b95-lkjl6 Ready\n[OK] pod/nginx-od-b8c8c7b95-lkjl6 condition met\n[INFO] waiting for pod/openldap-od-56b6564c85-2npln Ready\n[OK] pod/openldap-od-56b6564c85-2npln condition met\n[INFO] waiting for pod/pyos-od-67dfc48d84-kww9n Ready\n[OK] pod/pyos-od-67dfc48d84-kww9n condition met\n[INFO] waiting for pod/speedtest-od-894b7c886-69vc4 Ready\n[OK] pod/speedtest-od-894b7c886-69vc4 condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-b75fb   1/1     Running   0          20s\nmongodb-od-77c945467d-t8cv7     1/1     Running   0          20s\nnginx-od-b8c8c7b95-lkjl6        1/1     Running   0          20s\nopenldap-od-56b6564c85-2npln    1/1     Running   0          18s\npyos-od-67dfc48d84-kww9n        1/1     Running   0          20s\nspeedtest-od-894b7c886-69vc4    1/1     Running   0          20s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

"},{"location":"3.1/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.1/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

We will create the abcdesktop namespace and set it as default :

kubectl create namespace abcdesktop\n

You should read on the standard output

namespace/abcdesktop created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

The following commands will let you create all necessary keys :

openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

Then, create the kubernetes secrets from the new key files:

kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

You should read on the standard output :

secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

You can verify secrets creation with the following command :

kubectl get secrets -n abcdesktop\n

You should read on the standard output :

NAME                          TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"

Create a pod user to make sure that Kubernetes will find the docker images at startup time.

kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n

You should read on stdout

pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n

You can wait for user pod is Ready, this while take a while, for container images are downloading.

kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5  -n abcdesktop --timeout=-1s\n
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n

You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5. The container images are downloaded.

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"

Download the od.config file. This is the main configuration file for pyos control plane.

curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.1 --output od.config\n

Create the config map abcdesktop-config in the abcdesktop namespace

kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

You should read on sdtout

configmap/abcdesktop-config created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"

abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

Run the command line

kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.1.yaml\n

You should read on the standard output

role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

kubectl get pods -n abcdesktop\n

You should read on the standard output

NAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          18s\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          18s\nnginx-od-7445969696-mwlc9       1/1     Running   0          18s\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          18s\npyos-od-7584db6787-tjlvk        1/1     Running   0          18s\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          18s\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

Open your navigator to http://[your-ip-hostname]:30443/

abcdesktop homepage should be available :

Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

Also, you can run again the command

kubectl get pods -n abcdesktop\n

You should see that the anonymous-XXXXX pod have been created and is Running

NAME                            READY   STATUS    RESTARTS   AGE\nanonymous-50b0f                 4/4     Running   0          5m22s\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          77m\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          77m\nnginx-od-7445969696-mwlc9       1/1     Running   0          77m\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          77m\npyos-od-7584db6787-tjlvk        1/1     Running   0          77m\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          77m\n

Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications

"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

Quick installation can be run on Linux or macOS operation system.

Download and execute the pullapps-3.1.sh script :

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.1.sh | bash\n

This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

Now reconnect to your abcdesktop.

Open your navigator to http://[your-ip-hostname]:30443/

http://localhost:30443/\n

The new applications are installed, and ready to run.

"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

Add new application, require to send an application json document to the control-plane pyos.

"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.1

curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.1/2048-alpine.d.3.1.json --output 2048.json\n

To inspect image json you can also run crictl inspecti or docker inspect command.

The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

Send the 2048.json file to the images REST endpoint

curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n

The response is the json document.

[{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GETcurl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/imagePUTcurl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.jsonPOSTcurl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.jsonDELETEcurl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

kubectl get pods -n abcdesktop\n

The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

Then the pod STATUS become Running during 42 seconds.

NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

This pod is created to ask Kubernetes for pulling the container image.

"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

Now reconnect to your abcdesktop.

Open your navigator to http://[your-ip-hostname]:30443/

http://localhost:30443/\n

The new applications are installed, and ready to run.

"},{"location":"3.1/setup/troubleshooting_core_services/","title":"Troubeshooting abcdesktop core services","text":""},{"location":"3.1/setup/troubleshooting_core_services/#troubeshooting-nginx-errors","title":"Troubeshooting nginx errors","text":""},{"location":"3.1/setup/troubleshooting_core_services/#read-pods-status","title":"Read pod's status","text":"
kubectl get pods -n abcdesktop\nNAME                           READY   STATUS             RESTARTS       AGE\nmemcached-od-78578c879-bb8qq   1/1     Running            0              164m\nmongodb-od-5b4dd4765f-ptw2j    1/1     Running            0              164m\nnginx-od-788c97cdc9-b4gbq      0/1     CrashLoopBackOff   36 (57s ago)   164m\nopenldap-od-65759b74dc-tbvfg   1/1     Running            0              164m\npyos-od-7d5d9457cf-jw6nk       1/1     Running            0              164m\nspeedtest-od-c94b56c88-48cvq   1/1     Running            0              164m\n

The pod nginx-od-788c97cdc9-b4gbq has CrashLoopBackOff status. This is wrong.

"},{"location":"3.1/setup/troubleshooting_core_services/#read-the-pods-log","title":"Read the pod's log","text":"
kubectl logs -l run=nginx-od -n abcdesktop\n
"},{"location":"3.1/setup/troubleshooting_core_services/#issue-with-an-error-in-nginx-configuration-file","title":"Issue with an error in nginx configuration file","text":"
running standart configuration file\nstarting nginx web server in foreground\nnginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\n

Nginx has failed to start. There is an error in the configuration file.

We need to fix the nginx-config ConfigMap in the yaml file.

"},{"location":"3.1/setup/troubleshooting_core_services/#start-the-pod-by-hands","title":"Start the pod by hands","text":"

If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

Update the container description to replace the default command by a sleep command

      - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:3.1\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

The container will start the command /usr/bin/sleep for 1d (one day).

A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/nginx-3.1.yaml\ndeployment.apps/nginx-od configured\n

Check that nginx pod is Running

kubectl get pods  -l run=nginx-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\nnginx-od-666df64f4-whtng   1/1     Running   0          2m30s\n

Nginx web service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the nginx web service by hands.

Run the command /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log

kubectl exec -n abcdesktop -it deployment/nginx-od -- bash\nroot@nginx-od-666df64f4-whtng:/# /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log\n

Nginx returns an explicit error, the /etc/nginx/sites-enabled/default file is wrong.

nginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\nroot@nginx-od-666df64f4-whtng:/# \n

It's time to fix the nginx-config ConfigMap in the yaml file.

"},{"location":"3.1/setup/troubleshooting_core_services/#troubeshooting-pyos-errors","title":"Troubeshooting pyos errors","text":""},{"location":"3.1/setup/troubleshooting_core_services/#read-pods-status_1","title":"Read pod's status","text":"
kubectl get pods -n abcdesktop\nNAME                            READY   STATUS             RESTARTS      AGE\nmemcached-od-5ff8844d56-sw9n5   1/1     Running            0             90m\nmongodb-od-77c945467d-c47nl     1/1     Running            0             90m\nnginx-od-666df64f4-wf99b        1/1     Running            0             22m\nopenldap-od-5bbdd75864-m6qmh    1/1     Running            0             90m\npyos-od-57946b67c4-m5zc9        0/1     CrashLoopBackOff   5 (17s ago)   3m18s\nspeedtest-od-7f5484966f-kxkw4   1/1     Running            0             90m\n

The pod pyos-od-57946b67c4-m5zc9 has CrashLoopBackOff status. This is wrong.

"},{"location":"3.1/setup/troubleshooting_core_services/#read-the-pods-log_1","title":"Read the pod's log","text":"
kubectl logs -l run=pyos-od -n abcdesktop\n
2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

It's time to fix the abcdesktop-config ConfigMap.

"},{"location":"3.1/setup/troubleshooting_core_services/#start-the-pod-by-hands_1","title":"Start the pod by hands","text":"

If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

Update the container description to replace the default command by a sleep command

      - name : pyos\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.pyos:3.1\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

The container will start the command /usr/bin/sleep for 1d (one day).

A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/pyos-3.1.yaml\ndeployment.apps/pyos-od configured\n

Check that pyos pod is Running

kubectl get pods  -l run=pyos-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\npyos-od-6cd679d6b8-css9q   1/1     Running   0          5s\n

Pyos service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the pyos service by hands.

Run the command cd /var/pyos && ./od.py

kubectl exec -n abcdesktop -it deployment/pyos-od -- bash\nroot@pyos-od-6cd679d6b8-css9q:/var/pyos# cd /var/pyos && ./od.py \n

od.py command returns the same explicit error, the od.config file is wrong.

2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

We need to fix the abcdesktop-config ConfigMap in the yaml file.

kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
"},{"location":"3.1/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

Uninstall abcdesktop for kubernetes

"},{"location":"3.1/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-31","title":"Command to uninstall abcdesktop release 3.1","text":"

To uninstall abcdesktop. Choose run run the uninstall-3.A.sh bash script using a curl.

"},{"location":"3.1/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

Quick uninstallation can be run on Linux or macOS operation system.

Download and extract the uninstall bash script (Linux or macOS):

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.1.sh | bash\n

You should read on stdout

abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n

Please wait for the output message:

[OK] namespace \"abcdesktop\" deleted\n

Great, you have uninstalled abcdesktop for kubernetes.

"},{"location":"3.1/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"
wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.1.sh\nchmod 755 uninstall-3.1.sh\n

Run the uninstall-3.1.sh command line with your own namespace

./uninstall-3.1.sh --namespace superdesktop\n

You should read on stdout

abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n

Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.

"},{"location":"3.2/config/persistentvolumes/","title":"Use PersistentVolume and PersistentVolumeClaim to retain user's home directory files","text":"

To retain user's home directory files, you can define

In most cases with managed providers, you do not need to create a Persistent Volume, just a Persistent Volume Claim. Even in a non-managed set up, the Persistent Volume is generally created by the cluster administrator while Persistent Volume Claim is used by the end-user. The Persistent Volume Claim is namespaced ressource.

Optionally, if you need a cluster administrator role, then abcdestkop can create Persistent Volume and Persistent Volume Claim.

"},{"location":"3.2/config/persistentvolumes/#define-clusterrole-only-if-you-need-to-create-persistent-volume","title":"Define ClusterRole only if you need to create Persistent Volume","text":"

Persistent Volume is a non-namespaced resource, so you need to update the pyos-role to ClusterRole to allow methods [ \"get\", \"list\", \"create\", \"patch\", \"delete\" ]

- apiGroups: [\"\"]\n  resources: [\"persistentvolumes\"]\n  verbs: [\"get\", \"list\", \"create\", \"patch\", \"delete\"] \n

Update the default pyos role to ClusterRole

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
"},{"location":"3.2/config/persistentvolumes/#define-persistent-volume-and-persistent-volume-claim","title":"Define persistent volume and persistent volume claim","text":"

To define Persistent Volume or Persistent Volume Claim, update the od.config file and set

desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: { YOUR PERSISTENT VOLUME DICT CONFIGURATION TEMPLATE - THIS CAN BE NONE }\ndesktop.persistentvolumeclaim: 'NAME OF AN EXISTING PVC' OR { YOUR PERSISTENT VOLUME CLAIM DICT CONFIGURATION TEMPLATE } \ndesktop.removepersistentvolume: False\ndesktop.removepersistentvolumeclaim: True\n
"},{"location":"3.2/config/persistentvolumes/#desktophomedirectorytype","title":"desktop.homedirectorytype","text":"

To use desktop.persistentvolume and desktop.persistentvolumeclaim values, the desktop.homedirectorytype must be set to persistentVolumeClaim

desktop.homedirectorytype: 'persistentVolumeClaim'\n
"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolume-is-optional","title":"Define desktop.persistentvolume is optional","text":"

desktop.persistentvolume is optional, the default value is None. desktop.persistentvolume can be None, or a string or a dict.

If desktop.persistentvolume is None then abcdesktop does not create a persistent volume. The persistent volumes should already exist or created by another provisioning engine.

If desktop.persistentvolume is a string, it must match the name of a persistentvolume. abcdesktop does not create the persistent volume. The persistent volumes should already exist.

If desktop.persistentvolume is a dict then abcdesktop creates the persistent volume. The dict values of persistent volume support template values.

For example :

desktop.persistentvolume: {\n    'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n    'spec': {\n    'storageClassName': 'nfs-csi',\n    'mountOptions': [\n      'nfsvers=3'\n    ],\n    'capacity': {\n      'storage': '10Gi'\n    },\n    'accessModes': [ 'ReadWriteOnce' ],\n    'csi': {\n      'driver': 'nfs.csi.k8s.io',\n      'readOnly': False,\n      'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n      'volumeAttributes': {\n          'server': '192.168.7.101',\n          'share': '/volume1/homedir/{{ userid }}'\n      } } } }\n

If you set desktop.persistentvolume to None, or if you create the persistent volume manualy, then you don't need to update the pyos role.

"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim","title":"Define desktop.persistentvolumeclaim","text":"

desktop.persistentvolumeclaim is optional, the default value is None. The type of desktop.persistentvolumeclaim can be None, or a string or a dict.

If desktop.homedirectorytype is set to 'persistentVolumeClaim', then desktop.persistentvolumeclaim must be defined as a dict or a string.

Kubernetes persistent volume is a namespaced resource, so you can keep the default rbac-role for pyos-role.

if desktop.persistentvolume option is defined then abcdesktop sets the persistent volume claim specification attribut volumeName value to the created persistent volume.

Get more information about PersistentVolume and PersistentVolumeClaim.

"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-string","title":"Define desktop.persistentvolumeclaim as a string","text":"

All pods will share the same persistent volume claim, and the same persistent volume. The access mode must be ReadWriteMany, else only one pod (the first one) will bound the pvc.

Create a persistent volume

kubectl get pv -n abcdesktop\nNAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGE\npv-nfs   10Gi       RWX            Retain           Bound    abcdesktop/homedir         nfs-csi                 3d22h\n
kubectl describe pv pv-nfs \nName:            pv-nfs\nLabels:          <none>\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\n                 pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/homedir\nReclaim Policy:  Retain\nAccess Modes:    RWX\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      nfs-server.default.svc.cluster.local/share##\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir\nEvents:                <none>\n

Create a persistent volume claim

kubectl get pvc -n abcdesktop\nNAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE\nhomedir   Bound    pv-nfs   10Gi       RWX            nfs-csi        3d22h\n
kubectl describe pvc homedir -n abcdesktop\nName:          homedir\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        pv-nfs\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWX\nVolumeMode:    Filesystem\nUsed By:       fry-88a6e\n               hermes-7d84b\nEvents:        <none>\n

In the od.config file, set the values

desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: 'homedir'\ndesktop.removepersistentvolumeclaim: False\n

If you need to use subPath

desktop.persistentvolumeclaimforcesubpath: True\n

'subPath' is not supported for ephemeral container.

"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-dictionary","title":"Define desktop.persistentvolumeclaim as a dictionary","text":"

in od.config file

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}',\n    },\n    'spec': {\n      'storageClassName': 'mystorageclass',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteMany' ] } }\n

Replace mystorageclass by storageclass of your cloud provider.

To list the storage classes

kubectl get storageclass\n
NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE\ngp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false \n
NAME                          PROVISIONER                    RECLAIMPOLICY          Immediate           false                  3h22m\ndo-block-storage (default)    dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-retain       dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\ndo-block-storage-xfs          dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-xfs-retain   dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\n
"},{"location":"3.2/config/persistentvolumes/#template-values-for-desktoppersistentvolumespec-and-desktoppersistentvolumeclaim","title":"Template values for desktop.persistentvolumespec and desktop.persistentvolumeclaim","text":"

Value defines inside {{ VALUE }} is replaced by the templated value keys:

The template values can be one of them :

var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale uuid a uniqu uuid template tag value tag value set by auth rules

The uuid have the same value for the persistent volume and for the persistent volume claim. uuid can be use for naming the PVC or the PV, or on all string values.

desktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}-{{ uuid }}',\n    },\n    'spec': {\n      'volumeName': '{{ provider }}-{{ userid }}-{{ uuid }}',\n      'storageClassName': 'nfs-csi',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteOnce' ] } }\n\ndesktop.persistentvolume: {\n    'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n    'spec': {\n    'storageClassName': 'nfs-csi',\n    'mountOptions': [\n      'nfsvers=3'\n    ],\n    'capacity': {\n      'storage': '10Gi'\n    },\n    'accessModes': [ 'ReadWriteOnce' ],\n    'csi': {\n      'driver': 'nfs.csi.k8s.io',\n      'readOnly': False,\n      'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n      'volumeAttributes': {\n          'server': '192.168.7.101',\n          'share': '/volume1/homedir/{{ userid }}'\n      } } } }\n

The variables persistentvolumeclaim and persistentvolume become

desktop.persistentvolumeclaim: {\n      'metadata': {'name': 'planet-fry-1841f'}, \n      'spec': {\n        'volumeName': 'planet-fry-1841f', \n        'storageClassName': 'nfs-csi', \n        'resources': {\n          'requests': {'storage': '1Gi'}\n        }, \n        'accessModes': ['ReadWriteOnce']\n      }\n}\ndesktop.persistentvolume: {\n     'metadata': { 'name': 'planet-fry-1841f'}, \n     'spec': {\n       'storageClassName': 'nfs-csi', \n       'mountOptions': ['nfsvers=3'], \n       'capacity': {'storage': '10Gi'}, \n       'accessModes': ['ReadWriteOnce'], \n       'csi': {\n         'driver': 'nfs.csi.k8s.io', \n         'readOnly': False, \n         'volumeHandle': '192.168.7.101#volume1#homedir#fry',\n         'volumeAttributes': {\n           'server': '192.168.7.101', \n           'share': '/volume1/homedir/fry'\n         }\n       }\n      }\n}\n
"},{"location":"3.2/config/persistentvolumes/#desktopremovepersistentvolume","title":"desktop.removepersistentvolume","text":"

During the remove desktop process, delete or not the persistent volume. The persistent volume can be delete only if the desktop.deletepersistentvolumeclaim is True.

The default value for desktop.removepersistentvolume is False.

"},{"location":"3.2/config/persistentvolumes/#desktopremovepersistentvolumeclaim","title":"desktop.removepersistentvolumeclaim","text":"

During the remove desktop process, delete or not the persistent volume claim.

The default value for desktop.removepersistentvolumeclaim is False.

"},{"location":"3.2/config/persistentvolumes/#define-persistentvolume-using-csi-driver-nfs","title":"Define persistentVolume using csi-driver-nfs","text":"

In this example, we use nfs protocol to share user home directory on each worker node

Use the https://github.com/kubernetes-csi/csi-driver-nfs as a csi-driver-nfs with a nfs server as backend.

"},{"location":"3.2/config/persistentvolumes/#on-the-nfs-server","title":"On the nfs server","text":"

On the nfs server, create an export with the no_root_squash option

For example export /volume1/pods

/volume1/pods        192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
"},{"location":"3.2/config/persistentvolumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs","text":"

Run the install install-driver.sh command from kubernetes-csi/csi-driver-nfs GitHub repository.

curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n

Create a storage class file nfs-csi-sc-ds01.yaml,

Content of the default nfs-csi-sc-ds01.yaml

apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n  server: 192.168.7.101\n  share: /volume1/pods\n  mountPermissions: \"0755\"\n  # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n  # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n  # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n  - nfsvers=3\n
kubectl apply -f nfs-csi-sc-ds01.yaml\n

You read the response on stdout

storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n

Check the storage class nfs-csi-sc-ds01

kubectl get sc\nNAME                 PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE\nnfs-csi-sc-ds01      nfs.csi.k8s.io   Delete          Immediate           false                  18m\n
"},{"location":"3.2/config/persistentvolumes/#update-the-odconfig-file","title":"Update the od.config file","text":"

In your od.config file, define the entry desktop.persistentvolumeclaim

The Persistent Volume and Persistent Volume Claim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.deletepersistentvolume: False\ndesktop.deletepersistentvolumeclaim: True\ndesktop.persistentvolume: {\n            'metadata': { 'name': '{{ provider }}-{{ userid }}' },\n            'spec': {\n            'storageClassName': 'nfs-csi',\n            'mountOptions': [\n              'nfsvers=3'\n            ],\n            'capacity': {\n              'storage': '10Gi'\n            },\n            'accessModes': [ 'ReadWriteOnce' ],\n            'csi': {\n              'driver': 'nfs.csi.k8s.io',\n              'readOnly': False,\n              'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n              'volumeAttributes': {\n                  'server': '192.168.7.101',\n                  'share': '/volume1/homedir/{{ userid }}'\n              } } } }\n\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'nfs-csi',\n              'volumeName': '{{ provider }}-{{ userid }}',\n              'resources': { \n                'requests': { \n                  'storage': '1Gi'\n                } \n            },\n            'accessModes': [ 'ReadWriteMany' ] } }\n

Update the new config file and restart pyos pods. Update the pyos role to allow

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n

abcdesktop creates PV and PVC for you.

"},{"location":"3.2/config/persistentvolumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

Login as user (Philip J. Fry, fry)

The new desktop for Philip J. Fry is created.

Start the web shell command using the search bar

Using the web shell application start the df command

The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32

"},{"location":"3.2/config/persistentvolumes/#list-the-persistentvolume-and-persistentvolumeclaim","title":"List the PersistentVolume and PersistentVolumeClaim","text":"

List the new PersistentVolume

kubectl get pv \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS      REASON   AGE\nplanet-fry                                 10Gi       RWO            Retain           Bound    abcdesktop/planet-fry         nfs-csi                    2m58s\n

List the new PersistentVolumeClaim

kubectl get pvc -n abcdesktop \nNAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE\nplanet-fry         Bound    planet-fry                                 10Gi       RWO            nfs-csi        107s\n

Get the persistent volume claim's description

kubectl describe pvc planet-fry  -n abcdesktop\nName:          planet-fry\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        planet-fry\nLabels:        access_provider=planet\n               access_providertype=ldap\n               access_userid=fry\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWO\nVolumeMode:    Filesystem\nUsed By:       fry-055f6\nEvents:        <none>\n

Get the persistent volume description

kubectl describe pv planet-fry\nName:            planet-fry\nLabels:          access_provider=planet\n                 access_providertype=ldap\n                 access_userid=fry\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/planet-fry\nReclaim Policy:  Retain\nAccess Modes:    RWO\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      192.168.7.101#volume1#homedir#fry\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir/fry\nEvents:                <none>\n
"},{"location":"3.2/config/persistentvolumes/#define-persistentvolume-using-storage-class-do-block-storage-on-digitalocean","title":"Define persistentVolume using storage class do-block-storage on digitalocean","text":""},{"location":"3.2/config/persistentvolumes/#update-odconfig-file","title":"Update od.config file","text":"

Update od.config file with the options

desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'do-block-storage',\n              'resources': {\n                'requests': {\n                  'storage': '1Gi'\n                }\n            },\n            'accessModes': [ 'ReadWriteOnce' ] } }\n

Update the configmap

kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n

Restart pyos pod

kubectl delete pods -l run=pyos-od -n abcdesktop\n

Login to your abcdesktop service, you should read on the html page, the status

b.Reading your persistent volume claim planet-fry, status is Pending, using storage class do-block-storage ....\nb.Creating your desktop\nb.Successfully assigned abcdesktop/fry-0d805 to pool-g8u8ddr44-yhh3i.................\nb.Your pod gets event SuccessfulAttachVolume AttachVolume.Attach succeeded for volume \"pvc-38899590-c94a-4849-a111-31ae7de624e1\" ..\nb.Started container i-planet-fry\nb.pending: x-planet-fry is starting\nb.Created container x-planet-fry\nb.Your pod fry-0d805 is Pending..\nc.Waiting for desktop graphical service 1/42........\nc.Waiting for desktop spawner service 1/42\nc.Waiting for desktop graphical service 2/42\nRock and roll\n

Read the new pod for fry the user fry

kubectl get pods  -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nfry-0d805                       4/4     Running   0          17m\nmemcached-od-5ff8844d56-lcn7p   1/1     Running   0          106m\nmongodb-od-77c945467d-97g8w     1/1     Running   0          106m\nnginx-od-7445969696-lpfhh       1/1     Running   0          106m\nopenldap-od-5bbdd75864-dprvl    1/1     Running   0          106m\npyos-od-7584db6787-chtdc        1/1     Running   0          19m\nspeedtest-od-7f5484966f-5pl6k   1/1     Running   0          106m\n

Read the pvc for fry

kubectl get pvc  -n abcdesktop\nNAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE\nplanet-fry   Bound    pvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            do-block-storage   17m\n

Read the pv for fry

kubectl get pv                \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS       REASON   AGE\npvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            Delete           Bound    abcdesktop/planet-fry   do-block-storage            17m\n
"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaimforcesubpath","title":"Define desktop.persistentvolumeclaimforcesubpath","text":"

desktop.persistentvolumeclaimforcesubpath is a boolean. The default value of desktop.persistentvolumeclaimforcesubpath is False

If desktop.persistentvolumeclaimforcesubpath is set to True then persistentvolumeclaim is mounted with the subPath option.

Subpath mounts are not allowed for ephemeral containers. Subpath cannot be updated. So you can run only pod applications, if you set desktop.persistentvolumeclaimforcesubpath to True.

If you try to start an ephemeral container application, you get an error code 422 and the message

{ \n    \"reason\":\"FieldValueForbidden\",\n    \"message\":\"Forbidden: can not be set for an Ephemeral Container\",\n    \"field\":\"spec.ephemeralContainers[8].volumeMounts[0].subPath\"\n}\n
"},{"location":"3.2/config/persistentvolumes/#use-case-for-the-desktoppersistentvolumeclaimforcesubpath-option","title":"Use case for the desktop.persistentvolumeclaimforcesubpath option","text":"

In this case :

We create the unique PersistentVolume named pv-nfs.

---\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  annotations:\n    pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\n  name: pv-nfs\nspec:\n  capacity:\n    storage: 10Gi\n  accessModes:\n    - ReadWriteMany\n  persistentVolumeReclaimPolicy: Retain\n  storageClassName: nfs-csi\n  mountOptions:\n    - nfsvers=3\n  csi:\n    driver: nfs.csi.k8s.io\n    readOnly: false\n    # volumeHandle format: {nfs-server-address}#{sub-dir-name}#{share-name}\n    # make sure this value is unique for every share in the cluster\n    volumeHandle: nfs-server.default.svc.cluster.local/share##\n    volumeAttributes:\n      server: 192.168.7.101\n      share: /volume1/home\n---\n

accessModes is ReadWriteMany for the PersistentVolume

We create the unique PersistentVolumeClaim named pvc-nfs-homedir

---\nkind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n  name: pvc-nfs-homedir\n  namespace: abcdesktop\nspec:\n  accessModes:\n    - ReadWriteMany\n  resources:\n    requests:\n      storage: 10Gi\n  volumeName: pv-nfs\n  storageClassName: nfs-csi\n---\n

accessModes is ReadWriteMany for the PersistentVolumeClaim

We define in od.config file

desktop.persistentvolume: 'pvc-nfs'\ndesktop.persistentvolumeclaim: 'pvc-nfs-homedir'\ndesktop.persistentvolumeclaimforcesubpath : True\n

All pods share the same PersistentVolumeClaim named pvc-nfs-homedir, the desktop.persistentvolumeclaimforcesubpath is set to True, the subPath value is set with the default of the current LDAP userid. So the user's home directory is /volume1/home/{{ userid }}. The nfs server allows user to access subfolders, the mount operation is permitted.

"},{"location":"3.2/config/persistentvolumes/#known-issues","title":"known issues","text":""},{"location":"3.2/config/persistentvolumes/#bound-a-volume-if-desktopdeletepersistentvolumeclaim-is-false","title":"Bound a volume if desktop.deletepersistentvolumeclaim is False","text":"

When desktop.deletepersistentvolumeclaim is True and desktop.deletepersistentvolume is False, if you create manually the persistent volumes, you may have to patch the claimRef of the persistent volumes to make it Available again.

kubectl get pv \nNAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                   STORAGECLASS   REASON   AGE\nplanet-fry  10Gi       RWO            Retain           Released   abcdesktop/planet-fry   nfs-csi                 4m1                           \n
kubectl patch pv planet-fry -p '{\"spec\":{\"claimRef\": null}}' \npersistentvolume/planet-fry patched\n
kubectl get pv \nNAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS   REASON   AGE\nplanet-fry    10Gi       RWO            Retain           Available              nfs-csi                 8m\n
"},{"location":"3.2/config/webrtc/","title":"Configure abcdesktop to use WebRTC","text":"

Play sound from a container to web browser using WebRTC

"},{"location":"3.2/config/webrtc/#webrtc-overview","title":"WebRTC overview","text":""},{"location":"3.2/config/webrtc/#requirements","title":"Requirements","text":""},{"location":"3.2/config/webrtc/#webrtc-design","title":"WebRTC design","text":"

abcdesktop/pulseaudio:3.2 container executes the following services

"},{"location":"3.2/config/webrtc/#stun-server","title":"STUN server","text":"

STUN servers are used by both client and abcdesktop WebRTC to determine their IP address as visible by the global Internet.

The STUN server can to hosted on a dedicated droplets and on an external network. For a public Internet usage, the Google-hosted STUN servers is a good

{ 'urls': 'stun:stun.l.google.com:19302' }\n
"},{"location":"3.2/config/webrtc/#turn-server","title":"TURN server","text":"

The TURN server can to hosted on a dedicated droplets and on an external network. To reduce latency you should host your TURN server near your kubernetes network.

You can run coturn service on dedicated machines or virtual machines, to avoid any scenario where the port range is being restricted or set arbitrarily by the infrastructure or orchestration tools.

"},{"location":"3.2/config/webrtc/#coturn-server","title":"COTURN server","text":"

coturn is a free open source implementation of TURN and STUN Server. The TURN Server is a VoIP media traffic NAT traversal server and gateway.

apt-get install coturn \n

You need a X509 certificates to use TURN over TLS. Let's Encrypt provides X.509 certificates for Transport Layer Security (TLS) encryption at no charge.

Default minimal configuration file /etc/turnserver.conf for abcdesktop.

listening-port=3478\ntls-listening-port=5349\nlt-cred-mech\nuse-auth-secret\nstatic-auth-secret=CHANGEME\nserver-name=turn.domain.local\nrealm=turn.domain.local\ncert=/usr/local/etc/turn.domain.local.pem\npkey=/usr/local/etc/turn.domain.local.pem\n

Update the following configuration file with you own values

Then start your turn service.

"},{"location":"3.2/config/webrtc/#update-configmap-odconfig-file","title":"Update configmap od.config file","text":"

Add new webrtc's entries

webrtc.enable:True\nwebrtc.rtc_configuration:{ 'iceServers':[ {'urls':'stun:stun.l.google.com:19302'} ] }\nwebrtc.coturn: { \n  'coturn_static_auth_secret': 'CHANGEME', \n  'ttl':3600,\n  'protocol': 'turns',\n  'url': 'turn.domain.local:3478' }\n

pyos merges a new rtc_configuration json document from the webrtc.coturn and from webrtc.coturn values.

pyos adds username and credential entries. For example, a new rtc_configuration json document is send to the web browser

{\n  \"iceServers\": [\n    { \"urls\": \"stun:stun.l.google.com:19302\" },\n    { \"urls\": \"turns:nturns.domain.local:3478\",\n      \"username\": \"1703086872\",\n      \"credential\": \"+BuFkb0hFf8pAoFwpp0A0UbO+1k=\" } \n  ]\n}\n

STUN_SERVER value is used by the gstreamer webrtcbin

desktop.envlocal :  { \n  'STUN_SERVER': 'stun://stun.l.google.com:19302',\n}\n

Update the value 'enable': False to 'enable': True

desktop.pod : \n\n    ...[CUT HERE ]...\n\n'sound': { \n    'image': 'abcdesktopio/oc.pulseaudio:3.2',\n    'pullpolicy': 'IfNotPresent',\n    'enable': True,\n    'tcpport': 4714,\n    'acl':  { 'permit': [ 'all' ] },\n    'resources': { \n        'requests': { 'memory': \"8Mi\", 'cpu': \"50m\"  },  \n        'limits'  : { 'memory': \"2Gi\", 'cpu': \"2000m\" } \n    } },\n\n    ...[CUT HERE ]...\n\n
kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
kubectl delete pods -l run=pyos-od -n abcdesktop\n
"},{"location":"3.2/config/webrtc/#connect-to-your-desktop","title":"connect to your desktop","text":"

Open your web browser, and go to your abcdesktop web site.

Make sure to use secured https protocol, else WebRTC is disabled.

"},{"location":"3.2/config/webrtc/#step-1-login-using-credentials","title":"Step 1, login using credentials","text":"

Login using credentials, for example

The sound is not yet available

"},{"location":"3.2/config/webrtc/#step-2-sound-becomes-available","title":"Step 2, sound becomes available","text":"

Few seconds later, sound becomes available.

The sound is available. The web browser has an access to local sound devices. The web browser has an access to local speaker. The web browser can get an access to local microphone only if the user allows the access.

"},{"location":"3.2/config/webrtc/#play-sound-with-paplay","title":"Play sound with paplay","text":"

Open a Terminal Web Shell application and run the command inside the web shell

paplay /usr/share/sounds/alsa/Rear_Center.wav \n

You should heard Rear Center on your local sound device

"},{"location":"3.2/config/webrtc/#test-microphone-access","title":"Test microphone access","text":"

Open a Terminal Web Shell application and run the command inside the web shell

pavumeter --record\n

You should see cursor changes if you talk to your abcdesktop

"},{"location":"3.2/config/webrtc/#step-3-look-at-the-web-browsers-console-log","title":"Step 3, look at the web browser's console log","text":"

Open the web browser's console log to read the WebRTC messages

Read the json rtc_configuration document created by pyos pod

Read the step Created peer connection for call and creating SDP and step Exchange from foundation for 1 to 6

Read the step Exchange from foundation from 6 to 9

Read the step Local stream answer

The last line is ICE Candidate was null, done

The sound is now enabled

"},{"location":"3.2/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.2/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"

To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.

"},{"location":"3.2/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204","title":"Install Kubernetes on Ubuntu 22.04","text":"

These commands install the latest Kubernetes on a single node Ubuntu 22.04. km is a command tools from https://github.com/jfv-opensource/kube-tools repository.

Clone kube-tools and run km --apply as root.

git clone https://github.com/jfv-opensource/kube-tools.git\ncd kube-tools\n./km --apply\n

kube-tools installs and configures all components. kube-tools runs a simple hello-world pods to check the pods execution.

Configure repositories & install packages\n2023-10-06 12:37:52 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Installing base needed packages\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Adding docker package repository signature\nGet:1 file:/etc/apt/apt-mirrors.txt Mirrorlist [142 B]\nGet:6 https://download.docker.com/linux/ubuntu jammy InRelease [48.9 kB]\nHit:7 https://packages.microsoft.com/ubuntu/22.04/prod jammy InRelease\nHit:2 http://azure.archive.ubuntu.com/ubuntu jammy InRelease\nHit:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates InRelease\nHit:4 http://azure.archive.ubuntu.com/ubuntu jammy-backports InRelease\nHit:5 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease\nGet:8 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [22.2 kB]\nHit:9 https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu jammy InRelease\nFetched 71.0 kB in 1s (71.4 kB/s)\nReading package lists...\nRepository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable'\nDescription:\nArchive for codename: jammy components: stable\nMore info: https://download.docker.com/linux/ubuntu\nAdding repository.\nAdding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\nAdding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\n2023-10-06 12:37:59 [OK] - fv-az1111-309: Adding docker package repository\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository signature\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository\n2023-10-06 12:38:03 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Installing kubectl\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Freezing kubernetes tools version\nConfigure system\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this session\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this file /etc/fstab\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module overlay\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module br_netfilter\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module load for containerd\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Installing containerd & kubernetes tools\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Freezing kubernetes tools version\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 1#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 2#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Restarting containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Enabling containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Configuring network for kubernetes\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Applying system configuration\nConfigure kubernetes\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Starting master node\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Writting kubernetes config file to /root/.kube/config\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Loading network configuration into cluster\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Allowing pods on master because of standalone node\n2023-10-06 12:38:54 [INFO] - fv-az1111-309: Waiting for node fv-az1111-309 condition=Ready during timeout=600s\n2023-10-06 12:39:01 [OK] - fv-az1111-309: Your cluster is Ready\nError from server (NotFound): serviceaccounts \"default\" not found\n2023-10-06 12:39:01 [INFO] - fv-az1111-309:  retry 1/10 default account service account is net yet created, sleeping for 5s\n2023-10-06 12:39:07 [OK] - fv-az1111-309: default account service account is created\n2023-10-06 12:39:07 [OK] - fv-az1111-309: create pod-helloworld\n2023-10-06 12:39:12 [OK] - fv-az1111-309: pod-helloworld says hello world\n2023-10-06 12:39:17 [OK] - fv-az1111-309: delete pod-helloworld\nConfiguration archive\n2023-10-06 12:39:17 [OK] - fv-az1111-309: Generating config archive\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"

abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.

The abcdesktop infrastructure is using the contianers :

Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.2 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.2 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.2/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

You need to have a

You can run the Quick installation process or choose the Manually installation step by step

Linux operating system is recommanded to run abcdesktop.io.

"},{"location":"3.2/setup/kubernetes_abcdesktop/#quick-installation-microsoft-windows","title":"Quick installation (Microsoft Windows)","text":"

If you are using a Microsoft Windows operating system please follow the dedicated link below Quick install for windows

"},{"location":"3.2/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

Quick installation can be run on Linux or macOS operation system.

Download and extract the latest release automatically (Linux or macOS):

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh | bash\n

You can read on stdout

[INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys create\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-6dt28 Ready\n[OK] pod/memcached-od-5ff8844d56-6dt28 condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-r82kv Ready\n[OK] pod/mongodb-od-77c945467d-r82kv condition met\n[INFO] waiting for pod/nginx-od-7445969696-6z88w Ready\n[OK] pod/nginx-od-7445969696-6z88w condition met\n[INFO] waiting for pod/openldap-od-5bbdd75864-d5bpq Ready\n[OK] pod/openldap-od-5bbdd75864-d5bpq condition met\n[INFO] waiting for pod/pyos-od-7584db6787-vnp64 Ready\n[OK] pod/pyos-od-7584db6787-vnp64 condition met\n[INFO] waiting for pod/speedtest-od-7f5484966f-jsb2m Ready\n[OK] pod/speedtest-od-7f5484966f-jsb2m condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-6dt28   1/1     Running   0          40s\nmongodb-od-77c945467d-r82kv     1/1     Running   0          40s\nnginx-od-7445969696-6z88w       1/1     Running   0          40s\nopenldap-od-5bbdd75864-d5bpq    1/1     Running   0          38s\npyos-od-7584db6787-vnp64        1/1     Running   0          39s\nspeedtest-od-7f5484966f-jsb2m   1/1     Running   0          39s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

"},{"location":"3.2/setup/kubernetes_abcdesktop/#change-the-default-namespace","title":"Change the default namespace","text":"

You may need to replace the default namespace abcdesktop by your own during the install process. The install-3.2.sh bash script allow you to set the new namespace as an option.

wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh\nchmod 755 install-3.2.sh \n

Run install-3.2.sh

./install-3.2.sh --namespace superdesktop\n
[INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] use local file poduser.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-b75fb Ready\n[OK] pod/memcached-od-5ff8844d56-b75fb condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-t8cv7 Ready\n[OK] pod/mongodb-od-77c945467d-t8cv7 condition met\n[INFO] waiting for pod/nginx-od-b8c8c7b95-lkjl6 Ready\n[OK] pod/nginx-od-b8c8c7b95-lkjl6 condition met\n[INFO] waiting for pod/openldap-od-56b6564c85-2npln Ready\n[OK] pod/openldap-od-56b6564c85-2npln condition met\n[INFO] waiting for pod/pyos-od-67dfc48d84-kww9n Ready\n[OK] pod/pyos-od-67dfc48d84-kww9n condition met\n[INFO] waiting for pod/speedtest-od-894b7c886-69vc4 Ready\n[OK] pod/speedtest-od-894b7c886-69vc4 condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-b75fb   1/1     Running   0          20s\nmongodb-od-77c945467d-t8cv7     1/1     Running   0          20s\nnginx-od-b8c8c7b95-lkjl6        1/1     Running   0          20s\nopenldap-od-56b6564c85-2npln    1/1     Running   0          18s\npyos-od-67dfc48d84-kww9n        1/1     Running   0          20s\nspeedtest-od-894b7c886-69vc4    1/1     Running   0          20s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

"},{"location":"3.2/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.2/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

We will create the abcdesktop namespace and set it as default :

kubectl create namespace abcdesktop\n

You should read on the standard output

namespace/abcdesktop created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

The following commands will let you create all necessary keys :

openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

Then, create the kubernetes secrets from the new key files:

kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

You should read on the standard output :

secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

You can verify secrets creation with the following command :

kubectl get secrets -n abcdesktop\n

You should read on the standard output :

NAME                          TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"

Create a pod user to make sure that Kubernetes will find the docker images at startup time.

kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n

You should read on stdout

pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n

You can wait for user pod is Ready, this while take a while, for container images are downloading.

kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5  -n abcdesktop --timeout=-1s\n
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n

You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5. The container images are downloaded.

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"

Download the od.config file. This is the main configuration file for pyos control plane.

curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2 --output od.config\n

Create the config map abcdesktop-config in the abcdesktop namespace

kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

You should read on sdtout

configmap/abcdesktop-config created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"

abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

Run the command line

kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n

You should read on the standard output

role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

kubectl get pods -n abcdesktop\n

You should read on the standard output

NAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          18s\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          18s\nnginx-od-7445969696-mwlc9       1/1     Running   0          18s\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          18s\npyos-od-7584db6787-tjlvk        1/1     Running   0          18s\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          18s\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

Open your navigator to http://[your-ip-hostname]:30443/

abcdesktop homepage should be available :

Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

Also, you can run again the command

kubectl get pods -n abcdesktop\n

You should see that the anonymous-XXXXX pod have been created and is Running

NAME                            READY   STATUS    RESTARTS   AGE\nanonymous-50b0f                 4/4     Running   0          5m22s\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          77m\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          77m\nnginx-od-7445969696-mwlc9       1/1     Running   0          77m\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          77m\npyos-od-7584db6787-tjlvk        1/1     Running   0          77m\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          77m\n

Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications

"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

Quick installation can be run on Linux or macOS operation system.

Download and execute the pullapps-3.2.sh script :

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.2.sh | bash\n

This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#quick-application-install-windows","title":"Quick application install (Windows)","text":"

Quick installation can be run on Windows operation system.

Download and execute the pullapps-3.2.ps1 script :

$script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.2.ps1 \n\nInvoke-Expression $($script.Content)\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

Now reconnect to your abcdesktop.

Open your navigator to http://[your-ip-hostname]:30443/

http://localhost:30443/\n

The new applications are installed, and ready to run.

"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

Add new application, require to send an application json document to the control-plane pyos.

"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.2

curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.1/2048-alpine.d.3.2.json --output 2048.json\n

To inspect image json you can also run crictl inspecti or docker inspect command.

The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

Send the 2048.json file to the images REST endpoint

curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n

The response is the json document.

[{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GETcurl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/imagePUTcurl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.jsonPOSTcurl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.jsonDELETEcurl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

kubectl get pods -n abcdesktop\n

The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

Then the pod STATUS become Running during 42 seconds.

NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

This pod is created to ask Kubernetes for pulling the container image.

"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

Now reconnect to your abcdesktop.

Open your navigator to http://[your-ip-hostname]:30443/

http://localhost:30443/\n

The new applications are installed, and ready to run.

"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/","title":"Kubernetes abcdesktop windows","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#quick-installation-windows","title":"Quick installation (Windows)","text":"

Quick installation can be run on Windows operation system.

"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#prerequisites","title":"Prerequisites","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#install-and-configure-docker-desktop","title":"Install and configure Docker Desktop","text":"

To run abcdesktop on Microsoft Windows plateform you need to use docker desktop

Start Docker Desktop and wait for the docker engine to start.

Once started go to the Settings | Kubernetes and click on Enable Kubernetes, starting your cluster may take a while.

Now your cluster should be correctly initialized, you can check it by opening a new PowerShell and run the command kubectl version

kubectl version\nclient version: V1.40.4\nKustomise Version: V9-0-4-0.202506011699445602001590025\nServer Version: v1.28.2\n

"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#install-openssl","title":"Install OpenSSL","text":"

abcdesktop install process creates RSA keys using openssl, you need to install openssl command line.

Download the OpenSSL v3.2.0 Light executable file.

Then follow the install process.

Make sure to keep in mind the path where OpenSSL will be installed.

Once installed, go to \"Edit the system environement variables\", and click on \"Environement variables\".

Go to the system variables section and search for Path

Click on Edit and add a new Path, you have to paste the absolute path to the bin folder of OpenSSL.

Now OpenSSL should be correctly installed, you can check it by opening a new PowerShell and run the command

openssl version\n

"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#run-the-install-script","title":"Run the install script","text":"

Download and extract the latest release automatically (Windows):

$script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.ps1\n\nInvoke-Expression $($script.Content)\n

You should read on stdout

[INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-x89kq   1/1     Running   0          11s\nmongodb-od-77c945467d-c5cw4     1/1     Running   0          11s\nnginx-od-86c5dfcc67-nfvbq       1/1     Running   0          11s\nopenldap-od-5bbdd75864-mzzmh    1/1     Running   0          11s\npyos-od-7646bf4786-c2hdm        1/1     Running   0          11s\nspeedtest-od-7f5484966f-6t4b2   1/1     Running   0          11s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-86c5dfcc67-nfvbq --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

You can open a web browser and go to the http://localhost:30443/

"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#change-the-default-namespace","title":"Change the default namespace","text":"

You may need to replace the default namespace abcdesktop by your own. The install-3.2.ps1 PowerShell script allows you to set the new namespace as an option.

curl https://raw.githubusercontent.com/Matt307082/powershell-scripts/master/install-3.2.ps1 -OutFile install-3.2.ps1\n

Run install-3.2.ps1

.\\install-3.2.ps1 --namespace superdesktop\n

You should read on stdout

[INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-98t4t   1/1     Running   0          23s\nmongodb-od-77c945467d-v4k58     1/1     Running   0          23s\nnginx-od-7c7bf5bf48-khtvg       1/1     Running   0          23s\nopenldap-od-56b6564c85-t56tj    1/1     Running   0          21s\npyos-od-644c98bcd5-8gqzd        1/1     Running   0          23s\nspeedtest-od-894b7c886-fgt6v    1/1     Running   0          23s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-86c5dfcc67-nfvbq --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

You can open a web browser and go to the http://localhost:30443/

"},{"location":"3.2/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

Uninstall abcdesktop for kubernetes

"},{"location":"3.2/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-32","title":"Command to uninstall abcdesktop release 3.2","text":"

To uninstall abcdesktop. Choose run run the uninstall-3.2.sh bash script using a curl.

"},{"location":"3.2/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

If you are using a Windows operating system please click on the link below Quick uninstall for windows

"},{"location":"3.2/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

Quick uninstallation can be run on Linux or macOS operation system.

Download and extract the uninstall bash script (Linux or macOS):

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.sh | bash\n

You should read on stdout

abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n

Please wait for the output message:

[OK] namespace \"abcdesktop\" deleted\n

Great, you have uninstalled abcdesktop for kubernetes.

"},{"location":"3.2/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"
wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.sh\nchmod 755 uninstall-3.2.sh\n

Run the uninstall-3.2.sh command line with your own namespace

./uninstall-3.2.sh --namespace superdesktop\n

You should read on stdout

abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n

Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.

"},{"location":"3.2/setup/uninstall_kubernetes_windows/","title":"Uninstall kubernetes windows","text":""},{"location":"3.2/setup/uninstall_kubernetes_windows/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

Quick uninstallation can be run on Windows operation system.

Download and extract the uninstall PowerShell script (Windows):

$script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.ps1 \n\nInvoke-Expression $($script.Content)\n

You should read on stdout

[INFO] abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
"},{"location":"3.2/setup/uninstall_kubernetes_windows/#uninstall-with-a-dedicated-namespace","title":"Uninstall with a dedicated namespace","text":"
curl https://raw.githubusercontent.com/Matt307082/powershell-scripts/master/uninstall-3.2.ps1 -OutFile uninstall-3.2.ps1\n

Run the uninstall-3.2.ps1 command line with your own namespace

.\\uninstall-3.2.ps1 --namespace superdesktop\n

You should read on stdout

[INFO] abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
"},{"location":"about/authors/","title":"Authors and Contributors","text":""},{"location":"about/authors/#primary-authors","title":"Primary Authors","text":""},{"location":"about/authors/#other-contributors","title":"Other Contributors","text":"

The incomplete list of individuals below have provided patches or otherwise contribute to the project prior to the project being hosted on GitHub. See the GitHub commit log for a list of recent contributors. We would like to thank everyone who has contributed to the project in any way.

"},{"location":"about/gnu-gpl-v2.0/","title":"GNU General Public License","text":"

Version 2, June 1991 Copyright \u00a9 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

"},{"location":"about/gnu-gpl-v2.0/#preamble","title":"Preamble","text":"

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

"},{"location":"about/gnu-gpl-v2.0/#terms-and-conditions-for-copying-distribution-and-modification","title":"TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION","text":"

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The \u201cProgram\u201d, below, refers to any such program or work, and a \u201cwork based on the Program\u201d means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term \u201cmodification\u201d.) Each licensee is addressed as \u201cyou\u201d.

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and \u201cany later version\u201d, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

"},{"location":"about/gnu-gpl-v2.0/#no-warranty","title":"NO WARRANTY","text":"

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \u201cAS IS\u201d WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS

"},{"location":"about/gnu-gpl-v2.0/#how-to-apply-these-terms-to-your-new-programs","title":"How to Apply These Terms to Your New Programs","text":"

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the \u201ccopyright\u201d line and a pointer to where the full notice is found.

<one line to give the program's name and a brief idea of what it does.>\nCopyright (C) <year>  <name of author>\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 2 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

Gnomovision version 69, Copyright (C) year name of author\nGnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\nThis is free software, and you are welcome to redistribute it\nunder certain conditions; type `show c' for details.\n

The hypothetical commands show w and show c should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than show w and show c; they could even be mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a \u201ccopyright disclaimer\u201d for the program, if necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n`Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n<signature of Ty Coon>, 1 April 1989\nTy Coon, President of Vice\n

This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.

"},{"location":"about/howreadthisdoc/","title":"How to read the abcdesktop.io documentation","text":""},{"location":"about/howreadthisdoc/#abcdesktopio-documentation","title":"abcdesktop.io documentation","text":"

The abcdesktop.io documentation brings you labs and tutorials that help you get hands-on experience using abcdesktop.io. You will find a mix of labs and tutorials that will help abcdesktop.io users, including sysadmins, IT Pros, and developers. There is a mix of hands-on tutorials right in the browser, instructions on setting up and using abcdesktop.io in your own environment (docker and kubernetes), and resources about best practices for developing and deploying your own abcdesktop.io applications.

We recommend you to start in docker mode first with the Setup Guide in docker mode.

Then explore the individual labs that explore many advanced features of abcdesktop.io, in Configuration Guide

You can also, read the genesis chapters GUI apps on Docker.

Learn more about abcdesktop.io, how it can help you deploy secure, scalable applications and save money along the way.

"},{"location":"about/howreadthisdoc/#the-basics-of-abcdesktopio","title":"The Basics of abcdesktop.io","text":"

Learn more about the core concepts of abcdesktop.io and what it can do for your operations team, and help you understand the fundamental value proposition for abcdesktop.io.

Topics include:

"},{"location":"about/howreadthisdoc/#the-advanced-of-abcdesktopio","title":"The Advanced of abcdesktop.io","text":"

This stage will help you learn more about some of the advanced topics of abcdesktop.io using Kubernetes.

Topics include:

"},{"location":"about/howtodolabsexercices/","title":"How to do the labs and exercices","text":"

abcdesktop labs and tutorials are written using a desktop host. The supported operating system are :

Operating System Recommended version GNU/Linux Ubuntu 18.04.4 LTS (Bionic Beaver) macOS/X Catalina version 10.15.3 (and above) Windows 10 Version 1703 (and above)"},{"location":"about/howtodolabsexercices/#choose-desktop-or-server","title":"Choose desktop or server","text":"

For example, if you are doing the exercice on a hostname 'server01.labs.domain.local', you have to translate the URL request http://localhost with http://server01.labs.domain.local

Your web browser (like Google Chrome) may refuse unsecure websocket (ws) connections to localhost or your FQDN (only wss, so you should setup a TLS certificate for your local web/websocket server). It should work without any issues in Mozilla Firefox on localhost.

"},{"location":"about/opensource/","title":"Open Source","text":""},{"location":"about/opensource/#abcdesktopio-is-an-open-source-project","title":"abcdesktop.io is an open source project","text":"

abcdesktop.io is an open source project and is a volunteer effort. This means that it depends on people to give some of their free time to improve it and make it even better.

Follow the Fork me on github links, to get access to each repository.

If you are reading this, then you are probably curious or want to contribute in some way. Read on to see how you can do so.

"},{"location":"about/opensource/#open-source-packages-dependencies","title":"Open Source packages dependencies","text":"

abcdesktop.io deplend on a lot of open source diffrents projets.

"},{"location":"about/opensource/#webmodules","title":"WebModules","text":"Package Licence Authors Source novnc MPL-2.0 Joel Martin https://kanaka.github.io/noVNC/ os.js BSD license Anders Evenrud https://github.com/os-js/OS.js/ dropzone.js MIT license Matias Meno, www.colorglare.com https://github.com/enyo/dropzone/ hammer.js MIT license Jorik Tangelder http://hammerjs.github.io/ jquery MIT license jQuery Team https://jquery.com/ jqueryui MIT license jQuery Team https://jqueryui.com/ js-cookie MIT license Klaus Hartl & Fagner Brack https://github.com/js-cookie/ UAParser GPLv2 & MIT Faisal Salman https://github.com/faisalman/ua-parser-js Angular FileManager MIT license Jonas Sciangula Street https://github.com/joni2back/angular-filemanager Bootstrap MIT license Bootstrap team https://getbootstrap.com/ webaudio-wav-stream-player MIT license Julien Bouquillon https://github.com/revolunet/webaudio-wav-stream-player bootbox MIT license Nick Payne makeusabrew https://github.com/makeusabrew/bootbox"},{"location":"about/opensource/#container-components","title":"Container components","text":""},{"location":"about/opensource/#nginx","title":"nginx","text":"Package Licence Authors Source nginx BSD licence Igor Sysoev http://nginx.org/ lua GPL-Compatible Free Software Licenses team at PUC-Rio in Brazil https://www.lua.org/"},{"location":"about/opensource/#ocpyos","title":"oc.pyos","text":"Package Version License CherryPy 18.5.0 BSD License Jinja2 2.11.1 BSD-3-Clause PyJWT 1.7.1 MIT PyNaCl 1.3.0 Apache License 2.0 PyYAML 5.3 MIT bcrypt 3.1.7 Apache License, Version 2.0 certifi 2020.4.5.1 MPL-2.0 cffi 1.14.0 MIT chardet 3.0.4 LGPL cryptography 2.9 BSD or Apache License, Version 2.0 dnspython 1.16.0 BSD-like docker 4.2.0 Apache License 2.0 future 0.18.2 MIT google-auth 1.13.1 Apache 2.0 graypy 2.1.0 BSD License idna 2.9 BSD-like iso8601 0.1.12 MIT isort 4.3.21 MIT kubernetes 11.0.0 Apache License Version 2.0 netaddr 0.7.19 BSD License oauthlib 3.1.0 BSD paramiko 2.7.1 LGPL pyasn1 0.4.8 BSD pyasn1-modules 0.2.8 BSD-2-Clause pycrypto 2.6.1 Public Domain pymongo 3.10.1 Apache License, Version 2.0 python-dateutil 2.8.1 Dual License python-geoip 1.2 GNU LESSER GENERAL PUBLIC LICENSE python-ldap 3.2.0 Python style python-subprocess2 2.0.2 LGPLv3 pytz 2019.3 MIT requests 2.23.0 Apache 2.0 requests-oauthlib 1.3.0 ISC rsa 4.0 ASL 2 shellescape 3.8.1 MIT license urllib3 1.25.8 MIT Package Version License ntlm_auth 2.0 GNU Lesser General Public License kerberos 1.16-2 MIT cntlm 0.92.3 GNU General Public License version 2.0 (GPLv2)"},{"location":"about/opensource/#ocuser","title":"oc.user","text":"Package Licence Authors Source novnc MPL-2.0 Joel Martin (github@martintribe.org) https://kanaka.github.io/noVNC/ supervisor LICENCES.TXT Chris McDonough http://supervisord.org/ tigervnc MIT licence Tiger Dev Tea https://tigervnc.org/ openbox GNU license Mikael Magnusson http://openbox.org/ cupds GNU & LGPL Apple Inc. https://www.cups.org/ xsettingsd COPYING Daniel Erat https://github.com/derat/xsettingsd angular-filemanager AGPL-3.0 Maestro Alubia https://www.npmjs.com/package/angular-filemanager-nodejs-bridge"},{"location":"about/opensource/#daemons","title":"Daemons","text":""},{"location":"about/opensource/#spawner-service","title":"Spawner-Service","text":"Package Licence Authors Source accept-language-parser@1.5.0 MIT Andy Royle https://github.com/opentable/accept-language-parser accept-language@3.0.18 MIT Tingan Ho https://github.com/tinganho/node-accept-language accepts@1.3.7 MIT no Author https://github.com/jshttp/accepts create-symlink@1.0.0 MIT Shinnosuke Watanabe https://github.com/shinnn/create-symlink diacritics@1.3.0 MIT Andrew Kelley https://github.com/andrewrk/node-diacritics dominant-color@0.0.1 ISC Hrvoje Simic https://github.com/shime/dominant-color event-stream@4.0.1 MIT Dominic Tarr https://github.com/dominictarr/event-stream express-validator@6.4.0 MIT Christoph Tavan https://github.com/express-validator/express-validator express@4.17.1 MIT TJ Holowaychuk https://github.com/expressjs/express find-process@1.4.3 MIT zoujie https://github.com/yibn2008/find-process geoip-lite@1.4.1 Apache-2.0 Philip Tellis https://github.com/bluesmoon/node-geoip helmet@3.22.0 MIT Adam Baldwin https://github.com/helmetjs/helmet hex-rgb@4.1.0 MIT Sindre Sorhus https://github.com/sindresorhus/hex-rgb imagemagick@0.1.3 MIT Rasmus Andersson https://github.com/rsms/node-imagemagick ini@1.3.5 ISC Isaac Z. Schlueter https://github.com/isaacs/ini ipaddr.js@1.9.1 MIT whitequark https://github.com/whitequark/ipaddr.js jsonfile@6.0.1 MIT JP Richardson https://github.com/jprichardson/node-jsonfile mime-types@2.1.26 MIT no Author https://github.com/jshttp/mime-types mmmagic@0.5.3 MIT Brian White https://github.com/mscdex/mmmagic npid@0.4.0 MIT* Mathieu Turcotte https://github.com/MathieuTurcotte/node-pid ps-node@0.1.6 MIT no Author https://github.com/neekey/ps simple-parser@0.0.0 ISC no Author no Repository walk@2.3.14 (MIT OR Apache-2.0) AJ ONeal https://git.coolaj86.com/coolaj86/fs-walk.js which@2.0.2 ISC Isaac Z. Schlueter https://github.com/isaacs/node-which wmctrljs@1.1.9 ISC kevin.voyer.developpeur@gmail.com https://github.com/Kmynes/wmctrljs ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws xwininfo@0.0.0 ISC ashaffer https://github.com/ashaffer/node-xwininfo"},{"location":"about/opensource/#broadcast-service","title":"Broadcast-service","text":"Package Licence Authors Source http-proxy@1.18.0 MIT Charlie Robbins https://github.com/http-party/node-http-proxy ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws"},{"location":"about/opensource/#file-service","title":"File-Service","text":"Package Licence Authors Source busboy@0.3.1 MIT Brian White https://github.com/mscdex/busboy express@4.17.1 MIT TJ Holowaychuk https://github.com/expressjs/express fs-extra@9.0.0 MIT JP Richardson https://github.com/jprichardson/node-fs-extra helmet@3.22.0 MIT Adam Baldwin https://github.com/helmetjs/helmet mime-types@2.1.26 MIT no Author https://github.com/jshttp/mime-types mkdirp@1.0.4 MIT no Author https://github.com/isaacs/node-mkdirp urlencode@1.1.0 MIT fengmk2 https://github.com/node-modules/urlencode"},{"location":"about/opensource/#printer-service","title":"Printer-Service","text":"Package Licence Authors Source chokidar@3.3.1 MIT Paul Miller https://github.com/paulmillr/chokidar ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws"},{"location":"about/opensource/#xterm-service","title":"Xterm-Service","text":"Package Licence Authors Source xterm.js MIT xtermjs team https://github.com/xtermjs/xterm.js"},{"location":"about/opensource/#filemanager-service","title":"FileManager-Service","text":"Package Licence Authors Source angular-filemanager-nodejs-bridge@0.1.3 AGPL-3.0 Fabian K\u00f6ster no Repository"},{"location":"about/otherrelatedprojects/","title":"Others related projets","text":""},{"location":"about/otherrelatedprojects/#projects","title":"Projects","text":"

Welcome to the others related projects section, where you can find some projects related to use cloud application inside a web browser.

"},{"location":"about/play_sound_in_docker/","title":"Play sound inside a docker to a web browser","text":""},{"location":"about/play_sound_in_docker/#sound-in-docker-is-the-big-challenge","title":"Sound in docker is the big challenge","text":"

As VNC does not support sound, we have to forward a Pulseaudio null-sink output to the user browser, with no latency.

Realy fun projets: use virtual microphone using gstreamer and pulseaudio and Get Pulseaduio sink from webrtc To be implemented

"},{"location":"about/play_sound_in_docker/#release-10-pulseaudio-with-a-simple-module-http-protocol-tcp-and-a-javascript-no-latency-wav-stream-player","title":"Release 1.0: Pulseaudio with a simple module-http-protocol-tcp and a javascript no latency wav stream player","text":"
# defined with desktop 1.0\nload-module module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 ra\nte=11025'\"\n

Then use

load-module module-http-protocol-tcp\n

Read the http stream data, using fetch call :

http://$target:$pulseaudio_http_port/listen/source/u8_1_11025.monitor;\n

Pulseaudio module-http-protocol-tcp does not send wav formated header. We need to build a new wav header for each receved fragment. This is done in wavify.js file :

//\n// Write a proper WAVE header for the given buffer.\n// format ULAW or ALAW \n// Offset is hardcoded \nfunction wavify_law(data, numberOfChannels, sampleRate, bitsPerSample, format ) {\n\n    // // total header : 4 + 26 + 12 + 8 = 50 \n    // // and the data and size: 50 + 8 ( data + 32 bits for the size )\n    var header_length = 58; // 4 + 26 + 12 + 8 + 8 = 58 \n    var total_length =  header_length + data.byteLength;\n\n    // bitsPerSample MUST BE  8 bits\n\n    // The default byte ordering assumed for WAVE data files is little-endian.\n    var header = new ArrayBuffer(header_length); \n    var d = new DataView(header);\n\n    d.setUint8(0, \"R\".charCodeAt(0)); \n    d.setUint8(1, \"I\".charCodeAt(0));\n    d.setUint8(2, \"F\".charCodeAt(0));\n    d.setUint8(3, \"F\".charCodeAt(0));\n\n    // All integers MUST be set in bigEndian format\n    // Wave chunks containing format information and sampled data\n    // cksize   4   Chunk size: 4+n  \n    // 4: for sizeof( 'WAVE' ) + n \n    // n: Wave chunks containing format information and sampled data\n    //var data_length = d.setUint32(4, data.byteLength / 2 + 44, true);\n    //bitsPerSample data.byteLength + 8+16+12\n    d.setUint32(4, total_length, true); \n\n    // write 4 bytes\n    d.setUint8(8,  \"W\".charCodeAt(0)); \n    d.setUint8(9,  \"A\".charCodeAt(0)); \n    d.setUint8(10, \"V\".charCodeAt(0)); \n    d.setUint8(11, \"E\".charCodeAt(0)); \n\n\n    // write 4 bytes\n    d.setUint8(12, \"f\".charCodeAt(0));\n    d.setUint8(13, \"m\".charCodeAt(0));\n    d.setUint8(14, \"t\".charCodeAt(0));\n    d.setUint8(15, \" \".charCodeAt(0));\n\n\n    // All integers MUST be set in bigEndian format\n\n\n    // Subchunk1Size 16 for PCM.  \n    // Offset 16    \n    // Size 4\n    // This is the size of the rest of the Subchunk which follows this number.\n    // The size of the rest of this subchunk.\n    // All integers MUST be set in bigEndian format\n    // d.setUint32(16, 16, true);\n    // cksize   4   Chunk size: 16, 18 or 40 \n    var chunksize = 18;\n    d.setUint32(16, chunksize, true);\n\n    // The format of the wave data, which will be 1 for uncompressed PCM data.\n    // All integers MUST be set in bigEndian format\n    // FORMAT must be WAVE_FORMAT_ULAW or WAVE_FORMAT_ALAW\n    d.setUint16(20, format, true);\n\n    // Indicates if the data is mono, stereo, or something else.\n    // NumChannels Mono = 1, Stereo = 2, etc.\n    // All integers MUST be set in bigEndian format\n    d.setUint16(22, numberOfChannels, true);\n\n    // The sample rate per second.\n    // SampleRate 8000, 44100, etc.\n    // All integers MUST be set in bigEndian format\n    d.setUint32(24, sampleRate, true);\n\n    // byteRate == SampleRate * NumChannels * BitsPerSample/8\n    // All integers MUST be set in bigEndian format\n    var byteRate = sampleRate * numberOfChannels * bitsPerSample/8;\n    d.setUint32(28, byteRate, true ); \n\n    // blockAlign       == NumChannels * BitsPerSample/8\n    // The number of bytes for one sample including all channels.\n    var blockAlign = numberOfChannels * bitsPerSample / 8; \n     // All integers MUST be set in bigEndian format\n    d.setUint16(32, blockAlign, true ); \n\n    // BitsPerSample    8 bits = 8, 16 bits = 16, etc.\n    d.setUint16(34, bitsPerSample, true);\n\n    // Wave files may include an additional field, usually reserved for non-PCM formats:\n    // bits per Sample \n    // Size of the extension \n    // 2 bytes\n    // Offset \n    var cbSize = 0;\n    d.setUint16(36, cbSize, true);\n\n    d.setUint8(38, \"f\".charCodeAt(0));\n    d.setUint8(39, \"a\".charCodeAt(0));\n    d.setUint8(40, \"c\".charCodeAt(0));\n    d.setUint8(41, \"t\".charCodeAt(0));\n    var cksize = 4;\n    d.setUint32(42, cksize, true);\n    var dwSampleLength = data.byteLength; // Number of samples ( per channel )\n    d.setUint32(46, dwSampleLength, true);\n\n// 50\n    d.setUint8(50, \"d\".charCodeAt(0));\n    d.setUint8(51, \"a\".charCodeAt(0));\n    d.setUint8(52, \"t\".charCodeAt(0));\n    d.setUint8(53, \"a\".charCodeAt(0));\n\n    d.setUint32(54, data.byteLength, true);\n\n//58\n    // data must pad byte 0 or 1 if n is odd\n    return concat(header, data);\n}\n

Then use the WavPlayer.js from Julien Bouquillon https://github.com/revolunet/webaudio-wav-stream-player to read data and send to javascript AudioContext()

This Release is getting glitchy audio. In Chrome, the stream plays with a slight crackle. Read the issue https://github.com/revolunet/webaudio-wav-stream-player/issues/10

It works, uses only HTTP protocol but i can't fix the glitchy audio. We find another way to stream sound to web browser device, using the WebRTC stack and RTP pulseaudio.

"},{"location":"about/play_sound_in_docker/#release-20-pulseaudio-with-a-webrtc-gateway","title":"Release 2.0: Pulseaudio with a WebRTC gateway","text":""},{"location":"about/play_sound_in_docker/#architecture","title":"Architecture","text":"
### Load the RTP sender module (also configured via paprefs, see above)\nload-module module-null-sink sink_name=rtp_alaw format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink alaw'\"\nload-module module-rtp-send source=rtp_alaw.monitor destination_ip=127.0.0.1 port=5000 channels=1 format=alaw\n

Add a RTP stream to Janus WebRTC gateway

[pulseaudio-rtp-pcma-8000]\ntype = rtp\nid = 1\ndescription = pcam/8000 live stream coming from pulseaudio\naudio = yes\nvideo = no\naudioport = 5000\naudiopt = 8\naudiortpmap = PCMA/8000\n

Read the dedicated webrtc chapter to configure and get more informations about the janus WebRTC

"},{"location":"about/version/","title":"Documentation","text":""},{"location":"about/version/#version","title":"Version","text":"

The current documentation version is 0.1

"},{"location":"about/version/#location","title":"Location","text":"

This documentation is located at https://github.com/abcdesktopio/docs

"},{"location":"about/version/#installing-make","title":"Installing Make","text":"

Install the Make package using apt-get

sudo apt-get install make\n
"},{"location":"about/version/#installing-mkdocs","title":"Installing MkDocs","text":"

Install the mkdocs package using the Makefile:

make install\n

make install command runs :

Make sure that the pip command is installed on you system.

"},{"location":"about/version/#how-to-build-the-documentation","title":"How to build the documentation","text":""},{"location":"about/version/#build-documentation-files","title":"Build documentation files","text":"
git clone https://github.com/abcdesktopio/docs\ncd docs\nmake docs\nINFO    -  Cleaning site directory \nINFO    -  Building documentation to directory: /home/alex/src/docs/opsdocs/site \n

All HTML files are located in the building documentation directory

"},{"location":"about/version/#how-to-view-the-documentation","title":"How to view the documentation","text":""},{"location":"about/version/#serve-documentation-files","title":"Serve documentation files","text":"
make serve\nINFO    -  Serving on http://127.0.0.1:8000\nINFO    -  Start watching changes\nINFO    -  Start detecting changes\n

Now connect http://127.0.0.1:8000 with any Web Navigator to browse through the documentation.

"},{"location":"api/backend/launchdesktop/","title":"Launchdesktop","text":"

{\"status\": 200, \"result\": {\"userid\": \"7d2ecad7-2154-4529-85b4-1ab037c29fed\", \"jwt_user_token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJleHAiOjE2NjM2ODYyMzEsImF1dGgiOnsicHJvdmlkZXIiOiJhbm9ueW1vdXMiLCJwcm92aWRlcnR5cGUiOiJhbm9ueW1vdXMiLCJkYXRhIjp7ImxhYmVscyI6eyJtYWlzb25hbGV4IjoidHJ1ZSJ9fX0sInVzZXIiOnsibmFtZSI6IkFub255bW91cyIsInVzZXJpZCI6IjdkMmVjYWQ3LTIxNTQtNDUyOS04NWI0LTFhYjAzN2MyOWZlZCIsIm5vZGVob3N0bmFtZSI6bnVsbH0sInJvbGVzIjp7fX0.Lz6PbYz-KPPXJWyBaWuXF60YCQEv9z9Hsr8Ik2rHELBhSAd00eeqrZ0js9aLJ4uHsU1YJQQ2mfupHOpUEgo7AZCJm3HgjJRseWI-ftDV3NJKo2U76Q7RsIZQlSu9O1gK42XL_IkZmB3kLwTv0-Q-3EO6cmL5aP2Nu0nc9gVgxPA\", \"name\": \"Anonymous\", \"provider\": \"anonymous\", \"expire_in\": 14400}, \"message\": \"Authentication successful in 0.01 s\"}

https://ocv5.pepins.net/API/composer/launchdesktop

{\"status\": 200, \"result\": {\"target_ip\": \"ocv5.pepins.net\", \"vncpassword\": \"gCalVYJoJdI15sI\", \"authorization\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJrZXkiOjAsImhhc2giOiJSdTJmWDAwZW5hSU5OT2dOZ2dCVU1pQ01nQkdrQmZRTnRJSzAweWFXU1FSbUc5dkpiYUFHUXJ5ekpPY0h1QmIyZTRyOXgrMzdINDZZZFlTcThESlZUczdDTXZnamxGajFIZVJ2Y25YNFFCOENkcWFBeE5xTW5XdkMxNVlpNkNtaXlRRmpFYkJlZFlPMWtEazZPNjB6R2wxN3RZZ0kvQ0ZJejdQcVJyL1BHM3c9IiwiZXhwIjoxNjYzNjg1OTI2fQ.is9k5bdUy10_u2MP4Z5tecKFUsdCcS4v_CsnEB6y4dDt4SuKebYz8MA4zCHDpP_Hi13RXVZDW9ax4Crzj0q-WvD_IgPjiz2qdjf7e-2TQ4TbnrqzEngHo6BVkd8vm1vvBE11RGRgufxu6oreGfPxnTtU9ly53sn-j2O3DVR5glA\", \"websocketrouting\": \"http_origin\", \"websockettcpport\": 6081, \"expire_in\": 14400}, \"message\": \"ok\"}

"},{"location":"applications/","title":"oc.apps","text":""},{"location":"applications/#to-get-more-informations","title":"To get more informations","text":"

Please, read the public documentation web site: * https://www.abcdesktop.io * https://abcdesktopio.github.io/

"},{"location":"applications/#abcdesktop-application-dockerfiles","title":"abcdesktop application dockerfiles","text":"

DockerFile generator from json file to build applications images run commands

$ make dockerfile\n$ make build\n

this command build all generated Dockerfile

To build documentation files

$ make docs\n

this command build all md files, and build list.md

"},{"location":"applications/2048-alpine-error/","title":"2048-alpine-error","text":""},{"location":"applications/2048-alpine-error/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/2048-alpine-error/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.0\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/2048-alpine-error/#alpine-packages","title":"Alpine packages","text":"
gnome-2048\n
"},{"location":"applications/2048-alpine-error/#displayname","title":"Displayname","text":"
2048 (alpine gtk) with error\n
"},{"location":"applications/2048-alpine-error/#path","title":"Path","text":"
/usr/bin/gnome-2048\n
"},{"location":"applications/2048-alpine-error/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/2048-alpine-error/#wm_class","title":"WM_CLASS","text":"
org.gnome.TwentyFortyEight.Gnome-2048\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/2048-alpine-error/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.TwentyFortyEight.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/2048-alpine-error/#json-dump","title":"JSON dump","text":"

json source file

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"containerengine\": \"pod_application\",\n    \"apkpackage\": \"gnome-2048\",\n    \"icon\": \"circle_2048.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"org.gnome.TwentyFortyEight.Gnome-2048\",\n    \"name\": \"2048-alpine-error\",\n    \"displayname\": \"2048 (alpine gtk) with error\",\n    \"path\": \"/usr/bin/gnome-2048\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.TwentyFortyEight.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    }\n}\n
"},{"location":"applications/2048-alpine-error/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output 2048-alpine-error.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-error.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine-error.json\n\n
"},{"location":"applications/2048-alpine-error/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-2048\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-alpine-error,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.TwentyFortyEight.desktop\"\nLABEL oc.launch=\"org.gnome.TwentyFortyEight.Gnome-2048\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"2048-alpine-error\"\nLABEL oc.displayname=\"2048 (alpine gtk) with error\"\nLABEL oc.path=\"/usr/bin/gnome-2048\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"2048-alpine-error\"\nENV APPBIN \"/usr/bin/gnome-2048\"\nENV APP \"/usr/bin/gnome-2048\"\nLABEL oc.containerengine=\"pod_application\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/2048-alpine-error/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-alpine-error/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application 2048-alpine-error

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-error.d\n
"},{"location":"applications/2048-alpine-error/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f 2048-alpine-error.d -t 2048-alpine-error .\n
"},{"location":"applications/2048-alpine-error/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect 2048-alpine-error > 2048-alpine-error.json\ndocker image save 2048-alpine-error -o 2048-alpine-error.tar\nctr -n k8s.io images import 2048-alpine-error.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine-error.json\n\n
"},{"location":"applications/2048-alpine/","title":"2048-alpine","text":""},{"location":"applications/2048-alpine/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/2048-alpine/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/2048-alpine/#alpine-packages","title":"Alpine packages","text":"
gnome-2048\n
"},{"location":"applications/2048-alpine/#displayname","title":"Displayname","text":"
2048 (alpine gtk)\n
"},{"location":"applications/2048-alpine/#path","title":"Path","text":"
/usr/bin/gnome-2048\n
"},{"location":"applications/2048-alpine/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/2048-alpine/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/2048-alpine/#wm_class","title":"WM_CLASS","text":"
org.gnome.TwentyFortyEight.Gnome-2048\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/2048-alpine/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.TwentyFortyEight.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/2048-alpine/#json-dump","title":"JSON dump","text":"

json source file 2048-alpine.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"containerengine\": \"ephemeral_container\",\n    \"apkpackage\": \"gnome-2048\",\n    \"icon\": \"circle_2048.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"org.gnome.TwentyFortyEight.Gnome-2048\",\n    \"name\": \"2048-alpine\",\n    \"displayname\": \"2048 (alpine gtk)\",\n    \"path\": \"/usr/bin/gnome-2048\",\n    \"showinview\": \"dock\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.TwentyFortyEight.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"64M\",\n        \"pid_mode\": false,\n        \"network_mode\": \"none\"\n    }\n}\n
"},{"location":"applications/2048-alpine/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine.d.3.0.json\n\n
"},{"location":"applications/2048-alpine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-2048\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-alpine,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.TwentyFortyEight.desktop\"\nLABEL oc.launch=\"org.gnome.TwentyFortyEight.Gnome-2048\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"2048-alpine\"\nLABEL oc.displayname=\"2048 (alpine gtk)\"\nLABEL oc.path=\"/usr/bin/gnome-2048\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"64M\\\",\\\"pid_mode\\\":false,\\\"network_mode\\\":\\\"none\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"2048-alpine\"\nENV APPBIN \"/usr/bin/gnome-2048\"\nENV APP \"/usr/bin/gnome-2048\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/2048-alpine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-alpine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application 2048-alpine

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d\n
"},{"location":"applications/2048-alpine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f 2048-alpine.d -t 2048-alpine .\n
"},{"location":"applications/2048-alpine/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect 2048-alpine > 2048-alpine.json\ndocker image save 2048-alpine -o 2048-alpine.tar\nctr -n k8s.io images import 2048-alpine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine.json\n\n
"},{"location":"applications/2048-ubuntu/","title":"2048-ubuntu","text":""},{"location":"applications/2048-ubuntu/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/2048-ubuntu/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/2048-ubuntu/#ubuntu-packages","title":"Ubuntu packages","text":"
2048-qt\n
"},{"location":"applications/2048-ubuntu/#displayname","title":"Displayname","text":"
2048 (ubuntu qt)\n
"},{"location":"applications/2048-ubuntu/#path","title":"Path","text":"
/usr/games/2048-qt\n
"},{"location":"applications/2048-ubuntu/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/2048-ubuntu/#wm_class","title":"WM_CLASS","text":"
2048-qt.2048-qt\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/2048-ubuntu/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/2048-qt.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/2048-ubuntu/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

ENV QT_X11_NO_MITSHM=1\n
"},{"location":"applications/2048-ubuntu/#json-dump","title":"JSON dump","text":"

json source file 2048-ubuntu.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"containerengine\": \"pod_application\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"circle_2048.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048-ubuntu\",\n    \"displayname\": \"2048 (ubuntu qt)\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"desktopfile\": \"/usr/share/applications/2048-qt.desktop\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"postruncommands\": [\n        \"ENV QT_X11_NO_MITSHM=1\"\n    ]\n}\n
"},{"location":"applications/2048-ubuntu/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output 2048-ubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-ubuntu.d.3.0.json\n\n
"},{"location":"applications/2048-ubuntu/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends 2048-qt && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-ubuntu,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"2048-qt.desktop\"\nLABEL oc.launch=\"2048-qt.2048-qt\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"2048-ubuntu\"\nLABEL oc.displayname=\"2048 (ubuntu qt)\"\nLABEL oc.path=\"/usr/games/2048-qt\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"2048-ubuntu\"\nENV APPBIN \"/usr/games/2048-qt\"\nENV APP \"/usr/games/2048-qt\"\nLABEL oc.containerengine=\"pod_application\"\nENV QT_X11_NO_MITSHM=1\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/2048-ubuntu/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-ubuntu/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application 2048-ubuntu

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d\n
"},{"location":"applications/2048-ubuntu/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f 2048-ubuntu.d -t 2048-ubuntu .\n
"},{"location":"applications/2048-ubuntu/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect 2048-ubuntu > 2048-ubuntu.json\ndocker image save 2048-ubuntu -o 2048-ubuntu.tar\nctr -n k8s.io images import 2048-ubuntu.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-ubuntu.json\n\n
"},{"location":"applications/2048/","title":"2048","text":""},{"location":"applications/2048/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk

"},{"location":"applications/2048/#use-ubuntu-package","title":"use ubuntu package","text":"

2048-qt

"},{"location":"applications/2048/#display-name","title":"Display name","text":"

\"2048\"

"},{"location":"applications/2048/#path","title":"path","text":"

\"/usr/games/2048-qt\"

"},{"location":"applications/apachedirectorystudio/","title":"apachedirectorystudio","text":""},{"location":"applications/apachedirectorystudio/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.22.04

"},{"location":"applications/apachedirectorystudio/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/apachedirectorystudio/#ubuntu-packages","title":"Ubuntu packages","text":"
openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java\n
"},{"location":"applications/apachedirectorystudio/#arguments","title":"Arguments","text":"

\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"

"},{"location":"applications/apachedirectorystudio/#displayname","title":"Displayname","text":"
Apache Directory Studio\n
"},{"location":"applications/apachedirectorystudio/#path","title":"Path","text":"
/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\n
"},{"location":"applications/apachedirectorystudio/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/apachedirectorystudio/#wm_class","title":"WM_CLASS","text":"
Apache Directory Studio.Apache Directory Studio\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/apachedirectorystudio/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\nRUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\nCOPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\n
"},{"location":"applications/apachedirectorystudio/#json-dump","title":"JSON dump","text":"

json source file apachedirectorystudio.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\",\n        \"RUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\",\n        \"COPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\"\n    ],\n    \"debpackage\": \"openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java\",\n    \"icon\": \"account.svg\",\n    \"args\": \"-configuration .eclipse/1988419495_linux_gtk_x86_64\",\n    \"installrecommends\": true,\n    \"keyword\": \"ldap\",\n    \"launch\": \"Apache Directory Studio.Apache Directory Studio\",\n    \"name\": \"apachedirectorystudio\",\n    \"displayname\": \"Apache Directory Studio\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.22.04\"\n}\n
"},{"location":"applications/apachedirectorystudio/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output apachedirectorystudio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/apachedirectorystudio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @apachedirectorystudio.d.3.0.json\n\n
"},{"location":"applications/apachedirectorystudio/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.22.04:$TAG\nUSER root\nRUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\nRUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\nCOPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"account.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9Ii00NjIgNDYzIDM1IDM1IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IC00NjIgNDYzIDM1IDM1OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDojMDA3OEQ2O30NCjwvc3R5bGU+DQo8dGl0bGU+XzwvdGl0bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNLTQ0MS4yLDQ4NGMwLjksMC4zLDEuOCwwLjgsMi42LDEuNGMwLjgsMC42LDEuNCwxLjMsMiwyLjFjMC41LDAuOCwxLDEuNywxLjMsMi42YzAuMywxLDAuNCwxLjksMC40LDIuOWgtMS4zDQoJYzAtMS4xLTAuMi0yLjItMC42LTMuMmMtMC44LTItMi40LTMuNS00LjMtNC4zYy0xLjctMC43LTMuNi0wLjgtNS40LTAuM2MtMC43LDAuMi0xLjQsMC41LTIsMC44Yy0xLjIsMC43LTIuMiwxLjctMi45LDIuOQ0KCWMtMC43LDEuMy0xLjEsMi43LTEuMSw0LjJoLTEuM2MwLTIsMC42LTMuOSwxLjctNS41YzAuNi0wLjgsMS4yLTEuNSwyLTIuMWMwLjgtMC42LDEuNy0xLjEsMi42LTEuNGMtMS4xLTAuNi0yLTEuNC0yLjYtMi41DQoJYy0wLjMtMC41LTAuNS0xLjEtMC43LTEuN2MtMC40LTEuNS0wLjMtMy4xLDAuMy00LjVjMC43LTEuNiwyLTIuOSwzLjYtMy42YzEuNy0wLjcsMy42LTAuNyw1LjMsMGMxLjYsMC43LDIuOSwyLDMuNiwzLjYNCgljMC42LDEuNCwwLjcsMywwLjMsNC41Yy0wLjIsMC42LTAuNCwxLjEtMC43LDEuN2MtMC4zLDAuNS0wLjcsMS0xLjEsMS40Qy00NDAuMiw0ODMuMy00NDAuNyw0ODMuNy00NDEuMiw0ODR6IE0tNDUwLDQ3OA0KCWMwLDAuNywwLjEsMS41LDAuNCwyLjFjMC42LDEuMywxLjYsMi4zLDIuOSwyLjljMS40LDAuNiwyLjksMC42LDQuMiwwYzEuMy0wLjYsMi4zLTEuNiwyLjktMi45YzAuNi0xLjQsMC42LTIuOSwwLTQuMg0KCWMtMC42LTEuMy0xLjYtMi4zLTIuOS0yLjljLTEuNC0wLjYtMi45LTAuNi00LjIsMGMtMS4zLDAuNi0yLjMsMS42LTIuOSwyLjlDLTQ0OS45LDQ3Ni41LTQ1MCw0NzcuMy00NTAsNDc4eiIvPg0KPHBhdGggY2xhc3M9InN0MCIgZD0iTS00MzQuNSw0OTMuNWgtMi4zVjQ5M2MwLTEtMC4yLTIuMS0wLjYtMy4xYy0wLjctMS44LTIuMi0zLjMtNC4xLTQuMWMtMS42LTAuNy0zLjQtMC44LTUuMS0wLjMNCgljLTAuNiwwLjItMS4zLDAuNC0xLjksMC44Yy0xLjEsMC43LTIuMSwxLjYtMi44LDIuOGMtMC43LDEuMi0xLDIuNi0xLDMuOXYwLjVoLTIuM1Y0OTNjMC0yLjEsMC42LTQuMSwxLjgtNS44DQoJYzAuNi0wLjgsMS4zLTEuNiwyLjEtMi4yYzAuNi0wLjQsMS4yLTAuOCwxLjktMS4xYy0wLjMtMC4yLTAuNi0wLjQtMC44LTAuN2MtMC41LTAuNS0wLjktMS0xLjItMS41Yy0wLjMtMC41LTAuNi0xLjEtMC44LTEuNw0KCWMtMC40LTEuNi0wLjMtMy4zLDAuMy00LjhjMS42LTMuNyw1LjgtNS40LDkuNi0zLjljMS43LDAuNywzLjEsMi4xLDMuOSwzLjljMC42LDEuNSwwLjcsMy4yLDAuMyw0LjhjLTAuMiwwLjYtMC40LDEuMi0wLjgsMS44DQoJYy0wLjMsMC42LTAuNywxLjEtMS4yLDEuNWMtMC4yLDAuMi0wLjUsMC41LTAuOCwwLjdjMC43LDAuMywxLjMsMC42LDEuOSwxLjFjMC44LDAuNiwxLjUsMS40LDIuMSwyLjJjMC42LDAuOCwxLDEuOCwxLjMsMi43DQoJYzAuMywxLDAuNSwyLDAuNSwzLjFWNDkzLjV6IE0tNDM1LjksNDkyLjVoMC40YzAtMC44LTAuMi0xLjYtMC40LTIuM2MtMC4zLTAuOS0wLjctMS43LTEuMi0yLjVjLTAuNS0wLjgtMS4yLTEuNC0xLjktMg0KCWMtMC43LTAuNi0xLjYtMS0yLjUtMS4zbC0xLTAuNGwwLjktMC41YzAuNS0wLjMsMS0wLjYsMS40LTFjMC40LTAuNCwwLjctMC44LDEtMS4zYzAuMy0wLjUsMC41LTEsMC43LTEuNWMwLjQtMS40LDAuMy0yLjgtMC4zLTQuMg0KCWMtMS40LTMuMi01LjEtNC43LTguMy0zLjRjLTEuNSwwLjYtMi43LDEuOS0zLjQsMy40Yy0wLjMsMC44LTAuNSwxLjYtMC41LDIuNWMwLDAuNiwwLjEsMS4xLDAuMiwxLjdjMC4xLDAuNSwwLjMsMS4xLDAuNiwxLjYNCgljMC42LDEsMS40LDEuOCwyLjQsMi4zbDAuOSwwLjVsLTEsMC40Yy0wLjksMC4zLTEuNywwLjgtMi41LDEuNGMtMC43LDAuNi0xLjQsMS4yLTEuOSwyYy0xLDEuNC0xLjUsMy4xLTEuNiw0LjhoMC40DQoJYzAuMS0xLjQsMC41LTIuOCwxLjItNGMwLjctMS4zLDEuOC0yLjMsMy4xLTMuMWMwLjctMC40LDEuNC0wLjcsMi4xLTAuOWMxLjktMC41LDMuOS0wLjQsNS43LDAuNGMyLjEsMC44LDMuNywyLjUsNC42LDQuNg0KCUMtNDM2LjEsNDkwLjUtNDM1LjksNDkxLjUtNDM1LjksNDkyLjV6IE0tNDQ0LjUsNDgzLjljLTAuOCwwLTEuNi0wLjItMi4zLTAuNWMtMS40LTAuNi0yLjYtMS43LTMuMi0zLjFjLTAuNi0xLjUtMC42LTMuMSwwLTQuNg0KCWMwLjYtMS40LDEuNy0yLjUsMy4xLTMuMmMxLjUtMC42LDMuMS0wLjYsNC42LDBjMS40LDAuNiwyLjYsMS43LDMuMiwzLjJjMC42LDEuNSwwLjYsMy4xLDAsNC42Yy0wLjYsMS40LTEuNywyLjUtMy4xLDMuMQ0KCUMtNDQyLjksNDgzLjgtNDQzLjcsNDgzLjktNDQ0LjUsNDgzLjl6IE0tNDQ0LjUsNDczYy0wLjcsMC0xLjMsMC4xLTEuOSwwLjRjLTEuMiwwLjUtMi4xLDEuNS0yLjcsMi43Yy0wLjUsMS4yLTAuNSwyLjYsMCwzLjkNCgljMC41LDEuMiwxLjUsMi4xLDIuNywyLjdjMS4yLDAuNSwyLjYsMC41LDMuOSwwYzEuMi0wLjUsMi4xLTEuNSwyLjctMi43YzAuNS0xLjIsMC41LTIuNiwwLTMuOWMtMC41LTEuMi0xLjUtMi4xLTIuNy0yLjcNCglDLTQ0My4yLDQ3My4xLTQ0My44LDQ3My00NDQuNSw0NzN6Ii8+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNLTQ0NC41LDQ5N2MtOS4xLDAtMTYuNS03LjQtMTYuNi0xNi41YzAtOS4xLDcuNC0xNi41LDE2LjUtMTYuNmM5LjEsMCwxNi41LDcuNCwxNi42LDE2LjUNCglDLTQyOCw0ODkuNi00MzUuNCw0OTctNDQ0LjUsNDk3eiBNLTQ0NC41LDQ2NS44Yy04LjEsMC0xNC43LDYuNi0xNC43LDE0LjdzNi42LDE0LjcsMTQuNywxNC43czE0LjctNi42LDE0LjctMTQuN2MwLDAsMCwwLDAsMA0KCUMtNDI5LjksNDcyLjMtNDM2LjQsNDY1LjgtNDQ0LjUsNDY1LjhMLTQ0NC41LDQ2NS44eiIvPg0KPC9zdmc+DQo=\"\nLABEL oc.keyword=\"apachedirectorystudio,ldap\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"Apache Directory Studio.Apache Directory Studio\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.22.04\"\nENV ARGS=\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"\nLABEL oc.name=\"apachedirectorystudio\"\nLABEL oc.displayname=\"Apache Directory Studio\"\nLABEL oc.path=\"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"apachedirectorystudio\"\nENV APPBIN \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nLABEL oc.args=\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"\nENV APP \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/apachedirectorystudio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/apachedirectorystudio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application apachedirectorystudio

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/apachedirectorystudio.d\n
"},{"location":"applications/apachedirectorystudio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f apachedirectorystudio.d -t apachedirectorystudio .\n
"},{"location":"applications/apachedirectorystudio/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect apachedirectorystudio > apachedirectorystudio.json\ndocker image save apachedirectorystudio -o apachedirectorystudio.tar\nctr -n k8s.io images import apachedirectorystudio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @apachedirectorystudio.json\n\n
"},{"location":"applications/astromenace/","title":"astromenace","text":""},{"location":"applications/astromenace/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/astromenace/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/astromenace/#ubuntu-packages","title":"Ubuntu packages","text":"
astromenace\n
"},{"location":"applications/astromenace/#displayname","title":"Displayname","text":"
astromenace\n
"},{"location":"applications/astromenace/#path","title":"Path","text":"
/usr/games/AstroMenace\n
"},{"location":"applications/astromenace/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/astromenace/#wm_class","title":"WM_CLASS","text":"
Astromenace.Astromenace\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/astromenace/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/astromenace.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/astromenace/#json-dump","title":"JSON dump","text":"

json source file astromenace.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"astromenace\",\n    \"installrecommends\": true,\n    \"icon\": \"astromenace.svg\",\n    \"launch\": \"Astromenace.Astromenace\",\n    \"name\": \"astromenace\",\n    \"displayname\": \"astromenace\",\n    \"path\": \"/usr/games/AstroMenace\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"/usr/share/applications/astromenace.desktop\"\n}\n
"},{"location":"applications/astromenace/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output astromenace.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/astromenace.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @astromenace.d.3.0.json\n\n
"},{"location":"applications/astromenace/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y astromenace && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"astromenace.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmVyc2lvbj0iMS4xIj4KIDxyZWN0IHN0eWxlPSJvcGFjaXR5OjAuMiIgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB4PSIyIiB5PSIzIiByeD0iMS40IiByeT0iMS40Ii8+CiA8cmVjdCBzdHlsZT0iZmlsbDojMzQ1Nzg0IiB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHg9IjIiIHk9IjIiIHJ4PSIxLjQiIHJ5PSIxLjQiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0ibSAxNi44NzYxNDMsOS4wMDA4MTk3IGMgLTAuMDcyOTgsMC4wMDI0MSAtMC4xNDg0MDYsMC4wMDk4IC0wLjIyOTY4NywwLjAyMDc1NSAtMC45MTQxNjQsMC4xMjMyMTQ0IC0xLjE2NTA4OSwwLjM0NzAzNjEgLTEuNzI0MDIzLDEuNTM0MzEyMyAtMC4zNzY5OTksMC44MDA4MDcgLTAuNTY1NjAyLDAuODk4NTk4IC0xLjA1MTM2NywxLjAwNDI4OCAtMi4yNzA4OTksLTEuNjc0MDY3NiAtMi4yNzA4OTksMC44ODEyOTQgLTIuNzE3OTY5LDEuNTg5NjUgLTAuNjEyODEyLC0wLjU0NDA5NyAtMS40MDg2NjM4LC0xLjcyMDY0OCAtMi4xOTU2NDUxLC0yLjM3ODM5MiAtMC43MDM2MDg1LC0wLjU4ODA2MiAtMS40MDAxMjY3LC0wLjk0NDM1MDIgLTEuOTUyNDAyMiwtMC41NzMyIC0wLjQzNzY0MDgsMC4zMTA1NCAtMC44MDk0NzIsMC45NzY4MiAtMC45NDQ3MjY3LDIuNTA1NTM0IC0wLjE4NDc3OSwyLjA4ODQ1NCAwLjAwMTkzLDMuMjY0MjEzIDEuMzEyNTAwNCw0Ljk5Mzc5NSAxLjQ4MTk4NCwxLjk1NTc5NyAzLjY4OTk5MDYsMy45MTIyOTcgNy4xODU5MzY2LDYuMzY4MjkzIEMgMTYuMDczLDI1LjEyOTY0OCAxNy4zNDE5NjUsMjYgMTcuMzc5MjY4LDI2IGMgMC4yMDk2ODEsMCAtMi4wMjY2MzksLTIuOTM5NjMxIC0zLjM4MTA1NCwtNC40NDM4MzMgLTIuMDI0MTg1LC0yLjI0ODAzNyAtMi4zOTc3MDQsLTMuMDQ3NDMyIC0yLjQ0MTQ0NywtNC4wNTcwMDUgLTAuMDM5NSwtMC45MTIxMTYgMC4zNDYzNzksLTEuNTE2MzI0IDAuODYzNzEyLC0xLjUxNjMyNCAwLjE4Nzk4MywwIDEuMDM4NzksMC42NDYxOTQgMS45NzY5NTQsMS43MjMwMjMgMC43ODE4MjMsMC44NTQ5MDkgMS4yOTU4NjgsMi4wNTcxOCAxLjkyMDE2NSwyLjkzNzE3NSAxLjMyMjAzNCwxLjY3MDQ2NSAyLjg1NTE4MywxLjg4MzUxOCAzLjQyNDgwNCwwLjQ3NTkyOCAwLjU1MTc5NSwtMS4zNjk2NTYgMC4xOTE2NDMsLTMuNzc1MDg0IC0xLjA2OTc3NCwtNS40NTExNjkgLTAuMTQxOTE5LC0wLjYxMjk3MyAwLjEyNjM1MiwtMC43MDYyMzQgMC43NDY0ODQsLTAuNzA1NTg5IDAuNzg0MzksNy43OWUtNCAyLjI3NDA2NCwwLjUzOTY5MiAzLjE2OTE0MSwxLjMyNDE3NCAxLjEwNjExNCwwLjk2OTQ0MyAxLjI5MjUxLDAuOTY0ODgxIDIuNTIzODI4LDMuNDM2MTM2IDAuNzI2ODM0LDEuNDU4NzU2IDEuNDQ3NzM5LDIuODE5Mjg5IDEuNjAyMzQ0LDMuMDIyOTY4IDAuMjc1MzM2LDAuMzYyNzQ2IDAuMjgxMTIyLDAuMzYwNzM5IDAuMjg1NzQyLC0wLjA5MjY5IC0wLjIzMjM0NiwtMy43NzU3NjggLTEuNTI3MzYsLTcuMzY5MzY5IC00LjMyNzE0OSwtOS45NDgzMTcgQyAyMi4xOTk0MTksMTIuMjg1NTU1IDIwLjgwOTcxLDExLjI2MzY5IDE5LjU4NDU0MiwxMC40MzQxMzYgMTcuNzk5NTAzLDkuMjI1NDkyIDE3LjM4Njk4OSw4Ljk4Mzc1MTggMTYuODc2MTQzLDkuMDAwODE5NyBaIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojOGQ4MDY5IiBkPSJtIDE2Ljg3NjE0Myw4LjAwMDgxOTcgYyAtMC4wNzI5OCwwLjAwMjQxIC0wLjE0ODQwNiwwLjAwOTggLTAuMjI5Njg3LDAuMDIwNzU1IC0wLjkxNDE2NCwwLjEyMzIxNDQgLTEuMTY1MDg5LDAuMzQ3MDM2MSAtMS43MjQwMjMsMS41MzQzMTIyIC0wLjM3Njk5OSwwLjgwMDgwNzEgLTAuNTY1NjAyLDAuODk4NTk4MSAtMS4wNTEzNjcsMS4wMDQyODgxIC0yLjI3MDg5OSwtMS42NzQwNjc2IC0yLjI3MDg5OSwwLjg4MTI5NCAtMi43MTc5NjksMS41ODk2NSBDIDEwLjU0MDI4NSwxMS42MDU3MjggOS43NDQ0MzMyLDEwLjQyOTE3NyA4Ljk1NzQ1MTksOS43NzE0MzMzIDguMjUzODQzNCw5LjE4MzM3MDcgNy41NTczMjUyLDguODI3MDgyOCA3LjAwNTA0OTcsOS4xOTgyMzI3IDYuNTY3NDA4OSw5LjUwODc3MjggNi4xOTU1Nzc3LDEwLjE3NTA1MyA2LjA2MDMyMywxMS43MDM3NjcgYyAtMC4xODQ3NzksMi4wODg0NTQgMC4wMDE5MywzLjI2NDIxMyAxLjMxMjUwMDQsNC45OTM3OTUgMS40ODE5ODQsMS45NTU3OTcgMy42ODk5OTA2LDMuOTEyMjk3IDcuMTg1OTM2Niw2LjM2ODI5MyBDIDE2LjA3MywyNC4xMjk2NDggMTcuMzQxOTY1LDI1IDE3LjM3OTI2OCwyNSBjIDAuMjA5NjgxLDAgLTIuMDI2NjM5LC0yLjkzOTYzMSAtMy4zODEwNTQsLTQuNDQzODMzIC0yLjAyNDE4NSwtMi4yNDgwMzcgLTIuMzk3NzA0LC0zLjA0NzQzMiAtMi40NDE0NDcsLTQuMDU3MDA1IC0wLjAzOTUsLTAuOTEyMTE2IDAuMzQ2Mzc5LC0xLjUxNjMyNCAwLjg2MzcxMiwtMS41MTYzMjQgMC4xODc5ODMsMCAxLjAzODc5LDAuNjQ2MTk0IDEuOTc2OTU0LDEuNzIzMDIzIDAuNzgxODIzLDAuODU0OTA5IDEuMjk1ODY4LDIuMDU3MTggMS45MjAxNjUsMi45MzcxNzUgMS4zMjIwMzQsMS42NzA0NjUgMi44NTUxODMsMS44ODM1MTggMy40MjQ4MDQsMC40NzU5MjggMC41NTE3OTUsLTEuMzY5NjU2IDAuMTkxNjQzLC0zLjc3NTA4NCAtMS4wNjk3NzQsLTUuNDUxMTY5IC0wLjE0MTkxOSwtMC42MTI5NzMgMC4xMjYzNTIsLTAuNzA2MjM0IDAuNzQ2NDg0LC0wLjcwNTU4OSAwLjc4NDM5LDcuNzllLTQgMi4yNzQwNjQsMC41Mzk2OTIgMy4xNjkxNDEsMS4zMjQxNzQgMS4xMDYxMTQsMC45Njk0NDMgMS4yOTI1MSwwLjk2NDg4MSAyLjUyMzgyOCwzLjQzNjEzNiAwLjcyNjgzNCwxLjQ1ODc1NiAxLjQ0NzczOSwyLjgxOTI4OSAxLjYwMjM0NCwzLjAyMjk2OCAwLjI3NTMzNiwwLjM2Mjc0NiAwLjI4MTEyMiwwLjM2MDczOSAwLjI4NTc0MiwtMC4wOTI2OSAtMC4yMzIzNDYsLTMuNzc1NzY4IC0xLjUyNzM2LC03LjM2OTM2OSAtNC4zMjcxNDksLTkuOTQ4MzE3IEMgMjIuMTk5NDE5LDExLjI4NTU1NSAyMC44MDk3MSwxMC4yNjM2OSAxOS41ODQ1NDIsOS40MzQxMzU4IDE3Ljc5OTUwMyw4LjIyNTQ5MiAxNy4zODY5ODksNy45ODM3NTE4IDE2Ljg3NjE0Myw4LjAwMDgxOTcgWiIvPgogPGVsbGlwc2Ugc3R5bGU9Im9wYWNpdHk6MC4yIiBjeD0iMS4wMzciIGN5PSIyNS40OTciIHJ4PSIxLjQxOSIgcnk9IjIuMDU4IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQxODAzMjg2LC0wLjkwODQzMTkxLDAuNjY5MzU4NDMsMC43NDI5Mzk2MywwLDApIi8+CiA8ZWxsaXBzZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iMS43NjYiIGN5PSIyNS4wNDEiIHJ4PSIxLjQxOSIgcnk9IjIuMDU4IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQxODAzMjg2LC0wLjkwODQzMTkxLDAuNjY5MzU4NDMsMC43NDI5Mzk2MywwLDApIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmO29wYWNpdHk6MC4xIiBkPSJNIDMuNDAwMzkwNiAyIEMgMi42MjQ3OTA2IDIgMiAyLjYyNDc5MDYgMiAzLjQwMDM5MDYgTCAyIDQuNDAwMzkwNiBDIDIgMy42MjQ3OTA2IDIuNjI0NzkwNiAzIDMuNDAwMzkwNiAzIEwgMjguNTk5NjA5IDMgQyAyOS4zNzUyMDkgMyAzMCAzLjYyNDc5MDYgMzAgNC40MDAzOTA2IEwgMzAgMy40MDAzOTA2IEMgMzAgMi42MjQ3OTA2IDI5LjM3NTIwOSAyIDI4LjU5OTYwOSAyIEwgMy40MDAzOTA2IDIgeiIvPgogPHBhdGggc3R5bGU9ImZpbGw6I2ZmZmZmZjtvcGFjaXR5OjAuMSIgZD0iTSAxNi44NzY5NTMgOCBDIDE2LjgwMzk3MyA4LjAwMjQxIDE2LjcyNzc2NSA4LjAxMDUyOTQgMTYuNjQ2NDg0IDguMDIxNDg0NCBDIDE1LjczMjMyIDguMTQ0Njk4OCAxNS40ODA4MDkgOC4zNjkzNjQ1IDE0LjkyMTg3NSA5LjU1NjY0MDYgQyAxNC41NDQ4NzYgMTAuMzU3NDQ4IDE0LjM1Njg1OSAxMC40NTQ4NTcgMTMuODcxMDk0IDEwLjU2MDU0NyBDIDExLjYwMDE5NSA4Ljg4NjQ3OTMgMTEuNTk5NDE0IDExLjQ0MjAzNSAxMS4xNTIzNDQgMTIuMTUwMzkxIEMgMTAuNTM5NTMyIDExLjYwNjI5NCA5Ljc0NDAxMjYgMTAuNDI5MjI4IDguOTU3MDMxMiA5Ljc3MTQ4NDQgQyA4LjI1MzQyMjcgOS4xODM0MjE4IDcuNTU4MTM0OSA4LjgyNjExNTcgNy4wMDU4NTk0IDkuMTk3MjY1NiBDIDYuNTY4MjE4NiA5LjUwNzgwNTcgNi4xOTU4MDE2IDEwLjE3NDQxMSA2LjA2MDU0NjkgMTEuNzAzMTI1IEMgNi4wMDExNDQxIDEyLjM3NDUyMSA1Ljk4NjkxNiAxMi45NDcwNDggNi4wMjkyOTY5IDEzLjQ3ODUxNiBDIDYuMDM4NzQ5NyAxMy4yMjMzNzIgNi4wMzUyODU3IDEyLjk4ODYzNyA2LjA2MDU0NjkgMTIuNzAzMTI1IEMgNi4xOTU4MDE2IDExLjE3NDQxMSA2LjU2ODIxODYgMTAuNTA3ODA2IDcuMDA1ODU5NCAxMC4xOTcyNjYgQyA3LjU1ODEzNDkgOS44MjYxMTU0IDguMjUzNDIyOCAxMC4xODM0MjIgOC45NTcwMzEyIDEwLjc3MTQ4NCBDIDkuNzQ0MDEyNSAxMS40MjkyMjggMTAuNTM5NTMyIDEyLjYwNjI5NCAxMS4xNTIzNDQgMTMuMTUwMzkxIEMgMTEuNTk5NDE0IDEyLjQ0MjAzNSAxMS42MDAxOTUgOS44ODY0NzkzIDEzLjg3MTA5NCAxMS41NjA1NDcgQyAxNC4zNTY4NTkgMTEuNDU0ODU3IDE0LjU0NDg3NiAxMS4zNTc0NDggMTQuOTIxODc1IDEwLjU1NjY0MSBDIDE1LjQ4MDgwOSA5LjM2OTM2NDQgMTUuNzMyMzIgOS4xNDQ2OTg4IDE2LjY0NjQ4NCA5LjAyMTQ4NDQgQyAxNi43Mjc3NjUgOS4wMTA1Mjk0IDE2LjgwMzk3MyA5LjAwMjQxIDE2Ljg3Njk1MyA5IEMgMTcuMzg3Nzk5IDguOTgyOTMyMSAxNy43OTg5NDUgOS4yMjQ5NDk3IDE5LjU4Mzk4NCAxMC40MzM1OTQgQyAyMC44MDkxNTIgMTEuMjYzMTQ4IDIyLjIwMDIyOSAxMi4yODYxNTYgMjIuNjczODI4IDEyLjcwNTA3OCBDIDI1LjMwODgzNiAxNS4xMzIyNDIgMjYuNTk3NzEgMTguNDU5NTgzIDI2LjkzNTU0NyAyMS45OTAyMzQgQyAyNi45ODgzMDYgMjIuMDA4NDUxIDI2Ljk5NzM3MiAyMS45MTAyMzMgMjcgMjEuNjUyMzQ0IEMgMjYuNzY3NjU0IDE3Ljg3NjU3NiAyNS40NzM2MTcgMTQuMjg0MDI2IDIyLjY3MzgyOCAxMS43MDUwNzggQyAyMi4yMDAyMjkgMTEuMjg2MTU2IDIwLjgwOTE1MiAxMC4yNjMxNDggMTkuNTgzOTg0IDkuNDMzNTkzOCBDIDE3Ljc5ODk0NSA4LjIyNDk0OTkgMTcuMzg3Nzk5IDcuOTgyOTMyMSAxNi44NzY5NTMgOCB6IE0gMTguOTA4MjAzIDE1LjAyOTI5NyBDIDE4LjY3Njk3NyAxNS4xMDcxNjggMTguNTgwODI0IDE1LjI3NDcwMiAxOC42NzE4NzUgMTUuNjY3OTY5IEMgMTkuNDMzNTU1IDE2LjY4MDAzNyAxOS44NjA3ODIgMTcuOTU2MDIgMTkuOTYyODkxIDE5LjExMTMyOCBDIDIwLjA3OTg4NiAxNy44NjgyMTQgMTkuNzI1MDk2IDE2LjI5ODUzMiAxOC45MDgyMDMgMTUuMDI5Mjk3IHogTSAxMS42MTEzMjggMTYuODUxNTYyIEMgMTEuNTY4MTA2IDE3LjA0MzYzMyAxMS41NDYyMzkgMTcuMjU5ODE5IDExLjU1NjY0MSAxNy41IEMgMTEuNjAwMzg0IDE4LjUwOTU3MyAxMS45NzM4NjIgMTkuMzA4NjA0IDEzLjk5ODA0NyAyMS41NTY2NDEgQyAxNC42MjU0ODEgMjIuMjUzNDY0IDE1LjQzMjMxMyAyMy4yNDg5ODMgMTYuMTA3NDIyIDI0LjEyNjk1MyBDIDE2LjUzNDg4NiAyNC40MTg5NzYgMTcuMzYyMDgxIDI1IDE3LjM3ODkwNiAyNSBDIDE3LjU4ODU4NyAyNSAxNS4zNTI0NjIgMjIuMDYwODQzIDEzLjk5ODA0NyAyMC41NTY2NDEgQyAxMi4yMTM1NzkgMTguNTc0ODMgMTEuNzM1MDggMTcuNzE4MTk5IDExLjYxMTMyOCAxNi44NTE1NjIgeiIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"astromenace\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"astromenace.desktop\"\nLABEL oc.launch=\"Astromenace.Astromenace\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"astromenace\"\nLABEL oc.displayname=\"astromenace\"\nLABEL oc.path=\"/usr/games/AstroMenace\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"astromenace\"\nENV APPBIN \"/usr/games/AstroMenace\"\nENV APP \"/usr/games/AstroMenace\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/astromenace/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/astromenace/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application astromenace

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/astromenace.d\n
"},{"location":"applications/astromenace/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f astromenace.d -t astromenace .\n
"},{"location":"applications/astromenace/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect astromenace > astromenace.json\ndocker image save astromenace -o astromenace.tar\nctr -n k8s.io images import astromenace.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @astromenace.json\n\n
"},{"location":"applications/atom/","title":"Atom","text":""},{"location":"applications/atom/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk

"},{"location":"applications/atom/#use-ubuntu-package","title":"use ubuntu package","text":"

libxss1 atom aspell

"},{"location":"applications/atom/#arguments","title":"Arguments","text":"

\"-f\"

"},{"location":"applications/atom/#display-name","title":"Display name","text":"

\"Atom\"

"},{"location":"applications/atom/#path","title":"path","text":"

\"/usr/bin/atom\"

"},{"location":"applications/atom/#pre-run-command","title":"Pre run command","text":"
\nRUN apt-get update && apt-get install  --no-install-recommends --yes wget && apt-get clean,RUN apt-get update && apt-get install                          --yes libxss1 && apt-get clean,RUN wget -qO - https://packagecloud.io/AtomEditor/atom/gpgkey | apt-key add -,RUN echo \"deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main\" > /etc/apt/sources.list.d/atom.list,RUN apt-get update && apt-get install  --no-install-recommends --yes $(apt-cache search aspell- | awk '{print $1 }') && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/base/","title":"base","text":""},{"location":"applications/base/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.libreoffice

"},{"location":"applications/base/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/base/#alpine-packages","title":"Alpine packages","text":"
libreoffice-gnome\n
"},{"location":"applications/base/#arguments","title":"Arguments","text":"

\"--base\"

"},{"location":"applications/base/#displayname","title":"Displayname","text":"
Base\n
"},{"location":"applications/base/#path","title":"Path","text":"
/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/base/#uniquerunkey","title":"uniquerunkey","text":"

\"libreoffice\"

"},{"location":"applications/base/#mimetype","title":"Mimetype","text":"
application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\n
"},{"location":"applications/base/#file-extensions","title":"File extensions","text":"

\"odb\"

"},{"location":"applications/base/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"odb\"

"},{"location":"applications/base/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/base/#wm_class","title":"WM_CLASS","text":"
libreoffice.libreoffice-base\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/base/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/libreoffice-base.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/base/#json-dump","title":"JSON dump","text":"

json source file base.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_base.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-base\",\n    \"name\": \"base\",\n    \"displayname\": \"Base\",\n    \"args\": \"--base\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\",\n    \"fileextensions\": \"odb\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"legacyfileextensions\": \"odb\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-base.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/base/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output base.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/base.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @base.d.3.0.json\n\n
"},{"location":"applications/base/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_base.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzk1MGJhOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjNTU3YmMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjciIHkyPSI1NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjhkMmZjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0NS41MDEiIHgyPSI0NS41MDEiIHkxPSI3LjEwNTUiIHkyPSIyOS44OTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlZWJmNyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2U3ZjkiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzUiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImQiIGN4PSIzOC4wNjYiIGN5PSIyNi4xOTIiIHI9IjI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0uOCAzZS04IC0xLjkyNjVlLTggLS45NDAzNCA4MC40NTMgMzguNjI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWUzNTNjIiBzdG9wLW9wYWNpdHk9Ii40ODUzOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxOTE5MTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI1MjUuNDQiIHgyPSI1MTYuNjYiIHkxPSI4MzYuMTkiIHkyPSI4MjguNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc4OTMgMCAwIDEuMDAwNyAtMTcxLjQxIC03NDApIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZGM4NWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2YyY2JmOCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImoiIHgxPSI1MjUuNDQiIHgyPSI1MTYuNjYiIHkxPSI4MzYuMTkiIHkyPSI4MjguNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc4OTMgMCAwIDEuMDAwNyA3NTUuNiAtMTY5OC43KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iNTI1LjQ0IiB4Mj0iNTE2LjY2IiB5MT0iODM2LjE5IiB5Mj0iODI4LjUiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyNS41IC0xNzAyLjUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSI1MjAuNTkiIHgyPSI1MTYuMTUiIHkxPSI3MzUuMDUiIHkyPSI3MjAuODYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxmaWx0ZXIgaWQ9Im0iIHg9Ii0uMDU4MTA4IiB5PSItLjA2MjAxNyIgd2lkdGg9IjEuMTE2MiIgaGVpZ2h0PSIxLjEyNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC41NDYyMzg3NCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8ZyBzdHJva2Utd2lkdGg9Ii44MzM1MiI+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xOTkyIDAgMCAxLjIwMDIgLTM4MC41MyAtNzEuNjU2KSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI20pIiBvcGFjaXR5PSIuMjUiIHN0cm9rZT0iIzAwMCI+CiAgIDxwYXRoIGQ9Im0zMzIuNzQgOTAuMTA1djQuMDAyOWMwIDEuOTM0NCA1LjA0MDIgMy41MDI2IDExLjI1OCAzLjUwMjYgNi4yMTc0IDAgMTEuMjU4LTEuNTY4MSAxMS4yNTgtMy41MDI2di00LjAwMjl6IiBjb2xvcj0iIzAwMDAwMCIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTI3IDk1My45OSkiPgogICAgPHBhdGggZD0ibTEyNTkuNy04NjguNTd2NC4wMDNjMCAxLjkzNDQgNS4wNDAyIDMuNTAyNSAxMS4yNTggMy41MDI1IDYuMjE3NCAwIDExLjI1OC0xLjU2ODEgMTEuMjU4LTMuNTAyNXYtNC4wMDN6IiBjb2xvcj0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIuODMzNTIiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KC45Nzg5MyAwIDAgMS4wMDA3IDg3OC40NSAuMzc3NTQpIj4KICAgICA8cGF0aCBkPSJtMzg5LjUtODcyLjk2djRjMCAxLjkzMyA1LjE0ODcgMy41IDExLjUgMy41czExLjUtMS41NjcgMTEuNS0zLjV2LTR6IiBjb2xvcj0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIuODQyMTQiLz4KICAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguNTEyNTQgMCAwIC42MTUzOCAxMzQuNjQgLTEzMjMuMikiIGN4PSI1MTkuNjkiIGN5PSI3MzAuMzEiIHJ4PSIyMi40MzgiIHJ5PSI1LjY4NzUiIGNvbG9yPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNDk5NSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTk5MiAwIDAgMS4yMDAyIC0zODAuNTMgLTcxLjY1NikiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIHN0cm9rZT0iIzhlMDNhMyI+CiAgIDxwYXRoIGQ9Im0zMzIuNzQgOTAuMTA1djQuMDAyOWMwIDEuOTM0NCA1LjA0MDIgMy41MDI2IDExLjI1OCAzLjUwMjYgNi4yMTc0IDAgMTEuMjU4LTEuNTY4MSAxMS4yNTgtMy41MDI2di00LjAwMjl6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNsKSIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTI3IDk1My45OSkiPgogICAgPHBhdGggZD0ibTEyNTkuNy04NjguNTd2NC4wMDNjMCAxLjkzNDQgNS4wNDAyIDMuNTAyNSAxMS4yNTggMy41MDI1IDYuMjE3NCAwIDExLjI1OC0xLjU2ODEgMTEuMjU4LTMuNTAyNXYtNC4wMDN6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNqKSIgc3Ryb2tlLXdpZHRoPSIuODMzNTIiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KC45Nzg5MyAwIDAgMS4wMDA3IDg3OC40NSAuMzc3NTQpIj4KICAgICA8cGF0aCBkPSJtMzg5LjUtODcyLjk2djRjMCAxLjkzMyA1LjE0ODcgMy41IDExLjUgMy41czExLjUtMS41NjcgMTEuNS0zLjV2LTR6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNpKSIgc3Ryb2tlLXdpZHRoPSIuODQyMTQiLz4KICAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguNTEyNTQgMCAwIC42MTUzOCAxMzQuNjQgLTEzMjMuMikiIGN4PSI1MTkuNjkiIGN5PSI3MzAuMzEiIHJ4PSIyMi40MzgiIHJ5PSI1LjY4NzUiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2gpIiBzdHJva2Utd2lkdGg9IjEuNDk5NSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"base,libreoffice,office\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"libreoffice-base.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-base\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--base\"\nLABEL oc.name=\"base\"\nLABEL oc.displayname=\"Base\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\"\nLABEL oc.fileextensions=\"odb\"\nLABEL oc.legacyfileextensions=\"odb\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"base\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--base\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/base/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/base/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application base

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/base.d\n
"},{"location":"applications/base/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f base.d -t base .\n
"},{"location":"applications/base/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect base > base.json\ndocker image save base -o base.tar\nctr -n k8s.io images import base.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @base.json\n\n
"},{"location":"applications/beekeeperstudio/","title":"beekeeperstudio","text":""},{"location":"applications/beekeeperstudio/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/beekeeperstudio/#arguments","title":"Arguments","text":"

\"--no-sandbox\"

"},{"location":"applications/beekeeperstudio/#displayname","title":"Displayname","text":"
Beekeeper-studio\n
"},{"location":"applications/beekeeperstudio/#path","title":"Path","text":"
/opt/Beekeeper-Studio/beekeeper-studio\n
"},{"location":"applications/beekeeperstudio/#file-extensions","title":"File extensions","text":"

\"sql\"

"},{"location":"applications/beekeeperstudio/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"sql\"

"},{"location":"applications/beekeeperstudio/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/beekeeperstudio/#wm_class","title":"WM_CLASS","text":"
beekeeper-studio.beekeeper-studio\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/beekeeperstudio/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/beekeeper-studio.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/beekeeperstudio/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install  --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 && apt-get clean\nRUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\nRUN echo \"deb https://deb.beekeeperstudio.io stable main\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\nRUN apt-get update && apt-get install  --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\nRUN mv \"/opt/Beekeeper Studio/\" /opt/Beekeeper-Studio\nENV ELECTRON_ENABLE_LOGGING=true\nENV QT_X11_NO_MITSHM=1\n
"},{"location":"applications/beekeeperstudio/#json-dump","title":"JSON dump","text":"

json source file beekeeperstudio.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 && apt-get clean\",\n        \"RUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\",\n        \"RUN echo \\\"deb https://deb.beekeeperstudio.io stable main\\\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\",\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\",\n        \"RUN mv \\\"/opt/Beekeeper Studio/\\\" /opt/Beekeeper-Studio\",\n        \"ENV ELECTRON_ENABLE_LOGGING=true\",\n        \"ENV QT_X11_NO_MITSHM=1\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"beekeeper-studio.svg\",\n    \"keyword\": \"database,sql,mysql,postgres,sqllite,db,sqlserver,query,editor\",\n    \"launch\": \"beekeeper-studio.beekeeper-studio\",\n    \"name\": \"beekeeperstudio\",\n    \"displayname\": \"Beekeeper-studio\",\n    \"installrecommends\": false,\n    \"forceconfold\": true,\n    \"host_config\": {\n        \"shm_size\": \"2G\",\n        \"ipc_mode\": \"shareable\"\n    },\n    \"args\": \"--no-sandbox\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/opt/Beekeeper-Studio/beekeeper-studio\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"legacyfileextensions\": \"sql\",\n    \"fileextensions\": \"sql\",\n    \"desktopfile\": \"/usr/share/applications/beekeeper-studio.desktop\",\n    \"usedefaultapplication\": false\n}\n
"},{"location":"applications/beekeeperstudio/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output beekeeperstudio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/beekeeperstudio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @beekeeperstudio.d.3.0.json\n\n
"},{"location":"applications/beekeeperstudio/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 && apt-get clean\nRUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\nRUN echo \"deb https://deb.beekeeperstudio.io stable main\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\nRUN apt-get update && apt-get install  --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\nRUN mv \"/opt/Beekeeper Studio/\" /opt/Beekeeper-Studio\nENV ELECTRON_ENABLE_LOGGING=true\nENV QT_X11_NO_MITSHM=1\nLABEL oc.icon=\"beekeeper-studio.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDEzMi44IDE0Ni4yIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxMzIuOCAxNDYuMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGQUQ4M0I7fQo8L3N0eWxlPgo8Zz4KCTxnPgoJCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMjEuMywyOC4yTDc3LjcsMy4xQzcwLjYtMSw2MS45LTEsNTQuOSwzLjFMNDMuNSw5LjdWMzl2Ni43djI3LjVjMCw4LjEsNC4zLDE1LjcsMTEuNCwxOS44CgkJCWMzLjUsMiw3LjUsMy4xLDExLjQsMy4xczcuOS0xLDExLjQtMy4xbDAsMGM3LjEtNC4xLDExLjQtMTEuNiwxMS40LTE5LjhjMC04LjEtNC4zLTE1LjctMTEuNC0xOS44bDAsMGMtMy41LTItNy41LTMuMS0xMS40LTMuMQoJCQlWMzZjMy45LDAsNy45LDEsMTEuNCwzLjFsMTIuNCw3LjJjNy4xLDQuMSwxMS40LDExLjYsMTEuNCwxOS44djE0LjNjMCw4LjEtNC4zLDE1LjctMTEuNCwxOS44bC0xMi40LDcuMmMtMy41LDItNy41LDMuMS0xMS40LDMuMQoJCQlzLTcuOS0xLTExLjQtMy4xbC0xMi40LTcuMmMtNy4xLTQuMS0xMS40LTExLjYtMTEuNC0xOS44di03LjJWNjZWNDcuNVYxNi44TDExLjQsMjguMkM0LjMsMzIuMywwLDM5LjgsMCw0OHY1MC4zCgkJCWMwLDguMSw0LjMsMTUuNywxMS40LDE5LjhMNTUsMTQzLjJjNy4xLDQuMSwxNS44LDQuMSwyMi44LDBsNDMuNi0yNS4xYzcuMS00LjEsMTEuNC0xMS42LDExLjQtMTkuOFY0OAoJCQlDMTMyLjcsMzkuOCwxMjguMywzMi4zLDEyMS4zLDI4LjJ6IE01Mi4zLDU1LjJjLTEuMywxLTIuNCwyLjEtMy40LDMuM3YtMTZsMy40LTJWNTUuMnogTTYxLDUxYy0xLjIsMC4zLTIuMywwLjYtMy40LDEuMVYzNy43CgkJCWMxLjEtMC41LDIuMy0wLjgsMy40LTEuMVY1MXoiLz4KCTwvZz4KPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"beekeeperstudio,database,sql,mysql,postgres,sqllite,db,sqlserver,query,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"beekeeper-studio.desktop\"\nLABEL oc.launch=\"beekeeper-studio.beekeeper-studio\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--no-sandbox\"\nLABEL oc.name=\"beekeeperstudio\"\nLABEL oc.displayname=\"Beekeeper-studio\"\nLABEL oc.path=\"/opt/Beekeeper-Studio/beekeeper-studio\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"sql\"\nLABEL oc.legacyfileextensions=\"sql\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"shm_size\\\":\\\"2G\\\",\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"beekeeperstudio\"\nENV APPBIN \"/opt/Beekeeper-Studio/beekeeper-studio\"\nLABEL oc.args=\"--no-sandbox\"\nENV APP \"/opt/Beekeeper-Studio/beekeeper-studio\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/beekeeperstudio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/beekeeperstudio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application beekeeperstudio

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/beekeeperstudio.d\n
"},{"location":"applications/beekeeperstudio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f beekeeperstudio.d -t beekeeperstudio .\n
"},{"location":"applications/beekeeperstudio/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect beekeeperstudio > beekeeperstudio.json\ndocker image save beekeeperstudio -o beekeeperstudio.tar\nctr -n k8s.io images import beekeeperstudio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @beekeeperstudio.json\n\n
"},{"location":"applications/blender/","title":"blender","text":""},{"location":"applications/blender/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/blender/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/blender/#alpine-packages","title":"Alpine packages","text":"
blender mesa-dri-gallium\n
"},{"location":"applications/blender/#displayname","title":"Displayname","text":"
Blender\n
"},{"location":"applications/blender/#path","title":"Path","text":"
/usr/bin/blender\n
"},{"location":"applications/blender/#mimetype","title":"Mimetype","text":"
application/x-blender\n
"},{"location":"applications/blender/#file-extensions","title":"File extensions","text":"

\"blend,obj,fbx,3ds,ply,stl\"

"},{"location":"applications/blender/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/blender/#wm_class","title":"WM_CLASS","text":"
Blender.Blender\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/blender/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/blender.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/blender/#json-dump","title":"JSON dump","text":"

json source file blender.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,graphics\",\n    \"apkpackage\": \"blender mesa-dri-gallium\",\n    \"icon\": \"circle_blender.svg\",\n    \"keyword\": \"blender,modeler\",\n    \"launch\": \"Blender.Blender\",\n    \"name\": \"blender\",\n    \"displayname\": \"Blender\",\n    \"path\": \"/usr/bin/blender\",\n    \"mimetype\": \"application/x-blender\",\n    \"fileextensions\": \"blend,obj,fbx,3ds,ply,stl\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/blender.desktop\"\n}\n
"},{"location":"applications/blender/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output blender.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blender.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blender.d.3.0.json\n\n
"},{"location":"applications/blender/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update blender mesa-dri-gallium\nLABEL oc.icon=\"circle_blender.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMDEuODEiIHgyPSIxMDEuODEiIHkxPSItMTYuNTc4IiB5Mj0iMjQyLjcyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQuNzgxMiAwIDAgNC43ODEyIDMzLjg3NSA2Mi4yMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYmI1MjEiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjE1ZjE5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjUyMCIgeDI9IjUyMCIgeTE9IjMyLjM2MiIgeTI9IjEwNTIuNCIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg1LjQzNzIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI1MjAiIHgyPSI1MjAiIHkxPSIyNTIuMzYiIHkyPSI3MTIuMzYiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc1Ljk5MyAtMTIyLjk5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTk3Y2YxIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIxYzlmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSI2Ny4wMjQiIHgyPSIxMDIuOTEiIHkxPSIyODMuOTEiIHkyPSI1ODEuNzYiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDQuNjQxIDIuNjc5NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlOGViZWMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmRmZWZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2MzI0IiB5PSItLjAzNTY4MiIgd2lkdGg9IjEuMDcyNiIgaGVpZ2h0PSIxLjA3MTQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjExLjYyMzYzNyIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4zNDM3NDkiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjI3NDUgMCAwIC4wNjI3NDUgLS4xMjU0OSA5ODYuNDYpIiBzdHJva2Utd2lkdGg9IjE1LjkzOCI+CiAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU0MC4zNiIgcj0iNDc4LjEyIiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2YpIiBvcGFjaXR5PSIuMjUiLz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSI0NzguMTIiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMTApIiBmaWxsPSIjMTQxNDE0IiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9IjI1NCI+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSgtMzApIiBjeD0iMTY4LjU4IiBjeT0iNDYwLjI1IiByeD0iMTgzLjMxIiByeT0iMTYwLjE5IiBvcGFjaXR5PSIxIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICAgPGNpcmNsZSBjeD0iNTEyLjAxIiBjeT0iNTQ1Ljg1IiByPSIzODQiIG9wYWNpdHk9IjEiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiAgICA8Y2lyY2xlIGN4PSI0MDEuMzIiIGN5PSIzNDYuNzUiIHI9IjEyOCIgb3BhY2l0eT0iMSIgc3Ryb2tlPSIjZjBmMGYwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjE3LjY3NSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPC9nPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjkzOCI+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSgtMzApIiBjeD0iMTY4LjU4IiBjeT0iNDYwLjI1IiByeD0iMTgzLjMxIiByeT0iMTYwLjE5IiBmaWxsPSJ1cmwoI2MpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICAgPGNpcmNsZSBjeD0iNTEyLjAxIiBjeT0iNTQ1Ljg1IiByPSIzODQiIGZpbGw9InVybCgjZSkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiAgICA8Y2lyY2xlIGN4PSI0NDEuMzIiIGN5PSI0MjYuNzUiIHI9IjEyOCIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlPSIjZjBmMGYwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjE3LjY3NSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"blender,blender,modeler\"\nLABEL oc.cat=\"utilities,graphics\"\nLABEL oc.desktopfile=\"blender.desktop\"\nLABEL oc.launch=\"Blender.Blender\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"blender\"\nLABEL oc.displayname=\"Blender\"\nLABEL oc.path=\"/usr/bin/blender\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-blender\"\nLABEL oc.fileextensions=\"blend,obj,fbx,3ds,ply,stl\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"blender\"\nENV APPBIN \"/usr/bin/blender\"\nENV APP \"/usr/bin/blender\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/blender/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/blender/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application blender

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blender.d\n
"},{"location":"applications/blender/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f blender.d -t blender .\n
"},{"location":"applications/blender/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect blender > blender.json\ndocker image save blender -o blender.tar\nctr -n k8s.io images import blender.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blender.json\n\n
"},{"location":"applications/bless/","title":"Bless","text":""},{"location":"applications/bless/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/bless/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/bless/#ubuntu-packages","title":"Ubuntu packages","text":"
bless\n
"},{"location":"applications/bless/#path","title":"Path","text":"
/usr/bin/bless\n
"},{"location":"applications/bless/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/bless/#wm_class","title":"WM_CLASS","text":"
bless.Bless\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/bless/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/bless.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/bless/#json-dump","title":"JSON dump","text":"

json source file bless.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"debpackage\": \"bless\",\n    \"icon\": \"circle_bless.svg\",\n    \"keyword\": \"hexa,decimal\",\n    \"launch\": \"bless.Bless\",\n    \"name\": \"Bless\",\n    \"path\": \"/usr/bin/bless\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/bless.desktop\"\n}\n
"},{"location":"applications/bless/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output bless.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/bless.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @bless.d.3.0.json\n\n
"},{"location":"applications/bless/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends bless && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_bless.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYmciIHgxPSIyNS4wMDQiIHgyPSIyNS4wMDQiIHkxPSI1LjIxNTgiIHkyPSI0NS4xMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyAuNjk1NjUgLjY5NTY1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYzdjN2M3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y2ZjZmNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMTgyIiB4PSItLjEyMjczIiB5PSItLjA5NjQyOSIgd2lkdGg9IjEuMjQ1NSIgaGVpZ2h0PSIxLjE5MjkiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTI1MDAwMSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEzOTkiIHg9Ii0uMDI3IiB5PSItLjAyNyIgd2lkdGg9IjEuMDU0IiBoZWlnaHQ9IjEuMDU0IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjUxNzUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50ODg4IiB4MT0iMjEuNTE3IiB4Mj0iNDkuMTUzIiB5MT0iMzguMjE2IiB5Mj0iMzguMjE2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTNmNDciIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3NTUyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk3MCIgeD0iLS4wNTQ5NzIiIHk9Ii0uMTE3OTkiIHdpZHRoPSIxLjEwOTkiIGhlaWdodD0iMS4yMzYiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzI2MzkzNyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5ODAiIHgxPSIzNS41MzUiIHgyPSIyNS44NSIgeTE9IjIwLjgwMyIgeTI9IjE0Ljc0OSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjODc4Nzg3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg3ODc4NyIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyAuNjk1NjUgLjY5NTY1KSIgY3g9IjI0IiBjeT0iMjQuNzY3IiByPSIyMyIgZmlsbD0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEzOTkpIiBvcGFjaXR5PSIuMTUiLz4KIDxjaXJjbGUgY3g9IjMxLjk5OSIgY3k9IjMxLjk5OSIgcj0iMjkuOTk5IiBmaWxsPSJ1cmwoI2JnKSIgc3Ryb2tlLXdpZHRoPSIxLjMwNDMiLz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuNDU0NSAwIDAgMS40NTQ1IC0zLjIxMDMgLTEuNzgzNCkiIGQ9Im0xOCAxMGMwIDUgMiA4IDYgMTFsLTkgMWMwIDIuMjE2IDEuNzg0IDQgNCA0aDF2LTNoM3YyaC0xdjFoM2wtNyA4LjVjLTAuMDAyMiAxLjkzMyAxLjU2NyAzLjUwMiAzLjUgMy41IDAuOTI3MDItOS43ZS00IDEuODQ2MS0wLjM0Mjg3IDIuNS0xbDEyLTEyYzAuNjU3MTItMC42NTM4NyAwLjk5ODk1LTEuNTczIDEtMi41IDAuMDAyMi0xLjkzMy0xLjU2Ny0zLjUwMi0zLjUtMy41LTAuNjE0OTcgNi40M2UtNCAtMS4yMjQ5IDAuMTU0MDUtMS43NTc4IDAuNDQ3Mjd6IiBmaWx0ZXI9InVybCgjZmlsdGVyMTE4MikiIG9wYWNpdHk9Ii4xIi8+CiA8cGF0aCBkPSJtMTcuMTUzIDI3LjMwN3YxLjQ1NDVjMCAzLjIyMzIgMi41OTQ5IDUuODE4MSA1LjgxODEgNS44MTgxaDEuNDU0NXYtNC4zNjM2aDQuMzYzNmMwLjgwNTgxIDAgMS40NTQ1IDAuNjQ4NzIgMS40NTQ1IDEuNDU0NXMtMC42NDg3MiAxLjQ1NDUtMS40NTQ1IDEuNDU0NWgtMS40NTQ1djEuNDU0NWgxMS42MzZsNS44MTgxLTcuMjcyNnoiIGZpbGw9IiNmMmYyZjIiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjkuODc3IDI3LjMwN2MwLjU3MzIgMC40ODc0MyAxLjE3NjQgMC45NzEwNiAxLjgyMTEgMS40NTQ1bDcuNzc4NCA1LjE4NDcgNC42NTA2LTYuNjM5MnoiIGZpbHRlcj0idXJsKCNmaWx0ZXI5NzApIiBvcGFjaXR5PSIuMSIgc3Ryb2tlLXdpZHRoPSIxLjQ1NDUiLz4KIDxwYXRoIGQ9Im0yMS41MTcgMTEuMzA3IDIzLjI3MiAxNi01LjgxODEgNS44MTgxLTguNzI3Mi01LjgxODFjLTUuODE4MS00LjM2MzYtOC43MjcyLTguNzI3Mi04LjcyNzItMTZ6IiBmaWxsPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNDU0NSIvPgogPHBhdGggZD0ibTQ0LjA2MiAyNC4zOThjLTEuMzQ4NCAwLjAwMTQtMi42ODUyIDAuNDk4NzEtMy42MzYzIDEuNDU0NWwtMTcuNDU0IDE3LjQ1NGMtMC45NTU4IDAuOTUxMTQtMS40NTMgMi4yODgtMS40NTQ1IDMuNjM2My0wLjAwMzIgMi44MTE2IDIuMjc5MiA1LjA5MzggNS4wOTA4IDUuMDkwOCAxLjM0ODQtMC4wMDE0IDIuNjg1Mi0wLjQ5ODcxIDMuNjM2My0xLjQ1NDVsMTcuNDU0LTE3LjQ1NGMwLjk1NTgtMC45NTEwNyAxLjQ1My0yLjI4OCAxLjQ1NDUtMy42MzYzIDAuMDAzMi0yLjgxMTYtMi4yNzkyLTUuMDkzOC01LjA5MDgtNS4wOTA4eiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg4OCkiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjcuMzM1IDQxLjg1Mi0wLjcyNzI2IDAuNzI3MjYgMS4wOTA5IDEuMDkwOS0wLjcyNzI2IDAuNzI3MjYtMS4wOTA5LTEuMDkwOS0wLjcyNzI2IDAuNzI3MjYgMS4wOTA5IDEuMDkwOS0xLjA5MDkgMS4wOTA5IDAuNzI3MjYgMC43MjcyNiAxLjA5MDktMS4wOTA5IDAuNzI3MjYgMC43MjcyNi0xLjA5MDkgMS4wOTA5IDAuNzI3MjYgMC43MjcyNiAxLjA5MDktMS4wOTA5IDEuMDkwOSAxLjA5MDkgMC43MjcyNi0wLjcyNzI2LTEuMDkwOS0xLjA5MDkgMC43MjcyNi0wLjcyNzI2IDEuMDkwOSAxLjA5MDkgMC43MjcyNi0wLjcyNzI2LTEuMDkwOS0xLjA5MDkgMS4wOTA5LTEuMDkwOS0wLjcyNzI2LTAuNzI3MjYtMS4wOTA5IDEuMDkwOS0wLjcyNzI2LTAuNzI3MjYgMS4wOTA5LTEuMDkwOS0wLjcyNzI2LTAuNzI3MjYtMS4wOTA5IDEuMDkwOXptMS4wOTA5IDIuNTQ1NCAwLjcyNzI2IDAuNzI3MjYtMC43MjcyNiAwLjcyNzI2LTAuNzI3MjYtMC43MjcyNnoiIGZpbGw9IiNmOWY5ZjkiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjUuODggMTUuNzYxdjEuNDU0NWw4LjcyNzIgNS45OTk5di0xLjQ1NDV6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTgwKSIgc3Ryb2tlLXdpZHRoPSIxLjQ1NDUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"bless,hexa,decimal\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"bless.desktop\"\nLABEL oc.launch=\"bless.Bless\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"Bless\"\nLABEL oc.displayname=\"Bless\"\nLABEL oc.path=\"/usr/bin/bless\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Bless\"\nENV APPBIN \"/usr/bin/bless\"\nENV APP \"/usr/bin/bless\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/bless/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/bless/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Bless

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Bless.d\n
"},{"location":"applications/bless/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Bless.d -t Bless .\n
"},{"location":"applications/bless/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Bless > Bless.json\ndocker image save Bless -o Bless.tar\nctr -n k8s.io images import Bless.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Bless.json\n\n
"},{"location":"applications/blobby/","title":"blobby","text":""},{"location":"applications/blobby/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/blobby/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/blobby/#ubuntu-packages","title":"Ubuntu packages","text":"
blobby\n
"},{"location":"applications/blobby/#path","title":"Path","text":"
/usr/games/blobby\n
"},{"location":"applications/blobby/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/blobby/#wm_class","title":"WM_CLASS","text":"
blobby.blobby\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/blobby/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/blobby.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/blobby/#json-dump","title":"JSON dump","text":"

json source file blobby.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"blobby\",\n    \"icon\": \"blobby.svg\",\n    \"installrecommends\": false,\n    \"keyword\": \"game\",\n    \"launch\": \"blobby.blobby\",\n    \"name\": \"blobby\",\n    \"path\": \"/usr/games/blobby\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"args\": \"\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/blobby.desktop\"\n}\n
"},{"location":"applications/blobby/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output blobby.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blobby.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blobby.d.3.0.json\n\n
"},{"location":"applications/blobby/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends blobby && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"blobby.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8c3ZnIHZpZXdCb3g9IjAgMCAyMDAgMjAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGZpbGw9IiNGRjAwNjYiIGQ9Ik0zNy45LDIyLjRDMjQuOCw0NC42LC0yNyw0NSwtMzkuNywyM0MtNTIuNCwxLC0yNi4yLC00My40LC0wLjQsLTQzLjZDMjUuNSwtNDMuOCw1MSwwLjIsMzcuOSwyMi40WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAwIDEwMCkiIC8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"blobby,game\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"blobby.desktop\"\nLABEL oc.launch=\"blobby.blobby\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"blobby\"\nLABEL oc.displayname=\"blobby\"\nLABEL oc.path=\"/usr/games/blobby\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"blobby\"\nENV APPBIN \"/usr/games/blobby\"\nENV APP \"/usr/games/blobby\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/blobby/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/blobby/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application blobby

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blobby.d\n
"},{"location":"applications/blobby/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f blobby.d -t blobby .\n
"},{"location":"applications/blobby/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect blobby > blobby.json\ndocker image save blobby -o blobby.tar\nctr -n k8s.io images import blobby.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blobby.json\n\n
"},{"location":"applications/boxes/","title":"boxes","text":""},{"location":"applications/boxes/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/boxes/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/boxes/#alpine-packages","title":"Alpine packages","text":"
gnome-boxes sudo\n
"},{"location":"applications/boxes/#displayname","title":"Displayname","text":"
Gnome-boxes\n
"},{"location":"applications/boxes/#path","title":"Path","text":"
/usr/bin/gnome-boxes\n
"},{"location":"applications/boxes/#mimetype","title":"Mimetype","text":"
application-x-cd-image;\n
"},{"location":"applications/boxes/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/boxes/#wm_class","title":"WM_CLASS","text":"
gnome-boxes.Gnome-boxes\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/boxes/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Boxes.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/boxes/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
"},{"location":"applications/boxes/#json-dump","title":"JSON dump","text":"

json source file boxes.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"icon\": \"org.gnome.Boxes.svg\",\n    \"apkpackage\": \"gnome-boxes sudo\",\n    \"keyword\": \"boxes,vm\",\n    \"launch\": \"gnome-boxes.Gnome-boxes\",\n    \"name\": \"boxes\",\n    \"displayname\": \"Gnome-boxes\",\n    \"path\": \"/usr/bin/gnome-boxes\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Boxes.desktop\",\n    \"mimetype\": \"application-x-cd-image;\",\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n    ],\n    \"securitycontext\": {\n        \"allowPrivilegeEscalation\": true,\n        \"capabilities\": {\n            \"add\": [\n                \"NET_ADMIN\",\n                \"CAP_SYS_ADMIN\"\n            ]\n        }\n    }\n}\n
"},{"location":"applications/boxes/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output boxes.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/boxes.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @boxes.d.3.0.json\n\n
"},{"location":"applications/boxes/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-boxes sudo\nLABEL oc.icon=\"org.gnome.Boxes.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmVyc2lvbj0iMS4wIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImEiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPjxzdG9wIG9mZnNldD0iLjQiIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmNmY1ZjQiLz48L2xpbmVhckdyYWRpZW50PjxyYWRpYWxHcmFkaWVudCB4bGluazpocmVmPSIjYSIgaWQ9ImkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQgMCAwIDQgLTQ5Mi43OTkgLTY0MS45NTIpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iaCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNCAwIDAgNCAtNDkyLjc5OSAtNjgxLjk1MikiIGN4PSIxMzQuMiIgY3k9IjIyMi45ODgiIGZ4PSIxMzQuMiIgZnk9IjIyMi45ODgiIHI9IjIiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJnIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2IDAgMCA2IC03ODUuMTk4IC0xMDY1LjkyOCkiIGN4PSIxMzQuMiIgY3k9IjIyMi45ODgiIGZ4PSIxMzQuMiIgZnk9IjIyMi45ODgiIHI9IjIiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJmIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2IDAgMCA2IC03ODUuMTk4IC0xMTUzLjkyOCkiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJlIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg0IDAgMCA0IC00NTIuNzk5IC02ODEuOTUyKSIgY3g9IjEzNC4yIiBjeT0iMjIyLjk4OCIgZng9IjEzNC4yIiBmeT0iMjIyLjk4OCIgcj0iMiIvPjxyYWRpYWxHcmFkaWVudCB4bGluazpocmVmPSIjYSIgaWQ9ImQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQgMCAwIDQgLTQ1Mi43OTkgLTY0MS45NTIpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iYyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNiAwIDAgNiAtNjk3LjE5OCAtMTA2NS45MjgpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iYiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNiAwIDAgNiAtNjk3LjE5OCAtMTE1My45MjgpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PC9kZWZzPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTE3MikiPjxwYXRoIHN0eWxlPSJsaW5lLWhlaWdodDpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LXBvc2l0aW9uOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtdmFyaWFudC1hbHRlcm5hdGVzOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtaW5kZW50OjA7dGV4dC1hbGlnbjpzdGFydDt0ZXh0LWRlY29yYXRpb24tbGluZTpub25lO3RleHQtZGVjb3JhdGlvbi1zdHlsZTpzb2xpZDt0ZXh0LWRlY29yYXRpb24tY29sb3I6IzAwMDt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtb3JpZW50YXRpb246bWl4ZWQ7d2hpdGUtc3BhY2U6bm9ybWFsO3NoYXBlLXBhZGRpbmc6MDtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7c29saWQtY29sb3I6IzAwMDtzb2xpZC1vcGFjaXR5OjE7bWFya2VyOm5vbmUiIGQ9Ik0yMi4zNTIgMTk0LjM1Mmg4Mi42ODd2ODIuNjg3SDIyLjM1MnoiIGNvbG9yPSIjMDAwIiBmb250LXdlaWdodD0iNDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9Im5vbmUiLz48ZyBjb2xvcj0iIzAwMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZjZmNWY0IiBzdHJva2Utd2lkdGg9IjgiPjxwYXRoIHN0eWxlPSJtYXJrZXI6bm9uZSIgZD0iTTg0IDI1NmwyNCAyNE04NCAyMTZsMjQtMjRNNDQgMjU2bC0yNCAyNE00NCAyMTZsLTI0LTI0TTQ0IDIxNmg0MHY0MEg0NHoiIG92ZXJmbG93PSJ2aXNpYmxlIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBvdmVyZmxvdz0idmlzaWJsZSIgZD0iTTIwIDE5Mmg4OHY4OEgyMHoiLz48L2c+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNOTguNSAxOTR2MmgtNjl2LTJ6Ii8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBkPSJNMTIwIDE5MmMwIDYuNjI3LTUuMzczIDEyLTEyIDEyLTEuODUgMC0zLjIyMi0uMDk1LTUuMTY1LTEuMTY2LTEuMDkyLTEuNzI2LTMuNTUtNC41ODQtNS42NjgtNS42NjZDOTYuMDk2IDE5NS4yMjQgOTYgMTkzLjg1IDk2IDE5MmMwLTYuNjI3IDUuMzczLTEyIDEyLTEyczEyIDUuMzczIDEyIDEyeiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNMTEwIDIwM2gydjY5aC0yeiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMTA4IiBjeT0iMjgwIiByPSIxMiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNzkgMjU4djJINDl2LTJ6TTk5LjYwNCAyNzQuNDI1bC0xLjQxNCAxLjQxNS0xNS0xNSAxLjQxNS0xLjQxNXpNMTAzLjA1OCAxOTkuNzkzbDEuNDE0IDEuNDE0LTE1IDE1LTEuNDE0LTEuNDE0eiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMTA4IiBjeT0iMTkwIiByPSIxMiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2IpIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNODYgMjIyaDJ2MjZoLTJ6TTc5IDIxOHYySDQ5di0yeiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iODQiIGN5PSIyMTYiIHI9IjgiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2Q1ZDNjZiIvPjxwYXRoIHN0eWxlPSJtYXJrZXI6bm9uZSIgZmlsbD0iI2Q1ZDNjZiIgZD0iTTk4LjUgMjgydjJoLTY5di0yeiIvPjxjaXJjbGUgcj0iMTIiIGN5PSIyNzgiIGN4PSIxMDgiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2MpIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBkPSJNOTIgMjU2YzAgLjY2NiAwIDEtLjIzNSAxLjkzMi0xLjE2NS41OS00Ljc2NSA0LjU0Mi01Ljc4NyA1LjgyMi0uNTAyLjI0Ni0xLjI5NS4yNDYtMS45NzguMjQ2YTggOCAwIDEgMSA4LTh6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNkNWQzY2YiLz48Y2lyY2xlIHN0eWxlPSJtYXJrZXI6bm9uZSIgY3g9Ijg0IiBjeT0iMjU0IiByPSI4IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZCkiLz48Y2lyY2xlIHI9IjgiIGN5PSIyMTQiIGN4PSI4NCIgc3R5bGU9Im1hcmtlcjpub25lIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZSkiLz48cGF0aCBzdHlsZT0ibWFya2VyOm5vbmUiIGZpbGw9IiNkNWQzY2YiIGQ9Ik0yMiAyMDNoMnY2OWgtMnoiLz48Y2lyY2xlIHI9IjEyIiBjeT0iMjgwIiBjeD0iMjAiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNDYgMjIyaDJ2MjZoLTJ6Ii8+PGNpcmNsZSByPSI4IiBjeT0iMjE2IiBjeD0iNDQiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNDMuNTg2IDI1OS41ODZMNDUgMjYxbC0xNSAxNS0xLjQxNC0xLjQxNHoiLz48cGF0aCBkPSJNNy45MTIgMTkyYzAgNi42MjcgNS4zNzIgMTIgMTIgMTIgMS44NDkgMCAzLjIyMi0uMDk1IDUuMTY1LTEuMTY2IDEuMDkyLTEuNzI2IDMuNTUtNC41ODQgNS42NjgtNS42NjYgMS4wNzEtMS45NDQgMS4xNjctMy4zMTggMS4xNjctNS4xNjggMC02LjYyNy01LjM3My0xMi0xMi0xMi02LjYyOCAwLTEyIDUuMzczLTEyIDEyeiIgc3R5bGU9Im1hcmtlcjpub25lIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNkNWQzY2YiLz48cGF0aCBzdHlsZT0ibWFya2VyOm5vbmUiIGZpbGw9IiNkNWQzY2YiIGQ9Ik00MC4wNzcgMjE0Ljk1M2wtMS40MTQgMS40MTUtMTUtMTUgMS40MTUtMS40MTR6Ii8+PGNpcmNsZSByPSIxMiIgY3k9IjE5MCIgY3g9IjIwIiBzdHlsZT0ibWFya2VyOm5vbmUiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0idXJsKCNmKSIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMjAiIGN5PSIyNzgiIHI9IjEyIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZykiLz48Y2lyY2xlIHN0eWxlPSJtYXJrZXI6bm9uZSIgY3g9IjQ0IiBjeT0iMjE0IiByPSI4IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjaCkiLz48cGF0aCBkPSJNMzYgMjU2YzAgLjY2NiAwIDEgLjIzNSAxLjkzMiAxLjE2NS41OSA0Ljc2NSA0LjU0MiA1Ljc4NyA1LjgyMi41MDIuMjQ2IDEuMjk1LjI0NiAxLjk3OC4yNDZhOCA4IDAgMSAwLTgtOHoiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PGNpcmNsZSByPSI4IiBjeT0iMjU0IiBjeD0iNDQiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2kpIi8+PC9nPjwvc3ZnPg==\"\nLABEL oc.keyword=\"boxes,boxes,vm\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Boxes.desktop\"\nLABEL oc.launch=\"gnome-boxes.Gnome-boxes\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"boxes\"\nLABEL oc.displayname=\"Gnome-boxes\"\nLABEL oc.path=\"/usr/bin/gnome-boxes\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application-x-cd-image;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"boxes\"\nENV APPBIN \"/usr/bin/gnome-boxes\"\nENV APP \"/usr/bin/gnome-boxes\"\nLABEL oc.securitycontext={\"allowPrivilegeEscalation\":true,\"capabilities\":{\"add\":[\"NET_ADMIN\",\"CAP_SYS_ADMIN\"]}}\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/boxes/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/boxes/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application boxes

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/boxes.d\n
"},{"location":"applications/boxes/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f boxes.d -t boxes .\n
"},{"location":"applications/boxes/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect boxes > boxes.json\ndocker image save boxes -o boxes.tar\nctr -n k8s.io images import boxes.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @boxes.json\n\n
"},{"location":"applications/brackets/","title":"Brackets","text":""},{"location":"applications/brackets/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.18.04

"},{"location":"applications/brackets/#arguments","title":"Arguments","text":"

\"--no-sandbox --disable-gpu\"

"},{"location":"applications/brackets/#path","title":"Path","text":"
/opt/brackets/Brackets\n
"},{"location":"applications/brackets/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/brackets/#wm_class","title":"WM_CLASS","text":"
brackets.Brackets\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/brackets/#desktopfile","title":"Desktopfile","text":"
/opt/brackets/brackets.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/brackets/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb  && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/brackets/#json-dump","title":"JSON dump","text":"

json source file brackets.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_brackets.svg\",\n    \"keyword\": \"html,brackets\",\n    \"launch\": \"brackets.Brackets\",\n    \"name\": \"Brackets\",\n    \"path\": \"/opt/brackets/Brackets\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\"\n    },\n    \"desktopfile\": \"/opt/brackets/brackets.desktop\",\n    \"preruncommands\": [\n        \"RUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb  && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"args\": \"--no-sandbox  --disable-gpu\"\n}\n
"},{"location":"applications/brackets/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output brackets.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/brackets.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @brackets.d.3.0.json\n\n
"},{"location":"applications/brackets/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb  && apt-get clean && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"circle_brackets.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI0MDguNTciIHgyPSI0MDguNTciIHkxPSI1MzUuMiIgeTI9IjUxMi40IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjI4IDAgMCAxLjIyOCAtNDY5LjcxIC02MTEuMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzJlMzQzNiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1NTU3NTMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMzIuMDIiIHgyPSIzMi4wMiIgeTE9IjIuMDQzIiB5Mj0iNjIuMDQ1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMDY0ZDMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTRjNmZkIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNyIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2EpIi8+CiAgPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMjQiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMjQiIGZpbGw9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8L2c+CiA8cGF0aCBkPSJtMTggMTh2MjhoMTIuNzI3di02LjM2MzZoLTYuMzYzNnYtMTUuMjczaDYuMzYzNnYtNi4zNjM2aC02LjUwNXptMTUuMjczIDB2Ni4zNjM2aDYuMzYzNnYxNS4yNzNoLTYuMzYzNnY2LjM2MzZoMTIuNzI3di0yOGgtMTIuNzI3eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0xOCAxOHYyOGgxMi43Mjd2LTYuMzYzNmgtNi4zNjM2di0xNS4yNzNoNi4zNjM2di02LjM2MzZoLTYuNTA1em0xNS4yNzMgMHY2LjM2MzZoNi4zNjM2djE1LjI3M2gtNi4zNjM2djYuMzYzNmgxMi43Mjd2LTI4aC0xMi43Mjd6IiBmaWxsPSJ1cmwoI2QpIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"brackets,html,brackets\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"brackets.desktop\"\nLABEL oc.launch=\"brackets.Brackets\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nENV ARGS=\"--no-sandbox  --disable-gpu\"\nLABEL oc.name=\"Brackets\"\nLABEL oc.displayname=\"Brackets\"\nLABEL oc.path=\"/opt/brackets/Brackets\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Brackets\"\nENV APPBIN \"/opt/brackets/Brackets\"\nLABEL oc.args=\"--no-sandbox  --disable-gpu\"\nENV APP \"/opt/brackets/Brackets\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/brackets/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/brackets/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Brackets

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Brackets.d\n
"},{"location":"applications/brackets/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Brackets.d -t Brackets .\n
"},{"location":"applications/brackets/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Brackets > Brackets.json\ndocker image save Brackets -o Brackets.tar\nctr -n k8s.io images import Brackets.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Brackets.json\n\n
"},{"location":"applications/calc/","title":"calc","text":""},{"location":"applications/calc/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.libreoffice

"},{"location":"applications/calc/#distribution","title":"Distribution","text":"

alpine

"},{"location":"applications/calc/#alpine-packages","title":"Alpine packages","text":"
libreoffice-gnome\n
"},{"location":"applications/calc/#arguments","title":"Arguments","text":"

\"--calc\"

"},{"location":"applications/calc/#displayname","title":"Displayname","text":"

\"Calc\"

"},{"location":"applications/calc/#path","title":"Path","text":"

\"/usr/lib/libreoffice/program/soffice\"

"},{"location":"applications/calc/#uniquerunkey","title":"uniquerunkey","text":"

\"libreoffice\"

"},{"location":"applications/calc/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/calc/#mime-type","title":"Mime Type","text":"

\"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\"

"},{"location":"applications/calc/#file-extensions","title":"File extensions","text":"

\"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\"

"},{"location":"applications/calc/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"ods;ots;csv\"

"},{"location":"applications/calc/#acl","title":"ACL","text":"

{\"permit\":[\"all\"]}

"},{"location":"applications/calc/#wm_class","title":"WM_CLASS","text":"

libreoffice.libreoffice-calc

"},{"location":"applications/calc/#desktopfile","title":"Desktopfile","text":"

/usr/share/applications/libreoffice-calc.desktop

"},{"location":"applications/calc/#json-dump","title":"JSON dump","text":"
{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_calc.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-calc\",\n    \"name\": \"calc\",\n    \"displayname\": \"Calc\",\n    \"showinview\": \"dock\",\n    \"args\": \"--calc\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"uniquerunkey\": \"libreoffice\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\",\n    \"legacyfileextensions\": \"ods;ots;csv\",\n    \"fileextensions\": \"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-calc.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/calc/#dockerfile-generated","title":"Dockerfile generated","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_calc.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5LDAsMCwyLjE0MjksLTgyNi4zNiwtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzg4OWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MTk5OTg3NCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjMyLjAyIiB4Mj0iMzIuMDIiIHkxPSIyLjA0MyIgeTI9IjYyLjA0NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmU4NTFiIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE4YTAwMyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkMmZjZWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJmZWYyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZmNlOCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJpIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYSIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDIuOTg4NmUtOCAtMS45MjY1ZS04IC0xIDgwLjQ1MyA0MC4xOTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjQ4MSIgeDI9IjQ4MSIgeTE9Ii03NTkuNjQiIHkyPSItNzY0LjY0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMjgxNSAwIDAgMi45MzM0IC0xMDYyLjggMjI3Ni42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSIzMCIgeDI9IjMwIiB5MT0iMTgiIHkyPSI0NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMThhMzAzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzEwNjgwMiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA2MjEwNSIgeT0iLS4wNTc5NjYiIHdpZHRoPSIxLjEyNDIiIGhlaWdodD0iMS4xMTU5IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjM1NDIzNzU5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaiIgeD0iLS4wNTc4NTciIHk9Ii0uMDYyMzA4IiB3aWR0aD0iMS4xMTU3IiBoZWlnaHQ9IjEuMTI0NiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC42NzUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgY3g9IjQwMC41NyIgY3k9IjUzMS44IiByPSIxNCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8ZyBzdHJva2Utd2lkdGg9IjEuNTcxNSI+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNmKSIvPgogIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsdGVyPSJ1cmwoI2kpIiBvcGFjaXR5PSIuMjUiLz4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiLz4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiKSIvPgogIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsbD0idXJsKCNlKSIvPgogPC9nPgogPHJlY3QgeD0iMTYiIHk9IjE5IiB3aWR0aD0iMjgiIGhlaWdodD0iMjYiIHJ5PSIwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjI1IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjIwMTllLTYgMSkiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgPHJlY3QgeD0iMTYiIHk9IjE4IiB3aWR0aD0iMjgiIGhlaWdodD0iMjYiIHJ5PSIwIiBmaWxsPSIjY2NmNGM2IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPHJlY3QgeD0iMTYiIHk9IjE4IiB3aWR0aD0iMjgiIGhlaWdodD0iNiIgcnk9IjAiIGZpbGw9IiM5MmUyODUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz4KICA8cGF0aCBkPSJtMTYgMTh2MjZoMjh2LTI2em0xIDFoOHY0aC04em05IDBoOHY0aC04em05IDBoOHY0aC04em0tMTggNWg4djRoLTh6bTkgMGg4djRoLTh6bTkgMGg4djRoLTh6bS0xOCA1aDh2NGgtOHptOSAwaDh2NGgtOHptOSAwaDh2NGgtOHptLTE4IDVoOHY0aC04em05IDBoOHY0aC04em05IDBoOHY0aC04em0tMTggNWg4djRoLTh6bTkgMGg4djRoLTh6bTkgMGg4djRoLTh6IiBmaWxsPSJ1cmwoI2gpIiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAyMjcgMCAwIC45NTQ1NSAtLjQzMTgxIDEuODYzNykiIHN0cm9rZS13aWR0aD0iMS4wMTIxIj4KICA8cmVjdCB4PSIzNC42NDUiIHk9IjMzLjY2NiIgd2lkdGg9IjEzLjY4OSIgaGVpZ2h0PSIxNC42NjciIHJ5PSIxLjA0NzYiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPHJlY3QgeD0iMzQuNjQ1IiB5PSIzMy42NjYiIHdpZHRoPSIxMy42ODkiIGhlaWdodD0iMTQuNjY3IiByeT0iMS4wNDc2IiBmaWxsPSJ1cmwoI2cpIi8+CiAgPGc+CiAgIDxyZWN0IHg9IjM1LjYyMiIgeT0iNDIuMDQ3IiB3aWR0aD0iMi45MzQ2IiBoZWlnaHQ9IjYuMjg2OCIgZmlsbD0iIzIyOGZmZiIvPgogICA8cmVjdCB4PSIzOS41MzMiIHk9IjM2LjgwOSIgd2lkdGg9IjMuOTEyNiIgaGVpZ2h0PSIxMS41MjQiIGZpbGw9IiNmZjgwMzciLz4KICAgPHJlY3QgeD0iNDQuNDIyIiB5PSI0NC4xNDMiIHdpZHRoPSIyLjkzNDgiIGhlaWdodD0iNC4xOTE0IiBmaWxsPSIjZmZjYTIyIi8+CiAgPC9nPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"calc,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-calc.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-calc\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--calc\"\nLABEL oc.name=\"calc\"\nLABEL oc.displayname=\"Calc\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\"\nLABEL oc.fileextensions=\"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\"\nLABEL oc.legacyfileextensions=\"ods;ots;csv\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"calc\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--calc\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/calculator/","title":"calculator","text":""},{"location":"applications/calculator/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/calculator/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/calculator/#alpine-packages","title":"Alpine packages","text":"
gnome-calculator\n
"},{"location":"applications/calculator/#path","title":"Path","text":"
/usr/bin/gnome-calculator\n
"},{"location":"applications/calculator/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/calculator/#wm_class","title":"WM_CLASS","text":"
gnome-calculator.gnome-calculator\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/calculator/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Calculator.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/calculator/#json-dump","title":"JSON dump","text":"

json source file calculator.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"apkpackage\": \"gnome-calculator\",\n    \"icon\": \"gnome_calculator.svg\",\n    \"keyword\": \"calculator\",\n    \"launch\": \"gnome-calculator.gnome-calculator\",\n    \"name\": \"calculator\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-calculator\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Calculator.desktop\"\n}\n
"},{"location":"applications/calculator/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output calculator.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/calculator.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @calculator.d.3.0.json\n\n
"},{"location":"applications/calculator/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-calculator\nLABEL oc.icon=\"gnome_calculator.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBoZWlnaHQ9IjEyOHB4IiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgd2lkdGg9IjEyOHB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjE5MjM1MSAwIDAgMC4yNSAyMi4wMDUyMTMgNTcuMDAwMDMxKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMC4yNzYxNTYiIHgyPSI0MjYuMjc2MjE1IiB5MT0iMjU5Ljk5OTg3OCIgeTI9IjI1OS45OTk4NzgiPgogICAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzlhOTk5NiIvPgogICAgICAgIDxzdG9wIG9mZnNldD0iMC4wNTAyMTU2IiBzdG9wLWNvbG9yPSIjYzBiZmJjIi8+CiAgICAgICAgPHN0b3Agb2Zmc2V0PSIwLjEwMDIwNCIgc3RvcC1jb2xvcj0iIzlhOTk5NiIvPgogICAgICAgIDxzdG9wIG9mZnNldD0iMC45MDAwMjMiIHN0b3AtY29sb3I9IiM5YTk5OTYiLz4KICAgICAgICA8c3RvcCBvZmZzZXQ9IjAuOTUwMDExIiBzdG9wLWNvbG9yPSIjYzBiZmJjIi8+CiAgICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjOWE5OTk2Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHBhdGggZD0ibSAzMiAzNiBoIDY0IGMgNC40MTc5NjkgMCA4IDMuNTgyMDMxIDggOCB2IDY4IGMgMCA0LjQxNzk2OSAtMy41ODIwMzEgOCAtOCA4IGggLTY0IGMgLTQuNDE3OTY5IDAgLTggLTMuNTgyMDMxIC04IC04IHYgLTY4IGMgMCAtNC40MTc5NjkgMy41ODIwMzEgLTggOCAtOCB6IG0gMCAwIiBmaWxsPSJ1cmwoI2EpIi8+CiAgICA8cGF0aCBkPSJtIDMyIDggaCA2NCBjIDQuNDE3OTY5IDAgOCAzLjU4MjAzMSA4IDggdiA5MCBjIDAgNC40MTc5NjkgLTMuNTgyMDMxIDggLTggOCBoIC02NCBjIC00LjQxNzk2OSAwIC04IC0zLjU4MjAzMSAtOCAtOCB2IC05MCBjIDAgLTQuNDE3OTY5IDMuNTgyMDMxIC04IDggLTggeiBtIDAgMCIgZmlsbD0iI2RlZGRkYSIvPgogICAgPHBhdGggZD0ibSAzOCAxOCBoIDUyLjAzOTA2MiBjIDIuMjEwOTM4IDAgNCAxLjc4OTA2MiA0IDQgdiA2IGMgMCAyLjIxMDkzOCAtMS43ODkwNjIgNCAtNCA0IGggLTUyLjAzOTA2MiBjIC0yLjIxMDkzOCAwIC00IC0xLjc4OTA2MiAtNCAtNCB2IC02IGMgMCAtMi4yMTA5MzggMS43ODkwNjIgLTQgNCAtNCB6IG0gMCAwIiBmaWxsPSIjNzc3NjdiIi8+CiAgICA8cGF0aCBkPSJtIDM4IDM2IGggNTIuMDM5MDYyIGMgMi4yMTA5MzggMCA0IC0xLjc4OTA2MiA0IC00IHYgLTggYyAwIC0yLjIxMDkzOCAtMS43ODkwNjIgLTQgLTQgLTQgaCAtNTIuMDM5MDYyIGMgLTIuMjEwOTM4IDAgLTQgMS43ODkwNjIgLTQgNCB2IDggYyAwIDIuMjEwOTM4IDEuNzg5MDYyIDQgNCA0IHogbSAwIDAiIGZpbGw9IiM2ZmIxODIiLz4KICAgIDxwYXRoIGQ9Im0gMzQgNTEgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDQxIDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gNTcuMDExNzE5IDUxIHYgMiBjIDAgMy44Nzg5MDYgMy4xMjEwOTMgNyA3IDcgYyAzLjg3NSAwIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gODAgNTEgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDg3IDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gMzQgNzMgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDU3LjAxMTcxOSA3MyB2IDIgYyAwIDMuODc4OTA2IDMuMTIxMDkzIDcgNyA3IGMgMy44NzUgMCA3IC0zLjEyMTA5NCA3IC03IHYgLTIgeiBtIDAgMCIgZmlsbD0iIzNkMzg0NiIvPgogICAgPHBhdGggZD0ibSA0MSA2NiBjIDMuODY3MTg4IDAgNyAzLjEzMjgxMiA3IDcgcyAtMy4xMzI4MTIgNyAtNyA3IHMgLTcgLTMuMTMyODEyIC03IC03IHMgMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDY2IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gMzQgOTUgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDQxIDg4IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gNTcuMDExNzE5IDk1IHYgMiBjIDAgMy44Nzg5MDYgMy4xMjEwOTMgNyA3IDcgYyAzLjg3NSAwIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDg4IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gODcgODYgYyAzLjg2NzE4OCAwIDcgMy4xMzI4MTIgNyA3IHYgNCBjIDAgMy44NjcxODggLTMuMTMyODEyIDcgLTcgNyBzIC03IC0zLjEzMjgxMiAtNyAtNyB2IC00IGMgMCAtMy44NjcxODggMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjYzY0NjAwIi8+CiAgICA8cGF0aCBkPSJtIDg3IDY2IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyB2IDIyIGMgMCAzLjg2NzE4OCAtMy4xMzI4MTIgNyAtNyA3IHMgLTcgLTMuMTMyODEyIC03IC03IHYgLTIyIGMgMCAtMy44NjcxODggMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjZmY3ODAwIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"calculator,calculator\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Calculator.desktop\"\nLABEL oc.launch=\"gnome-calculator.gnome-calculator\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"calculator\"\nLABEL oc.displayname=\"calculator\"\nLABEL oc.path=\"/usr/bin/gnome-calculator\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"calculator\"\nENV APPBIN \"/usr/bin/gnome-calculator\"\nENV APP \"/usr/bin/gnome-calculator\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/calculator/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/calculator/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application calculator

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/calculator.d\n
"},{"location":"applications/calculator/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f calculator.d -t calculator .\n
"},{"location":"applications/calculator/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect calculator > calculator.json\ndocker image save calculator -o calculator.tar\nctr -n k8s.io images import calculator.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @calculator.json\n\n
"},{"location":"applications/chess/","title":"chess","text":""},{"location":"applications/chess/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/chess/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/chess/#alpine-packages","title":"Alpine packages","text":"
gnuchess gnome-chess\n
"},{"location":"applications/chess/#path","title":"Path","text":"
/usr/bin/gnome-chess\n
"},{"location":"applications/chess/#mimetype","title":"Mimetype","text":"
application/x-chess-pgn\n
"},{"location":"applications/chess/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/chess/#wm_class","title":"WM_CLASS","text":"
gnome-chess.gnome-chess\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/chess/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Chess.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/chess/#json-dump","title":"JSON dump","text":"

json source file chess.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"gnuchess gnome-chess\",\n    \"icon\": \"circle_chess.svg\",\n    \"keyword\": \"chess gnuchess\",\n    \"launch\": \"gnome-chess.gnome-chess\",\n    \"name\": \"chess\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-chess\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-chess-pgn\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Chess.desktop\"\n}\n
"},{"location":"applications/chess/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output chess.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chess.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chess.d.3.0.json\n\n
"},{"location":"applications/chess/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnuchess gnome-chess\nLABEL oc.icon=\"circle_chess.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnNDciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMjUiPgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMiIgc3RkRGV2aWF0aW9uPSIxNC4zNDM3NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMiIgeDI9IjMyIiB5MT0iMiIgeTI9IjYyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wNSIgc3RvcC1jb2xvcj0iIzFkMjEyMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wNyIgc3RvcC1jb2xvcj0iIzNlNDU0YSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MTQiIHg9Ii0uMDY2IiB5PSItLjA1NSIgd2lkdGg9IjEuMTMyIiBoZWlnaHQ9IjEuMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI5MTYiIHN0ZERldmlhdGlvbj0iMC42NDE2NjY2OCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlMjciIHRyYW5zZm9ybT0ibWF0cml4KC4wNjI3NDUgMCAwIC4wNjI3NDUgLS4xMjU0OSAtLjEyNTQ5KSIgY3g9IjUxMiIgY3k9IjUxMiIgcj0iNDc4LjEyIiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS45MzgiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiA8Y2lyY2xlIGlkPSJjaXJjbGUyOSIgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPHBhdGggaWQ9InBhdGg4NjQiIGQ9Im0yNC40OSAxOGMtMC4zNjUxNyAwLTAuNjYwMzMgMC4yODctMC42NjAzMyAwLjY1NTY3djUuNjg3NWMwIDAuMzY1MTcgMC4yOTE2NyAwLjY1NjgzIDAuNjYwMzMgMC42NTY4M2gwLjUwNjMzbC0xLjE2NjcgMS4xNjY3IDEuMTY2NyAxLjE2NjctMS4xNjMyIDEyLjgzM2MtMS4yOTM4IDAtMi4zMzIyIDEuMDM5NS0yLjMzMjIgMi4zMjg3IDAgMC40MjM1IDAuMTI3MTcgMC44MjAxNyAwLjMyMzE3IDEuMTY2N2wtMC4zMjQzMyAwLjAwNDYtMS4xNjY3IDIuMzMzNGgyMy4zMzNsLTEuMTY2Ny0yLjMzMzMtMC4zMjY2Ny0wLjAwNDZjMC4yMDA2Ny0wLjM0NjUgMC4zMjc4My0wLjc0MzE3IDAuMzI3ODMtMS4xNjY3IDAtMS4yOTM4LTEuMDQ1My0yLjMyODctMi4zMzQ1LTIuMzI4N2wtMS4xNjU1LTEyLjgzMyAxLjE2NjctMS4xNjY3LTEuMTY2Ny0xLjE2NjdoMC41MTFjMC4zNjg2NyAwIDAuNjYwMzMtMC4yODcgMC42NjAzMy0wLjY1Njgzdi01LjY4NzVjMC0wLjM2NTE3LTAuMjg3LTAuNjU1NjctMC42NjAzMy0wLjY1NTY3aC0xLjY3ODh2Mi4zMzMzaC0yLjMzMzN2LTIuMzMzM2gtMi4zMzMzdjIuMzMzM2gtMi4zMzMzdi0yLjMzMzRoLTIuMzMzM3YyLjMzMzNoLTIuMzMzM3YtMi4zMzMzIiBmaWx0ZXI9InVybCgjZmlsdGVyOTE0KSIgb3BhY2l0eT0iLjUiIHN0cm9rZS13aWR0aD0iMS4xNjY3Ii8+CiA8cGF0aCBpZD0icGF0aDI5IiBkPSJtMjQuNDkgMThjLTAuMzY1MTcgMC0wLjY2MDMzIDAuMjg3LTAuNjYwMzMgMC42NTU2N3Y1LjY4NzVjMCAwLjM2NTE3IDAuMjkxNjcgMC42NTY4MyAwLjY2MDMzIDAuNjU2ODNoMC41MDYzM2wtMS4xNjY3IDEuMTY2NyAxLjE2NjcgMS4xNjY3LTEuMTYzMiAxMi44MzNjLTEuMjkzOCAwLTIuMzMyMiAxLjAzOTUtMi4zMzIyIDIuMzI4NyAwIDAuNDIzNSAwLjEyNzE3IDAuODIwMTcgMC4zMjMxNyAxLjE2NjdsLTAuMzI0MzMgMC4wMDQ2LTEuMTY2NyAyLjMzMzRoMjMuMzMzbC0xLjE2NjctMi4zMzMzLTAuMzI2NjctMC4wMDQ2YzAuMjAwNjctMC4zNDY1IDAuMzI3ODMtMC43NDMxNyAwLjMyNzgzLTEuMTY2NyAwLTEuMjkzOC0xLjA0NTMtMi4zMjg3LTIuMzM0NS0yLjMyODdsLTEuMTY1NS0xMi44MzMgMS4xNjY3LTEuMTY2Ny0xLjE2NjctMS4xNjY3aDAuNTExYzAuMzY4NjcgMCAwLjY2MDMzLTAuMjg3IDAuNjYwMzMtMC42NTY4M3YtNS42ODc1YzAtMC4zNjUxNy0wLjI4Ny0wLjY1NTY3LTAuNjYwMzMtMC42NTU2N2gtMS42Nzg4djIuMzMzM2gtMi4zMzMzdi0yLjMzMzNoLTIuMzMzM3YyLjMzMzNoLTIuMzMzM3YtMi4zMzM0aC0yLjMzMzN2Mi4zMzMzaC0yLjMzMzN2LTIuMzMzMyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxLjE2NjciLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"chess,chess gnuchess\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Chess.desktop\"\nLABEL oc.launch=\"gnome-chess.gnome-chess\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"chess\"\nLABEL oc.displayname=\"chess\"\nLABEL oc.path=\"/usr/bin/gnome-chess\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-chess-pgn\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chess\"\nENV APPBIN \"/usr/bin/gnome-chess\"\nENV APP \"/usr/bin/gnome-chess\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/chess/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chess/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application chess

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chess.d\n
"},{"location":"applications/chess/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f chess.d -t chess .\n
"},{"location":"applications/chess/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect chess > chess.json\ndocker image save chess -o chess.tar\nctr -n k8s.io images import chess.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chess.json\n\n
"},{"location":"applications/chrome/","title":"chrome","text":""},{"location":"applications/chrome/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/chrome/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/chrome/#ubuntu-packages","title":"Ubuntu packages","text":"
krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable\n
"},{"location":"applications/chrome/#displayname","title":"Displayname","text":"
Chrome\n
"},{"location":"applications/chrome/#path","title":"Path","text":"
/usr/bin/google-chrome-stable\n
"},{"location":"applications/chrome/#mimetype","title":"Mimetype","text":"
text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\n
"},{"location":"applications/chrome/#file-extensions","title":"File extensions","text":"

\"html;xml;gif\"

"},{"location":"applications/chrome/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"html;xml\"

"},{"location":"applications/chrome/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/chrome/#wm_class","title":"WM_CLASS","text":"
google-chrome.Google-chrome\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/chrome/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/google-chrome.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/chrome/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\" | tee /etc/apt/sources.list.d/google-chrome.list\n
"},{"location":"applications/chrome/#json-dump","title":"JSON dump","text":"

json source file chrome.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable\",\n    \"preruncommands\": [\n        \"RUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\\\" | tee /etc/apt/sources.list.d/google-chrome.list\"\n    ],\n    \"icon\": \"circle_google-chrome.svg\",\n    \"keyword\": \"web,browser,internet\",\n    \"launch\": \"google-chrome.Google-chrome\",\n    \"name\": \"chrome\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"displayname\": \"Chrome\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/google-chrome-stable\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/google-chrome.desktop\",\n    \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/chrome/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output chrome.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chrome.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chrome.d.3.0.json\n\n
"},{"location":"applications/chrome/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\" | tee /etc/apt/sources.list.d/google-chrome.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_google-chrome.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSIxNy4xODciIHgyPSIxNy4xODciIHkxPSI0Ni43MzciIHkyPSIxOTkuOTgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC43MDUgMCAwIDQuNzA1IDQxIDcwLjM2MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM1QzEzMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNEJEMzAiIG9mZnNldD0iLjM0ODMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMxQjIzMSIgb2Zmc2V0PSIuNjgwOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMkM5RjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9Ijk1Ljk3IiB4Mj0iOTUuOTciIHkxPSIyLjI5MjIiIHkyPSIxOTguNDQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS43MTkxIDAgMCAxLjcxOTEgMzQwLjA5IDM2OC40NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQ3QjlGRiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzRDhBRkYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMTE0Ljc1IiB4Mj0iMTE0Ljc1IiB5MT0iNTYuNjgxIiB5Mj0iMTg4LjkzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuMSAwIDAgNS4xIDIgMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmY2UwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlNmJjMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMTAzLjY3IiB4Mj0iMTAzLjY3IiB5MT0iLTQuNjYyMyIgeTI9IjIwNi41IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTY5OSAwIDAgMi4xNjk5IDI5NS4wMSAzMjMuMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI2LjUwOTc3ODkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI5Ny40MjUiIHgyPSI5Ny40MjUiIHkxPSItOS4wMDcxIiB5Mj0iMjA5Ljg3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQuNzA1IDAgMCA0LjcwNSA0MSA0MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI0Y2NTAzQiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNGMjQ3MzUiIG9mZnNldD0iLjIxNzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI0U2MkYyNSIgb2Zmc2V0PSIuNTcxOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjRDQwOTBEIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xMTUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCA5ODUuODgpIiBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1Ii8+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtODEzLjQxIDE1MS43NGMtOTYuNzI2IDIzLjAzMi01NTQuMTcgMTM2LjQ1LTMwMC4xNCAxNjMuOTEgMjgzLjA1IDMwLjYgMTc1LjMxIDMxNy40NyAxNzUuMzEgMzE3LjQ3bC0yMDcuMjYgMzQ4LjM3YTQ3MC41IDQ3MC41IDAgMCAwIDMwLjE2OCAxLjUwOTggNDcwLjUgNDcwLjUgMCAwIDAgNDcwLjUtNDcwLjUgNDcwLjUgNDcwLjUgMCAwIDAtMTY4LjU5LTM2MC43NnoiIGZpbGw9InVybCgjYykiLz4KICAgPGc+CiAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDI4LjM2MikiIGQ9Im01MTEuNSA0MmE0NzAuNSA0NzAuNSAwIDAgMC0zOTQuNDUgMjE0LjgybDIxMC4zNSAzNTMuODRzLTUuNjMzOC0xNzAuNDUgOC40NTMxLTE4Ny4zNmMxNC4wODctMTYuOTA0IDgzLjExMy04MS43MDMgODMuMTEzLTgxLjcwM2w5NC4zODEtMjguMTc0LTUuMTA1NS0xOC4zMTIgNDE4LjcxLTIuNzUzOWE0NzAuNSA0NzAuNSAwIDAgMC00MTUuNDYtMjUwLjM2eiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYSkiLz4KICAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU1MC4zNiIgcj0iMjE2Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0iIzExMSIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMiIvPgogICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSIyMTYuOTkiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1NDAuMzYiIHI9IjE3MS45MSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZCkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"chrome,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"google-chrome.desktop\"\nLABEL oc.launch=\"google-chrome.Google-chrome\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"chrome\"\nLABEL oc.displayname=\"Chrome\"\nLABEL oc.path=\"/usr/bin/google-chrome-stable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chrome\"\nENV APPBIN \"/usr/bin/google-chrome-stable\"\nENV APP \"/usr/bin/google-chrome-stable\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/chrome/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chrome/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application chrome

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chrome.d\n
"},{"location":"applications/chrome/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f chrome.d -t chrome .\n
"},{"location":"applications/chrome/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect chrome > chrome.json\ndocker image save chrome -o chrome.tar\nctr -n k8s.io images import chrome.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chrome.json\n\n
"},{"location":"applications/chromium/","title":"chromium","text":""},{"location":"applications/chromium/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/chromium/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/chromium/#alpine-packages","title":"Alpine packages","text":"
chromium\n
"},{"location":"applications/chromium/#displayname","title":"Displayname","text":"
chromium (alpine)\n
"},{"location":"applications/chromium/#path","title":"Path","text":"
/usr/bin/chromium-browser\n
"},{"location":"applications/chromium/#mimetype","title":"Mimetype","text":"
text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\n
"},{"location":"applications/chromium/#file-extensions","title":"File extensions","text":"

\"html;xml;gif\"

"},{"location":"applications/chromium/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"html;xml\"

"},{"location":"applications/chromium/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/chromium/#wm_class","title":"WM_CLASS","text":"
chromium.Chromium\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/chromium/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/chromium-browser.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/chromium/#json-dump","title":"JSON dump","text":"

json source file chromium.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"chromium\",\n    \"icon\": \"circle_chromium.svg\",\n    \"keyword\": \"web,browser,internet\",\n    \"launch\": \"chromium.Chromium\",\n    \"name\": \"chromium\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"displayname\": \"chromium (alpine)\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/chromium-browser\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/chromium-browser.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/chromium/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output chromium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chromium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chromium.d.3.0.json\n\n
"},{"location":"applications/chromium/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update chromium\nLABEL oc.icon=\"circle_chromium.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI5NS45NyIgeDI9Ijk1Ljk3IiB5MT0iMi4yOTIyIiB5Mj0iMTk4LjQ0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNzE5MSAwIDAgMS43MTkxIDM0MC4wOSAzNjguNDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4ZGI2ZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNTlmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjExNC43NSIgeDI9IjExNC43NSIgeTE9IjU2LjY4MSIgeTI9IjE4OC45MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1LjEgMCAwIDUuMSAyIDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM3NmE3ZjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTJjMmY4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjEwMy42NyIgeDI9IjEwMy42NyIgeTE9Ii00LjY2MjMiIHkyPSIyMDYuNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjE2OTkgMCAwIDIuMTY5OSAyOTUuMDEgMzIzLjM3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi41MDk3Nzg5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZiIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjExNSIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQxIiB4Mj0iOTgyIiB5MT0iNTQwLjg2IiB5Mj0iNTQwLjg2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2NDlhZjUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGI4YWY1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjExNy4wNSIgeDI9IjkyNi45NSIgeTE9IjMyNi4zMyIgeTI9IjMyNi4zMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjM2I2YmQ0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2OGJkZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCA5ODUuODgpIiBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1Ii8+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtODEzLjQxIDE1MS43NGMtOTYuNzI2IDIzLjAzMi01NTQuMTcgMTM2LjQ1LTMwMC4xNCAxNjMuOTEgMjgzLjA1IDMwLjYgMTc1LjMxIDMxNy40NyAxNzUuMzEgMzE3LjQ3bC0yMDcuMjYgMzQ4LjM3YTQ3MC41IDQ3MC41IDAgMCAwIDMwLjE2OCAxLjUwOTggNDcwLjUgNDcwLjUgMCAwIDAgNDcwLjUtNDcwLjUgNDcwLjUgNDcwLjUgMCAwIDAtMTY4LjU5LTM2MC43NnoiIGZpbGw9InVybCgjYykiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtNTExLjUgNDJhNDcwLjUgNDcwLjUgMCAwIDAtMzk0LjQ1IDIxNC44MmwyMTAuMzUgMzUzLjg0cy01LjYzMzgtMTcwLjQ1IDguNDUzMS0xODcuMzZjMTQuMDg3LTE2LjkwNCA4My4xMTMtODEuNzAzIDgzLjExMy04MS43MDNsOTQuMzgxLTI4LjE3NC01LjEwNTUtMTguMzEyIDQxOC43MS0yLjc1MzlhNDcwLjUgNDcwLjUgMCAwIDAtNDE1LjQ2LTI1MC4zNnoiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU1MC4zNiIgcj0iMjE2Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0iIzExMSIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMiIvPgogICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1NDAuMzYiIHI9IjIxNi45OSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYikiLz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSIxNzEuOTEiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2QpIi8+CiAgPC9nPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"chromium,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"chromium-browser.desktop\"\nLABEL oc.launch=\"chromium.Chromium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"chromium\"\nLABEL oc.displayname=\"chromium (alpine)\"\nLABEL oc.path=\"/usr/bin/chromium-browser\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chromium\"\nENV APPBIN \"/usr/bin/chromium-browser\"\nENV APP \"/usr/bin/chromium-browser\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/chromium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chromium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application chromium

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chromium.d\n
"},{"location":"applications/chromium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f chromium.d -t chromium .\n
"},{"location":"applications/chromium/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect chromium > chromium.json\ndocker image save chromium -o chromium.tar\nctr -n k8s.io images import chromium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chromium.json\n\n
"},{"location":"applications/citrix/","title":"citrix","text":""},{"location":"applications/citrix/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.18.04

"},{"location":"applications/citrix/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/citrix/#ubuntu-packages","title":"Ubuntu packages","text":"
libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8\n
"},{"location":"applications/citrix/#licence","title":"Licence","text":"

** This application is NO FREE. ** You need to build it manually.

"},{"location":"applications/citrix/#arguments","title":"Arguments","text":"

\"-icaroot /opt/Citrix/ICAClient\"

"},{"location":"applications/citrix/#displayname","title":"Displayname","text":"
citrix-client\n
"},{"location":"applications/citrix/#path","title":"Path","text":"
/opt/Citrix/ICAClient/wfica\n
"},{"location":"applications/citrix/#mimetype","title":"Mimetype","text":"
application/x-ica;\n
"},{"location":"applications/citrix/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/citrix/#wm_class","title":"WM_CLASS","text":"
Wfica.Wfica\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/citrix/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/wfica.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/citrix/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

COPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\nRUN apt-get update && apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/citrix/#json-dump","title":"JSON dump","text":"

json source file citrix.d.3.0.json

{\n    \"comment\": \"download icaclientWeb from https://www.citrix.com/fr-fr/downloads/citrix-receiver/linux/receiver-for-linux-latest.html\",\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"postruncommands\": [\n        \"COPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\",\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"debpackage\": \"libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8\",\n    \"icon\": \"icaclient.svg\",\n    \"keyword\": \"ica,icaclient,\",\n    \"launch\": \"Wfica.Wfica\",\n    \"name\": \"citrix\",\n    \"displayname\": \"citrix-client\",\n    \"secrets_requirement\": \"citrix\",\n    \"args\": \"-icaroot /opt/Citrix/ICAClient\",\n    \"path\": \"/opt/Citrix/ICAClient/wfica\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n    \"mimetype\": \"application/x-ica;\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/wfica.desktop\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\",\n        \"shm_size\": \"512M\",\n        \"pid_mode\": true,\n        \"ipc_mode\": \"shareable\"\n    },\n    \"usedefaultapplication\": true,\n    \"licence\": \"non-free\"\n}\n
"},{"location":"applications/citrix/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output citrix.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/citrix.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @citrix.d.3.0.json\n\n
"},{"location":"applications/citrix/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"icaclient.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTouMiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiB4PSItNTkiIHk9Ii02MCIgcng9IjI4IiByeT0iMjgiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCBzdHlsZT0iZmlsbDojNGY0ZjRmIiB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHg9Ii01OCIgeT0iLTYwIiByeD0iMjgiIHJ5PSIyOCIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMSwtMSwwLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5Oi4yIiBkPSJtMzIgMTFhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMTE3MmMtMTAuOTMzMjI0IDAuMTA0NTM5LTE5LjgwODYgOS4wMzA5Ny0xOS44MDg2IDE5Ljk4ODI4IDAgMTEuMDIyMDA2IDguOTc3OTk0IDIwIDIwIDIwIDEwLjk1NDY3OCAwIDE5Ljg3OTUyNC04Ljg3MTE4IDE5Ljk4ODI4Mi0xOS44MDA3ODJhMiAyIDAgMCAwIDAuMDExNzE4IC0wLjE5OTIxOCAyIDIgMCAwIDAgLTIgLTIgMiAyIDAgMCAwIC0yIDJjMCA4Ljg2MDI0Ni03LjEzOTc1NCAxNi0xNiAxNnMtMTYtNy4xMzk3NTQtMTYtMTYgNy4xMzk3NTQtMTYgMTYtMTZhMiAyIDAgMCAwIDIgLTIgMiAyIDAgMCAwIC0yIC0yem0wIDhhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMDc4Yy02LjUxNTM3NCAwLjEwNDEyNi0xMS44MDg2IDUuNDUzMDUyLTExLjgwODYgMTEuOTkyMiAwIDYuNjAzNzI4IDUuMzk2MjcyIDEyIDEyIDEyIDYuNTM2NDUyIDAgMTEuODc5ODgtNS4yODkxMTIgMTEuOTg4MjgyLTExLjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDQuNDQxOTY4LTMuNTU4MDMyIDgtOCA4cy04LTMuNTU4MDMyLTgtOCAzLjU1ODAzMi04IDgtOGEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGE0IDQgMCAwIDAgLTQgNCA0IDQgMCAwIDAgNCA0IDQgNCAwIDAgMCA0IC00IDQgNCAwIDAgMCAtNCAtNHoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOiNmZmZmZmYiIGQ9Im0zMiAxMGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAxMTcyYy0xMC45MzMyMjQgMC4xMDQ1MzktMTkuODA4NiA5LjAzMDk3LTE5LjgwODYgMTkuOTg4MjggMCAxMS4wMjIwMDYgOC45Nzc5OTQgMjAgMjAgMjAgMTAuOTU0Njc4IDAgMTkuODc5NTI0LTguODcxMTggMTkuOTg4MjgyLTE5LjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDguODYwMjQ2LTcuMTM5NzU0IDE2LTE2IDE2cy0xNi03LjEzOTc1NC0xNi0xNiA3LjEzOTc1NC0xNiAxNi0xNmEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAwNzhjLTYuNTE1Mzc0IDAuMTA0MTI2LTExLjgwODYgNS40NTMwNTItMTEuODA4NiAxMS45OTIyIDAgNi42MDM3MjggNS4zOTYyNzIgMTIgMTIgMTIgNi41MzY0NTIgMCAxMS44Nzk4OC01LjI4OTExMiAxMS45ODgyODItMTEuODAwNzgyYTIgMiAwIDAgMCAwLjAxMTcxOCAtMC4xOTkyMTggMiAyIDAgMCAwIC0yIC0yIDIgMiAwIDAgMCAtMiAyYzAgNC40NDE5NjgtMy41NTgwMzIgOC04IDhzLTgtMy41NTgwMzItOC04IDMuNTU4MDMyLTggOC04YTIgMiAwIDAgMCAyIC0yIDIgMiAwIDAgMCAtMiAtMnptMCA4YTQgNCAwIDAgMCAtNCA0IDQgNCAwIDAgMCA0IDQgNCA0IDAgMCAwIDQgLTQgNCA0IDAgMCAwIC00IC00eiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6LjE7ZmlsbDojZmZmZmZmIiBkPSJtMzIgMmMtMTUuNTEyIDAtMjggMTIuNDg4LTI4IDI4IDAgMC4xMTM0NSAwLjAxMTI4MDUgMC4yMjQxMTMgMC4wMTc1NzgxIDAuMzM1OTM4IDAuMzUxNTQzMi0xNS4yMDE3NTcgMTIuNjkzMTQ5OS0yNy4zMzU5MzggMjcuOTgyNDIxOS0yNy4zMzU5MzhzMjcuNjMwODc5IDEyLjEzNDE4MSAyNy45ODI0MjIgMjcuMzM1OTM4YzAuMDA2Mjk4LTAuMTExODI1IDAuMDE3NTc4LTAuMjIyNDg4IDAuMDE3NTc4LTAuMzM1OTM4IDAtMTUuNTEyLTEyLjQ4OC0yOC0yOC0yOHoiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"citrix,ica,icaclient,\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"wfica.desktop\"\nLABEL oc.launch=\"Wfica.Wfica\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nENV ARGS=\"-icaroot /opt/Citrix/ICAClient\"\nLABEL oc.name=\"citrix\"\nLABEL oc.displayname=\"citrix-client\"\nLABEL oc.path=\"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"application/x-ica;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"512M\\\",\\\"pid_mode\\\":true,\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nLABEL oc.secrets_requirement=\"\\\"citrix\\\"\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"citrix\"\nENV APPBIN \"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.args=\"-icaroot /opt/Citrix/ICAClient\"\nENV APP \"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.usedefaultapplication=true\nCOPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\nRUN apt-get update && apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/citrix/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/citrix/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application citrix

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/citrix.d\n
"},{"location":"applications/citrix/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f citrix.d -t citrix .\n
"},{"location":"applications/citrix/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect citrix > citrix.json\ndocker image save citrix -o citrix.tar\nctr -n k8s.io images import citrix.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @citrix.json\n\n
"},{"location":"applications/cloudfoundry/","title":"cloudFoundry","text":""},{"location":"applications/cloudfoundry/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/cloudfoundry/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/cloudfoundry/#ubuntu-packages","title":"Ubuntu packages","text":"
cf8-cli\n
"},{"location":"applications/cloudfoundry/#arguments","title":"Arguments","text":"

\"--disable-factory --class pivotalio.cf\"

"},{"location":"applications/cloudfoundry/#displayname","title":"Displayname","text":"
Cloud Foundry cli\n
"},{"location":"applications/cloudfoundry/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/cloudfoundry/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/cloudfoundry/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.pivotalio.cf\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/cloudfoundry/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\nRUN echo \"deb https://packages.cloudfoundry.org/debian stable main\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\n
"},{"location":"applications/cloudfoundry/#json-dump","title":"JSON dump","text":"

json source file cloudfoundry.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\",\n        \"RUN echo \\\"deb https://packages.cloudfoundry.org/debian stable main\\\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\"\n    ],\n    \"debpackage\": \"cf8-cli\",\n    \"icon\": \"pivotalio-icon.svg\",\n    \"keyword\": \"cf,pivotal.io,cloud,foundry,cloud foundry\",\n    \"launch\": \"gnome-terminal-server.pivotalio.cf\",\n    \"name\": \"cloudFoundry\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"displayname\": \"Cloud Foundry cli\",\n    \"args\": \"--disable-factory --class pivotalio.cf\",\n    \"quick\": true\n}\n
"},{"location":"applications/cloudfoundry/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output cloudfoundry.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cloudfoundry.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cloudfoundry.d.3.0.json\n\n
"},{"location":"applications/cloudfoundry/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\nRUN echo \"deb https://packages.cloudfoundry.org/debian stable main\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends cf8-cli && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pivotalio-icon.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCI+PHBhdGggZD0iTTI3LjY2IDBIMTAuNXY2NGgxMC42NjdWOS42Mmg1LjQzOGMxLjM2IDAgMi4zIDAgMy40NS4yMSA4Ljc4NC4yMSAxMy4wNzIgMi44MjQgMTMuMDcyIDkuODN2LjgzN2MwIDYuNDg0LTMuNDUgMTAuNjY3LTEyLjg2MyAxMC42NjctLjk0IDAtMi4zLS4yMS0yLjMtLjIxdjguNzg0aDIuM0M0My44NyAzOS43NCA1My41IDM0LjMgNTMuNSAyMC4zOTJ2LS44MzdDNTMuNSA1LjEyNCA0Mi44MjQgMCAyNy42NiAweiIgZmlsbD0iIzAwN2Q2OCIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"cloudfoundry,cf,pivotal.io,cloud,foundry,cloud foundry\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.pivotalio.cf\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--disable-factory --class pivotalio.cf\"\nLABEL oc.name=\"cloudFoundry\"\nLABEL oc.displayname=\"Cloud Foundry cli\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cloudFoundry\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class pivotalio.cf\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cloudfoundry/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cloudfoundry/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application cloudFoundry

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cloudFoundry.d\n
"},{"location":"applications/cloudfoundry/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f cloudFoundry.d -t cloudFoundry .\n
"},{"location":"applications/cloudfoundry/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect cloudFoundry > cloudFoundry.json\ndocker image save cloudFoundry -o cloudFoundry.tar\nctr -n k8s.io images import cloudFoundry.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cloudFoundry.json\n\n
"},{"location":"applications/cmd.exe/","title":"cmd.exe","text":""},{"location":"applications/cmd.exe/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.wine

"},{"location":"applications/cmd.exe/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/cmd.exe/#alpine-packages","title":"Alpine packages","text":"
wine\n
"},{"location":"applications/cmd.exe/#displayname","title":"Displayname","text":"
cmd.exe wine (alpine)\n
"},{"location":"applications/cmd.exe/#path","title":"Path","text":"
/usr/bin/wineconsole\n
"},{"location":"applications/cmd.exe/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/cmd.exe/#wm_class","title":"WM_CLASS","text":"
conhost.exe.conhost.exe\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/cmd.exe/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
"},{"location":"applications/cmd.exe/#json-dump","title":"JSON dump","text":"

json source file cmd.exe.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n    ],\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"wine\",\n    \"icon\": \"cmd.svg\",\n    \"keyword\": \"wine,command,cmd.exe\",\n    \"launch\": \"conhost.exe.conhost.exe\",\n    \"name\": \"cmd.exe\",\n    \"displayname\": \"cmd.exe wine (alpine)\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/wineconsole\",\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/cmd.exe/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output cmd.exe.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cmd.exe.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cmd.exe.d.3.0.json\n\n
"},{"location":"applications/cmd.exe/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"cmd.svg\"\nLABEL oc.icondata=\"PHN2ZyBoZWlnaHQ9IjEwMjQiIHdpZHRoPSI4OTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTgzMSAxMjdINjNjLTM1LjM1IDAtNjQgMjguNjUtNjQgNjR2NjQwYzAgMzUuMzUgMjguNjUgNjQgNjQgNjRoNzY4YzM1LjM1IDAgNjQtMjguNjUgNjQtNjRWMTkxQzg5NSAxNTUuNjQ5OTk5OTk5OTk5OTggODY2LjM1IDEyNyA4MzEgMTI3ek0xMjcgNTc1bDEyOC0xMjhMMTI3IDMxOWw2NC02NCAxOTIgMTkyTDE5MSA2MzkgMTI3IDU3NXpNNjM5IDYzOUgzODN2LTY0aDI1NlY2Mzl6IiAvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"cmd.exe,wine,command,cmd.exe\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"conhost.exe.conhost.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"cmd.exe\"\nLABEL oc.displayname=\"cmd.exe wine (alpine)\"\nLABEL oc.path=\"/usr/bin/wineconsole\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cmd.exe\"\nENV APPBIN \"/usr/bin/wineconsole\"\nENV APP \"/usr/bin/wineconsole\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cmd.exe/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cmd.exe/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application cmd.exe

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cmd.exe.d\n
"},{"location":"applications/cmd.exe/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f cmd.exe.d -t cmd.exe .\n
"},{"location":"applications/cmd.exe/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect cmd.exe > cmd.exe.json\ndocker image save cmd.exe -o cmd.exe.tar\nctr -n k8s.io images import cmd.exe.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cmd.exe.json\n\n
"},{"location":"applications/cntlm/","title":"cntlm","text":""},{"location":"applications/cntlm/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/cntlm/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cntlm/#ubuntu-packages","title":"Ubuntu packages","text":"
ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget\n
"},{"location":"applications/cntlm/#arguments","title":"Arguments","text":"

\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"

"},{"location":"applications/cntlm/#displayname","title":"Displayname","text":"
cntlm\n
"},{"location":"applications/cntlm/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/cntlm/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/cntlm/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.cntlm\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/cntlm/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

COPY cntlm/cntlm.mustache  cntlm/init.cntlm.sh /composer/\nCOPY composer/init.d/init.gnome-terminal /composer/init.d/\n
"},{"location":"applications/cntlm/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN chown balloon:root /etc/cntlm.conf\nRUN chmod 755 /composer/cntlm.mustache\n
"},{"location":"applications/cntlm/#json-dump","title":"JSON dump","text":"

json source file

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget\",\n    \"icon\": \"cntlm.svg\",\n    \"keyword\": \"cntlm,proxy,ntlm\",\n    \"launch\": \"gnome-terminal-server.cntlm\",\n    \"name\": \"cntlm\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"displayname\": \"cntlm\",\n    \"host_config\": {\n        \"network_mode\": \"container\"\n    },\n    \"args\": \"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\",\n    \"preruncommands\": [\n        \"COPY cntlm/cntlm.mustache  cntlm/init.cntlm.sh /composer/\",\n        \"COPY composer/init.d/init.gnome-terminal /composer/init.d/\"\n    ],\n    \"postruncommands\": [\n        \"RUN chown balloon:root /etc/cntlm.conf\",\n        \"RUN chmod 755 /composer/cntlm.mustache\"\n    ]\n}\n
"},{"location":"applications/cntlm/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output cntlm.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cntlm.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cntlm.json\n\n
"},{"location":"applications/cntlm/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nCOPY cntlm/cntlm.mustache  cntlm/init.cntlm.sh /composer/\nCOPY composer/init.d/init.gnome-terminal /composer/init.d/\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"cntlm.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDQ3MC4xMDcgNDcwLjEwNyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDcwLjEwNyA0NzAuMTA3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8cGF0aCBkPSJNNDIzLjQ4OSwxNjkuNzg1YzQuMzY0LTEyLjMzOCw2Ljg2My0yNS41NTUsNi44NjMtMzkuMzkxYzAtNjUuMzE2LTUyLjk1Ni0xMTguMjcyLTExOC4yNzItMTE4LjI3Mg0KCQljLTQ0LjQ0NSwwLTgzLjEyOSwyNC41NTMtMTAzLjMzMiw2MC43OTljLTE1LjM5LTkuNjc1LTMzLjU2LTE1LjM2LTUzLjA4LTE1LjM2Yy01NS4yMzksMC0xMDAuMDEsNDQuNzczLTEwMC4wMSwxMDAuMDAyDQoJCWMwLDMuODI4LDAuMjY0LDcuNTkzLDAuNjg0LDExLjMxM2gtMC42ODRDMjQuOTI1LDE2OC44NzUsMCwxOTMuNzkyLDAsMjI0LjUzM2MwLDMwLjc0LDI0LjkyNSw1NS42NTgsNTUuNjU4LDU1LjY1OGgyMC4yMDQNCgkJYy0yLjQwOC0zLjg2Ni0zLjc0Mi04LjI5OS0zLjc0Mi0xMi45NTljMC02LjU2MSwyLjU0Ni0xMi43NDIsNy4yMDUtMTcuNDE2bDE0LjA4NS0xNC4wN2w4LjMyNS04LjMyMw0KCQljNC42NDMtNC42MzUsMTAuODIzLTcuMTgzLDE3LjM5Mi03LjE4M2M2LjU2OSwwLDEyLjc2NSwyLjU1NiwxNy40MjQsNy4yMTNsMC4wNDYsMC4wNDh2LTAuMDdjMC0xMy41OCwxMS4wNDItMjQuNjMxLDI0LjYzMS0yNC42MzENCgkJaDMxLjYzM2MxMy41NzIsMCwyNC42MTUsMTEuMDUsMjQuNjE1LDI0LjYzMXYwLjA4NGwwLjA2Mi0wLjA2MmMxMS4wNjQtMTEuMDY0LDI2Ljk3Mi03Ljg5LDM0Ljg0OC0wLjAxNGwxMC4zMjcsMTAuMzI3DQoJCWwxMi4wMzUsMTIuMDM1YzQuNjU5LDQuNjUxLDcuMjIxLDEwLjgzOSw3LjIyMSwxNy40MjRjMCw0LjY3NS0xLjM1LDkuMTE1LTMuNzU4LDEyLjk2N2gzMy40MDQNCgkJYzIzLjAzLTM2LjA1Miw5MS40NjktNTIuNTA0LDExMC41MjMtNi42ODVjMC43NzYsMS44NjQsMC45MzIsMy44MzYsMS4xOCw1Ljc5M2MyNi40OTMtNC4yNzEsNDYuNzktMjcuMDYxLDQ2Ljc5LTU0Ljc2NQ0KCQlDNDcwLjEwNywxOTYuODkyLDQ0OS45MDQsMTc0LjEyNSw0MjMuNDg5LDE2OS43ODV6Ii8+DQoJPHBhdGggZD0iTTE0Ni4xOTUsMzcyLjExYy0xNS4yODItMTAuMDcxLTI1LjQwNy0yNy4zMzEtMjUuNDA3LTQ2Ljk1M2MwLTMxLjAyLDI1LjIzNS01Ni4yNTUsNTYuMjQ3LTU2LjI1NQ0KCQljMzEuMDI4LDAsNTYuMjYzLDI1LjIzNSw1Ni4yNjMsNTYuMjU1YzAsMy44MDQtMC40MDQsNy41MjMtMS4xMTgsMTEuMTE5bDUxLjMyNC0yMS40di01LjU0M2MwLTQuODIzLTMuOTEzLTguNzM3LTguNzI3LTguNzM3DQoJCWgtMTcuOTM2Yy0xLjU1NC01LjA1NC0zLjYwNC05Ljg5OS02LjA0MS0xNC40OTZsMTIuNzAzLTEyLjcwM2MxLjY0Ni0xLjYzOCwyLjU2Mi0zLjg1OSwyLjU2Mi02LjE3Mw0KCQljMC0yLjMxNC0wLjkxNi00LjUzNC0yLjU2Mi02LjE4MWwtMjIuMzYyLTIyLjM2MmMtMS43MS0xLjcwOC0zLjk0NS0yLjU1Ni02LjE4MS0yLjU1NmMtMi4yMzYsMC00LjQ1NywwLjg0OC02LjE2NSwyLjU1Ng0KCQlsLTEyLjcxOSwxMi43MTFjLTQuNTk3LTIuNDM4LTkuNDI3LTQuNDgtMTQuNTA0LTYuMDI1VjIyNy40M2MwLTQuODIzLTMuODk4LTguNzI5LTguNzEzLTguNzI5aC0zMS42MzMNCgkJYy00LjgxNSwwLTguNzI5LDMuOTA2LTguNzI5LDguNzI5djE3LjkzNmMtNS4wNjIsMS41NDYtOS45MDcsMy41ODgtMTQuNTA0LDYuMDI1bC0xMi42ODctMTIuNjk1DQoJCWMtMS43MDgtMS43MS0zLjk0NS0yLjU1Ni02LjE4MS0yLjU1NmMtMi4yMzYsMC00LjQ3MiwwLjg0Ni02LjE4MSwyLjU0OGwtMjIuMzc4LDIyLjM3Yy0xLjYzLDEuNjM4LTIuNTQ2LDMuODU5LTIuNTQ2LDYuMTczDQoJCWMwLDIuMzIyLDAuOTE2LDQuNTQyLDIuNTQ2LDYuMTgxbDEyLjcwMywxMi42OTVjLTIuNDM4LDQuNTk3LTQuNDcyLDkuNDM1LTYuMDI1LDE0LjQ4OEg3OS4zMDljLTQuODEzLDAtOC43MjcsMy45MTQtOC43MjcsOC43MzcNCgkJdjMxLjY0MWMwLDQuODE0LDMuOTE0LDguNzI3LDguNzI3LDguNzI3SDk3LjIzYzEuNTY4LDUuMDU1LDMuNjAyLDkuOTAxLDYuMDQsMTQuNDk4bC0xMi43MDMsMTIuNzAzDQoJCWMtMy40MDEsMy40LTMuNDAxLDguOTM3LDAsMTIuMzQ1bDcuNTE3LDcuNTA5YzQuMzMyLTQuNjksOS42MjctOC42MDMsMTUuOTAyLTExLjIyMUwxNDYuMTk1LDM3Mi4xMXoiLz4NCgk8cGF0aCBkPSJNMTc3LjAzNSwyODQuODA0Yy0yMi4yNTMsMC00MC4zNDUsMTguMS00MC4zNDUsNDAuMzUzYzAsMTguNDM0LDEyLjQ4NiwzMy44NTQsMjkuMzk3LDM4LjY2bDQ2LjA5Mi0xOS4yMQ0KCQljMy4yMTQtNS43OTEsNS4yMTctMTIuMzYxLDUuMjE3LTE5LjQ1QzIxNy4zOTcsMzAyLjkwNCwxOTkuMjg5LDI4NC44MDQsMTc3LjAzNSwyODQuODA0eiIvPg0KCTxwYXRoIGQ9Ik00MjUuMzA1LDMzMi41NzJjLTAuODIyLDAtMS42NjIsMC4xNjItMi40NywwLjQ5NmwtMzIuOTg0LDEzLjczNmMtMS40MjgsMC41OTgtMi45MDQsMC44NzgtNC4zNjQsMC44NzgNCgkJYy00LjQ0MiwwLTguNjY1LTIuNjMzLTEwLjQ4My03LjAwNWwtMTAuMDYzLTI0LjEyNGMtMS4xNDgtMi43ODgtMS4xOC01LjkwOS0wLjAxNi04LjY5N2MxLjEzNC0yLjc5NiwzLjM0LTUuMDA5LDYuMTE5LTYuMTY1DQoJCWwzMi45ODQtMTMuNzQ0YzMuMjYyLTEuMzU4LDQuNzgzLTUuMDc4LDMuNDMyLTguMzE1Yy01LjY1Mi0xMy41OC0yMC4yNS0yMC43NjMtMzQuMTAyLTE3LjU2NGwtMTYuMzY4LDMuNzM1DQoJCWMtMTUuNTc2LDMuNTU2LTI4LjY1MSwxNC4wNDYtMzUuNTE2LDI4LjQ1N0wzMDguNCwzMjEuNzMyTDEyMC4xMDQsNDAwLjIxYy0xNS4zMTIsNi4zODMtMjIuNTQ4LDIzLjk1My0xNi4xNjYsMzkuMjgxDQoJCWM2LjMyMSwxNS4xNSwyMy44MDcsMjIuNjExLDM5LjI4OSwxNi4xNzRsMTg4LjMxLTc4LjQ3MWwyOC42ODMsMTAuMDQ5YzUuNjIzLDEuOTcyLDExLjQ2MSwyLjk0MiwxNy4yNywyLjk0Mg0KCQljOS43ODMsMCwxOS40OS0yLjc0OCwyNy45NTMtOC4xMTNsMTQuMTk0LTguOTk5YzEyLjIzNy03Ljc2NSwxNy4wOTgtMjMuMjAxLDExLjUyMy0zNi41OA0KCQlDNDMwLjE1LDMzNC4wNDgsNDI3Ljc5LDMzMi41NzIsNDI1LjMwNSwzMzIuNTcyeiIvPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo=\"\nLABEL oc.keyword=\"cntlm,cntlm,proxy,ntlm\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.cntlm\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"\nLABEL oc.name=\"cntlm\"\nLABEL oc.displayname=\"cntlm\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"network_mode\\\":\\\"container\\\"}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"cntlm\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN chown balloon:root /etc/cntlm.conf\nRUN chmod 755 /composer/cntlm.mustache\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cntlm/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cntlm/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application cntlm

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cntlm.d\n
"},{"location":"applications/cntlm/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f cntlm.d -t cntlm .\n
"},{"location":"applications/cntlm/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect cntlm > cntlm.json\ndocker image save cntlm -o cntlm.tar\nctr -n k8s.io images import cntlm.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cntlm.json\n\n
"},{"location":"applications/corsix-th/","title":"corsix-th","text":""},{"location":"applications/corsix-th/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/corsix-th/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/corsix-th/#ubuntu-packages","title":"Ubuntu packages","text":"
libgl1 corsix-th\n
"},{"location":"applications/corsix-th/#path","title":"Path","text":"
/usr/games/corsix-th\n
"},{"location":"applications/corsix-th/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/corsix-th/#wm_class","title":"WM_CLASS","text":"
corsix-th.corsix-th\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/corsix-th/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/com.corsixth.CorsixTH.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/corsix-th/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\nRUN cd /composer &&  curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\nCOPY corsix-th.config.txt /composer/corsix-th.config.txt\n
"},{"location":"applications/corsix-th/#json-dump","title":"JSON dump","text":"

json source file corsix-th.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\",\n        \"RUN cd /composer &&  curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\",\n        \"COPY corsix-th.config.txt /composer/corsix-th.config.txt\"\n    ],\n    \"debpackage\": \"libgl1 corsix-th\",\n    \"icon\": \"games.svg\",\n    \"keyword\": \"hospital,role,playing\",\n    \"launch\": \"corsix-th.corsix-th\",\n    \"name\": \"corsix-th\",\n    \"path\": \"/usr/games/corsix-th\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/com.corsixth.CorsixTH.desktop\"\n}\n
"},{"location":"applications/corsix-th/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output corsix-th.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/corsix-th.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @corsix-th.d.3.0.json\n\n
"},{"location":"applications/corsix-th/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\nRUN cd /composer &&  curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\nCOPY corsix-th.config.txt /composer/corsix-th.config.txt\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends libgl1 corsix-th && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"games.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgeD0iMHB4IgogICB5PSIwcHgiCiAgIHdpZHRoPSIyNDguNTcxcHgiCiAgIGhlaWdodD0iMjQ4LjU3MXB4IgogICB2aWV3Qm94PSIwIDAgMjQ4LjU3MSAyNDguNTcxIgogICBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNDguNTcxIDI0OC41NzEiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJWaWRlby1HYW1lLUNvbnRyb2xsZXItSWNvbi1JRFYtZ3JlZW4uc3ZnIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE1NyI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGU+PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczU1IiAvPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzAwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjQ4MCIKICAgICBpZD0ibmFtZWR2aWV3NTMiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuOTQ5NDI2OTMiCiAgICAgaW5rc2NhcGU6Y3g9IjEyNC4yODU1IgogICAgIGlua3NjYXBlOmN5PSIxMjQuMjg1NSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIgLz48cGF0aAogICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgZD0iTTg3LjQyMyw4OC45NjhjMC41NjIsMy4xMjYtMS41MTcsNi4xMTUtNC42NDIsNi42NzZsLTMzLjk1Niw2LjEwMmMtMy4xMjYsMC41NjItNi4xMTUtMS41MTctNi42NzYtNC42NDIgIGwwLDBjLTAuNTYyLTMuMTI2LDEuNTE3LTYuMTE1LDQuNjQyLTYuNjc2bDMzLjk1Ni02LjEwMkM4My44NzMsODMuNzY0LDg2Ljg2MSw4NS44NDIsODcuNDIzLDg4Ljk2OEw4Ny40MjMsODguOTY4eiIKICAgICBpZD0icGF0aDMiIC8+PGcKICAgICBpZD0ibGF5ZXIxIgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yODUuNzE0MjksLTM2NS4yMTkzMikiPjxwYXRoCiAgICAgICBpZD0icGF0aDI5ODUiCiAgICAgICBmaWxsPSIjRUEzRDRFIgogICAgICAgZD0iTTUzNC4yODUsNDg5LjUwNWMwLjAyNCw2OC42NDEtNTUuNjAxLDEyNC4zMDUtMTI0LjI0MiwxMjQuMzI5ICAgcy0xMjQuMzA1LTU1LjYwMi0xMjQuMzI5LTEyNC4yNDNjMC0wLjAyOSwwLTAuMDU4LDAtMC4wODZjLTAuMDI0LTY4LjY0MSw1NS42MDItMTI0LjMwNSwxMjQuMjQzLTEyNC4zMjkgICBjNjguNjQxLTAuMDIzLDEyNC4zMDUsNTUuNjAyLDEyNC4zMjgsMTI0LjI0M0M1MzQuMjg1LDQ4OS40NDcsNTM0LjI4NSw0ODkuNDc2LDUzNC4yODUsNDg5LjUwNXoiCiAgICAgICBzdHlsZT0iZmlsbDojNzZjMmFmO2ZpbGwtb3BhY2l0eToxIiAvPjxwYXRoCiAgICAgICBpZD0icGF0aDMwOTkiCiAgICAgICBmaWxsPSIjMjMxRjIwIgogICAgICAgc3Ryb2tlPSIjMjMxRjIwIgogICAgICAgc3Ryb2tlLXdpZHRoPSI2IgogICAgICAgZD0iTTQxMC45NTEsMzY2LjcyNiAgIGMtMi41ODMsMjcuMzY0LTguNjUsNDAuMDUxLTExLjA1OSw1MC45MjJjLTEuMjA0LDUuNDM2LTEuNDY4LDEwLjQzMiwwLjA5NCwxNi40NjZzNC45NDMsMTMuMTA3LDExLjAyNywyMi44MDhsMC44NDYtMC41MTggICBjLTYuMDU3LTkuNjU5LTkuMzc4LTE2LjY0OS0xMC45MDEtMjIuNTM0Yy0xLjUyMy01Ljg4NS0xLjI0Ny0xMC42NjItMC4wNjMtMTYuMDA4YzIuMzY5LTEwLjY5NCw4LjQ2NS0yMy41NjksMTEuMDU4LTUxLjA0NCAgIEw0MTAuOTUxLDM2Ni43MjZMNDEwLjk1MSwzNjYuNzI2eiIgLz48ZwogICAgICAgaWQ9ImczOTE1Ij48ZwogICAgICAgICBpZD0iZzkiPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzXzFfIgogICAgICAgICAgIGZpbGw9IiNDMUJDOUQiCiAgICAgICAgICAgZD0iTTM5OS4yNjUsNTA0Ljk0YzAsMjIuMDkyLTE3LjkwOSw0MC00MCw0MGMtMjIuMDkyLDAtNDAtMTcuOTA4LTQwLTQwbDAsMCAgICAgYzAtMjIuMDkxLDE3LjkwOC00MCw0MC00MEMzODEuMzU2LDQ2NC45NCwzOTkuMjY1LDQ4Mi44NDksMzk5LjI2NSw1MDQuOTR6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzLTdfMV8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNTAxLjI2NCw1MDQuOTRjMCwyMi4wOTItMTcuOTA4LDQwLTQwLDQwcy00MC0xNy45MDgtNDAtNDBsMCwwICAgICBjMC0yMi4wOTEsMTcuOTA4LTQwLDQwLTQwUzUwMS4yNjQsNDgyLjg0OSw1MDEuMjY0LDUwNC45NHoiIC8+PHJlY3QKICAgICAgICAgICBpZD0icmVjdDMwMzFfMV8iCiAgICAgICAgICAgeD0iMzU2LjA1IgogICAgICAgICAgIHk9IjQ2NC45NCIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIHdpZHRoPSIxMDUuNzEzIgogICAgICAgICAgIGhlaWdodD0iNjAiIC8+PC9nPjxnCiAgICAgICAgIGlkPSJnMTQiPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzIgogICAgICAgICAgIGZpbGw9IiNGMkYyRjIiCiAgICAgICAgICAgZD0iTTM5OS41OTgsNDk2LjI3M2MwLDIyLjA5Mi0xNy45MDksNDAtNDAsNDBjLTIyLjA5MiwwLTQwLTE3LjkwOC00MC00MGwwLDAgICAgIGMwLTIyLjA5MSwxNy45MDgtNDAsNDAtNDBDMzgxLjY4OSw0NTYuMjczLDM5OS41OTgsNDc0LjE4MiwzOTkuNTk4LDQ5Ni4yNzN6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzLTciCiAgICAgICAgICAgZmlsbD0iI0YyRjJGMiIKICAgICAgICAgICBkPSJNNTAxLjU5OCw0OTYuMjczYzAsMjIuMDkyLTE3LjkwOCw0MC00MCw0MHMtNDAtMTcuOTA4LTQwLTQwbDAsMCAgICAgYzAtMjIuMDkxLDE3LjkwOC00MCw0MC00MFM1MDEuNTk4LDQ3NC4xODIsNTAxLjU5OCw0OTYuMjczeiIgLz48cmVjdAogICAgICAgICAgIGlkPSJyZWN0MzAzMSIKICAgICAgICAgICB4PSIzNTYuMzg0IgogICAgICAgICAgIHk9IjQ1Ni4yNzMiCiAgICAgICAgICAgZmlsbD0iI0YyRjJGMiIKICAgICAgICAgICB3aWR0aD0iMTA1LjcxNCIKICAgICAgICAgICBoZWlnaHQ9IjYwIiAvPjwvZz48ZwogICAgICAgICBpZD0iZzE5Ij48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NV8yXyIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik00NzIuMzg3LDQ3OC40NzFjMCw1LjA2MS00LjEwNCw5LjE2My05LjE2NCw5LjE2M3MtOS4xNjMtNC4xMDItOS4xNjMtOS4xNjMgICAgIGMwLTUuMDYxLDQuMTAzLTkuMTYzLDkuMTYzLTkuMTYzUzQ3Mi4zODcsNDczLjQxLDQ3Mi4zODcsNDc4LjQ3MUw0NzIuMzg3LDQ3OC40NzF6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTBfMl8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNDcyLjUzMSw1MTYuMDA1YzAsNS4wNjEtNC4xMDMsOS4xNjMtOS4xNjIsOS4xNjNjLTUuMDYyLDAtOS4xNjQtNC4xMDMtOS4xNjQtOS4xNjMgICAgIGMwLTUuMDYyLDQuMTAzLTkuMTY0LDkuMTY0LTkuMTY0QzQ2OC40MjksNTA2Ljg0MSw0NzIuNTMxLDUxMC45NDMsNDcyLjUzMSw1MTYuMDA1TDQ3Mi41MzEsNTE2LjAwNXoiIC8+PHBhdGgKICAgICAgICAgICBpZD0icGF0aDMwNTUtOV8yXyIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik00OTEuMTI1LDQ5Ny4zNzZjMCw1LjA2LTQuMTA0LDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MywwLTkuMTY0LTQuMTA0LTkuMTY0LTkuMTYzICAgICBjMC01LjA2Miw0LjEwMi05LjE2NCw5LjE2NC05LjE2NEM0ODcuMDIxLDQ4OC4yMTIsNDkxLjEyNSw0OTIuMzE1LDQ5MS4xMjUsNDk3LjM3Nkw0OTEuMTI1LDQ5Ny4zNzZ6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTRfMl8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNDUzLjcyNCw0OTcuMzU2YzAsNS4wNjMtNC4xMDMsOS4xNjQtOS4xNjMsOS4xNjRjLTUuMDYyLDAtOS4xNjMtNC4xMDItOS4xNjMtOS4xNjQgICAgIGMwLTUuMDYsNC4xMDItOS4xNjMsOS4xNjMtOS4xNjNDNDQ5LjYyMSw0ODguMTkzLDQ1My43MjQsNDkyLjI5Niw0NTMuNzI0LDQ5Ny4zNTZMNDUzLjcyNCw0OTcuMzU2eiIgLz48L2c+PGcKICAgICAgICAgaWQ9ImcyNSI+PHBhdGgKICAgICAgICAgICBpZD0icGF0aDMwNTVfMV8iCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNNDcyLjM4Nyw0NzcuMjIxYzAsNS4wNjEtNC4xMDQsOS4xNjMtOS4xNjQsOS4xNjNzLTkuMTYzLTQuMTAyLTkuMTYzLTkuMTYzICAgICBjMC01LjA2MSw0LjEwMy05LjE2Myw5LjE2My05LjE2M1M0NzIuMzg3LDQ3Mi4xNiw0NzIuMzg3LDQ3Ny4yMjFMNDcyLjM4Nyw0NzcuMjIxeiIgLz48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NS0wXzFfIgogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTQ3Mi41MzEsNTE0Ljc1NWMwLDUuMDYxLTQuMTAzLDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MiwwLTkuMTY0LTQuMTAzLTkuMTY0LTkuMTYzICAgICBjMC01LjA2Miw0LjEwMy05LjE2NCw5LjE2NC05LjE2NEM0NjguNDI5LDUwNS41OTEsNDcyLjUzMSw1MDkuNjkzLDQ3Mi41MzEsNTE0Ljc1NUw0NzIuNTMxLDUxNC43NTV6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTlfMV8iCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNNDkxLjEyNSw0OTYuMTI2YzAsNS4wNi00LjEwNCw5LjE2My05LjE2Miw5LjE2M2MtNS4wNjMsMC05LjE2NC00LjEwNC05LjE2NC05LjE2MyAgICAgYzAtNS4wNjIsNC4xMDItOS4xNjQsOS4xNjQtOS4xNjRDNDg3LjAyMSw0ODYuOTYyLDQ5MS4xMjUsNDkxLjA2NSw0OTEuMTI1LDQ5Ni4xMjZMNDkxLjEyNSw0OTYuMTI2eiIgLz48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NS00XzFfIgogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTQ1My43MjQsNDk2LjEwNmMwLDUuMDYzLTQuMTAzLDkuMTY0LTkuMTYzLDkuMTY0Yy01LjA2MiwwLTkuMTYzLTQuMTAyLTkuMTYzLTkuMTY0ICAgICBjMC01LjA2LDQuMTAyLTkuMTYzLDkuMTYzLTkuMTYzQzQ0OS42MjEsNDg2Ljk0Myw0NTMuNzI0LDQ5MS4wNDYsNDUzLjcyNCw0OTYuMTA2TDQ1My43MjQsNDk2LjEwNnoiIC8+PC9nPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzA1NSIKICAgICAgICAgZmlsbD0iIzMzMzMzMyIKICAgICAgICAgZD0iTTQ3Mi4zODcsNDc0Ljg0NmMwLDUuMDYxLTQuMTA0LDkuMTYzLTkuMTY0LDkuMTYzcy05LjE2My00LjEwMy05LjE2My05LjE2MyAgICBjMC01LjA2MSw0LjEwMy05LjE2Myw5LjE2My05LjE2M1M0NzIuMzg3LDQ2OS43ODUsNDcyLjM4Nyw0NzQuODQ2TDQ3Mi4zODcsNDc0Ljg0NnoiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgzMDU1LTAiCiAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgIGQ9Ik00NzIuNTMxLDUxMi4zOGMwLDUuMDYxLTQuMTAzLDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MiwwLTkuMTY0LTQuMTAzLTkuMTY0LTkuMTYzICAgIGMwLTUuMDYyLDQuMTAzLTkuMTY0LDkuMTY0LTkuMTY0QzQ2OC40MjksNTAzLjIxNiw0NzIuNTMxLDUwNy4zMTgsNDcyLjUzMSw1MTIuMzhMNDcyLjUzMSw1MTIuMzh6IiAvPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzA1NS05IgogICAgICAgICBmaWxsPSIjMzMzMzMzIgogICAgICAgICBkPSJNNDkxLjEyNSw0OTMuNzUxYzAsNS4wNi00LjEwNCw5LjE2My05LjE2Miw5LjE2M2MtNS4wNjMsMC05LjE2NC00LjEwNC05LjE2NC05LjE2MyAgICBjMC01LjA2Miw0LjEwMi05LjE2NCw5LjE2NC05LjE2NEM0ODcuMDIxLDQ4NC41ODgsNDkxLjEyNSw0ODguNjksNDkxLjEyNSw0OTMuNzUxTDQ5MS4xMjUsNDkzLjc1MXoiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgzMDU1LTQiCiAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgIGQ9Ik00NTMuNzI0LDQ5My43MzFjMCw1LjA2My00LjEwMyw5LjE2NC05LjE2Myw5LjE2NGMtNS4wNjIsMC05LjE2My00LjEwMi05LjE2My05LjE2NCAgICBjMC01LjA2LDQuMTAyLTkuMTYzLDkuMTYzLTkuMTYzQzQ0OS42MjEsNDg0LjU2OCw0NTMuNzI0LDQ4OC42NzEsNDUzLjcyNCw0OTMuNzMxTDQ1My43MjQsNDkzLjczMXoiIC8+PGcKICAgICAgICAgaWQ9ImczNSI+PHBhdGgKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik0zODMuNzUsNTAyLjEzYzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVoLTM2LjI1Yy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1bDAsMCAgICAgYzAtMy43OTcsMy4wNzgtNi44NzUsNi44NzUtNi44NzVoMzYuMjVDMzgwLjY3Miw0OTUuMjU1LDM4My43NSw0OTguMzMzLDM4My43NSw1MDIuMTNMMzgzLjc1LDUwMi4xM3oiCiAgICAgICAgICAgaWQ9InBhdGgzNyIgLz48cGF0aAogICAgICAgICAgIGZpbGw9IiNDMUJDOUQiCiAgICAgICAgICAgZD0iTTM1OC42MjUsNDc3LjEzYzMuNzk3LDAsNi44NzUsMy4wNzgsNi44NzUsNi44NzV2MzYuMjVjMCwzLjc5Ny0zLjA3OCw2Ljg3NS02Ljg3NSw2Ljg3NWwwLDAgICAgIGMtMy43OTcsMC02Ljg3NS0zLjA3OC02Ljg3NS02Ljg3NXYtMzYuMjVDMzUxLjc1LDQ4MC4yMDgsMzU0LjgyOCw0NzcuMTMsMzU4LjYyNSw0NzcuMTNMMzU4LjYyNSw0NzcuMTN6IgogICAgICAgICAgIGlkPSJwYXRoMzkiIC8+PC9nPjxnCiAgICAgICAgIGlkPSJnNDEiPjxwYXRoCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNMzgzLjc1LDQ5OS4yNTVjMCwzLjc5Ny0zLjA3OCw2Ljg3NS02Ljg3NSw2Ljg3NWgtMzYuMjVjLTMuNzk3LDAtNi44NzUtMy4wNzgtNi44NzUtNi44NzVsMCwwICAgICBjMC0zLjc5NywzLjA3OC02Ljg3NSw2Ljg3NS02Ljg3NWgzNi4yNUMzODAuNjcyLDQ5Mi4zOCwzODMuNzUsNDk1LjQ1OCwzODMuNzUsNDk5LjI1NUwzODMuNzUsNDk5LjI1NXoiCiAgICAgICAgICAgaWQ9InBhdGg0MyIgLz48cGF0aAogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTM1OC42MjUsNDc0LjI1NWMzLjc5NywwLDYuODc1LDMuMDc4LDYuODc1LDYuODc1djM2LjI1YzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVsMCwwICAgICBjLTMuNzk3LDAtNi44NzUtMy4wNzgtNi44NzUtNi44NzV2LTM2LjI1QzM1MS43NSw0NzcuMzMzLDM1NC44MjgsNDc0LjI1NSwzNTguNjI1LDQ3NC4yNTVMMzU4LjYyNSw0NzQuMjU1eiIKICAgICAgICAgICBpZD0icGF0aDQ1IiAvPjwvZz48ZwogICAgICAgICBpZD0iZzQ3Ij48cGF0aAogICAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgICAgZD0iTTM4My43NSw0OTUuNzU1YzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVoLTM2LjI1Yy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1bDAsMCAgICAgYzAtMy43OTcsMy4wNzgtNi44NzUsNi44NzUtNi44NzVoMzYuMjVDMzgwLjY3Miw0ODguODgsMzgzLjc1LDQ5MS45NTgsMzgzLjc1LDQ5NS43NTVMMzgzLjc1LDQ5NS43NTV6IgogICAgICAgICAgIGlkPSJwYXRoNDkiIC8+PHBhdGgKICAgICAgICAgICBmaWxsPSIjMzMzMzMzIgogICAgICAgICAgIGQ9Ik0zNTguNjI1LDQ3MC43NTVjMy43OTcsMCw2Ljg3NSwzLjA3OCw2Ljg3NSw2Ljg3NXYzNi4yNWMwLDMuNzk3LTMuMDc4LDYuODc1LTYuODc1LDYuODc1bDAsMCAgICAgYy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1di0zNi4yNUMzNTEuNzUsNDczLjgzMywzNTQuODI4LDQ3MC43NTUsMzU4LjYyNSw0NzAuNzU1TDM1OC42MjUsNDcwLjc1NXoiCiAgICAgICAgICAgaWQ9InBhdGg1MSIgLz48L2c+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"corsix-th,hospital,role,playing\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"com.corsixth.CorsixTH.desktop\"\nLABEL oc.launch=\"corsix-th.corsix-th\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"corsix-th\"\nLABEL oc.displayname=\"corsix-th\"\nLABEL oc.path=\"/usr/games/corsix-th\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"corsix-th\"\nENV APPBIN \"/usr/games/corsix-th\"\nENV APP \"/usr/games/corsix-th\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/corsix-th/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/corsix-th/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application corsix-th

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/corsix-th.d\n
"},{"location":"applications/corsix-th/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f corsix-th.d -t corsix-th .\n
"},{"location":"applications/corsix-th/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect corsix-th > corsix-th.json\ndocker image save corsix-th -o corsix-th.tar\nctr -n k8s.io images import corsix-th.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @corsix-th.json\n\n
"},{"location":"applications/cuda/","title":"cuda","text":""},{"location":"applications/cuda/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.nvidia.22.04

"},{"location":"applications/cuda/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cuda/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-terminal dbus-x11 git\n
"},{"location":"applications/cuda/#arguments","title":"Arguments","text":"

\"--disable-factory --class=cuda\"

"},{"location":"applications/cuda/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/cuda/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/cuda/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.cuda\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/cuda/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/cuda/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

"},{"location":"applications/cuda/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
"},{"location":"applications/cuda/#json-dump","title":"JSON dump","text":"

json source file cuda.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [],\n    \"debpackage\": \"gnome-terminal dbus-x11 git\",\n    \"icon\": \"nvidia.svg\",\n    \"keyword\": \"cuda nvidia\",\n    \"launch\": \"gnome-terminal-server.cuda\",\n    \"name\": \"cuda\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=cuda\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\"\n    ]\n}\n
"},{"location":"applications/cuda/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output cuda.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cuda.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cuda.d.3.0.json\n\n
"},{"location":"applications/cuda/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal dbus-x11 git && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cuda,cuda nvidia\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cuda\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=cuda\"\nLABEL oc.name=\"cuda\"\nLABEL oc.displayname=\"cuda\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cuda\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=cuda\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cuda/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cuda/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application cuda

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cuda.d\n
"},{"location":"applications/cuda/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f cuda.d -t cuda .\n
"},{"location":"applications/cuda/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect cuda > cuda.json\ndocker image save cuda -o cuda.tar\nctr -n k8s.io images import cuda.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cuda.json\n\n
"},{"location":"applications/cudademo/","title":"cudademo","text":""},{"location":"applications/cudademo/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.nvidia.22.04

"},{"location":"applications/cudademo/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cudademo/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\n
"},{"location":"applications/cudademo/#arguments","title":"Arguments","text":"

\"--disable-factory --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"

"},{"location":"applications/cudademo/#displayname","title":"Displayname","text":"
cuda demo\n
"},{"location":"applications/cudademo/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/cudademo/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/cudademo/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.cudademo\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/cudademo/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/cudademo/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

"},{"location":"applications/cudademo/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
"},{"location":"applications/cudademo/#json-dump","title":"JSON dump","text":"

json source file cudademo.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [],\n    \"debpackage\": \"gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\",\n    \"icon\": \"nvidia.svg\",\n    \"keyword\": \"cuda nvidia\",\n    \"launch\": \"gnome-terminal-server.cudademo\",\n    \"name\": \"cudademo\",\n    \"displayname\": \"cuda demo\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\"\n    ]\n}\n
"},{"location":"applications/cudademo/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output cudademo.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudademo.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudademo.d.3.0.json\n\n
"},{"location":"applications/cudademo/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cudademo,cuda nvidia\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cudademo\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"\nLABEL oc.name=\"cudademo\"\nLABEL oc.displayname=\"cuda demo\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cudademo\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cudademo/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cudademo/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application cudademo

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudademo.d\n
"},{"location":"applications/cudademo/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f cudademo.d -t cudademo .\n
"},{"location":"applications/cudademo/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect cudademo > cudademo.json\ndocker image save cudademo -o cudademo.tar\nctr -n k8s.io images import cudademo.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudademo.json\n\n
"},{"location":"applications/cudadev/","title":"cudadev","text":""},{"location":"applications/cudadev/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.nvidia.22.04

"},{"location":"applications/cudadev/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cudadev/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\n
"},{"location":"applications/cudadev/#arguments","title":"Arguments","text":"

\"--disable-factory --class=cudadev\"

"},{"location":"applications/cudadev/#displayname","title":"Displayname","text":"
cuda developper\n
"},{"location":"applications/cudadev/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/cudadev/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/cudadev/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.cudadev\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/cudadev/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/cudadev/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

"},{"location":"applications/cudadev/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nRUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \nRUN echo \"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\" > /cuda.sh\nRUN echo \"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\" >> /cuda.sh\n
"},{"location":"applications/cudadev/#json-dump","title":"JSON dump","text":"

json source file cudadev.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [],\n    \"debpackage\": \"gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\",\n    \"icon\": \"nvidia.svg\",\n    \"keyword\": \"cuda nvidia dev\",\n    \"launch\": \"gnome-terminal-server.cudadev\",\n    \"name\": \"cudadev\",\n    \"displayname\": \"cuda developper\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=cudadev\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\",\n        \"RUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \",\n        \"RUN echo \\\"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\\\" > /cuda.sh\",\n        \"RUN echo \\\"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\\\" >> /cuda.sh\"\n    ]\n}\n
"},{"location":"applications/cudadev/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output cudadev.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudadev.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudadev.d.3.0.json\n\n
"},{"location":"applications/cudadev/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cudadev,cuda nvidia dev\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cudadev\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=cudadev\"\nLABEL oc.name=\"cudadev\"\nLABEL oc.displayname=\"cuda developper\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cudadev\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=cudadev\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nRUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \nRUN echo \"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\" > /cuda.sh\nRUN echo \"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\" >> /cuda.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cudadev/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cudadev/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application cudadev

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudadev.d\n
"},{"location":"applications/cudadev/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f cudadev.d -t cudadev .\n
"},{"location":"applications/cudadev/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect cudadev > cudadev.json\ndocker image save cudadev -o cudadev.tar\nctr -n k8s.io images import cudadev.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudadev.json\n\n
"},{"location":"applications/dia/","title":"Dia","text":""},{"location":"applications/dia/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/dia/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/dia/#alpine-packages","title":"Alpine packages","text":"
dia dia-lang\n
"},{"location":"applications/dia/#path","title":"Path","text":"
/usr/bin/dia\n
"},{"location":"applications/dia/#mimetype","title":"Mimetype","text":"
application/x-dia-diagram;\n
"},{"location":"applications/dia/#file-extensions","title":"File extensions","text":"

\"dia\"

"},{"location":"applications/dia/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"dia\"

"},{"location":"applications/dia/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/dia/#wm_class","title":"WM_CLASS","text":"
dia-gnome.Dia-gnome\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/dia/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/dia.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/dia/#json-dump","title":"JSON dump","text":"

json source file dia.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"dia dia-lang\",\n    \"installrecommends\": true,\n    \"icon\": \"circle_dia.svg\",\n    \"launch\": \"dia-gnome.Dia-gnome\",\n    \"name\": \"Dia\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/dia\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-dia-diagram;\",\n    \"fileextensions\": \"dia\",\n    \"legacyfileextensions\": \"dia\",\n    \"desktopfile\": \"/usr/share/applications/dia.desktop\"\n}\n
"},{"location":"applications/dia/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output dia.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/dia.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @dia.d.3.0.json\n\n
"},{"location":"applications/dia/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update dia dia-lang\nLABEL oc.icon=\"circle_dia.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk0MyIgeD0iLS4xMTk3NCIgeT0iLS4wOTgzNTciIHdpZHRoPSIxLjIzOTUiIGhlaWdodD0iMS4xOTY3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjE0NzUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTE3NCIgeDE9IjMwLjA1NSIgeDI9IjMwLjA1NSIgeTE9IjU3Ljg2MyIgeTI9IjYuNjI0IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDYwLjIwMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFmMWYxZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1MjUyNTIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTM3NSIgeD0iLS4wMzA3MiIgeT0iLS4wMzA3MiIgd2lkdGg9IjEuMDYxNCIgaGVpZ2h0PSIxLjA2MTQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzY4Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEzNzUpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgZmlsbCBtYXJrZXJzIi8+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDExNzQpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMDQzIDAgMCAxLjMwNDMgMiAyKSI+CiAgPGcgb3BhY2l0eT0iLjEiPgogICA8cGF0aCBkPSJtMTYuNSAxMWgydjEuOTk2aC0yIiBmaWxsPSIjMDAwMDAwIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMDQzIDAgMCAxLjMwNDMgMiAuNjk1NjUpIj4KICA8cGF0aCBkPSJtMTUgMTF2M2gxdjFoLTJ2M2gydjE0aC0ydjNoMnYwLjg3N2gtMWwyIDMuMTIzIDItMy4xMjNoLTF2LTAuODc3aDljNS41NCAwIDEwLTQuNDYgMTAtMTBzLTQuNDYtMTAtMTAtMTBoLTl2LTFoMXYtM3ptMyA3aDljMy44NzggMCA3IDMuMTIyIDcgN3MtMy4xMjIgNy03IDdoLTl6bTcgMi01IDloMTB6bTAgMy42IDEuODAxIDMuNGgtMy42MDIiIGZpbGw9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmaWx0ZXI5NDMpIiBvcGFjaXR5PSIuNSIvPgogIDxwYXRoIGQ9Im0yNCAxOS01IDloMTBtLTMuMi0yaC0zLjZsMS44LTMuNCIgZmlsbD0iI2ZmOTQwOSIvPgogPC9nPgogPHBhdGggZD0ibTIwLjI2MSAxMy43Mzl2My45MTNoMS4zMDQzdjEuMzA0M2gtMi42MDg3djMuOTEzaDIuNjA4N3YxOC4yNjFoLTIuNjA4N3YzLjkxM2gyLjYwODd2MS4xNDM5aC0xLjMwNDNsMi42MDg3IDQuMDczNSAyLjYwODctNC4wNzM1aC0xLjMwNDN2LTEuMTQzOWgxMS43MzljNy4yMjYxIDAgMTMuMDQzLTUuODE3NCAxMy4wNDMtMTMuMDQzcy01LjgxNzQtMTMuMDQzLTEzLjA0My0xMy4wNDNoLTExLjczOXYtMS4zMDQzaDEuMzA0M3YtMy45MTN6bTMuOTEzIDkuMTMwNGgxMS43MzljNS4wNTgzIDAgOS4xMzA0IDQuMDcyMiA5LjEzMDQgOS4xMzA0cy00LjA3MjIgOS4xMzA0LTkuMTMwNCA5LjEzMDRoLTExLjczOXoiIGZpbGw9IiNmOWY5ZjkiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"dia\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"dia.desktop\"\nLABEL oc.launch=\"dia-gnome.Dia-gnome\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Dia\"\nLABEL oc.displayname=\"Dia\"\nLABEL oc.path=\"/usr/bin/dia\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-dia-diagram;\"\nLABEL oc.fileextensions=\"dia\"\nLABEL oc.legacyfileextensions=\"dia\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Dia\"\nENV APPBIN \"/usr/bin/dia\"\nENV APP \"/usr/bin/dia\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/dia/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/dia/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Dia

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Dia.d\n
"},{"location":"applications/dia/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Dia.d -t Dia .\n
"},{"location":"applications/dia/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Dia > Dia.json\ndocker image save Dia -o Dia.tar\nctr -n k8s.io images import Dia.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Dia.json\n\n
"},{"location":"applications/doom/","title":"doom","text":""},{"location":"applications/doom/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/doom/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/doom/#ubuntu-packages","title":"Ubuntu packages","text":"
chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus\n
"},{"location":"applications/doom/#displayname","title":"Displayname","text":"
Doom\n
"},{"location":"applications/doom/#path","title":"Path","text":"
/usr/games/doom\n
"},{"location":"applications/doom/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/doom/#wm_class","title":"WM_CLASS","text":"
chocolate-doom.chocolate-doom\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/doom/#json-dump","title":"JSON dump","text":"

json source file doom.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus\",\n    \"icon\": \"doom.svg\",\n    \"keyword\": \"doom\",\n    \"launch\": \"chocolate-doom.chocolate-doom\",\n    \"name\": \"doom\",\n    \"displayname\": \"Doom\",\n    \"path\": \"/usr/games/doom\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/doom/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output doom.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/doom.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @doom.d.3.0.json\n\n
"},{"location":"applications/doom/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"doom.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzgyMzA1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzhhMjgwNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0yNCA5Yy04LjI4NCAwLTE1IDYuNzE2LTE1IDE1czYuNzE2IDE1IDE1IDE1IDE1LTYuNzE2IDE1LTE1LTYuNzE2LTE1LTE1LTE1em0wIDJjMi4zMDggMCA0LjQ2NSAwLjYwMiA2LjM0NCAxLjY1NmwtNi4zNDQgNC40MDYtNi4zNDQtNC40MDZjMS44NzktMS4wNTUgNC4wNC0xLjY1NiA2LjM0NC0xLjY1NnptLTcuMDk0IDIuMTI1Yy0wLjI0NCAwLjE1OS0wLjQ4NiAwLjMyNS0wLjcxOSAwLjUgMC4yMzMtMC4xNzUgMC40NzQtMC4zNCAwLjcxOS0wLjV6bTE0LjE4OCAwYzAuMjQ0IDAuMTYgMC40ODYgMC4zMjUgMC43MTkgMC41LTAuMjMzLTAuMTc1LTAuNDc1LTAuMzQxLTAuNzE5LTAuNXptLTE0LjIxOSAxLjM3NSA1LjQwNiAzLjc1LTMuMzc1IDIuMzQ0em0xNC4yNSAwLTIuMDMxIDYuMDk0LTMuMzc1LTIuMzQ0em0tMTYuMjUgMC4yNSAyLjM0NCA3LjAzLTYuMDYgNC4yMTljLTAuMS0wLjY1LTAuMTU2LTEuMzIyLTAuMTU2LTIgMC0zLjYyMiAxLjQ4NS02Ljg5MyAzLjg3NS05LjI1em0xOC4yNSAwYzIuMzkgMi4zNTcgMy44NzUgNS42MjggMy44NzUgOS4yNSAwIDAuNjc4LTAuMDU2IDEuMzUtMC4xNTYgMmwtNi4wNi00LjIxOSAyLjM0NC03LjAzem0tOS4xMjUgNC43MTlsNC40MzggMy4wOTQtMS40NjkgNC40MzhoLTUuOTM4bC0xLjQ2OS00LjQzOHptLTYuMTI1IDQuMjUgMS4wOTQgMy4yODFoLTUuODEzem0xMi4yNSAwIDQuNzE5IDMuMjgxaC01LjgxM3ptLTE4Ljk2OSAyLjMxM2MwLjA4IDAuNTEzIDAuMjA1IDEuMDEgMC4zNDQgMS41IDAuMTE0IDAuNDA1IDAuMjU1IDAuOCAwLjQwNiAxLjE4OC0wLjE1Mi0wLjM4OS0wLjI5Mi0wLjc4Mi0wLjQwNi0xLjE4OC0wLjEzOC0wLjQ5LTAuMjY0LTAuOTg5LTAuMzQ0LTEuNXptMjUuNjg4IDBjLTAuMDggMC41MTEtMC4yMDYgMS4wMS0wLjM0NCAxLjUtMC4xMTQgMC40MDYtMC4yNTUgMC43OTktMC40MDYgMS4xODggMC4xNTEtMC4zODggMC4yOTItMC43ODMgMC40MDYtMS4xODggMC4xMzktMC40OTEgMC4yNjQtMC45ODcgMC4zNDQtMS41em0tMjQuODQ0IDIuOTY5aDcuNjI1bDIuNjI1IDcuODc1YzAuMjM0IDAuMDMxIDAuNDggMC4wNDIgMC43MTkgMC4wNjMtMC4yNDItMC4wMTktMC40ODEtMC4wMzEtMC43MTktMC4wNjMtNC42NDgtMC42MjMtOC41MDYtMy42ODktMTAuMjUtNy44NzV6bTkuNzE5IDBoNC41NjNsLTIuMjgxIDYuODc1LTIuMjgxLTYuODc1em02LjY1NiAwaDcuNjI1Yy0xLjc0NCA0LjE4Ni01LjYwMiA3LjI1Mi0xMC4yNSA3Ljg3NS0wLjIzOCAwLjAzMi0wLjQ3NyAwLjA0NC0wLjcxOSAwLjA2MyAwLjIzOS0wLjAyMSAwLjQ4NS0wLjAzMSAwLjcxOS0wLjA2M3oiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8cGF0aCBkPSJtMjQgOGMtOC4yODQgMC0xNSA2LjcxNi0xNSAxNXM2LjcxNiAxNSAxNSAxNSAxNS02LjcxNiAxNS0xNS02LjcxNi0xNS0xNS0xNXptMCAyYzIuMzA4IDAgNC40NjUgMC42MDIgNi4zNDQgMS42NTZsLTYuMzQ0IDQuNDA2LTYuMzQ0LTQuNDA2YzEuODc5LTEuMDU1IDQuMDQtMS42NTYgNi4zNDQtMS42NTZ6bS03LjA5NCAyLjEyNWMtMC4yNDQgMC4xNTktMC40ODYgMC4zMjUtMC43MTkgMC41IDAuMjMzLTAuMTc1IDAuNDc0LTAuMzQgMC43MTktMC41em0xNC4xODggMGMwLjI0NCAwLjE2IDAuNDg2IDAuMzI1IDAuNzE5IDAuNS0wLjIzMy0wLjE3NS0wLjQ3NS0wLjM0MS0wLjcxOS0wLjV6bS0xNC4yMTkgMS4zNzUgNS40MDYgMy43NS0zLjM3NSAyLjM0NHptMTQuMjUgMC0yLjAzMSA2LjA5NC0zLjM3NS0yLjM0NHptLTE2LjI1IDAuMjUgMi4zNDQgNy4wMy02LjA2IDQuMjE5Yy0wLjEtMC42NS0wLjE1Ni0xLjMyMi0wLjE1Ni0yIDAtMy42MjIgMS40ODUtNi44OTMgMy44NzUtOS4yNXptMTguMjUgMGMyLjM5IDIuMzU3IDMuODc1IDUuNjI4IDMuODc1IDkuMjUgMCAwLjY3OC0wLjA1NiAxLjM1LTAuMTU2IDJsLTYuMDYtNC4yMTkgMi4zNDQtNy4wM3ptLTkuMTI1IDQuNzE5bDQuNDM4IDMuMDk0LTEuNDY5IDQuNDM4aC01LjkzOGwtMS40NjktNC40Mzh6bS02LjEyNSA0LjI1IDEuMDk0IDMuMjgxaC01LjgxM3ptMTIuMjUgMCA0LjcxOSAzLjI4MWgtNS44MTN6bS0xOC45NjkgMi4zMTNjMC4wOCAwLjUxMyAwLjIwNSAxLjAxIDAuMzQ0IDEuNSAwLjExNCAwLjQwNSAwLjI1NSAwLjggMC40MDYgMS4xODgtMC4xNTItMC4zODktMC4yOTItMC43ODItMC40MDYtMS4xODgtMC4xMzgtMC40OS0wLjI2NC0wLjk4OS0wLjM0NC0xLjV6bTI1LjY4OCAwYy0wLjA4IDAuNTExLTAuMjA2IDEuMDEtMC4zNDQgMS41LTAuMTE0IDAuNDA2LTAuMjU1IDAuNzk5LTAuNDA2IDEuMTg4IDAuMTUxLTAuMzg4IDAuMjkyLTAuNzgzIDAuNDA2LTEuMTg4IDAuMTM5LTAuNDkxIDAuMjY0LTAuOTg3IDAuMzQ0LTEuNXptLTI0Ljg0NCAyLjk2OWg3LjYyNWwyLjYyNSA3Ljg3NWMwLjIzNCAwLjAzMSAwLjQ4IDAuMDQyIDAuNzE5IDAuMDYzLTAuMjQyLTAuMDE5LTAuNDgxLTAuMDMxLTAuNzE5LTAuMDYzLTQuNjQ4LTAuNjIzLTguNTA2LTMuNjg5LTEwLjI1LTcuODc1em05LjcxOSAwaDQuNTYzbC0yLjI4MSA2Ljg3NS0yLjI4MS02Ljg3NXptNi42NTYgMGg3LjYyNWMtMS43NDQgNC4xODYtNS42MDIgNy4yNTItMTAuMjUgNy44NzUtMC4yMzggMC4wMzItMC40NzcgMC4wNDQtMC43MTkgMC4wNjMgMC4yMzktMC4wMjEgMC40ODUtMC4wMzEgMC43MTktMC4wNjN6IiBzdHlsZT0iZmlsbDojZGM3ZDQxIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"doom,doom\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"chocolate-doom.chocolate-doom\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"doom\"\nLABEL oc.displayname=\"Doom\"\nLABEL oc.path=\"/usr/games/doom\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"doom\"\nENV APPBIN \"/usr/games/doom\"\nENV APP \"/usr/games/doom\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/doom/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/doom/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application doom

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/doom.d\n
"},{"location":"applications/doom/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f doom.d -t doom .\n
"},{"location":"applications/doom/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect doom > doom.json\ndocker image save doom -o doom.tar\nctr -n k8s.io images import doom.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @doom.json\n\n
"},{"location":"applications/draw/","title":"draw","text":""},{"location":"applications/draw/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.libreoffice

"},{"location":"applications/draw/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/draw/#alpine-packages","title":"Alpine packages","text":"
libreoffice-gnome\n
"},{"location":"applications/draw/#arguments","title":"Arguments","text":"

\"--draw\"

"},{"location":"applications/draw/#displayname","title":"Displayname","text":"
Draw\n
"},{"location":"applications/draw/#path","title":"Path","text":"
/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/draw/#uniquerunkey","title":"uniquerunkey","text":"

\"libreoffice\"

"},{"location":"applications/draw/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/draw/#mimetype","title":"Mimetype","text":"
application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\n
"},{"location":"applications/draw/#file-extensions","title":"File extensions","text":"

\"odp;otg\"

"},{"location":"applications/draw/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"odp;otg\"

"},{"location":"applications/draw/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/draw/#wm_class","title":"WM_CLASS","text":"
libreoffice.libreoffice-draw\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/draw/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/libreoffice-draw.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/draw/#json-dump","title":"JSON dump","text":"

json source file draw.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_draw.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-draw\",\n    \"name\": \"draw\",\n    \"displayname\": \"Draw\",\n    \"showinview\": \"dock\",\n    \"args\": \"--draw\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\",\n    \"fileextensions\": \"odp;otg\",\n    \"legacyfileextensions\": \"odp;otg\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-draw.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/draw/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output draw.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/draw.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @draw.d.3.0.json\n\n
"},{"location":"applications/draw/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_draw.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5LDAsMCwyLjE0MjksLTgyNi4zNiwtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzg4OWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MTk5OTg3NCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjMyLjAyIiB4Mj0iMzIuMDIiIHkxPSIyLjA0MyIgeTI9IjYyLjA0NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmU4MDAyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZDAwNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2Y1ZDIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmVmY2ViIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZjZjllNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDNlLTggLTEuOTI2NWUtOCAtLjk0MDM0IDgwLjQ1MyAzOC42MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjExODAuMiIgeDI9IjExODAuMiIgeTE9IjY4OC41MyIgeTI9IjY1OC4xMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNjA2MDUgMCAwIC42MDY2OCAtNjkwLjg3IC0zODIuOCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmN2IzZCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTRlNGUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMTA1NyIgeDI9IjEwNTciIHkxPSItMTA3My42IiB5Mj0iLTExMjEuNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNDk5OTkgMCAwIC0uNSAtNDkxLjk5IC01MTMuODIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkMDQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWM0YTAwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjExNjIuNiIgeDI9IjExNjIuNiIgeTE9IjkwMS4xNiIgeTI9Ijg4Ny40MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMzNDksMCwwLDEuMjU2OSwtMTUyMy43LC0xMDg3LjcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMWI4MTgiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYTY0IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImoiIHg9Ii0uMDc5NzUzIiB5PSItLjA5NzQ3NiIgd2lkdGg9IjEuMTU5NSIgaGVpZ2h0PSIxLjE5NSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43MzEwNjYyNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9Im0iIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzk5OTk5OTkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJsIiB4PSItLjA2MDAzMSIgeT0iLS4wNTk5NjkiIHdpZHRoPSIxLjEyMDEiIGhlaWdodD0iMS4xMTk5IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjUwMDI1NTI1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9InVybCgjZykiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbC1vcGFjaXR5PSIwIi8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZikiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zNyAyNy4wMWExMCAxMC4wMSAwIDAgMS0xMCAxMC4wMSAxMCAxMC4wMSAwIDAgMS0xMC0xMC4wMSAxMCAxMC4wMSAwIDAgMSAxMC0xMC4wMSAxMCAxMC4wMSAwIDAgMSAxMCAxMC4wMXoiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCBkPSJtMzcgMjcuMDFhMTAgMTAuMDEgMCAwIDEtMTAgMTAuMDEgMTAgMTAuMDEgMCAwIDEtMTAtMTAuMDEgMTAgMTAuMDEgMCAwIDEgMTAtMTAuMDEgMTAgMTAuMDEgMCAwIDEgMTAgMTAuMDF6IiBmaWxsPSJ1cmwoI2kpIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICA8cGF0aCBkPSJtMzIgMzloMTZ2LTE2aC0xNnoiIGZpbHRlcj0idXJsKCNtKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPHBhdGggZD0ibTMyIDM5aDE2di0xNmgtMTZ6IiBmaWxsPSJ1cmwoI2gpIi8+CiAgPHBhdGggZD0ibTM5IDQ1aC0yMmwxMS0xOHoiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjI1IiBzdHJva2U9IiNjOTljMDAiLz4KICA8cGF0aCBkPSJtMzkgNDVoLTIybDExLTE4eiIgZmlsbD0idXJsKCNhKSIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMSkiIGZpbGw9IiM5MmUyODUiIHN0cm9rZT0iIzE4YTMwMyI+CiAgPHJlY3QgeD0iMTUuNSIgeT0iNDMuNSIgd2lkdGg9IjMiIGhlaWdodD0iMyIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgeD0iMzcuNSIgeT0iNDMuNDk3IiB3aWR0aD0iMyIgaGVpZ2h0PSIzLjAwMyIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgeD0iMjYuNSIgeT0iMjUuNSIgd2lkdGg9IjMiIGhlaWdodD0iMy4wMDMiIG9wYWNpdHk9Ii43NSIvPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"draw,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-draw.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-draw\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--draw\"\nLABEL oc.name=\"draw\"\nLABEL oc.displayname=\"Draw\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\"\nLABEL oc.fileextensions=\"odp;otg\"\nLABEL oc.legacyfileextensions=\"odp;otg\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"draw\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--draw\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/draw/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/draw/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application draw

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/draw.d\n
"},{"location":"applications/draw/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f draw.d -t draw .\n
"},{"location":"applications/draw/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect draw > draw.json\ndocker image save draw -o draw.tar\nctr -n k8s.io images import draw.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @draw.json\n\n
"},{"location":"applications/drawio/","title":"drawio","text":""},{"location":"applications/drawio/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/drawio/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/drawio/#ubuntu-packages","title":"Ubuntu packages","text":"
libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin\n
"},{"location":"applications/drawio/#displayname","title":"Displayname","text":"
draw.io\n
"},{"location":"applications/drawio/#path","title":"Path","text":"
/opt/drawio/drawio\n
"},{"location":"applications/drawio/#mimetype","title":"Mimetype","text":"
application/vnd.jgraph.mxfile;application/vnd.visio;\n
"},{"location":"applications/drawio/#file-extensions","title":"File extensions","text":"

\"drawio\"

"},{"location":"applications/drawio/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"drawio\"

"},{"location":"applications/drawio/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/drawio/#wm_class","title":"WM_CLASS","text":"
draw.io.draw.io\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/drawio/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/drawio.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/drawio/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/drawio/#json-dump","title":"JSON dump","text":"

json source file drawio.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"debpackage\": \"libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin\",\n    \"icon\": \"circle_drawio.svg\",\n    \"launch\": \"draw.io.draw.io\",\n    \"name\": \"drawio\",\n    \"displayname\": \"draw.io\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/opt/drawio/drawio\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"application/vnd.jgraph.mxfile;application/vnd.visio;\",\n    \"fileextensions\": \"drawio\",\n    \"legacyfileextensions\": \"drawio\",\n    \"desktopfile\": \"/usr/share/applications/drawio.desktop\",\n    \"postruncommands\": [\n        \"RUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\"\n    ]\n}\n
"},{"location":"applications/drawio/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output drawio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/drawio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @drawio.d.3.0.json\n\n
"},{"location":"applications/drawio/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_drawio.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iQ2FsY3VsYXRvciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTQzNSIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjUyMC4zMiIgeDI9IjUyMC4zMiIgeTE9Ii0xMzguNDYiIHkyPSIxNDg0LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2MzYzMyAwIDAgLjA2MzYzMyAtLjU2NzYxIC0uNTM4OTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRhNjQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmI3YzM4IiBvZmZzZXQ9Ii4zNTE1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmI3YzM4IiBvZmZzZXQ9Ii40NDk3NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjM0ZjE3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzYzMyAwIDAgLjA2MzYzMyAtLjU2NzYxIC0uNTM4OTcpIiBkPSJtOTgzLjI1IDUxMS4zNWMwLTcuOTUtMC4yLTE1Ljg1LTAuNS0yMy41NXEtOC0xODAuMTUtMTM3LjU1LTMwOS44NWMtOTIuMDUtOTItMjAzLjItMTM4LjA1LTMzMy40LTEzOC4wNS0xMzAuMTUgMC0yNDEuMzUgNDYuMDUtMzMzLjM1IDEzOC4wNS05Mi4wNSA5Mi0xMzguMSAyMDMuMi0xMzguMSAzMzMuNCAwIDEzMC4xNSA0Ni4wNSAyNDEuMzUgMTM4LjEgMzMzLjM1IDg2LjE1IDg2LjMgMTg5LjM1IDEzMi4xNSAzMDkuMTUgMTM3LjYgOCAwLjMgMTYgMC41IDI0LjIgMC41IDEzMC4yIDAgMjQxLjM1LTQ2LjEgMzMzLjQtMTM4LjEgOTItOTIgMTM4LjA1LTIwMy4yIDEzOC4wNS0zMzMuMzV6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiLz4KIDxwYXRoIGQ9Im02MiAzMmMwLTAuNTA1ODgtMC4wMTI3My0xLjAwODYtMC4wMzE4Mi0xLjQ5ODZxLTAuNTA5MDYtMTEuNDY0LTguNzUyNy0xOS43MTdjLTUuODU3NC01Ljg1NDMtMTIuOTMtOC43ODQ2LTIxLjIxNS04Ljc4NDYtOC4yODE5IDAtMTUuMzU4IDIuOTMwMy0yMS4yMTIgOC43ODQ2LTUuODU3NCA1Ljg1NDMtOC43ODc3IDEyLjkzLTguNzg3NyAyMS4yMTUgMCA4LjI4MTkgMi45MzAzIDE1LjM1OCA4Ljc4NzcgMjEuMjEyIDUuNDgyIDUuNDkxNSAxMi4wNDkgOC40MDkxIDE5LjY3MiA4Ljc1NTkgMC41MDkwNyAwLjAxOTA5IDEuMDE4MSAwLjAzMTgyIDEuNTM5OSAwLjAzMTgyIDguMjg1IDAgMTUuMzU4LTIuOTMzNSAyMS4yMTUtOC43ODc3IDUuODU0My01Ljg1NDMgOC43ODQ2LTEyLjkzIDguNzg0Ni0yMS4yMTJ6IiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9Ii45OTc5NiIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4wNTg4IDAgMCAxLjA1ODggLTEuODgyNCAtLjMzNTkyKSIgZmlsbD0iI2ZmZiI+CiAgPHJlY3QgeD0iMjUiIHk9IjE1IiB3aWR0aD0iMTQiIGhlaWdodD0iMTEuOCIgcng9IjMiIHJ5PSIzIi8+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAxLjU5OTUpIj4KICAgPHJlY3QgeD0iMTUiIHk9IjMyLjY2NCIgd2lkdGg9IjE0IiBoZWlnaHQ9IjExLjgiIHJ4PSIzIiByeT0iMyIvPgogICA8cmVjdCB4PSIzNSIgeT0iMzIuNjc5IiB3aWR0aD0iMTQiIGhlaWdodD0iMTEuOCIgcng9IjMiIHJ5PSIzIi8+CiAgPC9nPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC41OTgxMyAwIDAgLjgxMjMyIDEzLjM2IDQuNTQ1NSkiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIyLjg2OTMiPgogICA8cGF0aCBkPSJtMjYuNDUxIDI1Ljc3NC05LjU4ODYgMTIuNDUyIi8+CiAgIDxwYXRoIGQ9Im0zNS44NzcgMjUuNzc0IDkuNTg4NiAxMi40NTIiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"drawio\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"drawio.desktop\"\nLABEL oc.launch=\"draw.io.draw.io\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"drawio\"\nLABEL oc.displayname=\"draw.io\"\nLABEL oc.path=\"/opt/drawio/drawio\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.jgraph.mxfile;application/vnd.visio;\"\nLABEL oc.fileextensions=\"drawio\"\nLABEL oc.legacyfileextensions=\"drawio\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"drawio\"\nENV APPBIN \"/opt/drawio/drawio\"\nENV APP \"/opt/drawio/drawio\"\nRUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/drawio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/drawio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application drawio

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/drawio.d\n
"},{"location":"applications/drawio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f drawio.d -t drawio .\n
"},{"location":"applications/drawio/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect drawio > drawio.json\ndocker image save drawio -o drawio.tar\nctr -n k8s.io images import drawio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @drawio.json\n\n
"},{"location":"applications/dummy/","title":"Dummy","text":"

dummy

"},{"location":"applications/eclipse/","title":"Eclipse","text":""},{"location":"applications/eclipse/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk.java.eclipse

"},{"location":"applications/eclipse/#display-name","title":"Display name","text":"

\"Eclipse\"

"},{"location":"applications/eclipse/#path","title":"path","text":"

\"/usr/bin/eclipse\"

"},{"location":"applications/eclipse_sts4/","title":"Eclipse_Sts4","text":""},{"location":"applications/eclipse_sts4/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk.java.sts4

"},{"location":"applications/eclipse_sts4/#display-name","title":"Display name","text":"

\"Eclipse Sts4\"

"},{"location":"applications/eclipse_sts4/#path","title":"path","text":"

\"/opt/sts/SpringToolSuite4\"

"},{"location":"applications/edge/","title":"edge","text":""},{"location":"applications/edge/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/edge/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/edge/#ubuntu-packages","title":"Ubuntu packages","text":"
microsoft-edge-stable\n
"},{"location":"applications/edge/#displayname","title":"Displayname","text":"
Microsoft Edge\n
"},{"location":"applications/edge/#path","title":"Path","text":"
/usr/bin/microsoft-edge-stable\n
"},{"location":"applications/edge/#mimetype","title":"Mimetype","text":"
application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\n
"},{"location":"applications/edge/#file-extensions","title":"File extensions","text":"

\"html;xml;gif\"

"},{"location":"applications/edge/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"html;xml\"

"},{"location":"applications/edge/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/edge/#wm_class","title":"WM_CLASS","text":"
microsoft-edge.Microsoft-edge\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/edge/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/microsoft-edge.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/edge/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN curl https://packages.microsoft.com/keys/microsoft.asc  | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\" > /etc/apt/sources.list.d/edge.list\n
"},{"location":"applications/edge/#json-dump","title":"JSON dump","text":"

json source file edge.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"containerengine\": \"ephemeral_container\",\n    \"debpackage\": \"microsoft-edge-stable\",\n    \"preruncommands\": [\n        \"RUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n        \"RUN curl https://packages.microsoft.com/keys/microsoft.asc  | apt-key add -\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\\\" > /etc/apt/sources.list.d/edge.list\"\n    ],\n    \"icon\": \"circle_microsoft-edge.svg\",\n    \"keyword\": \"web,browser,internet\",\n    \"launch\": \"microsoft-edge.Microsoft-edge\",\n    \"name\": \"edge\",\n    \"displayname\": \"Microsoft Edge\",\n    \"path\": \"/usr/bin/microsoft-edge-stable\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"mimetype\": \"application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/microsoft-edge.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/edge/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output edge.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/edge.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @edge.d.3.0.json\n\n
"},{"location":"applications/edge/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN curl https://packages.microsoft.com/keys/microsoft.asc  | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\" > /etc/apt/sources.list.d/edge.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends microsoft-edge-stable && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_microsoft-edge.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MzIiIHgxPSIxMS43ODgiIHgyPSI1Mi43NDkiIHkxPSIyNS4xMDYiIHkyPSIyNS4xMDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMjAyIDAgMCAxLjAyMDIgLS45MjE0NiAtLjY2MzU1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDBiZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVmZGU1NiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTQwIiB4MT0iMTEuODA0IiB4Mj0iMzAuNzQzIiB5MT0iMzYuMjU0IiB5Mj0iMzYuMjU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDIwMiAwIDAgMS4wMjAyIC0uOTIxNDYgLS42NjM1NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwNzhkNCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMDhkZGMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0OCIgeDE9IjIxLjE4MiIgeDI9IjQ5LjcxMiIgeTE9IjQwLjI0MyIgeTI9IjQwLjI0MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAyMDIgMCAwIDEuMDIwMiAtLjkyMTQ2IC0uNjYzNTUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwYjRlOTAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMGQ1NTlkIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk4MC02IiB4PSItLjE1NzE3IiB5PSItLjA4MjI2NSIgd2lkdGg9IjEuMzE0MyIgaGVpZ2h0PSIxLjE2NDUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTUxNTE0OCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk2OS03IiB4PSItLjA3OTQyMSIgeT0iLS4xNjg3IiB3aWR0aD0iMS4xNTg4IiBoZWlnaHQ9IjEuMzM3NCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44NjA1MzI0NyIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjkwOC01IiB4PSItLjEwOCIgeT0iLS4xMDgiIHdpZHRoPSIxLjIxNiIgaGVpZ2h0PSIxLjIxNiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS44ODA1MTkyIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNDA4LjI1IiB4Mj0iNDA3Ljk0IiB5MT0iNTQ3LjYiIHkyPSI0OTguODkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4zMjc2LDAsMCwxLjMyNzYsLTUxMC42NCwtNjYzLjUyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U2ZTZlNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44ODk3MjQ0OSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPHBhdGggZD0ibTMxLjk5OCAxMi4yNDhjLTExLjQyNi0wLjAwMTEtMjAuNzMyIDkuMTcyOC0yMC44OTMgMjAuNTk2IDAuMDA2My0wLjQ4MzIyIDAuMDYzODgtMC45NjA3IDAuMTQ0NTMtMS40MzU1LTAuMDc0NjggMC40ODk0NC0wLjEyNjk1IDAuOTc4MzctMC4xMjY5NSAxLjQ2MDktMC4wMjgyNiAzLjE1NTYgMC42NDY4MiA2LjI3NjcgMS45NzY2IDkuMTM4NyA0LjQ5ODMgOS41OTY1IDE1LjQ3MiAxNC4zMDUgMjUuNTI3IDEwLjk1My0wLjE4MTY4IDAuMDU3MjgtMC4zNzU5NyAwLjA5MjA0LTAuNTYyNSAwLjE0MDYyIDAuMTgyOTgtMC4wNDkxNyAwLjM4Mjk3LTAuMDk2NiAwLjU0MTAyLTAuMTQ2NDhsMC4yMTQ4NC0wLjA3MjI3YzQuNDk3NS0xLjU1NDYgOC4zMzE0LTQuNTkzNSAxMC44NzEtOC42MTcyIDAuMzYyNzMtMC41NzE0Mi0wLjI3NzQ2LTEuMjQ4Ni0wLjg2OTE0LTAuOTE5OTItMi4wMDI0IDEuOTcwMS01LjEwOCAyLjQzNzEtNy41ODAxIDIuNDQ5Mi03LjcyNDIgMC0xNC40NTMtNS45Mzg1LTE0LjQ1My0xMi43NTYgMC4wMjAxNC0xLjg2MTkgMS4wNDc5LTMuNTY2OSAyLjY4MzYtNC40NTcgMC41MDkyOS0wLjIzOTkyIDEuMzc3OC0wLjY3NTUyIDIuNTM1Mi0wLjY1NDMgMS42NTI5IDAuMDEyMDkgMy4yMDQ3IDAuNzk4NTQgNC4xOTM0IDIuMTIzIDAuNDQ5MTMgMC41OTk2IDAuNzUwMTYgMS4yODc3IDAuOTA4MiAyLjAxMTcgMC4wNDQxNyAxLjI4MDktMC4zMTMwMyAyLjQ3NjctMS4xMzg3IDMuNTU0Ny0wLjEzMjIyIDAuMTcxMzctMC41MzkwNiAwLjQwODA4LTAuNTM5MDYgMC45MjM4MyAwIDAuNDI1OTggMC4yNzY1NyAwLjgzNTMxIDAuNzY5NTMgMS4xNzk3IDIuMzQ3MyAxLjYzMjEgNi43NzM3IDEuNDE4IDYuNzg1MiAxLjQxOCAxLjczOTMtMC4wMDQyIDMuNDQ2LTAuNDc1MjcgNC45NDE0LTEuMzYzMyAzLjA2OTctMS43OTIyIDQuOTU5NS00LjE1MDkgNC45NjY4LTcuNzA1MSAwLjA0MjQzLTMuNjU3Ni0xLjMwNjQtNi4wOTA4LTEuODUxNi03LjE2OC0zLjQ1ODktNi43NjUxLTEwLjkyNi0xMC42NTQtMTkuMDQ1LTEwLjY1NHptNS4zOTQ1IDQxLjAyMWMtMC4wNTM2NyAwLjAxMDczLTAuMTA2MiAwLjAyMzE2LTAuMTYwMTYgMC4wMzMyIDAuMDUyODgtMC4wMTE0OCAwLjEwODA2LTAuMDIxNDUgMC4xNjAxNi0wLjAzMzJ6IiBmaWx0ZXI9InVybCgjZmlsdGVyOTA4LTUpIiBvcGFjaXR5PSIuMiIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTQ4LjgyMyA0Mi41OTljLTIuMDAyNCAxLjk3MDEtNS4xMDg1IDIuNDM3Ny03LjU4MDYgMi40NDk5LTcuNzI0MiAwLTE0LjQ1My01LjkzOTMtMTQuNDUzLTEyLjc1NyAwLjAyMDE0LTEuODYxOSAxLjA0NjItMy41NjcyIDIuNjgxOS00LjQ1NzMtNi45ODY0IDAuMjkzNzgtOC43ODIgNy41NzMtOC43ODIgMTEuODM4IDAgMTIuMDU4IDExLjExNSAxMy4yODEgMTMuNTA5IDEzLjI4MSAxLjI5MTIgMCAzLjIzODYtMC4zNzUzOSA0LjQwNzMtMC43NDQyNGwwLjIxMzg0LTAuMDcxODFjNC40OTc1LTEuNTU0NiA4LjMzMTYtNC41OTM5IDEwLjg3MS04LjYxNzYgMC4zNjI3My0wLjU3MTQxLTAuMjc2NzItMS4yNDkyLTAuODY4NC0wLjkyMDUxeiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDk0OCkiIHN0cm9rZS13aWR0aD0iLjc0NjI4Ii8+CiA8cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Im0yNy43MzcgNTAuOTAzYy0xLjQ1NTktMC45MDM1NC0yLjcxNzctMi4wODc1LTMuNzExOS0zLjQ4MjktNC44MjQzLTYuNjA4Ny0xLjg5MzYtMTUuOTcgNS40NDctMTkuNTg1IDAuNTA5MjktMC4yMzk5MiAxLjM3OTMtMC42NzQwNiAyLjUzNjctMC42NTI4NCAxLjY1MjkgMC4wMTIwOSAzLjIwNDggMC43OTcyNCA0LjE5MzUgMi4xMjE3IDAuNjU5MTggMC44ODAwMSAxLjAyMjYgMS45NDYyIDEuMDM4MiAzLjA0NTUgMC0wLjAzNDI3IDMuOTkyNy0xMi45OTItMTMuMDU5LTEyLjk5Mi03LjE2NiAwLTEzLjA1OSA2Ljc5OTQtMTMuMDU5IDEyLjc2NS0wLjAyODI2IDMuMTU1NiAwLjY0NzAxIDYuMjc3OSAxLjk3NjggOS4xMzk4IDQuNDk4MyA5LjU5NjUgMTUuNDcxIDE0LjMwNSAyNS41MjYgMTAuOTUzLTMuNDQyNCAxLjA4NTItNy44MTQzIDAuNjA4MDYtMTAuODc1LTEuMzA1N3oiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5NDApIiBzdHJva2Utd2lkdGg9Ii43NDYyOCIvPgogPHBhdGggZD0ibTI0LjE2NCAyMC42MDJjLTYuNDgxMSAwLTEyIDQuNjc2MS0xMi45MTQgMTAuMDYyLTAuMDg0NiAwLjcxNjI5LTAuMTM0MTcgMS40NDI4LTAuMTQ0NTMgMi4xNzk3IDAuMDc4MzYtNS45NjM3IDYuMDA2OS0xMS40OTYgMTMuMDU5LTExLjQ5NiAwLjU3MTMyIDAgMy44MjkxIDAuMDU0NTMgNi44NTU1IDEuNjQyNiAyLjY2NzIgMS40MDA0IDQuMDY1OSAzLjgwODIgNS4wMzcxIDUuNDg0NCAwLjYyNzI0IDEuMTgzNCAwLjk3MDYyIDIuMzE5OSAxLjA0MSAzLjQwMDQgMC4wODE0NS0xLjI5NjUtMC4yNjk2MS0yLjY4NzQtMS4wNDMtNC4xNDY1LTAuOTcxMjQtMS42NzYyLTIuMzY3OS00LjA4NC01LjAzNTItNS40ODQ0LTMuMDI2NC0xLjU4ODEtNi4yODQyLTEuNjQyNi02Ljg1NTUtMS42NDI2eiIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjk2OS03KSIgb3BhY2l0eT0iLjM1IiBzdHJva2Utd2lkdGg9Ii43NDYyOCIvPgogPHBhdGggZD0ibTI0Ljc5NSAxOS4xOTFjLTEuMDgyOSAwLTIuMTMxOCAwLjE3MDg2LTMuMTQwNiAwLjQ1NTA4IDAuODE4ODItMC4xODQyOCAxLjY2MzQtMC4yODkwNiAyLjUyNzMtMC4yODkwNiAxMy4xMTEgMCAxMy43NzYgNy42NDI5IDEzLjM4NSAxMS4xOTkgMC4xODAxIDAuNTIwNiAwLjI3OTIyIDEuMDY5MyAwLjI4NzExIDEuNjI3IDAtMC4wMzQyNyAzLjk5MjgtMTIuOTkyLTEzLjA1OS0xMi45OTJ6bTYuMTc5NyA4LjEwMzVjLTAuNjQ0MjUgMC4xMzk2NC0xLjE2MDMgMC4zODAwNS0xLjUwMiAwLjU0MTAyLTcuMzQwNiAzLjYxNTUtMTAuMjcyIDEyLjk3NS01LjQ0NzMgMTkuNTg0IDAuOTk0MjMgMS4zOTU1IDIuMjU1IDIuNTgwOCAzLjcxMDkgMy40ODQ0bDAuMDE1NjMgMC4wMDU5YzMuMDYwMiAxLjkxMzcgNy40MzI2IDIuMzg5OSAxMC44NzUgMS4zMDQ3LTAuNDQ4MjggMC4xNDk0MS0wLjkwMDI5IDAuMjYzMi0xLjM1MTYgMC4zODA4NiAwLjY1NjY3LTAuMTUwMjggMS4zMTE5LTAuMzI5OSAxLjk2MjktMC41NDY4OC0zLjQ0MjQgMS4wODUyLTcuODEyOCAwLjYwOTA2LTEwLjg3My0xLjMwNDdsLTAuMDE1NjMtMC4wMDc4Yy0xLjQ1NTktMC45MDM1NC0yLjcxNjctMi4wODY5LTMuNzEwOS0zLjQ4MjQtNC44MjQzLTYuNjA4Ny0xLjg5NTMtMTUuOTcgNS40NDUzLTE5LjU4NiAwLjIyNDg5LTAuMTA1OTQgMC41MzEzNy0wLjI0NzI5IDAuODkwNjItMC4zNzMwNXoiIGZpbHRlcj0idXJsKCNmaWx0ZXI5ODAtNikiIG9wYWNpdHk9Ii4zNSIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KIDxwYXRoIGNsYXNzPSJjbHMtNSIgZD0ibTM1Ljk3IDM0Ljg3MmMtMC4xMzIyMiAwLjE3MTM3LTAuNTM4NjcgMC40MDgwMy0wLjUzODY3IDAuOTIzNzggMCAwLjQyNTk4IDAuMjc3NSAwLjgzNTY0IDAuNzcwNDYgMS4xOCAyLjM0NzMgMS42MzIxIDYuNzcyNiAxLjQxNjcgNi43ODQgMS40MTY3IDEuNzM5My0wLjAwNDIgMy40NDU2LTAuNDc0OCA0Ljk0MTEtMS4zNjI4IDMuMDY5Ny0xLjc5MjIgNC45NTk5LTQuMTUxNSA0Ljk2NzItNy43MDU3IDAuMDQyNDQtMy42NTc2LTEuMzA1OS02LjA4OTQtMS44NTExLTcuMTY2Ni0zLjQ1ODktNi43NjUxLTEwLjkyNS0xMC42NTYtMTkuMDQ0LTEwLjY1Ni0xMS40MjYtMC4wMDExLTIwLjczMyA5LjE3NDQtMjAuODk0IDIwLjU5NyAwLjA3ODM2LTUuOTYzNyA2LjAwNy0xMS40OTcgMTMuMDU5LTExLjQ5NyAwLjU3MTMyIDAgMy44Mjk1IDAuMDU1NDkgNi44NTU4IDEuNjQzNSAyLjY2NzIgMS40MDA0IDQuMDY0NSAzLjgwNzkgNS4wMzU4IDUuNDg0MSAxLjQxMTcgMi42NjMzIDEuNDcyNCA1LjEwOTQtMC4wODQ4OCA3LjE0MjZ6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTMyKSIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"edge,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"microsoft-edge.desktop\"\nLABEL oc.launch=\"microsoft-edge.Microsoft-edge\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"edge\"\nLABEL oc.displayname=\"Microsoft Edge\"\nLABEL oc.path=\"/usr/bin/microsoft-edge-stable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"edge\"\nENV APPBIN \"/usr/bin/microsoft-edge-stable\"\nENV APP \"/usr/bin/microsoft-edge-stable\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/edge/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/edge/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application edge

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/edge.d\n
"},{"location":"applications/edge/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f edge.d -t edge .\n
"},{"location":"applications/edge/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect edge > edge.json\ndocker image save edge -o edge.tar\nctr -n k8s.io images import edge.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @edge.json\n\n
"},{"location":"applications/elementary.terminal/","title":"elementary.terminal","text":""},{"location":"applications/elementary.terminal/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.elementary

"},{"location":"applications/elementary.terminal/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/elementary.terminal/#ubuntu-packages","title":"Ubuntu packages","text":"
io.elementary.terminal io.elementary.stylesheet\n
"},{"location":"applications/elementary.terminal/#path","title":"Path","text":"
/usr/bin/io.elementary.terminal\n
"},{"location":"applications/elementary.terminal/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/elementary.terminal/#wm_class","title":"WM_CLASS","text":"
io.elementary.terminal.Io.elementary.terminal\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/elementary.terminal/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/io.elementary.terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/elementary.terminal/#json-dump","title":"JSON dump","text":"

json source file

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"io.elementary.terminal io.elementary.stylesheet\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"terminal,bash,shell,cmd\",\n    \"launch\": \"io.elementary.terminal.Io.elementary.terminal\",\n    \"name\": \"elementary.terminal\",\n    \"path\": \"/usr/bin/io.elementary.terminal\",\n    \"args\": \"\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.elementary\",\n    \"desktopfile\": \"/usr/share/applications/io.elementary.terminal.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/elementary.terminal/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output elementary.terminal.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/elementary.terminal.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @elementary.terminal.json\n\n
"},{"location":"applications/elementary.terminal/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.elementary:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends io.elementary.terminal io.elementary.stylesheet && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"elementary.terminal,terminal,bash,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"io.elementary.terminal.desktop\"\nLABEL oc.launch=\"io.elementary.terminal.Io.elementary.terminal\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.elementary\"\nLABEL oc.name=\"elementary.terminal\"\nLABEL oc.displayname=\"elementary.terminal\"\nLABEL oc.path=\"/usr/bin/io.elementary.terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"elementary.terminal\"\nENV APPBIN \"/usr/bin/io.elementary.terminal\"\nENV APP \"/usr/bin/io.elementary.terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/elementary.terminal/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/elementary.terminal/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application elementary.terminal

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/elementary.terminal.d\n
"},{"location":"applications/elementary.terminal/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f elementary.terminal.d -t elementary.terminal .\n
"},{"location":"applications/elementary.terminal/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect elementary.terminal > elementary.terminal.json\ndocker image save elementary.terminal -o elementary.terminal.tar\nctr -n k8s.io images import elementary.terminal.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @elementary.terminal.json\n\n
"},{"location":"applications/eog/","title":"eog","text":""},{"location":"applications/eog/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/eog/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/eog/#alpine-packages","title":"Alpine packages","text":"
eog\n
"},{"location":"applications/eog/#path","title":"Path","text":"
/usr/bin/eog\n
"},{"location":"applications/eog/#mimetype","title":"Mimetype","text":"
image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\n
"},{"location":"applications/eog/#file-extensions","title":"File extensions","text":"

\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"

"},{"location":"applications/eog/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"

"},{"location":"applications/eog/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/eog/#wm_class","title":"WM_CLASS","text":"
eog.Eog\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/eog/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.eog.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/eog/#json-dump","title":"JSON dump","text":"

json source file eog.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"eog\",\n    \"icon\": \"circle_eog.svg\",\n    \"keyword\": \"eog,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"eog.Eog\",\n    \"name\": \"eog\",\n    \"path\": \"/usr/bin/eog\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\",\n    \"fileextensions\": \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\",\n    \"legacyfileextensions\": \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.eog.desktop\",\n    \"usedefaultapplication\": true,\n    \"quick\": true\n}\n
"},{"location":"applications/eog/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output eog.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/eog.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @eog.d.3.0.json\n\n
"},{"location":"applications/eog/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update eog\nLABEL oc.icon=\"circle_eog.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iUHJldmlldyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkN2Q3ZDciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4wMzE4IiB5PSItLjA0MTQ3OCIgd2lkdGg9IjEuMDYzNiIgaGVpZ2h0PSIxLjA4MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNy4yMjIxNTUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzMTQ2NSIgeT0iLS4wNDIwNjMiIHdpZHRoPSIxLjA2MjkiIGhlaWdodD0iMS4wODQxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI2LjQyNjIxIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iNTE5LjIiIHgyPSI1MTkuMiIgeTE9IjEwMjQuOCIgeTI9IjQuOCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk3MjQgMCAwIC45OTcxOSAuOTEwNzcgMS45NjI4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGQ0ZDRkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQxNDE0MSIgb2Zmc2V0PSIuMDE5NTUxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMTEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iNTM4LjU2IiB4Mj0iNTM4LjU2IiB5MT0iLTIxLjEzIiB5Mj0iOTY0LjM3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0NzkuMSIgeDI9IjQ4MC41OSIgeTE9Ii0yOC44NDEiIHkyPSI5NjQuMzciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xMTUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImkiIHgxPSI0NDguNzciIHgyPSI0ODEuNTgiIHkxPSI0MTguNCIgeTI9Ijc2NS44NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmM1YmUwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYzYTVmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI1MzguMDQiIHgyPSI1MzguMDQiIHkxPSIyNzguNjIiIHkyPSI2MDIuNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmQ1N2NkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzUyOTRlZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCAtLjY3OCkiPgogIDxwYXRoIGQ9Im03OTcuNzEgMTM5LjEzcS02MC41MzMtNDYuNjE5LTEzMi40My03MS40NDktNzQuMjk1LTI1LjY3OC0xNTMuNzMtMjUuNjc4Yy0yNTkuODggMC00NzAuNTUgMjEwLjY2LTQ3MC41NSA0NzAuNTIgMCAyMzcuNzMgMTc2LjM2IDQzNC4xOCA0MDUuMzMgNDY1Ljk0IDExLjE2OSAxLjU0NTYgMjIuNDg4IDIuNzQyMyAzMy44NTYgMy40NDAzIDEwLjM3MSAwLjY0ODE3IDIwLjc5MyAxLjA5NjkgMzEuMzYzIDEuMDk2OSAyNTkuODMgMCA0NzAuNDUtMjEwLjY2IDQ3MC40NS00NzAuNDggMC0yMC41NDItMS4yOTY0LTQwLjgzNS0zLjgzOTQtNjAuNjI5LTIuOTQxOS0yMy4xMzUtNy43Mjg2LTQ1LjYyMi0xMy44NjItNjcuNTFxLTIwLjg0Mi03My41NDMtNjQuMDIzLTEzNi44Ni00Mi42ODItNjIuMzc0LTEwMi41Ny0xMDguMzl6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS42NCIvPgogIDxwYXRoIGQ9Im03OTcuNzEgMTM5LjEzcS02MC41MzMtNDYuNjE5LTEzMi40My03MS40NDktNzQuMjk1LTI1LjY3OC0xNTMuNzMtMjUuNjc4Yy0yNTkuODggMC00NzAuNTUgMjEwLjY2LTQ3MC41NSA0NzAuNTIgMCAyMzcuNzMgMTc2LjM2IDQzNC4xOCA0MDUuMzMgNDY1Ljk0IDExLjE2OSAxLjU0NTYgMjIuNDg4IDIuNzQyMyAzMy44NTYgMy40NDAzIDEwLjM3MSAwLjY0ODE3IDIwLjc5MyAxLjA5NjkgMzEuMzYzIDEuMDk2OSAyNTkuODMgMCA0NzAuNDUtMjEwLjY2IDQ3MC40NS00NzAuNDggMC0yMC41NDItMS4yOTY0LTQwLjgzNS0zLjgzOTQtNjAuNjI5LTIuOTQxOS0yMy4xMzUtNy43Mjg2LTQ1LjYyMi0xMy44NjItNjcuNTFxLTIwLjg0Mi03My41NDMtNjQuMDIzLTEzNi44Ni00Mi42ODItNjIuMzc0LTEwMi41Ny0xMDguMzl6IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjE1LjY0Ii8+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjkzNTcxIDAgMCAuOTM1NzEgNDQuMTE2IDg3LjczMSkiIGZpbHRlcj0idXJsKCNnKSIgb3ZlcmZsb3c9InZpc2libGUiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgIDxnIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgICAgPHBhdGggZD0ibTc4OC4zMiA1ODAuNjZ2LTM2Ni41N2wtNDkwLjE3LTAuMDkydjM2Ni41N3oiIGZpbGw9IiMxZDFkMWIiIGZpbGwtb3BhY2l0eT0iLjMiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im03NTcuNjggNjAyLjQgMC4wODYtMzIzLjY5LTQzOS4zNi0wLjA4NjEtMC4wODYxIDMyMy43N3oiIGZpbGw9InVybCgjZCkiIHN0cm9rZS13aWR0aD0iMTQuNjc1Ii8+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjkzNTcxIDAgMCAuOTM1NzEgNDQuMTE2IDg3LjczMSkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTc3Mi45OCA1NjAuNDJ2LTM2Ni42MmwtNDkwLjI0LTAuMDkydjM2Ni42MnptLTIwLjY5NS0yMC42OTQtNDQ4Ljg1LTAuMDkydi0zMjUuMjNsNDQ4Ljg1IDAuMDkyeiIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiLz4KICAgPC9nPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTM1NzEgMCAwIC45MzU3MSA0NC4xMTYgODcuNzMxKSIgZmlsdGVyPSJ1cmwoI2gpIiBvdmVyZmxvdz0idmlzaWJsZSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgICA8cGF0aCBkPSJtNzYxLjI3IDY5Ny43OS0zOC4yNTctMzY0LjY0LTUwNi44MSA1My4yNDcgMzguMzQ5IDM2NC42NHoiIGZpbGw9IiMxZDFkMWIiIGZpbGwtb3BhY2l0eT0iLjMiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im0yMzcuMTYgNDQzLjg3IDMzLjgyMyAzMjEuOTcgNDU1LjAyLTQ3Ljc2NS0zMy45MDktMzIxLjk3eiIgZmlsbD0idXJsKCNpKSIgc3Ryb2tlLXdpZHRoPSIxNC42NzUiLz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTM1NzEgMCAwIC45MzU3MSA0NC4xMTYgODcuNzMxKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8cGF0aCBkPSJtNzQwLjA1IDY4Mi44NC0zOC4yNjMtMzY0LjY5LTUwNi44OCA1My4yNTUgMzguMjYzIDM2NC42OXptLTU2Ljc1LTM0MS44OCAzNC4wMzEgMzIzLjM5LTQ2NS42OCA0OC45MzItMzQuMDMxLTMyMy4zOXoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgIDwvZz4KICA8L2c+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMTUuNjgzIDAgMCAxNS42ODMgOS42MzMzIDEwLjYzMykiIGQ9Im00NCAzNS40MzUtNC4yMDMxIDQuNjI3My0yLjc5My0wLjQzMzU5LTEuOTA4MiAyLjIzMjQtMy42MTcyLTAuNDA2MjUtMy40OTgtMi41OTU3LTQuNTkzOCAzLjc4NzEtMi4wMDk4LTIuMDQzLTQuNjM3MSAyLjM5NjUgMC40NzMgNC40NzIzIDI3Ljc4NC0yLjkxOTR6IiBmaWxsPSIjM2M2OGQ5IiBzdHJva2Utd2lkdGg9Ii45MzU3MSIvPgogPC9nPgogPGNpcmNsZSBjeD0iMzgiIGN5PSIzMS41IiByPSIyLjUiIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgb3BhY2l0eT0iLjc1IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8cGF0aCBkPSJtNDQgMzUuNDM2LTQuMjAzMSA0LjYyNy0yLjc5My0wLjQzMzU5IDIuOTk2MSAxLjY0MjYgMy00LjI3MTV2MS43MTA5bDEtMy4yNzU0em0tNi45OTYxIDQuMTkzNC0xLjkwODIgMi4yMzI0LTMuNjE3Mi0wLjQwNjI1LTMuNDc4NS0yLjQ1NTEgMyA1IDItMiAyIDEgMi4wMDM5LTMuMzcxMXptLTkuMDIzNC0wLjc2OTUzLTQuNTkzOCAzLjc4NzEtMi4wMDk4LTIuMDQzIDEuOTc4NSA0LjM5NjUgNC42MjUtNi4xNDA2em0tNi42MDM1IDEuNzQ0MS00LjYzNjcgMi4zOTY1IDAuMTU4MiAxLjQ4NDQgMC4xMDE1Ni0wLjA2MDU0NyAxLjY0NDUtMS44NDc3IDAuMTAxNTYgMS4xMzQ4IDIuNjMwOS0zLjEwNzR6IiBvcGFjaXR5PSIuMDUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"eog,eog,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.gnome.eog.desktop\"\nLABEL oc.launch=\"eog.Eog\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"eog\"\nLABEL oc.displayname=\"eog\"\nLABEL oc.path=\"/usr/bin/eog\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\"\nLABEL oc.fileextensions=\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"\nLABEL oc.legacyfileextensions=\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"eog\"\nENV APPBIN \"/usr/bin/eog\"\nENV APP \"/usr/bin/eog\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/eog/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/eog/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application eog

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/eog.d\n
"},{"location":"applications/eog/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f eog.d -t eog .\n
"},{"location":"applications/eog/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect eog > eog.json\ndocker image save eog -o eog.tar\nctr -n k8s.io images import eog.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @eog.json\n\n
"},{"location":"applications/evince/","title":"Evince","text":""},{"location":"applications/evince/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/evince/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/evince/#alpine-packages","title":"Alpine packages","text":"
evince\n
"},{"location":"applications/evince/#path","title":"Path","text":"
/usr/bin/evince\n
"},{"location":"applications/evince/#mimetype","title":"Mimetype","text":"
application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\n
"},{"location":"applications/evince/#file-extensions","title":"File extensions","text":"

\"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\"

"},{"location":"applications/evince/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"pdf;ps;dvi\"

"},{"location":"applications/evince/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/evince/#wm_class","title":"WM_CLASS","text":"
evince.Evince\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/evince/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Evince.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/evince/#json-dump","title":"JSON dump","text":"

json source file evince.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"evince\",\n    \"icon\": \"circle_acroread.svg\",\n    \"keyword\": \"evince,pdf,viewer\",\n    \"launch\": \"evince.Evince\",\n    \"name\": \"Evince\",\n    \"path\": \"/usr/bin/evince\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\",\n    \"fileextensions\": \"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\",\n    \"legacyfileextensions\": \"pdf;ps;dvi\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Evince.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/evince/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output evince.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evince.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evince.d.3.0.json\n\n
"},{"location":"applications/evince/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update evince\nLABEL oc.icon=\"circle_acroread.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMjkuOTY0IiB4Mj0iMjkuOTY0IiB5MT0iMi42OTE0IiB5Mj0iNjEuOTk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC00LjczNTEgMCAwIDQuNzQxIDkzLjYxMSAtNDkwNC41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYzYxNDIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RjMmI0MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMiIgeDI9IjMyIiB5MT0iMiIgeTI9IjYyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNzE1OSA5LjIxOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYmU1ZTUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMTkuMjg5IiB4Mj0iMTkuMjg5IiB5MT0iMi43OTg4IiB5Mj0iMjcuNDQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNSAwIDAgMS41IC01NzUuNTcgLTc1My43NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5N2NmMSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMGJjZmEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZSIgeD0iLS4wMzcwOTYiIHk9Ii0uMDM0OTY2IiB3aWR0aD0iMS4wNzQyIiBoZWlnaHQ9IjEuMDY5OSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44NjQwNzc2MiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU0OTY0IiB5PSItLjAyNjc2NSIgd2lkdGg9IjEuMTA5OSIgaGVpZ2h0PSIxLjA1MzUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMjc0ODE5MzMiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mjc0NSAwIDAgLjA2Mjc0NSAtLjEyNTQ5IC0uMTI1NDkpIiBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzguMTIiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjkzOCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPHBhdGggZD0ibTM4LjU4OCAyLjY5MTRjLTE4LjIzMyAxNC45NTktMzAuMTE2IDE4Ljk5OS0zNS4xMzkgMTkuODUtMC42NDQzMiAxLjk4NDMtMS4wNzkzIDQuMDU1My0xLjI5MSA2LjIxODggMy4wMjA1LTAuNDE2OSAxMC4yNjctMS44MDY2IDE4LTYuNDU3IDEwLjA2OC02LjA1NTIgMjIuMTA1LTE3LjU1MSAyMi4xMDUtMTcuNTUxLTMuMjgyNyA2LjE4MjgtNC4zMDY3IDI4LjU4NS00LjM4MDkgNTYuNzEzIDAuMDY2NjEtMC4wMTI0NSAwLjEzNjg3LTAuMDIwMzQgMC4yMDMxMy0wLjAzMzIgMC41MDUyOS0wLjA5ODUxIDEuMDAzMy0wLjIxMDU0IDEuNDg2My0wLjMyODEyIDUuMTM1Ni0xLjI5MDMgOS42Njk5LTMuOTE2MyAxMy42NDMtNy44ODg3IDEuODY1Ny0xLjg2NTcgMy40Mjk3LTMuODU1OSA0LjcwMTItNS45Njg4LTEuNzY0Mi01Ljg1Ny0zLjE1MzctMTIuMjc1LTQuMzA0Ny0xOC4yNzMtMC45MjA0Ni02LjcwNjgtMC41NTAwMy0xMi44ODYgMC4xMDE1Ni0xNy42NTYtMC4xNjc5Mi0wLjE3NTE4LTAuMzIzMDYtMC4zNTYyNy0wLjQ5NjA5LTAuNTI5My00LjIzNC00LjIzNC05LjExNTUtNi45MjIyLTE0LjYyOS04LjA5NTd6bS0zNi41NzQgMjkuOTA0YzAuMDQwMzczIDIuMzQyOSAwLjMxMDU3IDQuNTkwMSAwLjgyNjE3IDYuNzM2MyA4LjQ2NTUgMC41Njc3MSAyMS4xNTcgOS41MTE1IDI3LjE5NyAyMi42MDcgMC4wNjM3MiAwLjAwMzcgMC4xMjU1OCAwLjAxMjI3IDAuMTg5NDUgMC4wMTU2M2gwLjAyNTM5YzAuNTQwMjUgMC4wMjg2IDEuMDU0NSAwLjA0NDkyIDEuNTU2NiAwLjA0NDkyaDAuMTkxNDFjMC42NTQ2OSAwIDEuMzAxOS0wLjAxOSAxLjkxMjEtMC4wNTA3OCAwLjE1ODktMC4wMDk1IDAuMzAxNTgtMC4wMTk3NyAwLjQ0MTQxLTAuMDI5MyAwLjQxMjM2LTAuMDI5NiAwLjgxNTc1LTAuMDc4NTggMS4yMjA3LTAuMTIzMDUtNC43MTMyLTEzLjc0MS0yNy4xMTQtMjkuMTgxLTMzLjU2MS0yOS4yMDF6IiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0zOC41ODggMi42OTE0Yy0xOC4yMzMgMTQuOTU5LTMwLjExNiAxOC45OTktMzUuMTM5IDE5Ljg1LTAuNjQ0MzIgMS45ODQzLTEuMDc5MyA0LjA1NTMtMS4yOTEgNi4yMTg4IDMuMDIwNS0wLjQxNjkgMTAuMjY3LTEuODA2NiAxOC02LjQ1NyAxMC4wNjgtNi4wNTUyIDIyLjEwNS0xNy41NTEgMjIuMTA1LTE3LjU1MS0zLjI4MjcgNi4xODI4LTQuMzA2NyAyOC41ODUtNC4zODA5IDU2LjcxMyAwLjA2NjYxLTAuMDEyNDUgMC4xMzY4Ny0wLjAyMDM0IDAuMjAzMTMtMC4wMzMyIDAuNTA1MjktMC4wOTg1MSAxLjAwMzMtMC4yMTA1NCAxLjQ4NjMtMC4zMjgxMiA1LjEzNTYtMS4yOTAzIDkuNjY5OS0zLjkxNjMgMTMuNjQzLTcuODg4NyAxLjg2NTctMS44NjU3IDMuNDI5Ny0zLjg1NTkgNC43MDEyLTUuOTY4OC0xLjc2NDItNS44NTctMy4xNTM3LTEyLjI3NS00LjMwNDctMTguMjczLTAuOTIwNDYtNi43MDY4LTAuNTUwMDMtMTIuODg2IDAuMTAxNTYtMTcuNjU2LTAuMTY3OTItMC4xNzUxOC0wLjMyMzA2LTAuMzU2MjctMC40OTYwOS0wLjUyOTMtNC4yMzQtNC4yMzQtOS4xMTU1LTYuOTIyMi0xNC42MjktOC4wOTU3em0tMzYuNTc0IDI5LjkwNGMwLjA0MDM3MyAyLjM0MjkgMC4zMTA1NyA0LjU5MDEgMC44MjYxNyA2LjczNjMgOC40NjU1IDAuNTY3NzEgMjEuMTU3IDkuNTExNSAyNy4xOTcgMjIuNjA3IDAuMDYzNzIgMC4wMDM3IDAuMTI1NTggMC4wMTIyNyAwLjE4OTQ1IDAuMDE1NjNoMC4wMjUzOWMwLjU0MDI1IDAuMDI4NiAxLjA1NDUgMC4wNDQ5MiAxLjU1NjYgMC4wNDQ5MmgwLjE5MTQxYzAuNjU0NjkgMCAxLjMwMTktMC4wMTkgMS45MTIxLTAuMDUwNzggMC4xNTg5LTAuMDA5NSAwLjMwMTU4LTAuMDE5NzcgMC40NDE0MS0wLjAyOTMgMC40MTIzNi0wLjAyOTYgMC44MTU3NS0wLjA3ODU4IDEuMjIwNy0wLjEyMzA1LTQuNzEzMi0xMy43NDEtMjcuMTE0LTI5LjE4MS0zMy41NjEtMjkuMjAxeiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYykiLz4KIDxwYXRoIGQ9Im0yNS4yODkgMi43OTg4YTMwIDMwIDAgMCAwLTEyIDUuNzU1OXYxOC44ODdsNi0zLjQ2NDggNiAzLjQ2NDh2LTI0LjY0M3oiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCBkPSJtMjUuMjg5IDIuNzk4OGEzMCAzMCAwIDAgMC0xMiA1Ljc1NTl2MTguODg3bDYtMy40NjQ4IDYgMy40NjQ4di0yNC42NDN6IiBmaWxsPSJ1cmwoI2EpIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"evince,evince,pdf,viewer\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Evince.desktop\"\nLABEL oc.launch=\"evince.Evince\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Evince\"\nLABEL oc.displayname=\"Evince\"\nLABEL oc.path=\"/usr/bin/evince\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\"\nLABEL oc.fileextensions=\"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\"\nLABEL oc.legacyfileextensions=\"pdf;ps;dvi\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Evince\"\nENV APPBIN \"/usr/bin/evince\"\nENV APP \"/usr/bin/evince\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/evince/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/evince/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Evince

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Evince.d\n
"},{"location":"applications/evince/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Evince.d -t Evince .\n
"},{"location":"applications/evince/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Evince > Evince.json\ndocker image save Evince -o Evince.tar\nctr -n k8s.io images import Evince.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Evince.json\n\n
"},{"location":"applications/evolution/","title":"evolution","text":""},{"location":"applications/evolution/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/evolution/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/evolution/#ubuntu-packages","title":"Ubuntu packages","text":"
evolution dbus-x11\n
"},{"location":"applications/evolution/#displayname","title":"Displayname","text":"
Evolution\n
"},{"location":"applications/evolution/#path","title":"Path","text":"
/usr/bin/evolution\n
"},{"location":"applications/evolution/#mimetype","title":"Mimetype","text":"
text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\n
"},{"location":"applications/evolution/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/evolution/#wm_class","title":"WM_CLASS","text":"
evolution.Evolution\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/evolution/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Evolution.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/evolution/#json-dump","title":"JSON dump","text":"

json source file evolution.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"evolution dbus-x11\",\n    \"icon\": \"evolution.svg\",\n    \"keyword\": \"evolution,mail\",\n    \"launch\": \"evolution.Evolution\",\n    \"name\": \"evolution\",\n    \"displayname\": \"Evolution\",\n    \"path\": \"/usr/bin/evolution\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Evolution.desktop\"\n}\n
"},{"location":"applications/evolution/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output evolution.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evolution.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evolution.d.3.0.json\n\n
"},{"location":"applications/evolution/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends evolution dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"evolution.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzlhYTI5YSIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiNWJlYjUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSI2LjcwMyIgY3k9IjczLjYxNiIgcj0iNy4yMjgiIGdyYWRpZW50VHJhbnNmb3JtPSJzY2FsZSgxLjkwMjIgLjUyNTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iMCIvPgogICAgPC9yYWRpYWxHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjguNzgiIHgyPSI5Ljc2MiIgeTE9IjM3Ljc4NSIgeTI9IjMyLjIwMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjM5NDkgMCAwIC43ODEwNiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1vcGFjaXR5PSIuMTI5Ii8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMTEuMjMzIiB4Mj0iMjEuMTEyIiB5MT0iMTMuNjg2IiB5Mj0iMjQuMTMzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzcwOSAwIDAgMS40NDM4IDIuNDMxIC0uMTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNlZGVkZWQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSI4LjkxNiIgeDI9IjkuODg2IiB5MT0iMzcuMTk3IiB5Mj0iNTIuMDkxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNDU0OCAwIDAgLjc2MiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjEwLjE4NCIgeDI9IjE1LjMxMSIgeTE9IjE1LjE0OCIgeTI9IjI5LjU2OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjgxOTMgMCAwIDEuMDI4MiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNkY2RjZGMiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI1LjgyNyIgeDI9IjEzLjQ2NyIgeTE9IjcuMjMxIiB5Mj0iMTcuODc3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTcwNiAwIDAgMS4xOTEgMi44OCAuMzQzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNlZGVkZWQiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYzhjOGM4Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMTEuNTczIiB4Mj0iMTguNDc1IiB5MT0iNC43NDYiIHkyPSIyNi4wMjMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4zNDM1IDAgMCAxLjQxNzkgMi44OCAuMzE1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZTJlMmUyIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMi4wNjIiIHgyPSIzMC42IiB5MT0iMTUuMjU3IiB5Mj0iMTUuMjU3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzQzNSAwIDAgMS40MTc5IDIuODggLjMxNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjOTg5NjkwIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzY1NjQ2MCIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPHBhdGggZmlsbD0idXJsKCNiKSIgZD0iTTI2LjUgMzguN2ExMy43NSAzLjggMCAxIDEtMjcuNSAwIDEzLjc1IDMuOCAwIDEgMSAyNy41IDB6IiBjb2xvcj0iIzAwMCIgb3BhY2l0eT0iLjQ1NiIgdHJhbnNmb3JtPSJtYXRyaXgoMS44MDA2IDAgMCAxLjk3NDggMS4wODQgLTM4LjAxMykiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2MpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0idXJsKCNkKSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIuODU3IiBkPSJNNi4zMzMgMTYuOTcydjI0LjUxaDM2Ljk3M2wtLjA2Mi0yNC4zOTJjLS4wMDMtMS4zNzgtMTEuODQ4LTE0LjY3OC0xNC4wMzMtMTQuNjc4SDIwLjY2Yy0yLjI5NyAwLTE0LjMyNiAxMy4yNjItMTQuMzI2IDE0LjU2eiIvPgogIDxwYXRoIGZpbGw9InVybCgjZSkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTYuOTIzIDE2Ljc4N2MtLjM5OC0uNDMgMTEuODg3LTEzLjY5NCAxMy43NDQtMTMuNjk0aDguMzc2YzEuNzQ3IDAgMTQuMDM3IDEzLjEyOCAxMy40MjcgMTMuODg2TDMxLjYxIDMwLjQ3NGwtMTIuMzE1LS4zMTgtMTIuMzcyLTEzLjM3eiIvPgogIDxwYXRoIGZpbGwtb3BhY2l0eT0iLjE0NiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTkuMDc4IDMwLjAxOGwtNy4zMzMtOC43NDYgMjQuODE4LTYuOTM2IDMuMDI5IDYuMjE2LTcuNDE2IDkuNDQiLz4KICA8cGF0aCBmaWxsLW9wYWNpdHk9Ii4xNDYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTE4LjI5MiAyOS44MzZsLTcuNDgzLTguODEgMjQuNjQ4LTYuODkzIDMuMTc0IDYuMjcxLTcuMjQxIDkuNDA3Ii8+CiAgPHBhdGggZmlsbC1vcGFjaXR5PSIuMTQ2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xOC43NzUgMjkuOTU3bC03LjY3NS04LjY2IDI0Ljk2OC03LjA2NSAzLjI4NiA2LjU5My03LjQ4IDkuMTA3Ii8+CiAgPHBhdGggZmlsbD0idXJsKCNmKSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTguNTk0IDMwLjQ0MWwtNy4zMzMtOC43NDYgMjQuNzEyLTYuODk0IDMuMTEgNi4zODgtNy4xMiA4Ljk4NiIvPgogIDxwYXRoIGZpbGw9InVybCgjZykiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTIwLjQ4OCAyOS4wNjRMNy4wOTIgNDAuMDM2bDEzLjkwOS05LjYwNGg5LjAxOGwxMi40MiA5LjQ4Mi0xMS44NjQtMTAuODVIMjAuNDg4eiIvPgogIDxwYXRoIGZpbGw9InVybCgjZykiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTYuOTYzIDE2Ljg4NUwxOC40OCAzMS4yMDFsMS4wNjgtLjg1NEw2Ljk2NCAxNi44ODV6IiBjb2xvcj0iIzAwMCIvPgogIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNoKSIgc3Ryb2tlLXdpZHRoPSIuODU3IiBkPSJNNy4zMDggMTcuMTMxbC4wMyAyMy4yMTFoMzQuOTQ2bC0uMDYzLTIzLjA4NGMtLjAwMi0uNzUtMTEuMjE2LTEzLjc5OS0xMy4zODQtMTMuNzk5aC03Ljg5NWMtMi4yNTMgMC0xMy42MzUgMTIuODkyLTEzLjYzNCAxMy42NzJ6Ii8+CiAgPHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMjAuOTU3IDMwLjQ1M0w5LjAxNiAzOC43MjRsMi4yMTkuMDA2IDkuOTk4LTYuODY5IDguODIyLTEuNDIzLTkuMDk4LjAxNXptLTkuNTI5LTguNzgzbDEuMzI0IDEuNDExIDIyLjc5MS02Ljg4NCAyLjkxNSA1LjY4Mi42MTQtLjcxMi0zLjA2OS02LjM3OC0yNC41NzUgNi44ODF6Ii8+CiAgPHBhdGggZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTMuMzA4IDIzLjYzNmw2LjAyNiA2LjQ1NCAxLjE5Ny0xLjAyNiAxMC4wODcuMDQzLjgxMi43MjcgMy45NzUtNC43NDRjLTEuMTU0LTEuNDExLTIyLjA5Ny0xLjQ1NC0yMi4wOTctMS40NTR6Ii8+CiAgPHBhdGggZmlsbD0iI2IxYjFiMSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNDEuODEzIDE3Ljg0OGwtOS45NTIgMTIuNjMxLTEuMDY4LS44NTUgMTEuMDItMTEuNzc2eiIgY29sb3I9IiMwMDAiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"evolution,evolution,mail\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Evolution.desktop\"\nLABEL oc.launch=\"evolution.Evolution\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"evolution\"\nLABEL oc.displayname=\"Evolution\"\nLABEL oc.path=\"/usr/bin/evolution\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"evolution\"\nENV APPBIN \"/usr/bin/evolution\"\nENV APP \"/usr/bin/evolution\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/evolution/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/evolution/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application evolution

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evolution.d\n
"},{"location":"applications/evolution/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f evolution.d -t evolution .\n
"},{"location":"applications/evolution/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect evolution > evolution.json\ndocker image save evolution -o evolution.tar\nctr -n k8s.io images import evolution.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evolution.json\n\n
"},{"location":"applications/file-roller/","title":"file-roller","text":""},{"location":"applications/file-roller/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/file-roller/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/file-roller/#ubuntu-packages","title":"Ubuntu packages","text":"
file-roller\n
"},{"location":"applications/file-roller/#displayname","title":"Displayname","text":"
file-roller\n
"},{"location":"applications/file-roller/#path","title":"Path","text":"
/usr/bin/file-roller\n
"},{"location":"applications/file-roller/#mimetype","title":"Mimetype","text":"
application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\n
"},{"location":"applications/file-roller/#file-extensions","title":"File extensions","text":"

\"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\"

"},{"location":"applications/file-roller/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/file-roller/#wm_class","title":"WM_CLASS","text":"
file-roller.File-roller\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/file-roller/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.FileRoller.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/file-roller/#json-dump","title":"JSON dump","text":"

json source file file-roller.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"file-roller\",\n    \"icon\": \"circle_file-roller.svg\",\n    \"keyword\": \"zip,tar,gz,tgz,unzip,compress,7zip,7z,iso\",\n    \"launch\": \"file-roller.File-roller\",\n    \"name\": \"file-roller\",\n    \"displayname\": \"file-roller\",\n    \"path\": \"/usr/bin/file-roller\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"mimetype\": \"application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\",\n    \"fileextensions\": \"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\",\n    \"args\": \"\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/org.gnome.FileRoller.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/file-roller/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output file-roller.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/file-roller.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @file-roller.d.3.0.json\n\n
"},{"location":"applications/file-roller/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends file-roller && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_file-roller.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijk5LjAzNiIgeDI9Ijk5LjAzNiIgeTE9Ii0uNTA0NzIiIHkyPSIxOTkuODQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC42ODY2IDAgMCA0LjY4NjYgNDIuODQgNzIuMTk4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWNkNWI5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UyY2E4NyIgb2Zmc2V0PSIuNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDZhYTM3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjUwMCIgeDI9IjUwMCIgeTE9IjI1Mi4zNiIgeTI9IjgwNi4wMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAtNC44Mjk0IDExLjUxOCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYmViZWIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wNTgyNTEiIHk9Ii0uMDI2MDUiIHdpZHRoPSIxLjExNjUiIGhlaWdodD0iMS4wNTIxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI1LjU1NzI0MjIiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMDU5ODYzIi8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC05ODguMzYpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDY0MDEyIDAgMCAuMDY0MDEyIC0uNzQyMjYgOTg1Ljc0KSIgc3Ryb2tlLXdpZHRoPSIxNS42MjIiPgogICA8Y2lyY2xlIGN4PSI1MTEuNSIgY3k9IjU0MC44NiIgcj0iNDY4LjY2IiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KICAgPGNpcmNsZSBjeD0iNTExLjUiIGN5PSI1NDAuODYiIHI9IjQ2OC42NiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgLTQuODI5NCAxMS41MTgpIiBkPSJtNjAyLjgzIDU3Mi42MmgtMi43NjU0di00OS43MzhoLTMxLjA4NnYtNDkuNzM4aC00OS43Mzh2LTQ5LjczOGg0OS43Mzh2LTQ5LjczOGgtNDkuNzM4di00OS43MzhoNDkuNzM4di00OS43MzhoLTYyLjE3MnY0OS43MzhoLTQ5LjczOHY0OS43MzhoNDkuNzM4djQ5LjczOGgtNDkuNzM4djQ5LjczOGg0OS43Mzh2NDkuNzM4aC04MC44MjR2NDkuNzM4aC0yLjc2NTRsLTI0LjY3NiAxNjQuNTEgMTE0LjQ4IDQ5LjA2NCAxMTQuNDgtNDkuMDY0em0tODkuODA1IDE1OS40Ni01OS42LTI1LjU0MyAxMi42MjYtODQuMThoOTMuOTQ2bDEyLjYyNiA4NC4xOHoiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iMTkuNDI1Ii8+CiAgIDxwYXRoIGlkPSJYTUxJRF8xMDczXyIgZD0ibTU5NS42NSA1NzEuOTRoLTIuNzU0NnYtNDkuNTQ0aC0zMC45NjV2LTQ5LjU0NGgtNDkuNTQ0di00OS41NDRoNDkuNTQ0di00OS41NDRoLTQ5LjU0NHYtNDkuNTQ0aDQ5LjU0NHYtNDkuNTQ0aC02MS45Mjl2NDkuNTQ0aC00OS41NDR2NDkuNTQ0aDQ5LjU0NHY0OS41NDRoLTQ5LjU0NHY0OS41NDRoNDkuNTQ0djQ5LjU0NGgtODAuNTA4djQ5LjU0NGgtMi43NTQ2bC0yNC41OCAxNjMuODcgMTE0LjA0IDQ4Ljg3MiAxMTQuMDQtNDguODcyem0tODkuNDU1IDE1OC44NC01OS4zNjctMjUuNDQzIDEyLjU3Ny04My44NTFoOTMuNTc5bDEyLjU3NyA4My44NTF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjE5LjM0OSIvPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"file-roller,zip,tar,gz,tgz,unzip,compress,7zip,7z,iso\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.gnome.FileRoller.desktop\"\nLABEL oc.launch=\"file-roller.File-roller\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"file-roller\"\nLABEL oc.displayname=\"file-roller\"\nLABEL oc.path=\"/usr/bin/file-roller\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\"\nLABEL oc.fileextensions=\"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"file-roller\"\nENV APPBIN \"/usr/bin/file-roller\"\nENV APP \"/usr/bin/file-roller\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/file-roller/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/file-roller/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application file-roller

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/file-roller.d\n
"},{"location":"applications/file-roller/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f file-roller.d -t file-roller .\n
"},{"location":"applications/file-roller/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect file-roller > file-roller.json\ndocker image save file-roller -o file-roller.tar\nctr -n k8s.io images import file-roller.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @file-roller.json\n\n
"},{"location":"applications/filelight/","title":"filelight","text":""},{"location":"applications/filelight/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/filelight/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/filelight/#ubuntu-packages","title":"Ubuntu packages","text":"
filelight\n
"},{"location":"applications/filelight/#displayname","title":"Displayname","text":"
Filelight\n
"},{"location":"applications/filelight/#path","title":"Path","text":"
/usr/bin/filelight\n
"},{"location":"applications/filelight/#mimetype","title":"Mimetype","text":"
inode/directory;\n
"},{"location":"applications/filelight/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/filelight/#wm_class","title":"WM_CLASS","text":"
filelight.filelight\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/filelight/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.kde.filelight.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/filelight/#json-dump","title":"JSON dump","text":"

json source file filelight.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"filelight\",\n    \"icon\": \"filelight.svg\",\n    \"keyword\": \"disk,space,file,system,usage,volume,storage\",\n    \"launch\": \"filelight.filelight\",\n    \"name\": \"filelight\",\n    \"displayname\": \"Filelight\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/filelight\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"inode/directory;\",\n    \"fileextensions\": \"\",\n    \"args\": \"\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.filelight.desktop\"\n}\n
"},{"location":"applications/filelight/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output filelight.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filelight.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filelight.d.3.0.json\n\n
"},{"location":"applications/filelight/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends filelight && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"filelight.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnIGlkPSJzdmc0MzQwIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgd2lkdGg9IjQ4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogPGRlZnMgaWQ9ImRlZnM0MzQyIj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NDIzMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQ4IC4wMDIyMSkiIHgyPSI0NyIgeDE9IjEiPgogICA8c3RvcCBpZD0ic3RvcDctNTAiIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU0ZTQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDktOTYiIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8bWV0YWRhdGEgaWQ9Im1ldGFkYXRhNDM0NSI+CiAgPHJkZjpSREY+CiAgIDxjYzpXb3JrIHJkZjphYm91dD0iIj4KICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgPGRjOnR5cGUgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIvPgogICAgPGRjOnRpdGxlLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZyBpZD0iZzIxIj4KICA8cGF0aCBpZD0icGF0aDIzIiBzdHlsZT0ib3BhY2l0eTowLjAyIiBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIvPgogIDxwYXRoIGlkPSJwYXRoMjUiIHN0eWxlPSJvcGFjaXR5Oi4wNSIgZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6Ii8+CiAgPHBhdGggaWQ9InBhdGgyNyIgc3R5bGU9Im9wYWNpdHk6LjEiIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIvPgogPC9nPgogPHJlY3QgaWQ9InJlY3Q0MjI5IiBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDIzMSkiIHJ4PSI0IiB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiBoZWlnaHQ9IjQ2IiB3aWR0aD0iNDYiIHk9IjEiIHg9Ii00NyIvPgogPGcgaWQ9Imc1NyI+CiAgPGcgaWQ9Imc1OSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMTAwNC40KSI+CiAgIDxwYXRoIGlkPSJwYXRoNjEiIHN0eWxlPSJvcGFjaXR5Oi4xIiBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6Ii8+CiAgPC9nPgogPC9nPgogPHBhdGggaWQ9InBhdGgzNyIgc3R5bGU9ImZpbGwtb3BhY2l0eTowLjA5ODtmaWxsLXJ1bGU6ZXZlbm9kZCIgZD0ibTM5IDI0LjIwNWExNCAxNCAwIDAgMCAtNC4xIC0xMC4xMWwtOS45IDkuODk4IDEzLjE1NiA0Ljc4OWExNCAxNCAwIDAgMCAwLjg0MiAtNC41ODR6bS0xLjc4MSA2LjI0LTEyLjIxNy00LjQ0NXYxM2ExMyAxMyAwIDAgMCAxMi4yMTUgLTguNTU5bS00LjMxNi0xNy4zNDZhMTQgMTQgMCAwIDAgLTE2LjkgLTIuMjI1IDE0IDE0IDAgMCAwIC02LjUyMyAxNS43NDggMTQgMTQgMCAwIDAgMTMuNTIzIDEwLjM3N3YtMTRsOS45LTkuOXoiLz4KIDxwYXRoIGlkPSJwYXRoMzkiIHN0eWxlPSJmaWxsOiNlMzhjNTM7ZmlsbC1ydWxlOmV2ZW5vZGQiIGQ9Im0yMyAzNS45OTVhMTQgMTQgMCAwIDEgLTEzLjUyMyAtMTAuMzc3IDE0IDE0IDAgMCAxIDYuNTIzIC0xNS43NDcgMTQgMTQgMCAwIDEgMTYuOSAyLjIyNGwtOS45IDkuOSIvPgogPHBhdGggaWQ9InBhdGg0MSIgc3R5bGU9ImZpbGw6IzU5YTNjODtmaWxsLXJ1bGU6ZXZlbm9kZCIgZD0ibTM0LjkgMTMuMDk1YTE0IDE0IDAgMCAxIDMuMjU1IDE0LjY4OWwtMTMuMTU1LTQuNzg5Ii8+CiA8cGF0aCBpZD0icGF0aDQzIiBzdHlsZT0iZmlsbDojYThjZjM2O2ZpbGwtcnVsZTpldmVub2RkIiBkPSJtMzcuMjE1IDI5LjQ0MWExMyAxMyAwIDAgMSAtMTIuMjE1IDguNTU0di0xM3oiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"filelight,disk,space,file,system,usage,volume,storage\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.kde.filelight.desktop\"\nLABEL oc.launch=\"filelight.filelight\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"filelight\"\nLABEL oc.displayname=\"Filelight\"\nLABEL oc.path=\"/usr/bin/filelight\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"inode/directory;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"filelight\"\nENV APPBIN \"/usr/bin/filelight\"\nENV APP \"/usr/bin/filelight\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/filelight/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/filelight/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application filelight

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filelight.d\n
"},{"location":"applications/filelight/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f filelight.d -t filelight .\n
"},{"location":"applications/filelight/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect filelight > filelight.json\ndocker image save filelight -o filelight.tar\nctr -n k8s.io images import filelight.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filelight.json\n\n
"},{"location":"applications/filezilla/","title":"filezilla","text":""},{"location":"applications/filezilla/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/filezilla/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/filezilla/#alpine-packages","title":"Alpine packages","text":"
filezilla\n
"},{"location":"applications/filezilla/#displayname","title":"Displayname","text":"
filezilla (alpine)\n
"},{"location":"applications/filezilla/#path","title":"Path","text":"
/usr/bin/filezilla\n
"},{"location":"applications/filezilla/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/filezilla/#wm_class","title":"WM_CLASS","text":"
filezilla.Filezilla\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/filezilla/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/filezilla.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/filezilla/#json-dump","title":"JSON dump","text":"

json source file filezilla.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"filezilla\",\n    \"icon\": \"circle_filezilla.svg\",\n    \"keyword\": \"ftp,client\",\n    \"launch\": \"filezilla.Filezilla\",\n    \"name\": \"filezilla\",\n    \"displayname\": \"filezilla (alpine)\",\n    \"path\": \"/usr/bin/filezilla\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"desktopfile\": \"/usr/share/applications/filezilla.desktop\"\n}\n
"},{"location":"applications/filezilla/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output filezilla.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filezilla.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filezilla.d.3.0.json\n\n
"},{"location":"applications/filezilla/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update filezilla\nLABEL oc.icon=\"circle_filezilla.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjQyIi8+PC9maWx0ZXI+PGZpbHRlciBpZD0iYyIgeD0iLS4wNiIgeT0iLS4wNiIgd2lkdGg9IjEuMTIiIGhlaWdodD0iMS4xMiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIuNiIvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwMC41NyIgeDI9IjQwMC41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2My42NyAtMjM1LjkxKSBzY2FsZSgxLjQyODYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2UwMmQyZCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2Y3NTE1MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PGNpcmNsZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODI2LjM2IC0xMTA3LjUpIHNjYWxlKDIuMTQyOSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PHJlY3QgeD0iMzg4LjU3IiB5PSI1MDMuOCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeT0iMjAiIGZpbGw9InVybCgjYikiIHRyYW5zZm9ybT0ibWF0cml4KDEuNTAwMDggMCAwIDEuNTAwMDggLTU4MC44NSAtNzUzLjY5MykiIHN0cm9rZS13aWR0aD0iLjk2NiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQgNCkgc2NhbGUoMS4xNjY3KSIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMTUiPjxwYXRoIGQ9Im0xNyAxMi01IDIxaDQuMWwyLjE1LTlIMjlsLTEwLjA3MSA4Ljk2MkwyMS41NjIgMzZsMS4zNDgtLjcwM2MyLjU1MS0xLjMwOSAzLjYyMS0uNTQzIDUuNTU1LS4wMDggMS44ODMuNTIgMy42NTYgMS4wNzggNy4zMjgtMS4wMzVsLS43My0zLjczNGMtNCAyLjg0OC01LjI3My4zMDktOC4xMjkuMjAzTDM1IDI0bDEtNEgxOS4ybC45OC00SDMxbDEtNCIvPjwvZz48cGF0aCBkPSJNMjMuODM0IDE4IDE4IDQyLjUwMWg0Ljc4NGwyLjUwOC0xMC41aDEyLjU0MmwtMTEuNzUgMTAuNDU2TDI5LjE1NiA0NmwxLjU3My0uODJjMi45NzYtMS41MjcgNC4yMjUtLjYzNCA2LjQ4MS0uMDEgMi4xOTcuNjA3IDQuMjY2IDEuMjU4IDguNTUtMS4yMDdsLS44NTItNC4zNTZjLTQuNjY3IDMuMzIyLTYuMTUyLjM2LTkuNDg0LjIzN0w0NC44MzQgMzJsMS4xNjctNC42NjdoLTE5LjZsMS4xNDMtNC42NjdoMTIuNjI0TDQxLjMzNCAxOCIgZmlsbD0iI2Y5ZjlmOSIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"filezilla,ftp,client\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"filezilla.desktop\"\nLABEL oc.launch=\"filezilla.Filezilla\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"filezilla\"\nLABEL oc.displayname=\"filezilla (alpine)\"\nLABEL oc.path=\"/usr/bin/filezilla\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"filezilla\"\nENV APPBIN \"/usr/bin/filezilla\"\nENV APP \"/usr/bin/filezilla\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/filezilla/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/filezilla/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application filezilla

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filezilla.d\n
"},{"location":"applications/filezilla/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f filezilla.d -t filezilla .\n
"},{"location":"applications/filezilla/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect filezilla > filezilla.json\ndocker image save filezilla -o filezilla.tar\nctr -n k8s.io images import filezilla.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filezilla.json\n\n
"},{"location":"applications/firefox-esr/","title":"firefox-esr","text":""},{"location":"applications/firefox-esr/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/firefox-esr/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/firefox-esr/#alpine-packages","title":"Alpine packages","text":"
firefox-esr\n
"},{"location":"applications/firefox-esr/#displayname","title":"Displayname","text":"
Firefox (esr alpine)\n
"},{"location":"applications/firefox-esr/#path","title":"Path","text":"
/usr/bin/firefox-esr\n
"},{"location":"applications/firefox-esr/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/firefox-esr/#mimetype","title":"Mimetype","text":"
text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
"},{"location":"applications/firefox-esr/#file-extensions","title":"File extensions","text":"

\"htm;html;xml;gif\"

"},{"location":"applications/firefox-esr/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"htm;html;xml\"

"},{"location":"applications/firefox-esr/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/firefox-esr/#wm_class","title":"WM_CLASS","text":"
Navigator.firefox-esr\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/firefox-esr/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/firefox-esr.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/firefox-esr/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

COPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\n
"},{"location":"applications/firefox-esr/#json-dump","title":"JSON dump","text":"

json source file firefox-esr.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"cat\": \"office\",\n    \"comment\": \"NSS_SDB_USE_CACHE=yes\",\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\",\n        \"COPY policies.json /usr/lib/firefox/distribution\",\n        \"COPY /ntlm_auth /usr/bin/ntlm_auth.desktop\",\n        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\"\n    ],\n    \"apkpackage\": \"firefox-esr\",\n    \"icon\": \"circle_firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.firefox-esr\",\n    \"name\": \"firefox-esr\",\n    \"displayname\": \"Firefox (esr alpine)\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/firefox-esr\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/firefox-esr.desktop\",\n    \"usedefaultapplication\": true\n}\n
"},{"location":"applications/firefox-esr/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output firefox-esr.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox-esr.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox-esr.d.3.0.json\n\n
"},{"location":"applications/firefox-esr/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\nRUN apk add --no-cache --update firefox-esr\nLABEL oc.icon=\"circle_firefox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IHgxPSIyODAiIHgyPSIyODAiIHkxPSIxNzIiIHkyPSIyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmFiZGI2IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2JhYmRiNiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjbGlwUGF0aD4KICAgPGNpcmNsZSBjeD0iNjQiIGN5PSIyMzYiIHI9IjUyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjMzU4NGU0IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPC9jbGlwUGF0aD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI3MC43ODYiIHgyPSI2LjQ0NyIgeTE9IjEyLjM5MyIgeTI9Ijc0LjQ2OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAtLjAwNTQ2MTUgMjgwLjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4wNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZTg0NyIgb2Zmc2V0PSIuMTExIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjIyNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zNjgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuNDAxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ2MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41MzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UzMTU4NyIgb2Zmc2V0PSIuNzA1Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItNzkwNy4yIiBjeT0iLTg1MTUuMSIgcj0iODAuNzk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkNGYiIG9mZnNldD0iLjEyOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhYzMxIiBvZmZzZXQ9Ii4xODYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOWQxNyIgb2Zmc2V0PSIuMjQ3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjI4MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjNiIiBvZmZzZXQ9Ii40MDMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgb2Zmc2V0PSIuNDY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNTE1NmMiIG9mZnNldD0iLjcxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYjA4NzgiIG9mZnNldD0iLjc4MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTUwMDgwIiBvZmZzZXQ9Ii44NiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iLTc5MzYuNyIgY3k9Ii04NDgyLjEiIHI9IjgwLjc5NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjOTYwZTE4IiBvZmZzZXQ9Ii4zIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNiMTE5MjciIHN0b3Atb3BhY2l0eT0iLjc0IiBvZmZzZXQ9Ii4zNTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RiMjkzZCIgc3RvcC1vcGFjaXR5PSIuMzQzIiBvZmZzZXQ9Ii40MzUiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1MzM0YiIgc3RvcC1vcGFjaXR5PSIuMDk0IiBvZmZzZXQ9Ii40OTciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9Ii41MyIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iLTc5MjciIGN5PSItODUzMy41IiByPSI1OC41MzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTMyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRjM2UiIG9mZnNldD0iLjI1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ZDEyIiBvZmZzZXQ9Ii41MDYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNTI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImciIGN4PSItNzkzNy43IiBjeT0iLTg1MTguNCIgcj0iMjcuNjc2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUyMjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYjI3IiBvZmZzZXQ9Ii4xMjEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmYzgyYSIgb2Zmc2V0PSIuMjk1Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE5MzAiIG9mZnNldD0iLjUwMiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3ZTM3IiBvZmZzZXQ9Ii43MzIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNzEzOSIgb2Zmc2V0PSIuNzkyIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImgiIGN4PSItNzkxNiIgY3k9Ii04NTM2IiByPSIxMTguMDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTEzIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjQ1NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjM0IiBvZmZzZXQ9Ii42MjIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzY0NyIgb2Zmc2V0PSIuNzE2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlMzE1ODciIG9mZnNldD0iLjkwNCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iLTc5MjcuMiIgY3k9Ii04NTIyLjkiIHI9Ijg2LjQ5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDIyMjM0IC4yMTA3IC0uMTM4MjggLjAxNDYxMSAtOTkxLjg2IDIwNzMuNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmU4NDciIG9mZnNldD0iLjA2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjE2OCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zMDQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuMzU2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41NyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii43MzciLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iaiIgY3g9Ii03OTM4LjQiIGN5PSItODUwOC4yIiByPSI3My43MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4xMzciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTYzNCIgb2Zmc2V0PSIuNTkyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjM2NDciIG9mZnNldD0iLjY1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii45MDQiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iayIgY3g9Ii03OTE4LjkiIGN5PSItODUwMy45IiByPSI4MC42ODYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMDk0Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUxNDEiIG9mZnNldD0iLjIzMSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhZjFlIiBvZmZzZXQ9Ii41MDkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNjI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI3MC4wMTMiIHgyPSIxNS4yNjciIHkxPSIxMi4wNjEiIHkyPSI2Ni44MDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgLS4wMDU0NjE1IDI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgc3RvcC1vcGFjaXR5PSIuOCIgb2Zmc2V0PSIuMTY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjYzNCIgb2Zmc2V0PSIuMjY2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjIxNyIgb2Zmc2V0PSIuNDg5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIuNiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iOC40OTM3IiBjeT0iMjg3LjM0IiByPSIzLjY0NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOTYyIDAgLTI3Ljc1NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYyYTBlYSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNTg0ZTQiIG9mZnNldD0iLjU1MTY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxYTVmYjQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0yODAuMDcpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTY4MzYgMCAwIC45NjgzNiAuMjY3ODkgOC44Njc4KSI+CiAgIDxjaXJjbGUgY3g9IjMzOS4xMyIgY3k9IjI4NS42OSIgcj0iMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2Q1ZDNjZiIvPgogICA8ZyBzdHJva2Utd2lkdGg9Ii4yMTE3NSI+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTFsMC4wMDE1IDAuMDEzOGMtMC45Mjc5MS0yLjMxMzQtMi41MDE1LTMuMjQ2Mi0zLjc4NjYtNS4yNzczLTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zbDAuMDAzMi02ZS0zYy0yLjA2MTQgMS4yMDctMi43NjA5IDMuNDQxNC0yLjgyNTIgNC41NTkxYTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTIgMi40NTM2IDIuNDUzNiAwIDAgMC0wLjIxMTc1LTAuMTYwNTEgMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhoLTAuMDAzODFjLTAuMzI1MzUtMC40MTEzMS0wLjMwMjQ4LTEuNzcwOC0wLjI4Mzg1LTIuMDU0N2ExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDcxMTQ5IDAuNDMzODgtMC4wODA2NzggMC41MTI0NCAwIDZlLTMgLTAuMDAxMjcxIDAuMDExOS0wLjAwMTkwNiAwLjAxOGE3LjgyMTYgNy44MjE2IDAgMCAwLTAuMTMzMTkgMS4xMzE0djAuMDQyM2E4LjIwNzQgOC4yMDc0IDAgMCAwIDE2LjI5NSAxLjM4NzhjMC4wMTM3Ni0wLjEwNTg4IDAuMDI0OTktMC4yMTA3IDAuMDM3MjctMC4zMTc2M2E4LjQzOTkgOC40Mzk5IDAgMCAwLTAuNTMyMzUtNC4xMjI2em0tOS40NTkxIDYuNDI0MmMwLjAzODMyNyAwLjAxODQgMC4wNzQzMjYgMC4wMzgzIDAuMTEzNzEgMC4wNTU5bDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1em0xLjg4LTQuOTVtNi43NjYtMS4wNDQ4di04ZS0zbDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNhKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExdjhlLTNsMC4wMDE1IDllLTNhNy40MzI2IDcuNDMyNiAwIDAgMS0wLjI1NTM4IDUuNTM5MWMtMC45NDA2MSAyLjAxODItMy4yMTc0IDQuMDg2OC02Ljc4MTIgMy45ODYzLTMuODUwNy0wLjEwOTA2LTcuMjQyLTIuOTY2NS03Ljg3Ni02LjcwOS0wLjExNTQxLTAuNTkwMTYgMC0wLjg4OTM3IDAuMDU4MDIxLTEuMzY5YTYuMTE0NiA2LjExNDYgMCAwIDAtMC4xMzE5MiAxLjEzMjV2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6IiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTF2OGUtM2wwLjAwMTUgOWUtM2E3LjQzMjYgNy40MzI2IDAgMCAxLTAuMjU1MzggNS41MzkxYy0wLjk0MDYxIDIuMDE4Mi0zLjIxNzQgNC4wODY4LTYuNzgxMiAzLjk4NjMtMy44NTA3LTAuMTA5MDYtNy4yNDItMi45NjY1LTcuODc2LTYuNzA5LTAuMTE1NDEtMC41OTAxNiAwLTAuODg5MzcgMC4wNTgwMjEtMS4zNjlhNi4xMTQ2IDYuMTE0NiAwIDAgMC0wLjEzMTkyIDEuMTMyNXYwLjA0MjNhOC4yMDc0IDguMjA3NCAwIDAgMCAxNi4yOTUgMS4zODc4YzAuMDEzNzYtMC4xMDU4OCAwLjAyNDk5LTAuMjEwNyAwLjAzNzI3LTAuMzE3NjNhOC40Mzk5IDguNDM5OSAwIDAgMC0wLjUzMjM1LTQuMTIyNnoiIGZpbGw9InVybCgjYykiLz4KICAgIDxwYXRoIGQ9Im0xMi4wODIgMjg2LjcxYzAuMDE3NzkgMC4wMTI1IDAuMDM0MyAwLjAyNSAwLjA1MTAzIDAuMDM3NWE0LjQ2OCA0LjQ2OCAwIDAgMC0wLjc2MjMyLTAuOTk0MThjLTIuNTUwOC0yLjU1MTItMC42Njg1MS01LjUzMTctMC4zNTEwOS01LjY4MzFsMC4wMDMyLTVlLTNjLTIuMDYxNCAxLjIwNy0yLjc2MDkgMy40NDE0LTIuODI1MiA0LjU1OTEgMC4wOTU3MTMtN2UtMyAwLjE5MDU4LTAuMDE0NiAwLjI4ODQxLTAuMDE0NmE0LjE0MTkgNC4xNDE5IDAgMCAxIDMuNTk2IDIuMXoiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im04LjQ5MTIgMjg3LjIyYy0wLjAxMzU1MiAwLjIwNDEzLTAuNzM0NzkgMC45MDgyMS0wLjk4Njk5IDAuOTA4MjEtMi4zMzM3IDAtMi43MTI2IDEuNDExOC0yLjcxMjYgMS40MTE4IDAuMTAzMzQgMS4xODg4IDAuOTMxNzIgMi4xNjc5IDEuOTMzMSAyLjY4NTkgMC4wNDU3MzkgMC4wMjM3IDAuMDkyMTEzIDAuMDQ1MSAwLjEzODQ5IDAuMDY2MXEwLjEyMDQ5IDAuMDUzNCAwLjI0MDk4IDAuMDk4N2EzLjY0OTYgMy42NDk2IDAgMCAwIDEuMDY3OSAwLjIwNjA0YzQuMDkwNSAwLjE5MTg1IDQuODgyOC00Ljg5MTUgMS45MzEtNi4zNjY2YTIuODMzMyAyLjgzMzMgMCAwIDEgMS45Nzg4IDAuNDgwNDcgNC4xNDE5IDQuMTQxOSAwIDAgMC0zLjU5Ni0yLjFjLTAuMDk3NDA3IDAtMC4xOTI3IDhlLTMgLTAuMjg4NDEgMC4wMTQ2YTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTJjMC4xMjUxNSAwLjEwNTg3IDAuMjY2MzkgMC4yNDczMyAwLjU2MzkgMC41NDA2MSAwLjU1NjkxIDAuNTQ4NjUgMS45ODUyIDEuMTE3IDEuOTg4NCAxLjE4Mzd6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCBkPSJtNS41NTYzIDI4NS4yMmMwLjA2NjQ5MSAwLjA0MjMgMC4xMjEzNCAwLjA3OTIgMC4xNjk0IDAuMTEyNDRhMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhjMC4wNDAwMjItMWUtMyAxLjIzMDUtMC4wMjI0IDEuODI5MSAwLjM2Njc2eiIgZmlsbD0idXJsKCNnKSIvPgogICAgPHBhdGggZD0ibTAuMzQ0NzggMjg4Ljk5YzAuNjMzMzYgMy43NDI1IDQuMDI1MiA2LjYgNy44NzYgNi43MDkgMy41NjM4IDAuMTAwNzkgNS44NDA2LTEuOTY4IDYuNzgxMi0zLjk4NjNhNy40MzI2IDcuNDMyNiAwIDAgMCAwLjI1NTM4LTUuNTM5MXYtOGUtM2MwLTZlLTMgLTAuMDAxMy0wLjAxIDAtOGUtM2wwLjAwMTUgMC4wMTM4YzAuMjkxMTYgMS45MDA5LTAuNjc1NzEgMy43NDI1LTIuMTg3MiA0Ljk4NzlsLTAuMDA0NyAwLjAxMDZjLTIuOTQ1MSAyLjM5ODUtNS43NjM1IDEuNDQ3MS02LjMzNCAxLjA1ODhxLTAuMDU5NzE1LTAuMDI4Ni0wLjExOTQzLTAuMDU5NWMtMS43MTcxLTAuODIwNzYtMi40MjY1LTIuMzg1Mi0yLjI3NDUtMy43MjY5YTIuMTA3NiAyLjEwNzYgMCAwIDEtMS45NDQxLTEuMjIyOSAzLjA5NTQgMy4wOTU0IDAgMCAxIDMuMDE3My0wLjEyMTEzIDQuMDg2OSA0LjA4NjkgMCAwIDAgMy4wODE0IDAuMTIxMTNjLTAuMDAzMTgtMC4wNjY3LTEuNDMxNS0wLjYzNTI2LTEuOTg4NC0xLjE4MzctMC4yOTc1MS0wLjI5MzI4LTAuNDM4NzUtMC40MzQ1Mi0wLjU2MzktMC41NDA2MWEyLjQ1MzYgMi40NTM2IDAgMCAwLTAuMjExNzUtMC4xNjA1MWMtMC4wNDg3MDQtMC4wMzMyLTAuMTAzNTUtMC4wNjkyLTAuMTY5NC0wLjExMjQ0LTAuNTk4NjMtMC4zODkyLTEuNzg5MS0wLjM2NzgxLTEuODI4NS0wLjM2Njc1aC0wLjAwMzgxYy0wLjMyNTIzLTAuNDEyLTAuMzAyMzYtMS43NzE1LTAuMjgzNzMtMi4wNTU0YTEuNDY3IDEuNDY3IDAgMCAwLTAuMjc0MDEgMC4xNDU0NyA1Ljk3NjggNS45NzY4IDAgMCAwLTAuODAyMTIgMC42ODcxNCA3LjE2NjggNy4xNjY4IDAgMCAwLTAuNzcwMzYgMC45MTgzOHYxZS0zIC0xZS0zYTYuOTMxMyA2LjkzMTMgMCAwIDAtMS4xMDExIDIuNDg2NmMtMC4wMDQwMjMgMC4wMTY3LTAuMjk1NjEgMS4yOTE1LTAuMTUxODMgMS45NTI2eiIgZmlsbD0idXJsKCNoKSIvPgogICAgPHBhdGggZD0ibTExLjM3MSAyODUuNzZhNC40NjggNC40NjggMCAwIDEgMC43NjIzMiAwLjk5NTI0YzAuMDQ1MSAwLjAzNDEgMC4wODcyNCAwLjA2OCAwLjEyMzAzIDAuMTAwNzkgMS44NjA3IDEuNzE1MiAwLjg4NTc3IDQuMTM5OCAwLjgxMzE0IDQuMzEyNCAxLjUxMTUtMS4yNDUzIDIuNDc3NS0zLjA4NyAyLjE4NzItNC45ODc5LTAuOTI4MzMtMi4zMTQ1LTIuNTAxOS0zLjI0NzItMy43ODctNS4yNzg0LTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zIC0wLjMxNzQyIDAuMTUwNTUtMi4xOTk3IDMuMTMxIDAuMzUxNTEgNS42ODIyeiIgZmlsbD0idXJsKCNpKSIvPgogICAgPHBhdGggZD0ibTEyLjI1NSAyODYuODVjLTAuMDM1NzktMC4wMzI4LTAuMDc3OTItMC4wNjY3LTAuMTIzMDMtMC4xMDA4LTAuMDE2NzMtMC4wMTI1LTAuMDMzMjUtMC4wMjUtMC4wNTEwMy0wLjAzNzVhMi44MzMzIDIuODMzMyAwIDAgMC0xLjk3ODgtMC40ODA0N2MyLjk1MTkgMS40NzU5IDIuMTU5OSA2LjU1ODQtMS45MzEgNi4zNjY2YTMuNjQ5NiAzLjY0OTYgMCAwIDEtMS4wNjc5LTAuMjA2MDJxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM2MwLjU3MDQ3IDAuMzg5NDEgMy4zODgxIDEuMzQwOCA2LjMzNC0xLjA1ODhsMC4wMDQ3LTAuMDEwNmMwLjA3MzQ4LTAuMTcxNTIgMS4wNDg0LTIuNTk2Ny0wLjgxMzE0LTQuMzExM3oiIGZpbGw9InVybCgjaikiLz4KICAgIDxwYXRoIGQ9Im00Ljc5MTYgMjg5LjU0czAuMzc4ODMtMS40MTE4IDIuNzEyNi0xLjQxMThjMC4yNTIyIDAgMC45NzQwNy0wLjcwNDA4IDAuOTg2OTktMC45MDgyMWE0LjA4NjkgNC4wODY5IDAgMCAxLTMuMDgxNC0wLjEyMTEyIDMuMDk1NCAzLjA5NTQgMCAwIDAtMy4wMTczIDAuMTIxMTIgMi4xMDc2IDIuMTA3NiAwIDAgMCAxLjk0NDEgMS4yMjI5Yy0wLjE1MjA0IDEuMzQxOSAwLjU1NzM0IDIuOTA2MyAyLjI3NDUgMy43MjY5IDAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3NzMtMS44Mjk4LTEuNDk2OS0xLjkzMzEtMi42ODU3eiIgZmlsbD0idXJsKCNrKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExbDAuMDAxNSAwLjAxMzhjLTAuOTI3OTEtMi4zMTM0LTIuNTAxNS0zLjI0NjItMy43ODY2LTUuMjc3My0wLjA2NTAxLTAuMTAyNy0wLjEzMDAyLTAuMjA1NjEtMC4xOTMzMy0wLjMxNDI0LTAuMDM2MjEtMC4wNjItMC4wNjUyMi0wLjExNzk1LTAuMDkwNDItMC4xNjk0YTEuNDkzNSAxLjQ5MzUgMCAwIDEtMC4xMjIzOS0wLjMyNTA0IDAuMDIxMTc1IDAuMDIxMTc1IDAgMCAwLTAuMDE4NjMtMC4wMjEyIDAuMDI5MjIyIDAuMDI5MjIyIDAgMCAwLTAuMDE1NDYgMGMtMC4wMDExIDAtMC4wMDI4IDJlLTMgLTRlLTMgMmUtMyAtMC4wMDEzIDQuMmUtNCAtNGUtMyAyZS0zIC0wLjAwNTkgM2UtM2wwLjAwMzItNmUtM2MtMi4wNjE0IDEuMjA3LTIuNzYwOSAzLjQ0MTQtMi44MjUyIDQuNTU5MSAwLjA5NTcxMy03ZS0zIDAuMTkwNTgtMC4wMTQ2IDAuMjg4NDEtMC4wMTQ2YTQuMTQxOSA0LjE0MTkgMCAwIDEgMy41OTYgMi4xIDIuODMzMyAyLjgzMzMgMCAwIDAtMS45Nzg4LTAuNDgwNDdjMi45NTE5IDEuNDc1OSAyLjE1OTkgNi41NTg0LTEuOTMxIDYuMzY2NmEzLjY0OTYgMy42NDk2IDAgMCAxLTEuMDY4LTAuMjA1MDhxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1YzAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3OTUtMS44Mjk4LTEuNDk3MS0xLjkzMzEtMi42ODU5IDAgMCAwLjM3ODgzLTEuNDExOCAyLjcxMjYtMS40MTE4IDAuMjUyMiAwIDAuOTc0MDctMC43MDQwOCAwLjk4Njk5LTAuOTA4MjEtMC4wMDMxOC0wLjA2NjctMS40MzE1LTAuNjM1MjYtMS45ODg0LTEuMTgzNy0wLjI5NzUxLTAuMjkzMjgtMC40Mzg3NS0wLjQzNDUyLTAuNTYzOS0wLjU0MDYxYTIuNDUzNiAyLjQ1MzYgMCAwIDAtMC4yMTE3NS0wLjE2MDUxIDMuODA0OCAzLjgwNDggMCAwIDEtMC4wMjMwODEtMi4wMDYgNi4wNzg0IDYuMDc4NCAwIDAgMC0xLjk3NTUgMS41MjY4aC0wLjAwMzgxYy0wLjMyNTI2LTAuNDEyNjMtMC4zMDIzOS0xLjc3MjEtMC4yODM3NS0yLjA1NmExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDg0NzAyIDAuNDM4OTYtMC4wOTQ2NTQgMC41MTc3NHYwYTkuNTQ4OCA5LjU0ODggMCAwIDAtMC4xMjExMiAxLjE0NDF2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6bS0wLjgxNDIgMC40MjE2IDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNsKSIvPgogICA8L2c+CiAgIDxjaXJjbGUgY3g9Ii0xOS4zNDciIGN5PSIyOTQuNTMiIHI9IjAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9IiNkNWQzY2YiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"firefox-esr,firefox,mozilla,web,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"firefox-esr.desktop\"\nLABEL oc.launch=\"Navigator.firefox-esr\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"firefox-esr\"\nLABEL oc.displayname=\"Firefox (esr alpine)\"\nLABEL oc.path=\"/usr/bin/firefox-esr\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"htm;html;xml;gif\"\nLABEL oc.legacyfileextensions=\"htm;html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"firefox-esr\"\nENV APPBIN \"/usr/bin/firefox-esr\"\nENV APP \"/usr/bin/firefox-esr\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/firefox-esr/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/firefox-esr/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application firefox-esr

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox-esr.d\n
"},{"location":"applications/firefox-esr/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f firefox-esr.d -t firefox-esr .\n
"},{"location":"applications/firefox-esr/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect firefox-esr > firefox-esr.json\ndocker image save firefox-esr -o firefox-esr.tar\nctr -n k8s.io images import firefox-esr.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox-esr.json\n\n
"},{"location":"applications/firefox/","title":"Firefox","text":""},{"location":"applications/firefox/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/firefox/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/firefox/#alpine-packages","title":"Alpine packages","text":"
firefox krb5\n
"},{"location":"applications/firefox/#displayname","title":"Displayname","text":"
Firefox (alpine)\n
"},{"location":"applications/firefox/#path","title":"Path","text":"
/usr/bin/firefox\n
"},{"location":"applications/firefox/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/firefox/#mimetype","title":"Mimetype","text":"
text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
"},{"location":"applications/firefox/#file-extensions","title":"File extensions","text":"

\"htm;html;xml;gif\"

"},{"location":"applications/firefox/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"htm;html;xml\"

"},{"location":"applications/firefox/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/firefox/#wm_class","title":"WM_CLASS","text":"
Navigator.firefox\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/firefox/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/firefox.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/firefox/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

COPY composer/init.d/init.firefox /composer/init.d/init.firefox\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\n
"},{"location":"applications/firefox/#json-dump","title":"JSON dump","text":"

json source file firefox.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"cat\": \"office\",\n    \"comment\": \"NSS_SDB_USE_CACHE=yes\",\n    \"postruncommands\": [\n        \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n        \"COPY policies.json /usr/lib/firefox/distribution\",\n        \"COPY /ntlm_auth /usr/bin/ntlm_auth.desktop\",\n        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\"\n    ],\n    \"apkpackage\": \"firefox krb5\",\n    \"icon\": \"circle_firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.firefox\",\n    \"args\": \"\",\n    \"name\": \"Firefox\",\n    \"displayname\": \"Firefox (alpine)\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/firefox.desktop\",\n    \"usedefaultapplication\": true\n}\n
"},{"location":"applications/firefox/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output firefox.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox.d.3.0.json\n\n
"},{"location":"applications/firefox/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update firefox krb5\nLABEL oc.icon=\"circle_firefox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IHgxPSIyODAiIHgyPSIyODAiIHkxPSIxNzIiIHkyPSIyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmFiZGI2IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2JhYmRiNiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjbGlwUGF0aD4KICAgPGNpcmNsZSBjeD0iNjQiIGN5PSIyMzYiIHI9IjUyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjMzU4NGU0IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPC9jbGlwUGF0aD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI3MC43ODYiIHgyPSI2LjQ0NyIgeTE9IjEyLjM5MyIgeTI9Ijc0LjQ2OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAtLjAwNTQ2MTUgMjgwLjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4wNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZTg0NyIgb2Zmc2V0PSIuMTExIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjIyNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zNjgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuNDAxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ2MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41MzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UzMTU4NyIgb2Zmc2V0PSIuNzA1Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItNzkwNy4yIiBjeT0iLTg1MTUuMSIgcj0iODAuNzk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkNGYiIG9mZnNldD0iLjEyOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhYzMxIiBvZmZzZXQ9Ii4xODYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOWQxNyIgb2Zmc2V0PSIuMjQ3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjI4MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjNiIiBvZmZzZXQ9Ii40MDMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgb2Zmc2V0PSIuNDY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNTE1NmMiIG9mZnNldD0iLjcxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYjA4NzgiIG9mZnNldD0iLjc4MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTUwMDgwIiBvZmZzZXQ9Ii44NiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iLTc5MzYuNyIgY3k9Ii04NDgyLjEiIHI9IjgwLjc5NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjOTYwZTE4IiBvZmZzZXQ9Ii4zIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNiMTE5MjciIHN0b3Atb3BhY2l0eT0iLjc0IiBvZmZzZXQ9Ii4zNTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RiMjkzZCIgc3RvcC1vcGFjaXR5PSIuMzQzIiBvZmZzZXQ9Ii40MzUiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1MzM0YiIgc3RvcC1vcGFjaXR5PSIuMDk0IiBvZmZzZXQ9Ii40OTciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9Ii41MyIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iLTc5MjciIGN5PSItODUzMy41IiByPSI1OC41MzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTMyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRjM2UiIG9mZnNldD0iLjI1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ZDEyIiBvZmZzZXQ9Ii41MDYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNTI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImciIGN4PSItNzkzNy43IiBjeT0iLTg1MTguNCIgcj0iMjcuNjc2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUyMjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYjI3IiBvZmZzZXQ9Ii4xMjEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmYzgyYSIgb2Zmc2V0PSIuMjk1Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE5MzAiIG9mZnNldD0iLjUwMiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3ZTM3IiBvZmZzZXQ9Ii43MzIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNzEzOSIgb2Zmc2V0PSIuNzkyIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImgiIGN4PSItNzkxNiIgY3k9Ii04NTM2IiByPSIxMTguMDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTEzIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjQ1NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjM0IiBvZmZzZXQ9Ii42MjIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzY0NyIgb2Zmc2V0PSIuNzE2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlMzE1ODciIG9mZnNldD0iLjkwNCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iLTc5MjcuMiIgY3k9Ii04NTIyLjkiIHI9Ijg2LjQ5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDIyMjM0IC4yMTA3IC0uMTM4MjggLjAxNDYxMSAtOTkxLjg2IDIwNzMuNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmU4NDciIG9mZnNldD0iLjA2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjE2OCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zMDQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuMzU2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41NyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii43MzciLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iaiIgY3g9Ii03OTM4LjQiIGN5PSItODUwOC4yIiByPSI3My43MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4xMzciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTYzNCIgb2Zmc2V0PSIuNTkyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjM2NDciIG9mZnNldD0iLjY1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii45MDQiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iayIgY3g9Ii03OTE4LjkiIGN5PSItODUwMy45IiByPSI4MC42ODYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMDk0Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUxNDEiIG9mZnNldD0iLjIzMSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhZjFlIiBvZmZzZXQ9Ii41MDkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNjI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI3MC4wMTMiIHgyPSIxNS4yNjciIHkxPSIxMi4wNjEiIHkyPSI2Ni44MDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgLS4wMDU0NjE1IDI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgc3RvcC1vcGFjaXR5PSIuOCIgb2Zmc2V0PSIuMTY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjYzNCIgb2Zmc2V0PSIuMjY2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjIxNyIgb2Zmc2V0PSIuNDg5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIuNiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iOC40OTM3IiBjeT0iMjg3LjM0IiByPSIzLjY0NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOTYyIDAgLTI3Ljc1NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYyYTBlYSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNTg0ZTQiIG9mZnNldD0iLjU1MTY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxYTVmYjQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0yODAuMDcpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTY4MzYgMCAwIC45NjgzNiAuMjY3ODkgOC44Njc4KSI+CiAgIDxjaXJjbGUgY3g9IjMzOS4xMyIgY3k9IjI4NS42OSIgcj0iMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2Q1ZDNjZiIvPgogICA8ZyBzdHJva2Utd2lkdGg9Ii4yMTE3NSI+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTFsMC4wMDE1IDAuMDEzOGMtMC45Mjc5MS0yLjMxMzQtMi41MDE1LTMuMjQ2Mi0zLjc4NjYtNS4yNzczLTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zbDAuMDAzMi02ZS0zYy0yLjA2MTQgMS4yMDctMi43NjA5IDMuNDQxNC0yLjgyNTIgNC41NTkxYTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTIgMi40NTM2IDIuNDUzNiAwIDAgMC0wLjIxMTc1LTAuMTYwNTEgMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhoLTAuMDAzODFjLTAuMzI1MzUtMC40MTEzMS0wLjMwMjQ4LTEuNzcwOC0wLjI4Mzg1LTIuMDU0N2ExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDcxMTQ5IDAuNDMzODgtMC4wODA2NzggMC41MTI0NCAwIDZlLTMgLTAuMDAxMjcxIDAuMDExOS0wLjAwMTkwNiAwLjAxOGE3LjgyMTYgNy44MjE2IDAgMCAwLTAuMTMzMTkgMS4xMzE0djAuMDQyM2E4LjIwNzQgOC4yMDc0IDAgMCAwIDE2LjI5NSAxLjM4NzhjMC4wMTM3Ni0wLjEwNTg4IDAuMDI0OTktMC4yMTA3IDAuMDM3MjctMC4zMTc2M2E4LjQzOTkgOC40Mzk5IDAgMCAwLTAuNTMyMzUtNC4xMjI2em0tOS40NTkxIDYuNDI0MmMwLjAzODMyNyAwLjAxODQgMC4wNzQzMjYgMC4wMzgzIDAuMTEzNzEgMC4wNTU5bDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1em0xLjg4LTQuOTVtNi43NjYtMS4wNDQ4di04ZS0zbDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNhKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExdjhlLTNsMC4wMDE1IDllLTNhNy40MzI2IDcuNDMyNiAwIDAgMS0wLjI1NTM4IDUuNTM5MWMtMC45NDA2MSAyLjAxODItMy4yMTc0IDQuMDg2OC02Ljc4MTIgMy45ODYzLTMuODUwNy0wLjEwOTA2LTcuMjQyLTIuOTY2NS03Ljg3Ni02LjcwOS0wLjExNTQxLTAuNTkwMTYgMC0wLjg4OTM3IDAuMDU4MDIxLTEuMzY5YTYuMTE0NiA2LjExNDYgMCAwIDAtMC4xMzE5MiAxLjEzMjV2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6IiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTF2OGUtM2wwLjAwMTUgOWUtM2E3LjQzMjYgNy40MzI2IDAgMCAxLTAuMjU1MzggNS41MzkxYy0wLjk0MDYxIDIuMDE4Mi0zLjIxNzQgNC4wODY4LTYuNzgxMiAzLjk4NjMtMy44NTA3LTAuMTA5MDYtNy4yNDItMi45NjY1LTcuODc2LTYuNzA5LTAuMTE1NDEtMC41OTAxNiAwLTAuODg5MzcgMC4wNTgwMjEtMS4zNjlhNi4xMTQ2IDYuMTE0NiAwIDAgMC0wLjEzMTkyIDEuMTMyNXYwLjA0MjNhOC4yMDc0IDguMjA3NCAwIDAgMCAxNi4yOTUgMS4zODc4YzAuMDEzNzYtMC4xMDU4OCAwLjAyNDk5LTAuMjEwNyAwLjAzNzI3LTAuMzE3NjNhOC40Mzk5IDguNDM5OSAwIDAgMC0wLjUzMjM1LTQuMTIyNnoiIGZpbGw9InVybCgjYykiLz4KICAgIDxwYXRoIGQ9Im0xMi4wODIgMjg2LjcxYzAuMDE3NzkgMC4wMTI1IDAuMDM0MyAwLjAyNSAwLjA1MTAzIDAuMDM3NWE0LjQ2OCA0LjQ2OCAwIDAgMC0wLjc2MjMyLTAuOTk0MThjLTIuNTUwOC0yLjU1MTItMC42Njg1MS01LjUzMTctMC4zNTEwOS01LjY4MzFsMC4wMDMyLTVlLTNjLTIuMDYxNCAxLjIwNy0yLjc2MDkgMy40NDE0LTIuODI1MiA0LjU1OTEgMC4wOTU3MTMtN2UtMyAwLjE5MDU4LTAuMDE0NiAwLjI4ODQxLTAuMDE0NmE0LjE0MTkgNC4xNDE5IDAgMCAxIDMuNTk2IDIuMXoiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im04LjQ5MTIgMjg3LjIyYy0wLjAxMzU1MiAwLjIwNDEzLTAuNzM0NzkgMC45MDgyMS0wLjk4Njk5IDAuOTA4MjEtMi4zMzM3IDAtMi43MTI2IDEuNDExOC0yLjcxMjYgMS40MTE4IDAuMTAzMzQgMS4xODg4IDAuOTMxNzIgMi4xNjc5IDEuOTMzMSAyLjY4NTkgMC4wNDU3MzkgMC4wMjM3IDAuMDkyMTEzIDAuMDQ1MSAwLjEzODQ5IDAuMDY2MXEwLjEyMDQ5IDAuMDUzNCAwLjI0MDk4IDAuMDk4N2EzLjY0OTYgMy42NDk2IDAgMCAwIDEuMDY3OSAwLjIwNjA0YzQuMDkwNSAwLjE5MTg1IDQuODgyOC00Ljg5MTUgMS45MzEtNi4zNjY2YTIuODMzMyAyLjgzMzMgMCAwIDEgMS45Nzg4IDAuNDgwNDcgNC4xNDE5IDQuMTQxOSAwIDAgMC0zLjU5Ni0yLjFjLTAuMDk3NDA3IDAtMC4xOTI3IDhlLTMgLTAuMjg4NDEgMC4wMTQ2YTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTJjMC4xMjUxNSAwLjEwNTg3IDAuMjY2MzkgMC4yNDczMyAwLjU2MzkgMC41NDA2MSAwLjU1NjkxIDAuNTQ4NjUgMS45ODUyIDEuMTE3IDEuOTg4NCAxLjE4Mzd6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCBkPSJtNS41NTYzIDI4NS4yMmMwLjA2NjQ5MSAwLjA0MjMgMC4xMjEzNCAwLjA3OTIgMC4xNjk0IDAuMTEyNDRhMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhjMC4wNDAwMjItMWUtMyAxLjIzMDUtMC4wMjI0IDEuODI5MSAwLjM2Njc2eiIgZmlsbD0idXJsKCNnKSIvPgogICAgPHBhdGggZD0ibTAuMzQ0NzggMjg4Ljk5YzAuNjMzMzYgMy43NDI1IDQuMDI1MiA2LjYgNy44NzYgNi43MDkgMy41NjM4IDAuMTAwNzkgNS44NDA2LTEuOTY4IDYuNzgxMi0zLjk4NjNhNy40MzI2IDcuNDMyNiAwIDAgMCAwLjI1NTM4LTUuNTM5MXYtOGUtM2MwLTZlLTMgLTAuMDAxMy0wLjAxIDAtOGUtM2wwLjAwMTUgMC4wMTM4YzAuMjkxMTYgMS45MDA5LTAuNjc1NzEgMy43NDI1LTIuMTg3MiA0Ljk4NzlsLTAuMDA0NyAwLjAxMDZjLTIuOTQ1MSAyLjM5ODUtNS43NjM1IDEuNDQ3MS02LjMzNCAxLjA1ODhxLTAuMDU5NzE1LTAuMDI4Ni0wLjExOTQzLTAuMDU5NWMtMS43MTcxLTAuODIwNzYtMi40MjY1LTIuMzg1Mi0yLjI3NDUtMy43MjY5YTIuMTA3NiAyLjEwNzYgMCAwIDEtMS45NDQxLTEuMjIyOSAzLjA5NTQgMy4wOTU0IDAgMCAxIDMuMDE3My0wLjEyMTEzIDQuMDg2OSA0LjA4NjkgMCAwIDAgMy4wODE0IDAuMTIxMTNjLTAuMDAzMTgtMC4wNjY3LTEuNDMxNS0wLjYzNTI2LTEuOTg4NC0xLjE4MzctMC4yOTc1MS0wLjI5MzI4LTAuNDM4NzUtMC40MzQ1Mi0wLjU2MzktMC41NDA2MWEyLjQ1MzYgMi40NTM2IDAgMCAwLTAuMjExNzUtMC4xNjA1MWMtMC4wNDg3MDQtMC4wMzMyLTAuMTAzNTUtMC4wNjkyLTAuMTY5NC0wLjExMjQ0LTAuNTk4NjMtMC4zODkyLTEuNzg5MS0wLjM2NzgxLTEuODI4NS0wLjM2Njc1aC0wLjAwMzgxYy0wLjMyNTIzLTAuNDEyLTAuMzAyMzYtMS43NzE1LTAuMjgzNzMtMi4wNTU0YTEuNDY3IDEuNDY3IDAgMCAwLTAuMjc0MDEgMC4xNDU0NyA1Ljk3NjggNS45NzY4IDAgMCAwLTAuODAyMTIgMC42ODcxNCA3LjE2NjggNy4xNjY4IDAgMCAwLTAuNzcwMzYgMC45MTgzOHYxZS0zIC0xZS0zYTYuOTMxMyA2LjkzMTMgMCAwIDAtMS4xMDExIDIuNDg2NmMtMC4wMDQwMjMgMC4wMTY3LTAuMjk1NjEgMS4yOTE1LTAuMTUxODMgMS45NTI2eiIgZmlsbD0idXJsKCNoKSIvPgogICAgPHBhdGggZD0ibTExLjM3MSAyODUuNzZhNC40NjggNC40NjggMCAwIDEgMC43NjIzMiAwLjk5NTI0YzAuMDQ1MSAwLjAzNDEgMC4wODcyNCAwLjA2OCAwLjEyMzAzIDAuMTAwNzkgMS44NjA3IDEuNzE1MiAwLjg4NTc3IDQuMTM5OCAwLjgxMzE0IDQuMzEyNCAxLjUxMTUtMS4yNDUzIDIuNDc3NS0zLjA4NyAyLjE4NzItNC45ODc5LTAuOTI4MzMtMi4zMTQ1LTIuNTAxOS0zLjI0NzItMy43ODctNS4yNzg0LTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zIC0wLjMxNzQyIDAuMTUwNTUtMi4xOTk3IDMuMTMxIDAuMzUxNTEgNS42ODIyeiIgZmlsbD0idXJsKCNpKSIvPgogICAgPHBhdGggZD0ibTEyLjI1NSAyODYuODVjLTAuMDM1NzktMC4wMzI4LTAuMDc3OTItMC4wNjY3LTAuMTIzMDMtMC4xMDA4LTAuMDE2NzMtMC4wMTI1LTAuMDMzMjUtMC4wMjUtMC4wNTEwMy0wLjAzNzVhMi44MzMzIDIuODMzMyAwIDAgMC0xLjk3ODgtMC40ODA0N2MyLjk1MTkgMS40NzU5IDIuMTU5OSA2LjU1ODQtMS45MzEgNi4zNjY2YTMuNjQ5NiAzLjY0OTYgMCAwIDEtMS4wNjc5LTAuMjA2MDJxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM2MwLjU3MDQ3IDAuMzg5NDEgMy4zODgxIDEuMzQwOCA2LjMzNC0xLjA1ODhsMC4wMDQ3LTAuMDEwNmMwLjA3MzQ4LTAuMTcxNTIgMS4wNDg0LTIuNTk2Ny0wLjgxMzE0LTQuMzExM3oiIGZpbGw9InVybCgjaikiLz4KICAgIDxwYXRoIGQ9Im00Ljc5MTYgMjg5LjU0czAuMzc4ODMtMS40MTE4IDIuNzEyNi0xLjQxMThjMC4yNTIyIDAgMC45NzQwNy0wLjcwNDA4IDAuOTg2OTktMC45MDgyMWE0LjA4NjkgNC4wODY5IDAgMCAxLTMuMDgxNC0wLjEyMTEyIDMuMDk1NCAzLjA5NTQgMCAwIDAtMy4wMTczIDAuMTIxMTIgMi4xMDc2IDIuMTA3NiAwIDAgMCAxLjk0NDEgMS4yMjI5Yy0wLjE1MjA0IDEuMzQxOSAwLjU1NzM0IDIuOTA2MyAyLjI3NDUgMy43MjY5IDAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3NzMtMS44Mjk4LTEuNDk2OS0xLjkzMzEtMi42ODU3eiIgZmlsbD0idXJsKCNrKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExbDAuMDAxNSAwLjAxMzhjLTAuOTI3OTEtMi4zMTM0LTIuNTAxNS0zLjI0NjItMy43ODY2LTUuMjc3My0wLjA2NTAxLTAuMTAyNy0wLjEzMDAyLTAuMjA1NjEtMC4xOTMzMy0wLjMxNDI0LTAuMDM2MjEtMC4wNjItMC4wNjUyMi0wLjExNzk1LTAuMDkwNDItMC4xNjk0YTEuNDkzNSAxLjQ5MzUgMCAwIDEtMC4xMjIzOS0wLjMyNTA0IDAuMDIxMTc1IDAuMDIxMTc1IDAgMCAwLTAuMDE4NjMtMC4wMjEyIDAuMDI5MjIyIDAuMDI5MjIyIDAgMCAwLTAuMDE1NDYgMGMtMC4wMDExIDAtMC4wMDI4IDJlLTMgLTRlLTMgMmUtMyAtMC4wMDEzIDQuMmUtNCAtNGUtMyAyZS0zIC0wLjAwNTkgM2UtM2wwLjAwMzItNmUtM2MtMi4wNjE0IDEuMjA3LTIuNzYwOSAzLjQ0MTQtMi44MjUyIDQuNTU5MSAwLjA5NTcxMy03ZS0zIDAuMTkwNTgtMC4wMTQ2IDAuMjg4NDEtMC4wMTQ2YTQuMTQxOSA0LjE0MTkgMCAwIDEgMy41OTYgMi4xIDIuODMzMyAyLjgzMzMgMCAwIDAtMS45Nzg4LTAuNDgwNDdjMi45NTE5IDEuNDc1OSAyLjE1OTkgNi41NTg0LTEuOTMxIDYuMzY2NmEzLjY0OTYgMy42NDk2IDAgMCAxLTEuMDY4LTAuMjA1MDhxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1YzAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3OTUtMS44Mjk4LTEuNDk3MS0xLjkzMzEtMi42ODU5IDAgMCAwLjM3ODgzLTEuNDExOCAyLjcxMjYtMS40MTE4IDAuMjUyMiAwIDAuOTc0MDctMC43MDQwOCAwLjk4Njk5LTAuOTA4MjEtMC4wMDMxOC0wLjA2NjctMS40MzE1LTAuNjM1MjYtMS45ODg0LTEuMTgzNy0wLjI5NzUxLTAuMjkzMjgtMC40Mzg3NS0wLjQzNDUyLTAuNTYzOS0wLjU0MDYxYTIuNDUzNiAyLjQ1MzYgMCAwIDAtMC4yMTE3NS0wLjE2MDUxIDMuODA0OCAzLjgwNDggMCAwIDEtMC4wMjMwODEtMi4wMDYgNi4wNzg0IDYuMDc4NCAwIDAgMC0xLjk3NTUgMS41MjY4aC0wLjAwMzgxYy0wLjMyNTI2LTAuNDEyNjMtMC4zMDIzOS0xLjc3MjEtMC4yODM3NS0yLjA1NmExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDg0NzAyIDAuNDM4OTYtMC4wOTQ2NTQgMC41MTc3NHYwYTkuNTQ4OCA5LjU0ODggMCAwIDAtMC4xMjExMiAxLjE0NDF2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6bS0wLjgxNDIgMC40MjE2IDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNsKSIvPgogICA8L2c+CiAgIDxjaXJjbGUgY3g9Ii0xOS4zNDciIGN5PSIyOTQuNTMiIHI9IjAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9IiNkNWQzY2YiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"firefox,firefox,mozilla,web,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"firefox.desktop\"\nLABEL oc.launch=\"Navigator.firefox\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Firefox\"\nLABEL oc.displayname=\"Firefox (alpine)\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"htm;html;xml;gif\"\nLABEL oc.legacyfileextensions=\"htm;html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Firefox\"\nENV APPBIN \"/usr/bin/firefox\"\nENV APP \"/usr/bin/firefox\"\nLABEL oc.usedefaultapplication=true\nCOPY composer/init.d/init.firefox /composer/init.d/init.firefox\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/firefox/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/firefox/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Firefox

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Firefox.d\n
"},{"location":"applications/firefox/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Firefox.d -t Firefox .\n
"},{"location":"applications/firefox/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Firefox > Firefox.json\ndocker image save Firefox -o Firefox.tar\nctr -n k8s.io images import Firefox.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Firefox.json\n\n
"},{"location":"applications/firefoxrest/","title":"FirefoxRest","text":""},{"location":"applications/firefoxrest/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk.firefox.rest

"},{"location":"applications/firefoxrest/#use-ubuntu-package","title":"use ubuntu package","text":"

firefox winbind

"},{"location":"applications/firefoxrest/#arguments","title":"Arguments","text":"

\"--class=Rest.Firefox\"

"},{"location":"applications/firefoxrest/#display-name","title":"Display name","text":"

\"Firefox-Rest\"

"},{"location":"applications/firefoxrest/#path","title":"path","text":"

\"/usr/bin/firefox\"

"},{"location":"applications/firefoxrest/#mime-type","title":"Mime Type","text":"

\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"

"},{"location":"applications/firefoxrest/#file-extensions","title":"File extensions","text":"

\"html;xml;gif\"

"},{"location":"applications/firefoxrest/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"html;xml\"

"},{"location":"applications/firefoxrest/#pre-run-command","title":"Pre run command","text":"
\nCOPY composer/init.d/init.firefox /composer/init.d/init.firefox\n
"},{"location":"applications/flare/","title":"flare","text":""},{"location":"applications/flare/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/flare/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/flare/#ubuntu-packages","title":"Ubuntu packages","text":"
flare-game\n
"},{"location":"applications/flare/#arguments","title":"Arguments","text":"

\"--game=flare-game\"

"},{"location":"applications/flare/#path","title":"Path","text":"
/usr/games/flare\n
"},{"location":"applications/flare/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/flare/#wm_class","title":"WM_CLASS","text":"
flare.flare\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/flare/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/flare.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/flare/#json-dump","title":"JSON dump","text":"

json source file flare.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"flare-game\",\n    \"icon\": \"flare.svg\",\n    \"keyword\": \"flare-game,role,playing\",\n    \"launch\": \"flare.flare\",\n    \"name\": \"flare\",\n    \"args\": \"--game=flare-game\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    },\n    \"path\": \"/usr/games/flare\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/flare.desktop\"\n}\n
"},{"location":"applications/flare/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output flare.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/flare.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @flare.d.3.0.json\n\n
"},{"location":"applications/flare/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends flare-game && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"flare.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNzQ0LjA5NDQ4ODE5IgogICBoZWlnaHQ9IjEwNTIuMzYyMjA0NyIKICAgaWQ9InN2ZzIiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYiCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL1VzZXJzL2NsaW50YmVsbGFuZ2VyL0Rlc2t0b3AvZmxhcmUucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMTUwIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMTUwIgogICBzb2RpcG9kaTpkb2NuYW1lPSJmbGFyZV9sb2dvLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzE2MyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmM2NDE7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzE2NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmN2YwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzMTY3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMTAiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMxNjMiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMTk3IgogICAgICAgY3g9IjM4MS44ODg5MiIKICAgICAgIGN5PSI0MTcuNTIxODIiCiAgICAgICBmeD0iMzgxLjg4ODkyIgogICAgICAgZnk9IjQxNy41MjE4MiIKICAgICAgIHI9IjE2Ni45NjU1MiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA1MjY1LDAsMCwxLjU4Nzk5NjIsLTE5LjQxNzYzNywtMTM2LjQ1OTc5KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMC40OCIKICAgICBpbmtzY2FwZTpjeD0iNDk1LjM3ODAyIgogICAgIGlua3NjYXBlOmN5PSI2MjIuNjcwNjUiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6c25hcC1nbG9iYWw9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzU2IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjcxMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iNDQ1IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIj4KICAgIDxpbmtzY2FwZTpncmlkCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBpZD0iZ3JpZDIzODUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzMTk3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDM1OS4xNzIxNiwyMzIuODMzOTcgQyAzNTkuMTcyMTYsMjMyLjgzMzk3IDM3Ny42ODAyMiwzMTQuNTg3MzkgMzcyLjkyNjkzLDM0Mi4xNTczNyBDIDM2OC4yNTIxNCwzNjkuMjcxOTkgMzUzLjM3NzgsNDAzLjUxNzI3IDMyNy40MzUzOCw0MTQuMDA0MjggQyAzMTkuMzUyNDQsNDE3LjI3MTc0IDI5NC40ODQ5Niw0MDAuNjk5ODEgMjg1LjQzMDM0LDM5MC4zNzMxIEMgMjc2LjM3NTczLDM4MC4wNDYzOSAyNzAuMTQ0ODQsMzUxLjA0NzQ0IDI3MC4xNDQ4NCwzNTEuMDQ3NDQgQyAyNzAuMTQ0ODQsMzUxLjA0NzQ0IDI2NC4zNTQwMiwzNzYuMzM5NTIgMjY3LjAxODYzLDQwMC43NDAyNyBDIDI2OS42ODMyMyw0MjUuMTQxMDIgMjgwLjgyNTMxLDQ2MC44OTMxMiAyNzkuOTc0NTUsNDc5LjYzNTU1IEMgMjc5LjA1NDU5LDQ5OS45MDIxNSAyNjUuMjE1MTYsNTIyLjExOTk1IDI2NS4yMTUxNiw1MjIuMTE5OTUgQyAyNjUuMjE1MTYsNTIyLjExOTk1IDI1Ni43MTY5OCw0OTguNDU1NzMgMjQ4LjM3MTY5LDQ4Mi42NjIxMiBDIDI0MC4wMjY0LDQ2Ni44Njg1MSAyMTcuOTcxMTUsNDQ1LjU2MDU0IDIxNy45NzExNSw0NDUuNTYwNTQgQyAyMTcuOTcxMTUsNDQ1LjU2MDU0IDIyOS40MTg0Niw0NzEuNjg3MzMgMjI5LjgzOTU0LDQ5Ni4xMDg5OSBDIDIzMC4yNjA2Miw1MjAuNTMwNjUgMTg2LjI0NDM0LDU3Mi4xNzYyNCAyMzEuMDMyNTUsNjM5LjMxMzkxIEMgMjc2LjMwNzE5LDcwNy4xODA3NiAzNDQuMDgxMTQsNjk5LjI2ODQzIDM0NC4wODExNCw2OTkuMjY4NDMgTCAzNjAuNTY5MDMsNjkzLjIwNTkzIEwgMjk3LjI5NjM4LDY2Mi4yMDU5MyBMIDM3OC45Mzg1LDYyMi4yMDU5MyBMIDI5Ny4yOTYzOCw1ODIuMjA1OTMgTCAzNzguOTM4NSw1NDIuMjA1OTMgTCA0NjAuNTgwNjIsNTgyLjIwNTkzIEwgNTMxLjY2NjY3LDU0Ny4zNjIxOCBMIDUyOS42ODk0LDUzNi4wODA5MyBMIDQ2MC41ODA2Miw1MDIuMjA1OTMgTCA1MjAuNzU5NzksNDcyLjczNzE4IEwgNTE4LjMzNjA0LDQ1Mi45MjQ2OCBMIDUwOC4zODU5MSwzNzkuNzY4NDMgQyA1MDguMzg1OTEsMzc5Ljc2ODQzIDQ5Ni45MzY2MSw0MDQuMTI0OTggNDg0LjI1NDgyLDQxMi42Nzk0MSBDIDQ3NS45MDg1Nyw0MTguMzA5MzEgNDU1LjM0ODg1LDQyMC4zMjMxNiA0NTUuMzQ4ODUsNDIwLjMyMzE2IEMgNDU1LjM0ODg1LDQyMC4zMjMxNiA0NDQuMDkyOTcsMzYwLjI5MTYzIDQzMi4yNDUwOSwzMjkuMDU3NSBDIDQxMS4wOTE2NCwyNzMuMjkxNCAzNTkuMTcyMTYsMjMyLjgzMzk3IDM1OS4xNzIxNiwyMzIuODMzOTcgeiBNIDQ2MC41ODA2Miw1ODIuMjA1OTMgTCAzNzguOTM4NSw2MjIuMjA1OTMgTCA0NTMuODgzNDIsNjU4LjkyNDY4IEwgNDgzLjQ3ODY4LDY0OC4wNDk2OCBMIDUxNi42MTM5LDYwOS42NzQ2OCBMIDQ2MC41ODA2Miw1ODIuMjA1OTMgeiIKICAgICAgIGlkPSJwYXRoMjM4MyIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3NzemN6c2N6Y3p6Y2NjY2NjY2NjY2NjY3Njc2NjY2NjY2MiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"flare,flare-game,role,playing\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"flare.desktop\"\nLABEL oc.launch=\"flare.flare\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--game=flare-game\"\nLABEL oc.name=\"flare\"\nLABEL oc.displayname=\"flare\"\nLABEL oc.path=\"/usr/games/flare\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"flare\"\nENV APPBIN \"/usr/games/flare\"\nLABEL oc.args=\"--game=flare-game\"\nENV APP \"/usr/games/flare\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/flare/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/flare/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application flare

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/flare.d\n
"},{"location":"applications/flare/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f flare.d -t flare .\n
"},{"location":"applications/flare/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect flare > flare.json\ndocker image save flare -o flare.tar\nctr -n k8s.io images import flare.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @flare.json\n\n
"},{"location":"applications/frozen-bubble/","title":"frozen-bubble","text":""},{"location":"applications/frozen-bubble/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/frozen-bubble/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/frozen-bubble/#ubuntu-packages","title":"Ubuntu packages","text":"
frozen-bubble\n
"},{"location":"applications/frozen-bubble/#displayname","title":"Displayname","text":"
frozen-bubble\n
"},{"location":"applications/frozen-bubble/#path","title":"Path","text":"
/usr/games/frozen-bubble\n
"},{"location":"applications/frozen-bubble/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/frozen-bubble/#wm_class","title":"WM_CLASS","text":"
perl.perl\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/frozen-bubble/#json-dump","title":"JSON dump","text":"

json source file frozen-bubble.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"frozen-bubble\",\n    \"icon\": \"frozen-bubble.svg\",\n    \"keyword\": \"frozen,bubble\",\n    \"launch\": \"perl.perl\",\n    \"name\": \"frozen-bubble\",\n    \"displayname\": \"frozen-bubble\",\n    \"path\": \"/usr/games/frozen-bubble\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/frozen-bubble/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output frozen-bubble.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/frozen-bubble.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @frozen-bubble.d.3.0.json\n\n
"},{"location":"applications/frozen-bubble/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends frozen-bubble && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"frozen-bubble.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZlcnNpb249IjEiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDQ2NDgiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojN2QzMjlhIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FjNWNjZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NDY1MiIgeDE9IjMwLjU3NyIgeDI9IjQ1IiB5MT0iMTkuMTI5IiB5Mj0iMjcuNDU2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNzA1ODgyMzcsMCwwLDAuNjY2NjY2NywtMC43NjQ3MDU1MSwtNWUtNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0NjQ4Ii8+CiA8L2RlZnM+CiA8cGF0aCBzdHlsZT0ib3BhY2l0eTowLjIiIGQ9Ik0gMTEuNzk5OTU3LDE2LjQ0NjA2IEMgMTAuMzc3MTY1LDIwLjg0NjE2MiA3LjY1ODQ0ODMsMjUuNzI3NjI5IDIsMjQuOTA5NDkyIDIuMzc0MTYxOCwyMS4yMjkyMjQgMy45MDIwMDg0LDE3LjUyMzc5OSA2LjA2MDI1NTEsMTQuNTUwNTAxIDYuNTE1MjE3NSwxMy45MjM3MjggNy40NTM5NzIyLDEzLjY0NTg1NCA3Ljg0MjI4MTUsMTMuMTAwMDUyIFoiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0iTSAxNC4wMTg4MDUsMy4wMDAwMDA1IEMgMTAuNjU2ODE2LDMuMDQ5NTYyNSAzLjkyNTEyMjcsOC41Mzc4ODYzIDMuMDkwNjc2LDE1LjEzNzgzOCBjIC0wLjI0MDI4NzUsMS45MDA1MjQgMC4wMDYzNiwzLjkyNDEwNCAwLjYyODcwNzQsNS44MTQ2MjIgMC4zNDM5NDI2LDUuOTMyODk0IDguMTM0NTY5Niw5LjcyMzE2MiAxMy4wMDAyMjU2LDEwLjA0NDY4MyA1Ljk1MjYzOCwwLjE0MDI0OCAxMS41MTIxNDQsLTQuOTI0MjUxIDEyLjYwNDY4MiwtNi4yODM1NjYgMS45OTgxLC0yLjk1NTA1MyAtMC44Mjk5OTcsLTkuMzI1MTIxIC0zLjM1MzEwNiwtMTMuMDM0NzA4IC0yLjc2ODkwMSwtNC4wNzA5NjU3IC03LjkzMDU2LC03LjAzNTIwNzUgLTExLjk1MjM4LC04LjY3ODg2ODUgeiIvPgogPHBhdGggc3R5bGU9ImZpbGw6IzY1MzU3OCIgZD0iTSAxMS43OTk5NTcsMTUuNDQ2MDYgQyAxMC4zNzcxNjUsMTkuODQ2MTYyIDcuNjU4NDQ4MywyNC43Mjc2MjkgMiwyMy45MDk0OTIgMi4zNzQxNjE4LDIwLjIyOTIyNCAzLjkwMjAwODQsMTYuNTIzNzk5IDYuMDYwMjU1MSwxMy41NTA1MDEgNi41MTUyMTc1LDEyLjkyMzcyOCA3LjQ1Mzk3MjIsMTIuNjQ1ODU0IDcuODQyMjgxNSwxMi4xMDAwNTIgWiIvPgogPHBhdGggc3R5bGU9ImZpbGw6IzdkMzI5YSIgZD0iTSAxNC4wMTg4MDUsMiBDIDEwLjY1NjgxNiwyLjA0OTU2MiAzLjkyNTEyMjcsNy41Mzc4ODU4IDMuMDkwNjc2LDE0LjEzNzgzOCBjIC0wLjI0MDI4NzUsMS45MDA1MjQgMC4wMDYzNiwzLjkyNDEwNCAwLjYyODcwNzQsNS44MTQ2MjIgMC4zNDM5NDI2LDUuOTMyODk0IDguMTM0NTY5Niw5LjcyMzE2MiAxMy4wMDAyMjU2LDEwLjA0NDY4MyA1Ljk1MjYzOCwwLjE0MDI0OCAxMS41MTIxNDQsLTQuOTI0MjUxIDEyLjYwNDY4MiwtNi4yODM1NjYgMS45OTgxLC0yLjk1NTA1MyAtMC44Mjk5OTcsLTkuMzI1MTIxIC0zLjM1MzEwNiwtMTMuMDM0NzA4IEMgMjMuMjAyMjg0LDYuNjA3OTAyOCAxOC4wNDA2MjUsMy42NDM2NjEgMTQuMDE4ODA1LDIgWiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4xO2ZpbGw6I2ZmZmZmZiIgZD0iTSAxNC4wMTk1MzEgMiBDIDEwLjY1NzU0MiAyLjA0OTU2MiAzLjkyNDI5MDQgNy41Mzg3MTk3IDMuMDg5ODQzOCAxNC4xMzg2NzIgQyAzLjAwODE3NTIgMTQuNzg0NjE5IDMuMDAyODMzOSAxNS40NDUwNTQgMy4wMjkyOTY5IDE2LjEwOTM3NSBDIDMuMDQyNjk1NyAxNS43ODQwOTIgMy4wNDk0NDMzIDE1LjQ1ODIxNCAzLjA4OTg0MzggMTUuMTM4NjcyIEMgMy45MjQyOTA0IDguNTM4NzIwMiAxMC42NTc1NDIgMy4wNDk1NjIgMTQuMDE5NTMxIDMgQyAxOC4wNDEzNTEgNC42NDM2NjEgMjMuMjAxODAyIDcuNjA4NzIxOCAyNS45NzA3MDMgMTEuNjc5Njg4IEMgMjcuODAyNzQyIDE0LjM3MzIzMiAyOS43ODcyNTQgMTguNDYzNjUgMjkuOTc2NTYyIDIxLjYzNjcxOSBDIDMwLjIyNjc3OSAxOC4zNzE3MzkgMjguMDAxNzUzIDEzLjY2NTgyNyAyNS45NzA3MDMgMTAuNjc5Njg4IEMgMjMuMjAxODAyIDYuNjA4NzIxMyAxOC4wNDEzNTEgMy42NDM2NjEgMTQuMDE5NTMxIDIgeiIvPgogPGVsbGlwc2Ugc3R5bGU9ImZpbGw6I2ZjZjhmZCIgY3g9Ii05LjAyMiIgY3k9IjIxLjU2NSIgcng9IjQuNzk0IiByeT0iNi4xMjUiIHRyYW5zZm9ybT0ibWF0cml4KDAuNjc4MTYyNDUsLTAuNzM0OTEyMDMsMC43MjQyNjM0OSwwLjY4OTUyMzMxLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0ibSAyMi4zNzQxNCwxMSBjIDQuNDM3MDk2LDEuNDUxODM1IDkuMzU5NjA3LDQuMjI2MDQ4IDguNTM0NTkxLDEwIEMgMjcuMTk3NTIyLDIwLjYxODIgMjMuNDYwOTQyLDE5LjA1OTE2NSAyMC40NjI2NDQsMTYuODU2ODY0IDE5LjgzMDYsMTYuMzkyNjE2IDE5LjU1MDM5MSwxNS40MzQ2OTcgMTksMTUuMDM4NDYxIFoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NjUyKSIgZD0ibSAyMi4zNzQxNCwxMCBjIDQuNDM3MDk2LDEuNDUxODM1IDkuMzU5NjA3LDQuMjI2MDQ4IDguNTM0NTkxLDEwIEMgMjcuMTk3NTIyLDE5LjYxODIgMjMuNDYwOTQyLDE4LjA1OTE2NSAyMC40NjI2NDQsMTUuODU2ODY0IDE5LjgzMDYsMTUuMzkyNjE2IDE5LjU1MDM5MSwxNC40MzQ2OTcgMTksMTQuMDM4NDYxIFoiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0iTSAxMiwxNiBDIDEyLjY5NDgxMywxOS4wMTY4MTEgNi43MDI3NjcsMjIuMTI4MDAzIDMuNjk2NTI3OCwyMC45MTk4MTEgMi4yNDk1NDMzLDIwLjMzODI3NSAyLjAwMjk2NjQsMTguMTI0MTgyIDIuMDYzOTI2MywxNi4zOTE5NyAyLjEyNTM3NDMsMTQuODU3NjUgMS45NzE0NjEzLDE0LjM5MDQ3MSAzLjUwNzQ4NDIsMTQuMjQ0MDUyIDYuNDE2NTMxOSwxMy45NzQ1NDkgMTEuNjk0Njg3LDE0LjY3NDM0NyAxMiwxNiBaIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZjMTAyIiBkPSJtIDExLjk0NDQxNCwxNC44MTMxMzcgYyAwLjY5NDgxMywzLjAxNjgxMSAtNS4yOTcyMzMsNi4xMjgwMDMgLTguMzAzNDcyMiw0LjkxOTgxMSAtMS40NDY5ODQ1LC0wLjU4MTUzNiAtMS42OTM1NjE0LC0yLjc5NTYyOSAtMS42MzI2MDE1LC00LjUyNzg0MSAwLjA2MTQ0OCwtMS41MzQzMiAtMC4wOTI0NjUsLTIuMDAxNDk5IDEuNDQzNTU3OSwtMi4xNDc5MTggMi45MDkwNDc3LC0wLjI2OTUwMyA4LjE4NzIwMjgsMC40MzAyOTUgOC40OTI1MTU4LDEuNzU1OTQ4IHoiLz4KIDxjaXJjbGUgc3R5bGU9Im9wYWNpdHk6MC4yIiBjeD0iLTQiIGN5PSIxMiIgcj0iMyIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0ib3BhY2l0eTowLjIiIGN4PSItMTAuNSIgY3k9IjExLjUiIHI9IjQuNSIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iLTQiIGN5PSIxMSIgcj0iMyIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iLTEwLjUiIGN5PSIxMC41IiByPSI0LjUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KIDxjaXJjbGUgc3R5bGU9ImZpbGw6IzNmM2YzZiIgY3g9Ii05IiBjeT0iMTEiIHI9IjIiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KIDxjaXJjbGUgc3R5bGU9ImZpbGw6IzNmM2YzZiIgY3g9Ii0zLjUiIGN5PSIxMS41IiByPSIxLjUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KPC9zdmc+Cgo=\"\nLABEL oc.keyword=\"frozen-bubble,frozen,bubble\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"perl.perl\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"frozen-bubble\"\nLABEL oc.displayname=\"frozen-bubble\"\nLABEL oc.path=\"/usr/games/frozen-bubble\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"frozen-bubble\"\nENV APPBIN \"/usr/games/frozen-bubble\"\nENV APP \"/usr/games/frozen-bubble\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/frozen-bubble/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/frozen-bubble/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application frozen-bubble

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/frozen-bubble.d\n
"},{"location":"applications/frozen-bubble/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f frozen-bubble.d -t frozen-bubble .\n
"},{"location":"applications/frozen-bubble/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect frozen-bubble > frozen-bubble.json\ndocker image save frozen-bubble -o frozen-bubble.tar\nctr -n k8s.io images import frozen-bubble.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @frozen-bubble.json\n\n
"},{"location":"applications/gcompris/","title":"GCompris","text":""},{"location":"applications/gcompris/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.20.04

"},{"location":"applications/gcompris/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/gcompris/#ubuntu-packages","title":"Ubuntu packages","text":"
qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt\n
"},{"location":"applications/gcompris/#path","title":"Path","text":"
/usr/games/gcompris-qt\n
"},{"location":"applications/gcompris/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/gcompris/#wm_class","title":"WM_CLASS","text":"
gcompris-qt.gcompris-qt\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/gcompris/#json-dump","title":"JSON dump","text":"

json source file gcompris.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt\",\n    \"icon\": \"gcompris.svg\",\n    \"installrecommends\": true,\n    \"keyword\": \"gcompris\",\n    \"launch\": \"gcompris-qt.gcompris-qt\",\n    \"name\": \"GCompris\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/games/gcompris-qt\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.20.04\"\n}\n
"},{"location":"applications/gcompris/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output gcompris.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gcompris.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gcompris.d.3.0.json\n\n
"},{"location":"applications/gcompris/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.20.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gcompris.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjY0IgogICBoZWlnaHQ9IjY0IgogICB2aWV3Qm94PSIwIDAgNjQgNjQiCiAgIGlkPSJzdmc0MjUwIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJnY29tcHJpcy1pY29uLnN2ZyIKICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSIvaG9tZS90aW1vL2Rlc3Npbi9HQ29tcHJpei9nY29tcHJpcy1pY29uMDctMjU2LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjM2MCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjM2MCI+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2I4YjhiOCIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI4IgogICAgIGlua3NjYXBlOmN4PSIxNS45ODA2NzYiCiAgICAgaW5rc2NhcGU6Y3k9IjU1Ljk0NzE3MiIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIKICAgICB1bml0cz0icHgiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxODc4IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwNTEiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBzaG93Z3VpZGVzPSJmYWxzZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgZW1wc3BhY2luZz0iNCIKICAgICAgIGlkPSJncmlkNTU3MyIKICAgICAgIHR5cGU9Inh5Z3JpZCIgLz4KICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDI1MiI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDkxMzgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjI1MTIwNzc0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wOTE0MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A5MTQyIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50ODk4OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzJhNDM7c3RvcC1vcGFjaXR5OjAuNTAxOTYwODEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A4OTkwIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTMzZTZiO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wODk5MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQyNDMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDQyNDUiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2NmNWUxOTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A0MjQ3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlNzc5MzY7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iNTYzLjQ1MjM5IgogICAgICAgeDI9IjQ0OC4xNTc4NyIKICAgICAgIHkxPSI2MTUuMTU5NTUiCiAgICAgICB4MT0iNDQ4LjE1Nzg3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDI0OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQyNDMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMDY5MDI4NDUsMC4yOTc3MzEwMSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDg5ODgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ4OTk0IgogICAgICAgeDE9IjQ1LjI4OTA1MSIKICAgICAgIHkxPSI5NS43NDU4NTciCiAgICAgICB4Mj0iNDUuMjg5MDUxIgogICAgICAgeTI9IjQ4Ljc2ODk0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzY5ODYyNDYsMCwwLDAuMzY5ODYyNDYsNDUyLjEzMzksNTc3LjM2MSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDkxMzgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ5MTQ0IgogICAgICAgeDE9IjMzLjAxMDQ0OCIKICAgICAgIHkxPSI2My42NDM2MTYiCiAgICAgICB4Mj0iMzMuMDEwNDQ4IgogICAgICAgeTI9IjEuNDE4MjE4OSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg0MTkuNzQzNzEsNTUzLjAzMTcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5MTM4IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50OTE2NyIKICAgICAgIHgxPSI0NTEuMDc0NTgiCiAgICAgICB5MT0iNjE0LjQxNTEiCiAgICAgICB4Mj0iNDUxLjA3NDU4IgogICAgICAgeTI9IjU1NS4yODMzMyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMC45NTg3NTg3OSwtMy45MjI5ODM4ZS00KSIgLz4KICA8L2RlZnM+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDI1NSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGUgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyMC43MDI0NywtNTUzLjAzMjA5KSIKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhbHF1ZSAxIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjEwNTU2OTIxLDEuMjUwMzA1NWUtNCwtMS4yNTA2NzJlLTQsMC4xMDU1MzgyOCw0MTkuMTY0NzMsNTc3LjEwNTcyKSIKICAgICAgIGlkPSJnMzY5Mi0xLTAtMC03LTQtMyIKICAgICAgIHN0eWxlPSJzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjQuMzg2NjkzO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0iZzU0NTMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjQ1NTkyNDI4LDAsMCwwLjQ1NTkyNDMzLDIzNS4yNDEzOSwzODAuOTgyNzQpIj4KICAgICAgPGcKICAgICAgICAgaW5rc2NhcGU6bGFiZWw9ImJhbGwiCiAgICAgICAgIGlkPSJsYXllcjMtMiIKICAgICAgICAgc3R5bGU9InN0cm9rZTpub25lO3N0cm9rZS13aWR0aDo0LjM4NjY5MztzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KICAgIDwvZz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMTg5NjEtMS05IgogICAgICAgZD0ibSA0NzQuMzU4OTQsNTg2Ljc3Nzc5IGMgLTAuNTU2ODEsLTAuMDE4NSAtMy4wOTgyNiwwLjAxMjIgLTMuNjE1MjMsMC4wMzMyIGwgLTAuNSwyNi4yNDgwNCBjIDEuNTY4MDgsLTAuMjc4OTQgNS42Mjk4MSwtMC44Mjg3NyA3LjE3NzczLC0xLjEyMzA0IDIuNjQ5MDQsLTEuMDc4ODYgMi44NjgzMywtNC4zOTk2MyA0LjQwNjI1LC02LjQ1NzAzIDEuMTM5MjMsLTIuMzcyNzcgMi41ODk3NywtNC44ODQxNiAyLjczNjMzLC03LjQ5NDE0IC0xLjkxNTAyLC0zLjkzOTAzIC00Ljk2MTk2LC03LjIxMTQzIC03LjgwNDY5LC0xMC40NzY1NyAtMC42OTEwMSwtMC41MjU2NSAtMS41NDYxMSwtMC42OTUzNyAtMi40MDAzOSwtMC43MzA0NyB6IgogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNDE4Mi0zIgogICAgICAgZD0ibSA0MjguNjgyMzEsNTU3LjMzODc1IGMgLTEyLjA2NDcsMTMuMDIwMzggLTkuODk0MjgsMzUuNjczMTggNC4zNTU0Nyw0Ni4yMTI4OSAxMi4xODUzNyw5Ljk5OTkxIDMxLjQwMjIzLDguNjc2OTMgNDIuNDA4MiwtMi40OTYxIC0zLjMyODAxLC0zLjI3Mjk3IC02LjMzNTg5LC0yLjUzNzMzIC0xMC4yNSwyLjY4OTQ2IC0xMi4yNTA2Niw4LjY1Mjc5IC0zNS4xNzk3MSwtNC44MzcyOSAtMzguNTk1NywtMTkuMTA1NDcgLTIuMzQwNzMsLTcuODk4MDUgMC4xMzU1NiwtMTYuNzM3NzQgNS43ODcxMSwtMjIuNjQyNTggLTIuMzI1MDYsLTAuNDQ2ODMgLTEuMjQwMzUsLTUuNjQ3MTkgLTMuNzA1MDgsLTQuNjU4MiB6IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InJlY3Q1Mjk3LTUiCiAgICAgICBkPSJtIDQ1MC45NTQ1OSw2MDcuNTM2NjcgYyAtNi4zNTc0OCwwLjYyOTgxIC0xNC44OTYzNywwLjA5ODcgLTE5LjAyMTk0LDUuNjIyOTggLTIuNjg4NzksNS4wOTg2OCA0LjEyOTcsMy4zNDAyNyA3LjU2NTI3LDMuNTQ5MTQgMTEuNTU4OTMsMCAyMy4xMTc4OCwwIDM0LjY3NjgxLDAgMC43MTc5MSwtNy4xNTgxMSAtOC42NDY4MiwtOC4yMDc4MSAtMTQuMTQyMTksLTguODQ0NDggLTMuMDE0MDksLTAuMjk5MjYgLTYuMDQ4NywtMC4zOTE0NCAtOS4wNzc5NSwtMC4zMjc2NCB6IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxyZWN0CiAgICAgICByeD0iMS42NDczOTMyZS0wNyIKICAgICAgIHk9IjYwNy4zOTM3NCIKICAgICAgIHg9IjQ1MC44NDQ3IgogICAgICAgaGVpZ2h0PSI0Ljg0MDIwNjYiCiAgICAgICB3aWR0aD0iMy44NzIxNjUyIgogICAgICAgaWQ9InJlY3Q1MzAwIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNlNzc5MzY7ZmlsbC1vcGFjaXR5OjAuOTcyNTQ5MDI7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxlbGxpcHNlCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGlkPSJwYXRoNDg0OC02IgogICAgICAgY3g9IjQ1Mi42NTE3MyIKICAgICAgIGN5PSI1NzguMzUyNTQiCiAgICAgICByeD0iMjMuMTExOTE3IgogICAgICAgcnk9IjIzLjExMTkyMSIgLz4KICAgIDxyZWN0CiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjcwNzEwNjc4LC0wLjcwNzEwNjc4LDAuNzA3MTA2NzgsMC43MDcxMDY3OCwwLDApIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGlkPSJyZWN0NDE4MC0zLTciCiAgICAgICB3aWR0aD0iNy42Mzg5Njg1IgogICAgICAgaGVpZ2h0PSI2NC40OTQ1OTgiCiAgICAgICB4PSItOTIuOTY4NTc1IgogICAgICAgeT0iNjk3LjA0ODIyIgogICAgICAgcng9IjMuMjQ5OTY5OWUtMDciCiAgICAgICByeT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50OTE0NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0ibSA0MzIuNTUwMzUsNTUzLjIyNTA2IC01LjQwMjM0LDUuNDAwMzkgMC4yMzQzOCwwLjIzNDM4IGMgLTEwLjU3NTgxLDEzLjE5OTAyIC04LjA1NDc0LDM0LjU1MDE4IDUuNjU2MjUsNDQuNjkxNCAyLjU2MTY0LDIuMTAyMjIgNS40MzUwMiwzLjY5OTM2IDguNDc2NTYsNC44MTQ0NSAtMy43OTEzNSwwLjU4MzQ4IC03LjMzOTUxLDEuNzkyMTEgLTkuNTgyMDMsNC43OTQ5MyAtMi42ODg3OSw1LjA5ODY3IDQuMTI4ODgsMy4zMzk5NiA3LjU2NDQ1LDMuNTQ4ODIgbCAzNC42Nzc3MywwIGMgMC4xNjg3MSwtMS42ODIxNSAtMC4yMjQ0MywtMy4wMjQwNyAtMC45ODgyOCwtNC4xMDU0NiAxLjYzNjU5LC0wLjI0MzY3IDMuMzE5OTgsLTAuNDk0MTQgNC4yMzQzOCwtMC42Njc5NyAyLjY0OTA0LC0xLjA3ODg2IDIuODY4MzMsLTQuMzk5NjIgNC40MDYyNSwtNi40NTcwMyAxLjEzOTIzLC0yLjM3Mjc2IDIuNTg5NzcsLTQuODg0MTUgMi43MzYzMywtNy40OTQxNCAtMS45MTUwMiwtMy45MzkwMyAtNC45NjE5NiwtNy4yMTE0MyAtNy44MDQ2OSwtMTAuNDc2NTcgLTAuNjkxMDEsLTAuNTI1NjUgLTEuNTQ2MTEsLTAuNjk1MzYgLTIuNDAwMzksLTAuNzMwNDcgLTAuMDMyNSwtMTBlLTQgLTAuMTY1NzMsMC4wMDMgLTAuMjEwOTQsMC4wMDIgMS4wNTk3OCwtMi42ODM3OSAxLjYwNzYzLC01LjU0MjMgMS42MTUyMywtOC40Mjc3NCAtMy4zZS00LC0xMi43NjM5IC0xMC4zNDc0MiwtMjMuMTExIC0yMy4xMTEzMiwtMjMuMTExMzMgLTQuODk3NDYsMC4wMSAtOS42NjUxMywxLjU3NTU2IC0xMy42MTUyNCw0LjQ3MDcxIGwgLTYuNDg2MzMsLTYuNDg2MzMgeiBtIC0xLjA0Njg3LDkuNzU1ODYgMi4xNzk2OSwyLjE3OTY5IGMgLTIuNjk0NiwzLjg3MTM5IC00LjE0MDE3LDguNDc0NTYgLTQuMTQyNTgsMTMuMTkxNCAtNy41ZS00LDEyLjc2NDY2IDEwLjM0NjY3LDIzLjExMjk2IDIzLjExMTMzLDIzLjExMzI4IDQuNzEzODQsLTAuMDEgOS4zMTE5OCwtMS40NjA3MiAxMy4xNzc3MywtNC4xNTgyIGwgMi44MjYxNywyLjgyNjE3IGMgLTEuMDg5MDIsMC43NzA0NyAtMi4yMjkwNCwxLjk2ODkxIC0zLjQ1ODk4LDMuNjExMzMgLTEyLjI1MDY2LDguNjUyOCAtMzUuMTc5NzEsLTQuODM3MjkgLTM4LjU5NTcsLTE5LjEwNTQ3IC0yLjIxNDM4LC03LjQ3MTcyIC0wLjExNTMyLC0xNS43ODMwNiA0LjkwMjM0LC0yMS42NTgyIHogbSAzOC44OTA2Miw0Mi4xNjYwMSAtMC4wOTc2LDUuMTAzNTIgYyAtMS45MDUwNCwtMC45NzIxNiAtNC4yNDQwNiwtMS41MTM0NyAtNi40ODQzOCwtMS44NzUgMi4zMDY4NSwtMC44MTk1NCA0LjUyMDM0LC0xLjg5NzM3IDYuNTgyMDMsLTMuMjI4NTIgeiIKICAgICAgIGlkPSJwYXRoMTg5NjEtMS05LTMiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNDE4MiIKICAgICAgIGQ9Im0gNDMwLjIwMTk4LDU1OC42NCBjIC00Ljc3NzU5LDUuNDU3IC03LjQxNzE3LDEyLjQ1OTYzIC03LjQzMDQ4LDE5LjcxMjUgMCwxNi41NzM2NiAxMy40MzU2MSwzMC4wMDkyNyAzMC4wMDkyOCwzMC4wMDkyNyA3LjI1NTI5LC0wLjAwOCAxNC4yNjIyNCwtMi42NDMwOSAxOS43MjM4NCwtNy40MTkxMyBsIC0zLjUyMjM3LC0zLjUyMjM3IGMgLTQuNTIwOCwzLjg1MSAtMTAuMjYyOCw1Ljk3MDUgLTE2LjIwMTQ3LDUuOTgwMjkgLTEzLjgzMzY2LDAgLTI1LjA0ODA4LC0xMS4yMTQzOSAtMjUuMDQ4MDgsLTI1LjA0ODA2IDEwZS00LC01Ljk0MTk2IDIuMTE2MjYsLTExLjY4OTcxIDUuOTY1MTksLTE2LjIxNjU5IHoiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHJlY3QKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNzA3MTA2NzgsLTAuNzA3MTA2NzgsMC43MDcxMDY3OCwwLjcwNzEwNjc4LDAsMCkiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgaWQ9InJlY3Q0MTgwLTMiCiAgICAgICB3aWR0aD0iNC43Mjc4MDEzIgogICAgICAgaGVpZ2h0PSI2MC43NDQ1OTUiCiAgICAgICB4PSItOTEuMjQ3Nzk1IgogICAgICAgeT0iNjk4LjY1ODA4IgogICAgICAgcng9IjIuMDExNDI1ZS0wNyIKICAgICAgIHJ5PSIwIiAvPgogICAgPGVsbGlwc2UKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2NsaXAtcnVsZTpub256ZXJvO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7Y29sb3ItaW50ZXJwb2xhdGlvbjpzUkdCO2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVyczpsaW5lYXJSR0I7c29saWQtY29sb3I6IzAwMDAwMDtzb2xpZC1vcGFjaXR5OjE7ZmlsbDojZTc3OTM1O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxOC45NDc2Nzk1MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgaWQ9InBhdGg0ODQ4IgogICAgICAgY3g9IjQ1Mi42NTE3MyIKICAgICAgIGN5PSI1NzguMzUyNTQiCiAgICAgICByeD0iMjEuMjM2OTE3IgogICAgICAgcnk9IjIxLjIzNjkyMSIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY3NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJyZWN0NTI5NyIKICAgICAgIGQ9Im0gNDcyLjE0MTYxLDYxNS4wNzQxNSAtMTkuMzYwODIsMCAtMTkuMzYwODIsMCBjIDAsLTMuODcyMTcgOS42ODA0MSwtNS44MDgyNSAxOS4zNjA4MiwtNS44MDgyNSA5LjY4MDQxLDAgMTkuMzYwODIsMS45MzYwOCAxOS4zNjA4Miw1LjgwODI1IHoiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2NsaXAtcnVsZTpub256ZXJvO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7Y29sb3ItaW50ZXJwb2xhdGlvbjpzUkdCO2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVyczpsaW5lYXJSR0I7c29saWQtY29sb3I6IzAwMDAwMDtzb2xpZC1vcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDI0OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGQ9Im0gNDMyLjg0NzIzLDU1NS4yMDU1MyAtMy4zNDM3NSwzLjM0MTc5IDAuNDIxODcsMC40MjE4OCBjIC00LjU5OTM2LDUuNDA4MzIgLTcuMTQxMjUsMTIuMjczOTIgLTcuMTU0MywxOS4zODI4MSAwLDE1LjkyMjk0IDEyLjQwMzI3LDI4Ljk0MzA1IDI4LjA3NDIyLDI5Ljk0MTQxIGwgMCwxLjAyMTQ4IGMgLTguOTkxMzIsMC4yNDIwNCAtMTcuNDI1NzgsMi4xNDcwMiAtMTcuNDI1NzgsNS43NTk3NyBsIDE5LjM2MTMzLDAgMTkuMzYxMzMsMCBjIDAsLTMuNjEyNzUgLTguNDM0NDYsLTUuNTE3NzMgLTE3LjQyNTc4LC01Ljc1OTc3IGwgMCwtMS4wMjUzOSBjIDYuNDE0OTksLTAuNDIxNTcgMTIuNTM5MTIsLTIuODkxMTcgMTcuNDU4OTgsLTcuMDcwMzEgbCAwLjI4MTI1LDAuMjgxMjUgMy4zNDM3NSwtMy4zNDM3NSAtNi41NjgzNiwtNi41NjgzNiBhIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgNC42NTYyNSwtMTMuMjM2MzMgMjEuMjM2OTE3LDIxLjIzNjkyMSAwIDAgMCAtMjEuMjM2MzMsLTIxLjIzNjMzIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgLTEzLjI1LDQuNjQ0NTQgbCAtNi41NTQ2OCwtNi41NTQ2OSB6IG0gMC41ODU5Myw3LjI3MTQ4IDIuNjM4NjgsMi42Mzg2NyBhIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgLTQuNjU2MjUsMTMuMjM2MzMgMjEuMjM2OTE3LDIxLjIzNjkyMSAwIDAgMCAyMS4yMzYzMiwyMS4yMzgyOCAyMS4yMzY5MTcsMjEuMjM2OTIxIDAgMCAwIDEzLjI1LC00LjY0NDUzIGwgMi43NDAyNCwyLjc0MDI0IGMgLTQuNDY4MjIsMy42NzQ5NiAtMTAuMDY3MDgsNS43MDUyOSAtMTUuODYxMzMsNS43MTQ4NCAtMTMuODMzNjYsMCAtMjUuMDQ4ODMsLTExLjIxNTE2IC0yNS4wNDg4MywtMjUuMDQ4ODMgOS44ZS00LC01Ljc5NzE1IDIuMDI4NzEsLTExLjQwMDk4IDUuNzAxMTcsLTE1Ljg3NSB6IgogICAgICAgaWQ9InJlY3Q1MzAwLTMiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2NjY2Nzc2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gNDYwLjk2MDM1LDU2OS4yMzU2NyBjIDAsMCAtMy4yNDkyNSwtMy4xNTA5NyAtOC44MTA3OSwtMy4xNTc1NSAtNS41NjE1MywtMC4wMDcgLTExLjEzMTAxLDYuNzAwNjggLTExLjEzNzc0LDEyLjM2NTQ5IC0wLjAwNyw1LjY2NDggMy4yMzg1NywxMi4xNzI2OSAxMS44NDMyLDEyLjE4Mjg3IDguNjA0NjUsMC4wMDkgMTIuNTk3NSwtNC40OTU5NSAxMS4xNDA4NSwtMTQuOTg4MDYgbCAtMTAuNjAyNCwzLjM0NDM4IDEuOTkxMjksMi4xMDA0MSAxLjI1OTYxLC0wLjMxMzIgYyAwLDAgMi4wOTU1OCwyLjYyNTA4IC0xLjA1Mjk2LDMuMDQwOTcgLTMuMTQ4NTMsMC40MTU4NyAtNS45ODA4LC0wLjQyNjcgLTYuMzk1NzksLTQuNDEzNTUgLTAuNDE1MDMsLTMuOTg2ODUgMi43MzYzOCwtNi44MTU1MiA2LjQwNzIzLC01LjIzNzYzIHoiCiAgICAgICBpZD0icGF0aDg4MTAtNi03LTAtNC05LTgiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzkxNjkiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC45NTg3NTg3OSwtMy45MjI5ODM4ZS00KSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMxYTU2OTQ7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJtIDQ1Ny4xMzY2NSw2MDIuMDY0MzYgYyAwLjEwNjY0LDAuODk0NTggNi4zOTMzOCw5LjcxNDI5IDcuMzEwOTYsMTAuMTQxNDcgMC45MTc1NywwLjQyNzE4IDEzLjI2NjAxLC0xLjI3MzkyIDE0LjAwNDA3LC0xLjkwNzggMC43MzgwNiwtMC42MzM4OCA1LjgzNzAyLC0xMC45MDc4OSA1LjY2MzQyLC0xMS45NDg4NiAtMC4xNzM2LC0xLjA0MDk3IC02Ljc0MjI0LC05LjQ4NjgxIC03LjcyMjg0LC05Ljk0MDY0IC0wLjk4MDYsLTAuNDUzODQgLTEzLjI5NTQ0LDAuMzQ3MTIgLTE0LjIxMDAyLDAuODAzMjggLTEuMDM0OTksMC41MTYyMiAtNS4xNTIyMywxMS45NTc5NyAtNS4wNDU1OSwxMi44NTI1NSB6IgogICAgICAgICBpZD0icGF0aDE4OTYxIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6enp6c3oiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMzZjhjZGY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJtIDQ1OC43ODQxOSw2MDIuMDg5NTcgYyAwLjExMjc1LDAuOTMyNTkgNS43NDkyMyw4LjMzODg2IDYuNTkwNTQsOC43NjA3MiAwLjg0MTMyLDAuNDIxODYgMTEuMjk0OTgsLTEuMTE1ODcgMTEuOTUwODUsLTEuNjk4NTEgMC42NTU4NywtMC41ODI2NCA1LjU0MDM2LC0xMC4yNjA3NiA1LjEyNzE5LC0xMS4zNzMzMiAtMC40MTMxNywtMS4xMTI1NyAtNS44NzE2OCwtNy43NDkwNCAtNi44ODQ2NywtOC4xMTQ4IC0xLjAxMjk4LC0wLjM2NTc2IC0xMS4wOTA5NSwwLjAxNjQgLTEyLjEyNjU5LDAuNzE1MTYgLTEuMDM1NjUsMC42OTg3IC00Ljc3MDA3LDEwLjc3ODE2IC00LjY1NzMyLDExLjcxMDc1IHoiCiAgICAgICAgIGlkPSJwYXRoMTk4NDgiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0ienp6enp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enp6eiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzJlNjZhNDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNDY1LjE5Njc5LDYxMS4yNDI4NyBjIC0wLjkxNCwtMC4wNDU4IDQuOTQyMDEsLTExLjk1NDkgNS40OTg1MiwtMTIuNTA1OCAwLjU1NjUxLC0wLjU1MDg5IDExLjcxNDksLTEuMjY0ODQgMTIuMzUxMzgsLTAuNjI4NTQgMC42MzY0OCwwLjYzNjMgLTUuMDA3ODcsMTEuMTU2MTYgLTUuNTg2NzksMTEuNTk3MzMgLTAuNTc4OTEsMC40NDExNyAtMTEuMzQ5MTEsMS41ODI3OCAtMTIuMjYzMTEsMS41MzcwMSB6IgogICAgICAgICBpZD0icGF0aDIyNTUxIiAvPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzdHlsZT0iZmlsbDojMWE1Njk0O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0ibSA0NjIuODAwMDcsNTkwLjgxODM4IGMgMi4xMjIzMiwyLjk5NDk5IDYuNjY2Nyw3LjQ2NjE5IDYuODk5MDYsOC41MzQ5IDAuMjMyMzcsMS4wNjg3MSAtMy40MzIwMiw3Ljc2NTQxIC01LjQwOTU0LDExLjcxMzkzIGwgMS44MDU1NSwwLjUzOTc0IGMgMS4yOTU2OCwtNC4zMTY2IDMuOTQxNTEsLTExLjI1MzU4IDQuODM5NjUsLTExLjk1MjQ0IDAuODk4MTQsLTAuNjk4ODYgMTEuODYzNSwtMS40MTE4NCAxMi42NDgyMiwtMC44NjU5NiAwLjc4NDcyLDAuNTQ1ODggLTEuMDg2MTUsLTEuNjE3NDMgLTEuMDg2MTUsLTEuNjE3NDMgLTMuODUwMiwwLjc5OTg4IC0xMS4xNzAzOCwxLjI0MjU1IC0xMi4wNzY5MywwLjk3NzIzIC0wLjkwNjU1LC0wLjI2NTMyIC00LjU4MjE1LC01Ljg2OTg1IC02LjU5MDE1LC04LjMzNDA4IHoiCiAgICAgICAgIGlkPSJwYXRoMTk4NTAiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3pjY3p6Y3pjYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDczLjg5MjAzLDU5NC44NDg5MSBjIC0xLjkzMzIsLTAuMTU4MjggLTMuMDYwNTEsLTIuNTA5MjIgLTEuMTI3MSwtMi4zNTM2MyAxLjkzMzQxLDAuMTU1NTggMy4wNjAzLDIuNTExOTEgMS4xMjcxLDIuMzUzNjMgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDY0LjQ0MTM3LDU5NS42Mjc1MiBjIDAuMTYwMDcsMS45MzMwNSAtMS45NzQ4MiwzLjQyOTcyIC0yLjEzNzU3LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MSAxLjk3NzUxLC0zLjQyOTk1IDIuMTM3NTcsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMyIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtmaWxsOiNjMGQ1ZWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBkPSJtIDQ2Mi4yNTc4Niw2MDAuMzU5MDUgYyAwLjE2MDA2LDEuOTMzMDUgLTEuOTc0ODIsMy40Mjk3MiAtMi4xMzc1OCwxLjQ5NjkgLTAuMTYyNzYsLTEuOTMyODIgMS45Nzc1MSwtMy40Mjk5NiAyLjEzNzU4LC0xLjQ5NjkgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtmaWxsOiNjMGQ1ZWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBkPSJtIDQ2Ny40NTczLDU5OS43MzUxMSBjIDAuMTYwMDcsMS45MzMwNSAtMS45NzQ4MSwzLjQyOTcyIC0yLjEzNzU3LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MSAxLjk3NzUxLC0zLjQyOTk1IDIuMTM3NTcsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMy03IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDY1LjIyMTU0LDYwNC41MTg2MSBjIDAuMTYwMDYsMS45MzMwNSAtMS45NzQ4MiwzLjQyOTcyIC0yLjEzNzU4LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MiAxLjk3NzUyLC0zLjQyOTk2IDIuMTM3NTgsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMy01IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6Izk3YmJkZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDc3LjI5MTc5LDYwNi42ODY2NiBjIC0wLjE3MDM0LDEuOTMyMTggLTIuNTI4MjcsMy4wNDQ3OSAtMi4zNjA2MiwxLjExMjM5IDAuMTY3NjQsLTEuOTMyNCAyLjUzMDk2LC0zLjA0NDU2IDIuMzYwNjIsLTEuMTEyMzkgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNTYiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0ienp6IiAvPgogICAgICA8cGF0aAogICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7ZmlsbDojOTdiYmRmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgICAgZD0ibSA0NzMuODY3NjksNjAyLjA0ODM2IGMgLTAuMjgyMDksMS45MTkwNCAtMi43MDA1NywyLjg5MzA1IC0yLjQyMTE1LDAuOTczNjMgMC4yNzk0MiwtMS45MTk0MyAyLjcwMzI1LC0yLjg5MjY3IDIuNDIxMTUsLTAuOTczNjMgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNTYtOSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4OTk0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNDU3LjEzNjY2LDYwMi4wNjQzNiBjIDAuMTA2NjMsMC44OTQ1OCA2LjM5MzM3LDkuNzE0MjkgNy4zMTA5NSwxMC4xNDE0NyAwLjkxNzU4LDAuNDI3MTggMTMuMjY2MDEsLTEuMjczOTIgMTQuMDA0MDcsLTEuOTA3OCAwLjczODA2LC0wLjYzMzg4IDUuODM3MDIsLTEwLjkwNzg5IDUuNjYzNDIsLTExLjk0ODg2IC0wLjE3MzYsLTEuMDQwOTcgLTYuNzQyMjQsLTkuNDg2ODEgLTcuNzIyODQsLTkuOTQwNjQgLTAuOTgwNiwtMC40NTM4NCAtMTMuMjk1NDQsMC4zNDcxMiAtMTQuMjEwMDIsMC44MDMyOCAtMS4wMzQ5OSwwLjUxNjIyIC01LjE1MjIzLDExLjk1Nzk4IC01LjA0NTU4LDEyLjg1MjU1IHoiCiAgICAgICAgIGlkPSJwYXRoMTg5NjEtMSIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enp6enN6IiAvPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2NjY2Nzc2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gNDYwLjk2MDM1LDU2OS4yMzU2NyBjIDAsMCAtMy4yNDkyNSwtMy4xNTA5NyAtOC44MTA3OSwtMy4xNTc1NSAtNS41NjE1MywtMC4wMDcgLTExLjEzMTAxLDYuNzAwNjggLTExLjEzNzc0LDEyLjM2NTQ5IC0wLjAwNyw1LjY2NDggMy4yMzg1NywxMi4xNzI2OSAxMS44NDMyLDEyLjE4Mjg3IDguNjA0NjUsMC4wMDkgMTIuNTk3NSwtNC40OTU5NSAxMS4xNDA4NSwtMTQuOTg4MDYgbCAtMTAuNjAyNCwzLjM0NDM3IDEuOTkxMjksMi4xMDA0MiAxLjI1OTYxLC0wLjMxMzIgYyAwLDAgMi4wOTU1OCwyLjYyNTA3IC0xLjA1Mjk2LDMuMDQwOTYgLTMuMTQ4NTMsMC40MTU4OCAtNS45ODA4LC0wLjQyNjcgLTYuMzk1NzksLTQuNDEzNTUgLTAuNDE1MDMsLTMuOTg2ODQgMi43MzYzOCwtNi44MTU1MSA2LjQwNzIzLC01LjIzNzYyIHoiCiAgICAgICBpZD0icGF0aDg4MTAtNi03LTAtNC05LTgtNiIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50OTE2Nyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE4Ljk0NzY3OTUyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPC9nPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaWQ9ImxheWVyMyIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIgLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"gcompris,gcompris\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"gcompris-qt.gcompris-qt\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.20.04\"\nLABEL oc.name=\"GCompris\"\nLABEL oc.displayname=\"GCompris\"\nLABEL oc.path=\"/usr/games/gcompris-qt\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"GCompris\"\nENV APPBIN \"/usr/games/gcompris-qt\"\nENV APP \"/usr/games/gcompris-qt\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gcompris/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gcompris/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application GCompris

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/GCompris.d\n
"},{"location":"applications/gcompris/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f GCompris.d -t GCompris .\n
"},{"location":"applications/gcompris/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect GCompris > GCompris.json\ndocker image save GCompris -o GCompris.tar\nctr -n k8s.io images import GCompris.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @GCompris.json\n\n
"},{"location":"applications/geany/","title":"geany","text":""},{"location":"applications/geany/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/geany/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/geany/#alpine-packages","title":"Alpine packages","text":"
geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\n
"},{"location":"applications/geany/#displayname","title":"Displayname","text":"
Geany\n
"},{"location":"applications/geany/#path","title":"Path","text":"
/usr/bin/geany\n
"},{"location":"applications/geany/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/geany/#mimetype","title":"Mimetype","text":"
text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\n
"},{"location":"applications/geany/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/geany/#wm_class","title":"WM_CLASS","text":"
geany.Geany\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/geany/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/geany.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/geany/#json-dump","title":"JSON dump","text":"

json source file geany.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"icon\": \"geany.svg\",\n    \"apkpackage\": \"geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\",\n    \"keyword\": \"text,editor,geany,ide\",\n    \"launch\": \"geany.Geany\",\n    \"name\": \"geany\",\n    \"displayname\": \"Geany\",\n    \"path\": \"/usr/bin/geany\",\n    \"showinview\": \"dock\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/geany.desktop\",\n    \"mimetype\": \"text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\"\n}\n
"},{"location":"applications/geany/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output geany.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geany.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geany.d.3.0.json\n\n
"},{"location":"applications/geany/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\nLABEL oc.icon=\"geany.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgdmVyc2lvbj0iMS4wIgogICB3aWR0aD0iMjU2IgogICBoZWlnaHQ9IjI1NiIKICAgaWQ9InN2ZzIiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzIzNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzIzNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZjZTk0ZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDMyMzkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmY2U5NGY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC41IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDMyNDEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC43NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzMjQzIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzRhMDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxOTc0NCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTk3NDYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxOTc0OCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VkZDQwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjc4NTk3Mjk1IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDE5NzUwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNDY2NCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTQ2NjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxNDY2OCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTIyOTQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDEyMjk2IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmVmOGM0O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTIyOTgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDExODUzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMTg1NSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDExODU3IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ4Mjg1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A4Mjg3IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY2YzZjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wODI4OSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2NjMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzQ5OSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzUwMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZjVhYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDc1MDMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcxMDYiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxMDgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTEwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MzI4Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MzMwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjMzMiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTUzOSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNTU0MSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU1NDMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM1NzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTc0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmNlOTRmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzkwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyNzkyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjc5NCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZjZTk0ZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjE4OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjE5MCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0YTAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM2MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4yMDU1MjkyNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODQ4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmNlOTRmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODUwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWRkNDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjE5MiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0YTAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIzLjA3ODQwOSIKICAgICAgIGN5PSIxMi43NDM1OSIKICAgICAgIHI9IjMuNSIKICAgICAgIGZ4PSIyMy4wNzg0MDkiCiAgICAgICBmeT0iMTIuNzQzNTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMTg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mjc5MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1Ljg2NDkyNjQsLTE0LjA3NTgyMSwtMTAuMDAwMDAzLC0xMC42NjY2NjYsMTAzLjYzODMxLDMxNi43NzkyKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIxIgogICAgICAgeTE9IjM3LjY3ODIiCiAgICAgICB4Mj0iNDIuMjMwNzY2IgogICAgICAgeTI9IjU0LjE3OTYyNiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ3NTEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjI5NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxMiwwLDAsNi43ODcyOTE3LC0xNjUuMzMzMzQsLTI1NS43MzI5MykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyMy41IgogICAgICAgY3k9IjE5LjUiCiAgICAgICByPSIxNC41IgogICAgICAgZng9IjIzLjUiCiAgICAgICBmeT0iMTkuNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDU1NDUiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1NTM5IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNjU1MTcyMywwLDAsMC43MzU2MzIsODYuNDM2Nzg5LC0xMjYuMzQ0ODEpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMjEuNjI0OTk4IgogICAgICAgY3k9IjE2Ljc0OTk5OCIKICAgICAgIHI9IjUuNSIKICAgICAgIGZ4PSIyMS42MjQ5OTgiCiAgICAgICBmeT0iMTYuNzQ5OTk4IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NTkzNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc0OTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMy43MzMzMzM4LDAsMCwtMy44Nzg3ODc3LDM0LjkzMzMzNiwtNzMuNjk2OTYyKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEwLjQ1MDU4NSIKICAgICAgIGN5PSIyNy4zMzEzOTgiCiAgICAgICByPSI3IgogICAgICAgZng9IjEwLjQ1MDU4NSIKICAgICAgIGZ5PSIyNy4zMzEzOTgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ2NzE3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjMyOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxMy45OTk5OTgsMTQuNjM2NTg2LC0yLjMwODgzMTUsMTEuNzE3MzYyLC0yNi41Mzc5MTIsLTU1NC4zMzU1MykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyNCIKICAgICAgIGN5PSIzOC41IgogICAgICAgcj0iNiIKICAgICAgIGZ4PSIyNCIKICAgICAgIGZ5PSIzOC41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzExMiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxMDYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMTUuNTU1NTU2LDAsMCw1Ljc3Nzc3NjUsLTI0OC4wMDAwMSwtMjA5LjExMTA3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIzLjUiCiAgICAgICBjeT0iMTkuNSIKICAgICAgIHI9IjE0LjUiCiAgICAgICBmeD0iMjMuNSIKICAgICAgIGZ5PSIxOS41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzExNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDU1MzkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi45NDI1Mjg1LDAsMCwxLjI4NzM1NjMsNTguODUwNTc2LC0xNy4xMDM0NDIpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMjIuOTk5OTk4IgogICAgICAgY3k9IjI4LjUiCiAgICAgICByPSIzIgogICAgICAgZng9IjIyLjk5OTk5OCIKICAgICAgIGZ5PSIyOC41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTE4NjUiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ4Mjg1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDMuMTk5OTk4OSwwLDAsNi4yMjIyMjI5LDEuMDY2Njg1MiwtMjM5LjE1NTYzKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIxIgogICAgICAgeTE9IjI2IgogICAgICAgeDI9IjI1IgogICAgICAgeTI9IjMxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTE4NjciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMTg1MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjc3Nzc3NzEsMCwwLDQuNDQ0NDQ0MywzMy43Nzc3OCwtMTg2LjI2NjcxKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIyLjk5OTk5OCIKICAgICAgIGN5PSIyOC41IgogICAgICAgcj0iMyIKICAgICAgIGZ4PSIyMi45OTk5OTgiCiAgICAgICBmeT0iMjguNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE0MjU5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50ODI4NSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgzLjIsMCwwLDYuMjIyMjIyOSw5Ny4wNjY2NjEsLTIzOC42NjY2OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMSIKICAgICAgIHkxPSIyNiIKICAgICAgIHgyPSIyNSIKICAgICAgIHkyPSIzMSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE0MjYxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTE4NTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS43Nzc3NzcxLDAsMCw0LjQ0NDQ0NDMsMTI5Ljc3Nzc4LC0xODUuNzc3NzcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iMTIiCiAgICAgICB5MT0iMTQiCiAgICAgICB4Mj0iNDQuNTY1MjE2IgogICAgICAgeTI9IjQ3LjY4NzUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNzEwOSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM1NzAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC45MDY2NjY2LDAsMCw0Ljc0MDc0MDgsNC42MjIzNzE1ZS02LC0xOTkuNDA3NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyMi45OTk5OTgiCiAgICAgICBjeT0iMjguNSIKICAgICAgIHI9IjMiCiAgICAgICBmeD0iMjIuOTk5OTk4IgogICAgICAgZnk9IjI4LjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxNzE3MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDgyODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4zMzMzMzA2LDAsMCw4LjI5NjI5NDksNS4wODU1NDE0ZS01LC0yODEuNzc3NzUpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iMjEiCiAgICAgICB5MT0iMjYiCiAgICAgICB4Mj0iMjUiCiAgICAgICB5Mj0iMzEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNzE3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDExODUzIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuOTYyOTYxNiwwLDAsNS45MjU5MjM3LDU0LjUxODU0NCwtMjExLjI1OTIxKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEzLjA3MTQ1NyIKICAgICAgIGN5PSIyMS4wOTQ0ODIiCiAgICAgICByPSIxNS41IgogICAgICAgZng9IjEzLjA3MTQ1NyIKICAgICAgIGZ5PSIyMS4wOTQ0ODIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxNzcwNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3OTAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNy42MTkwNDE2LDEyLjA0NjIyNywtOS44ODI3MTc4LDguNjIyNTg2MSwxNzcuODQ5NzQsLTQ0Ni4wMzQwNykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODA5OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyOCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSI0MC4wMzU3MTciCiAgICAgICB5MT0iMTIuMzU4ODUzIgogICAgICAgeDI9IjQxLjY2MDcxMyIKICAgICAgIHkyPSIzNS4zOTQ1NjkiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxOTc0MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE5NzQ0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuMzMzMzMzMywwLDAsNS4zMzMzMzMzLC0xLjI5MTQzNGUtNywtMjA3Ljk5OTk5KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEzLjgxOTM0MiIKICAgICAgIGN5PSI4Ljg3OTg1MDQiCiAgICAgICByPSIxNC41IgogICAgICAgZng9IjEzLjgxOTM0MiIKICAgICAgIGZ5PSI4Ljg3OTg1MDQiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxOTc3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM1NzAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MDI0OTY1LDIuNDUyMTA3MiwtMy4wMTY0NTYsMy44ODc4NzY4LDg2Ljc0NzMwNywtMTgzLjk2NTgxKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjMiCiAgICAgICB5MT0iMjciCiAgICAgICB4Mj0iMzkiCiAgICAgICB5Mj0iMjgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODQ2IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjE4OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDUuMzMzMzMzMywtMS4yOTE0MzRlLTcsLTIwNy45OTk5OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSI4IgogICAgICAgeTE9IjM5IgogICAgICAgeDI9IjM4IgogICAgICAgeTI9IjM5IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzIzMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMyMzUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4zMzMzMzMzLDAsMCw1LjMzMzMzMzMsLTEuMjkxNDM0ZS03LC0yMDcuOTk5OTkpIiAvPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlPjI5LTA2LTA3PC9kYzpkYXRlPgogICAgICAgIDxkYzpjcmVhdG9yPgogICAgICAgICAgPGNjOkFnZW50PgogICAgICAgICAgICA8ZGM6dGl0bGU+U2ViYXN0aWFuIEtyYWZ0PC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+YXBwbGljYXRpb248L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5nZWFueTwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPmVkaXRvcjwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnByb2dyYW1taW5nPC9yZGY6bGk+CiAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxjYzpsaWNlbnNlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwyMDgpIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjE4LjY2NjY4LDEzLjMzMzMzNyBjIDAsMTkuMTM2IC00MS44MTMzNCwzNC42NjY2NjEgLTkzLjMzMzM0LDM0LjY2NjY2MSBDIDczLjgxMzMzMyw0Ny45OTk5OTggMzIsMzIuNDY5MzM3IDMyLDEzLjMzMzMzNyBjIDAsLTE5LjEzNTk5NTEgNDEuODEzMzMzLC0zNC42NjY2NjIgOTMuMzMzMzQsLTM0LjY2NjY2MiA1MS41MiwwIDkzLjMzMzM0LDE1LjUzMDY2NjkgOTMuMzMzMzQsMzQuNjY2NjYyIHoiCiAgICAgICBpZD0icGF0aDY3MjEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ3MTEyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC40ODMwNDU4OHB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxOTkuOTk5OTksOC4wMDAwMDg2IGMgMCwxNC43MjAwMDA0IC0zNC42NDUzMywyNi42NjY2NjY0IC03Ny4zMzMzMywyNi42NjY2NjY0IC00Mi42ODc5OTMsMCAtNzcuMzMzMzMsLTExLjk0NjY2NiAtNzcuMzMzMzMsLTI2LjY2NjY2NjQgMCwtMTQuNzIgMzQuNjQ1MzM3LC0yNi42NjY2NjY2IDc3LjMzMzMzLC0yNi42NjY2NjY2IDQyLjY4OCwwIDc3LjMzMzMzLDExLjk0NjY2NjYgNzcuMzMzMzMsMjYuNjY2NjY2NiB6IgogICAgICAgaWQ9InBhdGgzNTgwIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzIzMyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMxNThweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTcwLjY2NjY2LDguMDAwMDA4NiBjIDAsMTAuMzA0MDAwNCAtMTkuMTE0NjcsMTguNjY2NjY2NCAtNDIuNjY2NjcsMTguNjY2NjY2NCAtMjMuNTUyLDAgLTQyLjY2NjY1NywtOC4zNjI2NjYgLTQyLjY2NjY1NywtMTguNjY2NjY2NCAwLC0xMC4zMDQgMTkuMTE0NjU3LC0xOC42NjY2NjY2IDQyLjY2NjY1NywtMTguNjY2NjY2NiAyMy41NTIsMCA0Mi42NjY2Nyw4LjM2MjY2NjYgNDIuNjY2NjcsMTguNjY2NjY2NiB6IgogICAgICAgaWQ9InBhdGg3MTE0IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NzExNik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTk0LjY2NjY3LDUuNTc3ODE2NiBjIDAsMTMuMTEzMDUwNCAtMzIuMjU2LDIzLjc1NTUxNDQgLTcxLjk5OTk5LDIzLjc1NTUxNDQgLTM5Ljc0NDAwOCwwIC03Mi4wMDAwMTYsLTEwLjY0MjQ2NCAtNzIuMDAwMDE2LC0yMy43NTU1MTQ0IDAsLTEzLjExMzA1MDcgMzIuMjU2MDA4LC0yMy43NTU1MjU2IDcyLjAwMDAxNiwtMjMuNzU1NTI1NiAzOS43NDM5OSwwIDcxLjk5OTk5LDEwLjY0MjQ3NDkgNzEuOTk5OTksMjMuNzU1NTI1NiB6IgogICAgICAgaWQ9InBhdGg0MzYyIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NDc1MSk7c3Ryb2tlLXdpZHRoOjUuMzMzMzMyNTRweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMTYwLDMuMjQzOTI2NGUtNiBDIDE2MCw4LjgzMjAwODYgMTQzLjI3NDY3LDE2LjAwMDAwOSAxMjIuNjY2NjcsMTYuMDAwMDA5IDEwMi4wNTg2NywxNi4wMDAwMDkgODUuMzMzMzMzLDguODMyMDA4NiA4NS4zMzMzMzMsMy4yNDM5MjY0ZS02IDg1LjMzMzMzMywtOC44MzE5OTE0IDEwMi4wNTg2NywtMTUuOTk5OTkxIDEyMi42NjY2NywtMTUuOTk5OTkxIDE0My4yNzQ2NywtMTUuOTk5OTkxIDE2MCwtOC44MzE5OTE0IDE2MCwzLjI0MzkyNjRlLTYgeiIKICAgICAgIGlkPSJwYXRoMzU3OCIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6I2M0YTAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4zODE2OTg3M3B4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjAuOTQwMjksLTEzNS45OTk5OSBjIC00MC41MzkxODYsMCAtNzMuNDM0ODQsMTYuNjkxNSAtNzMuNDM0ODQyLDM3LjMwMTE2MSAwLDUuNDE5OTUyIC0wLjgxNDY1MiwxNi45NDEwMjQgMC41OTQ2MTQsMzAuNDQzMTA0IEMgMzQuODI4OTAxLC03My4zNjk2MTggMzQuODQzNTA4LC04NC44NjU0MSAzMy42ODA2NzEsLTk4LjUzMTU2IGwgLTE0Ljg2NTM1MiwwIGMgLTAuMDQxNiwwLjkzMTE0NyAtMC4xNDg2NTMsMS45MDE0ODggLTAuMTQ4NjUzLDIuODQzNTkgNC44OTQyOTQsNTkuOTgwMzM2IDUxLjg2ODUxMyw5Ni4wODY2MTg1OCAxMDIuMjczNjI0LDk4LjM1NDYzOTkgMjAuMjY5NTgsMCA0NS40NTM2NywtNS41MDAwMTYgNjEuMDk2NTksLTMyLjI4MzA3MTkgMTUuNjQyOTQsLTI2Ljc4MzA0NiAxMi4zMzgyNCwtNTguNzc3NjExIDEyLjMzODI1LC02OS4wODI0MjcgMCwtMjAuNjA5NjUxIC0zMi44OTU2NywtMzcuMzAxMTYxIC03My40MzQ4NCwtMzcuMzAxMTYxIHoiCiAgICAgICBpZD0icGF0aDIxOTYiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyODQ2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I2M0YTAwMDtzdHJva2Utd2lkdGg6NS4zMzMzMzE1OHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAyNiwxNy41IGEgMy41LDAuNSAwIDEgMSAtNywwIDMuNSwwLjUgMCAxIDEgNywwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgzLjgwOTUyMzcsMCwwLDE2LjAwMDAwMiwzNi45NTIzODcsLTM5Mi4wMDAwMykiCiAgICAgICBpZD0icGF0aDM2MjgiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNjNGEwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNlZGQ0MDA7c3Ryb2tlLXdpZHRoOjAuNjgzMTMwMDNweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDEwMS4zMzMzMywtMTA2LjY2NjY2IGMgMCwxNC43MjAwMDcgNjAuOCwyNi42NjY2NjggMjQsMjYuNjY2NjY4IC0zNi43OTk5OTcsMCAtNjYuNjY2NjYzLC0xMS45NDY2NjEgLTY2LjY2NjY2MywtMjYuNjY2NjY4IDAsLTE0LjcyIDI5Ljg2NjY2NiwtMjYuNjY2NjcgNjYuNjY2NjYzLC0yNi42NjY2NyAzNi44LDAgLTI0LDExLjk0NjY3IC0yNCwyNi42NjY2NyB6IgogICAgICAgaWQ9InBhdGgzMTg3IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC42O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTk3NzQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkxMzQ1OTM2cHg7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE4My45OTk5OSwtMTA5LjMzMzMyIGMgMCwxMS43NzU5OSAtMjcuNDc3MzIsMjEuMzMzMzI4IC02MS4zMzMzMiwyMS4zMzMzMjggLTMzLjg1NjAwMywwIC02MS4zMzMzNDIsLTkuNTU3MzM4IC02MS4zMzMzNDIsLTIxLjMzMzMyOCAwLC0xMS43NzYwMSAyNy40NzczMzksLTIxLjMzMzM0IDYxLjMzMzM0MiwtMjEuMzMzMzQgMzMuODU2LDAgNjEuMzMzMzIsOS41NTczMyA2MS4zMzMzMiwyMS4zMzMzNCB6IgogICAgICAgaWQ9InBhdGgxNjMzOSIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6bm9uZTtzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDE3MTA5KTtzdHJva2Utd2lkdGg6NS4zMzMzMzMwMjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDU2LjY2NjY2NywtMTA2LjY2NjY2IGMgMCw0Ljg4Mjg1IC00LjA5MDczMSwzMC43MTc4NjMgLTMuMzMzMzM0LDQyLjY2NjY2OCAwLjM3ODY5OSw1Ljk3NDQwNiAtMjYuMTA1MjI0LC0yMS45MzIyMDggLTIxLjY2NjY2NiwtMjYuNjY2NjY2IDEwLC0xMC42NjY2NjIgLTUsMCAtNSw1LjMzMzMzMyAwLDQyLjk5ODcwOSA1MC43NzE4NzcsNjkuNzE3NjQzIDU4LjA5Mjc4NCw3NC4yMDI2NzIgNy4zMjA5MTcsNC40ODUwMjQyIDE1LjAzNDAzNyw1Ljc5NzMyODIgMjEuOTA3MjE5LDUuNzk3MzI4MiAwLDAgMjEuMzMzMzMsLTgwLjAwMDAwMDIgMjEuMzMzMzMsLTgwLjAwMDAwMDIgLTIzLjcyMTY0LDAgLTY1LjI3MTYyNywtOC42MjczNjUgLTcxLjMzMzMzMywtMjEuMzMzMzM1IHoiCiAgICAgICBpZD0icGF0aDU5MzkiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ2NzE3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxODkuMzMzMzMsLTEwNi43ODIwNCBjIDAsMTMuMzExNjkxIC0yOS44NjY2NiwyNC4xMTUzODIgLTY2LjY2NjY2LDI0LjExNTM4MiAtMzYuNzk5OTkzLDAgLTY2LjY2NjY2NSwtMTAuODAzNjkxIC02Ni42NjY2NjUsLTI0LjExNTM4MiAwLC0xMy4zMTE3IDI5Ljg2NjY3MiwtMjQuMTE1MzkgNjYuNjY2NjY1LC0yNC4xMTUzOSAzNi44LDAgNjYuNjY2NjYsMTAuODAzNjkgNjYuNjY2NjYsMjQuMTE1MzkgeiIKICAgICAgIGlkPSJwYXRoMTU5NDgiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxNDkuMzMzMzMsLTExMS45OTk5OSBjIDAsNS44ODggLTEwLjc1MiwxMC42NjY2NyAtMjQsMTAuNjY2NjcgLTEzLjI0Nzk5LDAgLTIzLjk5OTk5LC00Ljc3ODY3IC0yMy45OTk5OSwtMTAuNjY2NjcgMCwtNS44ODggMTAuNzUyLC0xMC42NjY2NiAyMy45OTk5OSwtMTAuNjY2NjYgMTMuMjQ4LDAgMjQsNC43Nzg2NiAyNCwxMC42NjY2NiB6IgogICAgICAgaWQ9InBhdGg1MTU0IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4xO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTU0NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTIxLjIwNTMsLTEzMC42NjY2NiBjIC0zNy40NjAwMiwwIC02OC4yNTk5MiwxNC45OTU5NSAtNjguMjU5OTIsMzQuMDIzODE1IDAsMCAwLjk2MDQyOCwzMy45NzYxOTIgMC45NjA0MjgsMzMuOTc2MTkyIC0xMy44NDQ1MiwtMi4yNjE5MDQgLTIxLjk3NjY3NiwtMTEuNSAtMjIuNzEwODU1LC0zMC4wMDAwMDUgLTQuNzc1NzI5LC0xLjcxMDcyNiAtNS4yMDM1NDUsMC41OTQ2NSAtNy4xOTQ5NTQsMS41MDAwMDUgOC42Nzc1ODksNTQuNzc3ODgzIDUwLjQyNTYxNyw4Ni4yODQ0NDgyIDk3LjIwNTMwMSw4OC41MDAwMDU2IDE4LjczMDAxLDAgNDIuMDc2OTksLTUuMTA1ODg4IDU2LjUzMTc4LC0yOS44MzMzMzM2IDE0LjQ1NDc3LC0yNC43Mjc0MzUgMTEuMzA2MzYsLTU0LjE1Mjc1NyAxMS4zMDYzNSwtNjMuNjY2NjcyIDAsLTE5LjAyNzg1NyAtMzAuMzc4MTEsLTM0LjUwMDAwNyAtNjcuODM4MTMsLTM0LjUwMDAwNyB6IgogICAgICAgaWQ9InBhdGgyMjA2IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTp1cmwoI3JhZGlhbEdyYWRpZW50MTc3MDYpO3N0cm9rZS13aWR0aDo1LjMzMzMzMjU0cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE0MS4zMzMzNCwtMTMzLjMzMzMxIGMgMCwtNy4zNjAwMSAtOC4zNjI2OCwtMTMuMzMzMzQgLTE4LjY2NjY3LC0xMy4zMzMzNCAtMTAuMzA0LDAgLTE4LjY2NjY2LDUuOTczMzMgLTE4LjY2NjY2LDEzLjMzMzM0IDAsNy4zNTk5OSA4LjM2MjY2LDI0IDE4LjY2NjY2LDI0IDEwLjMwMzk5LDAgMTguNjY2NjcsLTE2LjY0MDAxIDE4LjY2NjY3LC0yNCB6IgogICAgICAgaWQ9InBhdGgyMjAxIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTkzNCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDlweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTM2LjAwMDAxLC0xMzEuODA5NTEgYyAwLC01LjI1NzE0IC01Ljk3MzM0LC05LjUyMzgxIC0xMy4zMzMzNCwtOS41MjM4MSAtNy4zNTk5OSwwIC0xMy4zMzMzMyw0LjI2NjY3IC0xMy4zMzMzMyw5LjUyMzgxIDAsNS4yNTcxNCA1Ljk3MzM0LDE3LjE0Mjg2IDEzLjMzMzMzLDE3LjE0Mjg2IDcuMzYsMCAxMy4zMzMzNCwtMTEuODg1NzIgMTMuMzMzMzQsLTE3LjE0Mjg2IHoiCiAgICAgICBpZD0icGF0aDIyMDQiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOnVybCgjcmFkaWFsR3JhZGllbnQzMTg1KTtzdHJva2Utd2lkdGg6NS4zMzMzMzMwMnB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3NC42NjY2NjEsLTc3LjgyMjI2OSAtNy45OTk5OTQsMTYuMDAwMDA1IDcuOTk5OTk0LDE2IDguMDAwMDA2LC0xNiAtOC4wMDAwMDYsLTE2LjAwMDAwNSB6IgogICAgICAgaWQ9InBhdGgxMTg2MSIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTg2NSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNhNDAwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzMDI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gNzQuNjY2NjY3LC03NS4xNTU2MDIgLTUuMzMzMzM0LDEzLjMzMzMzOCA1LjMzMzMzNCwxMy4zMzMzMjggMCwtMjYuNjY2NjY2IHoiCiAgICAgICBpZD0icGF0aDExODYzIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDExODY3KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE3MC42NjY2NywtNzcuMzMzMzMgLTgsMTYuMDAwMDA1IDgsMTYgOCwtMTYgLTgsLTE2LjAwMDAwNSB6IgogICAgICAgaWQ9InBhdGgxNDI1NSIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxNDI1OSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNhNDAwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzMDI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTcwLjY2NjY3LC03NC42NjY2NjQgLTUuMzMzMzQsMTMuMzMzMzM5IDUuMzMzMzQsMTMuMzMzMzI4IDAsLTI2LjY2NjY2NyB6IgogICAgICAgaWQ9InBhdGgxNDI1NyIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxNDI2MSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjIuNjY2NjYsLTY2LjY2NjY1MyAtMTMuMzMzMzIsMjEuMzMzMzI4IDEzLjMzMzMyLDIxLjMzMzMzNCBMIDEzNiwtNDUuMzMzMzI1IDEyMi42NjY2NiwtNjYuNjY2NjUzIHoiCiAgICAgICBpZD0icGF0aDE3MTY4IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE3MTcyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6I2E0MDAwMDtzdHJva2Utd2lkdGg6NS4zMzMzMzI1NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNob2Zmc2V0OjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjIuNjY2NjcsLTYzLjExMTEwNiAtOC44ODg4OCwxNy43Nzc3ODYgOC44ODg4OCwxNy43Nzc3NjYgMCwtMzUuNTU1NTUyIHoiCiAgICAgICBpZD0icGF0aDE3MTcwIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDE3MTc0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDUsMjAuNSBhIDIsMS41IDAgMSAxIC00LDAgMiwxLjUgMCAxIDEgNCwwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDMuNTU1NTU2OCw3Ljk5OTk5OTksLTE3MS41NTU1NykiCiAgICAgICBpZD0icGF0aDE3MjAzIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojMmUzNDM2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojYzRhMDAwO3N0cm9rZS13aWR0aDoxLjIyNDc0NDY4cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3LDE4IGEgMi41LDMgMCAxIDEgLTUsMCAyLjUsMyAwIDEgMSA1LDAgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNiwwLDAsOCwtOC41MzMzMzM1LC0zMjIuNjY2NjYpIgogICAgICAgaWQ9InBhdGgxODEwOSIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE4MTI0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41NDc3MjI0NnB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3LDE4IGEgMi41LDMgMCAxIDEgLTUsMCAyLjUsMyAwIDEgMSA1LDAgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDcuNDY2NjY2NywwLDAsNi4yMjIyMjE5LC05LjYwMDAwMDEsLTI2My45OTk5OCkiCiAgICAgICBpZD0icGF0aDE4MTA1IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTgxMjYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjY4NDY1MzFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gNywxOCBhIDIuNSwzIDAgMSAxIC01LDAgMi41LDMgMCAxIDEgNSwwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDQuNDQ0NDQ0OCw1LjMzMzMzMzIsLTIxMC42NjY2NykiCiAgICAgICBpZD0icGF0aDE4MTAxIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTgxMjgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkxMjg3MDc2cHg7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDcsMTggYSAyLjUsMyAwIDEgMSAtNSwwIDIuNSwzIDAgMSAxIDUsMCB6IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoNC4yNjY2NjY3LDAsMCwzLjU1NTU1NTcsMi4xMzMzMzMyLC0xNzYpIgogICAgICAgaWQ9InBhdGgxNzcwOCIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE4MDk5KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wOTU0NDQ5MnB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAzNC42NjY2NjcsLTIwNS4zMzMzMyBjIC0xNC43MiwwIC0yNi42NjY2NjcxLDExLjk0NjY3IC0yNi42NjY2NjcxLDI2LjY2NjY3IDAsMy43NjE1NiAwLjkyNjE1MTUsNy4yNTM3MiAyLjMzMzMzMzEsMTAuNSAtNC42MzU3MTA3LDMuOTE0MzEgLTcuNjY2NjY2NSw5LjYyODk2IC03LjY2NjY2NjUsMTYuMTY2NjcgMCw4LjAxNjMgNC40NTczMDMsMTQuODU0OTIgMTEuMDAwMDAwNSwxOC41IC0wLjE3MjA1OCwwLjkzOTU5IC0wLjMzMzMzNCwxLjg0NDI3IC0wLjMzMzMzNCwyLjgzMzMzIDAsMi41MjM4OCAwLjYyNDQwOCw0Ljg3NjM0IDEuNjY2NjY3LDcgLTQuMTU2MjI0LDIuMjU4NzMgLTcuMDAwMDAwMSw2LjYwNjY2IC03LjAwMDAwMDEsMTEuNjY2NjcgMCw3LjM2IDUuOTczMzMzMSwxMy4zMzMzMzIgMTMuMzMzMzMzMSwxMy4zMzMzMzIgNy4zNiwwIDEzLjMzMzMzNCwtNS45NzMzMzIgMTMuMzMzMzM0LC0xMy4zMzMzMzIgMCwtMS4yMjE1OCAtMC4xOTE4NjgsLTIuMzc1NzkgLTAuNSwtMy41IDYuNDM0MzQ2LC0yLjA3Mjg2IDExLjE2NjY2NiwtOC4wNDU4NiAxMS4xNjY2NjYsLTE1LjE2NjY3IDAsLTMuNjk1MTUgLTEuMjI2OTkyLC03LjEyMzgxIC0zLjMzMzMzMywtOS44MzMzMyAyLjEwMzE3MywtMy4zMDUxIDMuMzMzMzMzLC03LjI5NDk2IDMuMzMzMzMzLC0xMS41IDAsLTAuNzM5MjIgLTAuMjU5ODI2LC0xLjQ0Njc1IC0wLjMzMzMzMywtMi4xNjY2NyA5LjU3LC00LjA1IDE2LjMzMzMzMywtMTMuNDYgMTYuMzMzMzMzLC0yNC41IDAsLTE0LjcyIC0xMS45NDY2NjcsLTI2LjY2NjY3IC0yNi42NjY2NjYsLTI2LjY2NjY3IHoiCiAgICAgICBpZD0icGF0aDE4MTEzIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTojYmFiZGI2O3N0cm9rZS13aWR0aDo1LjMzMzMzMzAycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAzNC42NjY2NjcsLTIwMC4zMzMzMyBjIC0xMS45MjMyLDAgLTIxLjY2NjY2Nyw5Ljc0MzQ3IC0yMS42NjY2NjcsMjEuNjY2NjcgMCw0LjQ3MTIgMS41MDM1NzEsOC41NTI0NCAzLjgzMzMzMywxMiAtNS40MzAzMzUsMi42NTQ5NyAtOS4xNjY2NjY0LDguMjE4NCAtOS4xNjY2NjY0LDE0LjY2NjY3IDAsNy41Njk2OCA1LjE3NTk0MDQsMTMuODE3MDIgMTIuMTY2NjY2NCwxNS42NjY2NiAtMC45OTYxMywxLjY2NTI2IC0xLjY2NjY2NiwzLjU4NjQyIC0xLjY2NjY2Niw1LjY2NjY3IDAsNi4xMzMzNCA1LjAzMzMzMywxMS4xNjY2NyAxMS4xNjY2NjYsMTEuMTY2NjcgNi4xMzMzMzQsMCAxMS4xNjY2NjgsLTUuMDMzMzMgMTEuMTY2NjY3LC0xMS4xNjY2NyAwLC00LjA1MzA4IC0yLjI1NTQ4NiwtNy41NTkxOCAtNS41LC05LjUgMy4yMTI3NjIsLTIuOTgzMzcgNS4zMzMzMzMsLTcuMTA2NTYgNS4zMzMzMzMsLTExLjgzMzMzIDAsLTEuOTkxMDQgLTAuMzQ2ODE2LC0zLjkwMTgyIC0xLC01LjY2NjY3IDkuNjU2MDMxLC0yLjE1NDYgMTcsLTEwLjY5NzYxIDE3LC0yMSAwLC0xMS45MjMyIC05Ljc0MzQ2NywtMjEuNjY2NjcgLTIxLjY2NjY2NiwtMjEuNjY2NjcgeiBtIC0xMy4zMzMzMzQsNzkuODMzMzQgYyAtNC43MTA0LDAgLTguNSwzLjc4OTU5IC04LjUsOC41IDAsNC43MTA0IDMuNzg5Niw4LjUgOC41LDguNSA0LjcxMDQsMCA4LjUsLTMuNzg5NjEgOC41LC04LjUgMCwtNC43MTA0IC0zLjc4OTYsLTguNSAtOC41LC04LjUgeiIKICAgICAgIGlkPSJwYXRoMTgxMzAiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjQuNDQ0NDQzN3B4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjE4LjY2NjY3LC0xNTEuOTk5OTkgYyAtMTkuMjA1MzQsMCAtMzIsMTUuNDYxMzMgLTMyLDM0LjY2NjY3IEwgMTkyLC0xMDYuNjY2NjYgYyAtMWUtNSwtMTUuODE2MTUgNS4wODI2NywtMjkuMzMzMzMgMjEuMzMzMzMsLTI5LjMzMzMzIDE2LjI1MDY2LDAgMjkuMzMzMzQsMTIuNjgzODQgMjkuMzMzMzQsMjguNSBsIDAsNDguMzMzMzMyIGMgLTIuMDE2OTQsMjUuMTIwNTQ5IC0zOS4zODg4NCwzMC4wODAxNDkgLTU5LDMzLjgzMzMzMyAtMi4zODc0MywzLjQ5Mzg0IC00Ljk0NDU1LDYuNTUyMTk4IC03LjY2NjY3LDkuMzMzMzM0IDI1Ljk5MDc3LC03LjA0MjQ0MyA3NC41NzcyMywtNy4zOTY4ODYgNzcuMzMzMzMsLTQyLjY2NjY2NyBsIDAsLTU4LjY2NjY2MiBjIDAsLTE5LjIwNTM0IC0xNS40NjEzMywtMzQuNjY2NjcgLTM0LjY2NjY2LC0zNC42NjY2NyB6IgogICAgICAgaWQ9InJlY3QxOTMzNSIKICAgICAgIHN0eWxlPSJmaWxsOiNlZGQ0MDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMyNTQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTkyLC0xMjIuNjY2NjYgYyAxNiwtNDIuNjY2NjcgNTQuMTkwNDcsLTE4Ljg1NzE0IDU1LjYxOTA1LDAuNjY2NjcgbCAtMC40NzYxOSw2Ni42NjY2NjUgYyAwLDE2LjE5MDQ4IC0yOC40NzYxOSwyOC42NjY2NjcgLTY1LjgwOTUzLDM0IgogICAgICAgaWQ9InBhdGgxOTM1MyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuODtmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQxOTc0Mik7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"geany,text,editor,geany,ide\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"geany.desktop\"\nLABEL oc.launch=\"geany.Geany\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"geany\"\nLABEL oc.displayname=\"Geany\"\nLABEL oc.path=\"/usr/bin/geany\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"geany\"\nENV APPBIN \"/usr/bin/geany\"\nENV APP \"/usr/bin/geany\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/geany/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/geany/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application geany

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geany.d\n
"},{"location":"applications/geany/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f geany.d -t geany .\n
"},{"location":"applications/geany/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect geany > geany.json\ndocker image save geany -o geany.tar\nctr -n k8s.io images import geany.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geany.json\n\n
"},{"location":"applications/gedit/","title":"Gedit","text":""},{"location":"applications/gedit/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/gedit/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/gedit/#alpine-packages","title":"Alpine packages","text":"
gedit\n
"},{"location":"applications/gedit/#path","title":"Path","text":"
/usr/bin/gedit\n
"},{"location":"applications/gedit/#mimetype","title":"Mimetype","text":"
text/plain;\n
"},{"location":"applications/gedit/#file-extensions","title":"File extensions","text":"

\"txt\"

"},{"location":"applications/gedit/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"txt\"

"},{"location":"applications/gedit/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/gedit/#wm_class","title":"WM_CLASS","text":"
gedit.Gedit\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/gedit/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/gedit.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/gedit/#json-dump","title":"JSON dump","text":"

json source file gedit.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"gedit\",\n    \"icon\": \"gedit.svg\",\n    \"keyword\": \"editor\",\n    \"launch\": \"gedit.Gedit\",\n    \"name\": \"Gedit\",\n    \"path\": \"/usr/bin/gedit\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"text/plain;\",\n    \"fileextensions\": \"txt\",\n    \"legacyfileextensions\": \"txt\",\n    \"desktopfile\": \"/usr/share/applications/gedit.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/gedit/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output gedit.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gedit.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gedit.d.3.0.json\n\n
"},{"location":"applications/gedit/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gedit\nLABEL oc.icon=\"gedit.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZpZXdCb3g9IjAgMCAxMjggMTI4IgogICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IgogICB2ZXJzaW9uPSIxLjAiCiAgIGlkPSJzdmcxMTMwMCIKICAgaGVpZ2h0PSIxMjgiCiAgIHdpZHRoPSIxMjgiPgogIDx0aXRsZQogICAgIGlkPSJ0aXRsZTQxNjIiPkFkd2FpdGEgSWNvbiBUZW1wbGF0ZTwvdGl0bGU+CiAgPGRlZnMKICAgICBpZD0iZGVmczMiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMDM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MwYmZiYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEwMjYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTAyOCIKICAgICAgICAgb2Zmc2V0PSIwLjA0NTQ1NDU0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDEwMzAiCiAgICAgICAgIG9mZnNldD0iMC4wOTA5MDkwOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RlZGRkYTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMDMyIgogICAgICAgICBvZmZzZXQ9IjAuOTA5MDkwODgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkZWRkZGE7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC45NTQ1NDU0NCIKICAgICAgICAgaWQ9InN0b3AxMDM0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzBiZmJjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMTAzNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDIyMTMiCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxyZWN0CiAgICAgICAgIHJ5PSI4IgogICAgICAgICByeD0iOCIKICAgICAgICAgeT0iLTE4OCIKICAgICAgICAgeD0iMTYwIgogICAgICAgICBoZWlnaHQ9IjU2IgogICAgICAgICB3aWR0aD0iMTYiCiAgICAgICAgIGlkPSJyZWN0MjIxNSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMDA1Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QwYmI4ZTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEwMDEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMDAzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTM1MS0zIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMzQ3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNWQzY2Y7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTM0OS02IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMzUuOTk5OTkpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iLTI3NiIKICAgICAgIHgyPSIxMTUuOTk5OTkiCiAgICAgICB5MT0iLTI3NiIKICAgICAgIHgxPSIyNy45OTk5OSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDExNTkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMDM4IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDc2MjEyMjQsLTAuNDQ0MTk3MjMsMC40NDQxOTcyNSwtMC4wNzYyMTIyMyw3Ny43MjU3OTQsMzMxLjgzODA3KSIKICAgICAgIHkyPSItMTI3LjM5OTE1IgogICAgICAgeDI9IjE1OC41MTgwMiIKICAgICAgIHkxPSItOTcuNjk4Mjg4IgogICAgICAgeDE9IjEyOC44MTcxNyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTEwMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwMDUiIC8+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDE2MDktNyIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImZpbGw6I2U3NDc0NztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gMjUyLDExNiAyOCwtMjggdiAtOCBoIC0zNiB2IDM2IHoiCiAgICAgICAgIGlkPSJwYXRoMTYxMS01IiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjcyIgogICAgICAgeDI9IjM0MCIKICAgICAgIHkxPSI3NiIKICAgICAgIHgxPSIzNDQiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsMTgwLDgzKSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTEzMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEzNTEtMyIgLz4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTA2MiIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSkiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Y2ZjVmNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBpZD0icmVjdDEwNjQiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaGVpZ2h0PSIxMDgiCiAgICAgICAgIHg9Ii0xMDgiCiAgICAgICAgIHk9Ii0xMTYiCiAgICAgICAgIHJ4PSI4IgogICAgICAgICByeT0iOCIKICAgICAgICAgY2xpcC1wYXRoPSJub25lIiAvPgogICAgPC9jbGlwUGF0aD4KICA8L2RlZnM+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkdOT01FIERlc2lnbiBUZWFtPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpzb3VyY2UgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyIgLz4KICAgICAgICA8ZGM6dGl0bGU+QWR3YWl0YSBJY29uIFRlbXBsYXRlPC9kYzp0aXRsZT4KICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgIDxyZGY6QmFnIC8+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxkYzpkYXRlIC8+CiAgICAgICAgPGRjOnJpZ2h0cz4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6cmlnaHRzPgogICAgICAgIDxkYzpwdWJsaXNoZXI+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZSAvPgogICAgICAgICAgPC9jYzpBZ2VudD4KICAgICAgICA8L2RjOnB1Ymxpc2hlcj4KICAgICAgICA8ZGM6aWRlbnRpZmllciAvPgogICAgICAgIDxkYzpyZWxhdGlvbiAvPgogICAgICAgIDxkYzpsYW5ndWFnZSAvPgogICAgICAgIDxkYzpjb3ZlcmFnZSAvPgogICAgICAgIDxkYzpkZXNjcmlwdGlvbiAvPgogICAgICAgIDxkYzpjb250cmlidXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6Y29udHJpYnV0b3I+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIj4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjUmVwcm9kdWN0aW9uIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNEaXN0cmlidXRpb24iIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNOb3RpY2UiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNBdHRyaWJ1dGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjRGVyaXZhdGl2ZVdvcmtzIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjU2hhcmVBbGlrZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0xNzIpIgogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTpub25lIgogICAgICAgaWQ9ImxheWVyMiI+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnOTIxMSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyI+CiAgICAgICAgPHJlY3QKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7ZmlsbDojZjBmMGYwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgICAgICBpZD0icmVjdDEzODA1IgogICAgICAgICAgIHdpZHRoPSIxMjgiCiAgICAgICAgICAgaGVpZ2h0PSIxMjgiCiAgICAgICAgICAgeD0iOS4yNjUxMzYyZS0wOCIKICAgICAgICAgICB5PSIxNzIiIC8+CiAgICAgICAgPGNpcmNsZQogICAgICAgICAgIGN4PSI2NC4wMDAwMzEiCiAgICAgICAgICAgY3k9IjIzNiIKICAgICAgICAgICByPSI1OS41MDQxMzEiCiAgICAgICAgICAgaWQ9ImNpcmNsZTI4OTIiCiAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MC4xO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTkwMDAwMDE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5OjAuOTkwMDAwMDEsIDAuOTkwMDAwMDE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHJ5PSI3LjkyOTI4ODkiCiAgICAgICAgICAgcng9IjguNzAxMDA0IgogICAgICAgICAgIHk9IjE4MC40OTQ5NiIKICAgICAgICAgICB4PSIyMC40OTUwMDciCiAgICAgICAgICAgaGVpZ2h0PSIxMTEuMDEwMDUiCiAgICAgICAgICAgd2lkdGg9Ijg3LjAwOTk4NyIKICAgICAgICAgICBpZD0icmVjdDI4OTQiCiAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MC4xO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTkwMDAwMDE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5OjAuOTkwMDAwMDEsIDAuOTkwMDAwMDE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHJ5PSI3LjkyMzgwOTUiCiAgICAgICAgICAgcng9IjcuOTIzODA5NSIKICAgICAgICAgICB5PSIxODQuNDk1MjQiCiAgICAgICAgICAgeD0iMTIuNDk1MjY2IgogICAgICAgICAgIGhlaWdodD0iMTAzLjAwOTUyIgogICAgICAgICAgIHdpZHRoPSIxMDMuMDA5NTIiCiAgICAgICAgICAgaWQ9InJlY3QyODk2IgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjAuMTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk5MDAwMDAxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTowLjk5MDAwMDAxLCAwLjk5MDAwMDAxO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgICAgPHJlY3QKICAgICAgICAgICByeT0iOC43MDEwMDUiCiAgICAgICAgICAgcng9IjcuOTI5Mjg4OSIKICAgICAgICAgICB5PSIyMDAuNDk0OTYiCiAgICAgICAgICAgeD0iOC40OTUwMDY2IgogICAgICAgICAgIGhlaWdodD0iODcuMDEwMDQ4IgogICAgICAgICAgIHdpZHRoPSIxMTEuMDEwMDQiCiAgICAgICAgICAgaWQ9InJlY3QyODk4IgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjAuMTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk5MDAwMDAxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTowLjk5MDAwMDAxLCAwLjk5MDAwMDAxO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBpZD0icGF0aDI5MDAiCiAgICAgICAgICAgZD0iTSAyLjYyMDMwMTVlLTUsMjg4Ljk5OTk5IEggMTI4LjAwMDAzIgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtmaWxsOm5vbmU7c3Ryb2tlOiM2MmEwZWE7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI5Ij4KICAgICAgPHJlY3QKICAgICAgICAgY2xpcC1wYXRoPSJub25lIgogICAgICAgICByeT0iOCIKICAgICAgICAgcng9IjgiCiAgICAgICAgIHk9Ii0yOTQiCiAgICAgICAgIHg9Ii0xMDgiCiAgICAgICAgIGhlaWdodD0iMzAuMjUiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaWQ9InJlY3QxMTY3IgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiMxYTVmYjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEzLjcxODc2NTI2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbCIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsLTM3NCwyMDIuMDQ4MDgpIgogICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyMjEzKSIKICAgICAgICAgaWQ9Imc4MDA1IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IiAvPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjI1LDAsMCwwLjI1LC00MjQsMjAyLjA0ODA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMjIxMykiCiAgICAgICAgIGlkPSJnODAxNSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNSwwLDAsMC4yNSwtNDE0LDIwMi4wNDgwOCkiCiAgICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIyMTMpIgogICAgICAgICBpZD0iZzgwMjUiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsLTQwNCwyMDIuMDQ4MDgpIgogICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyMjEzKSIKICAgICAgICAgaWQ9Imc4MDM1IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IiAvPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjI1LDAsMCwwLjI1LC0zOTQsMjAyLjA0ODA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMjIxMykiCiAgICAgICAgIGlkPSJnODA0NSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNSwwLDAsMC4yNSwtMzg0LDIwMi4wNDgwOCkiCiAgICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIyMTMpIgogICAgICAgICBpZD0iZzgwNTUiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoLTEpIgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMTU5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBpZD0icmVjdDExNTEiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaGVpZ2h0PSI0MCIKICAgICAgICAgeD0iLTEwOCIKICAgICAgICAgeT0iLTI5MiIKICAgICAgICAgcng9IjgiCiAgICAgICAgIHJ5PSI4IgogICAgICAgICBjbGlwLXBhdGg9Im5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGNsaXAtcGF0aD0ibm9uZSIKICAgICAgICAgcnk9IjgiCiAgICAgICAgIHJ4PSI4IgogICAgICAgICB5PSItMjg4IgogICAgICAgICB4PSItMTA4IgogICAgICAgICBoZWlnaHQ9IjEwOCIKICAgICAgICAgd2lkdGg9Ijg4IgogICAgICAgICBpZD0icmVjdDExNjEiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Y2ZjVmNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKC0xKSIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQsMikiCiAgICAgICAgIGlkPSJnMTE1MyI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2Q1ZDNjZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgICAgZD0ibSAzMiwxODggYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHogbSA4LDAgYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHogbSA4LDAgYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHoiCiAgICAgICAgICAgaWQ9InBhdGg5NTAtMy03IiAvPgogICAgICAgIDxjaXJjbGUKICAgICAgICAgICByPSIyIgogICAgICAgICAgIGN5PSIxOTAiCiAgICAgICAgICAgY3g9Ii0xMDQiCiAgICAgICAgICAgaWQ9InBhdGgxMTQ4IgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Q1ZDNjZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBkPSJtIDExMiwxOTIgYSAyLDIgMCAwIDEgLTEuNzMyMDUsLTEgMiwyIDAgMCAxIDAsLTIgQSAyLDIgMCAwIDEgMTEyLDE4OCIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNkNWQzY2Y7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgICBpZD0iY2lyY2xlMTY3NzAiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICB0cmFuc2Zvcm09InNjYWxlKC0xLDEpIgogICAgICAgICAgIGQ9Im0gLTI0LDE5MiBhIDIsMiAwIDAgMSAtMS43MzIwNTEsLTEgMiwyIDAgMCAxIDAsLTIgQSAyLDIgMCAwIDEgLTI0LDE4OCIKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNkNWQzY2Y7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgICAgaWQ9ImNpcmNsZTE2NzcwLTMiIC8+CiAgICAgIDwvZz4KICAgICAgPHJlY3QKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMTMwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgIGlkPSJyZWN0MTA1Ni0zIgogICAgICAgICB3aWR0aD0iMzYiCiAgICAgICAgIGhlaWdodD0iMzYiCiAgICAgICAgIHg9IjI1MiIKICAgICAgICAgeT0iODgiCiAgICAgICAgIHJ4PSIxMS4yIgogICAgICAgICByeT0iMTEuMiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwwLjcxNDI4NTcxLDAuNzE0Mjg1NzEsMCwyNS4xNDI4NTgsODguMDAwMDA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTYwOS03KSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTA2MikiCiAgICAgICAgIGlkPSJwYXRoMTA0NyIKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxNzIpIgogICAgICAgICBkPSJNIDEwMCwxNiAzMiw4NCB2IDIwIGggMjIgbCA2OCwtNjggLTcuODY3MTksLTUuNzYxNzE5IC0wLjA3NDIsLTAuMDcyMjcgLTguMjI0NjEsLTguMjI0NjEgeiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEyLjQ4OTgyNzE2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtwYWludC1vcmRlcjpub3JtYWwiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDExMDMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxMi40ODk4MjcxNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBkPSJtIDMyLDI3NiB2IC0yMCBsIDIwLDIwIHoiCiAgICAgICAgIGlkPSJwYXRoMTAzOCIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMDQyIgogICAgICAgICBkPSJtIDMxLjk5OTk5NiwyNzYgNGUtNiwtOCA4LDggeiIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojNDI0MDQ4O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxMi40ODk4MjcxNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMDQ0IgogICAgICAgICBkPSJtIDUwLDI3NCAtMTYsLTE2IDY3Ljk0Njk2LC02Ny45NDY5NSAxNiwxNiB6IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZmlsbDojZjZkMzJkO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjUwNjQzNzg0cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTA0NiIKICAgICAgICAgZD0iTSAzNy44ODc3NzIsMjYxLjg4Nzc2IDMyLDI1NiBsIDY4LjAwMDAxLC02Ny45OTk5OSA1LjgzNDcyLDUuOTQwOCB6IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2Y5ZjA2YjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4zNTgxMDU2cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTA0OCIKICAgICAgICAgZD0iTSA0Ni4xMTIyNDYsMjcwLjExMjIzIDUyLDI3NiBsIDY4LC02OCAtNS45NDA4LC01LjgzNDcyIHoiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjE7ZmlsbDojZTVhNTBhO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjM1ODEwNTZweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gedit,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"gedit.desktop\"\nLABEL oc.launch=\"gedit.Gedit\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Gedit\"\nLABEL oc.displayname=\"Gedit\"\nLABEL oc.path=\"/usr/bin/gedit\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/plain;\"\nLABEL oc.fileextensions=\"txt\"\nLABEL oc.legacyfileextensions=\"txt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gedit\"\nENV APPBIN \"/usr/bin/gedit\"\nENV APP \"/usr/bin/gedit\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gedit/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gedit/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Gedit

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gedit.d\n
"},{"location":"applications/gedit/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Gedit.d -t Gedit .\n
"},{"location":"applications/gedit/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Gedit > Gedit.json\ndocker image save Gedit -o Gedit.tar\nctr -n k8s.io images import Gedit.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gedit.json\n\n
"},{"location":"applications/gelemental/","title":"gElemental","text":""},{"location":"applications/gelemental/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/gelemental/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/gelemental/#ubuntu-packages","title":"Ubuntu packages","text":"
gelemental\n
"},{"location":"applications/gelemental/#path","title":"Path","text":"
/usr/bin/gelemental\n
"},{"location":"applications/gelemental/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/gelemental/#wm_class","title":"WM_CLASS","text":"
gelemental.Gelemental\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/gelemental/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/gelemental.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/gelemental/#json-dump","title":"JSON dump","text":"

json source file gelemental.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"gelemental\",\n    \"icon\": \"gelemental.svg\",\n    \"keyword\": \"gelemental\",\n    \"launch\": \"gelemental.Gelemental\",\n    \"name\": \"gElemental\",\n    \"path\": \"/usr/bin/gelemental\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"/usr/share/applications/gelemental.desktop\"\n}\n
"},{"location":"applications/gelemental/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output gelemental.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gelemental.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gelemental.d.3.0.json\n\n
"},{"location":"applications/gelemental/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gelemental && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gelemental.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZlcnNpb249IjEuMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiBpZD0ic3ZnMiIgdmlld0JveD0iMCAwIDQ4IDQ4Ij4KICA8ZGVmcyBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0NDciPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZjdiOTVkO3N0b3Atb3BhY2l0eToxIiBvZmZzZXQ9IjAiIGlkPSJzdG9wOTQ0OSIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZjdiOTVkO3N0b3Atb3BhY2l0eTowLjQwMDAwMDAxIiBvZmZzZXQ9IjEiIGlkPSJzdG9wOTQ1MSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5NDQxIj4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2I0NTkwMDtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDk0NDMiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2YyOGIyNjtzdG9wLW9wYWNpdHk6MC42NTg4MjM1NSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDk0NDUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MjAyMTAiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjUxNTQ2Mzg5IiBvZmZzZXQ9IjAiIGlkPSJzdG9wMjAyMTIiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MC4xNDQzMjk4OSIgb2Zmc2V0PSIwLjY5OTk5OTk5IiBpZD0ic3RvcDIwMjE4Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAiIG9mZnNldD0iMSIgaWQ9InN0b3AyMDIxNCIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3NjI3Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2VlZjFmNTtzdG9wLW9wYWNpdHk6MC43NjQ3MDU5IiBvZmZzZXQ9IjAiIGlkPSJzdG9wNzYyOSIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZWZmMmY2O3N0b3Atb3BhY2l0eTowIiBvZmZzZXQ9IjEiIGlkPSJzdG9wNzYzNSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3NjE5Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FkN2ZhODtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDc2MjEiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FkN2ZhODtzdG9wLW9wYWNpdHk6MC40MDIwNjE4NSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDc2MjMiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NzU5NSI+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU1ZTg7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMCIgaWQ9InN0b3A3NTk3Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU1ZTg7c3RvcC1vcGFjaXR5OjAuNTQ1MDk4MDciIG9mZnNldD0iMSIgaWQ9InN0b3A3NTk5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDc1ODUiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNjUzNjZjO3N0b3Atb3BhY2l0eToxIiBvZmZzZXQ9IjAiIGlkPSJzdG9wNzU4NyIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzY1MDdjO3N0b3Atb3BhY2l0eTowLjc5MzgxNDQyIiBvZmZzZXQ9IjEiIGlkPSJzdG9wNzU4OSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3Mzk3Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzBmMjM0MTtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDczOTkiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzBmMjI0MTtzdG9wLW9wYWNpdHk6MC41MDE5NjA4MSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDc0MDEiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50Njg4NSI+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNmMWYzZmY7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMCIgaWQ9InN0b3A2ODg3Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiM2MTY0NzE7c3RvcC1vcGFjaXR5OjAiIG9mZnNldD0iMSIgaWQ9InN0b3A2ODg5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDY2NTAiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjE3MjU0OTAyIiBvZmZzZXQ9IjAiIGlkPSJzdG9wNjY1MiIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzA5YWM4O3N0b3Atb3BhY2l0eTowLjYyNzQ1MSIgb2Zmc2V0PSIwLjY2NyIgaWQ9InN0b3A3NDEyIi8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiM2Zjk2ZGQ7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMSIgaWQ9InN0b3A2NjU0Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIxNy44MzQyNzgiIHkxPSI4LjkzODIwMTkiIHgyPSIzMy45ODI0MTQiIHkyPSIzOS4wMDE4NzMiIGlkPSJsaW5lYXJHcmFkaWVudDc2NjEiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBzcHJlYWRNZXRob2Q9InBhZCIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNC4yMzk3IiB5MT0iMzcuNjkyODg2IiB4Mj0iMjQuMjM5NyIgeTI9IjMzLjU1ODA1MiIgaWQ9ImxpbmVhckdyYWRpZW50NzY2MyIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzM5NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjUuNDY5NDA0IiB5MT0iNDAuNDcwNzQxIiB4Mj0iMjEuNTE5NTQzIiB5Mj0iMjEuODM0MDU1IiBpZD0ibGluZWFyR3JhZGllbnQ3NjY1IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTg1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNS40NDM4NTciIHkxPSIzNy42OTI4ODYiIHgyPSIyMy4wODcwMjciIHkyPSIzMy41NTgwNTIiIGlkPSJsaW5lYXJHcmFkaWVudDc2NjciIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc2MTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeDE9IjI2LjMwNTE3OCIgeTE9IjI0LjkxMzA2OSIgeDI9IjEyLjA1NTMzMSIgeTI9IjE0LjcyNTgwNCIgaWQ9ImxpbmVhckdyYWRpZW50NzY2OSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njg4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjYuOTgzNTk3IiB5MT0iMjYuNTA1MjEzIiB4Mj0iMzAuMjgwODk5IiB5Mj0iMjYuNTA1MjEzIiBpZD0ibGluZWFyR3JhZGllbnQ3NjcxIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkyNzMwNCwwLDAsMC44MzI4MTYsMS41NDIxMjIsNC42NzA5NTgpIi8+CiAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjIxLjc0NTUyNSIgY3k9IjIxLjk2NTQ5OCIgcj0iMi4zMjUxMzI2IiBmeD0iMjEuNzQ1NTI1IiBmeT0iMjEuOTY1NDk4IiBpZD0icmFkaWFsR3JhZGllbnQ3NjczIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NjI3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwNCwwLjIyOTE0OCwtMC42MjQ2NjksMi43MjYwNTUsMTMuNzIxMDUsLTQxLjI3NTk5KSIvPgogICAgPHJhZGlhbEdyYWRpZW50IGN4PSIxNC43NzIzMzQiIGN5PSI3NC4yMDk5MyIgcj0iNy44Mjg5ODI4IiBmeD0iMTQuNzcyMzM0IiBmeT0iNzQuMjA5OTMiIGlkPSJyYWRpYWxHcmFkaWVudDc2NzUiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMjEwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuNzY0Mjc4LDAuNTY2ODA0KSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIxNy44MzQyNzgiIHkxPSI4LjkzODIwMTkiIHgyPSIzMy45ODI0MTQiIHkyPSIzOS4wNjE3OTgiIGlkPSJsaW5lYXJHcmFkaWVudDg1NTIiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBzcHJlYWRNZXRob2Q9InBhZCIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNC4yMzk3IiB5MT0iMzcuNjkyODg2IiB4Mj0iMjQuMjM5NyIgeTI9IjMzLjU1ODA1MiIgaWQ9ImxpbmVhckdyYWRpZW50ODU1NCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzM5NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjUuNDY5NDA0IiB5MT0iNDAuNDcwNzQxIiB4Mj0iMjEuNTE5NTQzIiB5Mj0iMjEuODM0MDU1IiBpZD0ibGluZWFyR3JhZGllbnQ4NTU2IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5NDQxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNS40NDM4NTciIHkxPSIzNy42OTI4ODYiIHgyPSIyMy4wODcwMjciIHkyPSIzMy41NTgwNTIiIGlkPSJsaW5lYXJHcmFkaWVudDg1NTgiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk0NDciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeDE9IjI2LjMwNTE3OCIgeTE9IjI0LjkxMzA2OSIgeDI9IjEyLjA1NTMzMSIgeTI9IjE0LjcyNTgwNCIgaWQ9ImxpbmVhckdyYWRpZW50ODU2MCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njg4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjYuOTgzNTk3IiB5MT0iMjYuNTA1MjEzIiB4Mj0iMzAuMjgwODk5IiB5Mj0iMjYuNTA1MjEzIiBpZD0ibGluZWFyR3JhZGllbnQ4NTYyIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkyNzMwNCwwLDAsMC44MzI4MTYsMS41NDIxMjIsNC42NzA5NTgpIi8+CiAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjIxLjc0NTUyNSIgY3k9IjIxLjk2NTQ5OCIgcj0iMi4zMjUxMzI2IiBmeD0iMjEuNzQ1NTI1IiBmeT0iMjEuOTY1NDk4IiBpZD0icmFkaWFsR3JhZGllbnQ4NTY0IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NjI3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwNCwwLjIyOTE0OCwtMC42MjQ2NjksMi43MjYwNTUsMTMuNzIxMDUsLTQxLjI3NTk5KSIvPgogICAgPHJhZGlhbEdyYWRpZW50IGN4PSIxNC43NzIzMzQiIGN5PSI3NC4yMDk5MyIgcj0iNy44Mjg5ODI4IiBmeD0iMTQuNzcyMzM0IiBmeT0iNzQuMjA5OTMiIGlkPSJyYWRpYWxHcmFkaWVudDg1NjYiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMjEwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuNzY0Mjc4LDAuNTY2ODA0KSIvPgogIDwvZGVmcz4KICA8ZyBpZD0ibGF5ZXIxIj4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDAuOTk5OTk3LDAsMCwxLDUuOTc5NWUtMiwwLjMzNjQpIiBpZD0iaWNvbiI+CiAgICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTgwMDk5LDAsMCwxLjE4MDA5OSwtMTUuMDU4NTEsLTkuMDI5Mjg1KSIgaWQ9InJvdW5kIj4KICAgICAgICA8cGF0aCBkPSJNIDE5LjkxMDEwMiwyMi4wMjcyNTIgQyAxOS45MTAxMDIsMjUuMDI3MjUyIDE1LjkxMDEwMiwyOC4wMjcyNTIgMTUuOTEwMTAyLDMzLjAyNzI1MiBDIDE1LjkxMDEwMiwzOC4wMjcyNTIgMTguOTEwMTAyLDQxLjAyNzI1MiAyNCw0MSBDIDI5LjA4OTg5OCw0MC45NzI3NDggMzEuOTEwMTAyLDM4LjAyNzI1MiAzMS45MTAxMDIsMzMuMDI3MjUyIEMgMzEuOTEwMTAyLDI4LjAyNzI1MiAyNy45MTAxMDIsMjUuMDI3MjUyIDI3LjkxMDEwMiwyMi4wMjcyNTIgQyAyNy45MTAxMDIsMTkuMDI3MjUyIDI4LDE1LjUwNDg2NCAyOCwxMiBDIDI4LDkgMzEsMTAgMzAsOSBDIDI5LDggMTksOCAxOCw5IEMgMTcsMTAgMjAsOC45OTk5OTk3IDIwLDEyIEMgMjAsMTUuNDUzNjA4IDE5LjkxMDEwMiwxOS4wMjcyNTIgMTkuOTEwMTAyLDIyLjAyNzI1MiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTUyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzhlOTE5ZTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtb3V0bGluZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjcwMjM4NCwwLDAsMS4wMTYwNCw2Ljk2Mzg1NywxLjg4Mzg4NikiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzBmMjM0MTtzdHJva2Utd2lkdGg6MC40MjU5ODkzOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO292ZXJmbG93OnZpc2libGUiIGlkPSJyb3VuZC1ib3R0b20iLz4KICAgICAgICA8cGF0aCBkPSJNIDMyIDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDE2LjQ3OTQwMSwzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAzMiAzNS42MjU0NjkgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMC40MzI3MDIsMCwwLDAuMzUwMTk5LDEzLjQ2NDI3LDkuMTkzMzcpIiBzdHlsZT0ib3BhY2l0eTowLjgzOTk5OTk5O2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojYmU1NTAwO3N0cm9rZS13aWR0aDoxLjYzMjY0NDM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiBpZD0icm91bmQtbGlxdWlkLXJpbSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMjAuMzIzNTA0LDIyLjQ3MTc3NiBDIDIwLjQ4NDM5MiwyNC4yNTUwMTcgMTUuOTYzMzM4LDI5LjAxMzEyMSAxNi4zNzIwNjYsMzMuNDY0MTc3IEMgMTYuNzgwNTA1LDM3LjkxMjA5MyAxOC44MTY0ODEsNDAuNjUwNTE1IDI0LjAwNjU0OCw0MC40NzA3NCBDIDI5LjI1NjU0LDQwLjI5MDk2NSAzMC42OTg4MTQsMzguODY5NzE0IDMxLjM4Mjg3MywzMy40OTk3MDYgQyAzMi4wNjc5MywyOC4xMjE4NjMgMjguMTU0NzMxLDI1LjY4NzgyMyAyNy43NjExODIsMjMuNDUzOTA5IEMgMjcuMzY4NzY3LDIxLjIyNjQzMSAyNy44NTg4MDEsMjEuODI1MDg2IDI2Ljk4MTI2LDIyLjA5NDU1MSBDIDI0Ljk3NDIxNiwyMi43MTA4NTIgMjIuMjg2NTAxLDIyLjcyNTk1NCAyMS4wNTY3NjYsMjIuMTQyODEgQyAyMC45MjY0NTMsMjIuMDgxMDE1IDIwLjE1OTk1NywyMC42NTkwNzQgMjAuMzIzNTA0LDIyLjQ3MTc3NiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC44NzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC43NTYwOTc1MyIgaWQ9InJvdW5kLWxpcXVpZCIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQwNzkxLDAsMCwwLjI2MzUzMiwxNC4wOTU4MiwxMi4yODA5NSkiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU4KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMjU4NTk3MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJyb3VuZC1saXF1aWQtc3VyZmFjZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMjAuNzYyNTk5LDIyLjE1MDA2NiBDIDIwLjc0NjM1OCwyNS4zNDY5ODcgMTYuNjg4MjU0LDI4LjUzNTE3OSAxNi44MDgxMDQsMzMuMDc4MjUxIEMgMTYuOTI3OTU0LDM3LjU2MTM5OCAxOS4yNjIzNDMsNDAuNDUyMTQ4IDI0LjA4NDM1LDQwLjA1OTkyNSBDIDI4Ljk2NjI4MiwzOS42Njc3MDIgMzAuNTUwNTkyLDM4LjY0NzU1OSAzMC45NzAwMjcsMzMuMTQ3MTAzIEMgMzEuMzkzNjg3LDI3LjU5MTI0IDI3LjcxODIzOSwyNi41ODQ4ODUgMjcuMTc5ODA4LDIyLjgwMzM5NCBDIDI2LjY1MDg4MywxOS4wODg2NTkgMjcuMTA2NzksMTYuMDY3NzEyIDI3LjEwNjc5LDEyLjc3NzY5NiBDIDI3LjEwNjc5LDkuOTYxNTk2MiAyNy42NDYxMTYsMTAuNDUwNjY5IDI3LjY0NjExNiw5Ljk4MTMxOSBDIDI3LjY0NjExNiw5LjA0MjYxOTEgMjkuMTMwMTEsOS43ODU4MDkyIDI5LjAyNzI4LDkuNDU1NDE2NCBDIDI4LjkyNzg5NCw5LjEzNjA5MTUgMTguODg4NDU4LDkuMDI3NjczMiAxOC42ODE2NDgsOS4zNjk5OTIgQyAxOC40ODE5NjUsOS43MDA1MTQ3IDIwLjQwMjczNCw5LjIyMjM5NDMgMjAuNDAyNzM0LDEwLjE2MTA5NSBDIDIwLjQwMjczNCwxMC42MzA0NDUgMjEuMDI5OTUzLDkuNzg1NzAyOCAyMC44ODIxMzUsMTIuNTk3OTIxIEMgMjAuNjQyNDM1LDE3LjE1ODE3NSAyMC43Nzg4NCwxOC45NTMxNzMgMjAuNzYyNTk5LDIyLjE1MDA2NiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ4NTYwKTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjc1NjA5NzUzIiBpZD0icm91bmQtaW5saW5lIi8+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuMjk5NjI1LDAuNTk5MjUpIiBpZD0icm91bmQtbWFyay0xIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gMjkuMzQzNTMyLDI2LjA5OTIyMSBDIDI5LjM0MzUzMiwyNi4wOTkyMjEgMjguNTQ1MzkxLDI3LjExOTQ0MSAyNi44NDIzMTMsMjcuMzkwNjA0IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDg1NjIpO3N0cm9rZS13aWR0aDowLjQzNzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJyb3VuZC1pbm1hcmstMSIvPgogICAgICAgICAgPHBhdGggZD0iTSAyOS40Mjk0OTksMjUuMjM4NDI3IEMgMjkuNDI5NDk5LDI1LjIzODQyNyAyOC41Njg3ODcsMjYuNDYzNDUyIDI2LjczMjE5NywyNi43ODkwNSIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM2ODY4NzQ7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJyb3VuZC1vdXRtYXJrLTEiLz4KICAgICAgICA8L2c+CiAgICAgICAgPHBhdGggZD0iTSAxNy45MjM3MDEsOS40NzQ1NTYyIEMgMTcuOTIzNzAxLDkuNDc0NTU2MiAyMS43ODgxMzMsMTAuMzg1NTg1IDI0LjEyNzEyMSwxMC4zNjQzOTggQyAyNi40NjYxMDgsMTAuMzQzMjExIDI5Ljk5MTU1Miw5LjQ3NDU1NjIgMjkuOTkxNTUyLDkuNDc0NTU2MiIgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzhlOTE5ZTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtbGlwIi8+CiAgICAgICAgPHVzZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLjYyMjc4NywzLjI5ODU2MSkiIGlkPSJyb3VuZC1tYXJrLTIiIHg9IjAiIHk9IjAiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgeGxpbms6aHJlZj0iI3JvdW5kLW1hcmstMSIvPgogICAgICAgIDx1c2UgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMi41MTUyOTcsNy4wMjAwNjUpIiBpZD0icm91bmQtbWFyay0zIiB4PSIwIiB5PSIwIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHhsaW5rOmhyZWY9IiNyb3VuZC1tYXJrLTEiLz4KICAgICAgICA8cGF0aCBkPSJNIDE5LjkwNTMzNSwyNC4wMDQ0NjUgQyAxOC44ODYzNDYsMjcuMTA4NjQ5IDE4LjI5MjEzNCwyNy41NTA1NjIgMTkuNTk1NTA1LDI5LjA2MzY3MSBDIDIwLjUyODEwOSwzMC4xNDYzNDkgMjMuMjMyODQ3LDI4LjczOTQyNCAyNC4wMjk5NjIsMjQuMjA5NzM5IEMgMjQuOTExOTksMTkuMTk3NTMxIDIyLjkzMTE0MSwxNC4zNzI1ODggMjEuODEyNzM0LDEzLjQ4MzE0NiBDIDE5LjkxMDExMiwxMS45NzAwMzggMjEuNzY2MDI4LDE4LjMzNjE2NyAxOS45MDUzMzUsMjQuMDA0NDY1IHogIiBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50ODU2NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtZ2xvc3MiLz4KICAgICAgICA8cGF0aCBkPSJNIDM5Ljg3NSA0Mi4wNjI1IEEgMTMuODEyNSA0LjQzNzUgMCAxIDEgIDEyLjI1LDQyLjA2MjUgQSAxMy44MTI1IDQuNDM3NSAwIDEgMSAgMzkuODc1IDQyLjA2MjUgeiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtMSkgbWF0cml4KDAuNzc1Nzc0LDAsMCwwLjcxMTg4NywzLjU3MTYzNCwxMS4xNjQ4NykiIHN0eWxlPSJvcGFjaXR5OjAuODtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDg1NjYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiBpZD0icm91bmQtc2hhZG93Ii8+CiAgICAgIDwvZz4KICAgICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xODAwOTksMCwwLDEuMTgwMDk5LDMuODIzMDYzLC00LjcwMTAzKSIgaWQ9ImZsYXNrIj4KICAgICAgICA8cGF0aCBkPSJNIDE4LDI2IEMgMTYsMjkgMTIuNSwzNy41IDE0LDM5IEMgMTUuNSw0MC41IDIzLDQxIDI0LDQxIEMgMjUsNDEgMzIuNSw0MC41IDM0LDM5IEMgMzUuNSwzNy41IDMyLDI5IDMwLDI2IEMgMjgsMjMgMjgsMTUuNTA0ODY0IDI4LDEyIEMgMjgsOSAzMSwxMCAzMCw5IEMgMjksOCAxOSw4IDE4LDkgQyAxNywxMCAyMCw4Ljk5OTk5OTcgMjAsMTIgQyAyMCwxNS40NTM2MDggMjAsMjMgMTgsMjYgeiAiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzY2MSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM4ZTkwOWY7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLW91dGxpbmUiLz4KICAgICAgICA8cGF0aCBkPSJNIDMyIDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDE2LjQ3OTQwMSwzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAzMiAzNS42MjU0NjkgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMS4yMzY0NTIsMCwwLDEuMDE2MDQsLTUuOTIxODQ2LDEuODgzODg2KSIgc3R5bGU9Im9wYWNpdHk6MTtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDc2NjMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMGYyMzQxO3N0cm9rZS13aWR0aDowLjQyNTk4OTM5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgaWQ9ImZsYXNrLWJvdHRvbSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQ5NTMxMywwLDAsMC40NTEwNjIsMTEuOTU5MzUsNS4xNDEwODkpIiBzdHlsZT0ib3BhY2l0eTowLjgzOTk5OTk5O2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNWMzNTY2O3N0cm9rZS13aWR0aDoxLjAyNTg1OTcxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgaWQ9ImZsYXNrLWxpcXVpZC1yaW0iLz4KICAgICAgICA8cGF0aCBkPSJNIDE4LjAzNDY4NiwyNi44MDk3MTQgQyAxNi4zOTk3MjcsMjkuMzU5MDY3IDEzLjA5OTY0NSwzNy40MjQ5OSAxNC4zMjI5NDgsMzguODMzMDQgQyAxNS41NDYyNTEsNDAuMjQxMDkgMjMuMTkxMDEzLDQwLjQ3MDc0IDI0LjAwNjU0OCw0MC40NzA3NCBDIDI0LjgyMjA4Myw0MC40NzA3NCAzMi4zNzY3OTgsNDAuMzAxMDE1IDMzLjYwMDEwMSwzOC44OTI5NjUgQyAzNC44MjM0MDMsMzcuNDg0OTE1IDMxLjY2MzYxNywyOS4zNzM0NTEgMjkuODU4NTYsMjYuNjg5ODY0IEMgMjguMDQ5NzYsMjQuMDAwNzEzIDI4LjQwMjExMSwyMC44NDkyNzggMjcuODE3ODE2LDIxLjI5NzY0IEMgMjUuNzYzMzM3LDIyLjg3NDE1OSAyMC42OTY4NDgsMjEuOTg5OTM1IDIwLjEzNDA3NiwyMS4zNDgzMSBDIDE5LjY1NTMxOSwyMC44MDI0NzMgMTkuNjczNjczLDI0LjI1NDA3OSAxOC4wMzQ2ODYsMjYuODA5NzE0IHogIiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDc2NjUpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjg3NTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjc1NjA5NzUzIiBpZD0iZmxhc2stbGlxdWlkIi8+CiAgICAgICAgPHBhdGggZD0iTSAzMiAzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAxNi40Nzk0MDEsMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMzIgMzUuNjI1NDY5IHoiIHRyYW5zZm9ybT0ibWF0cml4KDAuNDYyNTM5LDAsMCwwLjMzNzUzNSwxMi43NjU4OSw5LjIxMTA0NCkiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3NjY3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMjU4NTk3MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJmbGFzay1saXF1aWQtc3VyZmFjZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMTguNDk0NDIxLDI2LjgwODE0MyBDIDE2LjczNjQwMSwyOS40OTcyOTQgMTMuNDU2OTkxLDM3LjQyMDE4OSAxNC43Njk0NDUsMzguNjA5MDk5IEMgMTYuMDQzNTI4LDM5Ljc2MzI1MSAyMy4yNjg4MTUsNDAuMDU5OTI1IDI0LjA4NDM1LDQwLjA1OTkyNSBDIDI0Ljg5OTg4NSw0MC4wNTk5MjUgMzEuODkxOTMsMzkuOTgyNjE0IDMzLjIxNjc5MiwzOC42MjUzNDQgQyAzNC41MTk2NzcsMzcuMjkwNTkgMzAuMzgwMTIyLDI3LjY2MjEyNiAyOS41MzYxNCwyNi45MDI2MDQgQyAyOS4xMjc5ODIsMjYuNTM1MjkyIDI3LjcwODE2NiwyMi41MzE2ODYgMjcuNTU4MzI3LDIwLjY5Njg2MyBDIDI3LjMwODQ0OSwxNy42MzcwMzMgMjcuMTA2NzksMTQuNDIyNzA0IDI3LjEwNjc5LDEyLjc3NzY5NiBDIDI3LjEwNjc5LDkuOTYxNTk2MiAyNy42NDYxMTYsMTAuNDUwNjY5IDI3LjY0NjExNiw5Ljk4MTMxOSBDIDI3LjY0NjExNiw5LjA0MjYxOTEgMjkuMjg5ODAyLDkuOTMxOTU2NSAyOS4xNTMyNDQsOS41MDU1MzkgQyAyOS4wMjQwODEsOS4xMDIyMTM0IDE4LjY1NjQ1Myw5LjAzNzcxMjMgMTguNTgwMDg4LDkuNTQ3MTczNCBDIDE4LjQ5OTk5OSwxMC4wODE0NzkgMjAuNDAyNzM0LDkuMjIyMzk0MyAyMC40MDI3MzQsMTAuMTYxMDk1IEMgMjAuNDAyNzM0LDEwLjYzMDQ0NSAyMC44ODIxMzUsOS43ODE4MjA2IDIwLjg4MjEzNSwxMi41OTc5MjEgQyAyMC44ODIxMzUsMTQuMjE4ODcyIDIwLjg1NTYyNiwxNy40NDg1MzQgMjAuNDgwNDMyLDIwLjI1NjY3NSBDIDIwLjEwNTIzOSwyMy4wNjQ4MTcgMTkuMzgxMzYsMjUuNDUxNDM5IDE4LjQ5NDQyMSwyNi44MDgxNDMgeiAiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzY2OSk7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC43NTYwOTc1MyIgaWQ9ImZsYXNrLWlubGluZSIvPgogICAgICAgIDxnIGlkPSJmbGFzay1tYXJrLTEiPgogICAgICAgICAgPHBhdGggZD0iTSAyOS4zNDM1MzIsMjYuMDk5MjIxIEMgMjkuMzQzNTMyLDI2LjA5OTIyMSAyOC41NDUzOTEsMjcuMTE5NDQxIDI2Ljg0MjMxMywyNy4zOTA2MDQiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzY3MSk7c3Ryb2tlLXdpZHRoOjAuNDM3NTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLWlubWFyay0xIi8+CiAgICAgICAgICA8cGF0aCBkPSJNIDI5LjQyOTQ5OSwyNS4yMzg0MjcgQyAyOS40Mjk0OTksMjUuMjM4NDI3IDI4LjU2ODc4NywyNi40NjM0NTIgMjYuNzMyMTk3LDI2Ljc4OTA1IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzVmNWY2OTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLW91dG1hcmstMSIvPgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aCBkPSJNIDE3LjkyMzcwMSw5LjQ3NDU1NjIgQyAxNy45MjM3MDEsOS40NzQ1NTYyIDIxLjc4ODEzMywxMC4zODU1ODUgMjQuMTI3MTIxLDEwLjM2NDM5OCBDIDI2LjQ2NjEwOCwxMC4zNDMyMTEgMjkuOTkxNTUyLDkuNDc0NTU2MiAyOS45OTE1NTIsOS40NzQ1NTYyIiBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojOGU5MTllO3N0cm9rZS13aWR0aDowLjg0NzM4Nzc5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJmbGFzay1saXAiLz4KICAgICAgICA8dXNlIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuODIwMjI1LDMuODIwMjI1KSIgaWQ9ImZsYXNrLW1hcmstMiIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB4bGluazpocmVmPSIjZmxhc2stbWFyay0xIi8+CiAgICAgICAgPHVzZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzLjU2OTM0Nyw3LjUyNDA2NykiIGlkPSJmbGFzay1tYXJrLTMiIHg9IjAiIHk9IjAiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgeGxpbms6aHJlZj0iI2ZsYXNrLW1hcmstMSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMTkuMjY3ODQ4LDIzLjgyNTk2OSBDIDE4LjI0ODg1OSwyNi45MzAxNTMgMTguMjkyMTM0LDI3LjU1MDU2MiAxOS41OTU1MDUsMjkuMDYzNjcxIEMgMjAuNTI4MTA5LDMwLjE0NjM0OSAyMy4yMzI4NDcsMjguNzM5NDI0IDI0LjAyOTk2MiwyNC4yMDk3MzkgQyAyNC45MTE5OSwxOS4xOTc1MzEgMjIuOTMxMTQxLDE0LjM3MjU4OCAyMS44MTI3MzQsMTMuNDgzMTQ2IEMgMTkuOTEwMTEyLDExLjk3MDAzOCAyMS4xMjg1NDEsMTguMTU3NjcxIDE5LjI2Nzg0OCwyMy44MjU5NjkgeiAiIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ3NjczKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJmbGFzay1nbG9zcyIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzkuODc1IDQyLjA2MjUgQSAxMy44MTI1IDQuNDM3NSAwIDEgMSAgMTIuMjUsNDIuMDYyNSBBIDEzLjgxMjUgNC40Mzc1IDAgMSAxICAzOS44NzUgNDIuMDYyNSB6IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0wLjcpIG1hdHJpeCgwLjk1Nzc0NiwwLDAsMC44Nzg4NzMsLTEuMTcxMDA0LDQuMTQxMDI4KSIgc3R5bGU9Im9wYWNpdHk6MC44O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NzY3NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJmbGFzay1zaGFkb3ciLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"gelemental,gelemental\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"gelemental.desktop\"\nLABEL oc.launch=\"gelemental.Gelemental\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"gElemental\"\nLABEL oc.displayname=\"gElemental\"\nLABEL oc.path=\"/usr/bin/gelemental\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"gElemental\"\nENV APPBIN \"/usr/bin/gelemental\"\nENV APP \"/usr/bin/gelemental\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gelemental/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gelemental/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application gElemental

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gElemental.d\n
"},{"location":"applications/gelemental/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f gElemental.d -t gElemental .\n
"},{"location":"applications/gelemental/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect gElemental > gElemental.json\ndocker image save gElemental -o gElemental.tar\nctr -n k8s.io images import gElemental.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gElemental.json\n\n
"},{"location":"applications/geogebra/","title":"Geogebra","text":""},{"location":"applications/geogebra/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/geogebra/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/geogebra/#ubuntu-packages","title":"Ubuntu packages","text":"
geogebra\n
"},{"location":"applications/geogebra/#path","title":"Path","text":"
/usr/bin/geogebra\n
"},{"location":"applications/geogebra/#file-extensions","title":"File extensions","text":"

\"ggb;ggt\"

"},{"location":"applications/geogebra/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"ggb;ggt\"

"},{"location":"applications/geogebra/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/geogebra/#wm_class","title":"WM_CLASS","text":"
geogebra-GeoGebra.geogebra-GeoGebra\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/geogebra/#json-dump","title":"JSON dump","text":"

json source file geogebra.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"geogebra\",\n    \"icon\": \"geogebra.svg\",\n    \"installrecommends\": true,\n    \"keyword\": \"geogebra,math\",\n    \"launch\": \"geogebra-GeoGebra.geogebra-GeoGebra\",\n    \"name\": \"Geogebra\",\n    \"path\": \"/usr/bin/geogebra\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"fileextensions\": \"ggb;ggt\",\n    \"legacyfileextensions\": \"ggb;ggt\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktop\": \"geogebra.desktop\"\n}\n
"},{"location":"applications/geogebra/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output geogebra.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geogebra.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geogebra.d.3.0.json\n\n
"},{"location":"applications/geogebra/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y geogebra && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"geogebra.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHZlcnNpb249IjEuMCIKICAgd2lkdGg9IjI4IgogICBoZWlnaHQ9IjI4IgogICBpZD0ic3ZnMiIKICAgdmlld0JveD0iMCAwIDI4IDI4Ij4KICA8ZGVzYwogICAgIGlkPSJkZXNjNiI+Q3JlYXRvcjogRnJlZUhFUCBHcmFwaGljczJEIERyaXZlciBQcm9kdWNlcjogZ2VvZ2VicmEuZC5hIFJldmlzaW9uOiAxLjEwICBTb3VyY2U6ICBEYXRlOiBTYW1zdGFnLCA3LiBBdWd1c3QgMjAxMCAxNDowNiBVaHIgTUVTWjwvZGVzYz4KICA8ZGVmcwogICAgIGlkPSJkZWZzODUiIC8+CiAgPGcKICAgICBpZD0iZzI0OTgiPgogICAgPGcKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuNTA4ODg3NywwLDAsMS41MDg4ODc3LC0wLjQ1NTEwNDQsMC42NzA0MDU2KSIKICAgICAgIGlkPSJsYXllcjAiCiAgICAgICBzdHlsZT0ic3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC41NjY5MjkxLDAuNTY2OTI5MSkiCiAgICAgICAgIGlkPSJnMTgiPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9ImcyMCIKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjY2NjY2O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1vcGFjaXR5OjEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gNC42NTMwNDUsMjEuNzE1Mzk4IGMgMi41NTI4NzIzLDUuMzM3NzQ2IDkuOTk5OTMxLDcuMDkyOTM2IDE2LjYzMzQ3MSwzLjkyMDMyOCA2LjYzMzU0LC0zLjE3MjYwOSA5Ljk0MTU3NSwtMTAuMDcxNjE1IDcuMzg4NzAzLC0xNS40MDkzNjEgQyAyNi4xMjIzNDcsNC44ODg2MTg1IDE4LjY3NTI4OCwzLjEzMzQyODEgMTIuMDQxNzQ4LDYuMzA2MDM3MSA1LjQwODIwNzYsOS40Nzg2NDYxIDIuMTAwMTcyNywxNi4zNzc2NTIgNC42NTMwNDUsMjEuNzE1Mzk4IHoiCiAgICAgICAgICAgICBpZD0icGF0aDIyIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzI0Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMjYiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxOSw1IGMgMCwxLjY1Njg1NDIgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDU4IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDI4IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzMwIj4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMzIiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxOSw1IGMgMCwxLjY1Njg1NDIgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDU4IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDM0IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzM2Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMzgiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSA4LDEzIGMgMCwxLjY1Njg1NCAtMS4zNDMxNDU4LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0MiwwIDMsMS4zNDMxNDYgMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDQwIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzQyIj4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnNDQiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSA4LDEzIGMgMCwxLjY1Njg1NCAtMS4zNDMxNDU4LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0MiwwIDMsMS4zNDMxNDYgMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDQ2IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzQ4Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnNTAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxMiwyNiBjIDAsMS42NTY4NTQgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NiAzLDMgeiIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC41NjY5MjkxLDAuNTY2OTI5MSkiCiAgICAgICAgIGlkPSJnNTQiPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9Imc1NiIKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utb3BhY2l0eToxIj4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJtIDEyLDI2IGMgMCwxLjY1Njg1NCAtMS4zNDMxNDYsMyAtMywzIC0xLjY1Njg1NDIsMCAtMywtMS4zNDMxNDYgLTMsLTMgMCwtMS42NTY4NTQgMS4zNDMxNDU4LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg1OCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc2MCI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzYyIgogICAgICAgICAgIHN0eWxlPSJmaWxsOiM5OTk5ZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjcsMjQgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg2NCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc2NiI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzY4IgogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1vcGFjaXR5OjEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjcsMjQgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg3MCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc3MiI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzc0IgogICAgICAgICAgIHN0eWxlPSJmaWxsOiM5OTk5ZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMzIsMTEgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDc2IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzc4Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnODAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAzMiwxMSBjIDAsMS42NTY4NTQgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDYgLTMsLTMgMCwtMS42NTY4NTQyIDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ1OCAzLDMgeiIKICAgICAgICAgICAgIGlkPSJwYXRoODIiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"geogebra,geogebra,math\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"geogebra-GeoGebra.geogebra-GeoGebra\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Geogebra\"\nLABEL oc.displayname=\"Geogebra\"\nLABEL oc.path=\"/usr/bin/geogebra\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"ggb;ggt\"\nLABEL oc.legacyfileextensions=\"ggb;ggt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Geogebra\"\nENV APPBIN \"/usr/bin/geogebra\"\nENV APP \"/usr/bin/geogebra\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/geogebra/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/geogebra/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Geogebra

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Geogebra.d\n
"},{"location":"applications/geogebra/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Geogebra.d -t Geogebra .\n
"},{"location":"applications/geogebra/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Geogebra > Geogebra.json\ndocker image save Geogebra -o Geogebra.tar\nctr -n k8s.io images import Geogebra.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Geogebra.json\n\n
"},{"location":"applications/gephi/","title":"gephi","text":""},{"location":"applications/gephi/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk.java.gephi

"},{"location":"applications/gephi/#display-name","title":"Display name","text":"

\"Gephi\"

"},{"location":"applications/gephi/#path","title":"path","text":"

\"/opt/gephi-0.9.1/bin/gephi\"

"},{"location":"applications/gimagereader/","title":"gimagereader","text":""},{"location":"applications/gimagereader/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk.gimagereader

"},{"location":"applications/gimagereader/#display-name","title":"Display name","text":"

\"OCR-gimagereader\"

"},{"location":"applications/gimagereader/#path","title":"path","text":"

\"/usr/bin/gimagereader-gtk\"

"},{"location":"applications/gimagereader/#mime-type","title":"Mime Type","text":"

\"image/bmp;image/jpeg;image/gif;image/png;image/tiff;image/x-bmp;image/x-ico;image/x-png;image/x-pcx;image/x-tga;image/xpm;image/svg+xml;\"

"},{"location":"applications/gimagereader/#file-extensions","title":"File extensions","text":"

\"bmp;jpeg;png,tiff,tga\"

"},{"location":"applications/gimp/","title":"Gimp","text":""},{"location":"applications/gimp/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/gimp/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/gimp/#alpine-packages","title":"Alpine packages","text":"
gimp gimp-lang\n
"},{"location":"applications/gimp/#path","title":"Path","text":"
/usr/bin/gimp\n
"},{"location":"applications/gimp/#mimetype","title":"Mimetype","text":"
image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\n
"},{"location":"applications/gimp/#file-extensions","title":"File extensions","text":"

\"dds\"

"},{"location":"applications/gimp/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"dds\"

"},{"location":"applications/gimp/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/gimp/#wm_class","title":"WM_CLASS","text":"
gimp.Gimp\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/gimp/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/gimp.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/gimp/#json-dump","title":"JSON dump","text":"

json source file gimp.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"gimp gimp-lang\",\n    \"icon\": \"circle_gimp.svg\",\n    \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"gimp.Gimp\",\n    \"name\": \"Gimp\",\n    \"path\": \"/usr/bin/gimp\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n    \"fileextensions\": \"dds\",\n    \"legacyfileextensions\": \"dds\",\n    \"desktopfile\": \"/usr/share/applications/gimp.desktop\",\n    \"usedefaultapplication\": false,\n    \"quick\": true\n}\n
"},{"location":"applications/gimp/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output gimp.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gimp.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gimp.d.3.0.json\n\n
"},{"location":"applications/gimp/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gimp gimp-lang\nLABEL oc.icon=\"circle_gimp.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iR2ltcCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iNTIwLjAzIiB4Mj0iNTIwLjAzIiB5MT0iMi4wMDc4IiB5Mj0iMTAyNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYzMzYgMCAwIC4wNjMzNjMgLS40NDM3OCAtLjQ0NDc1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI1MjIuNTMiIHgyPSI1MjIuNTMiIHkxPSIyNzUuMDMiIHkyPSI3NTUuMDMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS44NjU4IC0xLjEwNzEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2YjRmMzUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzIzMjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDMxMzAzIiB5PSItLjA0MjM1NSIgd2lkdGg9IjEuMDYyNiIgaGVpZ2h0PSIxLjA4NDciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjguMzQ3NDgwOSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xNzAzNTMiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MDkiIHg9Ii0uMDkzOTExIiB5PSItLjEyNzA2IiB3aWR0aD0iMS4xODc4IiBoZWlnaHQ9IjEuMjU0MSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS41OTY3NDM0Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS4zODQxIC42NDk4NCkiIGQ9Im04MjMgMjk5Ljg3Yy00LjM0OC0xOS40NTMtOC42MDctMjQuMzczLTguNjA3LTI0LjM3M3MtOC42NDcgMTcuOTkyLTIxLjg2OCAzOS41OTRjLTEzLjIyMiAyMS42NDMtMzQuMzU3IDQ0LjYyNS01Mi42MTMgNTkuMDc0LTIzLjc1IDE4LjgzOC00Ny44NDYgMzAuOTQ1LTY5LjE3NCAzNy45NDEtMjEuMjkxIDcuMDMzLTM4LjY2NCAxMS4wNjYtMzguNjY0IDExLjA2NiA5LjM3NyA3LjYxMyAxOS40MDggMTcuMDY4IDI0Ljg2NCAyNy45MSA1LjQxNiAxMC44MDEgOC41MzMgMjIuOTgyIDguNTMzIDM2LjI0NCAwIDI1Ljk0NS05Ljk5NCA0OC4yNzctMjYuMjg1IDY0LjE1Mi0xNi4yOTkgMTUuODM2LTM4LjkzNCAyNS4yMTUtNjQuMjYgMjUuMjE1LTMwLjc0NiAwLTU1LjA2OS05LjE0OC03MS43MTEtMjQuNzkzLTE2LjY0MS0xNS42ODUtMjUuNTk4LTM3LjktMjUuNTk4LTY0LjAzOSAwLTkuOTUxIDEuNTAyLTE5LjA5OSA0LjIyNy0yNy40MDIgMi43MzItOC4yNjQgNi42ODktMTUuNzIzIDExLjY0OC0yMi4yNTggMCAwLTcuMzgxIDEtMjAuNTIxLTEuNzY0LTEzLjEwOC0yLjc3My0zMi4wNTMtOS4zNDUtNTUuMTQ5LTI0LjQ0Ny0xOS42NDItMTIuODM4LTM2Ljc3OS0zMC43ODctNDkuMDM5LTQ1LjUwOC0xMi4yMjQtMTQuNzIzLTE5LjU1OC0yNi4yNTgtMTkuNTU4LTI2LjI1OHMwLjcyOSA1OS4zODcgMC40NTcgOTIuMjU0Yy0wLjY4OCA5MS4wMi05LjkxNCA5MS41OTgtOS45MTQgOTEuNTk4LTExLjIyMy0xNS44NzktMjMuMzI3LTI5LjU2My0zNy43OC0zOS4yODUtMTQuNDg0LTkuNzI3LTMxLjMyLTE1LjQ0OS01Mi4wMzMtMTUuNDEyLTI1LjA1NyAwLjAzNy0zOS4wODQgOS4zMzYtNDcuMDc2IDIyLjI1NC03Ljk5NiAxMi45NTMtOS45NTUgMjkuNDgtMTAuNzYyIDQzLjk3Mi0xLjQ2MSAyNC45ODMgMTEuMTQ1IDU2LjI3MSAzMS45MzYgODEuMjU2IDIwLjgyNiAyNC45ODMgNDkuODgxIDQzLjcwNSA4MS40MzYgNDMuNjY4IDIuMjI5IDAgNC42MTItMC4xNTQgNy4wMzMtMC40NjMgMi40MTgtMC4zNDcgNC44ODEtMC44MDggNy40MTgtMS40NjEgMCAwIDcuMTA4IDYuODQgMjMuNDQgMTcuMzM2IDE2LjMzNCAxMC41MjggNDEuODkgMjQuNjc2IDc4Ljc4NSAzOS4zNTggMTkuMTM5IDcuNjA3IDM5LjU0NSAxNS42NDIgNjUuMDYzIDIxLjkwNCAyNS41MTggNi4yNjggNTYuMTA2IDEwLjc2OCA5NS42MTQgMTEuMjY4IDU0LjAzNSAwLjY1MiA5Mi41ODQtMTEuMjY4IDEyMS4zMy0yOC41NjMgMjguNzg3LTE3LjI5NyA0Ny44MTItNDAuMDEgNjIuODM4LTYwLjk5NCAyNy4xMzEtMzcuOTc5IDQzLjQ2NS04My41MjcgNTIuOTU3LTEyNy43NyA5LjQ5NC00NC4yMDMgMTIuMTg3LTg3LjEwMyAxMi4wMzEtMTE5LjczLTAuMjcxLTU4LjExNi00LjY5My05Mi4wOTUtOC45OTQtMTExLjU0em0tNTc4LjU0IDI0Mi44OGMtMTYuOTg2IDAtMzAuNzQ0LTEzLjc2LTMwLjc0NC0zMC43NSAwLTE2Ljk4OCAxMy43NTgtMzAuNzUgMzAuNzQ0LTMwLjc1IDE2Ljk1MSAwIDMwLjc0NCAxMy43NjIgMzAuNzQ0IDMwLjc1IDAgMTYuOTktMTMuNzkzIDMwLjc1LTMwLjc0NCAzMC43NXptMTY1LjkxIDE1LjkxNGMtNDIuMDA0LTAuMDQxLTU4LjkxOC0yNy40MDYtNTguNTctNTEuNzM2IDAuMzg3LTI2LjYgMTEuNTI5LTU5LjYxNiA1OS4wNy01OS4yNzEgMjguOTc1IDAuMTk1IDU2LjUzNSAyNS40ODQgNTYuMzc3IDU1LjkyNC0wLjE1IDI3LjU2My0yMy44NjcgNTUuMDgzLTU2Ljg3NyA1NS4wODN6bTI3Mi4xNyA5Ni4zNTljLTIuMDc2IDUuNjU1LTQuOTkyIDkuNjA4LTQuOTkyIDkuNjA4czEuMTEzLTYuMTg0IDEuMTg5LTEwLjY4NGMwLjAzNi00LjY0OC0xLjE4OS0xMC4zMzgtMS4xODktMTAuMzM4cy0zLjI2NiA2Ljk1NS0xNC43OTkgMTMuOTUxYy0xMS41MjcgNi45NTctMzEuNjY2IDE1LjY4Mi02NC43OTMgMTUuNjgyLTI4LjM2MyAwLTQzLjk2My00LjMwMy01Mi43NjctNi44MDEtOC44NC0yLjUzOS0xMC41NjUtNS4wMzUtMTAuNTY1LTUuMDM1czIyLjMyNiAyLjEwOSA0NS4zMTEgMC44NGMzMC44MTgtMS42NDggNDcuOTItNy45OTQgNjYuNTk3LTE1LjAyMyAxMC44MDMtNC4xMTIgMjMuNTYzLTE0LjY0NiAyMy41NjMtMTQuNjQ2cy00LjA3OC00LjM0Mi05LjcyNy04LjgwM2MtNS4zMDItNC4xMTEtMTIuMzczLTguNDk0LTEyLjM3My04LjQ5NHM2LjE4OCAwLjcyOSAxMy41MjQgMy42MTVjNy4zNDIgMi45MTggMTUuODc1IDcuOTU1IDIwLjU2IDE2LjUyNiAzLjY1MSA2LjY5IDIuNDk4IDEzLjk1NCAwLjQ2MSAxOS42MDJ6IiBmaWx0ZXI9InVybCgjZSkiIG9wYWNpdHk9Ii4yIi8+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS4zODQxIC42NDk4NCkiIGQ9Im01ODguMyA0NjMuOTZjLTIyLjI1MiAwLTQwLjI3NiAxNy44MzQtNDAuMjc2IDM5LjgyIDAgMjEuOTQ2IDE4LjAyNCAzOS43OCA0MC4yNzYgMzkuNzhzNDAuMjczLTE3LjgzNCA0MC4yNzMtMzkuNzhjMC0yMS45ODYtMTguMDIxLTM5LjgyLTQwLjI3My0zOS44MnptMC45OTggNTYuMDc4Yy04LjQ5NCAwLTE1LjM3MS02Ljg3NS0xNS4zNzEtMTUuMzcxIDAtOC40NTcgNi44NzctMTUuMzc1IDE1LjM3MS0xNS4zNzUgOC40NTcgMCAxNS4zNzEgNi45MTggMTUuMzcxIDE1LjM3NSAwIDguNDk2LTYuOTE0IDE1LjM3MS0xNS4zNzEgMTUuMzcxeiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMiIvPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLTEuMzg0MSAuNjQ5ODQpIiBkPSJtNDIwLjQzIDQ4NS43NmMtMTQuMzcxIDAtMjYuMDE4IDExLjg3NS0yNi4wMTggMjYuNTIxIDAgMTQuNjg2IDExLjY0NiAyNi41NjMgMjYuMDE4IDI2LjU2MyAxNC4zMzQgMCAyNS45ODItMTEuODc3IDI1Ljk4Mi0yNi41NjMgMC0xNC42NDYtMTEuNjQ4LTI2LjUyMS0yNS45ODItMjYuNTIxem0wLjM4MiAzNi4wNTFjLTQuMjI4IDAtNy42ODctMy40Mi03LjY4Ny03LjY4NiAwLTQuMjI4IDMuNDU5LTcuNjg4IDcuNjg3LTcuNjg4IDQuMjY4IDAgNy42ODggMy40NjEgNy42ODggNy42ODggMCA0LjI2Ni0zLjQyIDcuNjg2LTcuNjg4IDcuNjg2eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMiIvPgogPC9nPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzUxMyAwIDAgLjA2MzUxMyAtLjQ4NjcyIC0uNTUwNDgpIiBkPSJtNzI2LjEzIDkzLjE5OGMtOC42NzkxLTQuMzM5OC0xNy44MDctOC42Mjk2LTI3LjE4NC0xMi42Ny04LjU3OTMtMy43NDEyLTE3LjEwOS03LjE4My0yNS44MzgtMTAuMzc2LTQxLjk5OS0xNS43MTMtODQuMDQ3LTI1LjI5LTEyNi4xNS0yOC41ODMtNjkuMjMzLTUuNTg2OC0xMzguNjIgNS4zODczLTIwOC40IDMyLjkyMi0yMy4zOTQgOS4yNzgxLTQ1LjU0IDE5Ljg1My02Ni40NCAzMS44MjUtNDEuMjAxIDIzLjY0NC03Ny40MTMgNTIuNTI2LTEwOC4yNCA4Ni40OTZxLTUxLjQ3NiA1Ni40NjctODQuMzQ3IDEzMi4yNGMtMjAuMjAxIDQ2LjU0LTMyLjc3MSA5My4yMy0zNy43NTkgMTM5LjMyLTAuNDQ4OTIgNC40Mzk1LTAuODQ3OTYgOC41Nzk3LTEuMTk3MSAxMi43Mi0zLjY5MTEgNDUuNDkzLTAuMTk5NTIgOTAuNTM2IDEwLjIyNSAxMzUuNjggNS42ODYzIDI0LjQ5MiAxMy4yMTggNDguNjM1IDIyLjY5NSA3Mi42NzggMjcuNjMzIDY5Ljc4NSA2Ny4wODggMTI4LjEgMTE4LjI2IDE3NC42OSAzMS4zNzQgMjguNTgzIDY3LjAzOCA1Mi43MjYgMTA3LjA0IDcyLjYyOSAwLjE0OTY0IDAuMDQ5OSAwLjI0OTQgMC4wOTk4IDAuMzQ5MTYgMC4xNDk2NCAzLjA5MjUgMS41NDY0IDYuMDg1MyAyLjk5MjkgOC42MjkyIDQuMTQwMiA0Ljg4ODIgMi4zNDQ1IDkuMjI3OCA0LjMzOTggMTMuNTY3IDYuMjM1MyAxLjA5NzQgMC40NDg5NSAxLjg5NTQgMC44NDgwMSAyLjc0MzQgMS4xOTcyIDkuNDI3MyA0LjA5MDQgMTguODU1IDcuODMxNSAyNy44MzMgMTEuMTc0IDIuMzQ0NCAwLjg0OCA0LjQ4OTIgMS42NDYxIDYuNTg0MSAyLjM5NDQgMTkuMDA0IDYuNjg0MiAzOC4xMDggMTIuMTIxIDU2Ljc2MyAxNi4yNjIgNy44ODEgMS42OTYgMTUuNzYyIDMuMjQyNCAyMy40NDMgNC41MzkzIDAuOTQ3NzEgMC4xOTk1MyAxLjk0NTMgMC4yOTkzIDIuNjkzNSAwLjQ0ODk0IDExLjYyMiAxLjg0NTYgMjMuMTQ0IDMuMjQyNCAzNC42NjYgNC4xOTAxIDY5LjYzMiA1LjQzNzIgMTM4Ljg3LTUuNTM2OSAyMDguMzUtMzIuOTcyIDI0LjI5MS05LjU3NzQgNDcuMTg2LTIwLjYwMSA2OC42MzQtMzMuMDcyIDM1LjAxNi0yMC4zMDIgNjYuMjktNDQuMzk1IDkzLjg3NC03Mi4zMjkgNC4xNC00LjE5MDEgOC4xODAzLTguNDggMTIuMjIxLTEyLjg3IDguMzc5OC05LjIyODIgMTYuNDYtMTguOTA1IDI0LjE5Mi0yOS4wMzEgMjAuMDAyLTI2LjA4OCAzNy40Ni01NC45NyA1Mi40NzMtODYuNDk2IDIuNTkzNy01LjQ4NyA1LjEzNzYtMTEuMDc0IDcuNjMxNi0xNi44MSAwLjI0OTM5LTAuNTk4NTkgMC41NDg2Ny0xLjI0NzEgMC43OTgwNy0xLjg0NTYgMC4xNDk2NC0wLjI5OTMgMC4yNDk0LTAuNTk4NTkgMC4zOTkwNC0wLjg5Nzg5IDIuNzkzMy02LjU4NDQgNS40MzY5LTEzLjIxOSA4LjA4MDUtMTkuOTUzIDExLjYyMi0zMC41NzggMjAuMTAyLTYxLjUwNSAyNS4yODktOTIuODMxIDAuNjk4MzItNC4zODk2IDEuMzk2Ni05LjEyODQgMi4wOTUtMTMuODY3IDAuODk3ODQtNy4zMzI3IDEuNzQ1OC0xNC44MTUgMi4zNDQ0LTIyLjU0NyAwLjA5OTgtMS40NDY2IDAuMjQ5NC0zLjE0MjYgMC4zOTkwNC00LjkzODMgMS4yOTY5LTE5LjI1NSAxLjI5NjktMzguNjA5IDAuMDk5OC01OC4yNjItMC40NDg5Mi02LjM4NDktMC45OTc2LTEyLjg3LTEuNjk1OS0xOS41NTQtMC4xOTk1Mi0xLjg0NTYtMC40NDg5Mi0zLjg0MDktMC42OTgzMi01LjgzNjItMS45OTUyLTE2LjM2MS00LjkzODEtMzIuNzczLTguOTI4NS00OS41ODMtNS40MzY5LTIzLjA5NS0xMi44MTktNDYuNjQtMjIuMTQ3LTcwLjIzNC0yNy40ODQtNjkuNTg2LTY2LjgzOS0xMjcuNzUtMTE4LjMxLTE3NC42OS0xOC43MDUtMTcuMDYtMzkuMjU1LTMyLjcyMy02MS40MDItNDYuODM5LTEzLjgxNy04Ljg3OS0yOC4yMzItMTcuMDYtNDMuNjQ1LTI0Ljg0MXoiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY0NiIvPgogPHBhdGggZD0ibTQ1LjYzMiA1LjM2ODhjLTAuNTUxMjMtMC4yNzU2My0xLjEzMS0wLjU0ODA5LTEuNzI2NS0wLjgwNDcxLTAuNTQ0OS0wLjIzNzYxLTEuMDg2Ni0wLjQ1NjIxLTEuNjQxLTAuNjU5MDEtMi42Njc1LTAuOTk3OTctNS4zMzgxLTEuNjA2Mi04LjAxMjEtMS44MTU0LTQuMzk3Mi0wLjM1NDgzLTguODA0MSAwLjM0MjE2LTEzLjIzNiAyLjA5MS0xLjQ4NTggMC41ODkyOC0yLjg5MjQgMS4yNjA5LTQuMjE5OCAyLjAyMTMtMi42MTY4IDEuNTAxNy00LjkxNjcgMy4zMzYxLTYuODc0NiA1LjQ5MzZxLTMuMjY5NCAzLjU4NjQtNS4zNTcxIDguMzk4OWMtMS4yODMgMi45NTU5LTIuMDgxNCA1LjkyMTMtMi4zOTgyIDguODQ4Ni0wLjAyODUxMiAwLjI4MTk2LTAuMDUzODU2IDAuNTQ0OTItMC4wNzYwMzEgMC44MDc4OC0wLjIzNDQzIDIuODg5NC0wLjAxMjY3MiA1Ljc1MDIgMC42NDk0MiA4LjYxNzQgMC4zNjExNSAxLjU1NTYgMC44Mzk1MSAzLjA4ODkgMS40NDE0IDQuNjE2IDEuNzU1IDQuNDMyMiA0LjI2MDkgOC4xMzYgNy41MTEgMTEuMDk1IDEuOTkyNiAxLjgxNTQgNC4yNTc4IDMuMzQ4OCA2Ljc5ODQgNC42MTI5IDAuMDA5NSAwLjAwMzIgMC4wMTU4NCAwLjAwNjMgMC4wMjIxOCAwLjAwOTUgMC4xOTY0MSAwLjA5ODIyIDAuMzg2NDkgMC4xOTAwOSAwLjU0ODA2IDAuMjYyOTYgMC4zMTA0NiAwLjE0ODkgMC41ODYwOCAwLjI3NTYzIDAuODYxNjggMC4zOTYwMiAwLjA2OTcgMC4wMjg1MSAwLjEyMDM4IDAuMDUzODYgMC4xNzQyNCAwLjA3NjA0IDAuNTk4NzUgMC4yNTk3OSAxLjE5NzUgMC40OTc0IDEuNzY3NyAwLjcwOTY5IDAuMTQ4OSAwLjA1Mzg2IDAuMjg1MTIgMC4xMDQ1NSAwLjQxODE3IDAuMTUyMDggMS4yMDcgMC40MjQ1MyAyLjQyMDMgMC43Njk4NCAzLjYwNTIgMS4wMzI4IDAuNTAwNTQgMC4xMDc3MiAxLjAwMTEgMC4yMDU5MyAxLjQ4ODkgMC4yODgzIDAuMDYwMTkgMC4wMTI2NyAwLjEyMzU1IDAuMDE5MDEgMC4xNzEwNyAwLjAyODUxIDAuNzM4MTQgMC4xMTcyMiAxLjQ2OTkgMC4yMDU5MyAyLjIwMTcgMC4yNjYxMiA0LjQyMjUgMC4zNDUzMyA4LjgyLTAuMzUxNjYgMTMuMjMzLTIuMDk0MSAxLjU0MjgtMC42MDgyOSAyLjk5NjktMS4zMDg0IDQuMzU5MS0yLjEwMDUgMi4yMjQtMS4yODk0IDQuMjEwMy0yLjgxOTYgNS45NjIyLTQuNTkzOCAwLjI2Mjk0LTAuMjY2MTIgMC41MTk1NS0wLjUzODU5IDAuNzc2MTktMC44MTc0MSAwLjUzMjIyLTAuNTg2MTEgMS4wNDU0LTEuMjAwNyAxLjUzNjUtMS44NDM4IDEuMjcwNC0xLjY1NjkgMi4zNzkyLTMuNDkxMyAzLjMzMjctNS40OTM2IDAuMTY0NzMtMC4zNDg0OSAwLjMyNjMtMC43MDMzNCAwLjQ4NDctMS4wNjc2IDAuMDE1ODQtMC4wMzgwMiAwLjAzNDg1LTAuMDc5MjEgMC4wNTA2OS0wLjExNzIyIDAuMDA5NS0wLjAxOTAxIDAuMDE1ODQtMC4wMzgwMiAwLjAyNTM0LTAuMDU3MDMgMC4xNzc0MS0wLjQxODE5IDAuMzQ1MzEtMC44Mzk1OCAwLjUxMzIxLTEuMjY3MyAwLjczODE0LTEuOTQyMSAxLjI3NjctMy45MDYzIDEuNjA2Mi01Ljg5NTkgMC4wNDQzNS0wLjI3ODggMC4wODg3LTAuNTc5NzcgMC4xMzMwNi0wLjg4MDczIDAuMDU3MDItMC40NjU3MiAwLjExMDg4LTAuOTQwOTQgMC4xNDg5LTEuNDMyIDAuMDA2My0wLjA5MTg4IDAuMDE1ODQtMC4xOTk2IDAuMDI1MzQtMC4zMTM2NCAwLjA4MjM3LTEuMjIyOSAwLjA4MjM3LTIuNDUyMiAwLjAwNjMtMy43MDA0LTAuMDI4NTEtMC40MDU1Mi0wLjA2MzM2LTAuODE3NDEtMC4xMDc3MS0xLjI0MTktMC4wMTI2MzItMC4xMTcyMS0wLjAyODQ3Mi0wLjI0Mzk0LTAuMDQ0MzEyLTAuMzcwNjYtMC4xMjY3Mi0xLjAzOTEtMC4zMTM2My0yLjA4MTUtMC41NjcwNy0zLjE0OTEtMC4zNDUzMS0xLjQ2NjgtMC44MTQxNy0yLjk2MjItMS40MDY2LTQuNDYwOC0xLjc0NTYtNC40MTk2LTQuMjQ1MS04LjExMzctNy41MTQyLTExLjA5NS0xLjE4OC0xLjA4MzUtMi40OTMyLTIuMDc4My0zLjg5OTgtMi45NzQ5LTAuODc3NTYtMC41NjM5My0xLjc5MzEtMS4wODM1LTIuNzcyLTEuNTc3N3oiIGZpbGw9InVybCgjYykiIHN0cm9rZS13aWR0aD0iLjk5MzcyIi8+CiA8cGF0aCBkPSJtNTAuMDYxIDE3LjE4OHMtMC41NDk1OCAxLjE0OC0xLjM5MjYgMi41MjU0Yy0wLjg0MzA2IDEuMzgtMi4xOTE0IDIuODQ0My0zLjM1NTUgMy43NjU2LTEuNTE0MyAxLjIwMTEtMy4wNTAyIDEuOTczOC00LjQxMDIgMi40MTk5LTEuMzU3NiAwLjQ0ODQ0LTIuNDY2OCAwLjcwNTA4LTIuNDY2OCAwLjcwNTA4IDAuNTk3OSAwLjQ4NTQyIDEuMjM4MSAxLjA4OCAxLjU4NTkgMS43NzkzIDAuMzQ1MzQgMC42ODg2OSAwLjU0NDkyIDEuNDY2OSAwLjU0NDkyIDIuMzEyNSAwIDEuNjU0My0wLjYzNzAzIDMuMDc3Ni0xLjY3NTggNC4wODk4LTEuMDM5MyAxLjAwOTctMi40ODI4IDEuNjA3NC00LjA5NzcgMS42MDc0LTEuOTYwNCAwLTMuNTExMS0wLjU4MjUyLTQuNTcyMy0xLjU4MDEtMS4wNjExLTEuMDAwMS0xLjYzMjgtMi40MTczLTEuNjMyOC00LjA4NCAwLTAuNjM0NSAwLjA5NTc4LTEuMjE4NiAwLjI2OTUzLTEuNzQ4IDAuMTc0Mi0wLjUyNjkzIDAuNDI1OTktMS4wMDEzIDAuNzQyMTktMS40MTggMCAwLTAuNDcwNzYgMC4wNjI5Ni0xLjMwODYtMC4xMTMyOC0wLjgzNTc5LTAuMTc2ODEtMi4wNDMtMC41OTU2Ni0zLjUxNTYtMS41NTg2LTEuMjUyNC0wLjgxODU4LTIuMzQ1Mi0xLjk2MzctMy4xMjctMi45MDIzLTAuNzc5NDMtMC45Mzg3Ny0xLjI0NjEtMS42NzM4LTEuMjQ2MS0xLjY3MzggMCAwIDAuMDQ0NjggMy43ODcxIDAuMDI3MzQgNS44ODI4LTAuMDQzODcgNS44MDM2LTAuNjMwODYgNS44Mzk4LTAuNjMwODYgNS44Mzk4LTAuNzE1Ni0xLjAxMjUtMS40ODg2LTEuODg0LTIuNDEwMi0yLjUwMzktMC45MjM1My0wLjYyMDIxLTEuOTk1Ny0wLjk4NDc4LTMuMzE2NC0wLjk4MjQyLTEuNTk3NyAwLjAwMjQtMi40OTI0IDAuNTk0MjktMy4wMDIgMS40MTgtMC41MDk4NCAwLjgyNTkxLTAuNjM0MDkgMS44ODA2LTAuNjg1NTUgMi44MDQ3LTAuMDkzMTYgMS41OTMgMC43MDk0OCAzLjU4NjYgMi4wMzUyIDUuMTc5NyAxLjMyNzkgMS41OTMgMy4xODEzIDIuNzg3NSA1LjE5MzQgMi43ODUyIDAuMTQyMTMgMCAwLjI5MjktMC4wMDk2IDAuNDQ3MjctMC4wMjkzIDAuMTU0MTgtMC4wMjIxMyAwLjMxMjg0LTAuMDUyMTEgMC40NzQ2MS0wLjA5Mzc1IDAgMCAwLjQ1Mjc4IDAuNDM2MjIgMS40OTQxIDEuMTA1NSAxLjA0MTUgMC42NzEyOSAyLjY3MDkgMS41NzM2IDUuMDIzNCAyLjUwOTggMS4yMjAzIDAuNDg1MDQgMi41MjE0IDAuOTk3MjEgNC4xNDg0IDEuMzk2NSAxLjYyNzEgMC4zOTk2NiAzLjU3NjYgMC42ODY4NyA2LjA5NTcgMC43MTg3NSAzLjQ0NTQgMC4wNDE1NyA1LjkwMzQtMC43MTk1IDcuNzM2My0xLjgyMjMgMS44MzU1LTEuMTAyOSAzLjA0OTctMi41NTA3IDQuMDA3OC0zLjg4ODcgMS43Mjk5LTIuNDIxNiAyLjc2OTgtNS4zMjU1IDMuMzc1LTguMTQ2NSAwLjYwNTM2LTIuODE4NSAwLjc3NzUyLTUuNTU0NCAwLjc2NzU4LTcuNjM0OC0wLjAxNzI4LTMuNzA1Ni0wLjI5ODAzLTUuODcxNS0wLjU3MjI3LTcuMTExM2gtMmUtM2MtMC4yNzcxOS0xLjI0MDQtMC41NDg3OC0xLjU1NDctMC41NDg3OC0xLjU1NDd6bS0yNS43MjkgMTAuOTc3YzEuODQ3NSAwLjAxMjQzIDMuNjA1OCAxLjYyNTUgMy41OTU3IDMuNTY2NC0wLjAwOTYgMS43NTc1LTEuNTIyMiAzLjUxMTctMy42MjcgMy41MTE3LTIuNjc4My0wLjAwMjYtMy43NTY2LTEuNzQ3NS0zLjczNDQtMy4yOTg4IDAuMDI0NjgtMS42OTYxIDAuNzM0MzItMy44MDEzIDMuNzY1Ni0zLjc3OTN6bTExLjMxMiAxLjA0MWMtMS40MTg4IDAtMi41NjY0IDEuMTM3Mi0yLjU2NjQgMi41MzkxIDAgMS4zOTkzIDEuMTQ3NiAyLjUzNTIgMi41NjY0IDIuNTM1MnMyLjU2ODQtMS4xMzU4IDIuNTY4NC0yLjUzNTJjMC0xLjQwMTktMS4xNDk1LTIuNTM5MS0yLjU2ODQtMi41Mzkxem0tMjEuOTI0IDEuMTAxNmMxLjA4MDggMCAxLjk2MDkgMC44Nzc3NSAxLjk2MDkgMS45NjA5IDAgMS4wODMzLTAuODgwMTEgMS45NjA5LTEuOTYwOSAxLjk2MDktMS4wODMxIDAtMS45NTktMC44Nzc2Mi0xLjk1OS0xLjk2MDkgMC0xLjA4MzIgMC44NzU5Mi0xLjk2MDkgMS45NTktMS45NjA5em0xMS4yMjEgMC4yODcxMWMtMC45MTYzMiAwLTEuNjU4MiAwLjc1NzU1LTEuNjU4MiAxLjY5MTQgMCAwLjkzNjQxIDAuNzQxODIgMS42OTM0IDEuNjU4MiAxLjY5MzQgMC45MTM5NiAwIDEuNjU2Mi0wLjc1Njk1IDEuNjU2Mi0xLjY5MzQgMC0wLjkzMzg2LTAuNzQyMjgtMS42OTE0LTEuNjU2Mi0xLjY5MTR6bTEwLjc2OCAwLjIyNjU2YzAuNTM5MjQgMCAwLjk4MDQ3IDAuNDQxMjMgMC45ODA0NyAwLjk4MDQ3IDAgMC41NDE3Mi0wLjQ0MTIzIDAuOTc4NTItMC45ODA0NyAwLjk3ODUyLTAuNTQxNiAwLTAuOTgwNDctMC40MzY3OS0wLjk4MDQ3LTAuOTc4NTIgMC0wLjUzOTI0IDAuNDM4ODctMC45ODA0NyAwLjk4MDQ3LTAuOTgwNDd6bS0xMC43NDIgMS4wOTE4YzAuMjcyMTQgMCAwLjQ5MDIzIDAuMjIwNzEgMC40OTAyMyAwLjQ5MDIzIDAgMC4yNzIwMS0wLjIxODEgMC40OTAyNC0wLjQ5MDIzIDAuNDkwMjMtMC4yNjk1OCAwLTAuNDkwMjQtMC4yMTgyMy0wLjQ5MDI0LTAuNDkwMjMgMC0wLjI2OTU5IDAuMjIwNjUtMC40OTAyMyAwLjQ5MDI0LTAuNDkwMjN6bTE0LjQ4NCA2Ljk0MTRzMC4zOTU1MiAwLjA0NjQ1IDAuODYzMjggMC4yMzA0N2MwLjQ2ODE0IDAuMTg2MDYgMS4wMTE4IDAuNTA2MjMgMS4zMTA1IDEuMDUyNyAwLjIzMjggMC40MjY1NyAwLjE1OTE4IDAuODg5ODcgMC4wMjkzIDEuMjUtMC4xMzIzNyAwLjM2MDU3LTAuMzE4MzYgMC42MTMyOC0wLjMxODM2IDAuNjEzMjhzMC4wNzEzMy0wLjM5NDcxIDAuMDc2MTctMC42ODE2NGMwLjAwMjMtMC4yOTYzNy0wLjA3NjE3LTAuNjU4Mi0wLjA3NjE3LTAuNjU4MnMtMC4yMDc5OSAwLjQ0MjU5LTAuOTQzMzYgMC44ODg2N2MtMC43MzQ5OCAwLjQ0MzU5LTIuMDE4NiAxLTQuMTMwOSAxLTEuODA4NSAwLTIuODAzOS0wLjI3NDMyLTMuMzY1Mi0wLjQzMzU5LTAuNTYzNjYtMC4xNjE4OS0wLjY3MzgzLTAuMzIwMzEtMC42NzM4My0wLjMyMDMxczEuNDIzMSAwLjEzMzY1IDIuODg4NyAwLjA1MjczYzEuOTY1LTAuMTA1MDggMy4wNTUyLTAuNTA4ODUgNC4yNDYxLTAuOTU3MDMgMC42ODg4Mi0wLjI2MjE5IDEuNTAzOS0wLjkzNTU1IDEuNTAzOS0wLjkzNTU1cy0wLjI2MDktMC4yNzYxLTAuNjIxMDktMC41NjA1NWMtMC4zMzgwNy0wLjI2MjEyLTAuNzg5MDYtMC41NDEwMi0wLjc4OTA2LTAuNTQxMDJ6IiBmaWx0ZXI9InVybCgjZmlsdGVyOTA5KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii45OTk5OCIvPgogPHBhdGggZD0ibTUwLjA2MSAxNi40NTlzLTAuNTQ5NTggMS4xNDgtMS4zOTI2IDIuNTI1NGMtMC44NDMwNiAxLjM4LTIuMTkxNCAyLjg0NDMtMy4zNTU1IDMuNzY1Ni0xLjUxNDMgMS4yMDExLTMuMDUwMiAxLjk3MzgtNC40MTAyIDIuNDE5OS0xLjM1NzYgMC40NDg0NC0yLjQ2NjggMC43MDUwOC0yLjQ2NjggMC43MDUwOCAwLjU5NzkgMC40ODU0MiAxLjIzODEgMS4wODggMS41ODU5IDEuNzc5MyAwLjM0NTM0IDAuNjg4NjkgMC41NDQ5MiAxLjQ2NjkgMC41NDQ5MiAyLjMxMjUgMCAxLjY1NDMtMC42MzcwMyAzLjA3NzYtMS42NzU4IDQuMDg5OC0xLjAzOTMgMS4wMDk3LTIuNDgyOCAxLjYwNzQtNC4wOTc3IDEuNjA3NC0xLjk2MDQgMC0zLjUxMTEtMC41ODI1Mi00LjU3MjMtMS41ODAxLTEuMDYxMS0xLjAwMDEtMS42MzI4LTIuNDE3My0xLjYzMjgtNC4wODQgMC0wLjYzNDUgMC4wOTU3NzktMS4yMTg2IDAuMjY5NTMtMS43NDggMC4xNzQyLTAuNTI2OTMgMC40MjU5OS0xLjAwMTMgMC43NDIxOS0xLjQxOCAwIDAtMC40NzA3NiAwLjA2Mjk1Ni0xLjMwODYtMC4xMTMyOC0wLjgzNTc5LTAuMTc2ODEtMi4wNDMtMC41OTU2Ni0zLjUxNTYtMS41NTg2LTEuMjUyNC0wLjgxODU4LTIuMzQ1Mi0xLjk2MzctMy4xMjctMi45MDIzLTAuNzc5NDMtMC45Mzg3Ny0xLjI0NjEtMS42NzM4LTEuMjQ2MS0xLjY3MzggMCAwIDAuMDQ0Njg0IDMuNzg3MSAwLjAyNzM0NCA1Ljg4MjgtMC4wNDM4NyA1LjgwMzYtMC42MzA4NiA1LjgzOTgtMC42MzA4NiA1LjgzOTgtMC43MTU2LTEuMDEyNS0xLjQ4ODYtMS44ODQtMi40MTAyLTIuNTAzOS0wLjkyMzUzLTAuNjIwMjEtMS45OTU3LTAuOTg0NzgtMy4zMTY0LTAuOTgyNDItMS41OTc3IDAuMDAyNC0yLjQ5MjQgMC41OTQyOS0zLjAwMiAxLjQxOC0wLjUwOTg0IDAuODI1OTEtMC42MzQwOSAxLjg4MDYtMC42ODU1NSAyLjgwNDctMC4wOTMxNiAxLjU5MyAwLjcwOTQ4IDMuNTg2NiAyLjAzNTIgNS4xNzk3IDEuMzI3OSAxLjU5MyAzLjE4MTMgMi43ODc1IDUuMTkzNCAyLjc4NTIgMC4xNDIxMyAwIDAuMjkyOS0wLjAwOTU3NyAwLjQ0NzI3LTAuMDI5Mjk3IDAuMTU0MTgtMC4wMjIxMyAwLjMxMjg0LTAuMDUyMTEgMC40NzQ2MS0wLjA5Mzc1IDAgMCAwLjQ1Mjc4IDAuNDM2MjIgMS40OTQxIDEuMTA1NSAxLjA0MTUgMC42NzEyOSAyLjY3MDkgMS41NzM2IDUuMDIzNCAyLjUwOTggMS4yMjAzIDAuNDg1MDQgMi41MjE0IDAuOTk3MjEgNC4xNDg0IDEuMzk2NSAxLjYyNzEgMC4zOTk2NiAzLjU3NjYgMC42ODY4NyA2LjA5NTcgMC43MTg3NSAzLjQ0NTQgMC4wNDE1NyA1LjkwMzQtMC43MTk1IDcuNzM2My0xLjgyMjMgMS44MzU1LTEuMTAyOSAzLjA0OTctMi41NTA3IDQuMDA3OC0zLjg4ODcgMS43Mjk5LTIuNDIxNiAyLjc2OTgtNS4zMjU1IDMuMzc1LTguMTQ2NSAwLjYwNTM2LTIuODE4NSAwLjc3NzUyLTUuNTU0NCAwLjc2NzU4LTcuNjM0OC0wLjAxNzI4LTMuNzA1Ni0wLjI5ODAzLTUuODcxNS0wLjU3MjI3LTcuMTExM2gtMC4wMDE5NTNjLTAuMjc3MjQtMS4yNDA0LTAuNTQ4ODMtMS41NTQ3LTAuNTQ4ODMtMS41NTQ3em0tMjUuNzI5IDEwLjk3N2MxLjg0NzUgMC4wMTI0MyAzLjYwNTggMS42MjU1IDMuNTk1NyAzLjU2NjQtMC4wMDk2IDEuNzU3NS0xLjUyMjIgMy41MTE3LTMuNjI3IDMuNTExNy0yLjY3ODMtMC4wMDI2LTMuNzU2Ni0xLjc0NzUtMy43MzQ0LTMuMjk4OCAwLjAyNDY4LTEuNjk2MSAwLjczNDMyLTMuODAxMyAzLjc2NTYtMy43Nzkzem0xMS4zMTIgMS4wNDFjLTEuNDE4OCAwLTIuNTY2NCAxLjEzNzItMi41NjY0IDIuNTM5MSAwIDEuMzk5MyAxLjE0NzYgMi41MzUyIDIuNTY2NCAyLjUzNTJzMi41Njg0LTEuMTM1OCAyLjU2ODQtMi41MzUyYzAtMS40MDE5LTEuMTQ5NS0yLjUzOTEtMi41Njg0LTIuNTM5MXptLTIxLjkyNCAxLjEwMTZjMS4wODA4IDAgMS45NjA5IDAuODc3NzUgMS45NjA5IDEuOTYwOSAwIDEuMDgzMy0wLjg4MDExIDEuOTYwOS0xLjk2MDkgMS45NjA5LTEuMDgzMSAwLTEuOTU5LTAuODc3NjItMS45NTktMS45NjA5IDAtMS4wODMyIDAuODc1OTItMS45NjA5IDEuOTU5LTEuOTYwOXptMTEuMjIxIDAuMjg3MTFjLTAuOTE2MzIgMC0xLjY1ODIgMC43NTc1NS0xLjY1ODIgMS42OTE0IDAgMC45MzY0MSAwLjc0MTgyIDEuNjkzNCAxLjY1ODIgMS42OTM0IDAuOTEzOTYgMCAxLjY1NjItMC43NTY5NSAxLjY1NjItMS42OTM0IDAtMC45MzM4Ni0wLjc0MjI4LTEuNjkxNC0xLjY1NjItMS42OTE0em0xMC43NjggMC4yMjY1NmMwLjUzOTI0IDAgMC45ODA0NyAwLjQ0MTIzIDAuOTgwNDcgMC45ODA0NyAwIDAuNTQxNzItMC40NDEyMyAwLjk3ODUyLTAuOTgwNDcgMC45Nzg1Mi0wLjU0MTYgMC0wLjk4MDQ3LTAuNDM2NzktMC45ODA0Ny0wLjk3ODUyIDAtMC41MzkyNCAwLjQzODg3LTAuOTgwNDcgMC45ODA0Ny0wLjk4MDQ3em0tMTAuNzQyIDEuMDkxOGMwLjI3MjE0IDAgMC40OTAyMyAwLjIyMDcxIDAuNDkwMjMgMC40OTAyMyAwIDAuMjcyMDEtMC4yMTgxIDAuNDkwMjQtMC40OTAyMyAwLjQ5MDIzLTAuMjY5NTggMC0wLjQ5MDI0LTAuMjE4MjMtMC40OTAyNC0wLjQ5MDIzIDAtMC4yNjk1OSAwLjIyMDY1LTAuNDkwMjMgMC40OTAyNC0wLjQ5MDIzem0xNC40ODQgNi45NDE0czAuMzk1NTIgMC4wNDY0NSAwLjg2MzI4IDAuMjMwNDdjMC40NjgxNCAwLjE4NjA2IDEuMDExOCAwLjUwNjIzIDEuMzEwNSAxLjA1MjcgMC4yMzI4IDAuNDI2NTcgMC4xNTkxOCAwLjg4OTg3IDAuMDI5Mjk3IDEuMjUtMC4xMzIzNyAwLjM2MDU3LTAuMzE4MzYgMC42MTMyOC0wLjMxODM2IDAuNjEzMjhzMC4wNzEzMzEtMC4zOTQ3MSAwLjA3NjE3MS0wLjY4MTY0YzAuMDAyMy0wLjI5NjM3LTAuMDc2MTcxLTAuNjU4Mi0wLjA3NjE3MS0wLjY1ODJzLTAuMjA3OTkgMC40NDI1OS0wLjk0MzM2IDAuODg4NjdjLTAuNzM0OTggMC40NDM1OS0yLjAxODYgMS00LjEzMDkgMS0xLjgwODUgMC0yLjgwMzktMC4yNzQzMi0zLjM2NTItMC40MzM1OS0wLjU2MzY2LTAuMTYxODktMC42NzM4My0wLjMyMDMxLTAuNjczODMtMC4zMjAzMXMxLjQyMzEgMC4xMzM2NSAyLjg4ODcgMC4wNTI3MzVjMS45NjUtMC4xMDUwOCAzLjA1NTItMC41MDg4NSA0LjI0NjEtMC45NTcwMyAwLjY4ODgyLTAuMjYyMTkgMS41MDM5LTAuOTM1NTUgMS41MDM5LTAuOTM1NTVzLTAuMjYwOS0wLjI3NjEtMC42MjEwOS0wLjU2MDU1Yy0wLjMzODA3LTAuMjYyMTItMC43ODkwNi0wLjU0MTAyLTAuNzg5MDYtMC41NDEwMnoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iLjk5OTk4Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gimp,gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"gimp.desktop\"\nLABEL oc.launch=\"gimp.Gimp\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Gimp\"\nLABEL oc.displayname=\"Gimp\"\nLABEL oc.path=\"/usr/bin/gimp\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\"\nLABEL oc.fileextensions=\"dds\"\nLABEL oc.legacyfileextensions=\"dds\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gimp\"\nENV APPBIN \"/usr/bin/gimp\"\nENV APP \"/usr/bin/gimp\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gimp/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gimp/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Gimp

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gimp.d\n
"},{"location":"applications/gimp/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Gimp.d -t Gimp .\n
"},{"location":"applications/gimp/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Gimp > Gimp.json\ndocker image save Gimp -o Gimp.tar\nctr -n k8s.io images import Gimp.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gimp.json\n\n
"},{"location":"applications/gnumeric/","title":"Gnumeric","text":""},{"location":"applications/gnumeric/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/gnumeric/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/gnumeric/#alpine-packages","title":"Alpine packages","text":"
gnumeric glpk\n
"},{"location":"applications/gnumeric/#displayname","title":"Displayname","text":"
Gnumerix (alpine)\n
"},{"location":"applications/gnumeric/#path","title":"Path","text":"
/usr/bin/gnumeric\n
"},{"location":"applications/gnumeric/#mimetype","title":"Mimetype","text":"
application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\n
"},{"location":"applications/gnumeric/#file-extensions","title":"File extensions","text":"

\"gnm\"

"},{"location":"applications/gnumeric/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"gnm\"

"},{"location":"applications/gnumeric/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/gnumeric/#wm_class","title":"WM_CLASS","text":"
gnumeric.Gnumeric\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/gnumeric/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/gnumeric.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/gnumeric/#json-dump","title":"JSON dump","text":"

json source file gnumeric.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"gnumeric glpk\",\n    \"icon\": \"gnumeric.svg\",\n    \"keyword\": \"numeric\",\n    \"launch\": \"gnumeric.Gnumeric\",\n    \"displayname\": \"Gnumerix (alpine)\",\n    \"name\": \"Gnumeric\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnumeric\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\",\n    \"fileextensions\": \"gnm\",\n    \"legacyfileextensions\": \"gnm\",\n    \"desktopfile\": \"/usr/share/applications/gnumeric.desktop\",\n    \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/gnumeric/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output gnumeric.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gnumeric.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gnumeric.d.3.0.json\n\n
"},{"location":"applications/gnumeric/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnumeric glpk\nLABEL oc.icon=\"gnumeric.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL2lua3NjYXBlLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICBpZD0ic3ZnMiIKICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40MyIKICAgd2lkdGg9IjQ4IgogICBoZWlnaHQ9IjQ4IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY2Jhc2U9Ii9ob21lL3ZpbmljaXVzL3RhbmdvLWljb24tdGhlbWUtY29kZS9hcHBzL3NjYWxhYmxlIgogICBzb2RpcG9kaTpkb2NuYW1lPSJnbnVtZXJpYy5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvdmluaWNpdXMvdGFuZ28taWNvbi10aGVtZS1jb2RlL2FwcHMvc2NhbGFibGUvZ251bWVyaWMucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iOTAiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSI5MCIKICAgdmlld0JveD0iMCAwIDQ4IDQ4Ij4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzNSI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzOTAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjA2ODM3NjA3OyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDMzOTIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuMjEzNjc1MjI7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMzM5NCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5MDYwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QzZDdjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0OTA2MiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A0OTA2NCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3NjAyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RiZGJkNTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNzYwNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YxZjFmMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNzYwNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI1ODA1Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNTgwNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNTgwOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI0MDQ3Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0ZjE5NztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDA0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izc0ZDIxODtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNDA1MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE4Nzg2Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzM0NjVhNDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxODc4OCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxODc5MCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE2MTQ3Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxNjE0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxNjE1MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDk5NDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY3MTcxO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDk5NTAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkYzI1MjU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wOTk1MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE1NjYyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wMTU2NjQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmOGY4Zjg7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDE1NjY2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjU5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZhZmFmYTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wMjYwIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYmJiYmJiO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AyNjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNjkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTNhM2EzO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AyNzAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0YzRjNGM7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDI3MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2OTkiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MDEiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY3MTcxO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MDMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2MwMDAwO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcxMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxMyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1YjhjY2I7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxNSIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzNDY1YTQ7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NzE5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NzIxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3M2QyMTY7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MjMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDVmN2IzO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTA0OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNTA1MCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwLjUiCiAgICAgICAgIGlkPSJzdG9wNTA1NiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1MDUyIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3NjAyIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc2MDgiCiAgICAgICB4MT0iMTEuOTE4OTIiCiAgICAgICB5MT0iNDIuMDIwNDc3IgogICAgICAgeDI9IjExLjkxODkyIgogICAgICAgeTI9IjYuOTgyNzQ3NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NTgxNiwwLDAsMS4xNzE3MDIsLTgxLjc0NDU1LC00LjE4OTQ4MSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3NjAyIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzI5NjYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSIxMS45MTg5MiIKICAgICAgIHkxPSI0Mi4wMjA0NzciCiAgICAgICB4Mj0iMTEuOTE4OTIiCiAgICAgICB5Mj0iNi45ODI3NDc2IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwLDgwKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjU4MDUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMjk2OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgY3g9Ii03NC4wMTEwOTMiCiAgICAgICBjeT0iMzguODkwOTQyIgogICAgICAgZng9Ii03NC4wMTEwOTMiCiAgICAgICBmeT0iMzguODkwOTQyIgogICAgICAgcj0iMTMuNjYzNTg2IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMyOTcwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMjk3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMyOTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTkuMjU2NjM3NiIKICAgICAgIHkxPSI1NS44MzI5NDMiCiAgICAgICB4Mj0iLTE2LjYwNTM5MiIKICAgICAgIHkyPSI0OC41ODk0NzQiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0MDQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzI5NzYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMjk3OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNTgwNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDM1NzA0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBjeD0iLTc0LjAxMTA5MyIKICAgICAgIGN5PSIzOC44OTA5NDIiCiAgICAgICBmeD0iLTc0LjAxMTA5MyIKICAgICAgIGZ5PSIzOC44OTA5NDIiCiAgICAgICByPSIxMy42NjM1ODYiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE2MTQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzU3MDYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS41Mzk0NDMsMCwwLDEuNTEwODcxLDEwMC45NjU2LC0xNS4xODMxOSkiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTcwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzEwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzg5MzY1LDAsMCwxLjM4OTM2NSw0OC45OTAyOSwtNDYuMjA0MDUpIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzEyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzg5MzY1LDAsMCwxLjM4OTM2NSw0OC45OTAyOSwtNDYuMjA0MDUpIgogICAgICAgeDE9Ii0xOC4wNzk4ODIiCiAgICAgICB5MT0iNDguNjY1NjgiCiAgICAgICB4Mj0iLTE4LjUiCiAgICAgICB5Mj0iNTYuODI3Nzc4IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzE0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI1ODA1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDEwNDkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGN4PSItNzQuMDExMDkzIgogICAgICAgY3k9IjM4Ljg5MDk0MiIKICAgICAgIGZ4PSItNzQuMDExMDkzIgogICAgICAgZnk9IjM4Ljg5MDk0MiIKICAgICAgIHI9IjEzLjY2MzU4NiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTA1MSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5OTQ4IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDEwNTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItNTQuMTAyNzgzIgogICAgICAgeTE9IjIwLjQ1Nzg3OCIKICAgICAgIHgyPSItNDkuOTk0MTQ4IgogICAgICAgeTI9IjMzLjU0MzM2NSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTg3ODYiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTA1NSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMDU3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTE4LjA3OTg4MiIKICAgICAgIHkxPSI0OC42NjU2OCIKICAgICAgIHgyPSItMTguNSIKICAgICAgIHkyPSI1Ni44Mjc3NzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE2MTQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDEwNTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItNDkuOTk0MTQ4IgogICAgICAgeTE9IjM3LjAzNjQ5OSIKICAgICAgIHgyPSItNDkuOTk0MTQ4IgogICAgICAgeTI9IjE3Ljg1NzIwMyIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjU4MDUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTE0MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgY3g9Ii03NC4wMTEwOTMiCiAgICAgICBjeT0iMzguODkwOTQyIgogICAgICAgZng9Ii03NC4wMTEwOTMiCiAgICAgICBmeT0iMzguODkwOTQyIgogICAgICAgcj0iMTMuNjYzNTg2IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMTQ1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTE0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMTQ5IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTkuMjU2NjM3NiIKICAgICAgIHkxPSI1NS44MzI5NDMiCiAgICAgICB4Mj0iLTE2LjYwNTM5MiIKICAgICAgIHkyPSI0OC41ODk0NzQiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0MDQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDExNTEiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTE1MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNzYwMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5MDY2IgogICAgICAgeDE9IjI0LjQ5NzAxNSIKICAgICAgIHkxPSI0My4wMTI5MDkiCiAgICAgICB4Mj0iMjQuNDk3MDE1IgogICAgICAgeTI9IjUuOTg3MDE3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjA0NzAwNiwwLDAsMS4wNTM2OTYsLTEuMTU0MzY2LC0xLjMwODg1KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgcj0iMTcuNTc2NjU0IgogICAgICAgZnk9IjM1LjM3MzA5MyIKICAgICAgIGZ4PSIyMi45MzA0NjIiCiAgICAgICBjeT0iMzUuMzczMDkzIgogICAgICAgY3g9IjIyLjkzMDQ2MiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMDAwMDAsMC4wMDAwMDAsMC4wMDAwMDAsMC4zMzMzMzMsMi42NTg0NjNlLTE2LDIzLjU4MjA2KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjI1MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NDYiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxODIiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTM2ZDE4O3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MTg0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDc5MDIwO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MTg2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDE5MiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlOWI5NmU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDE5NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YxZDE5ZTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDE5NiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQyMTAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWFiYTZmO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MjEyIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjk3YTFiO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MjE0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDIyMiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDIyNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC42ODYzOTA1MjsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDQyMjYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTQ2Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0OTQ4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDQ5NTAiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTc5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZiZjBlMDtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDk4MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YwY2U5OTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDk4MyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5OTUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGU5NTIzO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDQ5OTciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhMzZkMTg7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDQ5OTkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODcxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4NzMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2NjY2NjO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExNDIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDUxMTQ0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAuNSIKICAgICAgICAgaWQ9InN0b3A1MTE0NiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1MTE0OCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNzYwMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYwMzIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MTIyMTYsMCwwLDEuMDUzNjk2LC0wLjQ0OTQ5NSwtMS4zMDg4NSkiCiAgICAgICB4MT0iMjQuNDk3MDE1IgogICAgICAgeTE9IjQzLjAxMjkwOSIKICAgICAgIHgyPSIyNC40OTcwMTUiCiAgICAgICB5Mj0iNS45ODcwMTcyIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNTgwNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDYwMzQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGN4PSItNzQuMDExMDkzIgogICAgICAgY3k9IjM4Ljg5MDk0MiIKICAgICAgIGZ4PSItNzQuMDExMDkzIgogICAgICAgZnk9IjM4Ljg5MDk0MiIKICAgICAgIHI9IjEzLjY2MzU4NiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDM2IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDM4IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTU0LjEwMjc4MyIKICAgICAgIHkxPSIyMC40NTc4NzgiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIzMy41NDMzNjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE4Nzg2IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjA0MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYwNDIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDQ0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMzOTAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMzk2IgogICAgICAgeDE9IjciCiAgICAgICB5MT0iLTE5LjUiCiAgICAgICB4Mj0iMTMiCiAgICAgICB5Mj0iLTE5LjUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDUuNTU5OTFlLTM1LDAuNzA5Njc4LDEuNjI2NDkzZS0xNiwtMTAuMTYxMjkpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMzkwIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzQwNCIKICAgICAgIHgxPSItMy45OTY0NTA3IgogICAgICAgeTE9Ii0yOC41NTAxODYiCiAgICAgICB4Mj0iLTEzIgogICAgICAgeTI9Ii0yOC41NTAxODYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC44MjM1MjksMCwtNy4yMzUyOTQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMzkwIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzQwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjYuOTk3MDA1NSIKICAgICAgIHkxPSItMjcuNjg2Njg0IgogICAgICAgeDI9IjEzLjY2OTE0NiIKICAgICAgIHkyPSItMjguNzIzODU2IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsLTIuMjQxOTAzZS0zNCwwLjI5MDMyMywxLjExMDcyMWUtMTYsLTIuODM4NzEpIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNzIwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTAyNCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBpZD0iYmFzZSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKICAgICBpbmtzY2FwZTpndWlkZS1iYm94PSJ0cnVlIgogICAgIGZpbGw9IiM4ODhhODUiCiAgICAgaW5rc2NhcGU6em9vbT0iMSIKICAgICBpbmtzY2FwZTpjeD0iMzYiCiAgICAgaW5rc2NhcGU6Y3k9IjEyLjUiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIKICAgICBzaG93Ym9yZGVyPSJmYWxzZSIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iZmFsc2UiIC8+CiAgPHJlY3QKICAgICByeD0iMi44OTE0OTQiCiAgICAgcnk9IjIuODkxNDk0IgogICAgIHk9IjUuNTI2NDk0IgogICAgIHg9IjIuMzk0MzIxIgogICAgIGhlaWdodD0iMzcuOTYwMzM5IgogICAgIHdpZHRoPSIzNC4xMDYwNzkiCiAgICAgaWQ9InJlY3Q1OTc2IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NjAzMik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM1NTU3NTM7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMzY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHk9Ii0zNSIKICAgICB4PSI3IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzUiCiAgICAgaWQ9InJlY3Q1OTgwIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLDEsLTEsMCwwLDApIiAvPgogIDxyZWN0CiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwxLC0xLDAsMCwwKSIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q1OTgyIgogICAgIHdpZHRoPSIzNSIKICAgICBoZWlnaHQ9IjEiCiAgICAgeD0iNyIKICAgICB5PSItMjQiIC8+CiAgPHJlY3QKICAgICB5PSItMTMiCiAgICAgeD0iNyIKICAgICBoZWlnaHQ9IjEiCiAgICAgd2lkdGg9IjM1IgogICAgIGlkPSJyZWN0NTk4NCIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwxLC0xLDAsMCwwKSIgLz4KICA8cmVjdAogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAsMSwtMSwwLDAsMCkiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJyZWN0NTk4NiIKICAgICB3aWR0aD0iMzUiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjciCiAgICAgeT0iLTUiIC8+CiAgPHJlY3QKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q1OTg4IgogICAgIHdpZHRoPSIzMSIKICAgICBoZWlnaHQ9IjEiCiAgICAgeD0iNCIKICAgICB5PSIyMCIgLz4KICA8cmVjdAogICAgIHk9IjI0IgogICAgIHg9IjQiCiAgICAgaGVpZ2h0PSIxIgogICAgIHdpZHRoPSIzMSIKICAgICBpZD0icmVjdDU5OTAiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiAvPgogIDxyZWN0CiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJyZWN0NTk5MiIKICAgICB3aWR0aD0iMzEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjQiCiAgICAgeT0iMjgiIC8+CiAgPHJlY3QKICAgICB5PSIzMiIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q1OTk0IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDU5OTYiCiAgICAgd2lkdGg9IjMxIgogICAgIGhlaWdodD0iMSIKICAgICB4PSI0IgogICAgIHk9IjM2IiAvPgogIDxyZWN0CiAgICAgeT0iNDEiCiAgICAgeD0iNCIKICAgICBoZWlnaHQ9IjEiCiAgICAgd2lkdGg9IjMxIgogICAgIGlkPSJyZWN0NTk5OCIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPHJlY3QKICAgICB5PSIxNiIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q2MDAwIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDYwMDIiCiAgICAgd2lkdGg9IjMxIgogICAgIGhlaWdodD0iMSIKICAgICB4PSI0IgogICAgIHk9IjEyIiAvPgogIDxyZWN0CiAgICAgeT0iNyIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q2MDA0IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMjIzMzg5ZS0xNywxLC0xLDEuNjAwNjc3ZS0xNywwLDApIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzM5Nik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjU5MzA3MzU5IgogICAgIGlkPSJyZWN0NjAwOCIKICAgICB3aWR0aD0iNiIKICAgICBoZWlnaHQ9IjIyIgogICAgIHg9IjciCiAgICAgeT0iLTM1IiAvPgogIDxyZWN0CiAgICAgeT0iLTEzIgogICAgIHg9IjciCiAgICAgaGVpZ2h0PSI5IgogICAgIHdpZHRoPSI2IgogICAgIGlkPSJyZWN0MzQwNiIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM0MDgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC41OTMwNzM1OSIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjA5NTY4MmUtMTgsMSwtMSwzLjkxMjc2NmUtMTcsMCwwKSIgLz4KICA8cmVjdAogICAgIHk9Ii00MSIKICAgICB4PSItMTMiCiAgICAgaGVpZ2h0PSIyOCIKICAgICB3aWR0aD0iOSIKICAgICBpZD0icmVjdDYwMzAiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQzNDA0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjAuNTkzMDczNTkiCiAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiIC8+CiAgPHJlY3QKICAgICByeD0iMS44OTU0OTUzIgogICAgIHJ5PSIxLjg5NTQ5NTMiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNDgyNzU4NTk7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMTI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDU5NzgiCiAgICAgd2lkdGg9IjMyLjA2MjY2NCIKICAgICBoZWlnaHQ9IjM1Ljk1ODM0NyIKICAgICB4PSIzLjQwNTA3OTEiCiAgICAgeT0iNi41MTM4OTAzIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTAuMDc4NiwtMTguMDkxNDgpIgogICAgIGlkPSJnNjAxMCI+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4yMjA2NywwLDAsMC45NTgzMzMsNzIuMTI1MDMsMTUuODUzMzcpIgogICAgICAgZD0iTSAtNjAuMzQ3NTA3IDM4Ljg5MDk0MiBBIDEzLjY2MzU4NiAxMy42NjM1ODYgMCAxIDEgIC04Ny42NzQ2NzksMzguODkwOTQyIEEgMTMuNjYzNTg2IDEzLjY2MzU4NiAwIDEgMSAgLTYwLjM0NzUwNyAzOC44OTA5NDIgeiIKICAgICAgIHNvZGlwb2RpOnJ5PSIxMy42NjM1ODYiCiAgICAgICBzb2RpcG9kaTpyeD0iMTMuNjYzNTg2IgogICAgICAgc29kaXBvZGk6Y3k9IjM4Ljg5MDk0MiIKICAgICAgIHNvZGlwb2RpOmN4PSItNzQuMDExMDkzIgogICAgICAgaWQ9InBhdGg2MDEyIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDYwMzQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNhNDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2NzAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMTI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE4LjU0ODU5MiwzNy41OTM3NSBDIC0yNi4yOTQyNDksMzcuODA2MTY1IC0zMi40OTg0MzYsNDIuNDI4MzEzIC0zMi40OTg0MzksNDguMDYyNSBDIC0zMi40OTg0MzksNDguMzc4MDE1IC0zMi40OTg0MzksNTEuNzQ2OTg2IC0zMi40OTg0MzksNTIuMDYyNSBDIC0zMi40OTg0MzksNTcuODMxOTA4IC0yNS45ODkzMTgsNjIuNDk5OTk5IC0xNy45ODQzMjksNjIuNSBDIC05Ljk3OTMzOTgsNjIuNSAtMy41MDE1Njc3LDU3LjgzMTkwOSAtMy41MDE1Njc4LDUyLjA2MjUgQyAtMy41MDE1Njc4LDUxLjc0Njk4NSAtMy41MDE1Njc4LDQ4LjM3MTI1NCAtMy41MDE1Njc4LDQ4LjA2MjUgQyAtMy41MDE1Njc4LDQyLjI5MzA5MiAtOS45NzkzMzg4LDM3LjU5Mzc0OCAtMTcuOTg0MzI5LDM3LjU5Mzc1IEMgLTE4LjE3MTk0NiwzNy41OTM3NSAtMTguMzYyNjk2LDM3LjU4ODY1MiAtMTguNTQ4NTkyLDM3LjU5Mzc1IHogIgogICAgICAgaWQ9InBhdGg2MDE0IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3Nzc3NzYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMjA0YTg3O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE1LDU3IEwgLTE1LDYxLjc5OTI0MyBDIC0xMC45MTIwNzksNjEuMTkxMzkgLTQuOTgwMzM4OSw1OC41Nzg4NzUgLTQsNTMgTCAtNCw0OCBMIC0xNSw1NyB6ICIKICAgICAgIGlkPSJwYXRoNjAxNiIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzRlOWEwNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIC0yMyw1Ny4zNjk4MjIgTCAtMjMsNjEuMzM3MjIzIEMgLTIxLjAyOTIyMiw2MS44ODUxMzcgLTE3LjU3MjgxNCw2Mi4zMDE5NzUgLTE1LDYxLjc2NDY1OCBMIC0xNSw1Ny43NjQ2NTggTCAtMjMsNTcuMzY5ODIyIHogIgogICAgICAgaWQ9InBhdGg2MDE4IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA2NjU5NSwwLDAsMS4wNDI1MjgsMzUuMzMxNTMsMjMuNDM0MDYpIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNTczODQ7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NjAzNik7c3Ryb2tlLXdpZHRoOjAuOTQ4MzIyNjU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAtMzcuMzI4OTY0LDI3LjQ0Njg1IEMgLTM3LjMyODk2NCwzMi40NzU1OTQgLTQzLjAwMjk2NywzNi41NTY4OTQgLTQ5Ljk5NDE0OCwzNi41NTY4OTQgQyAtNTYuOTg1MzMsMzYuNTU2ODk0IC02Mi42NTkzMzIsMzIuNDc1NTk0IC02Mi42NTkzMzIsMjcuNDQ2ODUgQyAtNjIuNjU5MzMyLDI3LjIwNjAxNCAtNjIuNjQ2MzE4LDI1LjA0ODkzNyAtNjIuNjIwNzY4LDI0LjgxMjc5MSBDIC02Mi4xMTI4MzMsMjAuMTE4MTMgLTU2LjY1MDUwOSwxOC4zMzY4MDUgLTQ5Ljk5NDE0OCwxOC4zMzY4MDUgQyAtNDMuMzY5MTIsMTguMzM2ODA1IC0zNy45MjY5MTIsMjAuMDgzMzgyIC0zNy4zNzUwMjksMjQuNzQ2NTY0IEMgLTM3LjM0NDUyOCwyNS4wMDQyODkgLTM3LjMyODk2NCwyNy4xODM0NzcgLTM3LjMyODk2NCwyNy40NDY4NSB6ICIKICAgICAgIGlkPSJwYXRoNjAyMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3NzYyIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwMzgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZmY3MTcxO3N0cm9rZS13aWR0aDowLjk0ODMyMjY1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icGF0aDYwMjIiCiAgICAgICBzb2RpcG9kaTpjeD0iLTQ5Ljk5NDE0OCIKICAgICAgIHNvZGlwb2RpOmN5PSIyNy40NDY4NSIKICAgICAgIHNvZGlwb2RpOnJ4PSIxMi42NjUxODQiCiAgICAgICBzb2RpcG9kaTpyeT0iOS4xMTAwNDQ1IgogICAgICAgZD0iTSAtMzcuMzI4OTY0IDI3LjQ0Njg1IEEgMTIuNjY1MTg0IDkuMTEwMDQ0NSAwIDEgMSAgLTYyLjY1OTMzMiwyNy40NDY4NSBBIDEyLjY2NTE4NCA5LjExMDA0NDUgMCAxIDEgIC0zNy4zMjg5NjQgMjcuNDQ2ODUgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDY2NTk1LDAsMCwxLjA0MjUyOCwzNS4zMzE1MywxOS40MzQwNikiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE4LjAwNzg0Myw0Ny41MjU1NDUgTCAtNC44MzQ5MTE5LDQ0LjY0Mjk2OSBDIC0xLjY2MDI5ODIsNTEuNDQzMDI3IC04LjQ5MDk0OTcsNTcuMDk4MTI0IC0xNC45ODgwMjQsNTcuODIzMTI4IEwgLTE4LjAwNzg0Myw0Ny41MjU1NDUgeiAiCiAgICAgICBpZD0icGF0aDYwMjQiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDIpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE3Ljk2MzAxOCw0Ny41NTYyMTMgTCAtMjMuMDAxOTE5LDU3LjM4MTU0MSBDIC0yMC4zODA4Myw1OC4xMTcwMTEgLTE3Ljc4MTA1Niw1OC4xNjMwNzEgLTE0Ljk2MzAxOCw1Ny44MTUzMTkgTCAtMTcuOTYzMDE4LDQ3LjU1NjIxMyB6ICIKICAgICAgIGlkPSJwYXRoNjAyNiIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA2NjU5NSwwLDAsMS4wNDI1MjgsMzUuMzMxNTMsMTkuNDM0MDYpIgogICAgICAgZD0iTSAtMzcuMzI4OTY0IDI3LjQ0Njg1IEEgMTIuNjY1MTg0IDkuMTEwMDQ0NSAwIDEgMSAgLTYyLjY1OTMzMiwyNy40NDY4NSBBIDEyLjY2NTE4NCA5LjExMDA0NDUgMCAxIDEgIC0zNy4zMjg5NjQgMjcuNDQ2ODUgeiIKICAgICAgIHNvZGlwb2RpOnJ5PSI5LjExMDA0NDUiCiAgICAgICBzb2RpcG9kaTpyeD0iMTIuNjY1MTg0IgogICAgICAgc29kaXBvZGk6Y3k9IjI3LjQ0Njg1IgogICAgICAgc29kaXBvZGk6Y3g9Ii00OS45OTQxNDgiCiAgICAgICBpZD0icGF0aDYwMjgiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjUxNDc2NzkzO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDQpO3N0cm9rZS13aWR0aDowLjk0ODMyMjY1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"gnumeric,numeric\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"gnumeric.desktop\"\nLABEL oc.launch=\"gnumeric.Gnumeric\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Gnumeric\"\nLABEL oc.displayname=\"Gnumerix (alpine)\"\nLABEL oc.path=\"/usr/bin/gnumeric\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\"\nLABEL oc.fileextensions=\"gnm\"\nLABEL oc.legacyfileextensions=\"gnm\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gnumeric\"\nENV APPBIN \"/usr/bin/gnumeric\"\nENV APP \"/usr/bin/gnumeric\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gnumeric/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gnumeric/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Gnumeric

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gnumeric.d\n
"},{"location":"applications/gnumeric/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Gnumeric.d -t Gnumeric .\n
"},{"location":"applications/gnumeric/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Gnumeric > Gnumeric.json\ndocker image save Gnumeric -o Gnumeric.tar\nctr -n k8s.io images import Gnumeric.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gnumeric.json\n\n
"},{"location":"applications/golly/","title":"Golly","text":""},{"location":"applications/golly/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/golly/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/golly/#ubuntu-packages","title":"Ubuntu packages","text":"
golly\n
"},{"location":"applications/golly/#path","title":"Path","text":"
/usr/games/golly\n
"},{"location":"applications/golly/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/golly/#wm_class","title":"WM_CLASS","text":"
golly.Golly\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/golly/#json-dump","title":"JSON dump","text":"

json source file golly.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"golly\",\n    \"icon\": \"golly.svg\",\n    \"keyword\": \"golly\",\n    \"launch\": \"golly.Golly\",\n    \"name\": \"Golly\",\n    \"path\": \"/usr/games/golly\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\n}\n
"},{"location":"applications/golly/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output golly.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/golly.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @golly.d.3.0.json\n\n
"},{"location":"applications/golly/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends golly && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"golly.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDUwOCA1MDgiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUwOCA1MDg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZEODQ2OTsiIGN4PSIyNTQiIGN5PSIyNTQiIHI9IjI1NCIvPg0KPGc+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzMyNEE1RTsiIGQ9Ik0yNTQuOCwyNTMuNmwtODUuNiwxMy4yYy0yLDAuNC00LjQtMC40LTUuNi0ybC01NC40LTY3LjZjLTEuMi0xLjYtMS42LTQtMC44LTZsMzEuMi04MC44DQoJCWMwLjgtMiwyLjQtMy42LDQuOC0zLjZMMjMwLDkzLjJjMi0wLjQsNC40LDAuNCw1LjYsMmw1NC40LDY4YzEuMiwxLjYsMS42LDQsMC44LDZMMjU5LjYsMjUwQzI1OC44LDI1MS42LDI1Ni44LDI1My4yLDI1NC44LDI1My42eg0KCQkgTTE3MC44LDI1NC40bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYyTDE0OS42LDExOGwtMjguOCw3NC40TDE3MC44LDI1NC40eiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiMzMjRBNUU7IiBkPSJNMjc3LjYsNDAxLjZMMTkyLDQxNC44Yy0yLDAuNC00LjQtMC40LTUuNi0ybC01NC02Ny42Yy0xLjItMS42LTEuNi00LTAuOC02bDMxLjItODAuOA0KCQljMC44LTIsMi40LTMuNiw0LjgtMy42bDg1LjYtMTMuMmMyLTAuNCw0LjQsMC40LDUuNiwybDU0LjQsNjcuNmMxLjIsMS42LDEuNiw0LDAuOCw2TDI4Mi40LDM5OEMyODEuNiw0MDAsMjgwLDQwMS42LDI3Ny42LDQwMS42eg0KCQkgTTE5My42LDQwMi44bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYybC03OC44LDEyLjRsLTI4LjgsNzQuNEwxOTMuNiw0MDIuOHoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojMzI0QTVFOyIgZD0iTTM5NC44LDMwNy42bC04NS42LDEzLjJjLTIsMC40LTQuNC0wLjQtNS42LTJsLTU0LjQtNjcuNmMtMS4yLTEuNi0xLjYtNC0wLjgtNmwzMS4yLTgwLjgNCgkJYzAuOC0yLDIuNC0zLjYsNC44LTMuNmw4NS42LTEzLjJjMi0wLjQsNC40LDAuNCw1LjYsMmw1NC40LDY3LjZjMS4yLDEuNiwxLjYsNCwwLjgsNkwzOTkuNiwzMDRDMzk4LjgsMzA2LDM5Ni44LDMwNy4yLDM5NC44LDMwNy42DQoJCXogTTMxMC44LDMwOC44bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYybC03OC44LDEyLjRsLTI4LjgsNzQuNEwzMTAuOCwzMDguOHoiLz4NCjwvZz4NCjxnPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIyODUuMiIgY3k9IjE2Ni44IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjM3MC44IiBjeT0iMTUzLjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iNDI1LjIiIGN5PSIyMjAuOCIgcj0iMjcuNiIvPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIzOTMuNiIgY3k9IjMwMC40IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjMwOCIgY3k9IjMxNS4yIiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjI1NCIgY3k9IjI0Ny42IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjE2OC40IiBjeT0iMjYwLjgiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTE0IiBjeT0iMTkzLjIiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTQ2IiBjeT0iMTE1LjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMjMzLjYiIGN5PSI5OC44IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjEzNi44IiBjeT0iMzQxLjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTkxLjIiIGN5PSI0MDkuMiIgcj0iMjcuNiIvPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIyNzYuNCIgY3k9IjM5Mi44IiByPSIyNy42Ii8+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"golly,golly\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"golly.Golly\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"Golly\"\nLABEL oc.displayname=\"Golly\"\nLABEL oc.path=\"/usr/games/golly\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Golly\"\nENV APPBIN \"/usr/games/golly\"\nENV APP \"/usr/games/golly\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/golly/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/golly/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Golly

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Golly.d\n
"},{"location":"applications/golly/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Golly.d -t Golly .\n
"},{"location":"applications/golly/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Golly > Golly.json\ndocker image save Golly -o Golly.tar\nctr -n k8s.io images import Golly.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Golly.json\n\n
"},{"location":"applications/gretl/","title":"Gretl","text":""},{"location":"applications/gretl/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/gretl/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/gretl/#ubuntu-packages","title":"Ubuntu packages","text":"
gretl\n
"},{"location":"applications/gretl/#path","title":"Path","text":"
/usr/bin/gretl\n
"},{"location":"applications/gretl/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/gretl/#wm_class","title":"WM_CLASS","text":"
gretl_x11.Gretl_x11\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/gretl/#json-dump","title":"JSON dump","text":"

json source file

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"gretl\",\n    \"icon\": \"gretl.svg\",\n    \"keyword\": \"gretl\",\n    \"launch\": \"gretl_x11.Gretl_x11\",\n    \"name\": \"Gretl\",\n    \"path\": \"/usr/bin/gretl\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/gretl/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output Gretl.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gretl.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gretl.json\n\n
"},{"location":"applications/gretl/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gretl && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gretl.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwODhwdCIgaGVpZ2h0PSI4MjBwdCIgdmlld0JveD0iMCAwIDEwODggODIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGw9IiNmZGZkZmQiIGQ9IiBNIDAuMDAgMC4wMCBMIDEwODguMDAgMC4wMCBMIDEwODguMDAgODIwLjAwIEwgMC4wMCA4MjAuMDAgTCAwLjAwIDAuMDAgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gNjExLjk5IDE5LjA3IEMgNjE5LjM4IDE5LjM5IDYyNS44NSAxNS40MCA2MzIuNDYgMTIuNzMgQyA2MzEuMzEgMTYuNjIgNjMwLjcwIDIwLjcwIDYzMS4yNiAyNC43NSBDIDYzNC4wNiAyNy41NCA2MzguNDEgMjcuMjcgNjQxLjYzIDI5LjMyIEMgNjQ0LjYwIDMxLjQxIDY0NS44MCAzNS40OCA2NDkuMzkgMzYuNzcgQyA2NTEuNDYgMzcuNjEgNjUzLjQwIDM1LjkyIDY1NS4yNiAzNS4yMiBDIDY1NS4wMCAzOC43MCA2NTMuODIgNDIuMTMgNjU0LjE5IDQ1LjYzIEMgNjU2LjQ2IDQ5LjgyIDY2MS40NiA1MS4yMCA2NjUuOTIgNTEuMTMgQyA2NzAuNzYgNTEuMzkgNjc1LjU5IDUxLjg0IDY4MC40NCA1MS45MCBDIDY4MC44MCA0OS43OCA2ODEuMTEgNDcuNjUgNjgxLjQ3IDQ1LjU0IEMgNjgzLjc0IDQ5LjM2IDY4NS41NCA1My40NCA2ODcuNjYgNTcuMzQgQyA2ODkuMzAgNTkuMzYgNjkxLjAwIDYxLjM0IDY5Mi4yMiA2My42NyBDIDY5MC4wNiA2My44MyA2ODcuOTIgNjMuOTkgNjg1Ljc5IDY0LjMxIEMgNjg3LjY4IDY5LjU1IDY4OS44NSA3NS4wNiA2ODguNjcgODAuNzMgQyA2ODcuODQgODQuMTUgNjg5LjExIDg3LjUxIDY5MC4wNSA5MC43NiBDIDY5NC4xMCA5MS44MSA2OTcuNzYgOTQuMTAgNzAxLjg2IDk0Ljg4IEMgNzA1LjM0IDkzLjcxIDcwOC4zNCA5MS4zNiA3MTEuOTEgOTAuNDIgQyA3MTQuNzEgODkuOTQgNzE3LjU2IDg5Ljk3IDcyMC40MCA4OS44NSBDIDcyMS40NCA4OC4xNCA3MjIuMzYgODYuMjYgNzI0LjA0IDg1LjA1IEMgNzI4LjkzIDgxLjMxIDczMi44MCA3Ni40NSA3MzcuNTIgNzIuNTAgQyA3MzkuODMgNzAuNzUgNzQxLjI0IDY4LjE4IDc0My4xMSA2Ni4wMiBDIDc0NC45NyA2NS4xMCA3NDcuMDggNjUuNzUgNzQ5LjA2IDY1Ljc4IEMgNzU5LjQ1IDY2LjE3IDc3MC4wMiA2Ni43MCA3NzkuOTggNzAuMDAgQyA3ODMuOTYgNzEuNDAgNzg4LjMyIDcwLjQzIDc5Mi4yOSA3MS43NCBDIDc5OC43OSA3NC43OCA4MDYuMTggNzQuMDUgODEzLjAyIDc1LjkwIEMgODE2LjUyIDc1Ljk2IDgxOC40MyA3OS4xOCA4MjAuNjkgODEuMzUgQyA4MjIuMTQgODMuMDUgODI0LjMwIDgzLjgwIDgyNi4xNyA4NC45MyBDIDgzNC45NSA5MS43MCA4NDAuMTggMTAxLjY5IDg0Ni4zMCAxMTAuNzEgQyA4NDguNzQgMTE1LjA3IDg1MS4yMiAxMTkuNDYgODUyLjc3IDEyNC4yNCBDIDg1NS45MCAxMzMuNzUgODYxLjMzIDE0Mi42MSA4NjIuMzEgMTUyLjczIEMgODYzLjgyIDE1Ny42MyA4NjYuMzQgMTYyLjM2IDg2OS44MSAxNjYuMTYgQyA4NzMuNjEgMTY5LjM0IDg3Ny45MiAxNzIuNDEgODc5LjgyIDE3Ny4xOSBDIDg4MS42MiAxODIuMjggODgwLjQ5IDE4Ny44MCA4ODEuOTMgMTkyLjk3IEMgODg0LjQ2IDE5My4wMCA4ODcuMDAgMTkzLjAxIDg4OS41NSAxOTMuMDMgQyA4OTAuMTYgMTk1LjY4IDg5MC44MyAxOTguNDAgODkyLjM4IDIwMC42OCBDIDg5NS42MyAyMDIuODIgODk5LjcxIDIwMi44MyA5MDMuNDIgMjAzLjYwIEMgOTA4LjU4IDIwNC4zNyA5MTMuNTggMjA1Ljg5IDkxOC41NCAyMDcuNDggQyA5MjEuMTYgMjA4LjIzIDkyMi4zNCAyMTAuOTkgOTI0LjU2IDIxMi4zOCBDIDkzMS4wNSAyMTYuNjkgOTM5LjA5IDIxNy45OSA5NDUuMzkgMjIyLjY1IEMgOTQ5LjYxIDIyNS43OCA5NTQuMTYgMjI4LjQ1IDk1OC4zMyAyMzEuNjcgQyA5NjEuMTQgMjMzLjc5IDk2NC43NCAyMzQuNDIgOTY3LjY4IDIzNi4zNCBDIDk3My4xNCAyMzkuODUgOTc5LjE4IDI0Mi4yNiA5ODUuMDAgMjQ1LjA4IEMgOTg3LjgwIDI0Ni43NiA5OTEuMDggMjQ1LjM1IDk5NC4xMiAyNDUuODMgQyA5OTYuNzAgMjQ1Ljc5IDk5OS4wNSAyNDYuOTAgMTAwMS4zMSAyNDguMDYgQyAxMDAwLjcyIDI1MC4yOSA5OTkuNDAgMjUyLjQxIDk5OS4zOSAyNTQuNzQgQyAxMDAwLjIyIDI1Ni42NCAxMDAxLjY3IDI1OC4xOCAxMDAyLjk2IDI1OS43OSBDIDEwMDEuODUgMjYxLjE3IDEwMDAuNjggMjYyLjUyIDk5OS45MCAyNjQuMTIgQyAxMDAwLjU3IDI2OC41MSAxMDA3LjU1IDI2OS4yMSAxMDA2Ljk3IDI3My45NiBDIDEwMDYuODYgMjc1LjcwIDEwMDYuNDYgMjc3LjQxIDEwMDYuMTYgMjc5LjEzIEMgMTAwOC42NyAyNzkuMjAgMTAxMS4xOCAyNzkuMTUgMTAxMy43MSAyNzkuMjEgQyAxMDEzLjkwIDI4My4zMyAxMDEzLjk5IDI4Ny40NiAxMDE0LjA5IDI5MS41OSBDIDEwMTcuMzggMjkzLjQ5IDEwMTkuNjIgMjk2LjU2IDEwMjEuNDIgMjk5Ljg0IEMgMTAxOS4xNCAyOTkuNTAgMTAxNi44NyAyOTkuMTQgMTAxNC42MCAyOTguOTAgQyAxMDE1Ljk1IDMwNS4zMiAxMDIwLjUzIDMxMC40NCAxMDIyLjM3IDMxNi42OSBDIDEwMjUuNTIgMzI0LjQ2IDEwMjkuMzUgMzMyLjAyIDEwMzQuODEgMzM4LjQ1IEMgMTAzMS4zNCAzMzguMzcgMTAyNy44OCAzMzguNzUgMTAyNC43MCAzNDAuMjQgQyAxMDI3LjY3IDM0OC4zNyAxMDMxLjE2IDM1Ni4zMyAxMDMzLjI3IDM2NC43NCBDIDEwMzcuMzAgMzc2Ljg3IDEwMzcuNzYgMzg5Ljc2IDEwNDAuOTIgNDAyLjA5IEMgMTA0Mi40OSA0MDkuMzIgMTA0NC45MSA0MTYuNTMgMTA0NC43MyA0MjQuMDEgQyAxMDQ1LjEwIDQyNy4wOSAxMDQ2LjgyIDQyOS44NyAxMDQ2Ljk1IDQzMy4wMSBDIDEwNDcuMjcgNDM5LjAzIDEwNDYuMzggNDQ1LjE3IDEwNDcuODkgNDUxLjEwIEMgMTA0OS4yMCA0NTYuNDYgMTA0OS41MCA0NjIuMDEgMTA1MC43MyA0NjcuMzggQyAxMDUzLjcwIDQ3NC41MCAxMDUyLjk4IDQ4Mi4zNCAxMDU0LjAwIDQ4OS44MyBDIDEwNTQuMTAgNDk2LjQ2IDEwNTYuNTUgNTAyLjcwIDEwNTcuODggNTA5LjEzIEMgMTA1OC42OSA1MTIuOTUgMTA1OC41NSA1MTYuODYgMTA1OC43OCA1MjAuNzQgQyAxMDU4LjkxIDUyNC42NCAxMDYwLjg1IDUyOC4zNCAxMDYwLjI1IDUzMi4zMCBDIDEwNTkuMzYgNTM3LjkwIDEwNjMuMjggNTQzLjc5IDEwNTkuOTIgNTQ4Ljk4IEMgMTA2MC43MyA1NDkuODYgMTA2MS41OSA1NTAuNzIgMTA2Mi4zNyA1NTEuNjcgQyAxMDYyLjMwIDU1My40NiAxMDYxLjc3IDU1NS4yMCAxMDYxLjY5IDU1Ny4wMCBDIDEwNjIuMDcgNTU5Ljk0IDEwNjMuNTEgNTYzLjA3IDEwNjIuMDIgNTY1Ljk1IEMgMTA1OS42OSA1NzEuMzQgMTA2MS43MSA1NzcuMjAgMTA2Mi4zNSA1ODIuNzMgQyAxMDYzLjQyIDU4Ny40NiAxMDYxLjY2IDU5Mi4xOSAxMDYxLjk5IDU5Ni45NyBDIDEwNjIuMjAgNjAyLjMzIDEwNjEuODEgNjA3LjY4IDEwNjEuMTMgNjEzLjAwIEMgMTA2MS4xNSA2MTkuNjQgMTA1OS4yNyA2MjYuMjEgMTA2MC4xOSA2MzIuODYgQyAxMDYwLjcyIDYzNi4zMSAxMDYxLjQyIDYzOS43NiAxMDYxLjMyIDY0My4yOCBDIDEwNjEuMDcgNjQ2LjE4IDEwNjQuMDggNjQ4LjEwIDEwNjMuOTYgNjUxLjAwIEMgMTA2NC4yMyA2NTYuOTkgMTA2My43NyA2NjMuMDEgMTA2NC4wMyA2NjkuMDEgQyAxMDY0LjEzIDY3Mi4yMSAxMDY2LjE3IDY3NC44NyAxMDY3LjEyIDY3Ny44NSBDIDEwNjguNDIgNjgxLjA5IDEwNjcuNzkgNjg0LjYzIDEwNjcuOTggNjg4LjAzIEMgMTA2OC4wMyA2OTEuNDEgMTA2OS4zNSA2OTQuNTkgMTA3MC4yNCA2OTcuODIgQyAxMDY2LjQ3IDcwMC4wMiAxMDYyLjc1IDcwMi43MyAxMDU4LjMwIDcwMy4yNiBDIDEwNTUuMTIgNzAzLjkzIDEwNTEuNTkgNzAzLjgwIDEwNDguOTYgNzA2LjAwIEMgMTA0NS40NyA3MDguNjQgMTA0MS41NiA3MTAuNjIgMTAzNy43NSA3MTIuNzQgQyAxMDM1LjE4IDcxNS4zMSAxMDMzLjAzIDcxOC4yOCAxMDMwLjg5IDcyMS4yMiBDIDEwMjguOTIgNzIzLjY5IDEwMzEuMTMgNzI2Ljc4IDEwMzEuNDkgNzI5LjQ2IEMgMTAzMi40NyA3MzUuNzIgMTAzMi45MyA3NDIuNDUgMTAzMC41MCA3NDguNDcgQyAxMDI5LjY2IDc1MS40OSAxMDMwLjAxIDc1NC42OCAxMDI5Ljk0IDc1Ny43OSBDIDEwMjUuNDYgNzYxLjQxIDEwMjEuMTggNzY1LjQ3IDEwMTUuODUgNzY3Ljg1IEMgMTAxMi45NCA3NjkuMTYgMTAwOS42MSA3NjguNjYgMTAwNi42NSA3NjkuNjcgQyAxMDAwLjE3IDc3My41MSA5OTIuMjUgNzcyLjkyIDk4NS4wMCA3NzMuMDEgQyA5NzguMDYgNzczLjIyIDk3MC45NiA3NzIuMjAgOTY0LjIwIDc3NC4xOSBDIDk1Ni4yMSA3NzYuNDcgOTQ4LjA4IDc3My42OCA5NDAuMDEgNzczLjk3IEMgOTMyLjc1IDc3My44OCA5MjUuMzYgNzc0LjY2IDkxOC4yNiA3NzIuNzUgQyA5MTEuMTEgNzcwLjgxIDkwMy4wNyA3NzMuODYgODk2LjUyIDc2OS41NCBDIDg5MC4yNiA3NjcuMjcgODg1Ljg4IDc2Mi4xMyA4ODAuMzggNzU4LjYyIEMgODc2LjU0IDc1Ni4yMSA4NzMuNDggNzUyLjc1IDg2OS41MiA3NTAuNTMgQyA4NjIuODYgNzQ3LjYyIDg2MC41MCA3NDAuMTUgODU2LjAyIDczNC45OCBDIDg1NC43OSA3MzIuNjkgODUxLjU4IDczMS4wNiA4NTIuMDQgNzI4LjIxIEMgODUzLjQyIDcyNS4xMiA4NTUuNjEgNzIxLjg0IDg1OS4xNCA3MjEuMDYgQyA4NjEuMjggNzIxLjE2IDg2My40MiA3MjEuNzEgODY1LjQyIDcyMi41NCBDIDg2OC41NyA3MjQuMzcgODcwLjg3IDcyOC40MyA4NzQuOTggNzI4LjAxIEMgODgxLjE5IDcyNy4zMiA4ODcuMzkgNzI2LjQ2IDg5My41OSA3MjUuNjYgQyA4OTYuNTkgNzIxLjQ0IDg5OS4zNCA3MTYuNDQgODk5LjUxIDcxMS4xMCBDIDg5OS4xNCA3MDguNzQgODk2LjY1IDcwNy43MyA4OTUuMDAgNzA2LjM5IEMgODk1LjA2IDcwNC4wMSA4OTQuNjEgNzAxLjYzIDg5Mi40OSA3MDAuMjMgQyA4ODYuMDUgNjk4LjU3IDg4MC4zOSA3MDMuNTYgODczLjk4IDcwMy4xMCBDIDg3MS4wMyA3MDMuNjEgODY5LjE3IDcwMS4wMyA4NjYuNzYgNjk5Ljk2IEMgODY0LjA0IDY5OS43MSA4NjEuNjcgNzAxLjMxIDg1OS4yMyA3MDIuMjAgQyA4NTIuNDMgNzA0LjY5IDg0NC43NyA3MDYuNDAgODM3Ljc2IDcwMy43MiBDIDgzMi40OSA3MDQuNzkgODI1LjYzIDcwNy4wNCA4MjEuMzIgNzAyLjY2IEMgODE4LjE3IDY5OS42MiA4MTMuMzQgNzAxLjkxIDgwOS41OCA3MDAuMzggQyA4MDYuMDIgNjk5LjM5IDgwMy40NyA2OTUuMTQgNzk5LjQxIDY5Ni4zOSBDIDc5NS4yOSA2OTcuMzQgNzkxLjE1IDY5Ni4wOSA3ODcuMjkgNjk0Ljc1IEMgNzg0LjA3IDY5My41MSA3ODAuMjYgNjk0LjY5IDc3Ny4zMiA2OTIuNjcgQyA3NzQuMTUgNjkwLjI1IDc3MC4wMiA2OTEuMDkgNzY2LjMzIDY5MC45MyBDIDc2NS4yMCA2ODkuMzQgNzY0LjA3IDY4Ny43NyA3NjIuOTAgNjg2LjIzIEMgNzU5LjAyIDY4Ni4yMSA3NTUuMTQgNjg1Ljk2IDc1MS4yNyA2ODUuOTUgQyA3NTAuNDEgNjg0LjYzIDc0OS41NiA2ODMuMzIgNzQ4LjcxIDY4Mi4wMiBDIDc0NC4yMiA2ODEuNzEgNzM4LjcxIDY4My4yNyA3MzUuMTcgNjc5LjcxIEMgNzM0LjU0IDY3NC4zOSA3MzUuMzggNjY5LjA0IDczNS4yMiA2NjMuNzEgQyA3MzUuMDMgNjU4LjUzIDczNy42MCA2NTMuODQgNzM5LjA1IDY0OS4wMSBDIDc0MC4zMSA2NDQuOTQgNzQzLjQ5IDY0MS44MCA3NDQuODEgNjM3Ljc5IEMgNzQ1LjI4IDYzMy4xOSA3NDQuOTMgNjI4LjU1IDc0NS4wNCA2MjMuOTQgQyA3NDQuOTAgNjIxLjk5IDc0NS4zMiA2MTkuNzIgNzQzLjkwIDYxOC4xNSBDIDc0MS42OCA2MTUuMDggNzM5Ljc1IDYxMS41NiA3MzYuMjEgNjA5LjgxIEMgNzMxLjIyIDYwNy4yMCA3MjcuMDkgNjAzLjM0IDcyMi42NSA1OTkuOTQgQyA3MjYuNTEgNTk1LjY5IDczMC44MCA1OTEuODcgNzM1LjEyIDU4OC4xMSBDIDczOS4wNCA1ODEuNzUgNzQxLjM5IDU3NC41NiA3NDMuMjkgNTY3LjM3IEMgNzQ0LjE0IDU2NC42MiA3NDIuMzAgNTYxLjUzIDc0My44OSA1NTguOTcgQyA3NDYuMzEgNTU0LjYwIDc0OC4yOSA1NDkuODkgNzQ4Ljg4IDU0NC44OSBDIDc0OS4zMiA1NDIuMDIgNzQ4Ljk3IDUzOC45OCA3NTAuMjAgNTM2LjI3IEMgNzUyLjczIDUyOS45MyA3NTQuNDYgNTIzLjI5IDc1NS41OSA1MTYuNTYgQyA3NTYuMTIgNTEzLjQ1IDc1My44OSA1MTAuMzkgNzU1LjI1IDUwNy4zMyBDIDc1Ny42NCA1MDEuODMgNzU5Ljk0IDQ5Ni4xMSA3NjAuMDYgNDkwLjAxIEMgNzYwLjExIDQ4NS40OCA3NjIuMDkgNDgxLjA2IDc2MS4yMSA0NzYuNTIgQyA3NjAuNzMgNDczLjkwIDc2MS41MCA0NzEuMjggNzYxLjc2IDQ2OC42OSBDIDc2MS44MSA0NjUuNDUgNzY2LjAyIDQ2NC4yMCA3NjUuOTUgNDYwLjk0IEMgNzY2LjM3IDQ1Mi4yNyA3NjQuOTYgNDQzLjM5IDc2Ny43MiA0MzQuOTcgQyA3NjguMDEgNDMxLjIzIDc3MS4wMSA0MjguNzUgNzcyLjU5IDQyNS42MCBDIDc3NC4xOSA0MjEuMjEgNzczLjc0IDQxNi40MyA3NzQuOTggNDExLjk3IEMgNzc3Ljk2IDQwMS4wMiA3ODMuMDAgMzkwLjgxIDc4Ny42MiAzODAuNTAgQyA3ODkuMDggMzc3LjMyIDc4Ni4yOCAzNzQuNTYgNzg1LjIzIDM3MS43NyBDIDc4NS4zNCAzNjkuNDQgNzg2LjM5IDM2Ny4zMCA3ODcuMDcgMzY1LjExIEMgNzg5LjMzIDM1OS4wNyA3OTAuNzEgMzUyLjY0IDc5NC4wNSAzNDcuMDUgQyA3OTcuMjUgMzQxLjYyIDgwMC44MCAzMzYuMzQgODAzLjA2IDMzMC40MiBDIDgwNC44NSAzMjUuMzcgODA4LjExIDMyMS4wMiA4MTAuMDAgMzE2LjAyIEMgODExLjQzIDMxMi45MSA4MTEuNzMgMzA5LjQwIDgxMy4yOSAzMDYuMzYgQyA4MTUuNTAgMzA0LjMyIDgxOC4zMCAzMDMuMDUgODIwLjY0IDMwMS4xNyBDIDgxOC40MCAyOTguNjQgODE1Ljg2IDI5Ni4zNiA4MTIuNzUgMjk0Ljk3IEMgODEyLjkxIDI5OC4wOSA4MTIuODUgMzAyLjYyIDgwOS40MyAzMDMuOTcgQyA4MDUuNDIgMzA0LjQ1IDgwMS4zNCAzMDMuNDMgNzk3LjM1IDMwNC4xOSBDIDc5NC45MCAzMDUuNjggNzk0Ljg3IDMwOC43OCA3OTQuMjQgMzExLjI1IEMgNzkzLjU2IDMxNS4xOSA3OTIuMjQgMzE4Ljk5IDc5MC42MCAzMjIuNjMgQyA3ODkuMjQgMzI1LjcyIDc4Ni41MiAzMjcuODYgNzg0LjQ4IDMzMC40NyBDIDc3OS4zMSAzMzYuOTMgNzcyLjMzIDM0MS44NyA3NjguMDIgMzQ5LjAzIEMgNzY1Ljk3IDM1Mi40NiA3NjYuMTggMzU2LjczIDc2NC4wNyAzNjAuMTQgQyA3NjEuOTQgMzYzLjY1IDc1OC41MyAzNjcuMzEgNzU0LjA1IDM2Ny4wNSBDIDc0Ny4yNSAzNjcuMTQgNzQyLjgxIDM2MC44MyA3MzYuNDMgMzU5LjQ5IEMgNzMzLjYzIDM1OC40NyA3MzAuNzUgMzU5LjU5IDcyOC4wMSAzNjAuMTkgQyA3MjcuOTIgMzY0LjE0IDcyNy44NSAzNjguMTcgNzI5LjAxIDM3Mi4wMSBDIDczMC4zMSAzNzYuNDEgNzMwLjU1IDM4MS42OCA3MjcuNTYgMzg1LjQ5IEMgNzIzLjM0IDM4Ny40NSA3MTkuNjUgMzkwLjI2IDcxNS42NCAzOTIuNTggQyA3MDkuMzAgMzk0Ljk4IDcwNC4xMCAzOTkuOTEgNzAwLjcwIDQwNS43MCBDIDY5Ny43NyA0MTEuOTMgNzAwLjQ3IDQxOC41MCA3MDEuMjIgNDI0Ljg2IEMgNjk3LjY1IDQyMi44OCA2OTMuNzggNDIxLjU4IDY5MC4xMiA0MTkuNzkgQyA2ODguNDIgNDE4Ljg5IDY4Ni4zNCA0MTguNTkgNjg0LjU4IDQxOS40OCBDIDY4My40MyA0MjIuODYgNjg0LjAyIDQyNi41MCA2ODMuOTYgNDMwLjAwIEMgNjg0LjE4IDQzNy4yOCA2ODMuNjggNDQ0LjU4IDY4NC4yMiA0NTEuODUgQyA2ODUuMzAgNDU4LjAyIDY4NC45MCA0NjQuMjkgNjg1LjM0IDQ3MC41MiBDIDY4NS43MiA0NzUuNDAgNjg0LjM4IDQ4MC4zMyA2ODUuNjUgNDg1LjE2IEMgNjg2LjYzIDQ4OC43OCA2ODQuODEgNDkyLjM0IDY4NC45OSA0OTUuOTcgQyA2ODUuMDQgNDk4LjA4IDY4Ni4wMyA0OTkuOTkgNjg2LjQ0IDUwMi4wNCBDIDY4Ny4wMiA1MDcuMTMgNjg1LjQ2IDUxMi4yNCA2ODYuNjMgNTE3LjMwIEMgNjg3Ljg4IDUyNC4xMCA2ODguMDAgNTMwLjk4IDY4OC4yNSA1MzcuODYgQyA2ODkuNDUgNTQzLjI0IDY4Ny41MSA1NDguNjEgNjg3Ljk4IDU1NC4wMyBDIDY4Ny45OSA1NTcuMTIgNjg5LjYzIDU1OS45OCA2ODkuNDcgNTYzLjA3IEMgNjg5LjA3IDU2OC40OCA2OTAuMzAgNTczLjk0IDY4OC45NSA1NzkuMjggQyA2ODkuNjIgNTc4LjM4IDY5MC4zMSA1NzcuNDkgNjkxLjAxIDU3Ni42MSBDIDY4OS45NSA1ODIuMjkgNjkxLjYzIDU4OC4wMyA2OTAuNzAgNTkzLjczIEMgNjg5LjU0IDYwMC4wOSA2OTAuMTIgNjA2LjU3IDY5MC4xMiA2MTIuOTkgQyA2OTAuNDcgNjIxLjc1IDY4OS4xMSA2MzAuNjEgNjkwLjc3IDYzOS4zMCBDIDY5MS4zOSA2NDIuNjIgNjg5Ljc2IDY0NS45MyA2OTAuNjcgNjQ5LjI0IEMgNjkyLjAxIDY1NS42MyA2OTMuMTMgNjYyLjA3IDY5My41NiA2NjguNjAgQyA2OTQuMTAgNjczLjI4IDY5My44MCA2NzguNDMgNjk2LjY3IDY4Mi40NSBDIDY5OC4xNCA2ODQuNDMgNjk3LjUyIDY4Ny4wMiA2OTcuOTcgNjg5LjI5IEMgNjk4LjEzIDY5Mi4xNyA3MDAuOTUgNjk0LjA5IDcwMC45NiA2OTcuMDAgQyA3MDEuMTUgNzAwLjMxIDcwMS4wMCA3MDMuNjQgNzAwLjk3IDcwNi45NiBDIDY5Ni42NiA3MDcuMzMgNjkyLjI2IDcwNy40NSA2ODguMTUgNzA1Ljg3IEMgNjg0LjUwIDcwNS4xMiA2ODMuMjAgNzAxLjIzIDY4MS45MSA2OTguMjEgQyA2ODAuMDEgNjkxLjA1IDY4MC4yMCA2ODMuNTggNjc5LjY2IDY3Ni4yNiBDIDY3Ny41MSA2NjkuODAgNjc4LjI0IDY2Mi45MyA2NzYuOTUgNjU2LjMxIEMgNjc2LjY3IDY0OC41NSA2NzcuMzQgNjQwLjc3IDY3Ni45MSA2MzMuMDEgQyA2NzYuNTUgNjI5LjUxIDY3NC45NyA2MjYuMjUgNjc0Ljc2IDYyMi43MiBDIDY3NC4zNCA2MjAuMTcgNjc2LjEyIDYxNy44NCA2NzUuNzAgNjE1LjI5IEMgNjc0LjY3IDYwOC41NSA2NzIuNjIgNjAxLjg5IDY3My4wMCA1OTUuMDAgQyA2NzMuMzMgNTg5LjIwIDY3MS43MyA1ODMuNTcgNjcxLjI2IDU3Ny44NCBDIDY3MS40NyA1NzMuNjIgNjcyLjMzIDU2OS4zOSA2NzEuNDcgNTY1LjE4IEMgNjcxLjg1IDU2NS4zMCA2NzIuNjAgNTY1LjUzIDY3Mi45NyA1NjUuNjUgQyA2NzMuMDAgNTY1LjA4IDY3My4wNSA1NjMuOTUgNjczLjA3IDU2My4zOCBDIDY3Mi41NyA1NjMuNDggNjcxLjU3IDU2My42NyA2NzEuMDcgNTYzLjc3IEMgNjcyLjU2IDU1Ni45MiA2NzEuOTIgNTQ5Ljg5IDY3Mi4yMSA1NDIuOTYgQyA2NzEuNDQgNTM1LjY0IDY3Mi40MCA1MjguMzAgNjcyLjMxIDUyMC45OCBDIDY3Mi40OSA1MTguNjYgNjcxLjMzIDUxNi42NSA2NzAuMTkgNTE0Ljc0IEMgNjcyLjcyIDUxMC4xMyA2NzAuNTYgNTA0Ljk3IDY2OS4xMSA1MDAuMzkgQyA2NjguMDUgNDkzLjc5IDY2Ny45NCA0ODcuMDkgNjY3LjgyIDQ4MC40MiBDIDY2Ny43OCA0NzYuNDQgNjY2LjMzIDQ3Mi43MCA2NjUuNTkgNDY4Ljg0IEMgNjY1LjQ0IDQ2Mi4xOSA2NjQuMjkgNDU1LjYwIDY2My4wMSA0NDkuMDkgQyA2NjEuMDUgNDQ4LjcxIDY1OS4xMyA0NDguMTUgNjU3LjE0IDQ0OC4wMyBDIDY1My44NCA0NDguOTMgNjUxLjk1IDQ1Mi4wMiA2NDkuODAgNDU0LjQyIEMgNjQ4Ljc1IDQ0Ni42NCA2NDguNjQgNDM4LjQxIDY0NC41OCA0MzEuNDIgQyA2NDIuMjMgNDI4LjA5IDYzOC4yOSA0MjUuODkgNjM2Ljk5IDQyMS44NyBDIDYzNy4yMiA0MTcuMzcgNjM5Ljg2IDQxMy41MCA2NDEuMzEgNDA5LjM0IEMgNjQzLjUxIDQwMi43OSA2NDMuMTEgMzk1Ljc4IDY0Mi45MCAzODguOTggQyA2NDIuOTAgMzg2LjI0IDY0MS42OCAzODMuMTEgNjQzLjY3IDM4MC43NiBDIDY0OS4xOSAzNzIuNDMgNjU5LjkyIDM3MC4zNyA2NjkuMTUgMzY5LjI1IEMgNjc3Ljk4IDM2OS40MSA2ODYuNjIgMzY2LjY0IDY5NC4xOSAzNjIuMjEgQyA2OTcuNzcgMzYwLjQzIDY5OC41NiAzNTQuMDggNjk0LjUyIDM1Mi40NiBDIDY4OS40NiAzNTAuMTIgNjgzLjc2IDM1MC4zNCA2NzguMzcgMzQ5LjYxIEMgNjczLjI1IDM0OC44NCA2NzEuMjIgMzQzLjEzIDY2Ni42NiAzNDEuMjkgQyA2NjQuNTIgMzQxLjA4IDY2Mi40MiAzNDEuNzcgNjYwLjMyIDM0Mi4wNCBDIDY1OS4xMCAzMzkuOTEgNjU4LjQzIDMzNi45NyA2NTUuNzcgMzM2LjIxIEMgNjUyLjExIDMzNC44NSA2NDguMjIgMzM0LjI1IDY0NC40MSAzMzMuNDcgQyA2MzYuNzkgMzMxLjYyIDYyOS44OSAzMzcuMzUgNjIyLjI1IDMzNi4zMiBDIDYxOC4wOSAzMzQuNTMgNjE1LjcxIDMzMC4wOCA2MTEuMzAgMzI4Ljc1IEMgNjA3Ljc3IDMyNy43NyA2MDQuMTEgMzI3LjQwIDYwMC41OCAzMjYuNDUgQyA1OTUuNDggMzI1LjQ5IDU5MC43OSAzMjMuMDMgNTg1LjYxIDMyMi40MiBDIDU3NS44OSAzMjEuMTYgNTY2LjA5IDMyMC41NiA1NTYuMzQgMzE5LjcyIEMgNTUzLjg4IDMxNy45MyA1NTMuMDIgMzE0Ljg0IDU1MS43NyAzMTIuMjIgQyA1NDkuNzMgMzA3LjIzIDU0Ni44NiAzMDIuNjQgNTQzLjY3IDI5OC4zMyBDIDUzOS44MSAyOTMuODUgNTM1LjAyIDI5MC4yMiA1MzEuNTkgMjg1LjM2IEMgNTI5LjY3IDI4Mi42MiA1MjYuNjggMjgwLjcyIDUyNS4yNiAyNzcuNjQgQyA1MjUuMzkgMjY1LjE0IDUyOS41NSAyNTMuMjQgNTMyLjE5IDI0MS4xNCBDIDUzMi44OCAyMzcuOTkgNTM1LjMzIDIzNS4zNyA1MzguNDQgMjM0LjQ5IEMgNTQ0LjM1IDIzMi44MSA1NDkuNTUgMjI5LjQyIDU1NS4yOCAyMjcuMjggQyA1NjAuMjEgMjI1LjQyIDU2NC4xMiAyMjEuNzcgNTY4Ljg1IDIxOS41NSBDIDU2OC45MyAyMjEuMDAgNTY5LjAxIDIyMi40NiA1NjkuMDkgMjIzLjkyIEMgNTY1LjA2IDIyNy4zNCA1NjEuNzMgMjMxLjU2IDU1Ny4xOSAyMzQuMzkgQyA1NTMuMTAgMjM3LjgwIDU0Ny4yMyAyMzguODAgNTQ0LjE5IDI0My40NiBDIDU0Mi43NCAyNDcuNTUgNTQ2Ljc1IDI1MC4zNiA1NDguODkgMjUzLjI0IEMgNTQ2Ljg4IDI1Ni4yNyA1NDQuMTggMjU5LjIwIDU0NC4wMCAyNjMuMDIgQyA1NDMuODAgMjY1LjI3IDU0My40MSAyNjcuNTIgNTQzLjQ5IDI2OS43OSBDIDU0NC40NCAyNzMuNzIgNTQ5LjAxIDI3NS43NyA1NTIuNzcgMjc0Ljk0IEMgNTU0LjMxIDI3NC44MSA1NTUuMjYgMjczLjM5IDU1NS40NiAyNzEuOTggQyA1NTYuNDUgMjY2LjkzIDU1OC45MyAyNjIuMzcgNTYwLjU2IDI1Ny41MiBDIDU2MS41NCAyNTQuOTYgNTYzLjQ2IDI1MS4yMCA1NjYuNzggMjUyLjA2IEMgNTcxLjMxIDI1My44NiA1NzUuMzQgMjU2Ljc5IDU3OC43NyAyNjAuMjMgQyA1ODAuNjggMjYyLjYwIDU4NC42MSAyNjIuNzQgNTg2LjkyIDI2MC45NCBDIDU4OC45MSAyNTguODYgNTkwLjQ4IDI1Ni40MSA1OTIuNDkgMjU0LjMzIEMgNTkzLjQ1IDI1Ny4zNyA1OTQuNTMgMjYwLjY1IDU5My4zMCAyNjMuNzkgQyA1OTEuNjYgMjY4LjI0IDU5MS4wMyAyNzMuNzkgNTk0LjI5IDI3Ny42OCBDIDU5OC42NCAyODIuMzUgNjAyLjY2IDI4Ny4zMCA2MDcuMTUgMjkxLjg1IEMgNjExLjU3IDI5Ni40MiA2MTQuODcgMzAyLjI2IDYyMC41MSAzMDUuNDkgQyA2MjYuNjEgMzA4LjQ3IDYzMy4yMyAzMTAuNTMgNjQwLjAzIDMxMC45NiBDIDY0NS41OSAzMTEuMTcgNjUxLjE1IDMxMi43NyA2NTYuNzIgMzExLjc0IEMgNjU5LjUwIDMxMC4zNSA2NTYuOTggMzA3LjU2IDY1NS43NSAzMDYuMDMgQyA2NTUuMDAgMzA3LjQ1IDY1NC4yNCAzMDguODcgNjUzLjQ1IDMxMC4yNyBDIDY1My4xMCAzMDguMzEgNjUyLjc5IDMwNi4zNSA2NTIuNDMgMzA0LjM5IEMgNjU1Ljk2IDMwMy42MiA2NTkuMDkgMzAxLjc0IDY2Mi40NCAzMDAuNDcgQyA2NjYuNDIgMjk5LjY2IDY3MC42NSAzMDAuMTkgNjc0LjQ3IDI5OC41OCBDIDY3Ni45NCAyOTYuMDEgNjc5LjUxIDI5MS44OSA2ODMuNzIgMjkzLjE2IEMgNjk2LjA2IDI5Ni4yOCA3MDcuOTYgMzAxLjU2IDcyMC44MyAzMDIuMTkgQyA3MjIuMjMgMjk5LjIyIDcyMi45MyAyOTUuNjcgNzI1LjM1IDI5My4zNCBDIDcyOS44MCAyOTMuMzAgNzM0LjU2IDI5Mi4xMyA3MzYuODIgMjg3Ljg4IEMgNzM5LjAwIDI4Mi41NCA3NDIuMDYgMjc3LjY0IDc0NC43NSAyNzIuNTYgQyA3NDYuMTQgMjY3Ljg0IDc0MC45OSAyNjQuNTUgNzQwLjQzIDI2MC4wNiBDIDczNy40NCAyNjAuMDIgNzM0LjQ2IDI1OS45OSA3MzEuNDggMjU5Ljk2IEMgNzMwLjc2IDI1Ny43NiA3MzAuNzEgMjU0LjcyIDcyOC4zMiAyNTMuNjAgQyA3MjUuNDcgMjUyLjE2IDcyMi4xMSAyNTMuMjQgNzE5LjM0IDI1NC4zMiBDIDcxNi4zOSAyNTUuMTkgNzE2LjEyIDI1OC42NiA3MTQuODkgMjYxLjAxIEMgNzEyLjgwIDI1OS44OCA3MTAuNjggMjU4LjgwIDcwOC42MCAyNTcuNzAgQyA3MDguNTMgMjUyLjg2IDcxNC45MiAyNTEuMDMgNzE0LjA4IDI0Ni4xMSBDIDcxNC4zNiAyNDQuMDkgNzEyLjQ4IDI0Mi45MiA3MTEuMDcgMjQxLjkyIEMgNzA4LjM2IDIzOS45MiA3MDQuODggMjM5LjkxIDcwMS43NCAyMzkuMTQgQyA2OTguMTUgMjQyLjc1IDY5OS4yNCAyNDguMTIgNjk3LjU4IDI1Mi41NiBDIDY5Ni41MiAyNTUuMjcgNjk1LjQ2IDI1OC4xOSA2OTMuMjIgMjYwLjE3IEMgNjg5LjczIDI2Mi42NyA2ODkuMjIgMjY3LjY1IDY4NS4wMiAyNjkuNDMgQyA2ODYuMDkgMjY2LjUzIDY4Ny41NiAyNjMuNzggNjg4LjU0IDI2MC44NSBDIDY4OS45NSAyNTMuMzUgNjg3LjUzIDI0NS45NiA2ODYuNDIgMjM4LjU5IEMgNjg1Ljk0IDIzNC40NiA2ODIuNjMgMjMxLjY3IDY4MC4wOCAyMjguNzAgQyA2NzUuODcgMjMwLjQ5IDY3MS4wNCAyMzAuNTIgNjY3LjE2IDIzMy4xMCBDIDY2MS43MSAyMzYuMzEgNjU3Ljk4IDI0MS42MSA2NTIuOTggMjQ1LjQwIEMgNjU2Ljc0IDIzOS41NCA2NjEuNDcgMjMzLjk4IDY2My4wMiAyMjcuMDEgQyA2NjQuMzQgMjIyLjY1IDY2NS4zNCAyMTcuOTMgNjY4LjI4IDIxNC4zMSBDIDY3MS45NiAyMTAuNTggNjc1Ljk4IDIwNy4xNyA2ODAuMDUgMjAzLjg2IEMgNjgwLjAxIDIwMS45OCA2ODAuMDAgMjAwLjEwIDY4MC4wMCAxOTguMjIgQyA2NzYuMTggMTk1LjYwIDY3Mi42NCAxOTIuNTIgNjY4LjU3IDE5MC4zMCBDIDY2NC41NCAxODkuMzYgNjYwLjIzIDE5MC45MCA2NTYuNjYgMTkyLjczIEMgNjU0Ljc1IDE5Ni43MyA2NTUuNjcgMjAxLjUyIDY1My40MiAyMDUuMzggQyA2NTEuNzggMjA4LjI0IDY1MC42MiAyMTIuMzAgNjQ2LjgyIDIxMi43OCBDIDY0My41MSAyMTMuOTMgNjM5LjExIDIxMy42MyA2MzcuMTIgMjE3LjA1IEMgNjMzLjk4IDIyMS43MCA2MjkuMTIgMjI0LjYyIDYyNC4zMiAyMjcuMjkgQyA2MjEuMzAgMjI4Ljg0IDYxOS4yNCAyMzEuNjUgNjE2LjQ5IDIzMy41NyBDIDYxMy41MCAyMzUuMDEgNjA5LjI1IDIzNC45MyA2MDguMDIgMjM4LjY2IEMgNjA0LjMyIDIzOC44NiA2MDAuNzggMjM5LjkwIDU5Ny4zOCAyNDEuMzEgQyA1OTYuMjMgMjM4Ljg4IDU5NC43MSAyMzYuNTkgNTkzLjk4IDIzMy45OSBDIDU5NS4wNCAyMjkuOTIgNTk4LjQxIDIyNS45MyA1OTYuNjQgMjIxLjU1IEMgNTk0LjgwIDIxOS4yMiA1OTIuNjcgMjE3LjA5IDU5MS40MSAyMTQuMzYgQyA1OTUuOTAgMjEyLjg0IDYwMC41OCAyMTEuODIgNjA0LjkzIDIwOS45MSBDIDYwNy43NyAyMDguMTIgNjEwLjM1IDIwNS44OCA2MTIuNjkgMjAzLjQ4IEMgNjEzLjIzIDIwMS44MyA2MTMuMTQgMjAwLjA0IDYxMi45MSAxOTguMzQgQyA2MTAuOTQgMTk1Ljg0IDYwNy40OSAxOTUuNDYgNjA0LjY4IDE5Ni42MyBDIDU5OS45NyAxOTcuODcgNTk0LjE0IDIwMC44OCA1ODkuODAgMTk3LjIxIEMgNTg2LjIyIDE5My44NyA1ODEuMTQgMTkyLjY4IDU3Ni4zNyAxOTMuMDIgQyA1NzQuNTEgMTk3LjAyIDU3Mi43OSAyMDEuNjkgNTY4LjcxIDIwMy45MSBDIDU2NS41MCAyMDQuNDUgNTYzLjE5IDIwMS43OSA1NjAuNjIgMjAwLjM4IEMgNTU2LjIzIDE5OC4zMiA1NTcuMjMgMTkyLjY3IDU1NC44OCAxODkuMTAgQyA1NTIuMjggMTg1LjExIDU0Ny44NSAxODAuODAgNTQ5LjUwIDE3NS42MSBDIDU1MC43MiAxNzEuMjggNTUyLjE3IDE2Ni42OCA1NTUuNTIgMTYzLjUwIEMgNTU4LjA3IDE2MS4wNCA1NTguNjcgMTU3LjAxIDU1Ny4yMyAxNTMuODEgQyA1NTYuMjUgMTUwLjI3IDU1Mi41OCAxNDguNzkgNTQ5LjU4IDE0Ny4zNyBDIDU0Ni4xOSAxNDYuMzcgNTQ2LjA1IDE0Mi4xOSA1NDMuNjQgMTQwLjA3IEMgNTM5Ljg1IDEzOS4wMCA1MzYuNzkgMTQxLjYwIDUzMy43NyAxNDMuMzkgQyA1MzUuMzMgMTQwLjU0IDUzNy4yMyAxMzcuOTAgNTM5LjAzIDEzNS4yMCBDIDUzOC41NiAxMzMuODUgNTM4LjEzIDEzMi40OSA1MzcuNzEgMTMxLjE0IEMgNTM1LjE0IDEzMC40OSA1MzIuNTcgMTI5Ljg4IDUzMC4wMiAxMjkuMjAgQyA1MjcuMzcgMTMyLjQ2IDUyNC42MyAxMzUuNjggNTIyLjc0IDEzOS40NiBDIDUyMS4wNSAxMzguMzcgNTE5LjQwIDEzNi42MCA1MTcuMjEgMTM2Ljk1IEMgNTE1LjM1IDEzNy44OCA1MTMuOTggMTM5LjUyIDUxMi40OCAxNDAuOTAgQyA1MTEuMTcgMTQwLjcyIDUwOS44NyAxNDAuNTEgNTA4LjU3IDE0MC4zMSBDIDUwNy4xNiAxNDIuOTkgNTA1LjAwIDE0NS4xNiA1MDIuNDEgMTQ2LjcyIEMgNTAzLjA4IDE0My4zOSA1MDMuNTMgMTM5LjYzIDUwNi4zMSAxMzcuMzEgQyA1MDkuNjIgMTM0LjMxIDUxMS40NSAxMzAuMTQgNTE0LjI4IDEyNi43MyBDIDUxMi42NyAxMjUuNTcgNTEwLjY0IDEyNC44MiA1MDkuNjAgMTIzLjA0IEMgNTEzLjUyIDEyMC4wNCA1MTguMTAgMTE3Ljk1IDUyMS43MSAxMTQuNTQgQyA1MjQuNjYgMTEwLjEzIDUxOS4xMiAxMDUuOTQgNTIwLjMxIDEwMS4zMiBDIDUyMS43MyA5NS41OSA1MTguOTYgODguOTMgNTIyLjkxIDgzLjkxIEMgNTI1LjQ3IDgwLjQ4IDUyOC4zNiA3Ny4zMiA1MzAuODYgNzMuODUgQyA1MzQuMzggNjguOTggNTQwLjY0IDY3LjcwIDU0NS4xNyA2NC4xMyBDIDU0Ny4yMCA2Mi42MiA1NDcuMzggNTkuODEgNTQ2Ljc3IDU3LjU0IEMgNTQ1LjAxIDU2LjE5IDU0My4wMCA1NS4yMSA1NDAuOTkgNTQuMjkgQyA1MzYuMjIgNTcuOTAgNTMwLjI2IDU5LjY0IDUyNC4zNCA1OS45MiBDIDUyNy4wMiA1Ny44MiA1MzAuNTcgNTcuODUgNTMzLjYzIDU2LjYyIEMgNTM0LjgxIDU2LjEyIDUzNS4yOSA1NS4yMSA1MzUuMDYgNTMuOTAgQyA1MzUuMTYgNTEuMTcgNTM0LjU0IDQ4LjQ5IDUzMy45MyA0NS44NCBDIDUzNS4zMCA0Ni45MSA1MzYuNDIgNDguNDcgNTM4LjEzIDQ5LjAzIEMgNTQwLjQ1IDQ5LjQzIDU0MS42MCA0Ni44NSA1NDMuMjMgNDUuNjcgQyA1NDUuMDAgNDcuOTEgNTQ2LjU3IDUwLjM5IDU0OC44NCA1Mi4xOSBDIDU1Mi42NyA1NC41MSA1NTguMTggNTQuNzMgNTYwLjkzIDUwLjYxIEMgNTYxLjIyIDQ2LjYzIDU1OS4yNSA0Mi45NiA1NTguNjYgMzkuMDkgQyA1NjIuMDIgMzcuNDAgNTY1LjgyIDM2Ljg0IDU2OS4xOCAzNS4xOSBDIDU3MS42OCAzMy4wMCA1NzMuNDYgMzAuMTIgNTc1LjcyIDI3LjY5IEMgNTc4LjQ3IDI0LjYzIDU3Ny45MiAyMC4xNiA1NzkuNjcgMTYuNjIgQyA1ODIuOTMgMTUuMzcgNTg2LjYxIDE2LjMyIDU5MC4wNSAxNS45NyBDIDU5My40MCAxNi4xNiA1OTYuMzAgMTMuMzUgNTk5LjY2IDE0LjE0IEMgNjAzLjcwIDE1LjkwIDYwNy4zNCAxOS4xNyA2MTEuOTkgMTkuMDcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gODA4LjI1IDc3LjI1IEMgODA4Ljc4IDc3Ljc5IDgwOC43OCA3Ny43OSA4MDguMjUgNzcuMjUgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gOTc5LjI1IDEyMy4yNiBDIDk3OS43OSAxMjMuNzkgOTc5Ljc5IDEyMy43OSA5NzkuMjUgMTIzLjI2IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDI2Mi4yNSAxODkuMjAgQyAyNjYuNzYgMTgzLjM4IDI3My41MyAxODAuMTcgMjc5LjkzIDE3Ni45MSBDIDI3OS40MiAxNzkuNDcgMjc5LjA2IDE4Mi4wNiAyNzguODMgMTg0LjY2IEMgMjgyLjcyIDE4NS44OSAyODcuMDUgMTg2LjgzIDI5MC44OSAxODQuODYgQyAyOTcuNDUgMTgxLjY3IDMwNC41NyAxNzkuNTcgMzExLjg2IDE3OS4wNiBDIDMxNC42MCAxNzkuNTkgMzE2LjYwIDE4Mi4wMCAzMTkuMzYgMTgyLjY2IEMgMzI0LjQ2IDE4My44MCAzMjkuNjIgMTgyLjIxIDMzNC43MiAxODEuODEgQyAzMzYuODggMTg0LjQ1IDMzOS42NiAxODYuNDIgMzQyLjQ2IDE4OC4zMiBDIDM0MC43MiAxODguOTMgMzM4Ljk5IDE4OS41MyAzMzcuMjUgMTkwLjEzIEMgMzM3LjcxIDE5Mi4xNyAzMzcuOTQgMTk0LjI3IDMzOC42MiAxOTYuMjUgQyAzNDMuMTMgMTk5LjI3IDM0Ny40MyAyMDIuNjMgMzUyLjA4IDIwNS40NSBDIDM1MC4wMSAyMDYuMjQgMzQ3Ljk3IDIwNy4xMCAzNDUuOTYgMjA4LjAzIEMgMzQ2LjUzIDIxMy41NyAzNDYuMzMgMjE5LjE2IDM0Ny4xMCAyMjQuNjkgQyAzNDcuNDcgMjI3LjMwIDM0NS42NyAyMjkuODAgMzQ2LjQ4IDIzMi40MiBDIDM0Ny4wMCAyMzkuMTkgMzUyLjkzIDI0My4yOCAzNTcuMDMgMjQ3Ljk4IEMgMzU5LjU1IDI1MC4zOSAzNjEuNDUgMjUzLjMyIDM2My4xNiAyNTYuMzQgQyAzNjAuMzIgMjU4LjY4IDM1Ny4wNyAyNjAuNDMgMzUzLjg0IDI2Mi4xNSBDIDM1NC4zNCAyNjQuNjUgMzU0Ljg4IDI2Ny4xNSAzNTUuMjkgMjY5LjY3IEMgMzUxLjgyIDI3MS44NCAzNDkuMzcgMjc1Ljc4IDM0OS45MyAyNzkuOTggQyAzNDkuNDcgMjg0LjUwIDM1Mi42NyAyODkuNTYgMzQ5LjYyIDI5My42MSBDIDM0Ny40NCAyOTYuNDMgMzQ0LjkwIDI5OC45NyAzNDIuMTUgMzAxLjIzIEMgMzQwLjAyIDMwMy4xNSAzMzcuMDMgMzAyLjQyIDMzNC40MyAzMDIuNTcgQyAzMzAuNzUgMzAyLjg2IDMyNy4yOCAzMDAuNzMgMzIzLjYwIDMwMS41MCBDIDMyMC44MSAzMDEuODkgMzE3Ljk2IDMwMi4yNCAzMTUuMzUgMzAzLjM2IEMgMzEzLjUwIDMwNC4wNiAzMTQuMTIgMzA2LjMxIDMxNC4xMyAzMDcuODMgQyAzMTQuNjYgMzExLjQ0IDMxNC44NiAzMTUuMDkgMzE1LjMwIDMxOC43MiBDIDMxNi45MiAzMjMuMDEgMzE5Ljg5IDMyNi42NyAzMjIuOTEgMzMwLjA4IEMgMzI0LjgzIDMzMi4zMSAzMjQuOTIgMzM1LjgwIDMyNy42MSAzMzcuMzggQyAzMzAuMjkgMzM5LjMzIDMzMi45OSAzNDEuNDcgMzM0LjUwIDM0NC41MSBDIDMzNi41MyAzNDcuNDQgMzM1LjY4IDM1MS4yMCAzMzYuNjEgMzU0LjQ4IEMgMzM3LjMyIDM1OC4xMyAzNDAuOTUgMzYwLjA1IDM0Mi43NSAzNjMuMTQgQyAzNDkuMzIgMzcxLjMxIDM1Mi4yNCAzODEuNTcgMzU1Ljc3IDM5MS4yNiBDIDM1Ny45OCAzOTYuMTAgMzU1LjkzIDQwMS43NyAzNTguNTMgNDA2LjUwIEMgMzYyLjk3IDQxNS4yMyAzNjIuNzIgNDI1LjIzIDM2NS41MyA0MzQuNDUgQyAzNjYuNzMgNDQwLjQ2IDM2NS4wMSA0NDYuODIgMzY3LjMwIDQ1Mi42OCBDIDM2OS42NiA0NTkuMzAgMzY4LjQ4IDQ2Ni4zOSAzNjkuODEgNDczLjE4IEMgMzcyLjAyIDQ4NC45OSAzNzAuNjEgNDk3LjA2IDM3MS4wMCA1MDkuMDAgQyAzNzAuNTcgNTE3LjIxIDM3Mi40NSA1MjUuOTggMzY4LjY3IDUzMy42NiBDIDM2Ni43OCA1MzcuOTcgMzYzLjg0IDU0Mi4wOCAzNjMuOTYgNTQ2Ljk4IEMgMzYzLjkyIDU1MC4yOSAzNjIuNTIgNTUzLjM0IDM2MS40MiA1NTYuNDEgQyAzNTkuNDUgNTYwLjc3IDM2MC4yNiA1NjUuODEgMzU4LjE4IDU3MC4xNiBDIDM1NS45NCA1NzQuOTkgMzU0LjYxIDU4MC4xNCAzNTMuMzMgNTg1LjI5IEMgMzUyLjY0IDU4OS4wOSAzNTMuMzEgNTkyLjk4IDM1Mi44MiA1OTYuODAgQyAzNTEuODcgNTk5LjQzIDM1MC4wNCA2MDEuNzIgMzQ5LjYwIDYwNC41NSBDIDM0OC4yOCA2MTEuMTEgMzQ3LjczIDYxNy45MCAzNDUuMTcgNjI0LjE1IEMgMzQzLjIwIDYyOC41OSAzNDQuNzYgNjMzLjYyIDM0My4xMyA2MzguMTMgQyAzNDIuMjkgNjQwLjMyIDM0Mi4wNiA2NDIuNjUgMzQxLjk1IDY0NC45OCBDIDM0MS44MyA2NTAuMzEgMzM4LjM2IDY1NC42NyAzMzYuNDMgNjU5LjQzIEMgMzM1LjYyIDY2Mi41NyAzMzYuMTcgNjY1Ljg2IDMzNS45OSA2NjkuMDYgQyAzMzYuMTcgNjcyLjkwIDMzMy4wNiA2NzUuODEgMzMyLjYxIDY3OS41NCBDIDMzMS40MCA2ODkuMDEgMzI5LjExIDY5OC4zNyAzMjguOTggNzA3Ljk3IEMgMzI5LjAwIDcyMS4zMiAzMjkuMDIgNzM0LjY3IDMyOC45OCA3NDguMDIgQyAzMjguODYgNzUzLjY5IDMzMC4xNyA3NTkuMjcgMzMwLjA4IDc2NC45NSBDIDMzMC4wMiA3NjguODMgMzM1LjAxIDc2OS4zNiAzMzYuODYgNzcyLjExIEMgMzM5LjIwIDc3NS41NiAzNDIuMTggNzc4LjU2IDM0NC4xMCA3ODIuMjkgQyAzNDYuMjUgNzgyLjc2IDM0OC41MCA3ODMuMjMgMzUwLjIwIDc4NC43NiBDIDM1Mi42MSA3ODYuOTYgMzU1Ljg5IDc4Ny41MiAzNTguOTQgNzg4LjMyIEMgMzU5LjY2IDc5MS40MiAzNjAuMDUgNzk0LjU4IDM2MC4xNSA3OTcuNzggQyAzNTMuMTYgNzk4LjY5IDM0Ni40NSA4MDIuMjEgMzM5LjI4IDgwMC43MyBDIDMzNC45MSA3OTkuODQgMzMwLjMxIDgwMC40NSAzMjYuMDkgNzk4Ljg4IEMgMzIzLjkwIDc5OC4xNSAzMjEuODYgNzk3LjA1IDMxOS42NiA3OTYuMzggQyAzMTYuNzQgNzk1LjgyIDMxMy42NyA3OTYuMTMgMzEwLjgzIDc5NS4xNCBDIDMwNi4zOSA3OTMuODIgMzAyLjgzIDc5MC4wNCAyOTguMDAgNzkwLjAyIEMgMjkxLjM5IDc4OS44OSAyODQuNzcgNzkwLjA2IDI3OC4xNiA3OTAuMDAgQyAyNzcuMTQgNzg1LjQzIDI3Ny4wNSA3ODAuNzYgMjc2Ljc4IDc3Ni4xMyBDIDI3NS45NCA3NzIuMTAgMjc0LjM2IDc2OC4xOCAyNzQuMzIgNzY0LjAxIEMgMjc0LjU4IDc1OS42MCAyNzUuOTIgNzU0LjkyIDI3NC40MiA3NTAuNjUgQyAyNzAuMTEgNzQ1LjEyIDI3MS40MiA3MzcuNzcgMjcwLjY2IDczMS4yOCBDIDI2OS40NSA3MjQuNTIgMjcwLjU1IDcxNy41OSAyNjkuMjEgNzEwLjg0IEMgMjY4LjgwIDcwMi4yNiAyNjguOTQgNjkzLjY1IDI2OS4xMyA2ODUuMDYgQyAyNzAuNDQgNjc3LjQ0IDI2OS45MSA2NjkuNzAgMjcwLjAxIDY2Mi4wMCBDIDI3MC4wMCA2NTcuNTIgMjcwLjIxIDY1My4wMSAyNjkuNDMgNjQ4LjU3IEMgMjY4LjMwIDY0MS42NyAyNjkuODUgNjM0LjU4IDI2OC4yNSA2MjcuNzQgQyAyNjYuMDMgNjE4Ljk5IDI2Ny4zMyA2MDkuOTEgMjY3LjAwIDYwMS4wMCBDIDI2Ni42NiA1OTIuNTEgMjY4LjA2IDU4My43NyAyNjUuNDggNTc1LjUxIEMgMjY0LjIwIDU3MS42MyAyNjMuNzkgNTY3LjUxIDI2Mi4zMCA1NjMuNjkgQyAyNjAuMzIgNTU5LjAwIDI2MS4wMCA1NTMuNjYgMjU5LjA0IDU0OC45NiBDIDI1Ni45NyA1NDMuOTkgMjUwLjM4IDU0Mi4zMyAyNDkuMjYgNTM2Ljc3IEMgMjQ3Ljc3IDUzMC40OCAyNDQuMzcgNTI0Ljc1IDI0My42NyA1MTguMjggQyAyNDIuNjYgNTExLjQ2IDIzNy40MyA1MDYuMDkgMjM2LjgyIDQ5OS4xNyBDIDIzNS44NSA0OTAuODEgMjMwLjk2IDQ4My41NyAyMjkuNjkgNDc1LjI5IEMgMjI4Ljg0IDQ3MC44OSAyMjkuMTUgNDY2LjM1IDIyOC4wNiA0NjIuMDAgQyAyMjIuOTMgNDYyLjExIDIxNy40OCA0NjEuMjAgMjEyLjc0IDQ2My42NyBDIDIwOC4yNiA0NjQuODAgMjA1LjgxIDQ2OS45MSAyMDAuOTcgNDY5Ljk4IEMgMTk0LjM2IDQ3MC41NyAxODguMzMgNDc0LjAyIDE4My41NCA0NzguNDcgQyAxODEuNTQgNDc5Ljk2IDE3OS43MSA0ODIuMzcgMTc2Ljk0IDQ4Mi4xMCBDIDE3NC40NCA0ODIuMzYgMTcyLjQzIDQ4MC43MCAxNzAuNDEgNDc5LjUxIEMgMTY4LjQ3IDQ3OC4wMCAxNjUuOTEgNDc4LjM4IDE2My42MiA0NzguMDUgQyAxNjIuMzMgNDgxLjM0IDE2MC40OSA0ODQuNTEgMTU3LjQ0IDQ4Ni40NiBDIDE1My43NiA0ODguNTkgMTU0LjQzIDQ5My4zMiAxNTIuNjcgNDk2LjY1IEMgMTUxLjQyIDQ5OC4yMiAxNDkuNjUgNDk5LjIzIDE0OC4wNiA1MDAuNDAgQyAxNDcuOTQgNTA0LjE5IDE0Ny45MSA1MDcuOTkgMTQ3Ljk3IDUxMS44MCBDIDE0Ni4xOCA1MTIuNjcgMTQ0LjIzIDUxMy4zMSAxNDIuNjYgNTE0LjU5IEMgMTQwLjg4IDUxOC41NCAxMzkuMjYgNTIyLjU2IDEzNy40NCA1MjYuNTAgQyAxMzUuMDkgNTMwLjM3IDEzMi4xNiA1MzMuODQgMTI5LjQ3IDUzNy40NyBDIDEyNy4xOSA1NDEuNTEgMTI2LjI4IDU0Ni4xNiAxMjUuNjYgNTUwLjcyIEMgMTI1LjIwIDU1My43MyAxMjIuMzIgNTU2LjAzIDEyMi43NyA1NTkuMjEgQyAxMjMuMDggNTYzLjkyIDEyMi40MiA1NjguOTYgMTI0LjY0IDU3My4zMiBDIDEyNy41NSA1NzQuNDQgMTMwLjk3IDU3My41NCAxMzMuNzEgNTc1LjI4IEMgMTM2LjIyIDU3Ni42OCAxMzkuMDkgNTc3LjE5IDE0MS43MCA1NzguMzcgQyAxNDQuMzQgNTc5LjU0IDE0Ni4xNCA1ODEuODkgMTQ4LjQ3IDU4My41MyBDIDE1NC4yNyA1ODYuOTYgMTYwLjk3IDU4OC4zMSAxNjcuNTQgNTg5LjQwIEMgMTcxLjYxIDU5MS44MCAxNzQuMzkgNTk2LjA0IDE3OC41NCA1OTguNDIgQyAxODAuMzQgNTk5LjUzIDE4Mi42OSA2MDAuNDEgMTgzLjMwIDYwMi42OCBDIDE4NS43NiA2MDkuODMgMTg3LjMxIDYxNy4zOSAxODcuMDMgNjI1LjAwIEMgMTg2Ljg5IDYzMS45OCAxODcuMTcgNjM4Ljk3IDE4Ni45NSA2NDUuOTYgQyAxODcuMDggNjQ5LjgxIDE4Mi4yOSA2NTEuMzQgMTgyLjEzIDY1NS4wOCBDIDE4MS44NCA2NTcuOTkgMTgwLjczIDY2MC43MSAxNzkuMjYgNjYzLjIyIEMgMTc3LjA1IDY2Ni42NCAxNzguOTcgNjcxLjIwIDE3Ni41MyA2NzQuNTUgQyAxNzQuMjUgNjc3LjY5IDE3My40MiA2ODEuNTEgMTcxLjk5IDY4NS4wMyBDIDE2OS41MyA2ODcuNzUgMTY3Ljk4IDY5MS4wMiAxNjcuMzMgNjk0LjYzIEMgMTY1LjgzIDY5NS4xNCAxNjQuMjcgNjk1LjU0IDE2Mi44OSA2OTYuMzQgQyAxNTkuOTYgNzAwLjc5IDE2MC41MCA3MDYuNDMgMTU4LjE1IDcxMS4xMiBDIDE1Ny4xMyA3MTMuMzkgMTU2Ljc0IDcxNS44NiAxNTYuMjggNzE4LjMwIEMgMTU1LjgyIDcyNC4yOSAxNTAuNjkgNzI5LjQ3IDE1Mi44OSA3MzUuNjkgQyAxNTAuMTMgNzM4LjE5IDE0OS4xNyA3NDEuODggMTQ4LjQ0IDc0NS4zOSBDIDE0OC4yNCA3NDguMzAgMTQ5LjA2IDc1MS4yNSAxNDguMTMgNzU0LjExIEMgMTQ2Ljk1IDc1Ny45MCAxNDguOTAgNzYxLjcyIDE0OC4yMyA3NjUuNTggQyAxNDcuMDMgNzY1LjQzIDE0NS44MyA3NjUuMzAgMTQ0LjYzIDc2NS4xOSBDIDE0NS4xNCA3NjYuMTYgMTQ1LjY1IDc2Ny4xNSAxNDYuMTcgNzY4LjE0IEMgMTQ3LjQ0IDc2Ny41NCAxNDguNzEgNzY2LjkzIDE0OS45NyA3NjYuMzMgQyAxNTAuMTEgNzY4Ljk5IDE0OS41NiA3NzEuODQgMTUwLjUxIDc3NC4zOSBDIDE1My41OSA3NzguNjggMTU4LjM2IDc4MS4yNiAxNjEuOTIgNzg1LjEyIEMgMTY0LjUzIDc4OC4yNCAxNjguOTUgNzg3LjU5IDE3Mi41MiA3ODguNDYgQyAxNzQuMzkgNzg5LjU0IDE3NS44NiA3OTEuMTcgMTc3LjYwIDc5Mi40MyBDIDE4MC4wMCA3OTMuMjggMTgyLjU0IDc5My42NSAxODUuMDIgNzk0LjE5IEMgMTg2LjMzIDc5Ny41MiAxODYuNjEgODAxLjk5IDE4My4xOCA4MDQuMTYgQyAxNzIuODYgODA5LjEyIDE2MS4xMyA4MDguMDAgMTUwLjA0IDgwNy45MSBDIDE0My4zNSA4MDYuOTMgMTM2LjY2IDgwNS42NyAxMzAuMTYgODAzLjgxIEMgMTI0LjAwIDgwMS4zMyAxMTYuNzUgODAxLjA0IDExMS42NSA3OTYuMzggQyAxMTAuMDUgNzk0Ljk1IDEwNy43OSA3OTUuMDEgMTA1LjgzIDc5NC41MSBDIDEwNy43MyA3ODkuMzkgMTA4LjM5IDc4My44NSAxMTAuOTkgNzc4Ljk5IEMgMTEyLjk3IDc3NS4zNiAxMTMuNjUgNzcxLjI2IDExNC4zNCA3NjcuMjUgQyAxMTUuMDEgNzYzLjI2IDExNy44NCA3NTkuNTkgMTE2LjczIDc1NS40MSBDIDExNS4xNiA3NDcuODcgMTEyLjg3IDc0MC4zMiAxMTMuNTQgNzMyLjUyIEMgMTE0LjE3IDcyOC45MyAxMTIuMjAgNzI1LjY0IDExMS44NiA3MjIuMTMgQyAxMTAuNDEgNzE1LjgwIDExMi4xNyA3MDkuMzkgMTEyLjAwIDcwMy4wMiBDIDExMi4wMSA3MDAuMzMgMTExLjg5IDY5Ny42NSAxMTIuMDQgNjk0Ljk4IEMgMTEyLjAwIDY5MS42OSAxMTQuOTIgNjg5LjI3IDExNC45NSA2ODYuMDEgQyAxMTUuMTUgNjgxLjI2IDExNC43NSA2NzYuNDcgMTE1LjU0IDY3MS43NiBDIDExNC4xNCA2NzEuNDkgMTEyLjc0IDY3MS4xNSAxMTEuMzEgNjcxLjA5IEMgMTA3LjYwIDY3Mi45MiAxMDQuNDEgNjc2LjczIDk5LjkxIDY3Ni4xOSBDIDk1LjUzIDY3NS44MCA5MS44NCA2NzguNDcgODcuODAgNjc5LjYyIEMgODMuNDMgNjgwLjcxIDc4LjkwIDY4MS40MSA3NC40MCA2ODEuMTEgQyA3Mi4xMiA2NzkuOTYgNzAuMzkgNjc3Ljg0IDY3Ljg4IDY3Ny4xNiBDIDYzLjQ4IDY3NS45MCA1OS4xNyA2NzQuMTkgNTUuMzcgNjcxLjYxIEMgNTAuNTEgNjY3Ljg0IDQzLjk5IDY3MS4yMiAzOC42MiA2NjkuNTUgQyAzNS40MCA2NjYuMjkgMzIuODYgNjYyLjQ1IDMwLjI2IDY1OC43MSBDIDI4LjY2IDY1Ni4zMyAyNi4yMyA2NTQuNjggMjQuNTkgNjUyLjM0IEMgMjMuMDEgNjQ3LjYyIDIyLjUxIDY0Mi40NyAxOS44MyA2MzguMTggQyAxNy4xNSA2MzMuNTMgMTUuNDMgNjI4LjM1IDE0Ljk0IDYyMy4wMSBDIDE0LjY4IDYxOC43MyAxMC45OSA2MTUuNDggMTEuMTAgNjExLjEyIEMgMTAuOTggNjAyLjY4IDEwLjg4IDU5NC4yNCAxMS4yMCA1ODUuODEgQyAxMS4xNiA1ODEuMzQgMTAuNjcgNTc2Ljg1IDExLjQzIDU3Mi40MiBDIDEzLjMwIDU2MC41OSAxMC4xOCA1NDguMzMgMTMuNTcgNTM2LjcwIEMgMTQuNDMgNTMxLjU2IDE2LjE3IDUyNi42MyAxNi40NiA1MjEuMzkgQyAxNy4xMyA1MTYuMTkgMjAuMDEgNTExLjczIDIxLjk3IDUwNi45OCBDIDIzLjk0IDUwMi4wMCAyMy4xOCA0OTYuMzQgMjUuNDQgNDkxLjQ1IEMgMjguNDQgNDg0LjMyIDMwLjE0IDQ3Ni42OCAzMy42OCA0NjkuNzcgQyAzNS4zNSA0NjcuNDAgMzguNDkgNDY2LjM5IDM5LjYwIDQ2My41OSBDIDQxLjU3IDQ2MC42OSA0MS43MiA0NTcuMTEgNDIuOTggNDUzLjk2IEMgNDUuODYgNDQ4Ljk1IDQ4LjI4IDQ0My41NyA1Mi4zMCA0MzkuMzQgQyA1NC4zMyA0MzYuOTcgNTYuMjEgNDM0LjQ3IDU4LjAxIDQzMS45MyBDIDYwLjI1IDQyOC45NSA2MC41NyA0MjQuOTcgNjMuMTUgNDIyLjIxIEMgNjcuMDggNDE2LjQ1IDczLjQyIDQxMi42OCA3Ni4zMCA0MDYuMTYgQyA4MC40OCA0MDEuNDIgODUuMzQgMzk3LjI0IDkwLjI1IDM5My4yNSBDIDk1Ljg3IDM4Ni45MSAxMDYuNTMgMzg0LjI0IDEwNy42MyAzNzQuNjUgQyAxMTQuNTEgMzc0LjAwIDExNy42NCAzNjYuNzcgMTIzLjgwIDM2NC41MSBDIDEyNC4xNiAzNjIuNDEgMTI0LjkwIDM2MC4zMyAxMjQuODAgMzU4LjE5IEMgMTI0LjE4IDM1NS4yNCAxMjIuOTcgMzUyLjQ2IDEyMS44NyAzNDkuNjggQyAxMTcuODYgMzUzLjA0IDExMy4xNSAzNTUuODQgMTEwLjQ0IDM2MC40OCBDIDEwOC42NCAzNjMuNTYgMTAzLjk5IDM2Mi4xMiAxMDEuOTYgMzY0Ljk4IEMgOTcuNzYgMzY5LjYyIDkyLjUwIDM3My4yMCA4Ni44OCAzNzUuOTEgQyA4NC43MyAzNzYuOTcgODQuMTMgMzc5LjQxIDgzLjQwIDM4MS40OCBDIDc4Ljg5IDM4My4wMCA3NC41MiAzODQuOTggNzAuNDAgMzg3LjM3IEMgNjYuNjkgMzg5LjUwIDY0LjQ5IDM5My40NiA2MC43MiAzOTUuNDkgQyA1Ni45NCAzOTUuMzQgNTMuMTYgMzk0Ljg5IDQ5LjM3IDM5NC44OSBDIDQ4LjMwIDM5Mi4wMyA0NS44MyAzODkuNTEgNDUuOTkgMzg2LjMyIEMgNDcuOTMgMzg0LjE3IDQ5Ljg0IDM4MS44MCA1Mi40MCAzODAuMzcgQyA2MC4yMiAzNzkuMzkgNjguNzkgMzc5LjM5IDc1LjI3IDM3NC4yNiBDIDc4LjkxIDM3MC41MCA4MC45NiAzNjUuNDIgODQuOTUgMzYxLjk0IEMgODcuNjAgMzYwLjI2IDkxLjAxIDM1OS42NCA5Mi45OCAzNTcuMDIgQyA5NS4xMCAzNTQuNDAgOTcuNjUgMzUyLjE2IDk5LjY5IDM0OS40OCBDIDEwMS4wNiAzNDcuMjUgOTkuMTIgMzQ0LjUxIDk2Ljc3IDM0NC4xNiBDIDkzLjg1IDM0My44MCA5MC44OSAzNDMuODggODcuOTYgMzQ0LjAwIEMgODMuNDMgMzQ0LjE1IDc5LjE3IDM0Ni44OCA3NC41OCAzNDUuNTUgQyA2OC44MiAzNDUuMzMgNjMuODIgMzQyLjQ0IDU4LjYwIDM0MC4zOSBDIDU0LjczIDMzOS42OCA1MC43MCAzNDAuMjYgNDYuOTAgMzM5LjEwIEMgNDQuNTIgMzM4LjcyIDQzLjIwIDMzNi40NyA0MS40NyAzMzUuMDQgQyAzOC4xNyAzMzguNTQgMzMuNzUgMzM1LjQxIDMwLjU2IDMzMy40MyBDIDI3LjQzIDMzMC42MiAyOC4wMiAzMjYuMDUgMjcuOTMgMzIyLjI2IEMgMzEuNzIgMzIyLjM1IDM1LjIwIDMyMC45MSAzOC44MCAzMjAuMDkgQyA0MS43NiAzMjEuNTAgNDQuNTIgMzIzLjMzIDQ3LjYzIDMyNC40NCBDIDUxLjg3IDMyNS44OCA1NC4yMSAzMzEuMDQgNTkuMDYgMzMwLjkzIEMgNjIuNDMgMzMwLjc4IDY1LjI0IDMzMi42MiA2OC4yNCAzMzMuODEgQyA3MS40NCAzMzMuOTYgNzQuNTggMzMyLjY4IDc3Ljc5IDMzMy4xNyBDIDgxLjc1IDMzMy42NiA4Ni4xMCAzMzQuOTkgODkuODAgMzMyLjgxIEMgOTIuNTUgMzMxLjI4IDk1Ljg0IDMzMS4xMSA5OC41NCAzMjkuNTMgQyAxMDEuNzYgMzI1LjMwIDEwMy42NyAzMTkuODkgMTA4Ljg0IDMxNy41MyBDIDEwOC43MiAzMTAuNjEgMTEwLjc0IDMwMy45MiAxMTEuMDcgMjk3LjA0IEMgMTExLjMwIDI5MS45OSAxMTQuNDkgMjg3Ljc1IDExNS40OCAyODIuOTAgQyAxMTUuNTggMjc5LjMxIDExNS45NSAyNzUuNjkgMTE3LjQyIDI3Mi4zNyBDIDExOS4xNiAyNjguMjkgMTE1Ljc1IDI2My44NSAxMTcuODYgMjU5Ljg2IEMgMTE5LjEzIDI1Ni44MSAxMjEuODEgMjU0LjcyIDEyMy45OSAyNTIuMzUgQyAxMjUuNzQgMjUzLjAyIDEyNy41OCAyNTQuNTIgMTI5LjUzIDI1My42NiBDIDEzMi4yOCAyNTIuNzEgMTM0Ljg2IDI1MS4zNCAxMzcuMzQgMjQ5LjgzIEMgMTM2LjY0IDI0Ny43MCAxMzUuODMgMjQ1LjYxIDEzNS4wMCAyNDMuNTMgQyAxMzguMjQgMjQyLjQyIDE0MS4xOCAyNDAuNjQgMTQ0LjMyIDIzOS4zMiBDIDE0OC43NiAyMzguMzMgMTUzLjMxIDIzOS40NCAxNTcuNzggMjM5LjU3IEMgMTYzLjQ3IDIzNy45MSAxNjguNTYgMjMzLjc0IDE3NC44MCAyMzQuMjcgQyAxODAuMTcgMjM1LjMwIDE4NS40MiAyMzcuNDIgMTkwLjk5IDIzNi45OSBDIDE5My40OCAyMzcuMjQgMTk2LjY3IDIzNi4yMyAxOTguNTMgMjM4LjQzIEMgMjAxLjUyIDI0MS42OSAyMDUuODMgMjQzLjExIDIwOS4zNSAyNDUuNjQgQyAyMTQuNTAgMjQ5LjQyIDIyMC4zMiAyNTIuNTcgMjI0LjA4IDI1Ny45MCBDIDIyNi4zNCAyNjEuNTggMjI4Ljc4IDI2NS4zMyAyMjkuMzIgMjY5LjczIEMgMjMwLjEyIDI3NC41MyAyMzMuNTkgMjc4LjE3IDIzNS41NSAyODIuNDggQyAyMzcuNzMgMjg5LjQxIDIzNS4zNCAyOTYuNDggMjM0LjczIDMwMy40NCBDIDIzMi4wMiAzMDQuNzEgMjI5LjE2IDMwNi4wMSAyMjcuMjAgMzA4LjM2IEMgMjI2LjcxIDMxMi4wMSAyMjYuNDMgMzE2LjE1IDIyOC42OSAzMTkuMzIgQyAyMzAuMzMgMzIxLjcyIDIzMi40NiAzMjMuNzQgMjM0LjMwIDMyNS45OCBDIDIzMC44OSAzMjguNTIgMjI2LjU5IDMzMC42NSAyMjUuMTkgMzM1LjAwIEMgMjIzLjk3IDMzOC42NSAyMjEuODQgMzQyLjYyIDIyMy42MSAzNDYuNDcgQyAyMjMuOTIgMzQ3Ljc4IDIyNS4wNSAzNDkuMDcgMjI0LjY4IDM1MC40NiBDIDIyMy4yNSAzNTEuNDcgMjIxLjcwIDM1Mi4zMSAyMjAuMjAgMzUzLjIxIEMgMjIwLjQzIDM1OC4xMyAyMTguNTkgMzYyLjg1IDIxNS44MiAzNjYuODMgQyAyMTMuMjYgMzY4Ljg2IDIwOS44MSAzNjkuNzAgMjA2LjU3IDM2OS40NSBDIDIwMi4yNiAzNjkuMjIgMTk3Ljk0IDM2OS43NCAxOTMuNzQgMzcwLjY5IEMgMTg4Ljk5IDM3MS44NCAxODQuNDIgMzY5LjMzIDE3OS42OCAzNjkuNDkgQyAxNzYuMTAgMzcwLjIzIDE3NC40MCAzNzMuODIgMTcyLjM0IDM3Ni40NCBDIDE3MC40MiAzNzcuNjIgMTY4LjEyIDM3Ny45MCAxNjUuOTcgMzc4LjQyIEMgMTY2LjA0IDM4MS40NiAxNjUuNjkgMzg0LjU2IDE2Ni4zNSAzODcuNTUgQyAxNjguNzAgMzkxLjc0IDE3Mi45MCAzOTQuNDYgMTc1LjQyIDM5OC41NCBDIDE3Ny41MiA0MDEuNDMgMTc5LjE0IDQwNS4wMCAxODIuMzggNDA2LjgxIEMgMTg0LjYxIDQwNy4zOCAxODYuODggNDA2LjU3IDE4OS4wNCA0MDYuMDcgQyAxOTQuNTcgNDA0LjU1IDE5OS45OCA0MDIuMTMgMjA0LjI4IDM5OC4yOCBDIDIwNi42NSAzOTYuMDEgMjEwLjEzIDM5NS42NyAyMTIuNzEgMzkzLjcxIEMgMjE2Ljc0IDM5MC43MyAyMjAuODIgMzg3LjgxIDIyNC45NyAzODUuMDEgQyAyMjcuNDEgMzgzLjY5IDIzMC4yNSAzODMuMjAgMjMyLjUyIDM4MS41NSBDIDIzNS41MyAzNzcuMTkgMjM3LjIzIDM3Mi4xMyAyMzkuMzggMzY3LjM1IEMgMjQzLjM3IDM2MS43NSAyNDUuMzUgMzU1LjAyIDI0OS40OCAzNDkuNTAgQyAyNTIuMDAgMzQ1LjA4IDI1NC4xMSAzNDAuMzkgMjU3LjU4IDMzNi41OSBDIDI1OS44NyAzMzIuNTggMjYyLjI0IDMyOC42MSAyNjUuMTcgMzI1LjAzIEMgMjY2LjExIDMyNS4yNiAyNjcuMDYgMzI1LjUwIDI2OC4wMSAzMjUuNzQgQyAyNjYuMzcgMzIyLjUxIDI2Ni45MiAzMTguODcgMjY3LjA3IDMxNS40MSBDIDI3MC40MCAzMTMuNTQgMjcyLjYxIDMxMC40MyAyNzQuMzkgMzA3LjE2IEMgMjcyLjExIDMwNC43MiAyNjkuNzEgMzAyLjI5IDI2OC4zMiAyOTkuMjEgQyAyNjYuODYgMjk5LjExIDI2NS40MCAyOTkuMDMgMjYzLjk1IDI5OC45NSBDIDI2NC42NSAyOTguMzAgMjY1LjM1IDI5Ny42NiAyNjYuMDUgMjk3LjAyIEMgMjYzLjg3IDI5Ni44NCAyNjEuNjkgMjk2Ljc2IDI1OS41MSAyOTYuNzYgQyAyNTcuMzEgMjkyLjQyIDI1NC43NCAyODguMTQgMjUwLjg4IDI4NS4wOCBDIDI0Ny4zMiAyODIuMjAgMjQ3LjQ3IDI3Ny4yMSAyNDUuNTYgMjczLjM4IEMgMjQxLjU2IDI2Ni4xNiAyNDEuMDUgMjU3LjQ3IDIzNi40NyAyNTAuNTMgQyAyMzMuMzAgMjQ2LjEyIDIzNi4xNSAyNDAuMzYgMjM0LjUwIDIzNS41NSBDIDIzMy4zOSAyMzQuMDcgMjMxLjk1IDIzMi44OSAyMzAuNjYgMjMxLjU3IEMgMjMzLjcwIDIzMC4xOCAyMzguNDQgMjI5LjkwIDIzOC45NyAyMjUuNzkgQyAyMzkuOTEgMjIyLjg4IDIzNy41NCAyMjAuOTYgMjM1LjQ5IDIxOS40MSBDIDIzNS43MiAyMTguMDMgMjM1LjkyIDIxNi42NSAyMzYuMTMgMjE1LjI4IEMgMjQwLjg1IDIxMy4wNSAyNDUuODYgMjExLjU2IDI1MC43NCAyMDkuNzUgQyAyNTUuMjMgMjA3Ljc4IDI1OC4yOCAyMDMuNzYgMjYyLjE2IDIwMC45MiBDIDI2MS4yOCAxOTkuODkgMjYwLjQwIDE5OC44OCAyNTkuNTIgMTk3Ljg2IEMgMjYwLjY5IDE5NS4wNSAyNjAuODcgMTkxLjkxIDI2Mi4yNSAxODkuMjAgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gMzM1LjI3IDE5NS4yNiBDIDMzNS43OCAxOTUuNzkgMzM1Ljc4IDE5NS43OSAzMzUuMjcgMTk1LjI2IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDY1MS4yNSAyNDUuMjYgQyA2NTEuNzkgMjQ1LjgwIDY1MS43OSAyNDUuODAgNjUxLjI1IDI0NS4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjZmRmZGZkIiBkPSIgTSA5OTYuMjcgMjUwLjI2IEMgOTk2Ljc3IDI1MC43OCA5OTYuNzcgMjUwLjc4IDk5Ni4yNyAyNTAuMjYgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNTY3LjcyIDI2OS43NyBDIDU3MC40MCAyNjcuNDUgNTc0LjMyIDI2Ny43MCA1NzcuNjAgMjY4LjIzIEMgNTg0LjM5IDI3Mi41MiA1ODEuNDAgMjgxLjQxIDU4Mi4wMCAyODguMDMgQyA1NzcuODcgMjg4Ljc5IDU3Mi4yMiAyOTAuNzUgNTY5LjE4IDI4Ni43OSBDIDU2Ni44MiAyODQuMjYgNTY3LjAyIDI4MC41OCA1NjYuNDYgMjc3LjQwIEMgNTY1Ljk0IDI3NC44MiA1NjYuMjIgMjcxLjk4IDU2Ny43MiAyNjkuNzcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNzcwLjI2IDM0Mi4yNSBDIDc3MC43OSAzNDIuNzkgNzcwLjc5IDM0Mi43OSA3NzAuMjYgMzQyLjI1IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDc1Ny4yNiAzNjguMjYgQyA3NTcuNzcgMzY4Ljc4IDc1Ny43NyAzNjguNzggNzU3LjI2IDM2OC4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjZmRmZGZkIiBkPSIgTSA2ODUuMTQgMzg1Ljg3IEMgNjg4LjkwIDM4NS45MiA2OTMuNjAgMzg1Ljc3IDY5NS45MyAzODkuMzMgQyA2OTcuMTIgMzk0LjQ5IDY5Mi41OSAzOTguMjcgNjg5LjEzIDQwMS4yNyBDIDY4Ny40NyA0MDIuOTIgNjg0Ljk4IDQwMS43NCA2ODMuMzMgNDAwLjcxIEMgNjgwLjE2IDM5NS45NyA2ODIuNzAgMzkwLjI5IDY4NS4xNCAzODUuODcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNjUyLjc0IDQxMy41OSBDIDY1My41NiA0MTAuMjcgNjU3LjY1IDQwOS4zNyA2NjAuNTggNDEwLjE1IEMgNjYyLjM5IDQxMS40NCA2NjQuMTUgNDEzLjA1IDY2NS4wNiA0MTUuMTQgQyA2NjQuNjIgNDE5LjkxIDY2Mi4xNiA0MjQuMjAgNjU5Ljc3IDQyOC4yNiBDIDY1OC4wOSA0MjcuNjAgNjU2LjM2IDQyNy4wNyA2NTQuNzggNDI2LjIxIEMgNjUxLjU2IDQyMi44NCA2NTEuOTQgNDE3LjgxIDY1Mi43NCA0MTMuNTkgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNjk3LjI1IDQxOS4zMCBDIDY5Ny43OCA0MTkuODQgNjk3Ljc4IDQxOS44NCA2OTcuMjUgNDE5LjMwIFoiIC8+CjxwYXRoIGZpbGw9IiNmZGZkZmQiIGQ9IiBNIDIwNS45MyA0MjUuOTMgQyAyMTAuODUgNDIyLjU0IDIxNi43NCA0MjEuMjAgMjIyLjQ4IDQxOS45NSBDIDIxOS43OSA0MjQuMzAgMjE3LjEwIDQyOC44NiAyMTMuNDMgNDMyLjQyIEMgMjA1LjQ4IDQzNS44NSAxOTkuMTMgNDQyLjE0IDE5MC45MiA0NDQuOTcgQyAxODcuMDEgNDQ2LjYyIDE4My41NCA0NDkuODAgMTc5LjE3IDQ1MC4wMyBDIDE3NC44MSA0NDguMzIgMTcyLjMzIDQ0My45MCAxNjkuMjAgNDQwLjY1IEMgMTY4Ljc5IDQzNy43NiAxNjkuMDEgNDM0LjgzIDE2OS4wMCA0MzEuOTMgQyAxNzIuMDcgNDMyLjE3IDE3NS44NiA0MzEuMTMgMTc4LjExIDQzMy44OCBDIDE4MC4zNiA0MzYuMzggMTgzLjMxIDQzNy45OCAxODYuNjggNDM4LjM3IEMgMTkxLjMxIDQzMS44MCAxOTkuNjMgNDMwLjI3IDIwNS45MyA0MjUuOTMgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gMTA0NS4yNiA0NTEuMjYgQyAxMDQ1Ljc4IDQ1MS43OCAxMDQ1Ljc4IDQ1MS43OCAxMDQ1LjI2IDQ1MS4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjMDMwMzAzIiBkPSIgTSAyMDEuMjcgNzIxLjI1IEMgMjAxLjc3IDcyMS43NyAyMDEuNzcgNzIxLjc3IDIwMS4yNyA3MjEuMjUgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gMTY0LjI1IDc4My4yNSBDIDE2NC43OSA3ODMuNzkgMTY0Ljc5IDc4My43OSAxNjQuMjUgNzgzLjI1IFoiIC8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gretl,gretl\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"gretl_x11.Gretl_x11\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Gretl\"\nLABEL oc.displayname=\"Gretl\"\nLABEL oc.path=\"/usr/bin/gretl\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"Gretl\"\nENV APPBIN \"/usr/bin/gretl\"\nENV APP \"/usr/bin/gretl\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gretl/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gretl/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Gretl

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gretl.d\n
"},{"location":"applications/gretl/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Gretl.d -t Gretl .\n
"},{"location":"applications/gretl/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Gretl > Gretl.json\ndocker image save Gretl -o Gretl.tar\nctr -n k8s.io images import Gretl.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gretl.json\n\n
"},{"location":"applications/hyper/","title":"hyper","text":""},{"location":"applications/hyper/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/hyper/#path","title":"Path","text":"
/opt/Hyper/hyper\n
"},{"location":"applications/hyper/#mimetype","title":"Mimetype","text":"
x-scheme-handler/ssh\n
"},{"location":"applications/hyper/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/hyper/#wm_class","title":"WM_CLASS","text":"
hyper.Hyper\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/hyper/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/hyper.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/hyper/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install  --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\nRUN curl -Ls -o /tmp/hyper.deb  https://releases.hyper.is/download/deb && apt-get install  --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\n
"},{"location":"applications/hyper/#json-dump","title":"JSON dump","text":"

json source file hyper.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\",\n        \"RUN curl -Ls -o /tmp/hyper.deb  https://releases.hyper.is/download/deb && apt-get install  --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\"\n    ],\n    \"icon\": \"hyper.svg\",\n    \"keyword\": \"terminal,remote\",\n    \"launch\": \"hyper.Hyper\",\n    \"name\": \"hyper\",\n    \"path\": \"/opt/Hyper/hyper\",\n    \"mimetype\": \"x-scheme-handler/ssh\",\n    \"fileextensions\": \"\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/hyper.desktop\"\n}\n
"},{"location":"applications/hyper/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output hyper.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/hyper.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @hyper.d.3.0.json\n\n
"},{"location":"applications/hyper/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\nRUN curl -Ls -o /tmp/hyper.deb  https://releases.hyper.is/download/deb && apt-get install  --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\nLABEL oc.icon=\"hyper.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojM2QzZDNkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzQ3NDc0NyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0yMyAxMi0xMSA5IDUgMy0zIDggMTAtOS01LTN6bTIgMTh2MmgxMHYtMnoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8cGF0aCBkPSJtMzUgMzF2LTJoLTEwdjJtMTAgMCIgc3R5bGU9ImZpbGw6I2Y0NjA5ZCIvPgogPHBhdGggZD0ibTEyIDIwIDExLTktNCA4IDUgMy0xMCA5IDMtOHoiIHN0eWxlPSJmaWxsOiNmMWFiNDUiLz4KIDxwYXRoIGQ9Im0xMiAyMCAxMS05LTQgOCA1IDMtMTAgOSAzLTh6IiBzdHlsZT0iZmlsbDojZjNiNjRkIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"hyper,terminal,remote\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"hyper.desktop\"\nLABEL oc.launch=\"hyper.Hyper\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"hyper\"\nLABEL oc.displayname=\"hyper\"\nLABEL oc.path=\"/opt/Hyper/hyper\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/ssh\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"hyper\"\nENV APPBIN \"/opt/Hyper/hyper\"\nENV APP \"/opt/Hyper/hyper\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/hyper/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/hyper/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application hyper

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/hyper.d\n
"},{"location":"applications/hyper/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f hyper.d -t hyper .\n
"},{"location":"applications/hyper/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect hyper > hyper.json\ndocker image save hyper -o hyper.tar\nctr -n k8s.io images import hyper.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @hyper.json\n\n
"},{"location":"applications/impress/","title":"impress","text":""},{"location":"applications/impress/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.libreoffice

"},{"location":"applications/impress/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/impress/#alpine-packages","title":"Alpine packages","text":"
libreoffice-gnome\n
"},{"location":"applications/impress/#arguments","title":"Arguments","text":"

\"--impress\"

"},{"location":"applications/impress/#displayname","title":"Displayname","text":"
Impress\n
"},{"location":"applications/impress/#path","title":"Path","text":"
/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/impress/#uniquerunkey","title":"uniquerunkey","text":"

\"libreoffice\"

"},{"location":"applications/impress/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/impress/#mimetype","title":"Mimetype","text":"
application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\n
"},{"location":"applications/impress/#file-extensions","title":"File extensions","text":"

\"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\"

"},{"location":"applications/impress/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"odp\"

"},{"location":"applications/impress/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/impress/#wm_class","title":"WM_CLASS","text":"
libreoffice.libreoffice-impress\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/impress/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/libreoffice-impress.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/impress/#json-dump","title":"JSON dump","text":"

json source file impress.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_impress.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-impress\",\n    \"name\": \"impress\",\n    \"displayname\": \"Impress\",\n    \"showinview\": \"dock\",\n    \"args\": \"--impress\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\",\n    \"fileextensions\": \"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\",\n    \"legacyfileextensions\": \"odp\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-impress.desktop\",\n    \"usedefaultapplication\": true\n}\n
"},{"location":"applications/impress/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output impress.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/impress.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @impress.d.3.0.json\n\n
"},{"location":"applications/impress/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_impress.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1NWEwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE4MjgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjciIHkyPSI1NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmNmNWQyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0NS41MDEiIHgyPSI0NS41MDEiIHkxPSI3LjEwNTUiIHkyPSIyOS44OTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlZmNlYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2Y5ZTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzUiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImQiIGN4PSIzOC4wNjYiIGN5PSIyNi4xOTIiIHI9IjI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0uOCAzZS04IC0xLjkyNjVlLTggLS45NDAzNCA4MC40NTMgMzguNjI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWUzNTNjIiBzdG9wLW9wYWNpdHk9Ii40ODUzOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxOTE5MTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImoiIHgxPSI3NTYiIHgyPSI3NTYiIHkxPSItODYwLjY0IiB5Mj0iLTg3Ni42NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjM2MzYgMCAwIDEuMzYzNiAtOTg5LjM2IDEyMTUuNCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2QzNjExOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMDllNmYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iMTUyLjMzIiBjeT0iLTc1NC42NCIgcj0iMTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMTU3ZS02IC4wOTAyNDcgLTEuMDY5MyAwIC03NzUgMzQuNTY2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9Ii41MDE5NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI4MTIiIHgyPSI4MTIiIHkxPSItMTA3NS42IiB5Mj0iLTExMTUuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNSAwIDAgLjU0OTk4IC0zNjIgNjMzLjU5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJhZDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNjMzYSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9InAiIHgxPSI1MjMiIHgyPSI1MjMiIHkxPSItMTA2NC42IiB5Mj0iLTEwODguNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjg1NzEgMCAwIC40MTY2NyAtMTE1LjQzIDQ4MS42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYjNiM2IzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U2ZTZlNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9InEiIHgxPSI3MTQiIHgyPSI3MTQiIHkxPSItMTA2My42IiB5Mj0iLTEwODMuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjU2NDEgMCAwIC41IC0xNDkuMDggNTY5LjgyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9Ii41ODgyNCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIHN0b3Atb3BhY2l0eT0iLjg2Mjc0IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iciIgeDE9Ijg4OSIgeDI9Ijg4MS43NyIgeTE9Ii0xMDU0LjYiIHkyPSItMTA0NC42IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC42NDIzNyAwIDAgLjYzODc2IC01MzEuMDkgNzA0LjI0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMThhMzAzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzEwNjgwMiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJhIiB4PSItLjA1MiIgeT0iLS4wNzA5MDkiIHdpZHRoPSIxLjEwNCIgaGVpZ2h0PSIxLjE0MTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNjUwMDAyNSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8cGF0aCBkPSJtMzMuMDEyIDM5LTEuNDg0NCAxLjQ4NDQtMC41MzkwNi0wLjQ4NDM4aC0yLjU3MDNsMS43NjE3IDEuODMwMS0wLjE2OTkyIDAuMTY5OTJoLTEuMDA5OHYxLjAwOThsLTUuOTkyMiA1Ljk5MDJoMy45MDIzbDQuMzM1OS01aDEuMDI1NGw0LjgxODQgNWgzLjkwMjNsLTUuOTkyMi01LjM5MDZ2LTEuNjA5NGgtMS43ODkxbC0wLjEyODkxLTAuMTE3MTkgMi41LTIuODgyOGgtMi41NzAzeiIgb3BhY2l0eT0iLjUiLz4KIDxwYXRoIGQ9Im0xOC4zNjQgMjBoMjQuNzMyYzAuNzU1NDUgMCAzLjkwNDQgMy4yNDQ2IDMuOTA0NCA0djE2LjQ1NWMwIDAuNzU1NDUtMC42MDgxOSAxLjM2MzYtMS4zNjM2IDEuMzYzNmgtMjcuMjczYy0wLjc1NTQ1IDAtMS4zNjM2LTAuNjA4MTktMS4zNjM2LTEuMzYzNnYtMTkuMDkxYzAtMC43NTU0NSAwLjYwODE5LTEuMzYzNiAxLjM2MzYtMS4zNjM2eiIgZmlsbD0idXJsKCNqKSIvPgogPHBhdGggZD0ibTE4LjM2NCAyMGgyNC43MzJjMC43NTU0NSAwIDMuOTA0NCAzLjI3MTYgMy45MDQ0IDQuMDMzM3YxNi41OTJjMCAwLjc2MTczLTAuNjA4MTkgMS4zNzQ5LTEuMzYzNiAxLjM3NDloLTI3LjI3M2MtMC43NTU0NSAwLTEuMzYzNi0wLjYxMzIzLTEuMzYzNi0xLjM3NDl2LTE5LjI1YzAtMC43NjE3MyAwLjYwODE5LTEuMzc0OSAxLjM2MzYtMS4zNzQ5eiIgZmlsdGVyPSJ1cmwoI2EpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0xOC4zNjQgMjBoMjQuNzMyYzAuNzU1NDUgMCAzLjkwNDQgMy4yNzE2IDMuOTA0NCA0LjAzMzN2MTYuNTkyYzAgMC43NjE3My0wLjYwODE5IDEuMzc0OS0xLjM2MzYgMS4zNzQ5aC0yNy4yNzNjLTAuNzU1NDUgMC0xLjM2MzYtMC42MTMyMy0xLjM2MzYtMS4zNzQ5di0xOS4yNWMwLTAuNzYxNzMgMC42MDgxOS0xLjM3NDkgMS4zNjM2LTEuMzc0OXoiIGZpbGw9InVybCgjbCkiLz4KIDxwYXRoIGQ9Im0xNi45MTQgNDdoMzAuMTcxYzAuNTA2NDkgMCAwLjkxNDI3IDAuNDAyMTMgMC45MTQyNyAwLjkwMTh2MC44NjMwN2MwIDAuNDk5NjctMC40MDc3NyAwLjkwMTgtMC45MTQyNyAwLjkwMThoLTMwLjE3MWMtMC41MDY0OSAwLTAuOTE0MjctMC40MDIxMy0wLjkxNDI3LTAuOTAxOHYtMC44NjMwN2MwLTAuNDk5NjcgMC40MDc3Ny0wLjkwMTggMC45MTQyNy0wLjkwMTh6IiBmaWxsPSJ1cmwoI2kpIiBvcGFjaXR5PSIuNCIvPgogPGcgZmlsbD0iI2ZmZiI+CiAgPHJlY3QgeD0iMjAiIHk9IjIzIiB3aWR0aD0iMjQiIGhlaWdodD0iMyIgb3BhY2l0eT0iLjM1Ii8+CiAgPHJlY3QgeD0iMjQiIHk9IjI4IiB3aWR0aD0iOCIgaGVpZ2h0PSIyIiBvcGFjaXR5PSIuMzUiLz4KICA8ZWxsaXBzZSBjeD0iMjEiIGN5PSIyOSIgcng9IjEiIHJ5PSIxIiBvcGFjaXR5PSIuMzUiLz4KICA8cmVjdCB4PSIyNCIgeT0iMzIiIHdpZHRoPSI4IiBoZWlnaHQ9IjIiIG9wYWNpdHk9Ii4zNSIvPgogIDxlbGxpcHNlIGN4PSIyMSIgY3k9IjMzIiByeD0iMSIgcnk9IjEiIG9wYWNpdHk9Ii4zNSIvPgogIDxyZWN0IHg9IjI0IiB5PSIzNiIgd2lkdGg9IjgiIGhlaWdodD0iMS45OTk5IiBvcGFjaXR5PSIuMzUiLz4KICA8ZWxsaXBzZSBjeD0iMjEiIGN5PSIzNyIgcng9IjEiIHJ5PSIxIiBvcGFjaXR5PSIuMzUiLz4KIDwvZz4KIDxyZWN0IHg9IjM0IiB5PSIyOCIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiBmaWxsPSJ1cmwoI3ApIi8+CiA8cmVjdCB4PSIzNCIgeT0iMjgiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0idXJsKCNxKSIvPgogPHBhdGggZD0ibTM2IDM2LjM1MyAyLTQgMi42NjY3IDEuMzMzMyAyLTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNyKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CiA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZCkiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8cGF0aCBkPSJtNTYuODk2IDI5Ljg5Ni0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwIDIyLjc5MSAyMi43OTF6IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"impress,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-impress.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-impress\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--impress\"\nLABEL oc.name=\"impress\"\nLABEL oc.displayname=\"Impress\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\"\nLABEL oc.fileextensions=\"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\"\nLABEL oc.legacyfileextensions=\"odp\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"impress\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--impress\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/impress/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/impress/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application impress

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/impress.d\n
"},{"location":"applications/impress/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f impress.d -t impress .\n
"},{"location":"applications/impress/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect impress > impress.json\ndocker image save impress -o impress.tar\nctr -n k8s.io images import impress.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @impress.json\n\n
"},{"location":"applications/inkscape/","title":"inkscape","text":""},{"location":"applications/inkscape/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/inkscape/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/inkscape/#ubuntu-packages","title":"Ubuntu packages","text":"
inkscape inkscape-lang\n
"},{"location":"applications/inkscape/#path","title":"Path","text":"
/usr/bin/inkscape\n
"},{"location":"applications/inkscape/#mimetype","title":"Mimetype","text":"
image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\n
"},{"location":"applications/inkscape/#file-extensions","title":"File extensions","text":"

\"ai;cdr\"

"},{"location":"applications/inkscape/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"ai;cdr\"

"},{"location":"applications/inkscape/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/inkscape/#wm_class","title":"WM_CLASS","text":"
org.inkscape.Inkscape.Inkscape\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/inkscape/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.inkscape.Inkscape.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/inkscape/#json-dump","title":"JSON dump","text":"

json source file inkscape.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"debpackage\": \"inkscape inkscape-lang\",\n    \"icon\": \"circle_inkscape.svg\",\n    \"keyword\": \"inkscape\",\n    \"launch\": \"org.inkscape.Inkscape.Inkscape\",\n    \"name\": \"inkscape\",\n    \"path\": \"/usr/bin/inkscape\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\",\n    \"fileextensions\": \"ai;cdr\",\n    \"legacyfileextensions\": \"ai;cdr\",\n    \"installrecommends\": true,\n    \"desktopfile\": \"/usr/share/applications/org.inkscape.Inkscape.desktop\"\n}\n
"},{"location":"applications/inkscape/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output inkscape.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/inkscape.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @inkscape.d.3.0.json\n\n
"},{"location":"applications/inkscape/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y inkscape inkscape-lang && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_inkscape.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iU2tldGNoIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMDEuNTMiIHgyPSIxMDEuNTMiIHkxPSIxOC44ODgiIHkyPSIxODMuNTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMy41MjIzIDAgMCAzLjUyMjMgMTYyLjM4IDE2Ny4wOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkN2Q3ZDciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzU3NjMiIHk9Ii0uMDM2MjQiIHdpZHRoPSIxLjA3MTUiIGhlaWdodD0iMS4wNzI1IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI3LjYyOTQwMyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjU0MC4xMSIgeDI9IjU0MC4xMSIgeTE9IjIuMDA3OCIgeTI9IjEwMjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMi4wMDA0IDEuOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iLjUwNzY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0YTRhNGEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjEwNDY4OCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtLjYxNDI0IC0uNjc4KSI+CiAgPGcgaWQ9InNoYWRvdyIgdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMiAyKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPjwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwMDcgMCAwIDEuMDAwNyAtLjkyNDYzIC4xNzU5OCkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTk2Ny45NiAzOTIuNDJjLTEuMDk1Ny00LjMzMy0yLjM0MDgtOC45NjQ4LTMuNjM1Ny0xMy41NDctMC45OTYxLTMuMzg2Ny0xLjk5MjItNi44MjMyLTMuMTM3Ny0xMC40NTktMS41OTM4LTUuMTI5OS0zLjM4NjctMTAuNDU5LTUuMjc5My0xNS43ODgtNi40MjQ4LTE4LjE3OS0xNC4wOTUtMzUuOTA5LTIzLjA2LTUzLjQ0LTMuNzg1MS03LjM3MTEtNy45MTg5LTE0Ljg5Mi0xMi4yNTItMjIuMzEyLTIwLjIyMS0zNC4zNjUtNDUuNjIxLTY2LjkzNy03Ni4wNTItOTcuMzY4LTcyLjMxNi03Mi4zMTYtMTU2LjU0LTExNi4xOS0yNTIuNjYtMTMxLjUzLTE2LjE4Ny0yLjU4OTgtMzIuNjcyLTQuMzgyOC00OS44NTQtNS4zMjkxLTkuNjYyMS0wLjU0Nzg1LTE5Ljc3Mi0wLjg0NjY4LTI5Ljk4Mi0wLjg0NjY4LTkuMzEzNSAwLTE4LjUyNyAwLjI0OTAyLTI3Ljc5MSAwLjc0NzA3LTExNy44OSA2LjA3NjItMjE5LjQ0IDUxLjc0Ny0zMDQuNjYgMTM2Ljk2cS0xMzcuNzEgMTM3LjcxLTEzNy43MSAzMzIuNDVjMCAxMjkuODQgNDUuOTIgMjQwLjcxIDEzNy43MSAzMzIuNSA1Ni40NzkgNTYuNDI5IDEyMC4wOCA5NS41MjUgMTkwLjM1IDExNy4wOSAzNi42MDYgMTEuMjA2IDc0LjUwOCAxNy43OCAxMTQuMyAxOS44NzJoMC4zOTg0NGM4LjQ2NjggMC40NDgzIDE2LjUzNSAwLjY5NzMgMjQuNDA0IDAuNjk3M2gyLjk4ODNjMTAuMjYgMCAyMC40Mi0wLjI5ODggMjkuOTgyLTAuNzk2OSAyLjQ5MDItMC4xNDk0IDQuNzMxNC0wLjI5ODggNi45MjI4LTAuNDQ4MiAyMC4xMjEtMS40NDQzIDM5Ljc0NC00LjAzNDIgNTguNDcxLTcuNjY5OSA3LjkxODktMS41NDQgMTUuNzM4LTMuMjg3MiAyMy4zMDktNS4xMjk5IDgwLjQ4NC0yMC4yMjEgMTUxLjU2LTYxLjM1OSAyMTMuODEtMTIzLjYyIDQ4LjQxLTQ4LjQxIDg0LjA3LTEwMi4xIDEwNi45My0xNjEuMTcgMTguMzc4LTQ3LjQ2NCAyOC41MzgtOTguNDE0IDMwLjQzMS0xNTIuOSAwLjE5OTItNi4wMjY0IDAuMjk4OS0xMi4yMDIgMC4yOTg5LTE4LjQyOHYtMS45OTIyLTAuOTk2MDljLTAuMTk5My00MC40OTEtNC45MzA3LTc5LjE4OS0xNC4yNDQtMTE2LjU0eiIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiLz4KICAgIDxwYXRoIGQ9Im05NjcuOTYgMzkyLjQyYy0xLjA5NTctNC4zMzMtMi4zNDA4LTguOTY0OC0zLjYzNTctMTMuNTQ3LTAuOTk2MS0zLjM4NjctMS45OTIyLTYuODIzMi0zLjEzNzctMTAuNDU5LTEuNTkzOC01LjEyOTktMy4zODY3LTEwLjQ1OS01LjI3OTMtMTUuNzg4LTYuNDI0OC0xOC4xNzktMTQuMDk1LTM1LjkwOS0yMy4wNi01My40NC0zLjc4NTEtNy4zNzExLTcuOTE4OS0xNC44OTItMTIuMjUyLTIyLjMxMi0yMC4yMjEtMzQuMzY1LTQ1LjYyMS02Ni45MzctNzYuMDUyLTk3LjM2OC03Mi4zMTYtNzIuMzE2LTE1Ni41NC0xMTYuMTktMjUyLjY2LTEzMS41My0xNi4xODctMi41ODk4LTMyLjY3Mi00LjM4MjgtNDkuODU0LTUuMzI5MS05LjY2MjEtMC41NDc4NS0xOS43NzItMC44NDY2OC0yOS45ODItMC44NDY2OC05LjMxMzUgMC0xOC41MjcgMC4yNDkwMi0yNy43OTEgMC43NDcwNy0xMTcuODkgNi4wNzYyLTIxOS40NCA1MS43NDctMzA0LjY2IDEzNi45NnEtMTM3LjcxIDEzNy43MS0xMzcuNzEgMzMyLjQ1YzAgMTI5Ljg0IDQ1LjkyIDI0MC43MSAxMzcuNzEgMzMyLjUgNTYuNDc5IDU2LjQyOSAxMjAuMDggOTUuNTI1IDE5MC4zNSAxMTcuMDkgMzYuNjA2IDExLjIwNiA3NC41MDggMTcuNzggMTE0LjMgMTkuODcyaDAuMzk4NDRjOC40NjY4IDAuNDQ4MyAxNi41MzUgMC42OTczIDI0LjQwNCAwLjY5NzNoMi45ODgzYzEwLjI2IDAgMjAuNDItMC4yOTg4IDI5Ljk4Mi0wLjc5NjkgMi40OTAyLTAuMTQ5NCA0LjczMTQtMC4yOTg4IDYuOTIyOC0wLjQ0ODIgMjAuMTIxLTEuNDQ0MyAzOS43NDQtNC4wMzQyIDU4LjQ3MS03LjY2OTkgNy45MTg5LTEuNTQ0IDE1LjczOC0zLjI4NzIgMjMuMzA5LTUuMTI5OSA4MC40ODQtMjAuMjIxIDE1MS41Ni02MS4zNTkgMjEzLjgxLTEyMy42MiA0OC40MS00OC40MSA4NC4wNy0xMDIuMSAxMDYuOTMtMTYxLjE3IDE4LjM3OC00Ny40NjQgMjguNTM4LTk4LjQxNCAzMC40MzEtMTUyLjkgMC4xOTkyLTYuMDI2NCAwLjI5ODktMTIuMjAyIDAuMjk4OS0xOC40Mjh2LTEuOTkyMi0wLjk5NjA5Yy0wLjE5OTMtNDAuNDkxLTQuOTMwNy03OS4xODktMTQuMjQ0LTExNi41NHoiIGZpbGw9InVybCgjYSkiLz4KICAgPC9nPgogIDwvZz4KICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjA5NzMgMCAwIDEuMDk3MyAtNTEuNTQ4IC01Ni4zOTYpIiBkPSJtNTA5Ljg1IDI4MS44OWMtMTUuODMzLTAuMDMyMS0zMS41NzIgNS43MjQ5LTQyLjkzNSAxNy4zNTRsLTE4OC45OSAxOTMuNDFjLTYzLjg2OCA3OS4wOTMgNDMuNDY5IDY5LjkxIDg5LjQ4MSA5Mi42OTEgMTYuNTA1IDE2Ljg3MS02My4yNTIgMjkuMjYtNDYuNzQ3IDQ2LjE0NSAxNi41MDUgMTYuODcxIDk5LjczMiAzMi40ODQgMTE2LjI2IDQ5LjM1NSAxNi41MDUgMTYuODcxLTMzLjc1OSAzNC43OTEtMTcuMjU0IDUxLjY2MiAxNi41MDUgMTYuODcxIDU0LjY0NiAwLjg3NjgzIDYxLjc5NCAzOS44MjUgNS4wOTM3IDI3LjgzMiA2OC44NjEgMTEuOTYxIDEwMC4wMS0xMC44MzQgMTYuNTA1LTE2Ljg4NS0zMS41NTItMTUuMjMtMTUuMDQ3LTMyLjEwMSA0MS4wNDUtNDEuOTc0IDc5LjI1LTE1LjMyMiA5My4yOTMtNTcuMzggNi45MzY5LTIwLjc4My02MC40NzEtMzEuOTgyLTQzLjkzOC00OC44NTMgNDcuNDg5LTI3LjczNCAyMTEuNi00NS44MDYgMTMzLjcyLTEyMy42OWwtMTk1LjkxLTIwMC4yM2MtMTEuOTgxLTExLjUwMy0yNy45MDQtMTcuMzIzLTQzLjczNy0xNy4zNTR6bTEuNjA1IDE4LjM1OGMxMS4zMDQgMC4wNTk3IDIyLjU4NCA0LjMyMTkgMzAuNjk2IDEyLjUzOWw3NC44MzUgNzUuOTM4YzcuMDkxNyA3LjI0NjUgNi45Nzc0IDIxLjI0MSAzLjAwOTQgMjUuMjc5bC0zNy4xMTYtMjkuNjkzLTcuMzIzIDQ0LjAzOC0zMC45OTctMTYuMzUxLTQ5Ljc1NiAzMS4yOTgtMTYuNDUyLTY2LjEwNy0yNi42ODQgNDYuMTQ1aC00MC43MjhjLTE2LjYzMiAwLTE4LjYyMy0yMS4xMDItMy41MTEtMzYuMjE0IDI2LjM5Ny0yOC40OTQgNTYuNjY3LTU3LjUwNCA3My4xMjktNzQuMzMzIDguMjczNy04LjQ1NjYgMTkuNTkzLTEyLjU5OSAzMC44OTctMTIuNTM5em0tODkuNzgyIDI5NS41M2M1LjA1MTUgMy4xMzc4IDgxLjQ0MiAxOC42NzMgMTAwLjExIDIxLjc2OCA2LjQ3MjYgMS4zNjQ5IDEuODk4OSA4LjAzNjctNy4wMjIgMTIuNTM5LTIwLjEyMSA1LjM0Ny0xMTcuNzItMzQuMzA4LTkzLjA5Mi0zNC4zMDh6bTI5Ny4xMyA1My4xNjdjLTE1LjM3MiAwLjUyOTQxLTMwLjUzIDguMzQ3Mi0zNC43MDkgMjMuMDcyIDAgOS41OTY0IDcwLjYyMiAxNS45NDUgNzAuNjIyLTIuMjA2OS01LjAzNzQtMTQuNTc3LTIwLjU0LTIxLjM5NS0zNS45MTMtMjAuODY1em0tMzI0LjIyIDQxLjUzYy0yMi4xNTktMC4yMDU0NC00OC4xMDUgMTYuMDQ3LTI4Ljk5MSAzMi42MDIgMTYuNzQ0IDE0LjQ3OSA0Mi42MDUtMy42NjkxIDUwLjM1OC0yMy44NzUtNC41NjI5LTYuMDYyOC0xMi42OTYtOC42NDctMjEuMzY3LTguNzI3NHptMjgwLjU4IDEuMzA0MWMtMjEuNTg1IDE5LjM2MiAyLjM5OTEgMzguOTkyIDIzLjY3NCAyNi40ODMgNC43NDE5LTQuODEyMi0wLjEwNTYxLTIxLjY3MS0yMy42NzQtMjYuNDgzeiIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMiIgc3Ryb2tlLXdpZHRoPSI1MC4zNDUiLz4KICA8cGF0aCBkPSJtNTA3LjkgMjQxLjk0Yy0xNy4zNzMtMC4wMzUyLTM0LjY0NCA2LjI4MTgtNDcuMTExIDE5LjA0M2wtMjA3LjM4IDIxMi4yMmMtNzAuMDgxIDg2Ljc4NiA0Ny42OTcgNzYuNzExIDk4LjE4NSAxMDEuNzEgMTguMTExIDE4LjUxMi02OS40MDUgMzIuMTA2LTUxLjI5NCA1MC42MzQgMTguMTExIDE4LjUxMiAxMDkuNDMgMzUuNjQ0IDEyNy41NyA1NC4xNTYgMTguMTExIDE4LjUxMi0zNy4wNDMgMzguMTc2LTE4LjkzMyA1Ni42ODggMTguMTExIDE4LjUxMiA1OS45NjIgMC45NjIxMiA2Ny44MDUgNDMuNjk5IDUuNTg5MiAzMC41NCA3NS41NTkgMTMuMTI0IDEwOS43NC0xMS44ODggMTguMTExLTE4LjUyNy0zNC42MjItMTYuNzExLTE2LjUxMS0zNS4yMjMgNDUuMDM3LTQ2LjA1NyA4Ni45NTktMTYuODEzIDEwMi4zNy02Mi45NjIgNy42MTE3LTIyLjgwNC02Ni4zNTQtMzUuMDkzLTQ4LjIxMi01My42MDYgNTIuMTA5LTMwLjQzMiAyMzIuMTktNTAuMjYxIDE0Ni43My0xMzUuNzJsLTIxNC45Ny0yMTkuNzFjLTEzLjE0Ny0xMi42MjItMzAuNjE4LTE5LjAwOC00Ny45OTItMTkuMDQzem0xLjc2MTIgMjAuMTQzYzEyLjQwNCAwLjA2NTUgMjQuNzgxIDQuNzQyNCAzMy42ODIgMTMuNzU5bDgyLjExNCA4My4zMjVjNy43ODE2IDcuOTUxNCA3LjY1NjIgMjMuMzA3IDMuMzAyMiAyNy43MzhsLTQwLjcyNy0zMi41ODItOC4wMzUzIDQ4LjMyMi0zNC4wMTMtMTcuOTQyLTU0LjU5NiAzNC4zNDMtMTguMDUyLTcyLjUzOC0yOS4yNzkgNTAuNjM0aC00NC42OWMtMTguMjUgMC0yMC40MzUtMjMuMTU0LTMuODUyNS0zOS43MzYgMjguOTY1LTMxLjI2NSA2Mi4xNzktNjMuMDk4IDgwLjI0My04MS41NjQgOS4wNzg1LTkuMjc5MiAyMS40OTktMTMuODI1IDMzLjkwMi0xMy43NTl6bS05OC41MTUgMzI0LjI3YzUuNTQyOCAzLjQ0MyA4OS4zNjQgMjAuNDg5IDEwOS44NSAyMy44ODYgNy4xMDIyIDEuNDk3NyAyLjA4MzYgOC44MTg0LTcuNzA1MSAxMy43NTktMjIuMDc5IDUuODY3MS0xMjkuMTctMzcuNjQ1LTEwMi4xNS0zNy42NDV6bTMyNi4wNCA1OC4zMzljLTE2Ljg2OCAwLjU4MDkxLTMzLjUgOS4xNTkyLTM4LjA4NSAyNS4zMTcgMCAxMC41MyA3Ny40OTEgMTcuNDk2IDc3LjQ5MS0yLjQyMTYtNS41Mjc0LTE1Ljk5NS0yMi41MzgtMjMuNDc2LTM5LjQwNi0yMi44OTV6bS0zNTUuNzYgNDUuNTdjLTI0LjMxNS0wLjIyNTQyLTUyLjc4NSAxNy42MDgtMzEuODExIDM1Ljc3NCAxOC4zNzMgMTUuODg3IDQ2Ljc0OS00LjAyNiA1NS4yNTctMjYuMTk3LTUuMDA2OC02LjY1MjYtMTMuOTMxLTkuNDg4MS0yMy40NDYtOS41NzY0em0zMDcuODcgMS40MzFjLTIzLjY4NCAyMS4yNDUgMi42MzI0IDQyLjc4NSAyNS45NzcgMjkuMDU5IDUuMjAzMi01LjI4MDMtMC4xMTU4OC0yMy43NzktMjUuOTc3LTI5LjA1OXoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iNTUuMjQyIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"inkscape,inkscape\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.inkscape.Inkscape.desktop\"\nLABEL oc.launch=\"org.inkscape.Inkscape.Inkscape\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"inkscape\"\nLABEL oc.displayname=\"inkscape\"\nLABEL oc.path=\"/usr/bin/inkscape\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\"\nLABEL oc.fileextensions=\"ai;cdr\"\nLABEL oc.legacyfileextensions=\"ai;cdr\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"inkscape\"\nENV APPBIN \"/usr/bin/inkscape\"\nENV APP \"/usr/bin/inkscape\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/inkscape/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/inkscape/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application inkscape

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/inkscape.d\n
"},{"location":"applications/inkscape/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f inkscape.d -t inkscape .\n
"},{"location":"applications/inkscape/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect inkscape > inkscape.json\ndocker image save inkscape -o inkscape.tar\nctr -n k8s.io images import inkscape.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @inkscape.json\n\n
"},{"location":"applications/jupyter/","title":"jupyter","text":""},{"location":"applications/jupyter/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.20.04

"},{"location":"applications/jupyter/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/jupyter/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
"},{"location":"applications/jupyter/#arguments","title":"Arguments","text":"

\"--disable-factory --class=jupyter -- /usr/local/bin/startjupyter.sh\"

"},{"location":"applications/jupyter/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/jupyter/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/jupyter/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/jupyter/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.jupyter\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/jupyter/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/jupyter/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\nRUN pip3 install torch\nRUN pip3 install jupyterlab\nRUN pip install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\n
"},{"location":"applications/jupyter/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\n
"},{"location":"applications/jupyter/#json-dump","title":"JSON dump","text":"

json source file jupyter.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN add-apt-repository ppa:mozillateam/ppa\",\n        \"COPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\",\n        \"RUN pip3 install torch\",\n        \"RUN pip3 install jupyterlab\",\n        \"RUN pip install jupyterlab-nvdashboard\",\n        \"RUN # jupyter labextension install jupyterlab-nvdashboard\"\n    ],\n    \"debpackage\": \"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n    \"icon\": \"jupyter.svg\",\n    \"keyword\": \"jupyter\",\n    \"launch\": \"gnome-terminal-server.jupyter\",\n    \"name\": \"jupyter\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=jupyter -- /usr/local/bin/startjupyter.sh\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.20.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\",\n        \"COPY startjupyter.sh /usr/local/bin/startjupyter.sh\"\n    ]\n}\n
"},{"location":"applications/jupyter/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output jupyter.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyter.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyter.d.3.0.json\n\n
"},{"location":"applications/jupyter/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.20.04:$TAG\nUSER root\nRUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\nRUN pip3 install torch\nRUN pip3 install jupyterlab\nRUN pip install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"jupyter.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDQiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCA0NCA1MSIgdmVyc2lvbj0iMi4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpmaWdtYT0iaHR0cDovL3d3dy5maWdtYS5jb20vZmlnbWEvbnMiPgo8dGl0bGU+R3JvdXAuc3ZnPC90aXRsZT4KPGRlc2M+Q3JlYXRlZCB1c2luZyBGaWdtYSAwLjkwPC9kZXNjPgo8ZyBpZD0iQ2FudmFzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0MCAtMjQ1MykiIGZpZ21hOnR5cGU9ImNhbnZhcyI+CjxnIGlkPSJHcm91cCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9Ikdyb3VwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0iR3JvdXAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGg5IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoMF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQwLjU0IDI0NzQuMzYpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTAgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGgxX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDUuNjggMjQ3NC4zNykiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxMSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDJfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY1My4zOSAyNDc0LjI2KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDEyIGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoM19maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjYwLjQzIDI0NzQuMzkpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTMgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg0X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NjcuNTUgMjQ3Mi41NCkiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDVfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3Mi40NyAyNDc0LjI5KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE1IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoNl9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjc5Ljk4IDI0NzQuMjQpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNiBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDdfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3My40OCAyNDUzLjY5KSIgZmlsbD0iIzc2NzY3NyIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE3IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoOF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQzLjIxIDI0ODQuMjcpIiBmaWxsPSIjRjM3NzI2IiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTggZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg5X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjEgMjQ1Ny44OCkiIGZpbGw9IiNGMzc3MjYiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxOSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDEwX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjggMjQ5Ni4wOSkiIGZpbGw9IiM5RTlFOUUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgyMCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDExX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDEuODcgMjQ1OC40MykiIGZpbGw9IiM2MTYyNjIiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxkZWZzPgo8cGF0aCBpZD0icGF0aDBfZmlsbCIgZD0iTSAxLjc0NDk4IDUuNDc1MzNDIDEuNzQ0OTggNy4wMzMzNSAxLjYyMDM0IDcuNTQwODIgMS4yOTk4MyA3LjkxNDc0QyAwLjk0MzExOSA4LjIzNTk1IDAuNDgwMDI0IDguNDEzNTggMCA4LjQxMzMxTCAwLjEyNDY0MiA5LjMwMzZDIDAuODY4ODQgOS4zMTM2NiAxLjU5MDk1IDkuMDUwNzggMi4xNTQ1MiA4LjU2NDY2QyAyLjQ1Nzc1IDguMTk0ODcgMi42ODM0IDcuNzY3ODEgMi44MTggNy4zMDg5M0MgMi45NTI2MSA2Ljg1MDA1IDIuOTkzNDEgNi4zNjg3NiAyLjkzNzk4IDUuODkzNzdMIDIuOTM3OTggMEwgMS43NDQ5OCAwTCAxLjc0NDk4IDUuNDM5NzJMIDEuNzQ0OTggNS40NzUzM1oiLz4KPHBhdGggaWQ9InBhdGgxX2ZpbGwiIGQ9Ik0gNS41MDIwNCA0Ljc2MzA5QyA1LjUwMjA0IDUuNDMwODEgNS41MDIwNCA2LjAyNzMxIDUuNTU1NDUgNi41NDM2OEwgNC40OTYgNi41NDM2OEwgNC40MjQ3OCA1LjQ4NDIzQyA0LjIwMzE4IDUuODU5MDkgMy44ODYyNyA2LjE2ODU4IDMuNTA2MjggNi4zODEyNUMgMy4xMjYyOCA2LjU5MzkyIDIuNjk2NzUgNi43MDIxOSAyLjI2MTM1IDYuNjk1MDNDIDEuMjI4NjEgNi42OTUwMyAwIDYuMTM0MTUgMCAzLjg0NjA4TCAwIDAuMDQ0NTE0OUwgMS4xOTMgMC4wNDQ1MTQ5TCAxLjE5MyAzLjYwNTdDIDEuMTkzIDQuODQzMjIgMS41NzU4MyA1LjY3MTE5IDIuNjUzMDkgNS42NzExOUMgMi44NzQ3MiA1LjY3MzU4IDMuMDk0NTkgNS42MzE2OCAzLjI5OTgyIDUuNTQ3OTZDIDMuNTA1MDUgNS40NjQyNCAzLjY5MTQ5IDUuMzQwMzkgMy44NDgyMiA1LjE4MzY2QyA0LjAwNDk0IDUuMDI2OTQgNC4xMjg4IDQuODQwNDkgNC4yMTI1MiA0LjYzNTI3QyA0LjI5NjIzIDQuNDMwMDQgNC4zMzgxMyA0LjIxMDE2IDQuMzM1NzUgMy45ODg1M0wgNC4zMzU3NSAwTCA1LjUyODc0IDBMIDUuNTI4NzQgNC43Mjc0OEwgNS41MDIwNCA0Ljc2MzA5WiIvPgo8cGF0aCBpZD0icGF0aDJfZmlsbCIgZD0iTSAwLjA1MzQxNzggMi4yNzI2NEMgMC4wNTM0MTc4IDEuNDQ0NjYgMC4wNTM0MTc4IDAuNzY4MDM2IDAgMC4xNTM3MzFMIDEuMDY4MzYgMC4xNTM3MzFMIDEuMTIxNzcgMS4yNjY2QyAxLjM1OTggMC44NjQ1MzUgMS43MDI0NyAwLjUzNDU5NCAyLjExMzI1IDAuMzExOTU0QyAyLjUyNDA0IDAuMDg5MzE0NSAyLjk4NzU0IC0wLjAxNzY3ODYgMy40NTQzNSAwLjAwMjM4MDk1QyA1LjAzOTA4IDAuMDAyMzgwOTUgNi4yMzIwOCAxLjMyODkyIDYuMjMyMDggMy4zMDUzOEMgNi4yMzIwOCA1LjYzNzk2IDQuNzk4NyA2Ljc5NTM1IDMuMjQ5NTggNi43OTUzNUMgMi44NTMwOSA2LjgxMzA0IDIuNDU4NzQgNi43MjgxIDIuMTA0NjkgNi41NDg3NEMgMS43NTA2NCA2LjM2OTM3IDEuNDQ4ODggNi4xMDE2NiAxLjIyODYxIDUuNzcxNTFMIDEuMjI4NjEgNS43NzE1MUwgMS4yMjg2MSA5LjMzMjY5TCAwLjA1MzQxNzggOS4zMzI2OUwgMC4wNTM0MTc4IDIuMjk5MzVMIDAuMDUzNDE3OCAyLjI3MjY0Wk0gMS4yMjg2MSA0LjAwODcyQyAxLjIzMTg0IDQuMTcwMjYgMS4yNDk3MiA0LjMzMTE3IDEuMjgyMDMgNC40ODk0OEMgMS4zODMwNCA0Ljg4NDc5IDEuNjEyOTkgNS4yMzUxMyAxLjkzNTQ4IDUuNDg1MDZDIDIuMjU3OTggNS43MzUgMi42NTQ2MSA1Ljg3MDI2IDMuMDYyNjIgNS44Njk0NEMgNC4zMTc5NCA1Ljg2OTQ0IDUuMDU2ODkgNC44NDU2IDUuMDU2ODkgMy4zNTg4QyA1LjA1Njg5IDIuMDU4OTcgNC4zNjI0NiAwLjk0NjA5NiAzLjEwNzE0IDAuOTQ2MDk2QyAyLjYxMDM2IDAuOTg2Nzc3IDIuMTQ1NDggMS4yMDcyNiAxLjc5OTY1IDEuNTY2MkMgMS40NTM4MiAxLjkyNTE0IDEuMjUwNzkgMi4zOTc5IDEuMjI4NjEgMi44OTU4NUwgMS4yMjg2MSA0LjAwODcyWiIvPgo8cGF0aCBpZD0icGF0aDNfZmlsbCIgZD0iTSAxLjMxNzY0IDAuMDE3ODA1OUwgMi43NTEwMiAzLjg1NDk5QyAyLjkwMjM3IDQuMjgyMzMgMy4wNjI2MiA0Ljc5ODcgMy4xNjk0NiA1LjE4MTUzQyAzLjI5NDEgNC43ODk4IDMuNDI3NjQgNC4yOTEyMyAzLjU4NzkgMy44MjgyOEwgNC44ODc3MyAwLjAxNzgwNTlMIDYuMTQzMDUgMC4wMTc4MDU5TCA0LjM2MjQ2IDQuNjQ3MzVDIDMuNDcyMTYgNi44NzMwOSAyLjkyOTA4IDguMDIxNTggMi4xMSA4LjcxNjAxQyAxLjY5NzQ1IDkuMDkyODMgMS4xOTQ0OCA5LjM1NjU4IDAuNjQ5OTE3IDkuNDgxNjZMIDAuMzU2MTE5IDguNDg0NTNDIDAuNzM2ODg2IDguMzU5NDIgMS4wOTAzOCA4LjE2MzA0IDEuMzk3NzcgNy45MDU4NEMgMS44MzIxIDcuNTUxODggMi4xNzY3OCA3LjEwMDQ0IDIuNDAzOCA2LjU4ODJDIDIuNDUyMzkgNi40OTk0OSAyLjQ4NTUxIDYuNDAzMTQgMi41MDE3MyA2LjMwMzNDIDIuNDkxNjEgNi4xOTU4NiAyLjQ2NDU3IDYuMDkwNyAyLjQyMTYxIDUuOTkxN0wgMCAwTCAxLjI5OTgzIDBMIDEuMzE3NjQgMC4wMTc4MDU5WiIvPgo8cGF0aCBpZD0icGF0aDRfZmlsbCIgZD0iTSAyLjE5MDEzIDBMIDIuMTkwMTMgMS44Njk2MkwgMy44OTk1IDEuODY5NjJMIDMuODk5NSAyLjc1OTkyTCAyLjE5MDEzIDIuNzU5OTJMIDIuMTkwMTMgNi4yNjc2OUMgMi4xOTAxMyA3LjA2ODk2IDIuNDIxNjEgNy41MzE5MSAzLjA4MDQzIDcuNTMxOTFDIDMuMzE0NDIgNy41MzU3NCAzLjU0Nzg5IDcuNTA4OCAzLjc3NDg2IDcuNDUxNzlMIDMuODI4MjggOC4zNDIwOEMgMy40ODc5NCA4LjQ1OTk5IDMuMTI4ODEgOC41MTQzMSAyLjc2ODgyIDguNTAyMzRDIDIuNTMwNDIgOC41MTcyNiAyLjI5MTYxIDguNDgwNDMgMi4wNjg3OCA4LjM5NDM3QyAxLjg0NTk1IDguMzA4MzEgMS42NDQzOCA4LjE3NTA2IDEuNDc3ODkgOC4wMDM3N0MgMS4xMTUyNSA3LjUxODczIDAuOTQ5ODI2IDYuOTE0MzEgMS4wMTQ5NCA2LjMxMjIxTCAxLjAxNDk0IDIuNzUxMDJMIDAgMi43NTEwMkwgMCAxLjg2MDcyTCAxLjAzMjc0IDEuODYwNzJMIDEuMDMyNzQgMC4yNzU5OTJMIDIuMTkwMTMgMFoiLz4KPHBhdGggaWQ9InBhdGg1X2ZpbGwiIGQ9Ik0gMS4xNzcxNiAzLjU3ODk5QyAxLjE1MyAzLjg4MDkzIDEuMTk0NjggNC4xODQ1MSAxLjI5OTMzIDQuNDY4NzZDIDEuNDAzOTggNC43NTMwMSAxLjU2OTEgNS4wMTExNCAxLjc4MzI5IDUuMjI1MzJDIDEuOTk3NDcgNS40Mzk1MSAyLjI1NTYgNS42MDQ2MyAyLjUzOTg1IDUuNzA5MjhDIDIuODI0MSA1LjgxMzkzIDMuMTI3NjggNS44NTU2MSAzLjQyOTYyIDUuODMxNDVDIDQuMDQwMzMgNS44NDUxMSA0LjY0NzA2IDUuNzI5ODMgNS4yMTAyMSA1LjQ5MzEzTCA1LjQxNDk4IDYuMzgzNDNDIDQuNzIzOTMgNi42NjgwOSAzLjk4MDg1IDYuODA0NTggMy4yMzM3NSA2Ljc4NDA2QyAyLjc5ODIxIDYuODEzODggMi4zNjEzOCA2Ljc0OTE0IDEuOTUzMjIgNi41OTQyN0MgMS41NDUwNSA2LjQzOTQxIDEuMTc1MjIgNi4xOTgwOSAwLjg2OTA3MSA1Ljg4Njg4QyAwLjU2MjkyOCA1LjU3NTY2IDAuMzI3NzIzIDUuMjAxOSAwLjE3OTU5MSA0Ljc5MTI1QyAwLjAzMTQ1ODQgNC4zODA1OSAtMC4wMjYwOTYyIDMuOTQyNzYgMC4wMTA4NzQ4IDMuNTA3NzdDIDAuMDEwODc0OCAxLjU0OTEyIDEuMTc3MTYgMCAzLjA4MjQgMEMgNS4yMTkxMSAwIDUuNzUzMjkgMS44Njk2MiA1Ljc1MzI5IDMuMDYyNjJDIDUuNzY0NzEgMy4yNDY0NCA1Ljc2NDcxIDMuNDMwNzkgNS43NTMyOSAzLjYxNDYxTCAxLjE1MDQ2IDMuNjE0NjFMIDEuMTc3MTYgMy41Nzg5OVpNIDQuNjY3MTMgMi42ODg3QyA0LjcwMTQ5IDIuNDUwNjcgNC42ODQ0MyAyLjIwODA1IDQuNjE3MDkgMS45NzcxOEMgNC41NDk3NiAxLjc0NjMxIDQuNDMzNzIgMS41MzI1NSA0LjI3NjggMS4zNTAzMUMgNC4xMTk4NyAxLjE2ODA4IDMuOTI1NzEgMS4wMjE2IDMuNzA3MzkgMC45MjA3NDRDIDMuNDg5MDcgMC44MTk4OSAzLjI1MTY2IDAuNzY3MDA2IDMuMDExMTggMC43NjU2NTZDIDIuNTIyMDEgMC44MDEwNjQgMi4wNjM3MSAxLjAxNzg4IDEuNzI2MDkgMS4zNzM2MkMgMS4zODg0NyAxLjcyOTM1IDEuMTk1ODggMi4xOTgzNSAxLjE4NjA3IDIuNjg4N0wgNC42NjcxMyAyLjY4ODdaIi8+CjxwYXRoIGlkPSJwYXRoNl9maWxsIiBkPSJNIDAuMDUzNDE3OCAyLjE5MjI4QyAwLjA1MzQxNzggMS40MjY2MyAwLjA1MzQxNzggMC43Njc4MDYgMCAwLjE2MjQwNEwgMS4wNjgzNiAwLjE2MjQwNEwgMS4wNjgzNiAxLjQzNTUzTCAxLjEyMTc3IDEuNDM1NTNDIDEuMjMzOTEgMS4wNDI1OSAxLjQ2NTYgMC42OTQzMTQgMS43ODQ2OCAwLjQzOTA0OUMgMi4xMDM3NiAwLjE4Mzc4MyAyLjQ5NDQgMC4wMzQxOTYgMi45MDIzNyAwLjAxMTA1MzhDIDMuMDE0NjYgLTAuMDAzNjg0NTkgMy4xMjgzOSAtMC4wMDM2ODQ1OSAzLjI0MDY4IDAuMDExMDUzOEwgMy4yNDA2OCAxLjEyMzkzQyAzLjEwNDYyIDEuMTA4MTcgMi45NjcyIDEuMTA4MTcgMi44MzExNCAxLjEyMzkzQyAyLjQyNyAxLjEzOTU4IDIuMDQyMzcgMS4zMDE4MiAxLjc0OTEgMS41ODAzNUMgMS40NTU4MyAxLjg1ODg3IDEuMjczOTggMi4yMzQ2MiAxLjIzNzUxIDIuNjM3NDNDIDEuMjA0MjIgMi44MTk2IDEuMTg2MzUgMy4wMDQyNSAxLjE4NDEgMy4xODk0MUwgMS4xODQxIDYuNjUyNjdMIDAuMDA4OTAyOTcgNi42NTI2N0wgMC4wMDg5MDI5NyAyLjIwMTE4TCAwLjA1MzQxNzggMi4xOTIyOFoiLz4KPHBhdGggaWQ9InBhdGg3X2ZpbGwiIGQ9Ik0gNi4wMzA1OSAyLjgzNTY1QyA2LjA2NzE1IDMuNDMzNzYgNS45MjQ4NSA0LjAyOTIxIDUuNjIxOCA0LjU0NjE1QyA1LjMxODc1IDUuMDYzMSA0Ljg2ODY5IDUuNDc4MTMgNC4zMjg5MyA1LjczODM5QyAzLjc4OTE3IDUuOTk4NjQgMy4xODQxNiA2LjA5MjMzIDIuNTkwOTcgNi4wMDc1M0MgMS45OTc3OCA1LjkyMjcyIDEuNDQzMjYgNS42NjMyNiAwLjk5ODA0OCA1LjI2MjE5QyAwLjU1MjgzNyA0Ljg2MTEzIDAuMjM3MDkgNC4zMzY2MSAwLjA5MTAzMDcgMy43NTU0NkMgLTAuMDU1MDI4NyAzLjE3NDMxIC0wLjAyNDc4OTEgMi41NjI4MyAwLjE3Nzg5NyAxLjk5ODkzQyAwLjM4MDU4MyAxLjQzNTAzIDAuNzQ2NTQxIDAuOTQ0MjIxIDEuMjI5MTUgMC41ODkwMzdDIDEuNzExNzYgMC4yMzM4NTMgMi4yODkxOCAwLjAzMDM2ODYgMi44ODc4NCAwLjAwNDUwNTQzQyAzLjI4MDM1IC0wLjAxNzA5MzIgMy42NzMyNiAwLjAzOTExNDQgNC4wNDM5NiAwLjE2OTg5NkMgNC40MTQ2NyAwLjMwMDY3NyA0Ljc1NTg3IDAuNTAzNDUzIDUuMDQ3OTQgMC43NjY1NjFDIDUuMzQgMS4wMjk2NyA1LjU3NzE4IDEuMzQ3OTIgNS43NDU4MiAxLjcwMzAxQyA1LjkxNDQ2IDIuMDU4MSA2LjAxMTI0IDIuNDQzMDMgNi4wMzA1OSAyLjgzNTY1TCA2LjAzMDU5IDIuODM1NjVaIi8+CjxwYXRoIGlkPSJwYXRoOF9maWxsIiBkPSJNIDE4LjY5NjIgNy4xMjIzOEMgMTAuNjgzNiA3LjEyMjM4IDMuNjQxMzEgNC4yNDY3MiAwIDBDIDEuNDEyODQgMy44MjA0MSAzLjk2MjE1IDcuMTE2MyA3LjMwNDc5IDkuNDQ0MDRDIDEwLjY0NzQgMTEuNzcxOCAxNC42MjMgMTMuMDE5NiAxOC42OTYyIDEzLjAxOTZDIDIyLjc2OTUgMTMuMDE5NiAyNi43NDUgMTEuNzcxOCAzMC4wODc3IDkuNDQ0MDRDIDMzLjQzMDMgNy4xMTYzIDM1Ljk3OTYgMy44MjA0MSAzNy4zOTI1IDQuMDQ4NmUtMTNDIDMzLjc2MDEgNC4yNDY3MiAyNi43NDQ1IDcuMTIyMzggMTguNjk2MiA3LjEyMjM4WiIvPgo8cGF0aCBpZD0icGF0aDlfZmlsbCIgZD0iTSAxOC42OTYyIDUuODk3MjVDIDI2LjcwODkgNS44OTcyNSAzMy43NTEyIDguNzcyOTEgMzcuMzkyNSAxMy4wMTk2QyAzNS45Nzk2IDkuMTk5MjIgMzMuNDMwMyA1LjkwMzMzIDMwLjA4NzcgMy41NzU1OUMgMjYuNzQ1IDEuMjQ3ODUgMjIuNzY5NSA0LjA0ODZlLTEzIDE4LjY5NjIgMEMgMTQuNjIzIDQuMDQ4NmUtMTMgMTAuNjQ3NCAxLjI0Nzg1IDcuMzA0NzkgMy41NzU1OUMgMy45NjIxNSA1LjkwMzMzIDEuNDEyODQgOS4xOTkyMiAwIDEzLjAxOTZDIDMuNjQxMzEgOC43NjQwMSAxMC42NDggNS44OTcyNSAxOC42OTYyIDUuODk3MjVaIi8+CjxwYXRoIGlkPSJwYXRoMTBfZmlsbCIgZD0iTSA3LjU5NTc2IDMuNTY2NTZDIDcuNjQyNzYgNC4zMTk5MiA3LjQ2NDQyIDUuMDcwMjIgNy4wODM0NyA1LjcyMTg2QyA2LjcwMjUxIDYuMzczNSA2LjEzNjE5IDYuODk2OTggNS40NTY2NiA3LjIyNTYxQyA0Ljc3NzEzIDcuNTU0MjQgNC4wMTUxNSA3LjY3MzE0IDMuMjY3ODEgNy41NjcxNkMgMi41MjA0NiA3LjQ2MTE3IDEuODIxNTggNy4xMzUxMSAxLjI2MDIxIDYuNjMwNTFDIDAuNjk4ODM5IDYuMTI1OTEgMC4zMDAzOTQgNS40NjU2MSAwLjExNTYzNyA0LjczMzc1QyAtMC4wNjkxMTkxIDQuMDAxODggLTAuMDMxODIxOSAzLjIzMTU5IDAuMjIyNzc3IDIuNTIwOTlDIDAuNDc3Mzc2IDEuODEwNCAwLjkzNzc1IDEuMTkxNjkgMS41NDUyNCAwLjc0MzY4NUMgMi4xNTI3NCAwLjI5NTY3OCAyLjg3OTg1IDAuMDM4NjU5NSAzLjYzMzk0IDAuMDA1Mzc1ODlDIDQuMTI3OTMgLTAuMDIxMDQ3MSA0LjYyMjI5IDAuMDUwMTE3MyA1LjA4ODc4IDAuMjE0ODAzQyA1LjU1NTI2IDAuMzc5NDkgNS45ODQ3MyAwLjYzNDQ3IDYuMzUyNjQgMC45NjUxNzlDIDYuNzIwNTUgMS4yOTU4OSA3LjAxOTcxIDEuNjk1ODQgNy4yMzMgMi4xNDIyQyA3LjQ0NjMgMi41ODg1NSA3LjU2OTU3IDMuMDcyNTYgNy41OTU3NiAzLjU2NjU2TCA3LjU5NTc2IDMuNTY2NTZaIi8+CjxwYXRoIGlkPSJwYXRoMTFfZmlsbCIgZD0iTSAyLjI1MDYxIDQuMzc5NDNDIDEuODE4ODYgNC4zOTEzNSAxLjM5MzIyIDQuMjc1MzUgMS4wMjcyMiA0LjA0NjAyQyAwLjY2MTIyNCAzLjgxNjY4IDAuMzcxMjA2IDMuNDg0MjQgMC4xOTM2NDEgMy4wOTA1MkMgMC4wMTYwNzYyIDIuNjk2NzkgLTAuMDQxMTA3OCAyLjI1OTM1IDAuMDI5MjgwNCAxLjgzMzIxQyAwLjA5OTY2ODYgMS40MDcwNyAwLjI5NDQ4NiAxLjAxMTI1IDAuNTg5MjMzIDAuNjk1NTQyQyAwLjg4Mzk4MSAwLjM3OTgzIDEuMjY1NSAwLjE1ODMxNiAxLjY4NTgxIDAuMDU4ODU3N0MgMi4xMDYxMSAtMC4wNDA2MDA1IDIuNTQ2NDQgLTAuMDEzNTYyMiAyLjk1MTQzIDAuMTM2NTcyQyAzLjM1NjQxIDAuMjg2NzA3IDMuNzA3OTYgMC41NTMyMzQgMy45NjE4NiAwLjkwMjYzNkMgNC4yMTU3NyAxLjI1MjA0IDQuMzYwNyAxLjY2ODcyIDQuMzc4NDIgMi4xMDAyN0MgNC4zOTUyOSAyLjY4MzggNC4xODEzMSAzLjI1MDQ0IDMuNzgyOTMgMy42NzcxNUMgMy4zODQ1NSA0LjEwMzg3IDIuODMzOTIgNC4zNTYyMyAyLjI1MDYxIDQuMzc5NDNaIi8+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"jupyter,jupyter\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.jupyter\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.20.04\"\nENV ARGS=\"--disable-factory  --class=jupyter -- /usr/local/bin/startjupyter.sh\"\nLABEL oc.name=\"jupyter\"\nLABEL oc.displayname=\"jupyter\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"jupyter\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=jupyter -- /usr/local/bin/startjupyter.sh\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/jupyter/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/jupyter/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application jupyter

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyter.d\n
"},{"location":"applications/jupyter/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f jupyter.d -t jupyter .\n
"},{"location":"applications/jupyter/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect jupyter > jupyter.json\ndocker image save jupyter -o jupyter.tar\nctr -n k8s.io images import jupyter.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyter.json\n\n
"},{"location":"applications/jupyternvidia/","title":"jupyternvidia","text":""},{"location":"applications/jupyternvidia/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.nvidia.22.04

"},{"location":"applications/jupyternvidia/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/jupyternvidia/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
"},{"location":"applications/jupyternvidia/#arguments","title":"Arguments","text":"

\"--disable-factory --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"

"},{"location":"applications/jupyternvidia/#displayname","title":"Displayname","text":"
jupyter nvidia\n
"},{"location":"applications/jupyternvidia/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/jupyternvidia/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/jupyternvidia/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/jupyternvidia/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.jupyternvidia\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/jupyternvidia/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/jupyternvidia/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\nCOPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\nRUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\nRUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\nENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\nRUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\nRUN pip3 install torch\nRUN pip3 install tensorflow-gpu\nRUN pip3 install jupyter notebook\nRUN pip3 install jupyterlab\nRUN pip3 install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\n
"},{"location":"applications/jupyternvidia/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\n
"},{"location":"applications/jupyternvidia/#json-dump","title":"JSON dump","text":"

json source file jupyternvidia.d.3.0.json

{\n    \"comment\": \"https://stackoverflow.com/questions/51002045/how-to-make-jupyter-notebook-to-run-on-gpu\",\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN add-apt-repository ppa:mozillateam/ppa\",\n        \"COPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\",\n        \"COPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\",\n        \"RUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\",\n        \"ENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\n        \"ENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\",\n        \"RUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\",\n        \"RUN pip3 install torch\",\n        \"RUN pip3 install tensorflow-gpu\",\n        \"RUN pip3 install jupyter notebook\",\n        \"RUN pip3 install jupyterlab\",\n        \"RUN pip3 install jupyterlab-nvdashboard\",\n        \"RUN # jupyter labextension install jupyterlab-nvdashboard\"\n    ],\n    \"debpackage\": \"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n    \"icon\": \"jupyter.svg\",\n    \"keyword\": \"jupyter\",\n    \"launch\": \"gnome-terminal-server.jupyternvidia\",\n    \"name\": \"jupyternvidia\",\n    \"displayname\": \"jupyter nvidia\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\",\n        \"COPY startjupyter.sh /usr/local/bin/startjupyter.sh\"\n    ]\n}\n
"},{"location":"applications/jupyternvidia/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output jupyternvidia.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyternvidia.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyternvidia.d.3.0.json\n\n
"},{"location":"applications/jupyternvidia/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\nCOPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\nRUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\nRUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\nENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\nRUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\nRUN pip3 install torch\nRUN pip3 install tensorflow-gpu\nRUN pip3 install jupyter notebook\nRUN pip3 install jupyterlab\nRUN pip3 install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"jupyter.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDQiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCA0NCA1MSIgdmVyc2lvbj0iMi4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpmaWdtYT0iaHR0cDovL3d3dy5maWdtYS5jb20vZmlnbWEvbnMiPgo8dGl0bGU+R3JvdXAuc3ZnPC90aXRsZT4KPGRlc2M+Q3JlYXRlZCB1c2luZyBGaWdtYSAwLjkwPC9kZXNjPgo8ZyBpZD0iQ2FudmFzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0MCAtMjQ1MykiIGZpZ21hOnR5cGU9ImNhbnZhcyI+CjxnIGlkPSJHcm91cCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9Ikdyb3VwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0iR3JvdXAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGg5IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoMF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQwLjU0IDI0NzQuMzYpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTAgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGgxX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDUuNjggMjQ3NC4zNykiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxMSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDJfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY1My4zOSAyNDc0LjI2KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDEyIGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoM19maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjYwLjQzIDI0NzQuMzkpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTMgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg0X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NjcuNTUgMjQ3Mi41NCkiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDVfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3Mi40NyAyNDc0LjI5KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE1IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoNl9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjc5Ljk4IDI0NzQuMjQpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNiBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDdfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3My40OCAyNDUzLjY5KSIgZmlsbD0iIzc2NzY3NyIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE3IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoOF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQzLjIxIDI0ODQuMjcpIiBmaWxsPSIjRjM3NzI2IiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTggZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg5X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjEgMjQ1Ny44OCkiIGZpbGw9IiNGMzc3MjYiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxOSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDEwX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjggMjQ5Ni4wOSkiIGZpbGw9IiM5RTlFOUUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgyMCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDExX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDEuODcgMjQ1OC40MykiIGZpbGw9IiM2MTYyNjIiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxkZWZzPgo8cGF0aCBpZD0icGF0aDBfZmlsbCIgZD0iTSAxLjc0NDk4IDUuNDc1MzNDIDEuNzQ0OTggNy4wMzMzNSAxLjYyMDM0IDcuNTQwODIgMS4yOTk4MyA3LjkxNDc0QyAwLjk0MzExOSA4LjIzNTk1IDAuNDgwMDI0IDguNDEzNTggMCA4LjQxMzMxTCAwLjEyNDY0MiA5LjMwMzZDIDAuODY4ODQgOS4zMTM2NiAxLjU5MDk1IDkuMDUwNzggMi4xNTQ1MiA4LjU2NDY2QyAyLjQ1Nzc1IDguMTk0ODcgMi42ODM0IDcuNzY3ODEgMi44MTggNy4zMDg5M0MgMi45NTI2MSA2Ljg1MDA1IDIuOTkzNDEgNi4zNjg3NiAyLjkzNzk4IDUuODkzNzdMIDIuOTM3OTggMEwgMS43NDQ5OCAwTCAxLjc0NDk4IDUuNDM5NzJMIDEuNzQ0OTggNS40NzUzM1oiLz4KPHBhdGggaWQ9InBhdGgxX2ZpbGwiIGQ9Ik0gNS41MDIwNCA0Ljc2MzA5QyA1LjUwMjA0IDUuNDMwODEgNS41MDIwNCA2LjAyNzMxIDUuNTU1NDUgNi41NDM2OEwgNC40OTYgNi41NDM2OEwgNC40MjQ3OCA1LjQ4NDIzQyA0LjIwMzE4IDUuODU5MDkgMy44ODYyNyA2LjE2ODU4IDMuNTA2MjggNi4zODEyNUMgMy4xMjYyOCA2LjU5MzkyIDIuNjk2NzUgNi43MDIxOSAyLjI2MTM1IDYuNjk1MDNDIDEuMjI4NjEgNi42OTUwMyAwIDYuMTM0MTUgMCAzLjg0NjA4TCAwIDAuMDQ0NTE0OUwgMS4xOTMgMC4wNDQ1MTQ5TCAxLjE5MyAzLjYwNTdDIDEuMTkzIDQuODQzMjIgMS41NzU4MyA1LjY3MTE5IDIuNjUzMDkgNS42NzExOUMgMi44NzQ3MiA1LjY3MzU4IDMuMDk0NTkgNS42MzE2OCAzLjI5OTgyIDUuNTQ3OTZDIDMuNTA1MDUgNS40NjQyNCAzLjY5MTQ5IDUuMzQwMzkgMy44NDgyMiA1LjE4MzY2QyA0LjAwNDk0IDUuMDI2OTQgNC4xMjg4IDQuODQwNDkgNC4yMTI1MiA0LjYzNTI3QyA0LjI5NjIzIDQuNDMwMDQgNC4zMzgxMyA0LjIxMDE2IDQuMzM1NzUgMy45ODg1M0wgNC4zMzU3NSAwTCA1LjUyODc0IDBMIDUuNTI4NzQgNC43Mjc0OEwgNS41MDIwNCA0Ljc2MzA5WiIvPgo8cGF0aCBpZD0icGF0aDJfZmlsbCIgZD0iTSAwLjA1MzQxNzggMi4yNzI2NEMgMC4wNTM0MTc4IDEuNDQ0NjYgMC4wNTM0MTc4IDAuNzY4MDM2IDAgMC4xNTM3MzFMIDEuMDY4MzYgMC4xNTM3MzFMIDEuMTIxNzcgMS4yNjY2QyAxLjM1OTggMC44NjQ1MzUgMS43MDI0NyAwLjUzNDU5NCAyLjExMzI1IDAuMzExOTU0QyAyLjUyNDA0IDAuMDg5MzE0NSAyLjk4NzU0IC0wLjAxNzY3ODYgMy40NTQzNSAwLjAwMjM4MDk1QyA1LjAzOTA4IDAuMDAyMzgwOTUgNi4yMzIwOCAxLjMyODkyIDYuMjMyMDggMy4zMDUzOEMgNi4yMzIwOCA1LjYzNzk2IDQuNzk4NyA2Ljc5NTM1IDMuMjQ5NTggNi43OTUzNUMgMi44NTMwOSA2LjgxMzA0IDIuNDU4NzQgNi43MjgxIDIuMTA0NjkgNi41NDg3NEMgMS43NTA2NCA2LjM2OTM3IDEuNDQ4ODggNi4xMDE2NiAxLjIyODYxIDUuNzcxNTFMIDEuMjI4NjEgNS43NzE1MUwgMS4yMjg2MSA5LjMzMjY5TCAwLjA1MzQxNzggOS4zMzI2OUwgMC4wNTM0MTc4IDIuMjk5MzVMIDAuMDUzNDE3OCAyLjI3MjY0Wk0gMS4yMjg2MSA0LjAwODcyQyAxLjIzMTg0IDQuMTcwMjYgMS4yNDk3MiA0LjMzMTE3IDEuMjgyMDMgNC40ODk0OEMgMS4zODMwNCA0Ljg4NDc5IDEuNjEyOTkgNS4yMzUxMyAxLjkzNTQ4IDUuNDg1MDZDIDIuMjU3OTggNS43MzUgMi42NTQ2MSA1Ljg3MDI2IDMuMDYyNjIgNS44Njk0NEMgNC4zMTc5NCA1Ljg2OTQ0IDUuMDU2ODkgNC44NDU2IDUuMDU2ODkgMy4zNTg4QyA1LjA1Njg5IDIuMDU4OTcgNC4zNjI0NiAwLjk0NjA5NiAzLjEwNzE0IDAuOTQ2MDk2QyAyLjYxMDM2IDAuOTg2Nzc3IDIuMTQ1NDggMS4yMDcyNiAxLjc5OTY1IDEuNTY2MkMgMS40NTM4MiAxLjkyNTE0IDEuMjUwNzkgMi4zOTc5IDEuMjI4NjEgMi44OTU4NUwgMS4yMjg2MSA0LjAwODcyWiIvPgo8cGF0aCBpZD0icGF0aDNfZmlsbCIgZD0iTSAxLjMxNzY0IDAuMDE3ODA1OUwgMi43NTEwMiAzLjg1NDk5QyAyLjkwMjM3IDQuMjgyMzMgMy4wNjI2MiA0Ljc5ODcgMy4xNjk0NiA1LjE4MTUzQyAzLjI5NDEgNC43ODk4IDMuNDI3NjQgNC4yOTEyMyAzLjU4NzkgMy44MjgyOEwgNC44ODc3MyAwLjAxNzgwNTlMIDYuMTQzMDUgMC4wMTc4MDU5TCA0LjM2MjQ2IDQuNjQ3MzVDIDMuNDcyMTYgNi44NzMwOSAyLjkyOTA4IDguMDIxNTggMi4xMSA4LjcxNjAxQyAxLjY5NzQ1IDkuMDkyODMgMS4xOTQ0OCA5LjM1NjU4IDAuNjQ5OTE3IDkuNDgxNjZMIDAuMzU2MTE5IDguNDg0NTNDIDAuNzM2ODg2IDguMzU5NDIgMS4wOTAzOCA4LjE2MzA0IDEuMzk3NzcgNy45MDU4NEMgMS44MzIxIDcuNTUxODggMi4xNzY3OCA3LjEwMDQ0IDIuNDAzOCA2LjU4ODJDIDIuNDUyMzkgNi40OTk0OSAyLjQ4NTUxIDYuNDAzMTQgMi41MDE3MyA2LjMwMzNDIDIuNDkxNjEgNi4xOTU4NiAyLjQ2NDU3IDYuMDkwNyAyLjQyMTYxIDUuOTkxN0wgMCAwTCAxLjI5OTgzIDBMIDEuMzE3NjQgMC4wMTc4MDU5WiIvPgo8cGF0aCBpZD0icGF0aDRfZmlsbCIgZD0iTSAyLjE5MDEzIDBMIDIuMTkwMTMgMS44Njk2MkwgMy44OTk1IDEuODY5NjJMIDMuODk5NSAyLjc1OTkyTCAyLjE5MDEzIDIuNzU5OTJMIDIuMTkwMTMgNi4yNjc2OUMgMi4xOTAxMyA3LjA2ODk2IDIuNDIxNjEgNy41MzE5MSAzLjA4MDQzIDcuNTMxOTFDIDMuMzE0NDIgNy41MzU3NCAzLjU0Nzg5IDcuNTA4OCAzLjc3NDg2IDcuNDUxNzlMIDMuODI4MjggOC4zNDIwOEMgMy40ODc5NCA4LjQ1OTk5IDMuMTI4ODEgOC41MTQzMSAyLjc2ODgyIDguNTAyMzRDIDIuNTMwNDIgOC41MTcyNiAyLjI5MTYxIDguNDgwNDMgMi4wNjg3OCA4LjM5NDM3QyAxLjg0NTk1IDguMzA4MzEgMS42NDQzOCA4LjE3NTA2IDEuNDc3ODkgOC4wMDM3N0MgMS4xMTUyNSA3LjUxODczIDAuOTQ5ODI2IDYuOTE0MzEgMS4wMTQ5NCA2LjMxMjIxTCAxLjAxNDk0IDIuNzUxMDJMIDAgMi43NTEwMkwgMCAxLjg2MDcyTCAxLjAzMjc0IDEuODYwNzJMIDEuMDMyNzQgMC4yNzU5OTJMIDIuMTkwMTMgMFoiLz4KPHBhdGggaWQ9InBhdGg1X2ZpbGwiIGQ9Ik0gMS4xNzcxNiAzLjU3ODk5QyAxLjE1MyAzLjg4MDkzIDEuMTk0NjggNC4xODQ1MSAxLjI5OTMzIDQuNDY4NzZDIDEuNDAzOTggNC43NTMwMSAxLjU2OTEgNS4wMTExNCAxLjc4MzI5IDUuMjI1MzJDIDEuOTk3NDcgNS40Mzk1MSAyLjI1NTYgNS42MDQ2MyAyLjUzOTg1IDUuNzA5MjhDIDIuODI0MSA1LjgxMzkzIDMuMTI3NjggNS44NTU2MSAzLjQyOTYyIDUuODMxNDVDIDQuMDQwMzMgNS44NDUxMSA0LjY0NzA2IDUuNzI5ODMgNS4yMTAyMSA1LjQ5MzEzTCA1LjQxNDk4IDYuMzgzNDNDIDQuNzIzOTMgNi42NjgwOSAzLjk4MDg1IDYuODA0NTggMy4yMzM3NSA2Ljc4NDA2QyAyLjc5ODIxIDYuODEzODggMi4zNjEzOCA2Ljc0OTE0IDEuOTUzMjIgNi41OTQyN0MgMS41NDUwNSA2LjQzOTQxIDEuMTc1MjIgNi4xOTgwOSAwLjg2OTA3MSA1Ljg4Njg4QyAwLjU2MjkyOCA1LjU3NTY2IDAuMzI3NzIzIDUuMjAxOSAwLjE3OTU5MSA0Ljc5MTI1QyAwLjAzMTQ1ODQgNC4zODA1OSAtMC4wMjYwOTYyIDMuOTQyNzYgMC4wMTA4NzQ4IDMuNTA3NzdDIDAuMDEwODc0OCAxLjU0OTEyIDEuMTc3MTYgMCAzLjA4MjQgMEMgNS4yMTkxMSAwIDUuNzUzMjkgMS44Njk2MiA1Ljc1MzI5IDMuMDYyNjJDIDUuNzY0NzEgMy4yNDY0NCA1Ljc2NDcxIDMuNDMwNzkgNS43NTMyOSAzLjYxNDYxTCAxLjE1MDQ2IDMuNjE0NjFMIDEuMTc3MTYgMy41Nzg5OVpNIDQuNjY3MTMgMi42ODg3QyA0LjcwMTQ5IDIuNDUwNjcgNC42ODQ0MyAyLjIwODA1IDQuNjE3MDkgMS45NzcxOEMgNC41NDk3NiAxLjc0NjMxIDQuNDMzNzIgMS41MzI1NSA0LjI3NjggMS4zNTAzMUMgNC4xMTk4NyAxLjE2ODA4IDMuOTI1NzEgMS4wMjE2IDMuNzA3MzkgMC45MjA3NDRDIDMuNDg5MDcgMC44MTk4OSAzLjI1MTY2IDAuNzY3MDA2IDMuMDExMTggMC43NjU2NTZDIDIuNTIyMDEgMC44MDEwNjQgMi4wNjM3MSAxLjAxNzg4IDEuNzI2MDkgMS4zNzM2MkMgMS4zODg0NyAxLjcyOTM1IDEuMTk1ODggMi4xOTgzNSAxLjE4NjA3IDIuNjg4N0wgNC42NjcxMyAyLjY4ODdaIi8+CjxwYXRoIGlkPSJwYXRoNl9maWxsIiBkPSJNIDAuMDUzNDE3OCAyLjE5MjI4QyAwLjA1MzQxNzggMS40MjY2MyAwLjA1MzQxNzggMC43Njc4MDYgMCAwLjE2MjQwNEwgMS4wNjgzNiAwLjE2MjQwNEwgMS4wNjgzNiAxLjQzNTUzTCAxLjEyMTc3IDEuNDM1NTNDIDEuMjMzOTEgMS4wNDI1OSAxLjQ2NTYgMC42OTQzMTQgMS43ODQ2OCAwLjQzOTA0OUMgMi4xMDM3NiAwLjE4Mzc4MyAyLjQ5NDQgMC4wMzQxOTYgMi45MDIzNyAwLjAxMTA1MzhDIDMuMDE0NjYgLTAuMDAzNjg0NTkgMy4xMjgzOSAtMC4wMDM2ODQ1OSAzLjI0MDY4IDAuMDExMDUzOEwgMy4yNDA2OCAxLjEyMzkzQyAzLjEwNDYyIDEuMTA4MTcgMi45NjcyIDEuMTA4MTcgMi44MzExNCAxLjEyMzkzQyAyLjQyNyAxLjEzOTU4IDIuMDQyMzcgMS4zMDE4MiAxLjc0OTEgMS41ODAzNUMgMS40NTU4MyAxLjg1ODg3IDEuMjczOTggMi4yMzQ2MiAxLjIzNzUxIDIuNjM3NDNDIDEuMjA0MjIgMi44MTk2IDEuMTg2MzUgMy4wMDQyNSAxLjE4NDEgMy4xODk0MUwgMS4xODQxIDYuNjUyNjdMIDAuMDA4OTAyOTcgNi42NTI2N0wgMC4wMDg5MDI5NyAyLjIwMTE4TCAwLjA1MzQxNzggMi4xOTIyOFoiLz4KPHBhdGggaWQ9InBhdGg3X2ZpbGwiIGQ9Ik0gNi4wMzA1OSAyLjgzNTY1QyA2LjA2NzE1IDMuNDMzNzYgNS45MjQ4NSA0LjAyOTIxIDUuNjIxOCA0LjU0NjE1QyA1LjMxODc1IDUuMDYzMSA0Ljg2ODY5IDUuNDc4MTMgNC4zMjg5MyA1LjczODM5QyAzLjc4OTE3IDUuOTk4NjQgMy4xODQxNiA2LjA5MjMzIDIuNTkwOTcgNi4wMDc1M0MgMS45OTc3OCA1LjkyMjcyIDEuNDQzMjYgNS42NjMyNiAwLjk5ODA0OCA1LjI2MjE5QyAwLjU1MjgzNyA0Ljg2MTEzIDAuMjM3MDkgNC4zMzY2MSAwLjA5MTAzMDcgMy43NTU0NkMgLTAuMDU1MDI4NyAzLjE3NDMxIC0wLjAyNDc4OTEgMi41NjI4MyAwLjE3Nzg5NyAxLjk5ODkzQyAwLjM4MDU4MyAxLjQzNTAzIDAuNzQ2NTQxIDAuOTQ0MjIxIDEuMjI5MTUgMC41ODkwMzdDIDEuNzExNzYgMC4yMzM4NTMgMi4yODkxOCAwLjAzMDM2ODYgMi44ODc4NCAwLjAwNDUwNTQzQyAzLjI4MDM1IC0wLjAxNzA5MzIgMy42NzMyNiAwLjAzOTExNDQgNC4wNDM5NiAwLjE2OTg5NkMgNC40MTQ2NyAwLjMwMDY3NyA0Ljc1NTg3IDAuNTAzNDUzIDUuMDQ3OTQgMC43NjY1NjFDIDUuMzQgMS4wMjk2NyA1LjU3NzE4IDEuMzQ3OTIgNS43NDU4MiAxLjcwMzAxQyA1LjkxNDQ2IDIuMDU4MSA2LjAxMTI0IDIuNDQzMDMgNi4wMzA1OSAyLjgzNTY1TCA2LjAzMDU5IDIuODM1NjVaIi8+CjxwYXRoIGlkPSJwYXRoOF9maWxsIiBkPSJNIDE4LjY5NjIgNy4xMjIzOEMgMTAuNjgzNiA3LjEyMjM4IDMuNjQxMzEgNC4yNDY3MiAwIDBDIDEuNDEyODQgMy44MjA0MSAzLjk2MjE1IDcuMTE2MyA3LjMwNDc5IDkuNDQ0MDRDIDEwLjY0NzQgMTEuNzcxOCAxNC42MjMgMTMuMDE5NiAxOC42OTYyIDEzLjAxOTZDIDIyLjc2OTUgMTMuMDE5NiAyNi43NDUgMTEuNzcxOCAzMC4wODc3IDkuNDQ0MDRDIDMzLjQzMDMgNy4xMTYzIDM1Ljk3OTYgMy44MjA0MSAzNy4zOTI1IDQuMDQ4NmUtMTNDIDMzLjc2MDEgNC4yNDY3MiAyNi43NDQ1IDcuMTIyMzggMTguNjk2MiA3LjEyMjM4WiIvPgo8cGF0aCBpZD0icGF0aDlfZmlsbCIgZD0iTSAxOC42OTYyIDUuODk3MjVDIDI2LjcwODkgNS44OTcyNSAzMy43NTEyIDguNzcyOTEgMzcuMzkyNSAxMy4wMTk2QyAzNS45Nzk2IDkuMTk5MjIgMzMuNDMwMyA1LjkwMzMzIDMwLjA4NzcgMy41NzU1OUMgMjYuNzQ1IDEuMjQ3ODUgMjIuNzY5NSA0LjA0ODZlLTEzIDE4LjY5NjIgMEMgMTQuNjIzIDQuMDQ4NmUtMTMgMTAuNjQ3NCAxLjI0Nzg1IDcuMzA0NzkgMy41NzU1OUMgMy45NjIxNSA1LjkwMzMzIDEuNDEyODQgOS4xOTkyMiAwIDEzLjAxOTZDIDMuNjQxMzEgOC43NjQwMSAxMC42NDggNS44OTcyNSAxOC42OTYyIDUuODk3MjVaIi8+CjxwYXRoIGlkPSJwYXRoMTBfZmlsbCIgZD0iTSA3LjU5NTc2IDMuNTY2NTZDIDcuNjQyNzYgNC4zMTk5MiA3LjQ2NDQyIDUuMDcwMjIgNy4wODM0NyA1LjcyMTg2QyA2LjcwMjUxIDYuMzczNSA2LjEzNjE5IDYuODk2OTggNS40NTY2NiA3LjIyNTYxQyA0Ljc3NzEzIDcuNTU0MjQgNC4wMTUxNSA3LjY3MzE0IDMuMjY3ODEgNy41NjcxNkMgMi41MjA0NiA3LjQ2MTE3IDEuODIxNTggNy4xMzUxMSAxLjI2MDIxIDYuNjMwNTFDIDAuNjk4ODM5IDYuMTI1OTEgMC4zMDAzOTQgNS40NjU2MSAwLjExNTYzNyA0LjczMzc1QyAtMC4wNjkxMTkxIDQuMDAxODggLTAuMDMxODIxOSAzLjIzMTU5IDAuMjIyNzc3IDIuNTIwOTlDIDAuNDc3Mzc2IDEuODEwNCAwLjkzNzc1IDEuMTkxNjkgMS41NDUyNCAwLjc0MzY4NUMgMi4xNTI3NCAwLjI5NTY3OCAyLjg3OTg1IDAuMDM4NjU5NSAzLjYzMzk0IDAuMDA1Mzc1ODlDIDQuMTI3OTMgLTAuMDIxMDQ3MSA0LjYyMjI5IDAuMDUwMTE3MyA1LjA4ODc4IDAuMjE0ODAzQyA1LjU1NTI2IDAuMzc5NDkgNS45ODQ3MyAwLjYzNDQ3IDYuMzUyNjQgMC45NjUxNzlDIDYuNzIwNTUgMS4yOTU4OSA3LjAxOTcxIDEuNjk1ODQgNy4yMzMgMi4xNDIyQyA3LjQ0NjMgMi41ODg1NSA3LjU2OTU3IDMuMDcyNTYgNy41OTU3NiAzLjU2NjU2TCA3LjU5NTc2IDMuNTY2NTZaIi8+CjxwYXRoIGlkPSJwYXRoMTFfZmlsbCIgZD0iTSAyLjI1MDYxIDQuMzc5NDNDIDEuODE4ODYgNC4zOTEzNSAxLjM5MzIyIDQuMjc1MzUgMS4wMjcyMiA0LjA0NjAyQyAwLjY2MTIyNCAzLjgxNjY4IDAuMzcxMjA2IDMuNDg0MjQgMC4xOTM2NDEgMy4wOTA1MkMgMC4wMTYwNzYyIDIuNjk2NzkgLTAuMDQxMTA3OCAyLjI1OTM1IDAuMDI5MjgwNCAxLjgzMzIxQyAwLjA5OTY2ODYgMS40MDcwNyAwLjI5NDQ4NiAxLjAxMTI1IDAuNTg5MjMzIDAuNjk1NTQyQyAwLjg4Mzk4MSAwLjM3OTgzIDEuMjY1NSAwLjE1ODMxNiAxLjY4NTgxIDAuMDU4ODU3N0MgMi4xMDYxMSAtMC4wNDA2MDA1IDIuNTQ2NDQgLTAuMDEzNTYyMiAyLjk1MTQzIDAuMTM2NTcyQyAzLjM1NjQxIDAuMjg2NzA3IDMuNzA3OTYgMC41NTMyMzQgMy45NjE4NiAwLjkwMjYzNkMgNC4yMTU3NyAxLjI1MjA0IDQuMzYwNyAxLjY2ODcyIDQuMzc4NDIgMi4xMDAyN0MgNC4zOTUyOSAyLjY4MzggNC4xODEzMSAzLjI1MDQ0IDMuNzgyOTMgMy42NzcxNUMgMy4zODQ1NSA0LjEwMzg3IDIuODMzOTIgNC4zNTYyMyAyLjI1MDYxIDQuMzc5NDNaIi8+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"jupyternvidia,jupyter\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.jupyternvidia\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"\nLABEL oc.name=\"jupyternvidia\"\nLABEL oc.displayname=\"jupyter nvidia\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"jupyternvidia\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/jupyternvidia/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/jupyternvidia/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application jupyternvidia

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyternvidia.d\n
"},{"location":"applications/jupyternvidia/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f jupyternvidia.d -t jupyternvidia .\n
"},{"location":"applications/jupyternvidia/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect jupyternvidia > jupyternvidia.json\ndocker image save jupyternvidia -o jupyternvidia.tar\nctr -n k8s.io images import jupyternvidia.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyternvidia.json\n\n
"},{"location":"applications/kalzium/","title":"Kalzium","text":""},{"location":"applications/kalzium/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/kalzium/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kalzium/#alpine-packages","title":"Alpine packages","text":"
kalzium\n
"},{"location":"applications/kalzium/#path","title":"Path","text":"
/usr/bin/kalzium\n
"},{"location":"applications/kalzium/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/kalzium/#wm_class","title":"WM_CLASS","text":"
kalzium.kalzium\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/kalzium/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.kde.kalzium.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/kalzium/#json-dump","title":"JSON dump","text":"

json source file kalzium.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"kalzium\",\n    \"icon\": \"kalzium.svg\",\n    \"keyword\": \"kalzium\",\n    \"launch\": \"kalzium.kalzium\",\n    \"name\": \"Kalzium\",\n    \"path\": \"/usr/bin/kalzium\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.kalzium.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/kalzium/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output kalzium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kalzium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kalzium.d.3.0.json\n\n
"},{"location":"applications/kalzium/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kalzium\nLABEL oc.icon=\"kalzium.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiCiAgIHdpZHRoPSIxMjgiCiAgIGhlaWdodD0iMTI4IgogICBpZD0ic3ZnMjQyNSIKICAgdmlld0JveD0iMCAwIDEyOCAxMjgiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnMyNDI4Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTk4NjEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMTk4NjMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNTAxOTYwODEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxOTg2NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE1MDAyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzQzYmFmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDE1MDA0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjk4NGZmO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAuNTE4NTE4NTEiCiAgICAgICAgIGlkPSJzdG9wMjU3MDEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwZjRmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxNTAwNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDEzMDU0Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEzMDU2IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojM2MzYzNjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMTMwNTgiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjA3MyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxMjA3NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzQ1NDU0NTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDEyMDc3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTAxMjUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzgzODM4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMTAxMjciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwZjBmMGY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMDEyOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyMDAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYWVhZWFlO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNzIwMiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJmMmYyZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjkyNTkyNTkxIgogICAgICAgICBpZD0ic3RvcDcyMDQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2MTYxNjE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A3MjA2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzE4NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A3MTg3IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmJmYmZiO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuMTUwMDAwMDEiCiAgICAgICAgIGlkPSJzdG9wNzE4OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2U5ZTllOTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjQ0OTk5OTk5IgogICAgICAgICBpZD0ic3RvcDcxOTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjOGM4Yzg7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC42NDk5OTk5OCIKICAgICAgICAgaWQ9InN0b3A3MTkzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojODA4MDgwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNzE5NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTI5MjkyO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNjIxMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzRkNGQ0ZDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjY4NTE4NTE5IgogICAgICAgICBpZD0ic3RvcDYyMTIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MjE0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE4NiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjY2RhZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MTg4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTg4NWZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzIwNTYwOTciCiAgICAgICAgIGlkPSJzdG9wNTE5MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMGViMTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDUxOTIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTc0Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDUxNzYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmYmZiZmI7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4xOTgwNDUyNSIKICAgICAgICAgaWQ9InN0b3A1MTc4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDdlNWZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNDQiCiAgICAgICAgIGlkPSJzdG9wNTE4MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izk3YzZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjY5ODA0NTI1IgogICAgICAgICBpZD0ic3RvcDUxODIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2Mzk2ZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A1MTg0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE2NiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4OWMxZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MTY4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTM4MmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNTcyNjI1OTQiCiAgICAgICAgIGlkPSJzdG9wNTE3MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzA4MDBkYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDUxNzIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MzM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDQzNDAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZhZjU7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4yIgogICAgICAgICBpZD0ic3RvcDkwNjIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmM4YmQ7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC41IgogICAgICAgICBpZD0ic3RvcDQzNDgiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZjc0NjM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC44MDAwMDAwMSIKICAgICAgICAgaWQ9InN0b3A5MDY5IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmYyMTA5O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNDM0MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM0MzIiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZhNWExO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzQzNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ExMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjk0NDQ0NDQyIgogICAgICAgICBpZD0ic3RvcDM0MzYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMTAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzNDM4IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzAyMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmNTZmNmE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AzMDIzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmYxNzE2O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNTcyNjI1OTQiCiAgICAgICAgIGlkPSJzdG9wMzAzMSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzZjMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDMwMjUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExNi43NTkyMiIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE2Ljc1OTIyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MzAyNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMwMjEiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS41NDk3MzA2LDAsMCwxLjU0OTQ5NDgsLTUyLjI4OTAzMSwtNjQuMTU4NTcxKSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iOTUuMTQ3NDM4IgogICAgICAgeTE9IjEyMS43ODY4IgogICAgICAgeDI9Ijk1LjE0NzQzOCIKICAgICAgIHkyPSI3MC4wMzc3MjciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNDE4IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzAyMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExOC4zMTY5NSIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE4LjMxNjk1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MzQzMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM0MzIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi41NzM2OTIiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMyLjU3MzY5MiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDYyOTgiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0MzM4IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoODI0MCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODI5ODYwNSwwLDAsMC45NjEwOTI2LDE1LjQ0MDE0NywtMzkuMjg5NjUpIgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgaWQ9InBhdGg4MjQyIiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTYuNzU5MjIiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExNi43NTkyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDkyMTkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMDIxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNzQxNDM2NiwwLDAsMS42NTQ4NTI5LC03MC41MjM2MzMsLTc2LjQ2MDExNikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi4yNDcwNyIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzAuMzAxMDE0IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50OTIyMSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNTY4MzI1LC0xLjk2MzU5MzllLTcsMS41OTk4MTE3ZS03LDEuMjY0MTc3NCwtMTQuODAwOTg1LC03LjU0MDkwOTkpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjIyNSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxNzQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjI0NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzE5NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iODUuNzg4OTc5IgogICAgICAgeTE9IjU4LjA0MjQzNSIKICAgICAgIHgyPSIxMDEuMDgxNTUiCiAgICAgICB5Mj0iNTcuNTg0NjM3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTAxMzEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMDEyNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iNTcuMTg0MTEzIgogICAgICAgeTE9IjkzLjIwMDI0OSIKICAgICAgIHgyPSI2My4xNzU5NjEiCiAgICAgICB5Mj0iODAuMDE1NzAxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTIwNzkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjA3MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iNDIuMjEyNjAxIgogICAgICAgeTE9IjI3LjI0NzE3MSIKICAgICAgIHgyPSI2NS4wNDM4ODQiCiAgICAgICB5Mj0iNTEuNTY1NDc5IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTMwNjAiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMzA1NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTIuMjczMDE4IgogICAgICAgY3k9IjQzLjE5MjY0NiIKICAgICAgIHI9IjguNDIzNjc3NCIKICAgICAgIGZ4PSI5Mi4yNzMwMTgiCiAgICAgICBmeT0iNDMuMTkyNjQ2IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTUwMDgiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNTAwMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE5ODkzMjIsLTAuMzYxOTI5MSwwLjIxOTI2OTQsMC43MjYzNTUsLTI3LjU1NzA3Niw0NS45NDM2NTIpIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjE3OTE3Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjE3OTE5IgogICAgICAgICBzdGREZXZpYXRpb249IjAuMzk0ODkwMDUiCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDwvZmlsdGVyPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNDAuMjgzNDI0IgogICAgICAgY3k9IjgwLjcwOTgwOCIKICAgICAgIHI9IjguMTA5Nzg3OSIKICAgICAgIGZ4PSI0MC4yODM0MjQiCiAgICAgICBmeT0iODAuNzA5ODA4IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTk4NjciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxOTg2MSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMS40NzEzODEzLC0xLjMyNDgzNzQsMS40MDQzNTMzLC0xLjU1OTY5MjMsLTExLjgzMjE4NSwyNTIuMjI2MikiIC8+CiAgICA8ZmlsdGVyCiAgICAgICBpZD0iZmlsdGVyMjE4MDciPgogICAgICA8ZmVHYXVzc2lhbkJsdXIKICAgICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyMjE4MDkiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC4zOTE4ODQyNCIKICAgICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPC9maWx0ZXI+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI2Ni4wMDQ5NzQiCiAgICAgICBjeT0iMzkuNDI0NTE1IgogICAgICAgcj0iNy4yNjg5NTc2IgogICAgICAgZng9IjY2LjAwNDk3NCIKICAgICAgIGZ5PSIzOS40MjQ1MTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNDcyNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE1MDAyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzkwNjQ1MywtMS4wOTEyMjkxLDEuNjE2NjQ0MywwLjU3ODczNjUsLTIxLjM2NjE0OCw4OC45NzE3MDkpIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjI1Njk3Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjI1Njk5IgogICAgICAgICBzdGREZXZpYXRpb249IjAuMzc1NDAzMzUiCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDwvZmlsdGVyPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjcwNDkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi41NzM2OTIiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMyLjU3MzY5MiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI3MDYwIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NjgyMzMsMCwwLDEuMDU2MzkxOCwtMTUuNzQzODYsLTAuNzk4NTY2NykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzIuNTczNjkyIgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMi41NzM2OTIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNzA3MSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjcwOTIiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxmaWx0ZXIKICAgICAgIGlkPSJmaWx0ZXI5MDY0Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjkwNjYiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC40NDYyOTY5MyIKICAgICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPC9maWx0ZXI+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MDcxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzIuNTczNjkyIgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMi41NzM2OTIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MDgzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE3NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NjgyMzMsMCwwLDEuMDU2MzkxOCwtMTUuNzQzODYsLTAuNzk4NTY2NykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MTAxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE2Ljc1OTIyIgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTYuNzU5MjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA2NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxNjYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTU3MTYsMCwwLDEuODIwNDY3MiwtODcuMTAwNjY5LC05NS43OTcxMTYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA2NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxODYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMC45Mzc4NzQiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMzLjQ1ODA5OSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDExMDY5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE3NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA4MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTYuNzU5MjIiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExNi43NTkyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDExMDg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjIwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjc3MzE3OTYsMCwwLDEuNjg1MDE3NiwtNzMuNTQyOTQ3LC03OS45ODIxMjYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA4NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xMTE0MjAyLDQuNjk0NDQyNWUtOCwtMy42MjU5ODcxZS04LDEuMTUxNDM4OCwtMTAuNTE1MjIxLC0zLjk0NTY1NjQpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMwLjkzNzg3NCIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzMuNDU4MDk5IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTIwNzAiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MTg1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDY2MDA3OSwwLDAsMS4xMDQzOTE0LC02LjIyOTQ2NDUsLTIuNDkwMTA1MikiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODMwMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMDczOTY2LDAsMCwxLjA0MzY2OTcsLTAuNjk4MDUzNSwtMC42MTE1MDQ0KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTguMzE2OTUiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExOC4zMTY5NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE4NTY3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE4NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjYwMjE5NjYsLTIuNzk2NjQ0NWUtMiwyLjc5NjIxOWUtMiwxLjYwMTk1MjgsLTYwLjU4Nzg3MiwtNjcuNzA1MTQ2KSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExOC4zMTY5NSIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE4LjMxNjk1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTg1NzIiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNDMyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNjAyMTk2NiwtMi43OTY2NDQ1ZS0yLDIuNzk2MjE5ZS0yLDEuNjAxOTUyOCwtNjAuNTg3ODcyLC02Ny43MDUxNDYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODU3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTguMzE2OTUiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExOC4zMTY5NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE4NTc5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE4NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjY0OTYxNDksLTIuODc5NDEzNGUtMiwyLjg3ODk3NTNlLTIsMS42NDkzNjM5LC03My45MzkyMSwtMTM2LjY0MzY3KSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjE5NTUxIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjE5NTUzIgogICAgICAgICBzdGREZXZpYXRpb249IjAuNTg2ODc1IgogICAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgPGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaWQ9ImxheWVyMiI+CiAgICA8ZwogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgaWQ9ImxheWVyOSI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02LjgxODI4OTIsLTYxLjM2NzY0NSkiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODM5OSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBkPSJNIDg2LjM3NSw1LjE4NzUgQyA3MS4xNzA5NTgsNS4xODc1IDU4Ljg0Mzc1LDE3LjUxNDcwOSA1OC44NDM3NSwzMi43MTg3NSBDIDU4Ljg0Mzc1LDM0LjQwMjU5NyA1OC45OTE0MTksMzYuMDU1NTQ0IDU5LjI4MTI1LDM3LjY1NjI1IEMgNTUuMDAyMzk3LDQxLjQ3NzQ3MiA1Mi4yNjQ3ODUsNDMuOTIyMjkxIDQ3LjU5Mzc1LDQ4LjA5Mzc1IEMgNDMuMjQ0NzU5LDQ1LjIzMjgwMiAzOC4wNTk5MTQsNDMuNTYyNSAzMi40Njg3NSw0My41NjI1IEMgMTcuMjMxMDI3LDQzLjU2MjUgNC44NDM3NDk5LDU1LjkxODUzIDQuODQzNzUsNzEuMTU2MjUgQyA0Ljg0Mzc1LDg2LjM5Mzk3MSAxNy4yMzEwMjYsOTguNzgxMjUxIDMyLjQ2ODc1LDk4Ljc4MTI1IEMgMzkuOTY2NDQ2LDk4Ljc4MTI1IDQ2Ljc0MjQ1Nyw5NS43NjMzMDMgNTEuNzE4NzUsOTAuOTA2MjUgQyA1OC41MzU4NDEsOTMuNjU1MDc3IDYwLjg3NTk5LDk0LjYxNzg0IDY3LjA5Mzc1LDk3LjEyNSBDIDY4LjA5OTE5NCwxMTEuNDEyNDQgODAuMDIwNTc1LDEyMi42ODc1IDk0LjU2MjUsMTIyLjY4NzUgQyAxMDkuNzYyODUsMTIyLjY4NzUgMTIyLjA5Mzc1LDExMC4zNTY0NiAxMjIuMDkzNzUsOTUuMTU2MjUgQyAxMjIuMDkzNzUsODIuMDc3ODUgMTEyLjk1MDUzLDcxLjE0ODI2OSAxMDAuNzE4NzUsNjguMzQzNzUgQyAxMDAuNTQ3Myw2My43MDk3NyAxMDAuNDkyNTYsNjIuMjExNTIxIDEwMC4yODEyNSw1Ni41IEMgMTA4LjQzNzk5LDUxLjcxNjU0NiAxMTMuOTA2MjUsNDIuODUxNTQgMTEzLjkwNjI1LDMyLjcxODc1IEMgMTEzLjkwNjI1LDE3LjUxNDcwOCAxMDEuNTc5MDQsNS4xODc1IDg2LjM3NSw1LjE4NzUgeiBNIDY1LjU5Mzc1LDUwLjgxMjUgQyA3MC42MDYwNTEsNTYuNTY5OTM2IDc3Ljk3MzI4NCw2MC4xOTQ0NzMgODYuMTg3NSw2MC4yNSBDIDg2LjI2OTI0MSw2NC41NTU4NjEgODYuMjc4NzMsNjUuNDQ5OTI1IDg2LjM0Mzc1LDY4Ljg3NSBDIDc5LjE4NzUyNSw3MS4xMTA4NDggNzMuMjk2NjQsNzYuMTgzMzA0IDY5Ljk2ODc1LDgyLjc4MTI1IEMgNjUuMTc2MTgsODAuODkxMjIyIDY0LjI2OTI0Miw4MC41NTMzNjMgNTkuMDYyNSw3OC41IEMgNTkuNzA1NTg1LDc2LjE2MzgzNSA2MC4wNjI1LDczLjY5NTg3MSA2MC4wNjI1LDcxLjE1NjI1IEMgNjAuMDYyNSw2Ni43MjE4OTkgNTkuMDE2ODYsNjIuNTI2NTY3IDU3LjE1NjI1LDU4LjgxMjUgQyA2MC4zODExMzYsNTUuNzU0MTE3IDYxLjU4MzgyMiw1NC42MTUzOTQgNjUuNTkzNzUsNTAuODEyNSB6ICIKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4LDYyLjU0OTM1NykiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC41ODgyMzUyOTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjE5NTUxKSIKICAgICAgICAgICBpZD0icGF0aDE4NDAxIiAvPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MS44MTY4ODEsLTI0LjE4MzExOSkiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODQxNSIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY3Mjg0LDAsMCwxLjAwNjcxOTIsLTAuNDUxODY4LC0wLjgyMzU0NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODQzNSIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI1Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgsLTYyLjU0OTM1NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9Imc5MDg1Ij4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA4MzMzLDAsMCwxLjAyMDgzMzMsLTIuNzI0NzIxOSwtMy40NTkxMTk1KSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDY3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICBpZD0icGF0aDkwODciIC8+CiAgICAgICAgPGcKICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxNTUwMzksMCwwLDEuMDE1NTAzOSwtMS40NjMxNjk5LC0xLjQ3ODI0NjIpIgogICAgICAgICAgIGlkPSJnOTA4OSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMjEuODY5MzggOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgNjguMzY1NzQ3LDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDEyMS44NjkzOCA5Ni43ODk1NTEgeiIKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODk1ODMzMywwLDAsMC44OTU4MzMzLDkuMTY0OTczNCw4LjYzOTU3NDUpIgogICAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTA2NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTM1MjExMzI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjAuNTAxOTYwNzgiCiAgICAgICAgICAgICBpZD0icGF0aDkwOTEiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMTEuNzY0MDcsMzguNDU1NzM0IEMgMTExLjc2NDA3LDQ1LjgxMjIyMiAxMDYuMzEyMTMsNTEuNzgyNzA0IDk0LjM3NDQ1OCw1MS43ODI3MDQgQyA4Mi42MDM4MzEsNTEuNzgyNzA0IDc2Ljk4NDg0Niw0NS44MTIyMjIgNzYuOTg0ODQ2LDM4LjQ1NTczNCBDIDc2Ljk4NDg0NiwzMS4wOTkyNDcgODQuNzc1MzkyLDI1LjEyODc2NCA5NC4zNzQ0NTgsMjUuMTI4NzY0IEMgMTAzLjk3MzUyLDI1LjEyODc2NCAxMTEuNzY0MDcsMzEuMDk5MjQ3IDExMS43NjQwNywzOC40NTU3MzQgeiAiCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA3OTQ5ODcsMCwwLDAuOTMyMDk4OCwtNy41MDI2NDU2LDQ1LjI2MTQxKSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTA2OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDkwOTMiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAxMjEuNjg3NTYgOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDY4LjU0NzU2Miw5Ni43ODk1NTEgQSAyNi41NyAyNi41NyAwIDEgMSAgMTIxLjY4NzU2IDk2Ljc4OTU1MSB6IgogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTkyNDU1LDAsMCwwLjk5MjQ1NSwyLjg5Mzk2NjdlLTIsLTAuODQ1NDgzNCkiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMwMDA5OGY7c3Ryb2tlLXdpZHRoOjIuMjc4MTI5NTg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgICAgaWQ9InBhdGg5MDk1IiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgaWQ9ImxheWVyOCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gNzUuMDQ1NjcyLDMxLjMwNjk2NiBDIDY2LjI1NDAzMywyNS4wMDAxNTEgNjAuMDk5MzkxLDMzLjkxMDE5MiA2Ni4zMDgwMzcsNDEuMDI0NTIzIEMgNzQuOTY1OTA1LDUxLjY4MDM2MSA4Mi43NTU3OSwzNi44Mzc5MzYgNzUuMDQ1NjcyLDMxLjMwNjk2NiB6ICIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0NzI2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4xO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyMjU2OTcpIgogICAgICAgICBpZD0icGF0aDIxODExIiAvPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDQwLjkxNzEwMyw1NC4wNjQzNDkgQyA0MC45MTcxMDMsNTQuMDY0MzQ5IDY1LjEzMDcwNSwzMi40NDA0MzYgNjUuMTMwNzA1LDMyLjQ0MDQzNiBDIDY1LjU5MzkxOSwzMS45MTEwNDggNjkuODYyMzYxLDMwLjIxMjgwNCA3My40MTc3MTQsMzQuNDQ3NDQ2IEMgNzYuNjkyNjczLDM4LjM0ODEyMiA3NS4zNzE0MzEsNDEuNDkyOTAyIDc0Ljg0MjA0Myw0Mi4wMjIyOSBDIDc0Ljg0MjA0Myw0Mi4wMjIyOSA1MS4wMTY4OTQsNjQuNjE3MzM1IDUxLjAxNjg5NCw2NC42MTczMzUgTCA0MC45MTcxMDMsNTQuMDY0MzQ5IHogIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MTMwNjApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgaWQ9InBhdGgxMjA4MyIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI2Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTYxLjgxNjg4MSwtMjQuMTgzMTE5KSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgICBpZD0iZzExMDcxIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA4MzMzLDAsMCwxLjAyMDgzMzMsLTIuNzI0NzIxOSwtMy40NTkxMTk1KSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDgzKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICBpZD0icGF0aDExMDczIiAvPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTU1MDM5LDAsMCwxLjAxNTUwMzksLTEuNDYzMTY5OSwtMS40NzgyNDYyKSIKICAgICAgICAgICBpZD0iZzExMDc1Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJNIDEyMS44NjkzOCA5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICA2OC4zNjU3NDcsOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgMTIxLjg2OTM4IDk2Ljc4OTU1MSB6IgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTU4MzMzLDAsMCwwLjg5NTgzMzMsOS4xNjQ5NzM0LDguNjM5NTc0NSkiCiAgICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDg1KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICAgIGlkPSJwYXRoMTEwNzciIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMTEuNzY0MDcsMzguNDU1NzM0IEMgMTExLjc2NDA3LDQ1LjgxMjIyMiAxMDYuMzEyMTMsNTEuNzgyNzA0IDk0LjM3NDQ1OCw1MS43ODI3MDQgQyA4Mi42MDM4MzEsNTEuNzgyNzA0IDc2Ljk4NDg0Niw0NS44MTIyMjIgNzYuOTg0ODQ2LDM4LjQ1NTczNCBDIDc2Ljk4NDg0NiwzMS4wOTkyNDcgODQuNzc1MzkyLDI1LjEyODc2NCA5NC4zNzQ0NTgsMjUuMTI4NzY0IEMgMTAzLjk3MzUyLDI1LjEyODc2NCAxMTEuNzY0MDcsMzEuMDk5MjQ3IDExMS43NjQwNywzOC40NTU3MzQgeiAiCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA3OTQ5ODcsMCwwLDAuOTMyMDk4OCwtNy41MDI2NDU2LDQ1LjI2MTQxKSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxODMwMCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDExMDc5IiAvPgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjY4NzU2IDk2Ljc4OTU1MSBBIDI2LjU3IDI2LjU3IDAgMSAxICA2OC41NDc1NjIsOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDEyMS42ODc1NiA5Ni43ODk1NTEgeiIKICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5MjQ1NDgsMCwwLDAuOTkyNDU0OCwtMi4xODQ0NDEyZS0yLC0wLjcxNjAwMDcpIgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjI3ODE0MjkzO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICAgIGlkPSJwYXRoMTEwODEiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI3Ij4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA5My40Mzg2OTIsNDcuNTIxNzI3IEMgMTA0LjI4MDg3LDQ2LjI1NTcyOCAxMDIuNTg0NDgsMzIuODI4NjIyIDkyLjA0Mjc3MSwzMy41MjQyMTIgQyA4MS44MjA0NTcsMzQuMTk4NzI4IDgxLjExNTY1Nyw0OC45NjA2NDEgOTMuNDM4NjkyLDQ3LjUyMTcyNyB6ICIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE1MDA4KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4xO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyMTc5MTcpIgogICAgICAgICBpZD0icGF0aDEzMDYyIiAvPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDg1Ljg1MTEzOSw0My4xMzQzODEgQyA4NS44NTExMzksNDMuMTM0MzgxIDg2LjUyMzYwNiw3OC41NTc5NCA4Ni41MjM2MDYsNzguNTU3OTQgTCAxMDEuMDgxNTUsNzguMDA4NTg0IEMgMTAxLjA4MTU1LDc4LjAwODU4NCA5OS43NDI3OTQsNDEuODIzNDQ0IDk5Ljc0Mjc5NCw0MS44MjM0NDQgQyA5OS4yMzk1MzIsMzkuMDE5MTY0IDk2LjE2MjAwNSwzNi4yMDQ1NyA5Mi42ODM0NTIsMzYuNDQzNzIgQyA4OC44MzcyNTUsMzYuNzA4MTQ2IDg1LjM5OTc4MSw0MC4wMzUwNDggODUuODUxMTM5LDQzLjEzNDM4MSB6ICIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMDEzMSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBpZD0icGF0aDkxNTQiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMzIuODk4NDc2LDczLjg3Njg4MyBDIDI3LjYyNjcwMyw4MC45Njg5NjggMzcuODk3OTE5LDkyLjU1NDI0NSA0NS4xMzYzODYsODMuMjQ2MjAxIEMgNTIuNjk3ODc4LDczLjUyMjc3NCAzOC44NjY0NjQsNjUuODQ4MTgyIDMyLjg5ODQ3Niw3My44NzY4ODMgeiAiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxOTg2Nyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxO2ZpbHRlcjp1cmwoI2ZpbHRlcjIxODA3KSIKICAgICAgICAgaWQ9InBhdGgxNzkyMSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA0My42NzM4Miw3Mi40MjM0NjIgQyA0My42NzM4Miw3Mi40MjM0NjIgODIuNjc4MTExLDg3LjgwNTQzNiA4Mi42NzgxMTEsODcuODA1NDM2IEwgNzguMjgzMjYyLDEwMS42MzA5IEMgNzguMjgzMjYyLDEwMS42MzA5IDM4LjU0NjQ5NSw4NS42MDgwMTIgMzguNTQ2NDk1LDg1LjYwODAxMiBDIDM0LjQ3MjEwMyw4My4zNjQ4MDcgMzMuNDU2NzQ4LDgwLjI5NjMzMyAzNC43MDEwMDIsNzYuNzI2NzUyIEMgMzYuMDk3MjgyLDcyLjcyMTAzIDQxLjI3MDM4Niw3MS41MDc4NjggNDMuNjczODIsNzIuNDIzNDYyIHogIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MTIwNzkpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgaWQ9InBhdGgxMDEzMyIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI0Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY3Mjg0LDAsMCwxLjAwNjcxOTIsLTAuNDUxODY4LC0wLjgyMzU0NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcyMTk5Ij4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45OTM0NTI5LDAsMCwwLjk5MzQ1MjksLTAuMTIwMzY2NCwtMC44MDg5ODQzKSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDM0MzApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjUzNTIxMTMyO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4IgogICAgICAgICAgIGlkPSJwYXRoMzQyOCIgLz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDA4NzA3OCwwLDAsMS4wMDg3MDc4LC0wLjgyODM0NDEsLTAuODIzNzAxMSkiCiAgICAgICAgICAgaWQ9Imc5MjE1Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJNIDEyMS44NjkzOCA5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICA2OC4zNjU3NDcsOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgMTIxLjg2OTM4IDk2Ljc4OTU1MSB6IgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTU4MzMzLDAsMCwwLjg5NTgzMzMsOS4xNjQ5NzM0LDguNjM5NTc0NSkiCiAgICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDkyMTkpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjUzNTIxMTMyO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4IgogICAgICAgICAgICAgaWQ9InBhdGgyNDM0IiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gMTExLjc2NDA3LDM4LjQ1NTczNCBDIDExMS43NjQwNyw0NS44MTIyMjIgMTA2LjMxMjEzLDUxLjc4MjcwNCA5NC4zNzQ0NTgsNTEuNzgyNzA0IEMgODIuNjAzODMxLDUxLjc4MjcwNCA3Ni45ODQ4NDYsNDUuODEyMjIyIDc2Ljk4NDg0NiwzOC40NTU3MzQgQyA3Ni45ODQ4NDYsMzEuMDk5MjQ3IDg0Ljc3NTM5MiwyNS4xMjg3NjQgOTQuMzc0NDU4LDI1LjEyODc2NCBDIDEwMy45NzM1MiwyNS4xMjg3NjQgMTExLjc2NDA3LDMxLjA5OTI0NyAxMTEuNzY0MDcsMzguNDU1NzM0IHogIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wNzk0OTg3LDAsMCwwLjkzMjA5ODgsLTcuNTAyNjQ1Niw0NS4yNjE0MSkiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50OTA3MSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDUzMjEiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAxMjEuNjg3NTYgOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDY4LjU0NzU2Miw5Ni43ODk1NTEgQSAyNi41NyAyNi41NyAwIDEgMSAgMTIxLjY4NzU2IDk2Ljc4OTU1MSB6IgogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTg1ODIyLDAsMCwwLjk4NTgyMiwwLjU4MTMzMTEsLTkuODg0MjY0MmUtMikiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2ODAwMDA7c3Ryb2tlLXdpZHRoOjIuMjc4MTM5NTk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgICAgaWQ9InBhdGg4MjQ0IiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"kalzium,kalzium\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kalzium.desktop\"\nLABEL oc.launch=\"kalzium.kalzium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Kalzium\"\nLABEL oc.displayname=\"Kalzium\"\nLABEL oc.path=\"/usr/bin/kalzium\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Kalzium\"\nENV APPBIN \"/usr/bin/kalzium\"\nENV APP \"/usr/bin/kalzium\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kalzium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kalzium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Kalzium

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Kalzium.d\n
"},{"location":"applications/kalzium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Kalzium.d -t Kalzium .\n
"},{"location":"applications/kalzium/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Kalzium > Kalzium.json\ndocker image save Kalzium -o Kalzium.tar\nctr -n k8s.io images import Kalzium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Kalzium.json\n\n
"},{"location":"applications/kdiamond/","title":"kDiamond","text":""},{"location":"applications/kdiamond/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/kdiamond/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kdiamond/#alpine-packages","title":"Alpine packages","text":"
kdiamond\n
"},{"location":"applications/kdiamond/#path","title":"Path","text":"
/usr/games/kdiamond\n
"},{"location":"applications/kdiamond/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/kdiamond/#wm_class","title":"WM_CLASS","text":"
kdiamond.kdiamond\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/kdiamond/#json-dump","title":"JSON dump","text":"

json source file kdiamond.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"kdiamond\",\n    \"icon\": \"kdiamond.svg\",\n    \"keyword\": \"kdiamond\",\n    \"launch\": \"kdiamond.kdiamond\",\n    \"name\": \"kDiamond\",\n    \"path\": \"/usr/games/kdiamond\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/kdiamond/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output kdiamond.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kdiamond.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kdiamond.d.3.0.json\n\n
"},{"location":"applications/kdiamond/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kdiamond\nLABEL oc.icon=\"kdiamond.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgaGVpZ2h0PSI0OCIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxNiIgeDI9IjciIHkxPSIyMCIgeTI9IjciPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiZjQyMzEiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZjU4MjczIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjM5IiB4Mj0iMzAiIHkxPSIyMCIgeTI9IjciPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmE5MmQiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZjMTY5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3IiB4Mj0iMTAiIHkxPSI0MC4xMjQiIHkyPSIyOCI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzNiYjU2NiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM3Y2VjYTQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMzgiIHgyPSIzMCIgeTE9IjQyIiB5Mj0iMjkiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMzYjg1YjUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjN2NiY2VjIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8Zz4KICAgIDxwYXRoIGQ9Im0xMi45OTkwNzQgNC4wMDAwMDQ4Yy0uMjQyNTE4IDAtLjQ4NDk2NS4wOTIxMTgtLjY3MDc5NC4yNzc5MzY5bC04LjA0OTUzMDUgOC4wNTA5MDgzYy0uMzcxNjU5Ny4zNzE2MzgtLjM3MTY1OTcuOTY5ODcxIDAgMS4zNDE1MDlsOC4wNDk1MzA1IDguMDUwOTA4Yy4zNzE2NTkuMzcxNjM4Ljk3MTc4MS4zNzE2MzggMS4zNDM0NCAwbDguMDQ5NTMtOC4wNTA5MDhjLjM3MTY2MS0uMzcxNjM4LjM3MTY2MS0uOTY5ODcxIDAtMS4zNDE1MDlsLTguMDQ5NTMtOC4wNTA5MDgzYy0uMTg1ODI5LS4xODU4MTg5LS40MzAxMjktLjI3NzkzNjktLjY3MjY0Ni0uMjc3OTM2OXoiIGZpbGw9InVybCgjYSkiLz4KICAgIDxwYXRoIGQ9Im0zNC45OTkwNzQgNC4wMDAwMDQ4Yy0uMjQyNTE4IDAtLjQ4NDk2NS4wOTIxMTgtLjY3MDc5NC4yNzc5MzY5bC04LjA0OTUzMSA4LjA1MDkwODNjLS4zNzE2NTkuMzcxNjM4LS4zNzE2NTkuOTY5ODcxIDAgMS4zNDE1MDlsOC4wNDk1MzEgOC4wNTA5MDhjLjM3MTY1OS4zNzE2MzguOTcxNzgxLjM3MTYzOCAxLjM0MzQ0IDBsOC4wNDk1My04LjA1MDkwOGMuMzcxNjYxLS4zNzE2MzguMzcxNjYxLS45Njk4NzEgMC0xLjM0MTUwOWwtOC4wNDk1My04LjA1MDkwODNjLS4xODU4MjktLjE4NTgxODktLjQzMDEyOS0uMjc3OTM2OS0uNjcyNjQ2LS4yNzc5MzY5eiIgZmlsbD0idXJsKCNiKSIvPgogICAgPHBhdGggZD0ibTEyLjk5OTA3NCAyNi4wMDAwMDVjLS4yNDI1MTggMC0uNDg0OTY1LjA5MjEyLS42NzA3OTQuMjc3OTM3bC04LjA0OTUzMDUgOC4wNTA5MDhjLS4zNzE2NTk3LjM3MTYzOC0uMzcxNjU5Ny45Njk4NzEgMCAxLjM0MTUwOWw4LjA0OTUzMDUgOC4wNTA5MDhjLjM3MTY1OS4zNzE2MzguOTcxNzgxLjM3MTYzOCAxLjM0MzQ0IDBsOC4wNDk1My04LjA1MDkwOGMuMzcxNjYxLS4zNzE2MzguMzcxNjYxLS45Njk4NzEgMC0xLjM0MTUwOWwtOC4wNDk1My04LjA1MDkwOGMtLjE4NTgyOS0uMTg1ODE5LS40MzAxMjktLjI3NzkzNy0uNjcyNjQ2LS4yNzc5Mzd6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCBkPSJtMzQuOTk5MDc0IDI2LjAwMDAwNWMtLjI0MjUxOCAwLS40ODQ5NjUuMDkyMTItLjY3MDc5NC4yNzc5MzdsLTguMDQ5NTMxIDguMDUwOTA4Yy0uMzcxNjU5LjM3MTYzOC0uMzcxNjU5Ljk2OTg3MSAwIDEuMzQxNTA5bDguMDQ5NTMxIDguMDUwOTA4Yy4zNzE2NTkuMzcxNjM4Ljk3MTc4MS4zNzE2MzggMS4zNDM0NCAwbDguMDQ5NTMtOC4wNTA5MDhjLjM3MTY2MS0uMzcxNjM4LjM3MTY2MS0uOTY5ODcxIDAtMS4zNDE1MDlsLTguMDQ5NTMtOC4wNTA5MDhjLS4xODU4MjktLjE4NTgxOS0uNDMwMTI5LS4yNzc5MzctLjY3MjY0Ni0uMjc3OTM3eiIgZmlsbD0idXJsKCNkKSIvPgogICAgPHBhdGggZD0ibTQuMTY2MDE1NiAxMi41Yy0uMjMzNDk3OS4zNjcxMjEtLjIwNzcyMTUuODQ4OTM4LjExMzI4MTMgMS4xNjk5MjJsOC4wNDg4MjgxIDguMDUwNzgxYy4zNzE2NTkuMzcxNjM4Ljk3MjA5MS4zNzE2MzggMS4zNDM3NSAwbDguMDQ4ODI4LTguMDUwNzgxYy4zMjEwMDQtLjMyMDk4NC4zNDY3OC0uODAyODAxLjExMzI4MS0xLjE2OTkyMi0uMDM2NjY1LjA1NzQyOS0uMDYzMDI0LjExOTY2OC0uMTEzMjgxLjE2OTkyMmwtOC4wNDg4MjggOC4wNTA3ODFjLS4zNzE2NTkuMzcxNjM4LS45NzIwOTEuMzcxNjM4LTEuMzQzNzUgMGwtOC4wNDg4MjgxLTguMDUwNzgxYy0uMDUwMjU2Ni0uMDUwMjU0LS4wNzY2MTYzLS4xMTI0OTMtLjExMzI4MTMtLjE2OTkyMnptMjIuMDAwMDAwNCAwYy0uMjMzNDk4LjM2NzEyMS0uMjA3NzIxLjg0ODkzOC4xMTMyODEgMS4xNjk5MjJsOC4wNDg4MjggOC4wNTA3ODFjLjM3MTY1OS4zNzE2MzguOTcyMDkxLjM3MTYzOCAxLjM0Mzc1IDBsOC4wNDg4MjgtOC4wNTA3ODFjLjMyMTAwNC0uMzIwOTg0LjM0Njc4LS44MDI4MDEuMTEzMjgxLTEuMTY5OTIyLS4wMzY2NjUuMDU3NDI5LS4wNjMwMjQuMTE5NjY4LS4xMTMyODEuMTY5OTIybC04LjA0ODgyOCA4LjA1MDc4MWMtLjM3MTY1OS4zNzE2MzgtLjk3MjA5MS4zNzE2MzgtMS4zNDM3NSAwbC04LjA0ODgyOC04LjA1MDc4MWMtLjA1MDI1Ny0uMDUwMjU0LS4wNzY2MTYtLjExMjQ5My0uMTEzMjgxLS4xNjk5MjJ6bS0yMi4wMDAwMDA0IDIyYy0uMjMzNDk3OS4zNjcxMjEtLjIwNzcyMTUuODQ4OTM4LjExMzI4MTMgMS4xNjk5MjJsOC4wNDg4MjgxIDguMDUwNzgxYy4zNzE2NTkuMzcxNjM4Ljk3MjA5MS4zNzE2MzggMS4zNDM3NSAwbDguMDQ4ODI4LTguMDUwNzgxYy4zMjEwMDQtLjMyMDk4NC4zNDY3OC0uODAyODAxLjExMzI4MS0xLjE2OTkyMi0uMDM2NjY1LjA1NzQyOS0uMDYzMDI0LjExOTY2OC0uMTEzMjgxLjE2OTkyMmwtOC4wNDg4MjggOC4wNTA3ODFjLS4zNzE2NTkuMzcxNjM4LS45NzIwOTEuMzcxNjM4LTEuMzQzNzUgMGwtOC4wNDg4MjgxLTguMDUwNzgxYy0uMDUwMjU2Ni0uMDUwMjU0LS4wNzY2MTYzLS4xMTI0OTMtLjExMzI4MTMtLjE2OTkyMnptMjIuMDAwMDAwNCAwYy0uMjMzNDk4LjM2NzEyMS0uMjA3NzIxLjg0ODkzOC4xMTMyODEgMS4xNjk5MjJsOC4wNDg4MjggOC4wNTA3ODFjLjM3MTY1OS4zNzE2MzguOTcyMDkxLjM3MTYzOCAxLjM0Mzc1IDBsOC4wNDg4MjgtOC4wNTA3ODFjLjMyMTAwNC0uMzIwOTg0LjM0Njc4LS44MDI4MDEuMTEzMjgxLTEuMTY5OTIyLS4wMzY2NjUuMDU3NDI5LS4wNjMwMjQuMTE5NjY4LS4xMTMyODEuMTY5OTIybC04LjA0ODgyOCA4LjA1MDc4MWMtLjM3MTY1OS4zNzE2MzgtLjk3MjA5MS4zNzE2MzgtMS4zNDM3NSAwbC04LjA0ODgyOC04LjA1MDc4MWMtLjA1MDI1Ny0uMDUwMjU0LS4wNzY2MTYtLjExMjQ5My0uMTEzMjgxLS4xNjk5MjJ6IiBvcGFjaXR5PSIuMTUiLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"kdiamond,kdiamond\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"kdiamond.kdiamond\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"kDiamond\"\nLABEL oc.displayname=\"kDiamond\"\nLABEL oc.path=\"/usr/games/kdiamond\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kDiamond\"\nENV APPBIN \"/usr/games/kdiamond\"\nENV APP \"/usr/games/kdiamond\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kdiamond/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kdiamond/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application kDiamond

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kDiamond.d\n
"},{"location":"applications/kdiamond/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f kDiamond.d -t kDiamond .\n
"},{"location":"applications/kdiamond/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect kDiamond > kDiamond.json\ndocker image save kDiamond -o kDiamond.tar\nctr -n k8s.io images import kDiamond.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kDiamond.json\n\n
"},{"location":"applications/kgeography/","title":"Kgeography","text":""},{"location":"applications/kgeography/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/kgeography/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kgeography/#alpine-packages","title":"Alpine packages","text":"
kgeography\n
"},{"location":"applications/kgeography/#path","title":"Path","text":"
/usr/bin/kgeography\n
"},{"location":"applications/kgeography/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/kgeography/#wm_class","title":"WM_CLASS","text":"
kgeography.kgeography\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/kgeography/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.kde.kgeography.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/kgeography/#json-dump","title":"JSON dump","text":"

json source file kgeography.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"kgeography\",\n    \"icon\": \"kgeography.svg\",\n    \"keyword\": \"kgeography,geography\",\n    \"launch\": \"kgeography.kgeography\",\n    \"name\": \"Kgeography\",\n    \"path\": \"/usr/bin/kgeography\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/org.kde.kgeography.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/kgeography/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output kgeography.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kgeography.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kgeography.d.3.0.json\n\n
"},{"location":"applications/kgeography/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kgeography\nLABEL oc.icon=\"kgeography.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB5Mj0iMTUuODI3IiB4Mj0iMTAuNDY3IiB5MT0iNDIuNTI2IiB4MT0iMTAuNzk1IiBpZD0iMCI+PHN0b3Agc3RvcC1jb2xvcj0iIzE5N2NmMSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzIwYmNmYSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeTE9IjQyLjQ3NSIgeDI9IjAiIHkyPSIyOC44OTkiPjxzdG9wIHN0b3AtY29sb3I9IiNjNTI4MjgiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZjU0NTQiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAyMTIxIDAgMCAxLjAyMTIxLS4wNC0uMzY2KSI+PHBhdGggZD0ibS0xLjM0NiAxNS40NThoMjIuODA4Yy44OTYgMCAxLjYxOC43NDcgMS42MTggMS42NzR2MjMuNTk3YzAgLjkyNy0uNzIyIDEuNjc0LTEuNjE4IDEuNjc0aC0yMi44MDhjLS44OTYgMC0xLjYxOC0uNzQ3LTEuNjE4LTEuNjc0di0yMy41OTdjMC0uOTI3LjcyMi0xLjY3NCAxLjYxOC0xLjY3NCIgZmlsbD0idXJsKCMwKSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09Im1hdHJpeCgxLjc3MzU2IDAgMCAxLjcxNDI2IDYuMTA4LTI1Ljk4NikiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz48cGF0aCBkPSJtMTEuNDA2IDYuNDY5bC4zNS0uMzcxaDIuMDk2bC43NTkuNjcyLS4wNDYgMS4wNDYuNjQuNTg4LS41MzIuMzgxLjExOSAxLjM3NS0xLjkgMi4zMDN2Mi4xNjNsMS4wMTguNDkzdjEuOTQybC45ODcgMS42NjkuNzg3LjExOS4xMDEtLjU3NC0uOTMxLTEuNDQ1LS4xODUtMS40MDdoLjU1M2wuMjM0IDEuNDQ5IDEuMzU4IDEuOTgxLS4zNjQuNjMzLjg3MSAxLjMyNiAyLjE0OS41MzJ2LS4zNWwuODU3LjEyMi0uMDc3LjYxNmMuNzU2LjEyMi41MjUuMDczIDEuNzE1LjQwMmwxLjQ3IDEuNjc2IDEuODc2LjE0My4xODIgMS41MzMtMS4yODguOTAzLS4wNjMgMS4zNjEtLjE3OC44NCAxLjg1NSAyLjMyNC4xNDMuNzk4YzAgMCAuNjc1LjE4Mi43NDkuMTgyLjA4IDAgMS41MTUgMS4wOTIgMS41MTUgMS4wOTJ2NC4xOTJsLjUxMS4xNS0uMzU3IDEuOTI1Ljg2MSAxLjEzNy0uMTU0IDEuOTI1IDEuMTMgMS45OTEgMS40NTYgMS4yNjcgMS40NTYuMDMyLjE0Ny0uNDY5LTEuMDcxLS45MDZjLjA4LS41NTMuMDI1LS4zNDMuMjU5LTEuMDFsLjA0Mi0uNTQ5LS43MzEtLjAyNS0uMzc0LS40NTUuNjA1LS41ODQuMDg0LS40MzQtLjY3NS0uMTg5LjAzOC0uNDEzLjk1OS0uMTQzIDEuNDU5LS42OTZjLjY1NC0xLjIuOTc2LTEuNTIyIDIuMDIzLTIuODU5bC0uMzUtMS41MjkuNDY5LS44MTUgMS40MDcuMDM1Ljk0NS0uNzM4LjMwOC0yLjk2MSAxLjA1LTEuMzQ0LjE4OS0uODUtLjk2Mi0uMzExLS42My0xLjAzNi0yLjE2Ni0uMDI0LTEuNzE1LS42NTQtLjA4LTEuMjI4LS41NzQtLjk5Ny0xLjU0LS4wMjEtLjg5OS0xLjQxLS43OTgtLjM3OC0uMDQyLjQyLTEuNDQ1LjA5MS0uNTMyLS43MzUtMS41MTUtLjMwOC0xLjI0NiAxLjQzMS0xLjk1Ni0uMzI5LS4xNDMtMi4yMDgtMS40MzEtLjI0NS41NzQtMS4wODgtLjE2NC0uNjEyLTEuODcyIDEuMjU2LTEuMTc5LS4xNDMtLjQzLS45MzFjLjMyMi0xLjE3Mi4xMjktLjcxLjkxNy0yLjE1NmwxLjQ5OC0uNzYzaDIuODk4bC0uMDA3Ljg4MiAxLjA0My40OS0uMDg0LTEuNTA4Yy43OTgtLjgwMS41NTYtLjYyNiAyLjI2NC0xLjc1bC4wOTgtLjY5NiAxLjUxNS0xLjU3NSAxLjYxLS44ODUtLjE0My0uMTE1IDEuMDg1LTEuMDI1LjQwMi4xMDUuMTg1LjIzMS40MTMtLjQ2Mi4wOTQtLjA0OWMtLjU0Ni0uMDczLS4zNS0uMDI0LS45MDMtLjIxM3YtLjQ0NGwuMjQxLS4xOTloLjUzOWwuMjQ4LjEwOC4yMS40MjcuMjU5LS4wMzh2LS4wMjRsLjA3Ny4wMjEuNzQ5LS4xMTkuMTA1LS4zNjcuNDIuMTA1di4zOTVsLS4zOTUuMjc2LjA1OS40NDEgMS4zNjguNDJjMCAwIC4wMDMuMDA3LjAwMy4wMTRsLjMxMS0uMDI0LjAyMS0uNTg4LTEuMDgxLS40OTMtLjA2My0uMjkuODk2LS4zMDguMDM4LS44NS0uOTM0LS41NzQtLjA2My0xLjQ0NS0xLjI5NS42M2gtLjQ2OWwuMTI2LTEuMTAyLTEuNzQzLS40MTYtLjcyOC41NDZ2MS42NzZsLTEuMzAyLjQwNi0uNTI1IDEuMDkyLS41NjMuMDg3di0xLjM4OWwtMS4yMjEtLjE3NS0uNjEyLS4zOTUtLjI0OC0uODk5IDIuMTkxLTEuMjg0IDEuMDcxLS4zMjUuMTA1LjcxNy42MDItLjAyOC4wNDktLjM2NC42MjMtLjA4Ny4wMDctLjEyMi0uMjYyLS4xMTItLjA2My0uMzgxLjc2Ni0uMDY2LjQ2Mi0uNDgzLjAzNS0uMDM1di4wMDRsLjE0My0uMTQ3IDEuNjEzLS4yMDMuNzEuNjA1LTEuODc2Ljk5NyAyLjM4My41Ni4zMDQtLjc5OGgxLjA0NmwuMzY0LS42OTMtLjczMS0uMTgydi0uODc1bC0yLjMwNi0xLjAyMi0xLjU5Mi4xODItLjkwMy40NjkuMDcgMS4xNDQtLjk0MS0uMTQzLS4xNDMtLjYzLjg4OS0uODE1LTEuNjI0LS4wODQtLjQ2OS4xMzYtLjIxLjU1My42MTYuMTA1LS4xMjYuNjEyLTEuMDM2LjA2My0uMTY0LjQwMi0xLjUxOS4wNDJjMCAwLS4wMzUtLjg1Ny0uMDk0LS44NTctLjA2MyAwIDEuMTgzLS4wMTcgMS4xODMtLjAxN2wuODk5LS44NzgtLjQ5LS4yNDgtLjY1NC42MzctMS4wODUtLjA1OS0uNjQ3LS44OTloLTEuMzg5bC0xLjQ1MiAxLjA4NWgxLjMzbC4xMjIuMzg4LS4zNS4zMjUgMS40Ny4wNDIuMjI3LjUzMi0xLjY1NS0uMDY2LS4wOC0uNDA5LTEuMDM5LS4yMjctLjU1My0uMzAxLTIuNDUuMDI0LS43NTIuNzMxLS41MTQtLjA0Mi0uNTctLjMzMi0xLjY5NC0uNTA0aC0zLjEwMWwtMS43OTUgMS4yMjEtMS4yMDQuMTg1LS41NTMuNDMuODU3LjEyNnYuMzQzaC0xLjgzbC0uNzE3LjUxMS45MTcuNzc3IDIuNTA5LjAyMW0xNS40NjggNi4xMTdoLS43OGwuMTIyLS41MzIuMzY3LS4wMzkuMDg0LS4xODIuNTYtLjA3N3YuNDc2aC4wMDNsLS4zNTcuMzUzbS41NDMtMS4zMTZsLS4zNjcuMjM4LS40NjIuMDhjMCAwIDAtLjcyOCAwLS44MDVoLjgyOXYuNDg2bS42OTYtLjU2M2wuMzc4LjIzMS0uMzA0LjI0OC0uMjktLjI0OC4yMTctLjIzMW0tLjQ5Ny42MDloLjA1OWwuOTM4LjI3M3YuNDc5aC0uNzg3bC0uMjEtLjMwOGMwIDAgMC0uNDQ0IDAtLjQ0NG0tLjYwOS0xLjMxNmwuNTA3LjQ2Mi0uNTA3LjEyMnYtLjU4NG0tMi4xNDkuMDc3bC43MDctLjI5aC45Njl2LjI5aC4yMXYuNTA3aC0xLjQ3N2wtLjU0Ni0uMTUuMTM2LS4zNTdtLS4xMzMgMS4zMTZsLjU2LS42MDloLjgxMmwtMS4wMzkgMS40NTItLjQzNC0uMjMxLjEwMS0uNjEybS0uNzUyLTMuNDU4bC41NzcuMTMzLS4xOTkuNzg0LS42MjMuMjAzLS4zOTItLjgxNS42MzctLjMwNG0tMi45MDUtMy43MDN2LS4wNDVoLjUzNWwuMDQ5LS4xODVoLjg3OHYuMzg1bC0uMjU5LjMzMmgtMS4yMDR2LS40ODZ6bS44NSAxLjE5M2MwIDAgLjUzOS0uMDk0LjU4MS0uMDk0LjA0MiAwIDAgLjUzOSAwIC41MzlsLTEuMjA3LjA3Ny0uMjI3LS4yNzMuODU0LS4yNDgiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjg1MSIvPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNTcyNjcgMCAwIDEuNTcyNjctMTQuMTQtMjEuMTQpIj48Y2lyY2xlIGN5PSIzNS44NTgiIGN4PSIxNi42MTQiIHI9IjcuNjAxIiBmaWxsPSJ1cmwoIzEpIi8+PHBhdGggZD0ibTE2LjQ5OCAzMS4zODhjLTEuODA5IDAtMy4yNzUgMS40NjYtMy4yNzUgMy4yNzUgMCAuMTM4LjAxMS4yNzMuMDI4LjQwNy4yOCAyLjU1OCAzLjAzNSA1LjUwNyAzLjAzNSA1LjUwNy4wNDkuMDU1LjA5Ni4wODkuMTQyLjExM2guMDAybC4wOTIuMDI5LjA5Mi0uMDI5aC4wMDJjLjA0Ni0uMDI1LjA5My0uMDYuMTQyLS4xMTMgMCAwIDIuNzE1LTIuOTU0IDIuOTg4LTUuNTEzLjAxNi0uMTMyLjAyNy0uMjY2LjAyNy0uNDAyIDAtMS44MDgtMS40NjYtMy4yNzUtMy4yNzUtMy4yNzVtMCA1LjM4MmMtMS4xNjEgMC0yLjEwNy0uOTQ1LTIuMTA3LTIuMTA3IDAtMS4xNjEuOTQ1LTIuMTA3IDIuMTA3LTIuMTA3IDEuMTYxIDAgMi4xMDYuOTQ1IDIuMTA2IDIuMTA3IDAgMS4xNjEtLjk0NSAyLjEwNy0yLjEwNiAyLjEwNyIgZmlsbD0iI2ZhZmFmYSIgZmlsbC1vcGFjaXR5PSIuOTAzIiBzdHJva2Utd2lkdGg9IjEuMzE3Ii8+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"kgeography,kgeography,geography\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kgeography.desktop\"\nLABEL oc.launch=\"kgeography.kgeography\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Kgeography\"\nLABEL oc.displayname=\"Kgeography\"\nLABEL oc.path=\"/usr/bin/kgeography\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Kgeography\"\nENV APPBIN \"/usr/bin/kgeography\"\nENV APP \"/usr/bin/kgeography\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kgeography/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kgeography/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Kgeography

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Kgeography.d\n
"},{"location":"applications/kgeography/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Kgeography.d -t Kgeography .\n
"},{"location":"applications/kgeography/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Kgeography > Kgeography.json\ndocker image save Kgeography -o Kgeography.tar\nctr -n k8s.io images import Kgeography.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Kgeography.json\n\n
"},{"location":"applications/kigo/","title":"kigo","text":""},{"location":"applications/kigo/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/kigo/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/kigo/#ubuntu-packages","title":"Ubuntu packages","text":"
dbus-x11 dbus-user-session gnugo kigo\n
"},{"location":"applications/kigo/#displayname","title":"Displayname","text":"
kigo\n
"},{"location":"applications/kigo/#path","title":"Path","text":"
/usr/games/kigo\n
"},{"location":"applications/kigo/#mimetype","title":"Mimetype","text":"
application/x-go-sgf;\n
"},{"location":"applications/kigo/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/kigo/#wm_class","title":"WM_CLASS","text":"
kigo.kigo\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/kigo/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.kde.kigo.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/kigo/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

COPY composer/init.d/init.kigo /composer/init.d/init.kigo\n
"},{"location":"applications/kigo/#json-dump","title":"JSON dump","text":"

json source file kigo.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"args\": \"\",\n    \"debpackage\": \"dbus-x11 dbus-user-session gnugo kigo\",\n    \"icon\": \"kigo.svg\",\n    \"keyword\": \"go,kigo,gnugo\",\n    \"launch\": \"kigo.kigo\",\n    \"name\": \"kigo\",\n    \"mimetype\": \"application/x-go-sgf;\",\n    \"displayname\": \"kigo\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"path\": \"/usr/games/kigo\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.kigo.desktop\",\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.kigo /composer/init.d/init.kigo\"\n    ]\n}\n
"},{"location":"applications/kigo/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output kigo.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kigo.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kigo.d.3.0.json\n\n
"},{"location":"applications/kigo/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.kigo /composer/init.d/init.kigo\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus-x11 dbus-user-session gnugo kigo && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"kigo.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojODJiMzM5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzhkYzEzZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTEpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMSkiPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLDEpIj4KICAgIDxnIHN0eWxlPSJvcGFjaXR5Oi4xIj4KICAgICA8cGF0aCBkPSJtMjMgMzAuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIvPgogICAgIDxwYXRoIGQ9Im0zNiAzMC41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41Ii8+CiAgICAgPHBhdGggZD0ibTIzIDE3LjVjMCAzLjAzOS0yLjQ2MSA1LjUtNS41IDUuNXMtNS41LTIuNDYxLTUuNS01LjUgMi40NjEtNS41IDUuNS01LjUgNS41IDIuNDYxIDUuNSA1LjUiLz4KICAgICA8cGF0aCBkPSJtMzYgMTcuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im0yMyAzMC41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41IiBzdHlsZT0iZmlsbDojMmQyZDJkIi8+CiAgPHBhdGggZD0ibTM2IDMwLjVjMCAzLjAzOS0yLjQ2MSA1LjUtNS41IDUuNXMtNS41LTIuNDYxLTUuNS01LjUgMi40NjEtNS41IDUuNS01LjUgNS41IDIuNDYxIDUuNSA1LjUiIHN0eWxlPSJmaWxsOiNmOWY5ZjkiLz4KICA8cGF0aCBkPSJtMjMgMTcuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIgc3R5bGU9ImZpbGw6I2Y5ZjlmOSIvPgogIDxwYXRoIGQ9Im0zNiAxNy41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41IiBzdHlsZT0iZmlsbDojMmQyZDJkIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"kigo,go,kigo,gnugo\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.kde.kigo.desktop\"\nLABEL oc.launch=\"kigo.kigo\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"kigo\"\nLABEL oc.displayname=\"kigo\"\nLABEL oc.path=\"/usr/games/kigo\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-go-sgf;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kigo\"\nENV APPBIN \"/usr/games/kigo\"\nENV APP \"/usr/games/kigo\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kigo/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kigo/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application kigo

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kigo.d\n
"},{"location":"applications/kigo/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f kigo.d -t kigo .\n
"},{"location":"applications/kigo/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect kigo > kigo.json\ndocker image save kigo -o kigo.tar\nctr -n k8s.io images import kigo.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kigo.json\n\n
"},{"location":"applications/klickety/","title":"Klickety","text":""},{"location":"applications/klickety/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/klickety/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/klickety/#ubuntu-packages","title":"Ubuntu packages","text":"
breeze-icon-theme dbus-x11 dbus-user-session klickety\n
"},{"location":"applications/klickety/#path","title":"Path","text":"
/usr/games/klickety\n
"},{"location":"applications/klickety/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/klickety/#wm_class","title":"WM_CLASS","text":"
klickety.klickety\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/klickety/#json-dump","title":"JSON dump","text":"

json source file klickety.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"breeze-icon-theme dbus-x11 dbus-user-session klickety\",\n    \"icon\": \"klickety.svg\",\n    \"keyword\": \"klickety\",\n    \"launch\": \"klickety.klickety\",\n    \"name\": \"Klickety\",\n    \"path\": \"/usr/games/klickety\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/klickety/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output klickety.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klickety.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klickety.d.3.0.json\n\n
"},{"location":"applications/klickety/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends breeze-icon-theme dbus-x11 dbus-user-session klickety && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"klickety.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6bnMxPSJodHRwOi8vc296aS5iYWllcm91Z2UuZnIiCiAgICB4bWxuczpjYz0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvIgogICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgICBpZD0ic3ZnMSIKICAgIHNvZGlwb2RpOmRvY25hbWU9ImtsaWNrZXR5LnN2ZyIKICAgIHZpZXdCb3g9IjAgMCA2MCA2MCIKICAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgICBfU1ZHRmlsZV9fZmlsZW5hbWU9Im9sZHNjYWxlL2FwcHMva2xpY2tldHkuc3ZnIgogICAgdmVyc2lvbj0iMS4wIgogICAgeT0iMCIKICAgIHg9IjAiCiAgICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQwIgogICAgc29kaXBvZGk6ZG9jYmFzZT0iL2hvbWUvZGFubnkvd29yay9mbGF0L1NWRy9tb25vL3NjYWxhYmxlL2FwcHMiCiAgPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICAgaWQ9ImJhc2UiCiAgICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI2OTkiCiAgICAgIGlua3NjYXBlOnpvb209IjUuMzE1Nzc5NSIKICAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMSIKICAgICAgaW5rc2NhcGU6Y3g9IjU0LjcwNjc3MSIKICAgICAgaW5rc2NhcGU6Y3k9IjIwLjY3MTY0MyIKICAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMDI0IgogICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogIC8+CiAgPHBhdGgKICAgICAgaWQ9InBhdGgxMTAwIgogICAgICBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZTojZmZmZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS13aWR0aDo4LjEyNTtmaWxsOm5vbmUiCiAgICAgIGQ9Im0xMC4wNTEgNC42ODcydjUwLjYyNmgzOS44OTh2LTUwLjYyNiIKICAvPgogIDxnCiAgICAgIGlkPSJnMTA4MSIKICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoLjkzMTU4IDAgMCAuOTMxNTggMi4xNzI2IDEuOTMyMykiCiAgICA+CiAgICA8cmVjdAogICAgICAgIGlkPSJyZWN0OTMxIgogICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6My4xMjU7ZmlsbDojZmZmZmZmIgogICAgICAgIHJ4PSIxLjYxMzQiCiAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS45MzgyIC0uMzU5ODkpIgogICAgICAgIGhlaWdodD0iNTQuNzA0IgogICAgICAgIHdpZHRoPSI0My4wMDciCiAgICAgICAgeT0iMi45NTcyIgogICAgICAgIHg9IjIuNTE5MiIKICAgIC8+CiAgICA8cGF0aAogICAgICAgIGlkPSJwYXRoOTMyIgogICAgICAgIHN0eWxlPSJzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjMuMzU0NTtmaWxsOm5vbmUiCiAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtLjM1OTg5KSIKICAgICAgICBkPSJtOC40NTc1IDMuMzE3MXY1NC4zNDRoNDIuODI4bC0wLjAwMS01NC4zNDQiCiAgICAvPgogICAgPGcKICAgICAgICBpZD0iZzk0NSIKICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSguMDI3MzEwKSIKICAgICAgPgogICAgICA8ZwogICAgICAgICAgaWQ9Imc5MzIiCiAgICAgICAgPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTMzIgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTgzNDtmaWxsOiMwMDAwMDAiCiAgICAgICAgICAgIGQ9Im0xMi42OTYgNDUuNjA0Yy0wLjU1NCAwLTEgMC40NDYtMSAxdjYuODE4YzAgMC41NTQgMC40NDYgMSAxIDFoNi44MThjMC41NTQgMCAxLTAuNDQ2IDEtMXYtNi44MThjMC0wLjU1NC0wLjQ0Ni0xLTEtMWgtNi44MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxNDggMCAwIDEuMDE0OCAuMDE2NDYxIC0xLjE3MjcpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5MzQiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45ODM0O2ZpbGw6IzAwMDAwMCIKICAgICAgICAgICAgZD0ibTIzLjUwNiA0NS4yNDRjLTAuNTU0IDAtMSAwLjQ0Ni0xIDF2Ni44MThjMCAwLjU1NCAwLjQ0NiAxIDEgMWg2LjgxOGMwLjU1NCAwIDEtMC40NDYgMS0xdi02LjgxOGMwLTAuNTU0LTAuNDQ2LTEtMS0xaC02LjgxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDE0OCAwIDAgMS4wMTQ4IC0xLjk5MjIgLS44MDc1MikiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDkzNSIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjk4MzQ7ZmlsbDojMDAwMDAwIgogICAgICAgICAgICBkPSJtMzQuMTM2IDQ1LjI0NGMtMC41NTQgMC0xIDAuNDQ2LTEgMXY2LjgxOGMwIDAuNTU0IDAuNDQ2IDEgMSAxaDYuODE4YzAuNTU0IDAgMS0wLjQ0NiAxLTF2LTYuODE4YzAtMC41NTQtMC40NDYtMS0xLTFoLTYuODE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTQ4IDAgMCAxLjAxNDggLTMuODE4MiAtLjgwNzUyKSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTM3IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im0yMy41MyA0NS4xMDVjLTAuNTYyIDAtMS4wMTQgMC40NTMtMS4wMTQgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MiAxLjAxNSAxLjAxNCAxLjAxNWg2LjkxOGMwLjU2MyAwIDEuMDE1LTAuNDUzIDEuMDE1LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUyLTEuMDE1LTEuMDE1LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgMSAwIC02LjA3MDggNzYuNTMyKSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTM4IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im0zMi40OTEgNDUuMTA1Yy0wLjU2MiAwLTEuMDE1IDAuNDUzLTEuMDE1IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTMgMS4wMTUgMS4wMTUgMS4wMTVoNi45MThjMC41NjIgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1My0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwIC0xIDEgMCAtNi4wNzA4IDc2LjUzMikiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDkzOSIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAxMjc7ZmlsbDojZmZmZmZmIgogICAgICAgICAgICBkPSJtNDEuNDUyIDQ1LjEwNWMtMC41NjIgMC0xLjAxNSAwLjQ1My0xLjAxNSAxLjAxNXY2LjkxOGMwIDAuNTYyIDAuNDUzIDEuMDE1IDEuMDE1IDEuMDE1aDYuOTE4YzAuNTYyIDAgMS4wMTUtMC40NTMgMS4wMTUtMS4wMTV2LTYuOTE4YzAtMC41NjItMC40NTMtMS4wMTUtMS4wMTUtMS4wMTVoLTYuOTE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAtMSAxIDAgLTYuMDcwOCA3Ni41MzIpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDAiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibS00NC4wNCAyOC40MDRjLTAuNTYzIDAtMS4wMTUgMC40NTMtMS4wMTUgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MiAxLjAxNSAxLjAxNSAxLjAxNWg2LjkxOGMwLjU2MiAwIDEuMDE0LTAuNDUzIDEuMDE0LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUyLTEuMDE1LTEuMDE0LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgMSAwIDEuNDM5NiAwKSIKICAgICAgICAvPgogICAgICA8L2cKICAgICAgPgogICAgICA8ZwogICAgICAgICAgaWQ9Imc5NDAiCiAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtLjMyMzQ0KSIKICAgICAgICA+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDEiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibTEyLjkgMTMuMjE1Yy0wLjU2MiAwLTEuMDE0IDAuNDUzLTEuMDE0IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTIgMS4wMTUgMS4wMTQgMS4wMTVoNi45MThjMC41NjMgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1Mi0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwIDEgLTEgMCAzNC4zNzIgLTYuOTExNSkiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDk0MiIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAxMjc7ZmlsbDojZmZmZmZmIgogICAgICAgICAgICBkPSJtMjEuODYxIDEzLjIxNWMtMC41NjIgMC0xLjAxNSAwLjQ1My0xLjAxNSAxLjAxNXY2LjkxOGMwIDAuNTYyIDAuNDUzIDEuMDE1IDEuMDE1IDEuMDE1aDYuOTE4YzAuNTYyIDAgMS4wMTUtMC40NTMgMS4wMTUtMS4wMTV2LTYuOTE4YzAtMC41NjItMC40NTMtMS4wMTUtMS4wMTUtMS4wMTVoLTYuOTE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAxIC0xIDAgMzQuMzcyIC02LjkxMTUpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDMiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibTMwLjgyMiAxMy4yMTVjLTAuNTYyIDAtMS4wMTUgMC40NTMtMS4wMTUgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MyAxLjAxNSAxLjAxNSAxLjAxNWg2LjkxOGMwLjU2MiAwIDEuMDE1LTAuNDUzIDEuMDE1LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUzLTEuMDE1LTEuMDE1LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgMSAtMSAwIDM0LjM3MiAtNi45MTE1KSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTQ0IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im01Ljk4ODktMzEuNzg3Yy0wLjU2MjIgMC0xLjAxNDcgMC40NTMtMS4wMTQ3IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTI1IDEuMDE1IDEuMDE0NyAxLjAxNWg2LjkxODFjMC41NjIgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1My0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTgxeiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAxIC0xIDAgLTEuMjU5NiAwKSIKICAgICAgICAvPgogICAgICA8L2cKICAgICAgPgogICAgPC9nCiAgICA+CiAgPC9nCiAgPgogIDxtZXRhZGF0YQogICAgPgogICAgPHJkZjpSREYKICAgICAgPgogICAgICA8Y2M6V29yawogICAgICAgID4KICAgICAgICA8ZGM6Zm9ybWF0CiAgICAgICAgICA+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0CiAgICAgICAgPgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiCiAgICAgICAgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbi8iCiAgICAgICAgLz4KICAgICAgICA8ZGM6cHVibGlzaGVyCiAgICAgICAgICA+CiAgICAgICAgICA8Y2M6QWdlbnQKICAgICAgICAgICAgICByZGY6YWJvdXQ9Imh0dHA6Ly9vcGVuY2xpcGFydC5vcmcvIgogICAgICAgICAgICA+CiAgICAgICAgICAgIDxkYzp0aXRsZQogICAgICAgICAgICAgID5PcGVuY2xpcGFydDwvZGM6dGl0bGUKICAgICAgICAgICAgPgogICAgICAgICAgPC9jYzpBZ2VudAogICAgICAgICAgPgogICAgICAgIDwvZGM6cHVibGlzaGVyCiAgICAgICAgPgogICAgICA8L2NjOldvcmsKICAgICAgPgogICAgICA8Y2M6TGljZW5zZQogICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4vIgogICAgICAgID4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zI1JlcHJvZHVjdGlvbiIKICAgICAgICAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjRGlzdHJpYnV0aW9uIgogICAgICAgIC8+CiAgICAgICAgPGNjOnBlcm1pdHMKICAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNEZXJpdmF0aXZlV29ya3MiCiAgICAgICAgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"klickety,klickety\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"klickety.klickety\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Klickety\"\nLABEL oc.displayname=\"Klickety\"\nLABEL oc.path=\"/usr/games/klickety\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Klickety\"\nENV APPBIN \"/usr/games/klickety\"\nENV APP \"/usr/games/klickety\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/klickety/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/klickety/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Klickety

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Klickety.d\n
"},{"location":"applications/klickety/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Klickety.d -t Klickety .\n
"},{"location":"applications/klickety/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Klickety > Klickety.json\ndocker image save Klickety -o Klickety.tar\nctr -n k8s.io images import Klickety.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Klickety.json\n\n
"},{"location":"applications/klotski/","title":"klotski","text":""},{"location":"applications/klotski/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/klotski/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/klotski/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-klotski\n
"},{"location":"applications/klotski/#path","title":"Path","text":"
/usr/games/gnome-klotski\n
"},{"location":"applications/klotski/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/klotski/#wm_class","title":"WM_CLASS","text":"
gnome-klotski.Gnome-klotski\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/klotski/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/gnome-klotski.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/klotski/#json-dump","title":"JSON dump","text":"

json source file klotski.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-klotski\",\n    \"icon\": \"circle_gnome-klotski.svg\",\n    \"keyword\": \"gnome klotski,game klotski,klotski\",\n    \"launch\": \"gnome-klotski.Gnome-klotski\",\n    \"name\": \"klotski\",\n    \"host_config\": {\n        \"mem_limit\": \"384M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    },\n    \"path\": \"/usr/games/gnome-klotski\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/gnome-klotski.desktop\"\n}\n
"},{"location":"applications/klotski/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output klotski.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klotski.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klotski.d.3.0.json\n\n
"},{"location":"applications/klotski/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-klotski && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-klotski.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTYuOTMzIDE2LjkzMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcyBpZD0iZGVmczE4Ij4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA1OCI+CiAgIDxzdG9wIGlkPSJzdG9wMTA1NCIgc3RvcC1jb2xvcj0iIzEzNmRlMiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wMTA1NiIgc3RvcC1jb2xvcj0iIzI2YmJjZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA0MiI+CiAgIDxzdG9wIGlkPSJzdG9wMTAzOCIgc3RvcC1jb2xvcj0iI2ZmYjYzNiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wMTA0MCIgc3RvcC1jb2xvcj0iI2VlZWQ1MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjIiIHN0ZERldmlhdGlvbj0iMC4yMzgxMjAzMiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjkuMjYwMyIgeDI9IjkuMjYwMyIgeTE9Ii0uMjYyNDkiIHkyPSIxNS42MTIiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS43OTM4NCAuNzkxNjQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wNSIgc3RvcC1jb2xvcj0iIzJlMzIzZSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wNyIgc3RvcC1jb2xvcj0iIzUwNTY2NCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMyIiB4PSItLjA2IiB5PSItLjA2IiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzNCIgc3RkRGV2aWF0aW9uPSIwLjYiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA0NCIgeDE9IjM4LjgzOCIgeDI9IjM4Ljg3NSIgeTE9IjMxLjgyOSIgeTI9IjE1LjU5OCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNDIiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA1MiIgeDE9IjE2IiB4Mj0iMzEuMzU5IiB5MT0iMzkuMDQiIHkyPSIzOS4wNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNDIiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA2MCIgeDE9IjI5LjkxOSIgeDI9IjI5Ljk3NSIgeTE9IjM0Ljc2NyIgeTI9IjI1LjMzOSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNTgiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA2OCIgeDE9IjE3LjQ0MyIgeDI9IjE3LjcxIiB5MT0iMjIuNTAyIiB5Mj0iMTMuNDk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTA1OCIvPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlMjAiIGN4PSI4LjQ2NjUiIGN5PSI4LjQ2NjUiIHI9IjcuOTM3MyIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjk2Mjk5IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPGNpcmNsZSBpZD0iY2lyY2xlMjIiIGN4PSI4LjQ2NjUiIGN5PSI4LjQ2NjUiIHI9IjcuOTM3MyIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIuOTYyOTkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiA8ZyBpZD0iZzMzIiB0cmFuc2Zvcm09Im1hdHJpeCguMzM4NjYgMCAwIC4zMzg2NiAuNTA3OTkgLjUwNzk5KSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMzIpIiBvcGFjaXR5PSIuMjUiPgogIDxwYXRoIGlkPSJwYXRoMjEiIGQ9Im0xNS4zMzIgMTRoNS4zMzZjMC43MzQgMCAxLjMzMiAwLjU5OCAxLjMzMiAxLjMzMnY1LjMzNmMwIDAuNzM0LTAuNTk4IDEuMzMyLTEuMzMyIDEuMzMyaC01LjMzNmMtMC43MzQgMC0xLjMzMi0wLjU5OC0xLjMzMi0xLjMzMnYtNS4zMzZjMC0wLjczNCAwLjU5OC0xLjMzMiAxLjMzMi0xLjMzMiIvPgogIDxwYXRoIGlkPSJwYXRoMjMiIGQ9Im0yNy4zMzIgMjZoNS4zMzZjMC43MzggMCAxLjMzMiAwLjU5OCAxLjMzMiAxLjMzMnY1LjMzNmMwIDAuNzM4LTAuNTk0IDEuMzMyLTEuMzMyIDEuMzMyaC01LjMzNmMtMC43MzQgMC0xLjMzMi0wLjU5NC0xLjMzMi0xLjMzMnYtNS4zMzZjMC0wLjczNCAwLjU5OC0xLjMzMiAxLjMzMi0xLjMzMiIvPgogIDxwYXRoIGlkPSJwYXRoMjUiIGQ9Im0xNCAyNGMtMS4xMDkgMC0yIDAuODkxLTIgMnY4YzAgMS4xMDkgMC44OTEgMiAyIDJoOGMxLjEwOSAwIDItMC44OTEgMi0ydi04YzAtMS4xMDktMC44OTEtMi0yLTJtLTggMWg4YzAuNTU1IDAgMSAwLjQ0NSAxIDF2OGMwIDAuNTU1LTAuNDQ1IDEtMSAxaC04Yy0wLjU1NSAwLTEtMC40NDUtMS0xdi04YzAtMC41NTUgMC40NDUtMSAxLTEiLz4KICA8cGF0aCBpZD0icGF0aDI3IiBkPSJtMTUgMjZoNmMwLjU1MSAwIDEgMC40NDkgMSAxdjZjMCAwLjU1MS0wLjQ0OSAxLTEgMWgtNmMtMC41NTEgMC0xLTAuNDQ5LTEtMXYtNmMwLTAuNTUxIDAuNDQ5LTEgMS0xIi8+CiAgPHBhdGggaWQ9InBhdGgyOSIgZD0ibTI2IDEyYy0xLjEwOSAwLTIgMC44OTEtMiAydjhjMCAxLjEwOSAwLjg5MSAyIDIgMmg4YzEuMTA5IDAgMi0wLjg5MSAyLTJ2LThjMC0xLjEwOS0wLjg5MS0yLTItMm0tOCAxaDhjMC41NTUgMCAxIDAuNDQ1IDEgMXY4YzAgMC41NTUtMC40NDUgMS0xIDFoLThjLTAuNTU1IDAtMS0wLjQ0NS0xLTF2LThjMC0wLjU1NSAwLjQ0NS0xIDEtMSIvPgogIDxwYXRoIGlkPSJwYXRoMzEiIGQ9Im0yNyAxNGg2YzAuNTUxIDAgMSAwLjQ0OSAxIDF2NmMwIDAuNTUxLTAuNDQ5IDEtMSAxaC02Yy0wLjU1MSAwLTEtMC40NDktMS0xdi02YzAtMC41NTEgMC40NDktMSAxLTEiLz4KIDwvZz4KIDxnIGlkPSJnNTkiIHRyYW5zZm9ybT0ibWF0cml4KC4zMzg2NiAwIDAgLjMzODY2IC4xNjkzMyAuMTY5MzMpIj4KICA8ZyBpZD0iZzU3Ij4KICAgPGcgaWQ9Imc1NSI+CiAgICA8cGF0aCBpZD0icGF0aDQzIiBkPSJtMTUuMzMyIDE0aDUuMzM2YzAuNzM0IDAgMS4zMzIgMC41OTggMS4zMzIgMS4zMzJ2NS4zMzZjMCAwLjczNC0wLjU5OCAxLjMzMi0xLjMzMiAxLjMzMmgtNS4zMzZjLTAuNzM0IDAtMS4zMzItMC41OTgtMS4zMzItMS4zMzJ2LTUuMzM2YzAtMC43MzQgMC41OTgtMS4zMzIgMS4zMzItMS4zMzIiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQxMDY4KSIvPgogICAgPHBhdGggaWQ9InBhdGg0NSIgZD0ibTI3LjMzMiAyNmg1LjMzNmMwLjczOCAwIDEuMzMyIDAuNTk4IDEuMzMyIDEuMzMydjUuMzM2YzAgMC43MzgtMC41OTQgMS4zMzItMS4zMzIgMS4zMzJoLTUuMzM2Yy0wLjczNCAwLTEuMzMyLTAuNTk0LTEuMzMyLTEuMzMydi01LjMzNmMwLTAuNzM0IDAuNTk4LTEuMzMyIDEuMzMyLTEuMzMyIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MTA2MCkiLz4KICAgIDxwYXRoIGlkPSJwYXRoNDciIHRyYW5zZm9ybT0ibWF0cml4KC43ODEyNSAwIDAgLjc4MTI1IC0uNSAtLjUpIiBkPSJtMTguNTYxIDMxLjM1OWMtMS40MTk1IDAtMi41NjA1IDEuMTQxLTIuNTYwNSAyLjU2MDV2MTAuMjRjMCAxLjQxOTUgMS4xNDEgMi41NjA1IDIuNTYwNSAyLjU2MDVoMTAuMjRjMS40MTk1IDAgMi41NTg2LTEuMTQxIDIuNTU4Ni0yLjU2MDV2LTEwLjI0YzAtMS40MTk1LTEuMTM5MS0yLjU2MDUtMi41NTg2LTIuNTYwNWgtMTAuMjR6bTAgMS4yODEyaDEwLjI0YzAuNzEwNCAwIDEuMjc5MyAwLjU2ODkgMS4yNzkzIDEuMjc5M3YxMC4yNGMwIDAuNzEwNC0wLjU2ODkgMS4yNzkzLTEuMjc5MyAxLjI3OTNoLTEwLjI0Yy0wLjcxMDQgMC0xLjI4MTItMC41Njg5LTEuMjgxMi0xLjI3OTN2LTEwLjI0YzAtMC43MTA0IDAuNTcwODUtMS4yNzkzIDEuMjgxMi0xLjI3OTN6bTEuMjc5MyAxLjI3OTNjLTAuNzA1MjggMC0xLjI3OTMgMC41NzQwMi0xLjI3OTMgMS4yNzkzdjcuNjgxNmMwIDAuNzA1MjggMC41NzQwMiAxLjI3OTMgMS4yNzkzIDEuMjc5M2g3LjY3OTdjMC43MDUyOCAwIDEuMjgxMi0wLjU3NDAyIDEuMjgxMi0xLjI3OTN2LTcuNjgxNmMwLTAuNzA1MjgtMC41NzU5Ny0xLjI3OTMtMS4yODEyLTEuMjc5M2gtNy42Nzk3eiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDEwNTIpIi8+CiAgICA8cGF0aCBpZD0icGF0aDUxIiB0cmFuc2Zvcm09Im1hdHJpeCguNzgxMjUgMCAwIC43ODEyNSAtLjUgLS41KSIgZD0ibTMzLjkyIDE2Yy0xLjQxOTUgMC0yLjU2MDUgMS4xNDEtMi41NjA1IDIuNTYwNXYxMC4yNGMwIDEuNDE5NSAxLjE0MSAyLjU1ODYgMi41NjA1IDIuNTU4NmgxMC4yNGMxLjQxOTUgMCAyLjU2MDUtMS4xMzkxIDIuNTYwNS0yLjU1ODZ2LTEwLjI0YzAtMS40MTk1LTEuMTQxLTIuNTYwNS0yLjU2MDUtMi41NjA1aC0xMC4yNHptMCAxLjI3OTNoMTAuMjRjMC43MTA0IDAgMS4yNzkzIDAuNTcwODUgMS4yNzkzIDEuMjgxMnYxMC4yNGMwIDAuNzEwNC0wLjU2ODkgMS4yNzkzLTEuMjc5MyAxLjI3OTNoLTEwLjI0Yy0wLjcxMDQgMC0xLjI3OTMtMC41Njg5LTEuMjc5My0xLjI3OTN2LTEwLjI0YzAtMC43MTA0IDAuNTY4OS0xLjI4MTIgMS4yNzkzLTEuMjgxMnptMS4yNzkzIDEuMjgxMmMtMC43MDUyOCAwLTEuMjc5MyAwLjU3NDAyLTEuMjc5MyAxLjI3OTN2Ny42Nzk3YzAgMC43MDUyOCAwLjU3NDAyIDEuMjgxMiAxLjI3OTMgMS4yODEyaDcuNjgxNmMwLjcwNTI4IDAgMS4yNzkzLTAuNTc1OTcgMS4yNzkzLTEuMjgxMnYtNy42Nzk3YzAtMC43MDUyOC0wLjU3NDAyLTEuMjc5My0xLjI3OTMtMS4yNzkzaC03LjY4MTZ6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MTA0NCkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"klotski,gnome klotski,game klotski,klotski\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-klotski.desktop\"\nLABEL oc.launch=\"gnome-klotski.Gnome-klotski\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"klotski\"\nLABEL oc.displayname=\"klotski\"\nLABEL oc.path=\"/usr/games/gnome-klotski\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"384M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"klotski\"\nENV APPBIN \"/usr/games/gnome-klotski\"\nENV APP \"/usr/games/gnome-klotski\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/klotski/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/klotski/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application klotski

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klotski.d\n
"},{"location":"applications/klotski/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f klotski.d -t klotski .\n
"},{"location":"applications/klotski/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect klotski > klotski.json\ndocker image save klotski -o klotski.tar\nctr -n k8s.io images import klotski.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klotski.json\n\n
"},{"location":"applications/konsole/","title":"konsole","text":""},{"location":"applications/konsole/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/konsole/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/konsole/#alpine-packages","title":"Alpine packages","text":"
konsole, sudo\n
"},{"location":"applications/konsole/#path","title":"Path","text":"
/usr/bin/konsole\n
"},{"location":"applications/konsole/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/konsole/#wm_class","title":"WM_CLASS","text":"
konsole.konsole\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/konsole/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
"},{"location":"applications/konsole/#json-dump","title":"JSON dump","text":"

json source file konsole.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n    ],\n    \"icon\": \"konsole.svg\",\n    \"apkpackage\": \"konsole, sudo\",\n    \"keyword\": \"ksonsole,console,shell,bash,sh\",\n    \"launch\": \"konsole.konsole\",\n    \"name\": \"konsole\",\n    \"path\": \"/usr/bin/konsole\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"quick\": true\n}\n
"},{"location":"applications/konsole/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output konsole.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/konsole.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @konsole.d.3.0.json\n\n
"},{"location":"applications/konsole/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update konsole, sudo\nLABEL oc.icon=\"konsole.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyOCIgaGVpZ2h0PSIxMjgiPgogIDxkZWZzPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJvIiB4Mj0iMSIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMxMTEiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNTU1Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJuIiB4MT0iNTUuOTUiIHgyPSI1NS45NSIgeTE9IjgxIiB5Mj0iODAiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wODggMCAwIDEgMy4zNjQgMTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI0ZGRiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFRUUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0NCIgeDI9IjQ0IiB5MT0iNDQiIHkyPSI0MCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSIjRkZGIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0VFRUVFQyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjI0IiB4Mj0iMjQiIHkxPSI0MCIgeTI9IjIwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9IiNGRkYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRUVFRUVDIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iOSIgeDI9IjEwNi41NiIgeTE9IjI0LjMyIiB5Mj0iNTMuNjYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNTU1NzUzIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iLjYzIiBzdG9wLWNvbG9yPSIjMkUyRTJFIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzJFMkUyRSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjU2IiB4Mj0iNTYiIHkxPSI4MSIgeTI9IjciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wODIgMCAwIDEuMDE0IDMuNDMgNy45MDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI0JCQiIvPgogICAgICA8c3RvcCBvZmZzZXQ9Ii41OSIgc3RvcC1jb2xvcj0iIzlGOUY5RiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM4ODgiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJpIiB4MT0iMjQiIHgyPSIyNCIgeTE9IjQwIiB5Mj0iMjAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2IiIGlkPSJqIiB4MT0iNDQiIHgyPSI0NCIgeTE9IjQ0IiB5Mj0iNDAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJsIiB4MT0iMjQiIHgyPSIyNCIgeTE9IjQwIiB5Mj0iMjAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2MiIGlkPSJmIiB4MT0iOCIgeDI9IjEyMCIgeTE9IjQwLjY3IiB5Mj0iNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOCAwIC05LjE4OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2QiIGlkPSJwIiB4MT0iNjQiIHgyPSI2NCIgeTE9IjE3LjM2IiB5Mj0iNjUuODciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOCAwIC05LjE4OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8ZmlsdGVyIGlkPSJrIiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjQ4IiB4PSItLjEiIHk9Ii0uMiI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii40Ii8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9Im0iIHdpZHRoPSIxLjIyIiBoZWlnaHQ9IjEuMTciIHg9Ii0uMSIgeT0iLS4xIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjcyIi8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9ImUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjA4Ii8+CiAgICA8L2ZpbHRlcj4KICAgIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjUyIiBjeT0iLTMxIiByPSIxMzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iNTIiIGN5PSItMzEiIHI9IjEzNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNjNmM2YzYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIuNTIiIHN0b3AtY29sb3I9IiNFRUUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYzZjNmM2Ii8+CiAgICA8L3JhZGlhbEdyYWRpZW50PgogIDwvZGVmcz4KICA8cGF0aCBkPSJNMyAwQzEuNCAwIDAgMS40IDAgM3Y5MGMwIDEuNiAxLjQgMyAzIDNoMTA2YzEuNiAwIDMtMS40IDMtM1YzYzAtMS42LTEuNC0zLTMtM0gzeiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuNSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMzYgMCAwIDEuMTM1IDYgNykiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2YpIiBkPSJNMTEgOGMtMS42IDAtMyAxLjUtMyAzLjN2OTdjMCAyIDEuNCAzLjQgMyAzLjRoMTA2YzEuNiAwIDMtMS41IDMtMy4zdi05N2MwLTItMS40LTMuMy0zLTMuM0gxMXoiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2cpIiBkPSJNMTIgMTVjLS41IDAtMSAuNS0xIDF2NzNjMCAuNi41IDEgMSAxaDEwNGMuNSAwIDEtLjUgMS0xVjE2YzAtLjYtLjUtMS0xLTFIMTJ6Ii8+CiAgPHBhdGggZD0iTTEyIDE2aDEwNHY4MEgxMnoiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2gpIiBkPSJNMTAzIDc2YzAgMS42LTEuNCAzLTMgM0gxMmMtMS42IDAtMy0xLjQtMy0zVjEyYzAtMS42IDEuNC0zIDMtM2g4OGMxLjYgMCAzIDEuNCAzIDN2NjR6IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjA4NSAwIDAgMS4xMTQgMy4yMzQgNi45NykiLz4KICA8cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTMgNTNjNDItMjIuNCA4Mi4yLTI3LjYgMTAyLTI4LjdWMTdIMTN2MzZ6IiBvcGFjaXR5PSIuMDUiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2kpIiBkPSJtMzYgNDgtMTYgOHYtNC4zTDMwLjcgNDYgMjAgNDAuM1YzNmwxNiA4LjNWNDh6IiBvcGFjaXR5PSIuOSIvPgogIDxwYXRoIGZpbGw9InVybCgjaikiIGQ9Ik01NiA2MEg0MHYtNGgxNnY0eiIgb3BhY2l0eT0iLjkiLz4KICA8cGF0aCBmaWxsPSIjZmZmIiBkPSJNNjAgNjBINDR2LTRoMTZ2NHoiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjIiIHRyYW5zZm9ybT0ibWF0cml4KDEuMTI1IDAgMCAxLjUgLTEwLjUgLTI5KSIvPgogIDxwYXRoIGZpbGw9InVybCgjbCkiIGQ9Im0zNiA0OC0xNiA4di00LjNMMzAuNyA0NiAyMCA0MC4zVjM2bDE2IDguM1Y0OHoiIGZpbHRlcj0idXJsKCNtKSIgb3BhY2l0eT0iLjQiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI24pIiBkPSJtMTE3LjIgOTYuNy0uNi0uN0gxMmwtLjguNmMuMi4yLjUuNC44LjRoMTA0LjVjLjMgMCAuNSAwIC43LS4zeiIvPgogIDxnIGZpbGw9InVybCgjbykiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDggMTUpIj4KICAgIDxjaXJjbGUgY3g9IjEwMSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxMDQiIGN5PSI4OSIgcj0iMSIvPgogICAgPGNpcmNsZSBjeD0iMTAzIiBjeT0iOTIiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9Ijk3IiBjeT0iODYiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjEwMCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzOSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyOSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyOCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxMyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxOSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5IiBjeT0iODYiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iODkiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjExIiBjeT0iOTIiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjgiIGN5PSI4OSIgcj0iMSIvPgogIDwvZz4KICA8cGF0aCBmaWxsPSJ1cmwoI3ApIiBkPSJNMTEgOGMtMS42IDAtMyAxLjUtMyAzLjN2OTdjMCAxIC40IDIgMSAyLjZWMTIuM2MwLTEuOCAxLjMtMy4yIDMtMy4yaDEwNGMxLjcgMCAzIDEuNCAzIDMuMi43IDI1IDAgOTguMiAwIDk4LjJ2LjNjLjYtLjcgMS0xLjYgMS0yLjV2LTk3YzAtMS44LTEuNC0zLjItMy0zLjJIMTF6IiBvcGFjaXR5PSIuOSIvPgo8L3N2Zz4=\"\nLABEL oc.keyword=\"konsole,ksonsole,console,shell,bash,sh\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"konsole.konsole\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"konsole\"\nLABEL oc.displayname=\"konsole\"\nLABEL oc.path=\"/usr/bin/konsole\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"konsole\"\nENV APPBIN \"/usr/bin/konsole\"\nENV APP \"/usr/bin/konsole\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/konsole/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/konsole/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application konsole

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/konsole.d\n
"},{"location":"applications/konsole/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f konsole.d -t konsole .\n
"},{"location":"applications/konsole/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect konsole > konsole.json\ndocker image save konsole -o konsole.tar\nctr -n k8s.io images import konsole.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @konsole.json\n\n
"},{"location":"applications/ksquares/","title":"kSquares","text":""},{"location":"applications/ksquares/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu

"},{"location":"applications/ksquares/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/ksquares/#ubuntu-packages","title":"Ubuntu packages","text":"
dbus-x11 dbus-user-session ksquares\n
"},{"location":"applications/ksquares/#path","title":"Path","text":"
/usr/games/ksquares\n
"},{"location":"applications/ksquares/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/ksquares/#wm_class","title":"WM_CLASS","text":"
ksquares.ksquares\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/ksquares/#json-dump","title":"JSON dump","text":"

json source file ksquares.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"dbus-x11 dbus-user-session ksquares\",\n    \"icon\": \"ksquares.svg\",\n    \"keyword\": \"ksquares\",\n    \"launch\": \"ksquares.ksquares\",\n    \"name\": \"kSquares\",\n    \"path\": \"/usr/games/ksquares\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu\"\n}\n
"},{"location":"applications/ksquares/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output ksquares.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/ksquares.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @ksquares.d.3.0.json\n\n
"},{"location":"applications/ksquares/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus-x11 dbus-user-session ksquares && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"ksquares.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTowLjIiIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCIgeD0iLTMxIiB5PSItMzAiIHJ4PSIxLjQiIHJ5PSIxLjQiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHg9Ii0zMCIgeT0iLTMwIiByeD0iMS40IiByeT0iMS40IiB0cmFuc2Zvcm09Im1hdHJpeCgwLC0xLC0xLDAsMCwwKSIgc3R5bGU9ImZpbGw6IzhlOGU4ZSIvPgogPHBhdGggc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzNmM2YzZjtzdHJva2Utd2lkdGg6MiIgZD0iTSA2LDIwIEggMTYgViAxMiBIIDI2Ii8+CiA8cGF0aCBkPSJtIDE2LDExIGEgMiwyIDAgMCAwIC0yLDIgMiwyIDAgMCAwIDIsMiAyLDIgMCAwIDAgMiwtMiAyLDIgMCAwIDAgLTIsLTIgeiBtIDEwLDAgYSAyLDIgMCAwIDAgLTIsMiAyLDIgMCAwIDAgMiwyIDIsMiAwIDAgMCAyLC0yIDIsMiAwIDAgMCAtMiwtMiB6IE0gNiwxOSBhIDIsMiAwIDAgMCAtMiwyIDIsMiAwIDAgMCAyLDIgMiwyIDAgMCAwIDIsLTIgMiwyIDAgMCAwIC0yLC0yIHogbSAxMCwwIGEgMiwyIDAgMCAwIC0yLDIgMiwyIDAgMCAwIDIsMiAyLDIgMCAwIDAgMiwtMiAyLDIgMCAwIDAgLTIsLTIgeiIgc3R5bGU9Im9wYWNpdHk6MC4yIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmIiBkPSJNIDE2IDEwIEEgMiAyIDAgMCAwIDE0IDEyIEEgMiAyIDAgMCAwIDE2IDE0IEEgMiAyIDAgMCAwIDE4IDEyIEEgMiAyIDAgMCAwIDE2IDEwIHogTSAyNiAxMCBBIDIgMiAwIDAgMCAyNCAxMiBBIDIgMiAwIDAgMCAyNiAxNCBBIDIgMiAwIDAgMCAyOCAxMiBBIDIgMiAwIDAgMCAyNiAxMCB6IE0gNiAxOCBBIDIgMiAwIDAgMCA0IDIwIEEgMiAyIDAgMCAwIDYgMjIgQSAyIDIgMCAwIDAgOCAyMCBBIDIgMiAwIDAgMCA2IDE4IHogTSAxNiAxOCBBIDIgMiAwIDAgMCAxNCAyMCBBIDIgMiAwIDAgMCAxNiAyMiBBIDIgMiAwIDAgMCAxOCAyMCBBIDIgMiAwIDAgMCAxNiAxOCB6Ii8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmO29wYWNpdHk6MC4xIiBkPSJNIDMuNDAwMzkwNiAyIEMgMi42MjQ3OTA2IDIgMiAyLjYyNDc5MDYgMiAzLjQwMDM5MDYgTCAyIDQuNDAwMzkwNiBDIDIgMy42MjQ3OTA2IDIuNjI0NzkwNiAzIDMuNDAwMzkwNiAzIEwgMjguNTk5NjA5IDMgQyAyOS4zNzUyMDkgMyAzMCAzLjYyNDc5MDYgMzAgNC40MDAzOTA2IEwgMzAgMy40MDAzOTA2IEMgMzAgMi42MjQ3OTA2IDI5LjM3NTIwOSAyIDI4LjU5OTYwOSAyIEwgMy40MDAzOTA2IDIgeiIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"ksquares,ksquares\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"ksquares.ksquares\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu\"\nLABEL oc.name=\"kSquares\"\nLABEL oc.displayname=\"kSquares\"\nLABEL oc.path=\"/usr/games/ksquares\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kSquares\"\nENV APPBIN \"/usr/games/ksquares\"\nENV APP \"/usr/games/ksquares\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/ksquares/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/ksquares/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application kSquares

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kSquares.d\n
"},{"location":"applications/ksquares/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f kSquares.d -t kSquares .\n
"},{"location":"applications/ksquares/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect kSquares > kSquares.json\ndocker image save kSquares -o kSquares.tar\nctr -n k8s.io images import kSquares.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kSquares.json\n\n
"},{"location":"applications/kturtle/","title":"kTurtle","text":""},{"location":"applications/kturtle/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/kturtle/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kturtle/#alpine-packages","title":"Alpine packages","text":"
kturtle mesa-dri-gallium\n
"},{"location":"applications/kturtle/#path","title":"Path","text":"
/usr/bin/kturtle\n
"},{"location":"applications/kturtle/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/kturtle/#wm_class","title":"WM_CLASS","text":"
kturtle.kturtle\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/kturtle/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.kde.kturtle.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/kturtle/#json-dump","title":"JSON dump","text":"

json source file kturtle.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"kturtle mesa-dri-gallium\",\n    \"icon\": \"kturtle.svg\",\n    \"keyword\": \"kturtle\",\n    \"launch\": \"kturtle.kturtle\",\n    \"name\": \"kTurtle\",\n    \"path\": \"/usr/bin/kturtle\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.kturtle.desktop\"\n}\n
"},{"location":"applications/kturtle/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output kturtle.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kturtle.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kturtle.d.3.0.json\n\n
"},{"location":"applications/kturtle/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kturtle mesa-dri-gallium\nLABEL oc.icon=\"kturtle.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZlcnNpb249IjEuMCIKICAgeD0iMC4wMDAwMDAwIgogICB5PSIwLjAwMDAwMDAiCiAgIHdpZHRoPSIyNTYuMDAwMDAiCiAgIGhlaWdodD0iMjU2LjAwMDAwIgogICB2aWV3Qm94PSIwIDAgMjU2IDI1NiIKICAgaWQ9InN2ZzE0MzIiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiPjxkZWZzCiAgIGlkPSJkZWZzMTUzNiI+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDc4NSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwNjdhMDc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMCIKICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgaWQ9InN0b3A0Nzg3IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTllZWE4O3N0b3Atb3BhY2l0eTowLjc1NjM0NTE1IgogICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICBpZD0ic3RvcDQ3ODkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICB4MT0iLTIwMi40NjUxMiIKICAgICB5MT0iNTIuMDQ2NTUxIgogICAgIHgyPSItNzYuMjUyMzEyIgogICAgIHkyPSIyNDguMzc1MzciCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDc5MSIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0Nzg1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wNTczMTAsMC4wMDAwMDAsMC4wMDAwMDAsMS4wNTczMTAsMjk4LjE2MzUsNy4wMjA2MTMpIiAvPjwvZGVmcz4KCQo8cGF0aAogICBkPSJNIDEwNy41Mjg0MCw1LjE3MDM2MzMgTCAxMDcuNTI4NDAsMjUuNjQxOTY5IEwgODcuMDU2ODAwLDI1LjY0MTk2OSBMIDg3LjA1NjgwMCw0Ni4xMTM1NzUgTCA4Ny4wNTY4MDAsNjYuNTg1MTgxIEwgMTA3LjUyODQwLDY2LjU4NTE4MSBMIDEwNy41Mjg0MCw4Ny4wNTY3ODYgTCA4Ny4wNTY4MDAsODcuMDU2Nzg2IEwgODcuMDU2ODAwLDEwNy41MjgzOSBMIDY2LjU4NTE5NCwxMDcuNTI4MzkgTCA2Ni41ODUxOTQsMTI4LjAwMDAwIEwgNDYuMTEzNTg4LDEyOC4wMDAwMCBMIDQ2LjExMzU4OCwxNDguNDcxNjEgTCA0Ni4xMTM1ODgsMTY4Ljk0MzIwIEwgNDYuMTEzNTg4LDE4OS40MTQ4MiBMIDY2LjU4NTE5NCwxODkuNDE0ODIgTCA2Ni41ODUxOTQsMjA5Ljg4NjQxIEwgODcuMDU2ODAwLDIwOS44ODY0MSBMIDg3LjA1NjgwMCwyMzAuMzU4MDMgTCAxMDcuNTI4NDAsMjMwLjM1ODAzIEwgMTI4LjAwMDAwLDIzMC4zNTgwMyBMIDE0OC40NzE2MSwyMzAuMzU4MDMgTCAxNjguOTQzMjAsMjMwLjM1ODAzIEwgMTY4Ljk0MzIwLDIwOS44ODY0MSBMIDE4OS40MTQ4MywyMDkuODg2NDEgTCAxODkuNDE0ODMsMTg5LjQxNDgyIEwgMjA5Ljg4NjQzLDE4OS40MTQ4MiBMIDIwOS44ODY0MywxNjguOTQzMjAgTCAyMDkuODg2NDMsMTQ4LjQ3MTYxIEwgMjA5Ljg4NjQzLDEyOC4wMDAwMCBMIDE4OS40MTQ4MywxMjguMDAwMDAgTCAxODkuNDE0ODMsMTA3LjUyODM5IEwgMTY4Ljk0MzIwLDEwNy41MjgzOSBMIDE2OC45NDMyMCw4Ny4wNTY3ODYgTCAxNDguNDcxNjEsODcuMDU2Nzg2IEwgMTQ4LjQ3MTYxLDY2LjU4NTE4MSBMIDE2OC45NDMyMCw2Ni41ODUxODEgTCAxNjguOTQzMjAsNDYuMTEzNTc1IEwgMTY4Ljk0MzIwLDI1LjY0MTk2OSBMIDE0OC40NzE2MSwyNS42NDE5NjkgTCAxNDguNDcxNjEsNS4xNzAzNjMzIEwgMTI4LjAwMDAwLDUuMTcwMzYzMyBMIDEwNy41Mjg0MCw1LjE3MDM2MzMgeiBNIDE4OS40MTQ4MywxMDcuNTI4MzkgTCAyMDkuODg2NDMsMTA3LjUyODM5IEwgMjA5Ljg4NjQzLDg3LjA1Njc4NiBMIDIzMC4zNTgwMiw4Ny4wNTY3ODYgTCAyMzAuMzU4MDIsNjYuNTg1MTgxIEwgMjA5Ljg4NjQzLDY2LjU4NTE4MSBMIDE4OS40MTQ4Myw2Ni41ODUxODEgTCAxODkuNDE0ODMsODcuMDU2Nzg2IEwgMTg5LjQxNDgzLDEwNy41MjgzOSB6IE0gMTg5LjQxNDgzLDIwOS44ODY0MSBMIDE4OS40MTQ4MywyMzAuMzU4MDMgTCAxODkuNDE0ODMsMjUwLjgyOTY0IEwgMjA5Ljg4NjQzLDI1MC44Mjk2NCBMIDIzMC4zNTgwMiwyNTAuODI5NjQgTCAyMzAuMzU4MDIsMjMwLjM1ODAzIEwgMjA5Ljg4NjQzLDIzMC4zNTgwMyBMIDIwOS44ODY0MywyMDkuODg2NDEgTCAxODkuNDE0ODMsMjA5Ljg4NjQxIHogTSA2Ni41ODUxOTQsMjA5Ljg4NjQxIEwgNDYuMTEzNTg4LDIwOS44ODY0MSBMIDQ2LjExMzU4OCwyMzAuMzU4MDMgTCAyNS42NDE5ODMsMjMwLjM1ODAzIEwgMjUuNjQxOTgzLDI1MC44Mjk2NCBMIDQ2LjExMzU4OCwyNTAuODI5NjQgTCA2Ni41ODUxOTQsMjUwLjgyOTY0IEwgNjYuNTg1MTk0LDIzMC4zNTgwMyBMIDY2LjU4NTE5NCwyMDkuODg2NDEgeiBNIDY2LjU4NTE5NCwxMDcuNTI4MzkgTCA2Ni41ODUxOTQsODcuMDU2Nzg2IEwgNjYuNTg1MTk0LDY2LjU4NTE4MSBMIDQ2LjExMzU4OCw2Ni41ODUxODEgTCAyNS42NDE5ODMsNjYuNTg1MTgxIEwgMjUuNjQxOTgzLDg3LjA1Njc4NiBMIDQ2LjExMzU4OCw4Ny4wNTY3ODYgTCA0Ni4xMTM1ODgsMTA3LjUyODM5IEwgNjYuNTg1MTk0LDEwNy41MjgzOSB6ICIKICAgc3R5bGU9Im9wYWNpdHk6MS4wMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQ3OTEpO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjguNDk5OTk4MTtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO292ZXJmbG93OnZpc2libGUiCiAgIGlkPSJwYXRoNDA1NyIgLz48L3N2Zz4=\"\nLABEL oc.keyword=\"kturtle,kturtle\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kturtle.desktop\"\nLABEL oc.launch=\"kturtle.kturtle\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"kTurtle\"\nLABEL oc.displayname=\"kTurtle\"\nLABEL oc.path=\"/usr/bin/kturtle\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kTurtle\"\nENV APPBIN \"/usr/bin/kturtle\"\nENV APP \"/usr/bin/kturtle\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kturtle/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kturtle/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application kTurtle

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kTurtle.d\n
"},{"location":"applications/kturtle/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f kTurtle.d -t kTurtle .\n
"},{"location":"applications/kturtle/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect kTurtle > kTurtle.json\ndocker image save kTurtle -o kTurtle.tar\nctr -n k8s.io images import kTurtle.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kTurtle.json\n\n
"},{"location":"applications/leocad/","title":"Leocad","text":""},{"location":"applications/leocad/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/leocad/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/leocad/#ubuntu-packages","title":"Ubuntu packages","text":"
leocad\n
"},{"location":"applications/leocad/#arguments","title":"Arguments","text":"

\"-l /usr/bin/leocad.library.bin\"

"},{"location":"applications/leocad/#path","title":"Path","text":"
/usr/bin/leocad\n
"},{"location":"applications/leocad/#mimetype","title":"Mimetype","text":"
application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\n
"},{"location":"applications/leocad/#file-extensions","title":"File extensions","text":"

\"lcd\"

"},{"location":"applications/leocad/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"lcd\"

"},{"location":"applications/leocad/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/leocad/#wm_class","title":"WM_CLASS","text":"
leocad.Leocad\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/leocad/#json-dump","title":"JSON dump","text":"

json source file leocad.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"args\": \"-l /usr/bin/leocad.library.bin\",\n    \"cat\": \"games\",\n    \"debpackage\": \"leocad\",\n    \"icon\": \"leocad.svg\",\n    \"keyword\": \"cad,lego\",\n    \"launch\": \"leocad.Leocad\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"Leocad\",\n    \"path\": \"/usr/bin/leocad\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\",\n    \"fileextensions\": \"lcd\",\n    \"legacyfileextensions\": \"lcd\"\n}\n
"},{"location":"applications/leocad/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output leocad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/leocad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @leocad.d.3.0.json\n\n
"},{"location":"applications/leocad/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends leocad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"leocad.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSIwIiB4MT0iMjcuNDU2IiB5MT0iNDcuMzkiIHgyPSIyNi40NDIiIHkyPSIxLjAxNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNlMWUxZTEiLz48c3RvcCBzdG9wLWNvbG9yPSIjZjRmNGZmIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iMSIgeDE9IjI0LjE0IiB5MT0iNDAuNjgzIiB4Mj0iMjMuODYiIHkyPSI2LjMxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2M1MjgyOCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZjU0NTQiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxwYXRoIGQ9Im0yLjk4LS4wMDJoNDIuMDRjMS42NTIgMCAyLjk4MiAxLjMzIDIuOTgyIDIuOTgydjQyLjA0YzAgMS42NTItMS4zMyAyLjk4Mi0yLjk4MiAyLjk4MmgtNDIuMDRjLTEuNjUyIDAtMi45ODItMS4zMy0yLjk4Mi0yLjk4MnYtNDIuMDRjMC0xLjY1MiAxLjMzLTIuOTgyIDIuOTgyLTIuOTgyIiBmaWxsPSJ1cmwoIzApIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBkPSJtMjQuMTcgN2MtMS43MSAwLTIuOTk5Ljc0NS0zIDEuNzMydjEuMjU0Yy0uMDI2LjAwMS0uMDUzLjAwOS0uMDc4LjAyMWwtMS45MzggMWMtLjA4My4wNDMtLjE1Mi4xMDItLjIwOS4xNjgtLjQ5MS0uMjAyLTEuMDk2LS4zMjItMS43NzMtLjMyMi0xLjcwOSAwLTIuOTk4Ljc0My0yLjk5OCAxLjczdjEuMDY4Yy0uMTA4LjAwMy0uMjE2LjAyMy0uMzE2LjA3OGwtMy43MDEgMi4wMWMtLjEyOC4wNjktLjIxNC4xNzctLjI3Ny4yOTctLjAxOC4wMjctLjAyOS4wNTMtLjA0My4wODItLjAxMi4wMzQtLjAyLjA2Ny0uMDI3LjEwMi0uMDIuMDY2LS4wNTMuMTI4LS4wNTMuMTk5djE2LjI5M2MwIC4yNTUuMTM4LjQ5MS4zNjEuNjE3bDEzLjQ1OSA3LjU3NmMuMDA5LjAwNS4wMi4wMDMuMDI5LjAwOC4wOTEuMDQ2LjE4OS4wNzIuMjg5LjA3Ni4wMDEgMCAuMDE5LjAwOC4wMjkuMDA4LjA4OSAwIC4xNzEtLjAzOC4yNTQtLjA3LjAzLS4wMTIuMDY1LS4wMDcuMDk0LS4wMjNsLjAwNC0uMDAyYy4wMDItLjAwMDEuMDA0LS4wMDAxLjAwNi0uMDAyLjAwMi0uMDAwMS4wMDItLjAwMy4wMDQtLjAwNGwxMy41OC03LjYyNWMuMjI0LS4xMjUuMzYxLS4zNjIuMzYxLS42MTdsLjAxNC0xNi4yMDVjMC0uMjUxLS4xMzItLjQ4NS0uMzUtLjYxMS0uMDIzLS4wMTQtLjA1Mi0uMDExLS4wNzYtLjAyMS0uMDMyLS4wMjUtLjA1NS0uMDU2LS4wOTItLjA3NmwtMy43MDMtMi4wMWMtLjAxNi0uMDA5LS4wMzMtLjAwOC0uMDQ5LS4wMTZ2LTEuMTQzYzAtLjk4OC0xLjI4OS0xLjczMi0yLjk5OC0xLjczMi0uNzI2IDAtMS4zNjcuMTM5LTEuODc1LjM2OS0uMDM1LS4wMjgtLjA2NC0uMDYyLS4xMDUtLjA4NGwtMS43NjItLjkxYy0uMDItLjAwMS0uMDQyLS4wMDktLjA2My0uMDE4di0xLjQ2NWMwLS45ODgtMS4yODktMS43MzItMi45OTgtMS43MzJtLTEuOTM4IDMuMDYzYy41MTcuMjQ4IDEuMTgxLjM5OCAxLjkzOC4zOTguNzU2IDAgMS40MTktLjE1MSAxLjkzNi0uMzk4djEuOTYzYzAgLjIwNS0uNzMxLjY3LTEuOTM2LjY3LTEuMjA1IDAtMS45MzgtLjQ2NS0xLjkzOC0uNjd2LTEuOTYzbS0xLjA2MyAxLjQ5OHYuNDY1YzAgLjk4NyAxLjI5IDEuNzMgMyAxLjczIDEuNzExIDAgMi45OTktLjc0MyAyLjk5OC0xLjczdi0uMjVsLjg2MS40NDVjLS4wMzcuMTEzLS4wNTcuMjMtLjA1Ny4zNTJ2My4yOTNjMCAuOTg3IDEuMjkgMS43MyAzIDEuNzMgMS43MSAwIDIuOTk5LS43NDMgMi45OTgtMS43M3YtLjU1MWwyLjEgMS4xNDMtMTIuMTQzIDYuNzk5LTEyLjA0LTYuODQyIDIuMjkxLTEuMjQ2di43MDljMCAuOTg3IDEuMjg5IDEuNzMyIDIuOTk4IDEuNzMyIDEuNzA5IDAgMi45OTgtLjc0NSAyLjk5OC0xLjczMnYtMy4yOTNjMC0uMTU5LS4wNDQtLjMwOS0uMTA3LS40NTNsMS4xMDctLjU3bTcuODY1IDIuMzQyYy41MTYuMjQ4IDEuMTgxLjQgMS45MzguNC43NTYgMCAxLjQxOS0uMTUzIDEuOTM2LS40djEuOTYzYzAgLjE5NC0uNjc4LjY2OC0xLjkzNi42NjgtMS4yMDUgMC0xLjkzOC0uNDYzLTEuOTM4LS42Njh2LTEuOTYzbS0xMy44MDEuMDEyYy41MTcuMjQ4IDEuMTgxLjQgMS45MzguNC43NTUgMCAxLjQxOS0uMTUxIDEuOTM2LS4zOTh2MS45NjFjMCAuMTk0LS42NzguNjctMS45MzYuNjctMS4yNTggMC0xLjkzOC0uNDc2LTEuOTM4LS42N3YtMS45NjNtOC44OTEuNzIxYy0xLjcwOSAwLTMgLjc0NS0zIDEuNzMydjMuMjkzYzAgLjk4NyAxLjI5MSAxLjczMiAzIDEuNzMyIDEuNzA5IDAgMi45OTYtLjc0NSAyLjk5Ni0xLjczMnYtMy4yOTNjMC0uOTg3LTEuMjg3LTEuNzMyLTIuOTk2LTEuNzMybS0xLjkzOCAzLjA2MmMuNTE3LjI0OCAxLjE4MS40IDEuOTM4LjQuNzU1IDAgMS40MTgtLjE1MSAxLjkzNC0uMzk4djEuOTYxYzAgLjE5NC0uNjc2LjY3LTEuOTM0LjY3LTEuMjA1IDAtMS45MzgtLjQ2NS0xLjkzOC0uNjd2LTEuOTYzIiBmaWxsPSJ1cmwoIzEpIi8+PC9zdmc+Cg==\"\nLABEL oc.keyword=\"leocad,cad,lego\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"leocad.Leocad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"-l /usr/bin/leocad.library.bin\"\nLABEL oc.name=\"Leocad\"\nLABEL oc.displayname=\"Leocad\"\nLABEL oc.path=\"/usr/bin/leocad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\"\nLABEL oc.fileextensions=\"lcd\"\nLABEL oc.legacyfileextensions=\"lcd\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Leocad\"\nENV APPBIN \"/usr/bin/leocad\"\nLABEL oc.args=\"-l /usr/bin/leocad.library.bin\"\nENV APP \"/usr/bin/leocad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/leocad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/leocad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Leocad

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Leocad.d\n
"},{"location":"applications/leocad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Leocad.d -t Leocad .\n
"},{"location":"applications/leocad/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Leocad > Leocad.json\ndocker image save Leocad -o Leocad.tar\nctr -n k8s.io images import Leocad.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Leocad.json\n\n
"},{"location":"applications/librecad/","title":"LibreCAD","text":""},{"location":"applications/librecad/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/librecad/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/librecad/#ubuntu-packages","title":"Ubuntu packages","text":"
librecad\n
"},{"location":"applications/librecad/#path","title":"Path","text":"
/usr/bin/librecad\n
"},{"location":"applications/librecad/#mimetype","title":"Mimetype","text":"
image/vnd.dxf;\n
"},{"location":"applications/librecad/#file-extensions","title":"File extensions","text":"

\"dxf;dwg\"

"},{"location":"applications/librecad/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"dxf;dwg\"

"},{"location":"applications/librecad/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/librecad/#wm_class","title":"WM_CLASS","text":"
librecad.Librecad\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/librecad/#json-dump","title":"JSON dump","text":"

json source file librecad.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"librecad\",\n    \"icon\": \"librecad.svg\",\n    \"keyword\": \"librecad,modeling\",\n    \"launch\": \"librecad.Librecad\",\n    \"name\": \"LibreCAD\",\n    \"path\": \"/usr/bin/librecad\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"image/vnd.dxf;\",\n    \"fileextensions\": \"dxf;dwg\",\n    \"legacyfileextensions\": \"dxf;dwg\"\n}\n
"},{"location":"applications/librecad/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output librecad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/librecad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @librecad.d.3.0.json\n\n
"},{"location":"applications/librecad/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends librecad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"librecad.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIj48dGl0bGU+TGlicmVDQUQgSWNvbjwvdGl0bGU+PHBhdGggZmlsbD0iIzhlZDkwMCIgZD0iTTAgMGgxMi4xMzh2MTIuMTRIMHoiLz48cGF0aCBmaWxsPSIjOGVkOTAwIiBkPSJNMCA4Ny44NjJoMTIuMTM4djEyLjE0SDB6Ii8+PHBhdGggZmlsbD0iIzhlZDkwMCIgZD0iTTg3Ljg2IDBIMTAwdjEyLjE0SDg3Ljg2eiIvPjxwYXRoIGZpbGw9IiM4ZWQ5MDAiIGQ9Ik04Ny44NiA4Ny44NjJIMTAwdjEyLjE0SDg3Ljg2eiIvPjxwYXRoIGQ9Ik01MCAuMDMyQzIyLjM4Ni4wMzIgMCAyMi4zODYgMCA1MGMwIDI3LjYxNSAyMi4zODYgNTAgNTAgNTBzNTAtMjIuMzg1IDUwLTUwQzEwMCAyMi4zODYgNzcuNjE0LjAzMiA1MCAuMDMyem0wIDEyYzIwLjk4NyAwIDM4IDE2Ljk4MiAzOCAzNy45NjggMCAyMC45ODctMTcuMDEzIDM4LjAzMi0zOCAzOC4wMzItMjAuOTg2IDAtMzgtMTcuMDQ1LTM4LTM4LjAzMiAwLTIwLjk4NiAxNy4wMTQtMzcuOTY4IDM4LTM3Ljk2OHoiIGZpbGw9IiM4ZWQ5MDAiLz48cGF0aCBmaWxsPSIjNGQ0ZDRkIiBkPSJNMTAwIDU2SDI0djZIMFYzOGgyNHY2aDc2eiIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"librecad,librecad,modeling\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"librecad.Librecad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"LibreCAD\"\nLABEL oc.displayname=\"LibreCAD\"\nLABEL oc.path=\"/usr/bin/librecad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/vnd.dxf;\"\nLABEL oc.fileextensions=\"dxf;dwg\"\nLABEL oc.legacyfileextensions=\"dxf;dwg\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"LibreCAD\"\nENV APPBIN \"/usr/bin/librecad\"\nENV APP \"/usr/bin/librecad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/librecad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/librecad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application LibreCAD

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/LibreCAD.d\n
"},{"location":"applications/librecad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f LibreCAD.d -t LibreCAD .\n
"},{"location":"applications/librecad/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect LibreCAD > LibreCAD.json\ndocker image save LibreCAD -o LibreCAD.tar\nctr -n k8s.io images import LibreCAD.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @LibreCAD.json\n\n
"},{"location":"applications/list/","title":"Application list","text":"

This array describe the application list ready to use with abcdesktop.

icon displayname comment description json file 2048 (alpine gtk) Obtain the 2048 tile 2048-alpine.md 2048-alpine.d.3.0.json 2048 (ubuntu qt) The 2048 number game implemented in Qt 2048-ubuntu.md 2048-ubuntu.d.3.0.json Apache Directory Studio no comment apachedirectorystudio.md apachedirectorystudio.d.3.0.json astromenace hardcore 3D space shooter with spaceship upgrade possibilities astromenace.md astromenace.d.3.0.json Base Manage databases, create queries and reports to track and manage your information by using Base. base.md base.d.3.0.json Beekeeper-studio An easy-to use SQL query editor and database UI for Mac, Windows, and Linux beekeeperstudio.md beekeeperstudio.d.3.0.json Blender 3D modeling, animation, rendering and post-production blender.md blender.d.3.0.json Bless Edit binary files bless.md bless.d.3.0.json blobby no comment blobby.md blobby.d.3.0.json Gnome-boxes View and use virtual machines boxes.md boxes.d.3.0.json Brackets no comment brackets.md brackets.d.3.0.json calculator Perform arithmetic, scientific or financial calculations calculator.md calculator.d.3.0.json chess Play the classic two-player board game of chess chess.md chess.d.3.0.json Chrome Access the Internet chrome.md chrome.d.3.0.json chromium (alpine) no comment chromium.md chromium.d.3.0.json citrix-client no comment citrix.md citrix.d.3.0.json Cloud Foundry cli no comment cloudfoundry.md cloudfoundry.d.3.0.json cmd.exe wine (alpine) no comment cmd.exe.md cmd.exe.d.3.0.json corsix-th Open source clone of Theme Hospital corsix-th.md corsix-th.d.3.0.json cuda Use the command line cuda.md cuda.d.3.0.json cuda demo Use the command line cudademo.md cudademo.d.3.0.json cuda developper Use the command line cudadev.md cudadev.d.3.0.json Dia Edit your Diagrams dia.md dia.d.3.0.json Doom no comment doom.md doom.d.3.0.json Draw Create and edit drawings, flow charts and logos by using Draw. draw.md draw.d.3.0.json draw.io draw.io desktop drawio.md drawio.d.3.0.json Microsoft Edge Access the Internet edge.md edge.d.3.0.json eog Browse and rotate images eog.md eog.d.3.0.json Evince View multi-page documents evince.md evince.d.3.0.json Evolution Manage your email, contacts and schedule evolution.md evolution.d.3.0.json file-roller Create and modify an archive file-roller.md file-roller.d.3.0.json Filelight View disk usage information filelight.md filelight.d.3.0.json filezilla (alpine) Download and upload files via FTP, FTPS and SFTP filezilla.md filezilla.d.3.0.json Firefox (esr alpine) Browse the World Wide Web firefox-esr.md firefox-esr.d.3.0.json Firefox (alpine) Browse the World Wide Web firefox.md firefox.d.3.0.json flare A single player, 2D-isometric, action Role-Playing Game flare.md flare.d.3.0.json frozen-bubble no comment frozen-bubble.md frozen-bubble.d.3.0.json GCompris no comment gcompris.md gcompris.d.3.0.json Geany A fast and lightweight IDE using GTK+ geany.md geany.d.3.0.json Gedit no comment gedit.md gedit.d.3.0.json gElemental View the periodic table of elements gelemental.md gelemental.d.3.0.json Geogebra no comment geogebra.md geogebra.d.3.0.json Gimp Create images and edit photographs gimp.md gimp.d.3.0.json Gnumerix (alpine) Calculation, Analysis, and Visualization of Information gnumeric.md gnumeric.d.3.0.json Golly no comment golly.md golly.d.3.0.json hyper A terminal built on web technologies hyper.md hyper.d.3.0.json Impress Create and edit presentations for slideshows, meeting and Web pages by using Impress. impress.md impress.d.3.0.json inkscape no comment inkscape.md inkscape.d.3.0.json jupyter Use the command line jupyter.md jupyter.d.3.0.json jupyter nvidia Use the command line jupyternvidia.md jupyternvidia.d.3.0.json Kalzium KDE Periodic Table of Elements kalzium.md kalzium.d.3.0.json kDiamond no comment kdiamond.md kdiamond.d.3.0.json Kgeography A Geography Learning Program kgeography.md kgeography.d.3.0.json kigo no comment kigo.md kigo.d.3.0.json Klickety no comment klickety.md klickety.d.3.0.json klotski no comment klotski.md klotski.d.3.0.json konsole no comment konsole.md konsole.d.3.0.json kSquares no comment ksquares.md ksquares.d.3.0.json kTurtle Educational Programming Environment kturtle.md kturtle.d.3.0.json Leocad no comment leocad.md leocad.d.3.0.json LibreCAD no comment librecad.md librecad.d.3.0.json mahjongg no comment mahjongg.md mahjongg.d.3.0.json maps A simple maps application maps.md maps.d.3.0.json Math Create and edit scientific formulas and equations by using Math. math.md math.d.3.0.json Mathwar no comment mathwar.md mathwar.d.3.0.json minecraft Official Minecraft Launcher minecraft.md minecraft.d.3.0.json gnome-mines (alpine) Clear hidden mines from a minefield mines.md mines.d.3.0.json FileManager Access and organize files nautilus.md nautilus.d.3.0.json Notepad Wine (alpine) no comment notepad-wine.md notepad-wine.d.3.0.json notepadqq Edit source code files notepadqq.md notepadqq.d.3.0.json octave no comment octave.md octave.d.3.0.json OnlyOffice Edit office documents onlyoffice.md onlyoffice.d.3.0.json Pinta (alpine) Easily create and edit images pinta.md pinta.d.3.0.json Planner no comment planner.md planner.d.3.0.json Postman no comment postman.md postman.d.3.0.json Powershell no comment powershell.md powershell.d.3.0.json Putty Unix no comment putty-unix.md putty-unix.d.3.0.json Putty Wine (alpine) no comment putty-wine.md putty-wine.d.3.0.json qElectrotech no comment qelectrotech.md qelectrotech.d.3.0.json Remarkable A free, fully featured markdown editor for Linux. remarkable.md remarkable.d.3.0.json Remmina Access remote desktops with Remmina remmina.md remmina.d.3.0.json RemoteDesktop no comment remotedesktopmanager.md remotedesktopmanager.d.3.0.json rhythmbox Play and organize your music collection rhythmbox.md rhythmbox.d.3.0.json Robots no comment robots.md robots.d.3.0.json Shotcut Shotcut is a free, open source, cross-platform video editor. shotcut.md shotcut.d.3.0.json Stellarium Planetarium stellarium.md stellarium.d.3.0.json Step Simulate physics experiments step.md step.d.3.0.json stress no comment stress.md stress.d.3.0.json sublime-Text Sophisticated text editor for code, markup and prose sublime-text.md sublime-text.d.3.0.json sudoku Test your logic skills in this number grid puzzle sudoku.md sudoku.d.3.0.json supertux2 Play a classic 2D platform game supertux2.md supertux2.d.3.0.json swell-foop Clear the screen by removing groups of colored and shaped tiles swell-foop.md swell-foop.d.3.0.json taquin Slide tiles to their correct places taquin.md taquin.d.3.0.json Microsoft Teams Microsoft Teams for Linux is your chat-centered workspace in Office 365. teams.md teams.d.3.0.json Terminal sudo Use the command line terminal.md terminal.d.3.0.json Terminal [ephemeral container] Use the command line terminalephemeral.md terminalephemeral.d.3.0.json Terminal [Pod] Use the command line terminalpod.md terminalpod.d.3.0.json Tetravex no comment tetravex.md tetravex.d.3.0.json Thunderbird Send and receive mail with Thunderbird thunderbird.md thunderbird.d.3.0.json Commodore64 vice.md vice.d.3.0.json videolan Read, capture, broadcast your multimedia streams vlc.md vlc.d.3.0.json vmmacos no comment vmmacos.md vmmacos.d.3.0.json VMRC Connect to remote virtual machines vmrc.md vmrc.d.3.0.json vmubuntu no comment vmubuntu.md vmubuntu.d.3.0.json VSCode Code Editing. Redefined. vscode.md vscode.d.3.0.json weather Show weather conditions and forecast weather.md weather.d.3.0.json whatsdesk unofficial whatsapp client for linux whatsdesk.md whatsdesk.d.3.0.json Winefile Wine (alpine) no comment winefile-wine.md winefile-wine.d.3.0.json WineMine Wine (alpine) no comment winemine-wine.md winemine-wine.d.3.0.json Winhelp Wine no comment winhelp-wine.md winhelp-wine.d.3.0.json WinSCP no comment winscp-wine.md winscp-wine.d.3.0.json wireshark (alpine) Network traffic analyzer wireshark.md wireshark.d.3.0.json Writer alpine Create and edit text and graphics in letters, reports, documents and Web pages by using Writer. writer.md writer.d.3.0.json Xclock no comment xclock.md xclock.d.3.0.json Xedit no comment xedit.md xedit.d.3.0.json xeyes no comment xeyes.md xeyes.d.3.0.json Xman no comment xman.md xman.d.3.0.json Xpad Jot down notes for later xpad.md xpad.d.3.0.json Xterm (sudo) standard terminal emulator for the X window system xterm.md xterm.d.3.0.json"},{"location":"applications/mahjongg/","title":"mahjongg","text":""},{"location":"applications/mahjongg/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/mahjongg/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/mahjongg/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-mahjongg\n
"},{"location":"applications/mahjongg/#path","title":"Path","text":"
/usr/games/gnome-mahjongg\n
"},{"location":"applications/mahjongg/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/mahjongg/#wm_class","title":"WM_CLASS","text":"
gnome-mahjongg.Gnome-mahjongg\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/mahjongg/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/gnome-mahjongg.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/mahjongg/#json-dump","title":"JSON dump","text":"

json source file mahjongg.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-mahjongg\",\n    \"icon\": \"circle_gnome-mahjongg.svg\",\n    \"keyword\": \"gnome mahjongg,game mahjongg,mahjongg\",\n    \"launch\": \"gnome-mahjongg.Gnome-mahjongg\",\n    \"name\": \"mahjongg\",\n    \"path\": \"/usr/games/gnome-mahjongg\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/gnome-mahjongg.desktop\"\n}\n
"},{"location":"applications/mahjongg/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output mahjongg.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mahjongg.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mahjongg.d.3.0.json\n\n
"},{"location":"applications/mahjongg/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-mahjongg && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-mahjongg.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnNzgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMzgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBpZD0ic3RvcDIiIHN0b3AtY29sb3I9IiMzODg5ZTkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDQiIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI3IiBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTEyIiB4MT0iMzAuNzY1IiB4Mj0iMzEuMTA2IiB5MT0iNTYuOTkzIiB5Mj0iNy4zNjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMjQ0LjY1IDAgMCAyMjguMzQgMTUyLjY2IC0xMTMuNjUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wMzMiIHN0b3AtY29sb3I9IiM2MjYyNjIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDM1IiBzdG9wLWNvbG9yPSIjMzgzODM4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjkzMiIgeD0iLS4wNzE1MzgiIHk9Ii0uMDUxNjY3IiB3aWR0aD0iMS4xNDMxIiBoZWlnaHQ9IjEuMTAzMyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjkzNCIgc3RkRGV2aWF0aW9uPSIwLjc3NSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlNDAiIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgaWQ9Imc0OCIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgaWQ9ImNpcmNsZTQyIiBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDkxMikiLz4KICA8Y2lyY2xlIGlkPSJjaXJjbGU0NCIgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgaWQ9ImNpcmNsZTQ2IiBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KIDwvZz4KIDxnPgogIDxyZWN0IGlkPSJyZWN0OTE0IiB4PSIxOSIgeT0iMTQiIHdpZHRoPSIyNiIgaGVpZ2h0PSIzNiIgcng9IjIiIHJ5PSIyIiBmaWx0ZXI9InVybCgjZmlsdGVyOTMyKSIgb3BhY2l0eT0iLjUiLz4KICA8cmVjdCBpZD0icmVjdDg5NCIgeD0iMTkiIHk9IjE0IiB3aWR0aD0iMjYiIGhlaWdodD0iMzYiIHJ4PSIyIiByeT0iMiIgZmlsbD0iI2YyZjJmMiIvPgogIDxwYXRoIGlkPSJwYXRoNCIgZD0ibTI5LjAyIDIwLjUyNWMtMC4yMDg4MiAwLjE1MzUyLTAuMjYxMDggMC4zODM1Ny0wLjI2MTA4IDAuNjUyMzUgMCAwLjQ5ODg4IDAuMjA4ODIgMS4xMTI4IDAuMzEzMjUgMS4zNDMxIDAgMCAwLjE1NjYyIDIuNjg2MiAwLjIwODg0IDIuOTkzMi0wLjQ2OTg4IDAuMDM4MzctMS4zMDUyIDAuMDc2NzYtMS42MTg0IDAuMTUzNWgtMC40MTc2NmMtMC44ODc1NCAwLjAzODUtMS43MjI4IDAuMDc2NzYtMi4wODg0IDAuMzQ1MzFsLTAuMTU2NjMgMC4xMTUxMiAwLjE1NjYzIDAuMTUzNWMwLjI2MTAzIDAuMjMwMjQgMC4zNjU0NyAwLjg4MjYxIDAuNDY5ODggMS41NzM0IDAuMjYxMDMgMS40MTk4IDAuNTc0MjggMy4xODUgMi4xNDA2IDMuODc1OWwwLjMxMzI1IDAuMTE1MTJ2LTAuMjY4NjJzMC4wNTIzLTAuMTE1MTIgMC4wNTIzLTAuMjY4NjJjMC0wLjExNTEyLTAuMDUyMy0wLjMwNy0wLjEwNDM2LTAuNTc1NjIgMC40MTc2NiAwLjAzODM3IDEuMzA1MiAwLjExNTEyIDEuNjE4NCAwLjExNTEyIDAuMDUyMjYgMC4zMDcwNSAxLjQwOTcgMTIuODE4IDEuNDA5NyAxMi44MThoMC41MjIxNnMwLjU3NDMxLTEyLjM1NiAwLjU3NDMxLTEyLjc0YzAuMzY1NDQgMCAxLjk4MzkgMC4wMzgzNSAyLjQ1MzggMC4wNzY3Ni0wLjEwNDI5IDAuMjMwMjgtMC41MjE5MyAxLjE4OTctMC41MjE5MyAxLjE4OTdsMC43MzA3NS0wLjQ5ODgzYzAuMjA4ODItMC4xMTUyNiA0Ljc1MDgtMy4xNDY3IDQuMTI1NS01LjE0MjMtMC4yMDk5OC0wLjY1MjM1LTAuOTQwMjctMS4xMTI5LTIuMTQxOC0xLjM0M2gtMC4xMDQ2NmMtMC42Nzg3MiAwLTIuNzY3MSAwLjAzODM3LTQuMzMzNCAwLjExNTEyIDAuMDUyMzQtMC45OTc3MyAwLjA1MjM0LTEuNTM1IDAuMDUyMzQtMS44MDM3di0wLjM0NTM4YzAtMC4xOTE4OCAwLjI2MTAzLTAuNDYwNSAwLjQ2OTg4LTAuNjUyMzggMC4yMDg4NC0wLjIzMDI0IDAuNDY5OS0wLjQyMjEyIDAuNDY5OS0wLjY1MjM4IDAtMC4wNzY3Ni0wLjA1MjMxLTAuMTUzNS0wLjEwNDM2LTAuMjMwMjQtMC4zMTI0MS0wLjM0NTU0LTIuNjA5Ni0xLjIyODItMy42MDE1LTEuMzA0OS0wLjMxMzM0IDAuMDM4MjYtMC41MjIxNiAwLjA3Njc2LTAuNjI2NjkgMC4xOTE3OHptMC4wNTIzMiA2LjI5MzVoMC4yNjEwM2MwIDAuMzQ1MzggMC4xNTY2MyAyLjc2MjkgMC4yMDg4MiAzLjEwODItMC40MTc2NC0wLjAzODUtMS40MDk1LTAuMTE1MjYtMS43MjI4LTAuMTE1MjYtMC4xNTY3OS0wLjQ5ODgzLTAuMjA4ODItMS4wMzYyLTAuMjYxMDgtMS41NzMzLTAuMDUyMjYtMC40NjA1Ny0wLjEwNDI5LTAuOTIxMTQtMC4yMDg4Mi0xLjM0MzIgMC40Njk4OCAwIDEuNzIyOS0wLjA3Njc2IDEuNzIyOS0wLjA3Njc2em0zLjE4NDggMS4xODk0czAuMDUyMTctMC45MjEgMC4wNTIxNy0xLjIyOGMwLjY3ODcgMC4wNzY3NiAxLjU2NjIgMC4xMTUxMiAyLjQwMTUgMC4xMTUxMmgwLjkzOTc1YzAgMC4xNTM1LTAuMDUyMzIgMC4zNDUzOC0wLjA1MjMyIDAuMzQ1MzgtMC4xMDQzNiAwLjg0NDIzLTAuMjYxMDMgMS44NDE5LTAuNzMwOTQgMi44Mzk3LTAuMzEzMjMgMC0yLjI0NDktMC4wNzY3Ni0yLjY2MjYtMC4xMTUxMiAwLTAuMjY4NjIgMC4wNTIzMi0xLjk1NzEgMC4wNTIzMi0xLjk1NzF6IiBmaWxsPSIjZTY0YzRjIiBzdHJva2Utd2lkdGg9IjIuMzMzMiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"mahjongg,gnome mahjongg,game mahjongg,mahjongg\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-mahjongg.desktop\"\nLABEL oc.launch=\"gnome-mahjongg.Gnome-mahjongg\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"mahjongg\"\nLABEL oc.displayname=\"mahjongg\"\nLABEL oc.path=\"/usr/games/gnome-mahjongg\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"mahjongg\"\nENV APPBIN \"/usr/games/gnome-mahjongg\"\nENV APP \"/usr/games/gnome-mahjongg\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/mahjongg/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mahjongg/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application mahjongg

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mahjongg.d\n
"},{"location":"applications/mahjongg/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f mahjongg.d -t mahjongg .\n
"},{"location":"applications/mahjongg/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect mahjongg > mahjongg.json\ndocker image save mahjongg -o mahjongg.tar\nctr -n k8s.io images import mahjongg.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mahjongg.json\n\n
"},{"location":"applications/maps/","title":"maps","text":""},{"location":"applications/maps/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/maps/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/maps/#alpine-packages","title":"Alpine packages","text":"
gnome-maps\n
"},{"location":"applications/maps/#path","title":"Path","text":"
/usr/bin/gnome-maps\n
"},{"location":"applications/maps/#mimetype","title":"Mimetype","text":"
application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\n
"},{"location":"applications/maps/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/maps/#wm_class","title":"WM_CLASS","text":"
org.gnome.Maps.org.gnome.Maps\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/maps/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Maps.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/maps/#json-dump","title":"JSON dump","text":"

json source file maps.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"apkpackage\": \"gnome-maps\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"icon\": \"org.gnome.Maps.svg\",\n    \"keyword\": \"maps\",\n    \"launch\": \"org.gnome.Maps.org.gnome.Maps\",\n    \"name\": \"maps\",\n    \"path\": \"/usr/bin/gnome-maps\",\n    \"mimetype\": \"application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Maps.desktop\"\n}\n
"},{"location":"applications/maps/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output maps.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/maps.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @maps.d.3.0.json\n\n
"},{"location":"applications/maps/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-maps\nLABEL oc.icon=\"org.gnome.Maps.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjIzOS4zOSIgeDI9IjI0Mi45NSIgeTE9Ii0xMDEuNDQiIHkyPSItNTg1LjU1IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMTEuMTYgODMuOTQzKSBzY2FsZSgxLjI0NDkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzE3MTkxZCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzUzNTk2MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSI1NDAiIHgyPSI1MzIuODMiIHkxPSI0IiB5Mj0iNjk0LjM2IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0uNTQ2IC0uNTQ2KSBzY2FsZSguMDYzNTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzI4YjE2MiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzM1ZTk4MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMi4yMTMiIHgyPSIzMS45MzkiIHkxPSI2Mi4wNjIiIHkyPSIyMy40OTgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjM2E3YWYwIiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjNDNhZGYxIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjMxLjc5MSIgeDI9IjMyIiB5MT0iNDYuMTU5IiB5Mj0iMiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNlMWU3ZjIiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz48L2ZpbHRlcj48ZmlsdGVyIGlkPSJlIiB4PSItLjE0NSIgeT0iLS4xMDIiIHdpZHRoPSIxLjI5MSIgaGVpZ2h0PSIxLjIwNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyNS43MjIiLz48L2ZpbHRlcj48L2RlZnM+PHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS41NDYgLS41NDYpIHNjYWxlKC4wNjM1NikiIGQ9Ik05NjYuMSAzNzguNDVjLTIuNS04Ljc1LTUuMzUtMTcuNi04LjQ1LTI2LjM1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNC0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1Qzc3My4yNSAxMDUuNyA2ODguNyA2MS42NSA1OTIuMiA0Ni4yNWMtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LS41NS0xOS44NS0uODUtMzAuMS0uODUtOS4zNSAwLTE4LjYuMjUtMjcuOS43NS0xMTguMzUgNi4xLTIyMC4zIDUxLjk1LTMwNS44NSAxMzcuNVE0MC4wNSAzMTYuNTUgNDAuMDUgNTEyLjA1YzAgMTMwLjM1IDQ2LjEgMjQxLjY1IDEzOC4yNSAzMzMuOCA4NS41NSA4NS41IDE4Ny41IDEzMS4zNSAzMDUuODUgMTM3LjVoLjRjOC41LjQ1IDE2LjYuNyAyNC41LjdoOC40NWM4LjU1LS4xIDE2LjgtLjQgMjQuNjUtLjggMi41LS4xNSA0Ljc1LS4zIDYuOTUtLjQ1IDIwLjItMS40NSAzOS45LTQuMDUgNTguNy03LjcgNy45NS0xLjU1IDE1LjgtMy4zIDIzLjQtNS4xNSA4MC44LTIwLjMgMTUyLjE1LTYxLjYgMjE0LjY1LTEyNC4xIDQ4LjYtNDguNiA4NC40LTEwMi41IDEwNy4zNS0xNjEuOCAxNi42LTQyLjkgMjYuNTUtODguNjUgMjkuNzUtMTM3LjQ1LjM1LTUuMi42LTEwLjYuOC0xNi4wNS4yLTYuMDUuMy0xMi4yNS4zLTE4LjV2LTNjLS4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42eiIgZmlsdGVyPSJ1cmwoI2EpIiBvcGFjaXR5PSIuMjUiLz48cGF0aCBkPSJNNjAuODU5IDIzLjUwOWEyOC40MSAyOC40MSAwIDAgMC0yLjAwOC01LjA4NWMtLjI0Mi0uNDctLjUwNi0uOTUtLjc4Mi0xLjQyNC0xLjI5LTIuMTkyLTIuOTExLTQuMjctNC44NTMtNi4yMTItNC42MTQtNC42MTUtOS45ODgtNy40MTUtMTYuMTIyLTguMzkzYTMwLjc0NCAzMC43NDQgMCAwIDAtMy4xODEtLjM0IDMzLjk4NCAzMy45ODQgMCAwIDAtMy42ODctLjAwN2MtNy41MjIuMzg4LTE0LjAwMiAzLjMwMi0xOS40NCA4Ljc0UTIgMTkuNTc1IDIgMzJjMCA4LjI4NSAyLjkzIDE1LjM1OSA4Ljc4NyAyMS4yMTYgNS40MzggNS40MzQgMTEuOTE3IDguMzQ4IDE5LjQ0IDguNzM5aC4wMjZjLjU0LjAyOSAxLjA1NS4wNDQgMS41NTcuMDQ0aC41MzdhNDAuMDA5IDQwLjAwOSAwIDAgMCAxLjU2Ny0uMDVsLjQ0MS0uMDI5YTMxLjQ0MSAzMS40NDEgMCAwIDAgMy43MzEtLjQ5Yy41MDYtLjA5OCAxLjAwNS0uMjEgMS40ODgtLjMyNyA1LjEzNS0xLjI5IDkuNjctMy45MTUgMTMuNjQzLTcuODg3IDMuMDg5LTMuMDkgNS4zNjQtNi41MTUgNi44MjMtMTAuMjg0IDEuMDU1LTIuNzI3IDEuNjg3LTUuNjM1IDEuODktOC43MzdBMzMuNyAzMy43IDAgMCAwIDYyIDMydi0uMTlhMzEuMjA5IDMxLjIwOSAwIDAgMC0uOTA4LTcuNDM3Yy0uMDctLjI3Ni0uMTUtLjU3Mi0uMjMyLS44NjR6IiBmaWxsPSJ1cmwoI2IpIi8+PHBhdGggZD0iTTMyIDJjLS41OTQgMC0xLjE4Mi4wMTUtMS43NzMuMDQ3LTcuNTIzLjM4OC0xNC4wMDIgMy4zMDMtMTkuNDQgOC43NEM0LjkzIDE2LjY0NSAyIDIzLjcxNyAyIDMyYzAgMi41NDkuMjggNC45ODIuODM0IDcuM0w2MC45MiAyMy43MzhjLS4wMi0uMDc3LS4wMzgtLjE1MS0uMDYtLjIyOWEyOC4zNjUgMjguMzY1IDAgMCAwLTIuMDA4LTUuMDg0Yy0uMjQxLS40Ny0uNTA3LS45NS0uNzgzLTEuNDIzLTEuMjktMi4xOTMtMi45MS00LjI3Mi00Ljg1Mi02LjIxMy00LjYxNC00LjYxNS05Ljk5LTcuNDE0LTE2LjEyMy04LjM5M2EzMC43MTUgMzAuNzE1IDAgMCAwLTMuMTgtLjM0IDM0LjAwNyAzNC4wMDcgMCAwIDAtMS45MTMtLjA1NHoiIGZpbGw9InVybCgjYykiLz48cGF0aCBkPSJNMTkuNDEgNC42NzRjLTIuNDMgMS4xMy00LjcxMyAyLjYxOS02Ljg0OCA0LjQ2N2wyMC4wNzQgMjAuMDc0LTMwLjIgOC4wOWEyOC4xOTUgMjguMTk1IDAgMCAwIDIuNDA0IDcuNjRsMzQuMzI4LTkuMi40MjctLjExNCAyMi4zMTgtNS45OGEzMC41NiAzMC41NiAwIDAgMC0uODIyLTUuMjc4IDI4LjM2NSAyOC4zNjUgMCAwIDAtLjc3LTIuNTM5Yy0uMDAzLS4wMTItLjAxLS4wMjItLjAxMy0uMDMzTDQxLjU2IDI2LjgyNCAxOS40MSA0LjY3NHoiIGZpbGw9InVybCgjZCkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiLz48ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDQ3MTMgMCAwIC4wNDQ4NyAyMi45ODMgNDYuNjk3KSIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMzUiIHN0cm9rZS13aWR0aD0iLjk3MyI+PHBhdGggZD0iTTE5MS4zLTY0NS4wMmMtMTE3LjE3IDAtMjEyLjE2IDk0Ljk5MS0yMTIuMTYgMjEyLjE2IDAgOC45Ny43MiAxNy43MTEgMS44MTYgMjYuMzc3IDE4LjEzIDE2NS43MiAxOTYuNTcgMzU2LjczIDE5Ni41NyAzNTYuNzMgMy4xOCAzLjU1OCA2LjI0NSA1Ljc1MyA5LjE5NiA3LjM0MWwuMTUyLjA3NiA1Ljk0MiAxLjg5MyA1Ljk0Mi0xLjg5My4xNTItLjA3NmMyLjk1Mi0xLjU5IDYuMDE4LTMuODk3IDkuMTk2LTcuMzQxIDAgMCAxNzUuODctMTkxLjM0IDE5My41OC0zNTcuMSAxLjA2LTguNTUzIDEuNzgtMTcuMjIgMS43OC0yNi4wMzgtLjA0LTExNy4xMy05NC45OTItMjEyLjEyLTIxMi4xNi0yMTIuMTJ6bTAgMzQ4LjYzYy03NS4yMzYgMC0xMzYuNDctNjEuMjMzLTEzNi40Ny0xMzYuNDdzNjEuMjMzLTEzNi40NyAxMzYuNDctMTM2LjQ3IDEzNi40MyA2MS4yMzMgMTM2LjQzIDEzNi40Ny02MS4xOTUgMTM2LjQ3LTEzNi40MyAxMzYuNDd6Ii8+PC9nPjxwYXRoIGQ9Ik0xOTEuMy02NDUuMDJjLTExNy4xNyAwLTIxMi4xNiA5NC45OTEtMjEyLjE2IDIxMi4xNiAwIDguOTcuNzIgMTcuNzExIDEuODE2IDI2LjM3NyAxOC4xMyAxNjUuNzIgMTk2LjU3IDM1Ni43MyAxOTYuNTcgMzU2LjczIDMuMTggMy41NTggNi4yNDUgNS43NTMgOS4xOTYgNy4zNDFsLjE1Mi4wNzYgNS45NDIgMS44OTMgNS45NDItMS44OTMuMTUyLS4wNzZjMi45NTItMS41OSA2LjAxOC0zLjg5NyA5LjE5Ni03LjM0MSAwIDAgMTc1Ljg3LTE5MS4zNCAxOTMuNTgtMzU3LjEgMS4wNi04LjU1MyAxLjc4LTE3LjIyIDEuNzgtMjYuMDM4LS4wNC0xMTcuMTMtOTQuOTkyLTIxMi4xMi0yMTIuMTYtMjEyLjEyem0wIDM0OC42M2MtNzUuMjM2IDAtMTM2LjQ3LTYxLjIzMy0xMzYuNDctMTM2LjQ3czYxLjIzMy0xMzYuNDcgMTM2LjQ3LTEzNi40NyAxMzYuNDMgNjEuMjMzIDEzNi40MyAxMzYuNDctNjEuMTk1IDEzNi40Ny0xMzYuNDMgMTM2LjQ3eiIgZmlsbD0idXJsKCNmKSIgdHJhbnNmb3JtPSJtYXRyaXgoLjA0NzEzIDAgMCAuMDQ3MTMgMjIuOTgzIDQ4LjE1NSkiIHN0cm9rZS13aWR0aD0iLjk1Ii8+PC9zdmc+\"\nLABEL oc.keyword=\"maps,maps\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Maps.desktop\"\nLABEL oc.launch=\"org.gnome.Maps.org.gnome.Maps\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"maps\"\nLABEL oc.displayname=\"maps\"\nLABEL oc.path=\"/usr/bin/gnome-maps\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"maps\"\nENV APPBIN \"/usr/bin/gnome-maps\"\nENV APP \"/usr/bin/gnome-maps\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/maps/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/maps/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application maps

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/maps.d\n
"},{"location":"applications/maps/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f maps.d -t maps .\n
"},{"location":"applications/maps/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect maps > maps.json\ndocker image save maps -o maps.tar\nctr -n k8s.io images import maps.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @maps.json\n\n
"},{"location":"applications/math/","title":"math","text":""},{"location":"applications/math/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.libreoffice

"},{"location":"applications/math/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/math/#alpine-packages","title":"Alpine packages","text":"
libreoffice-gnome\n
"},{"location":"applications/math/#arguments","title":"Arguments","text":"

\"--math\"

"},{"location":"applications/math/#displayname","title":"Displayname","text":"
Math\n
"},{"location":"applications/math/#path","title":"Path","text":"
/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/math/#uniquerunkey","title":"uniquerunkey","text":"

\"libreoffice\"

"},{"location":"applications/math/#mimetype","title":"Mimetype","text":"
application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\n
"},{"location":"applications/math/#file-extensions","title":"File extensions","text":"

\"odf;odc\"

"},{"location":"applications/math/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"odf;odc\"

"},{"location":"applications/math/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/math/#wm_class","title":"WM_CLASS","text":"
libreoffice.libreoffice-math\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/math/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/libreoffice-math.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/math/#json-dump","title":"JSON dump","text":"

json source file math.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_math.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-math\",\n    \"name\": \"math\",\n    \"displayname\": \"Math\",\n    \"args\": \"--math\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\",\n    \"fileextensions\": \"odf;odc\",\n    \"legacyfileextensions\": \"odf;odc\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-math.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/math/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output math.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/math.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @math.d.3.0.json\n\n
"},{"location":"applications/math/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_math.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjMyIiB4Mj0iMzIiIHkxPSI3IiB5Mj0iNTciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZTdlNyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iNDUuNTAxIiB4Mj0iNDUuNTAxIiB5MT0iNy4xMDU1IiB5Mj0iMjkuODk2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNWY1ZjUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImsiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjc1Ii8+CiAgPC9maWx0ZXI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iMzguMDY2IiBjeT0iMjYuMTkyIiByPSIyNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtLjggM2UtOCAtMS45MjY1ZS04IC0uOTQwMzQgODAuNDUzIDM4LjYyOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFlMzUzYyIgc3RvcC1vcGFjaXR5PSIuNDg1MzgiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTkxOTE5IiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iMzYxOC40IiB4Mj0iMzYxOC40IiB5MT0iLTc1OC42NCIgeTI9Ii03NzIuNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS44NzUgMCAwIDIgLTY3NTkuMiAxNTYzLjMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaCIgeDE9IjM3MTYuMiIgeDI9IjM3MTYuMiIgeTE9IjY4My45OCIgeTI9IjcwNS4xMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJqIiB4MT0iMTk1Ljc1IiB4Mj0iMTk1Ljc1IiB5MT0iMTAxNi4yIiB5Mj0iMTAzMi4yIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDM0MzUuNSwtMTg5MS41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsIiB4MT0iMTk1Ljc1IiB4Mj0iMTk1Ljc1IiB5MT0iMTAxNi4yIiB5Mj0iMTAzMi4yIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0xLDAsMCwxLDM4MzAuNSwtMTg5MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibSIgeDE9IjM3MTYuMiIgeDI9IjM3MTYuMiIgeTE9IjY4My45OCIgeTI9IjcwNS4xMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk0NTkgMCAwIDEgMjAuMDM5IC0uMTMwNTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8ZmlsdGVyIGlkPSJvIiB4PSItLjA1OCIgeT0iLS4wNjIxNDMiIHdpZHRoPSIxLjExNiIgaGVpZ2h0PSIxLjEyNDMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzI1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibiIgeD0iLS4wNTI4MjYiIHk9Ii0uMDY5NDI4IiB3aWR0aD0iMS4xMDU3IiBoZWlnaHQ9IjEuMTM4OSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MDQ5OTYyMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjI1IDAgMCAxLjI1IC00NTA1LjUgMTExNS4zKSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgc3Ryb2tlLXdpZHRoPSIuOCI+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjggMCAwIC44IDM2MDQuNCAtODkyLjI0KSIgZD0ibTE5IDE4Yy0xLjEwOCAwLTIgMC44OTE5OS0yIDJ2MjRjMCAxLjEwOCAwLjg5MTk5IDIgMiAyaDI2YzEuMTA4IDAgMi0wLjg5MTk5IDItMnYtMTljMC0zLTUtNy04LTdoLTIweiIgZmlsdGVyPSJ1cmwoI28pIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMSIvPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC44IDAgMCAuOCAzNjA0LjQgLTg5Mi4yNCkiIGQ9Im0xOSAxOGMtMS4xMDggMC0yIDAuODkxOTktMiAydjI0YzAgMS4xMDggMC44OTE5OSAyIDIgMmgyNmMxLjEwOCAwIDItMC44OTE5OSAyLTJ2LTE5YzAtMy01LTctOC03aC0yMHoiIGZpbGw9InVybCgjaSkiIHN0cm9rZS13aWR0aD0iMSIvPgogIDxnIGZpbGw9IiNmMDllNmYiPgogICA8cmVjdCB4PSIzNjE4IiB5PSItODU3Ljg0IiB3aWR0aD0iMjQiIGhlaWdodD0iLjc5OTk4Ii8+CiAgIDxyZWN0IHg9IjM2MTgiIHk9Ii04NzYuMjQiIHdpZHRoPSIyNCIgaGVpZ2h0PSIuODAwMDMiLz4KICAgPHJlY3QgdHJhbnNmb3JtPSJyb3RhdGUoOTApIiB4PSItODc3Ljg0IiB5PSItMzYyMC40IiB3aWR0aD0iMjIuNCIgaGVpZ2h0PSIuOCIvPgogICA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIHg9Ii04NzcuODQiIHk9Ii0zNjQwLjQiIHdpZHRoPSIyMi40IiBoZWlnaHQ9Ii43OTk5MiIvPgogIDwvZz4KICA8ZyBmaWx0ZXI9InVybCgjbikiIG9wYWNpdHk9Ii4yNSI+CiAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuNTA0MSwwLDAsMS41MDQxLC0xOTYzLjksLTE5MTQuMikiIGQ9Im0zNzI0LjkgNjkxLjY2djEuOTk0NWgtMC45OTE4di0wLjkzMDc4aC02LjE0OTZsLTEuMzg4NyA4LjI0NDFoLTEuNTg2OWwtMS4zMjI1LTQuMTg4NWgtMC43OTM2di0xLjEzMDJsMS42NTMyIDJlLTUgMS4xNTcxIDMuMzI0MiAxLjE1NzItNy4zMTMzIiBzdHJva2Utd2lkdGg9Ii44Ii8+CiAgIDxwYXRoIGQ9Im0zNjM3LTg2Ny42NC03IDciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogICA8cGF0aCBkPSJtMzYzMC04NjcuNjQgNyA3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KICA8L2c+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS41MDQxIDAgMCAxLjUwNDEgLTE5NjMuOSAtMTkxNC4yKSIgZmlsbD0idXJsKCNoKSI+CiAgIDxwYXRoIGQ9Im0zNzI0LjkgNjkxLjY2djEuOTk0NWgtMC45OTE4di0wLjkzMDc4aC02LjE0OTZsLTEuMzg4NyA4LjI0NDFoLTEuNTg2OWwtMS4zMjI1LTQuMTg4NWgtMC43OTM2di0xLjEzMDJsMS42NTMyIDJlLTUgMS4xNTcxIDMuMzI0MiAxLjE1NzItNy4zMTMzIiBmaWxsPSJ1cmwoI20pIiBzdHJva2Utd2lkdGg9Ii44Ii8+CiAgPC9nPgogIDxwYXRoIGQ9Im0zNjM3LTg2Ny42NC03IDciIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNqKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogIDxwYXRoIGQ9Im0zNjMwLTg2Ny42NCA3IDciIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNsKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"math,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-math.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-math\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--math\"\nLABEL oc.name=\"math\"\nLABEL oc.displayname=\"Math\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\"\nLABEL oc.fileextensions=\"odf;odc\"\nLABEL oc.legacyfileextensions=\"odf;odc\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"math\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--math\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/math/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/math/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application math

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/math.d\n
"},{"location":"applications/math/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f math.d -t math .\n
"},{"location":"applications/math/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect math > math.json\ndocker image save math -o math.tar\nctr -n k8s.io images import math.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @math.json\n\n
"},{"location":"applications/mathwar/","title":"Mathwar","text":""},{"location":"applications/mathwar/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/mathwar/#distribution","title":"Distribution","text":"

ubuntu

"},{"location":"applications/mathwar/#ubuntu-packages","title":"Ubuntu packages","text":"
mathwar\n
"},{"location":"applications/mathwar/#path","title":"Path","text":"
/usr/games/mathwar\n
"},{"location":"applications/mathwar/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/mathwar/#wm_class","title":"WM_CLASS","text":"
mathwar.Mathwar\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/mathwar/#json-dump","title":"JSON dump","text":"

json source file mathwar.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"mathwar\",\n    \"icon\": \"mathwar.svg\",\n    \"keyword\": \"mathwar,math\",\n    \"launch\": \"mathwar.Mathwar\",\n    \"name\": \"Mathwar\",\n    \"path\": \"/usr/games/mathwar\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/mathwar/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output mathwar.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mathwar.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mathwar.d.3.0.json\n\n
"},{"location":"applications/mathwar/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends mathwar && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"mathwar.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjY0IgogICBoZWlnaHQ9IjY0IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ3IHIyMjU4MyIKICAgc29kaXBvZGk6ZG9jbmFtZT0ibWF0aHdhci5zdmciPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIzLjYyMDM4NjciCiAgICAgaW5rc2NhcGU6Y3g9Ii0zNS4wNzUzMzkiCiAgICAgaW5rc2NhcGU6Y3k9IjgzLjA3MDU0MSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXI0IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEyODAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iOTM0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTkxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTkzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkM2Q3Y2Y7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxOTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QzZDdjZjtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTcxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTczIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTU1NzUzO3N0b3Atb3BhY2l0eTowLjg3ODQzMTM3OyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDcxODUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjAuNzU2ODYyNzU7IgogICAgICAgICBvZmZzZXQ9IjAuNSIKICAgICAgICAgaWQ9InN0b3A3MTgzIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxNzUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzU1NTc1MztzdG9wLW9wYWNpdHk6MC41MTIwNDgxODsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1NTI3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1NTI5IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4ODhhODU7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU1MzEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izg4OGE4NTtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1NDY1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1NDY3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU0NjkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUxMCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyODI0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4NjMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzcyMyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTM3NDEtMyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzc0MS0wOSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTA5NiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg0MyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzODQzLTciIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg0My04IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTM4NDMtNzEiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEwMjYuNjA2NyIKICAgICAgIHgyPSIxNzU3LjAzMTYiCiAgICAgICB5MT0iMTAyNi42MDY3IgogICAgICAgeDE9IjEyMjcuODQ1NSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDU1MzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1NTI3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NDMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTU0My00IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTEwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTEyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuMjA4NzI5NzQiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjYWRiZWQ7c3RvcC1vcGFjaXR5OjAuNDk4MDM5MjI7IgogICAgICAgICBpZD0ic3RvcDM1NDkiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzU1MSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2FmYzllNDtzdG9wLW9wYWNpdHk6MC43NDkwMTk2MTsiCiAgICAgICAgIG9mZnNldD0iMC40MjAwMTUwNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwLjYzMzU0NzI1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eTowLjg3NDUwOTgxOyIKICAgICAgICAgaWQ9InN0b3AzNTUzIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuODMzMzMyNiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzRmN2ZiZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIGlkPSJzdG9wMzUyMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTIyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzQ2NWE0O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzUzMyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzUzNSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTQ1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzQ2NWE0O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzU1NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzIwNGE4NztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIGlkPSJzdG9wMzU1NyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTcxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWJiY2RiO3N0b3Atb3BhY2l0eTowLjQ5ODAzOTIyOyIKICAgICAgICAgb2Zmc2V0PSIwLjY1NTYwNTk3IiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuODA4NDY4NCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MC4yNDcwNTg4MjsiCiAgICAgICAgIGlkPSJzdG9wMzU3MyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTc1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTZlZmY2O3N0b3Atb3BhY2l0eTowLjEyMTU2ODYzOyIKICAgICAgICAgb2Zmc2V0PSIwLjg3NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwLjg3NTQ0MzA0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjJmNmZhO3N0b3Atb3BhY2l0eTowLjA1ODgyMzUzOyIKICAgICAgICAgaWQ9InN0b3AzNTc3IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM1NzkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmOGZhZmM7c3RvcC1vcGFjaXR5OjAuMDI3NDUwOTg7IgogICAgICAgICBvZmZzZXQ9IjAuOTU3ODcyODciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMC45ODQzNzUiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmYmZjZmQ7c3RvcC1vcGFjaXR5OjAuMDExNzY0NzE7IgogICAgICAgICBpZD0ic3RvcDM1ODEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzU4MyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZkZmRmZTtzdG9wLW9wYWNpdHk6MC4wMDM5MjE1NzsiCiAgICAgICAgIG9mZnNldD0iMC45ODQzNzUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIGlkPSJzdG9wMzU2NyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzMTkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDMzMjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzMyMyIKICAgICAgICAgb2Zmc2V0PSIwLjU3NDI0MDYyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjE0MzgzNTYyOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzMzI1IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAyNCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI0OCA6IDI0IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNCA6IDE2IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU2NTUiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTc2OCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NzY4LTIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTc2OC0xIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU3NjgtNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1ODkxIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU4OTEtMSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1OTM0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU5MzQtNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1OTM0LTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTkzNC0wNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU2MDI5IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjIiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtOSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTYiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTciCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTg5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTkxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTkzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5NSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjIwNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS05IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0My02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0wIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxODktOCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE5MS0zIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTkzLTYiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTk1LTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS00IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0My00IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0zIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNjIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTYiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTg5LTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxOTEtOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5My05IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5NS03IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTYxODEtMiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtNSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi0yIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTYxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE4OS02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0yIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTkxLTQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTMtNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTUtNTgiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtOSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS0yNiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMzciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItMzciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtMCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtOCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxODktMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMzciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxOTEtMzgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTMtNyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTUtMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0zNyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtNyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MzkzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0MDEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjQxMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjIiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjU0OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0yLTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTktMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItMi0xIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTgtOCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNjEtMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjU1NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjU1OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY1NjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMi0xIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjU2OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjYxMyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0MTAtMiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NjIyIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjYyNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYzMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjYxMy02IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjQxMC02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi03IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYyMi0xIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI0LTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI2LTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2MzItMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjcwOCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTktMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC02LTciCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcxNyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxOSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOS0xIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcyOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjc3MyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTktMyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC02LTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMjciCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3ODIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3ODQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2Nzg2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTktMyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3OTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTY4MzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYzMi0yMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTItMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNzctNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg0NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjg0OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY4NTEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg1NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjkwMCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTMtMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3OTMtNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItOS0zLTIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNi05LTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMjctOCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkwOSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjkxMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY5MTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOS0zLTIiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTIwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU2OTY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC04IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg1Ny03IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC0yLTEtMiIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNzctNi0yIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTc0Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc2IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjk3OCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5ODQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTY5NjUtNCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY4NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTkiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtMi0xLTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3LTYtNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk3NC04Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc2LTIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc4LTEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTkiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTg0LTciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTcwNjAiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5ODQtNy04IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS02Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTItMS04LTAiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3LTYtNy0wIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDY5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDcxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzA3MyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS02IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA3OSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNzA2MC02IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTg0LTctNiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC0yLTEtOC03IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2Ni03Ny02LTctNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA2OS02Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDcxLTAiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDczLTYiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwNzktNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjY1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI3MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNzciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzU4IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYyIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzM3MCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNzQiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3Mzc0LTYzNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNC04MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTgyIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDA1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQwNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNzItNzQ3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTQ5NyIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTQ5NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQxMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzcwLTczNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNi0zNjAiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNi0zNjAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MTciCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDE5IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjMmMyYzI7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzM2OC0zNDMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTYtNTIzIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTYtNTIzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDIzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQyNSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjkzMS42NDg5OSIKICAgICAgIHgyPSIxODA4LjE3MzEiCiAgICAgICB5MT0iOTMxLjY0ODk5IgogICAgICAgeDE9IjEyMDUuMTEyMSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNzgwNzk1MSwwLDAsMC4wNzgwNzk1MSwtODUuODMzNTY3LDk0OC41Njk3OSkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMxMzgtNzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1ODQ5LTM4OCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTg0OS0zODgiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MjkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJhYWYxODtzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQzMSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMmFhZjE4O3N0b3Atb3BhY2l0eTowOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSI5MzEuNjQ4OTkiCiAgICAgICB4Mj0iMTgwOC4xNzMxIgogICAgICAgeTE9IjkzMS42NDg5OSIKICAgICAgIHgxPSIxMjA1LjExMjEiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDc4MDc5NTEsMCwwLDAuMDc4MDc5NTEsLTg1LjgzMzU2Nyw5NDguNTY5NzkpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMTQwLTI4NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM4ODctMjcxIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzODg3LTI3MSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQzNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDM3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjYtNjYyIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03NjAiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNzYwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDQxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ0MyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjQtNTM2IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03MSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03MSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ0NyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NDkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYyLTY3MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTgtNTI0IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC04LTUyNCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ1MyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYwLTc1NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTgtMTIwIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC04LTEyMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ1OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzU4LTk4NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTIyNSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtMjI1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDY1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ2NyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNTYtNDg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtNDQ3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC00NDciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NzEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDczIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjMmMyYzI7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iNzc3LjM2MjE4IgogICAgICAgeDI9IjMxMTguNTcxNSIKICAgICAgIHkxPSI5MDkuNTA1MDciCiAgICAgICB4MT0iMzExOC41NzE1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjA3ODA3OTUxLDAsMCwwLjA3ODA3OTUxLC0yMTIuNjYwMSw5NjMuMDgyMjgpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMTI4LTg5OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxOTktODUyIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTk5LTg1MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ3NyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzgzZTQ5O3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDc5IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzODNlNDk7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg4MyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZSAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTk4OC4zNjIxOCkiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlkPSJsYXllcjEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpbmtzY2FwZTpsYWJlbD0iQ2FwYSAxIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMyIKICAgICBpZD0ibGF5ZXI1IgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiIC8+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC05ODguMzYyMTgpIgogICAgIHN0eWxlPSJkaXNwbGF5Om5vbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMSIKICAgICBpZD0ibGF5ZXIzIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzgxMSIKICAgICAgIGQ9Im0gMTIxNi45MzA4LDk2MS42MzQwMyA1NTYuOTAzNCwtMS4zNjA2NiAtOS41MDgsMzIuNjU1ODMgLTIzLjA5MTEsOC4xNjQgLTYuNzkxNiw1MC4zNDQzIC01MS42MTU0LDI5LjkzNDYgLTQzLjQ2NTcsOS41MjQ2IC0zMjUuOTkyMiwxLjM2MDcgLTI5Ljg4MjcsLTM1LjM3NzIgLTE3LjY1NzksLTQuMDgyIC0xNi4yOTk2LC0zNS4zNzcyIC0zMS4yNDA5LC0xMy42MDY1IC0xLjM1ODMsLTQyLjE4MDQ3IHoiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNTU1NzUzO3N0cm9rZS13aWR0aDo5LjUxNjM1OTMzO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgPC9nPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTpub25lIgogICAgIGlua3NjYXBlOmxhYmVsPSJDYXBhIzQiCiAgICAgaWQ9ImxheWVyNiIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIj4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU0NDIiCiAgICAgICBkPSJtIDE3NDUuNTQzNiw5NzMuNTcwMjggYyAtMTcyLjA2MjcsLTAuMzM2NzIgLTM0NC4xMjUzLC0wLjY3MzQzIC01MTYuMTg4LC0xLjAxMDE1IC0wLjMzNjcsNy4wNzEwNyAtMC42NzM0LDE0LjE0MjEzIC0xLjAxMDEsMjEuMjEzMiAxMC43NzUsNC43MTQwNiAyMS41NDk5LDkuNDI4MDcgMzIuMzI0OSwxNC4xNDIxNyA0LjM3NzMsMTIuMTIxOCA4Ljc1NDcsMjQuMjQzNyAxMy4xMzIsMzYuMzY1NSA5LjE1OTgsMy41MTYgMTkuNDExMiw1LjU1NCAyNy45MDQsOS45NzMxIDYuNTI0Myw5LjEzNDIgMTMuMDQ4NywxOC4yNjgzIDE5LjU3MzEsMjcuNDAyNSAxMDQuNzE5MiwtMC42NzM0IDIwOS40MzgzLC0xLjM0NjkgMzE0LjE1NzUsLTIuMDIwMyAxNi4zNDc3LC00LjYzNTIgMzMuNDA1MywtNy42MTEzIDQ5LjMxNSwtMTMuMjcwNSAxMi44NTYxLC04LjAzNSAyNS43MTIxLC0xNi4wNzAxIDM4LjU2ODIsLTI0LjEwNTEgMi4zNTcsLTE2LjQ5OTIgNC43MTQxLC0zMi45OTgzIDcuMDcxMSwtNDkuNDk3NTIgNy4wMzkyLC0zLjU1ODcxIDE1LjUxOTksLTUuNTg4NSAyMS42OTc4LC0xMC4wNjA2MyAzLjAwMzYsLTUuOTg5NDkgOS4xNzYsLTE0LjMxOTM2IC0xLjkwNjIsLTkuOTA1NDkgLTEuNTQ2NCwwLjI1Nzc0IC0zLjA5MjksMC41MTU0OCAtNC42MzkzLDAuNzczMjIgeiIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1NTMzKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogIDwvZz4KICA8ZwogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTk4OC4zNjIxOCkiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlua3NjYXBlOmxhYmVsPSJDYXBhIzUiCiAgICAgaWQ9ImxheWVyNyIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEiCiAgICAgaWQ9ImxheWVyMiIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMiIKICAgICBpZD0ibGF5ZXI0IgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNzIwNy0wIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MiCiAgICAgICBkPSJtIDU0LjQwNDg3NiwxMDI5Ljc3NDcgMTIuNzk5MDU3LDAgLTAuNTg1NTc0LDAuOTczMSAtMy4xMDYzMTYsMS41MTM2IC0yLjc0NTM3LDAuNTQwNiAtNC4yNDUxNzcsMi4xNjI0IC0yLjQzNTE3OCwwLjEwODEgLTMuMTA2NDg3LDEuNTEzOCAtNC44MTcxMTUsMS4wODExIC0zLjMxNDgzLDAuODY1IC0yLjg4NDM1NiwwLjEwODIgLTIuOTM1MTk4LDAuNjQ4NyAtMjcuOTEyOTk2NSwtMC4yMTYzIC0wLjI3Nzk2NSwtMC44NjQ5IDAuMjQwNzM4LC0wLjY0ODggLTEuOTg2MTc0LDAuMTA4MSAxLjEyMDIxOSwtMS40MDU1IC0xLjMzMTE1OSwtMC42NDg4IC0wLjE3MzYyNCwtMC41NDA2IDYuODMyODY3NSwtMy44OTIzIDUuMTk2ODQxLC0xLjI5NzUgNC42ODA2MjUsLTAuMTA4IDIuNzYxNTc0LC0xLjE4OTQgNS4xNzgxNTYsLTIuMDU0MyAyLjk4NjAyNSwtMS4xODkzIDMuMTk0NDY2LC0wLjU0MDYgMi42OTQ1MzYsMCAxLjk2NzU2NiwtMC44NjUgMy41NTc5ODksLTAuMTA4MSAtMS42NzM0ODksMS4wODExIDEuNTM3MDA2LC0wLjEwOCAxLjU1MzE5NywtMC43NTY5IDEwLjEzOTI0MSwwLjEwODEgLTEuMzI4NTcxLDAuNzU2OCA5LjY3MTUzNCwtMC42NDg3IDYuODM4MDE5LC0xLjA4MTIgNi42MTM0NywtMS4wODEyIC0xLjg2MzMwOSwxLjE4OTQgLTEyLjEzOTAyNCwyLjA1NDMgLTcuMjUyMzgsMS4xODkzIC0zLjgzMDg4NCwyLjA1NDMgMC4zODIwNSwxLjE4OTQgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuMjk4MDM5MjI7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg3MjA3IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MiCiAgICAgICBkPSJtIDQzLjU1NTMzNSwxMDE3LjM1MjcgMTIuNzE1ODEyLDAgMS4xMTU0MiwyLjAwNzggLTAuNDQ2MTcsMy4xMjMxIC0xLjc4NDY3MSwxLjExNTQgLTAuNDQ2MTcsNC40NjE3IC0yLjIzMDg0LDAuMjIzIC0wLjQ0NjE3MSwzLjEyMzMgLTIuOTAwMDk5LDIuMjMwOCAtMS43ODQ2NzEsMS43ODQ3IC0yLjY3NzAxMSwwLjIyMzEgLTEuNzg0Njc5LDEuMzM4NSAtMjguMTA4NjI0LC0wLjQ0NjIgLTEuNzg0NjcyLC0xLjc4NDYgLTAuODkyMzM5LC0xLjMzODYgLTEuNzg0NjcyLDAuMjIzMSAtMS4zMzg1MDg5LC0yLjkwMDEgLTIuNDUzOTI5OCwtMS4zMzg1IC0xLjExNTQyMDYsLTEuMTE1NSAwLC04LjAzMDkgMi45MDAwOTk2LC0yLjY3NzEgNC40NjE2ODI3LC0wLjIyMyAwLjY2OTI1OCwtMi40NTQgMS41NjE1OSwtNC4yMzg2IDAuODkyMzMyLC0yLjQ1MzkgMi4yMzA4NDgsLTEuMTE1NCAyLjY3NzAxMSwwIDAuNDQ2MTcsLTEuNzg0NyAzLjM0NjI2MiwtMC4yMjMxIDAuMjIzMDgsMi4yMzA4IDEuMzM4NTEsLTAuMjIzIDAuMjIzMDgxLC0xLjU2MTYgMTAuMjYxODgxLDAuMjIzMSAwLDEuNTYxNSA4LjQ3NzIwMiwtMS4zMzg1IDQuOTA3ODU5LC0yLjIzMDggNC42ODQ3NzEsLTIuMjMwOCAwLjIyMzA4MSwyLjQ1MzkgLTguNDc3MjAyLDQuMjM4NiAtNS4xMzA5NCwyLjQ1MzkgLTAuMjIzMDgxLDQuMjM4NiAyLjQ1MzkyMSwyLjQ1NCB6IgogICAgICAgc3R5bGU9ImZpbGw6I2NiZmY4NztmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzJhYWYxODtzdHJva2Utd2lkdGg6MS41NjE1OTAzMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzg4NSIKICAgICAgIGQ9Im0gMTkuMTQ1MzUzLDEwMDkuNjc4OCAtMS4yNjE5NTIsMS4xODMyIC0yLjgzOTQsOS4yMjggLTUuNDQyMTgxNywwLjMxNTUgLTEuMjYxOTYwMiwxLjM0MDggLTAuMDc4ODY4LDUuODM2NSAyLjkxODI2ODksMS4xMDQzIDEuMDI1MzQsMi40NDQ5IDEuNzM1MTkyLC0wLjIzNjUgMi42ODE2NTYsMy43MDcgMjUuNjMzNDY2LDAgMi4yMDg0MjQsLTEuNDk4NiAyLjI4NzI5MiwwLjIzNjYgMy42MjgxMjEsLTMuMzEyNiAwLjU1MjEwOCwtMy42MjgxIDIuMjA4NDI1LC0wLjcwOTkgMC4zOTQzNTYsLTIuNjgxNyAwLjMxNTQ5NSwtMC44Njc1IDEuNDk4NTczLC0wLjk0NjUgLTAuMDc4ODcsLTEuMTgzMSAtMC4wNzg4NywtMC41NTIxIC0xMS41OTQyMjIsMC4xNTc3IC0xLjE4MzA4NSwwLjA3OSAtMi45MTgyNjgsLTMuNjI4MSAtMC41NTIxMDgsLTAuNzA5OSAwLjMxNTQ4OCwtNC45Njg5IDAuMDc4ODcsLTAuODY3NiAxLjM0MDgyOCwtMC41NTIxIC01LjM2MzMxMywxLjAyNTMgLTAuNjMwOTc2LC0xLjk3MTcgLTUuODM2NTQ1LDAgLTEuMTgzMDg1LDEuODE0IC0zLjg2NDc0LC0wLjA3OSAtMC4zOTQzNTYsLTAuOTQ2NSAtMC41NTIxMDgsMCAtMC44Njc1OTYsMS4wMjU0IC0yLjgzOTQwMSwtMC4xNTc4IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzEzOC03Myk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQzMTQwLTI4NSk7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtkaXNwbGF5OmlubGluZSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU3NTQiCiAgICAgICBkPSJtIDE5Ljg1MjYyOSwxMDE2LjIzNzIgYyAwLjcyNTAyMywtMC4xNjcyIDMuOTAzOTc1LC0zLjIzNDcgMy45MDM5NzUsLTMuMjM0NyAwLDAgNC41MTc0NjIsLTIuMTc1IDQuMTgyODM3LDEuMTcxMiAtMC4zMzQ2MzQsMy4zNDYyIC03LjMwNjAxNyw2LjEzNDkgLTcuMzA2MDE3LDYuMTM0OSAwLDAgLTQuOTYzNjI0LC0xLjQ1MDEgLTIuODQ0MzE5LC0yLjc4ODcgMi4xMTkyOTYsLTEuMzM4NSAyLjAwNzc1MSwtMS4zMzg1IDIuMDYzNTI0LC0xLjI4MjcgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMyYWFmMTg7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg1NzU2IgogICAgICAgZD0ibSAzMi40MDExMjMsMTAxNS44NDY4IGMgLTEuMTcxMTkzLDMuMTc5IC01Ljg1NTk2NCwyLjA2MzYgLTAuOTQ4MTA0LDMuMzQ2MyA0LjkwNzg1MiwxLjI4MjcgMi41NjU0NjYsMi4xNzUxIDQuOTA3ODUyLDEuMjI2OSAyLjM0MjM4NSwtMC45NDgxIDEuNzI4OTA2LDEuMzM4NSAyLjM0MjM4NSwtMC45NDgxIDAuNjEzNDc5LC0yLjI4NjYgMi4wNjM1MzIsMS4xNzEzIDAuNjEzNDc5LC0yLjI4NjYgLTEuNDUwMDQ2LC0zLjQ1NzcgLTEuNzI4ODk5LC0yLjIzMDggLTEuNDUwMDQ2LC0zLjUxMzUgMC4yNzg4NTMsLTEuMjgyOCAtNS40MDk3OTQsMi4xMTkzIC01LjQ2NTU2NiwyLjE3NSB6IgogICAgICAgc3R5bGU9ImZpbGw6IzJhYWYxODtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU3NTgiCiAgICAgICBkPSJtIDQ0LjA1NzI3OCwxMDIxLjIwMDkgYyA1Ljg1NTk2MywwLjUwMiAwLjM5MDM5NywxLjcyODkgMC4zOTAzOTcsMS43Mjg5IDAsMCAtMy41NjkzNSwtMS4xMTU1IC0yLjUwOTY5NCwtMS44NDA1IDEuMDU5NjQ5LC0wLjcyNSAyLjExOTI5NywwLjExMTYgMi4xMTkyOTcsMC4xMTE2IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMmFhZjE4O3N0cm9rZTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNTgxOCIKICAgICAgIGQ9Im0gMjQuNjY2NDEsMTAxNC40OSBjIDEuMTc0MzQ3LDIuNTYxOCAzLjQyOTA3Myw0LjYxNDIgNi4xMDU0NzUsNS41MDc3IC0wLjA2MDU5LDAuOTI0IDEuMzkwOSwzLjE0NzMgMS4yNDc2OTUsMS4wMDMzIDAuMTA0NTY0LC0xLjg5MSAtMC4wMjMyMiwtNi4wNTMgLTIuOTEwNjAxLC00Ljc5MzEgLTEuOTU1NzM2LDAuNTM0NCAtMi4zNzU3MTEsLTIuODIyNyAtNC4xMzAxMSwtMi4wODU3IGwgLTAuMTcyMzI5LDAuMTYxIC0wLjE0MDEzLDAuMjA2OCAwLDAgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMyYWFmMTg7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg1ODI5IgogICAgICAgZD0ibSAzMy4xMDU3NDQsMTAxMC43MDQyIGMgLTAuMDI2MywwIC0wLjA1NTM2LC0wLjAxMiAtMC4wNzg4NywwIC0wLjA4NDc5LDAuMDQyIC0wLjE0OTQ5MSwwLjEyMDMgLTAuMjM2NjIsMC4xNTc4IC0wLjA5OTYzLDAuMDQzIC0wLjIxMzk4NSwwLjA0MSAtMC4zMTU0ODgsMC4wNzkgLTAuMTEwMDg0LDAuMDQxIC0wLjIwNzQxOSwwLjExMTQgLTAuMzE1NDg4LDAuMTU3NyAtMC4wNzY0MSwwLjAzMyAtMC4xNTk0MjMsMC4wNDggLTAuMjM2NjEyLDAuMDc5IC0wLjA1NDU5LDAuMDIxIC0wLjEwMDA5OSwwLjA2NyAtMC4xNTc3NDUsMC4wNzkgLTAuMzEyNjIyLDAuMDYyIC0wLjE1MzI0NiwtMC4wODIgLTAuMzk0MzY0LDAuMDc5IC0wLjAzMDkzLDAuMDIxIC0wLjA2MjI1LDAuMDQ2IC0wLjA3ODg3LDAuMDc5IC0wLjAxMTc1LDAuMDIzIDAuMDExNzYsMC4wNTYgMCwwLjA3OSAtMC4wMTY2MiwwLjAzMyAtMC4wNjIyNSwwLjA0NiAtMC4wNzg4NiwwLjA3OSAtMC4wMDgxLDAuMDE3IC0wLjAxMTEzLDAuMjI1NSAwLDAuMjM2NyAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODYsMCAwLjAyNjM5LDAuMDI2IC0wLjAyNjM4LDAuMTMxMyAwLDAuMTU3NyAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODcsMCAwLjAzNzE4LDAuMDM3IC0wLjAzNzE5LDAuMTIwNSAwLDAuMTU3NyAwLjAxODU5LDAuMDE5IDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ3OTQsMC4wNTkgMC4wNzg4OCwwLjA3OSAwLjA0ODkyLDAuMDMyIDAuMTE2MTc0LDAuMDM3IDAuMTU3NzQ0LDAuMDc5IDAuMDQxNTcsMC4wNDIgMC4wNDYyNiwwLjEwODkgMC4wNzg4NywwLjE1NzggMC4wNDc4NiwwLjA3MSAwLjIwMTY1NywwLjE2NjcgMC4yMzY2MTIsMC4yMzY2IDAuMDExNzYsMC4wMjQgLTAuMDExNzYsMC4wNTYgMCwwLjA3OSAwLjAzMzI2LDAuMDY2IDAuMTI0NDkxLDAuMDkxIDAuMTU3NzQ1LDAuMTU3OCAwLjAxMTc2LDAuMDIzIC0wLjAxODU5LDAuMDYxIDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMzcxOSwwLjAzNyAtMC4wMzcxOSwwLjEyMDYgMCwwLjE1NzggMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg2LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTg1OSwwLjA2MSAwLDAuMDc5IDAuMTYzMTk0LDAuMTYzMiAtMC4wMDY0LC0wLjI0OTQgMC4xNTc3NDQsMC4wNzkgMC4wMTE3NiwwLjAyMyAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDMzMjYsMC4wNjYgMC4xMTY1MDMsMC4wOTYgMC4xNTc3NDQsMC4xNTc4IDAuMDc2NjMsMC4xMTQ5IDAuMDQ5MjQsMC4xNjQyIDAuMTU3NzQ0LDAuMjM2NiAwLjA0ODkyLDAuMDMyIDAuMTA4ODM1LDAuMDQ2IDAuMTU3NzQ0LDAuMDc5IDAuMDMwOTQsMC4wMiAwLjA1MjU4LDAuMDUzIDAuMDc4ODcsMC4wNzkgMC4wMjYyOSwwLjAyNiAwLjA2MjI1LDAuMDQ2IDAuMDc4ODcsMC4wNzkgMC4wMjMyNiwwLjA0NyAtMC4wMTgwOSwwLjE4MjQgMCwwLjIzNjYgMC4wMTg1OCwwLjA1NiAwLjA2MDI4LDAuMTAyIDAuMDc4ODYsMC4xNTc4IDAuMDE0MjMsMC4wNDMgMCwwLjI4ODYgMCwwLjMxNTQgMCwwLjA2NyAwLjAxNDE0LDAuMjczMSAwLDAuMzE1NSAtMC4wMTE3NiwwLjAzNSAtMC4wNzg4NiwwLjA0MiAtMC4wNzg4NiwwLjA3OSAwLDAuMDU5IDAuMDYwMjgsMC4xMDIgMC4wNzg4NiwwLjE1NzggMC4wMTY2MywwLjA1IDAsMC4xMDUxIDAsMC4xNTc3IDAsMC4xMzE1IDAsMC4yNjI5IDAsMC4zOTQ0IDAsMC4wNTMgMCwwLjEwNTEgMCwwLjE1NzcgMCwwLjAyNiAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDMzMjYsMC4wNjYgMC4xMTY0OTUsMC4wOTYgMC4xNTc3NDQsMC4xNTc3IDAuMDMyNjEsMC4wNDkgMC4wMzczLDAuMTE2MiAwLjA3ODg4LDAuMTU3OCAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODcsMCAwLjAxODU5LDAuMDE5IC0wLjAxODU5LDAuMDYxIDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA1MjU4LDAgMC4wNzg4NywwIDAuMDI2MjksMCAwLjA1MjU4LDAgMC4wNzg4NywwIDAuMjg5MTk5LDAgMC41NzgzOTgsMCAwLjg2NzU5NiwwIDAuNjAxNjg5LDAgLTAuMDYyMjIsMC4wMzUgMC4zOTQzNjQsLTAuMDc5IDAuMDUxMDEsLTAuMDEzIDAuMTA2NzI4LDAuMDEzIDAuMTU3NzQ1LDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY0IDAuMTU3NzQ0LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNzg1OSwwLjAxNyAwLjE1Nzc0NCwwIDAuMDM1MjcsLTAuMDEyIDAuMDQzNiwtMC4wNjcgMC4wNzg4NiwtMC4wNzkgMCwtMWUtNCAwLjIzNjU0MiwxMGUtNSAwLjIzNjYyLDAgMC4wMTg1OSwtMC4wMTkgLTAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IC0wLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAwLjAxODU5LC0wLjAxOSAwLjA2MDI4LDAuMDE5IDAuMDc4ODcsMCAwLjAxODU5LC0wLjAxOSAtMC4wMTE3NiwtMC4wNTYgMCwtMC4wNzkgMC4wMzMyNiwtMC4wNjYgMC4xMjQ0OSwtMC4wOTEgMC4xNTc3NDQsLTAuMTU3NyAwLjAxMTc1LC0wLjAyNCAtMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgMC4wMTg1OSwtMC4wMTkgMC4wNjAyOCwwLjAxOCAwLjA3ODg3LDAgMC4wMTg1OSwtMC4wMTkgLTAuMDExNzUsLTAuMDU2IDAsLTAuMDc5IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODgsLTAuMDc5IDAuMDIzNTIsLTAuMDQ3IC0wLjAyMzUyLC0wLjExMDcgMCwtMC4xNTc3IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODcsLTAuMDc5IDAuMDAxNywwIDAuMDAxNywtMC41NDg3IDAsLTAuNTUyMSAtMC4wMzMyNiwtMC4wNjYgLTAuMTE2NTAyLC0wLjA5NiAtMC4xNTc3NTIsLTAuMTU3NyAtMC4wNDgwMywtMC4wNzIgLTAuMDY3MzIsLTAuMTkxNCAtMC4xNTc3NDQsLTAuMjM2NiAtMC4wMjM1MSwtMC4wMTIgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg3LDAgLTAuMDM3MTksLTAuMDM3IDAuMDM3MTksLTAuMTIwNiAwLC0wLjE1NzggLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg3LDAgLTAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IDAsLTAuMDI2IC0wLjAxODU5LC0wLjA2IDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IC0wLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAwLjE2MzE5NCwtMC4xNjMyIC0wLjAwNjQsMC4yNDk0IDAuMTU3NzQ0LC0wLjA3OSAwLjAxMTc2LC0wLjAyMyAtMC4wMDgzLC0wLjA1NCAwLC0wLjA3OSAwLjAxODU5LC0wLjA1NiAwLjA2MDI4LC0wLjEwMiAwLjA3ODg3LC0wLjE1NzggMC4wMDgzLC0wLjAyNCAtMC4wMTE3NiwtMC4wNTYgMCwtMC4wNzkgMC4wMTY2MywtMC4wMzMgMC4wNjIyNSwtMC4wNDYgMC4wNzg4NywtMC4wNzkgMC4wMTE3NSwtMC4wMjMgLTAuMDExNzUsLTAuMDU2IDAsLTAuMDc5IDAuMDQ3MzMsLTAuMDk1IDAuMTg5Mjk2LC0wLjE0MiAwLjIzNjYyLC0wLjIzNjUgMC4wMTE3NiwtMC4wMjQgLTAuMDExNzYsLTAuMDU2IDAsLTAuMDc5IDAuMDM0OTYsLTAuMDcgMC4xODg3NSwtMC4xNjQ4IDAuMjM2NjIsLTAuMjM2NiAwLjEyMzU5MywwLjA2MSAwLjA2NDEzLC0wLjIwNzEgMC4wNzg4NywtMC4yMzY2IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODcsLTAuMDc5IDAuMDExNzUsLTAuMDIzIC0wLjAxMTc2LC0wLjA1NiAwLC0wLjA3OSAwLjAxNjYyLC0wLjAzMyAwLjA2MjI1LC0wLjA0NiAwLjA3ODg2LC0wLjA3OSAwLjAxMiwtMC4wMjQgMCwtMC4yNjEgMCwtMC4zMTU0IDAsLTAuMTU3OCAwLC0wLjMxNTUgMCwtMC40NzMzIDAsLTAuMDI2IDAsLTAuMDUzIDAsLTAuMDc5IDAsLTAuMDI2IDAuMDExNzYsLTAuMDU2IDAsLTAuMDc5IC0wLjAxNjYyLC0wLjAzMyAtMC4wNjIyNSwtMC4wNDYgLTAuMDc4ODYsLTAuMDc5IC0wLjAxNTY0LC0wLjAzMSAwLjAxNjEyLC0wLjIyMDUgMCwtMC4yMzY3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAzNzE5LC0wLjAzNyAwLjAzNzE5LC0wLjEyMDUgMCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOCAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAzNzE4LC0wLjAzNyAwLjAzNzE5LC0wLjEyMDUgMCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAxODU5LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODYsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTE3NSwtMC4wNTYgMCwtMC4wNzkgLTAuMDMzMjYsLTAuMDY3IC0wLjEyNDQ5MSwtMC4wOTEgLTAuMTU3NzQ1LC0wLjE1NzggLTAuMDExNzYsLTAuMDI0IDAuMDE4NTgsLTAuMDYxIDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNTUzNiwwLjAxMiAtMC4wNzg4NywwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDU2MiwtMC4wNjMgLTAuMDc4ODgsLTAuMDc5IC0wLjAyMzUxLC0wLjAxMiAtMC4wNTUzNSwwLjAxMiAtMC4wNzg4NiwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDU2MiwtMC4wNjIgLTAuMDc4ODcsLTAuMDc5IC0wLjA0Mjc4LC0wLjAyMSAtMC4yOTM5MDYsMC4wMjIgLTAuMzE1NDg4LDAgLTAuMDE4NTksLTAuMDE5IDAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNTI1OCwwIC0wLjA3ODg3LDAgLTAuMTU3NzQzLDAgLTAuMzE1NDg3LDAgLTAuNDczMjMxLDAgLTAuMDI2MywwIC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg4LDAgLTAuMDE4NTksLTAuMDE5IDAuMDE4NTksLTAuMDYgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA1MjU4LDAgLTAuMDc4ODcsMCAtMC4xODQwNDEsMCAtMC4zNjgwNzQsMCAtMC41NTIxMDcsMCAtMC4xODQwMzQsMCAtMC4zNjgwNzUsMCAtMC41NTIxMDksMCAtMC4wMjYyOSwwIC0wLjA2MDI4LC0wLjAxOSAtMC4wNzg4NiwwIC0wLjAxODU5LDAuMDE5IDAuMDE4NTksMC4wNjEgMCwwLjA3OSAtMC4wMzk0NCwwLjAzOSAtMC4xOTcxODMsLTAuMDM5IC0wLjIzNjYyMSwwIC0wLjAxODU5LDAuMDE5IDAuMDE4NTksMC4wNjEgMCwwLjA3OSAtMC4wMzcxOSwwLjAzNyAtMC4xMTA3MTcsLTAuMDI0IC0wLjE1Nzc0NCwwIC0wLjAzMzI2LDAuMDE3IC0wLjA0NTYyLDAuMDYyIC0wLjA3ODg2LDAuMDc5IC0wLjAyMzUyLDAuMDEyIC0wLjA3ODg3LDAuMDI2IC0wLjA3ODg3LDAgMCwtMC4wMjYgMC4wNjUzNCwtMC4wMjMgMC4wNzg4NywwIDAuMDcyODQsMC4xMjE0IDAuMTA1MTU4LDAuMjYyOSAtMC4xNTc3NDQsMC4zOTQzIHoiCiAgICAgICBzdHlsZT0iZmlsbDojMmFhZjE4O3N0cm9rZTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNTgzMyIKICAgICAgIGQ9Im0gMTYuNzc5MTkzLDEwMjAuNTYzMiBjIDAuMDI2MjksMCAwLjA1NywwLjAxNSAwLjA3ODg2LDAgMC4wNjE4OCwtMC4wNDEgMC4wOTM5OSwtMC4xMTk1IDAuMTU3NzQ1LC0wLjE1NzcgMC4wNzEyOSwtMC4wNDMgMC4xNTk0MywtMC4wNDggMC4yMzY2MiwtMC4wNzkgMC4yMTAzMjMsLTAuMDg0IDAuMTMyNzc0LC0wLjEwNTQgMC4zOTQzNjQsLTAuMTU3OCAwLjA1MTU2LC0wLjAxIDAuMTA2NzI3LDAuMDEzIDAuMTU3NzQ0LDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY0IDAuMTU3NzQ0LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNzg1OSwwLjAxNyAwLjE1Nzc0MywwIDAuMDM1MjcsLTAuMDEyIDAuMDQ1NjIsLTAuMDYyIDAuMDc4ODcsLTAuMDc5IDAuMDQ3MDMsLTAuMDI0IDAuMTIwNTYzLDAuMDM3IDAuMTU3NzQ1LDAgMC4wMTg1OSwtMC4wMTkgLTAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IDAuMDI2MjksMCAwLjA1NTM2LDAuMDEyIDAuMDc4ODcsMCAwLjA2NjUyLC0wLjAzMyAwLjA4NzIsLTAuMTM0MyAwLjE1Nzc0NCwtMC4xNTc4IDAuMDQ5ODksLTAuMDE3IDAuMTA2NzM1LDAuMDEzIDAuMTU3NzUyLDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY1IDAuMTU3NzQ1LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNjcyNiwwLjAxMyAwLjE1Nzc0MywwIDAuMTE0MDY3LC0wLjAyOCAwLjIwMTQyMiwtMC4xMjkzIDAuMzE1NDg4LC0wLjE1NzcgMC4wNTEwMSwtMC4wMTMgMC4xMDc4NTksMC4wMTcgMC4xNTc3NDUsMCAwLjAzNTI3LC0wLjAxMiAwLjA0NzkzLC0wLjA1OSAwLjA3ODg3LC0wLjA3OSAwLjAzOTcxLC0wLjE3MzcgMC4xNjIyNTcsLTAuMDQyIDAuMjM2NjE5LC0wLjA3OSAwLjAzMzI2LC0wLjAxNyAwLjA0NTYyLC0wLjA2MiAwLjA3ODg3LC0wLjA3OSAwLjAyMzUyLC0wLjAxMiAwLjA1NTM2LDAuMDEyIDAuMDc4ODgsMCAwLjAzMzI2LC0wLjAxNyAwLjA0NTYyLC0wLjA2MyAwLjA3ODg3LC0wLjA3OSAwLjAyMzUyLC0wLjAxMiAwLjA1NTM2LDAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LC0wLjAxNyAwLjA0MzU5LC0wLjA2NyAwLjA3ODg4LC0wLjA3OSAwLjA5OTc2LC0wLjAzMyAwLjIxNTcxOCwwLjAzMyAwLjMxNTQ4OCwwIDAuMDM1MjcsLTAuMDEyIDAuMDQzNTksLTAuMDY3IDAuMDc4ODcsLTAuMDc5IDAuMDE5NjYsLTAuMDEgMC4zODYyMzYsMC4wMSAwLjM5NDM2NCwwIDAuMDE4NTksLTAuMDE4IC0wLjAxODU5LC0wLjA2IDAsLTAuMDc5IDAuMDAzNiwwIDAuMzU3MTc1LDAgMC4zOTQzNTYsMCAwLjE1Nzc0NSwwIDAuMzE1NDk2LDAgMC40NzMyNCwwIDAuMDI2MjksMCAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDQ1MjEsMC4wOSAwLjE2NDU2OSwwLjEwOTggMC4yMzY2MjEsMC4xNTc3IDAuMDcxNzksMC4wNDggMC4xNjY3MDcsMC4yMDE4IDAuMjM2NjEyLDAuMjM2NyAwLjAyMzUyLDAuMDEyIDAuMDUzOTMsLTAuMDEgMC4wNzg4NywwIDAuNTcxMywwLjE5MDQgLTAuMTI0MzQ5LC0wLjAyMiAwLjIzNjYxMiwwLjE1NzggMC4wMjM1MiwwLjAxMiAwLjA2MDI4LC0wLjAxOSAwLjA3ODg4LDAgMC4wMTg1OSwwLjAxOCAtMC4wMTg1OSwwLjA2IDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTE3NSwwLjA1NiAwLDAuMDc5IDAuMDE2NjMsMC4wMzMgMC4wNjIyNSwwLjA0NiAwLjA3ODg3LDAuMDc5IDAuMDExNzYsMC4wMjMgLTAuMDE4NTksMC4wNiAwLDAuMDc5IDAuMDE4NTksMC4wMTkgMC4wNjAyOCwtMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksMC4wMTkgLTAuMDExNzUsMC4wNTYgMCwwLjA3OSAwLjA0NTIyLDAuMDkxIDAuMTY0NTY4LDAuMTA5OCAwLjIzNjYyLDAuMTU3OCAwLjA2MTg3LDAuMDQxIDAuMDk1ODgsMC4xMTY1IDAuMTU3NzQ0LDAuMTU3NyAwLjM0NDQ3OSwwLjIyOTcgLTAuMDI2LC0wLjAzNSAwLjMxNTQ4OCwwLjA3OSAwLjAzNTI4LDAuMDEyIDAuMDQ1NjIsMC4wNjIgMC4wNzg4NywwLjA3OSAwLjAyMzUxLDAuMDEyIDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ1NjIsMC4wNjIgMC4wNzg4OCwwLjA3OSAwLjAyMzUxLDAuMDEyIDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ1NjIsMC4wNjMgMC4wNzg4NywwLjA3OSAwLjA0NzAyLDAuMDIzIDAuMTEwNzA5LC0wLjAyNCAwLjE1Nzc0NCwwIDAuMDMzMjYsMC4wMTcgMC4wNDU2MiwwLjA2MiAwLjA3ODg2LDAuMDc5IDAuMDUwNDEsMC4wMjUgMC4yNTIwMSwtMC4wMjEgMC4zMTU0ODksMCAwLjA1NTc3LDAuMDE5IDAuMTAxOTc5LDAuMDYxIDAuMTU3NzUxLDAuMDc5IDAuMDI0OTQsMC4wMSAwLjA1NTM1LC0wLjAxMiAwLjA3ODg3LDAgMC4wMzMyNiwwLjAxNyAwLjA0MzU5LDAuMDY3IDAuMDc4ODcsMC4wNzkgMC4wMzYwNywwLjAxMiAwLjI4MDM5MSwtMC4wMTggMC4zMTU0ODksMCAwLjAyNjQ5LDAuMDE0IDAuMTMxMjUxLDAuMTQ0NSAwLjE1Nzc0NCwwLjE1NzggMC4wMjM1MSwwLjAxMiAwLjA1NTM2LC0wLjAxMiAwLjA3ODg3LDAgMC4wMzMyNiwwLjAxNyAwLjA0NTYyLDAuMDYyIDAuMDc4ODgsMC4wNzkgMC4wMjM1MSwwLjAxMiAwLjA1NTM2LC0wLjAxMiAwLjA3ODg2LDAgMC4wMzMyNiwwLjAxNyAwLjA0NTYyLDAuMDYzIDAuMDc4ODgsMC4wNzkgMC4wNDcwMiwwLjAyMyAwLjEyMDU2MywtMC4wMzcgMC4xNTc3NDQsMCAwLjAwMzYsMCAwLDAuMzU3MiAwLDAuMzk0NCAwLDAuMDE5IDAuMDAyNSwwLjIzNDEgMCwwLjIzNjYgLTAuMDE4NTksMC4wMTkgLTAuMDU1MzYsLTAuMDEyIC0wLjA3ODg3LDAgLTAuMDc3NjIsMC4wMzkgLTAuMjM3ODc3LDAuMjc2NiAtMC4zMTU0ODgsMC4zMTU1IC0wLjAyMzUxLDAuMDEyIC0wLjA2MDI4LC0wLjAxOSAtMC4wNzg4NywwIC0wLjAxODU5LDAuMDE5IDAuMDExNzUsMC4wNTYgMCwwLjA3OSAtMC4wODcyLDAuMTc0NCAtMC4wNDg5NiwwLjAyNSAtMC4xNTc3NDQsMC4wNzkgLTAuMDMzMjYsMC4wMTcgLTAuMDQ1NjIsMC4wNjIgLTAuMDc4ODgsMC4wNzkgLTAuMDIzNTIsMC4wMTIgLTAuMDUyNTgsMCAtMC4wNzg4NiwwIC0wLjA1MjU4LDAgLTAuMTA2NzM1LC0wLjAxMyAtMC4xNTc3NDUsMCAtMC4xNDI3NiwtMC4wNDggLTAuMTQ2Njg3LDAuMTI3NyAtMC4yMzY2MiwwLjE1NzcgLTAuMDQ5ODksMC4wMTcgLTAuMTA2NzM0LC0wLjAxMyAtMC4xNTc3NDQsMCAtMC4wNTcwMywwLjAxNSAtMC4xMDA3MTUsMC4wNjUgLTAuMTU3NzQzLDAuMDc5IC0wLjA1MTAxLDAuMDEzIC0wLjEwNjczNSwtMC4wMTMgLTAuMTU3NzQ0LDAgLTAuMDU3MDQsMC4wMTUgLTAuMTAwNzE1LDAuMDY0IC0wLjE1Nzc0NSwwLjA3OSAtMC4wNTk5OCwwLjAxNSAtMC4zMjgzMTYsMCAtMC4zOTQzNjQsMCAtMC4xMzE0NTQsMCAtMC4yNjI5MDksMCAtMC4zOTQzNTYsMCAtMC4wMjYzLDAgLTAuMDUyNTgsMCAtMC4wNzg4OCwwIC0wLjAyNjI5LDAgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODgsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYyIC0wLjA3ODg2LC0wLjA3OSAtMC4wNDcwMiwtMC4wMjMgLTAuMTEwNzE3LDAuMDIzIC0wLjE1Nzc0NCwwIC0wLjAyMTEsLTAuMDExIC0wLjEzNjYzOSwtMC4xNDcxIC0wLjE1Nzc0NCwtMC4xNTc3IC0wLjAyMzUyLC0wLjAxMiAtMC4wNTUzNiwwLjAxMiAtMC4wNzg4OCwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNTI1OCwtMC4wNTMgLTAuMDc4ODYsLTAuMDc5IC0wLjA5MDI1LC0wLjA5IC0wLjA5MzM2LC0wLjExIC0wLjIzNjYyLC0wLjE1NzcgLTAuMDI0OTMsLTAuMDEgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMjA5NCwtMC4wMTEgLTAuMjI2MTUsLTAuMjE1NyAtMC4yMzY2MjEsLTAuMjM2NyAtMC4wMTE3NiwtMC4wMjMgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYyIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg4LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OCwtMC4wMTkgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMzcxOCwtMC4wMzcgLTAuMTEwNzEsMC4wMjMgLTAuMTU3NzQ0LDAgLTAuMDMzMjYsLTAuMDE3IC0wLjA0NTYyLC0wLjA2MiAtMC4wNzg4NywtMC4wNzkgLTAuMDQ5NzYsLTAuMDI0IC0wLjM0NDYwNCwwLjAyNCAtMC4zOTQzNjMsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjg1MiwtMC4wMTUgLTAuMzM5NTA2LDAgLTAuMzk0MzY0LDAgLTAuMDI2MjksMCAtMC4wNjAyOCwtMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwwLjAxOSAwLjAyMzUxLDAuMDY3IDAsMC4wNzkgLTAuMTU3NzQ0LDAuMDc5IC0wLjExODMxNCwtMC4wMzkgLTAuMjM2NjIsMCAtMC4wNTU3NywwLjAxOSAtMC4xMDA3MTUsMC4wNjQgLTAuMTU3NzQ0LDAuMDc5IC0wLjA1MTAxLDAuMDEzIC0wLjEwNzg1OSwtMC4wMTcgLTAuMTU3NzQ1LDAgLTAuMDM1MjgsMC4wMTIgLTAuMDQ1NjIsMC4wNjIgLTAuMDc4ODcsMC4wNzkgLTAuMDMxMjcsMC4wMTYgLTAuMjIwNDg5LC0wLjAxNiAtMC4yMzY2MTIsMCAtMC4wMTg1OSwwLjAxOSAwLjAyMzUxLDAuMDY3IDAsMC4wNzkgLTAuMDQ3MDMsMC4wMjMgLTAuMTEwNzE4LC0wLjAyNCAtMC4xNTc3NDQsMCAtMC4wMjM1MiwwLjAxMiAwLjAxODU5LDAuMDYxIDAsMC4wNzkgLTAuMDM3MTksMC4wMzcgLTAuMTEwNzE3LC0wLjAyMyAtMC4xNTc3NDUsMCAtMC4wMzMyNiwwLjAxNyAtMC4wNDU2MiwwLjA2MiAtMC4wNzg4NywwLjA3OSAtMC4wMjQwMSwwLjAxMiAtMC4yMDEwOTQsMCAtMC4yMzY2MTIsMCAtMC4xODQwNDIsMCAtMC4zNjgwNzUsMCAtMC41NTIxMDksMCAtMC4yNjI5MDksMCAtMC41MjU4MTgsMCAtMC43ODg3MiwwIC0wLjAyNjMsMCAtMC4wNTI1OCwwIC0wLjA3ODg4LDAgLTAuMDI2MjksMCAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NiwwIC0wLjAxODU5LC0wLjAxOCAwLjAxODU5LC0wLjA2IDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4OCwwIC0wLjAxODU5LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMzcxOSwtMC4wMzcgLTAuMTEwNzE3LDAuMDIzIC0wLjE1Nzc0NCwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDE2OSwtMC4wNzkgLTAuMDc4ODcsLTAuMDc5IC0wLjAyNjMsMCAwLjAyNjI5LDAuMDc5IDAsMC4wNzkgLTAuMTY0MTMxLDAgLTAuMDMxNzQsLTAuMTEwNiAtMC4wNzg4OCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAxODU4LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMTg1OCwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODgsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg2LDAgLTAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IC0wLjEzMTQ1NSwtMC4xMDUyIC0wLjI2MjkxLC0wLjIxMDMgMCwtMC42MzEgeiIKICAgICAgIHN0eWxlPSJmaWxsOiNjYmZmODc7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg3MTY5IgogICAgICAgZD0ibSAxMC4zMTI2ODcsMTAyMS40OTE3IC0xLjAwMzg4NDUsMS4zMzg1IC0wLjIyMzA4MSwzLjc5MjQgMi43ODg1NTQ1LDEuNzg0NyAwLjU1NzcwNywyLjAwNzggMi4xMTkzMDQsMCAyLjQ1MzkzMSwzLjY4MDkgMjQuNjUwODE4LDAgMi4yMzA4NDEsLTEuNjczMSAyLjM0MjM4NiwwLjExMTUgMy43OTI0MzEsLTIuNzg4NSAwLjY2OTI1MSwtMy4xMjMzIDEuMDAzODg0LC0wLjg5MjMgMC44OTIzMzgsLTEuMjI2OSAtMC4yMjMwODgsLTEuNTYxNiAtMi4wMDc3NiwtMS4wMDM5IC00MC4wNDM2MzIsLTAuNDQ2MiB6IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDMxMjgtODk5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yNDguMjMyMjUsOTUwLjI4MzUpIgogICAgICAgaWQ9Imc2NDAzLTMtMCIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIxMzIzLjI5OTgiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIxMzc2LjYyMTEiCiAgICAgICAgIHNvZGlwb2RpOnJ4PSI1Ny41Nzg2OTMiCiAgICAgICAgIHNvZGlwb2RpOnJ5PSI1Ny41Nzg2OTMiCiAgICAgICAgIGQ9Im0gMTM4MC44Nzg1LDEzNzYuNjIxMSBjIDAsMzEuNzk5OCAtMjUuNzc4OSw1Ny41Nzg3IC01Ny41Nzg3LDU3LjU3ODcgLTMxLjc5OTgsMCAtNTcuNTc4NywtMjUuNzc4OSAtNTcuNTc4NywtNTcuNTc4NyAwLC0zMS43OTk4IDI1Ljc3ODksLTU3LjU3ODcgNTcuNTc4NywtNTcuNTc4NyAzMS43OTk4LDAgNTcuNTc4NywyNS43Nzg5IDU3LjU3ODcsNTcuNTc4NyB6IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzEzLjcyNDgsLTI5OC45ODQxMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnNTc0NS00LTQtOC0zLTciCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzU4LTk4NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02IgogICAgICAgICAgIGQ9Im0gMTA4MC4wNjYyLDExNzUuNTk4NiBjIC04Ljg3NzksMC4xNDYgLTQuNjU5MiwxNy4yMTYzIC0xMy4zMzc5LDE5LjA5MTUgLTguNjc4OCwxLjg3NTIgLTExLjk5MTUsLTE1LjMwMSAtMjAuMTM3NywtMTEuNzY4NyAtOC4xNDYyLDMuNTMyMiAyLjMzMTUsMTcuNjk5MiAtNC45NjksMjIuNzUyOSAtNy4zMDA2LDUuMDUzNiAtMTYuODQwMSwtOS43ODA3IC0yMy4wMTQ1LC0zLjM5OTkgLTYuMTc0Myw2LjM4MDggOC43MzM4LDE1LjU1MTcgMy45MjMsMjMuMDE0NSAtNC44MTA5LDcuNDYyNyAtMTkuNDkwNCwtMi4yNDI4IC0yMi43NTI5Nyw2LjAxNTEgLTMuMjYyNSw4LjI1NzkgMTQuMTQyMTcsMTAuODc4OSAxMi41NTMzNywxOS42MTQ2IC0xLjU4ODgsOC43MzU3IC0xOC43MTQ0Nyw1LjI0NDcgLTE4LjU2ODQ3LDE0LjEyMjUgMC4xNDYsOC44Nzc4IDE3LjIxNjM3LDQuNjU5MSAxOS4wOTE0NywxMy4zMzc5IDEuODc1Miw4LjY3ODggLTE1LjMwMDk3LDExLjk5MTUgLTExLjc2ODcsMjAuMTM3NyAzLjUzMjMsOC4xNDYyIDE3LjY5OTIsLTIuMzMxNiAyMi43NTI5LDQuOTY5IDUuMDUzNyw3LjMwMDUgLTkuNzgwNywxNi44NDAxIC0zLjM5OTksMjMuMDE0NCA2LjM4MDgsNi4xNzQ0IDE1LjU1MTcsLTguNzMzOCAyMy4wMTQ1LC0zLjkyMjkgNy40NjI4LDQuODEwOSAtMi4yNDI4LDE5LjQ5MDQgNi4wMTUxLDIyLjc1MyA4LjI1OCwzLjI2MjUgMTAuODc4OSwtMTQuMTQyMiAxOS42MTQ2LC0xMi41NTM0IDguNzM1OCwxLjU4ODggNS4yNDQ3LDE4LjcxNDUgMTQuMTIyNSwxOC41Njg1IDguODc3OSwtMC4xNDYgNC42NTkyLC0xNy4yMTY0IDEzLjMzNzksLTE5LjA5MTUgOC42Nzg4LC0xLjg3NTIgMTEuOTkxNSwxNS4zMDEgMjAuMTM3NywxMS43Njg3IDguMTQ2MiwtMy41MzIzIC0yLjMzMTUsLTE3LjY5OTMgNC45NjksLTIyLjc1MjkgNy4zMDA2LC01LjA1MzcgMTYuODQwMSw5Ljc4MDcgMjMuMDE0NSwzLjM5OTggNi4xNzQzLC02LjM4MDggLTguNzMzOCwtMTUuNTUxNiAtMy45MjMsLTIzLjAxNDQgNC44MTA5LC03LjQ2MjggMTkuNDkwNCwyLjI0MjggMjIuNzUzLC02LjAxNTEgMy4yNjI1LC04LjI1OCAtMTQuMTQyMiwtMTAuODc4OSAtMTIuNTUzNCwtMTkuNjE0NiAxLjU4ODgsLTguNzM1OCAxOC43MTQ1LC01LjI0NDcgMTguNTY4NSwtMTQuMTIyNSAtMC4xNDYsLTguODc3OSAtMTcuMjE2NCwtNC42NTkyIC0xOS4wOTE1LC0xMy4zMzggLTEuODc1MiwtOC42Nzg3IDE1LjMwMSwtMTEuOTkxNCAxMS43Njg3LC0yMC4xMzc2IC0zLjUzMjMsLTguMTQ2MiAtMTcuNjk5MiwyLjMzMTUgLTIyLjc1MjksLTQuOTY5IC01LjA1MzcsLTcuMzAwNiA5Ljc4MDcsLTE2Ljg0MDEgMy4zOTk5LC0yMy4wMTQ1IC02LjM4MDksLTYuMTc0MyAtMTUuNTUxNyw4LjczMzggLTIzLjAxNDUsMy45MjI5IC03LjQ2MjgsLTQuODEwOCAyLjI0MjgsLTE5LjQ5MDQgLTYuMDE1MSwtMjIuNzUyOSAtOC4yNTgsLTMuMjYyNSAtMTAuODc4OSwxNC4xNDIyIC0xOS42MTQ2LDEyLjU1MzQgLTguNzM1OCwtMS41ODg4IC01LjI0NDcsLTE4LjcxNDUgLTE0LjEyMjUsLTE4LjU2ODUgeiBtIDEuNTY5MSw0MC44NzAyIGMgMjUuNDA4LDAgNDcuMDAzMiwyMS41OTUyIDQ3LjAwMzIsNDcuMDAzMSAwLDI1LjQwOCAtMjEuNTk1Miw0Ny4wMDMxIC00Ny4wMDMyLDQ3LjAwMzEgLTI1LjQwNzksMCAtNDcuMDAzMSwtMjEuNTk1MSAtNDcuMDAzMSwtNDcuMDAzMSAwLC0yNS40MDc5IDIxLjU5NTIsLTQ3LjAwMzEgNDcuMDAzMSwtNDcuMDAzMSB6IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzU2LTQ4NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLXdpZHRoOjQuMDg3MjI2Mzk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yMzcuOTE0NjEsOTUwLjExNjE4KSIKICAgICAgIGlkPSJnNjQwMy0zLTAtNCIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy00IgogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjY5NjY3NzQ5LDAsMCwwLjY5NjY3NzQ5LDI4ODIuOTMxNSwxOTguMjUwMTEpIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2Mi02NzMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS1vcGFjaXR5OjE7ZGlzcGxheTppbmxpbmUiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc2Njc3NzYyIKICAgICAgICAgICBpZD0icGF0aDU2NjUtOS00LTUtMzEtNi04IgogICAgICAgICAgIGQ9Im0gMTA4MC4wNjYyLDExNzUuNTk4NiBjIC04Ljg3NzksMC4xNDYgLTQuNjU5MiwxNy4yMTYzIC0xMy4zMzc5LDE5LjA5MTUgLTguNjc4OCwxLjg3NTIgLTExLjk5MTUsLTE1LjMwMSAtMjAuMTM3NywtMTEuNzY4NyAtOC4xNDYyLDMuNTMyMiAyLjMzMTUsMTcuNjk5MiAtNC45NjksMjIuNzUyOSAtNy4zMDA2LDUuMDUzNiAtMTYuODQwMSwtOS43ODA3IC0yMy4wMTQ1LC0zLjM5OTkgLTYuMTc0Myw2LjM4MDggOC43MzM4LDE1LjU1MTcgMy45MjMsMjMuMDE0NSAtNC44MTA5LDcuNDYyNyAtMTkuNDkwNCwtMi4yNDI4IC0yMi43NTI5Nyw2LjAxNTEgLTMuMjYyNSw4LjI1NzkgMTQuMTQyMTcsMTAuODc4OSAxMi41NTMzNywxOS42MTQ2IC0xLjU4ODgsOC43MzU3IC0xOC43MTQ0Nyw1LjI0NDcgLTE4LjU2ODQ3LDE0LjEyMjUgMC4xNDYsOC44Nzc4IDE3LjIxNjM3LDQuNjU5MSAxOS4wOTE0NywxMy4zMzc5IDEuODc1Miw4LjY3ODggLTE1LjMwMDk3LDExLjk5MTUgLTExLjc2ODcsMjAuMTM3NyAzLjUzMjMsOC4xNDYyIDE3LjY5OTIsLTIuMzMxNiAyMi43NTI5LDQuOTY5IDUuMDUzNyw3LjMwMDUgLTkuNzgwNywxNi44NDAxIC0zLjM5OTksMjMuMDE0NCA2LjM4MDgsNi4xNzQ0IDE1LjU1MTcsLTguNzMzOCAyMy4wMTQ1LC0zLjkyMjkgNy40NjI4LDQuODEwOSAtMi4yNDI4LDE5LjQ5MDQgNi4wMTUxLDIyLjc1MyA4LjI1OCwzLjI2MjUgMTAuODc4OSwtMTQuMTQyMiAxOS42MTQ2LC0xMi41NTM0IDguNzM1OCwxLjU4ODggNS4yNDQ3LDE4LjcxNDUgMTQuMTIyNSwxOC41Njg1IDguODc3OSwtMC4xNDYgNC42NTkyLC0xNy4yMTY0IDEzLjMzNzksLTE5LjA5MTUgOC42Nzg4LC0xLjg3NTIgMTEuOTkxNSwxNS4zMDEgMjAuMTM3NywxMS43Njg3IDguMTQ2MiwtMy41MzIzIC0yLjMzMTUsLTE3LjY5OTMgNC45NjksLTIyLjc1MjkgNy4zMDA2LC01LjA1MzcgMTYuODQwMSw5Ljc4MDcgMjMuMDE0NSwzLjM5OTggNi4xNzQzLC02LjM4MDggLTguNzMzOCwtMTUuNTUxNiAtMy45MjMsLTIzLjAxNDQgNC44MTA5LC03LjQ2MjggMTkuNDkwNCwyLjI0MjggMjIuNzUzLC02LjAxNTEgMy4yNjI1LC04LjI1OCAtMTQuMTQyMiwtMTAuODc4OSAtMTIuNTUzNCwtMTkuNjE0NiAxLjU4ODgsLTguNzM1OCAxOC43MTQ1LC01LjI0NDcgMTguNTY4NSwtMTQuMTIyNSAtMC4xNDYsLTguODc3OSAtMTcuMjE2NCwtNC42NTkyIC0xOS4wOTE1LC0xMy4zMzggLTEuODc1MiwtOC42Nzg3IDE1LjMwMSwtMTEuOTkxNCAxMS43Njg3LC0yMC4xMzc2IC0zLjUzMjMsLTguMTQ2MiAtMTcuNjk5MiwyLjMzMTUgLTIyLjc1MjksLTQuOTY5IC01LjA1MzcsLTcuMzAwNiA5Ljc4MDcsLTE2Ljg0MDEgMy4zOTk5LC0yMy4wMTQ1IC02LjM4MDksLTYuMTc0MyAtMTUuNTUxNyw4LjczMzggLTIzLjAxNDUsMy45MjI5IC03LjQ2MjgsLTQuODEwOCAyLjI0MjgsLTE5LjQ5MDQgLTYuMDE1MSwtMjIuNzUyOSAtOC4yNTgsLTMuMjYyNSAtMTAuODc4OSwxNC4xNDIyIC0xOS42MTQ2LDEyLjU1MzQgLTguNzM1OCwtMS41ODg4IC01LjI0NDcsLTE4LjcxNDUgLTE0LjEyMjUsLTE4LjU2ODUgeiBtIDEuNTY5MSw0MC44NzAyIGMgMjUuNDA4LDAgNDcuMDAzMiwyMS41OTUyIDQ3LjAwMzIsNDcuMDAzMSAwLDI1LjQwOCAtMjEuNTk1Miw0Ny4wMDMxIC00Ny4wMDMyLDQ3LjAwMzEgLTI1LjQwNzksMCAtNDcuMDAzMSwtMjEuNTk1MSAtNDcuMDAzMSwtNDcuMDAzMSAwLC0yNS40MDc5IDIxLjU5NTIsLTQ3LjAwMzEgNDcuMDAzMSwtNDcuMDAzMSB6IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzYwLTc1NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLXdpZHRoOjQuMDg3MjI2Mzk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yMjcuODc1ODEsOTUwLjExNjE4KSIKICAgICAgIGlkPSJnNjQwMy0zLTAtMyIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIxMzIzLjI5OTgiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIxMzc2LjYyMTEiCiAgICAgICAgIHNvZGlwb2RpOnJ4PSI1Ny41Nzg2OTMiCiAgICAgICAgIHNvZGlwb2RpOnJ5PSI1Ny41Nzg2OTMiCiAgICAgICAgIGQ9Im0gMTM4MC44Nzg1LDEzNzYuNjIxMSBjIDAsMzEuNzk5OCAtMjUuNzc4OSw1Ny41Nzg3IC01Ny41Nzg3LDU3LjU3ODcgLTMxLjc5OTgsMCAtNTcuNTc4NywtMjUuNzc4OSAtNTcuNTc4NywtNTcuNTc4NyAwLC0zMS43OTk4IDI1Ljc3ODksLTU3LjU3ODcgNTcuNTc4NywtNTcuNTc4NyAzMS43OTk4LDAgNTcuNTc4NywyNS43Nzg5IDU3LjU3ODcsNTcuNTc4NyB6IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzEzLjcyNDgsLTI5OC45ODQxMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnNTc0NS00LTQtOC0zLTctNiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42OTY2Nzc0OSwwLDAsMC42OTY2Nzc0OSwyODgyLjkzMTUsMTk4LjI1MDExKSIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDczNjYtNjYyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzM0Njc0YjtzdHJva2Utb3BhY2l0eToxO2Rpc3BsYXk6aW5saW5lIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NjY3Nzc2MiCiAgICAgICAgICAgaWQ9InBhdGg1NjY1LTktNC01LTMxLTYtMCIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2NC01MzYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNDc4MDk2NywwLDAsMC4wNDc4MDk2NywtMTI2LjU3MDExLDk3Ni4wMDg4OCkiCiAgICAgICBpZD0iZzY0MDMtMy0wLTMtNiIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQtNiIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy02LTYiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzcwLTczNyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02LTAtMiIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2OC0zNDMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNTEzNzA4MywwLDAsMC4wNTEzNzA4MywtMTc0LjMyMTM1LDk3MC4xNjA0OCkiCiAgICAgICBpZD0iZzY0MDMtMy0wLTMtMSIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQtNSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy02LTgiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3Mzc0LTYzNCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02LTAtOSIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM3Mi03NDcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"mathwar,mathwar,math\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"mathwar.Mathwar\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Mathwar\"\nLABEL oc.displayname=\"Mathwar\"\nLABEL oc.path=\"/usr/games/mathwar\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Mathwar\"\nENV APPBIN \"/usr/games/mathwar\"\nENV APP \"/usr/games/mathwar\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/mathwar/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mathwar/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Mathwar

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Mathwar.d\n
"},{"location":"applications/mathwar/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Mathwar.d -t Mathwar .\n
"},{"location":"applications/mathwar/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Mathwar > Mathwar.json\ndocker image save Mathwar -o Mathwar.tar\nctr -n k8s.io images import Mathwar.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Mathwar.json\n\n
"},{"location":"applications/minecraft/","title":"minecraft","text":""},{"location":"applications/minecraft/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/minecraft/#path","title":"Path","text":"
/usr/bin/minecraft-launcher\n
"},{"location":"applications/minecraft/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/minecraft/#wm_class","title":"WM_CLASS","text":"
minecraft-launcher.Minecraft Launcher\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/minecraft/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/minecraft-launcher.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/minecraft/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\nCOPY composer/init.d/init.minecraft-launcher /composer/init.d\n
"},{"location":"applications/minecraft/#json-dump","title":"JSON dump","text":"

json source file minecraft.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_minecraft.svg\",\n    \"keyword\": \"minecraft\",\n    \"launch\": \"minecraft-launcher.Minecraft Launcher\",\n    \"name\": \"minecraft\",\n    \"path\": \"/usr/bin/minecraft-launcher\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktop\": \"minecraft-launcher.desktop\",\n    \"host_config\": {\n        \"mem_limit\": \"4G\",\n        \"shm_size\": \"2G\",\n        \"cpu_period\": 200000,\n        \"cpu_quota\": 200000,\n        \"ipc_mode\": \"shareable\"\n    },\n    \"desktopfile\": \"/usr/share/applications/minecraft-launcher.desktop\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\",\n        \"COPY composer/init.d/init.minecraft-launcher /composer/init.d\"\n    ]\n}\n
"},{"location":"applications/minecraft/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output minecraft.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/minecraft.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @minecraft.d.3.0.json\n\n
"},{"location":"applications/minecraft/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\nCOPY composer/init.d/init.minecraft-launcher /composer/init.d\nLABEL oc.icon=\"circle_minecraft.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYgMCAwIDEuMzI3NiAtNTEwLjY0IC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEwLjU2MjM3OSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjg4OTcyNDQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZiIgeD0iLS4wNjQ2NjYiIHk9Ii0uMDU2MDAyIiB3aWR0aD0iMS4xMjkzIiBoZWlnaHQ9IjEuMTEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjY2MTQ0MzYzIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMjUuNjgiIHgyPSIyNi40NDgiIHkxPSIzOS4zOTUiIHkyPSIxNy4zNzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM0NWYyOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1OWE0NDYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMTUuNzA3IiB4Mj0iMjUuNjgiIHkxPSIzMi41NjEiIHkyPSIzOS4zOTUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2FkN2M1OSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4MzViNDEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxMTUgMCAwIDEuMDExNSAtMzg5LjMyIC00ODkuOTIpIiB4PSIzODYuODUiIHk9IjQ4Ni4zMSIgd2lkdGg9IjU5LjMxNSIgaGVpZ2h0PSI1OS4zMTUiIHJ5PSIyOS42NTciIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cmVjdCB4PSIxLjk4MjYiIHk9IjEuOTc4NCIgd2lkdGg9IjU5Ljk5NyIgaGVpZ2h0PSI1OS45OTciIHJ5PSIyOS45OTgiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iMS4wMTE1Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwMzUgMCAwIDEuMzE3IC0xLjQ3NTIgLTYuNTUxMSkiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjEiPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuMDIyOSAwIDAgMS4wMTI0IC44NzU5OSA0Ljk3NDEpIiBkPSJtMjUgMTEtMTIgN3YxNGwxMiA3IDEyLTd2LTE0eiIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwMzUgMCAwIDEuMzE3IC0yLjQ3NDcgLTcuODg0MSkiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgPHBhdGggZD0ibTE0LjE3MyAyMy4yIDEyLjI3NSAyMS4yNTcgMTIuMjczLTIxLjI1Ny0xMi4yNzMtNy4wOSIgZmlsbD0idXJsKCNlKSIvPgogIDxwYXRoIGQ9Im0xNC4xNzMgMjMuMnYzLjU0M2wxMi4yNzQgNy4wOSAxZS0zIC0zLjU0N3oiIGZpbGw9IiM1OWE4NDkiLz4KICA8cGF0aCBkPSJtMjYuNDQ4IDMzLjgyNyAxMi4yNzQtNy4wODd2LTMuNTQzbC0xMi4yNzQgNy4wODZ6IiBmaWxsPSIjM2U3MjMxIi8+CiAgPHBhdGggZD0ibTE0LjE3MyAyNi43NHYxMC42M2wxMi4yNzQgNy4wODd2LTEwLjYzeiIgZmlsbD0idXJsKCNhKSIvPgogIDxwYXRoIGQ9Im0yNi40NDggMzMuODI3IDEyLjI3NC03LjA4N3YxMC42M2wtMTIuMjc0IDcuMDg3eiIgZmlsbD0iIzU3M2QyYiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"minecraft,minecraft\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"minecraft-launcher.desktop\"\nLABEL oc.launch=\"minecraft-launcher.Minecraft Launcher\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"minecraft\"\nLABEL oc.displayname=\"minecraft\"\nLABEL oc.path=\"/usr/bin/minecraft-launcher\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"4G\\\",\\\"shm_size\\\":\\\"2G\\\",\\\"cpu_period\\\":200000,\\\"cpu_quota\\\":200000,\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"minecraft\"\nENV APPBIN \"/usr/bin/minecraft-launcher\"\nENV APP \"/usr/bin/minecraft-launcher\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/minecraft/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/minecraft/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application minecraft

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/minecraft.d\n
"},{"location":"applications/minecraft/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f minecraft.d -t minecraft .\n
"},{"location":"applications/minecraft/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect minecraft > minecraft.json\ndocker image save minecraft -o minecraft.tar\nctr -n k8s.io images import minecraft.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @minecraft.json\n\n
"},{"location":"applications/mines/","title":"Mines","text":""},{"location":"applications/mines/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/mines/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/mines/#alpine-packages","title":"Alpine packages","text":"
gnome-mines\n
"},{"location":"applications/mines/#displayname","title":"Displayname","text":"
gnome-mines (alpine)\n
"},{"location":"applications/mines/#path","title":"Path","text":"
/usr/bin/gnome-mines\n
"},{"location":"applications/mines/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/mines/#wm_class","title":"WM_CLASS","text":"
gnome-mines.Gnome-mines\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/mines/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Mines.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/mines/#json-dump","title":"JSON dump","text":"

json source file mines.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"displayname\": \"gnome-mines (alpine)\",\n    \"apkpackage\": \"gnome-mines\",\n    \"icon\": \"circle_gnome-mines.svg\",\n    \"keyword\": \"gnome mines,game mines,mines\",\n    \"launch\": \"gnome-mines.Gnome-mines\",\n    \"name\": \"Mines\",\n    \"path\": \"/usr/bin/gnome-mines\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Mines.desktop\"\n}\n
"},{"location":"applications/mines/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output mines.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mines.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mines.d.3.0.json\n\n
"},{"location":"applications/mines/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-mines\nLABEL oc.icon=\"circle_gnome-mines.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQXBwcy1WaXN1YWwtU3R1ZGlvLUNvZGUiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQ5OS45NSIgeDI9IjQ5OS45NSIgeTE9IjIuMDA3OCIgeTI9IjEwMjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMiAyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSI1MTIuMDEiIGN5PSI1MTIuMDEiIHI9IjQ3MC4xNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc2MjUgMCAwIC45NzYyNSAxMi4xNTIgMTIuMTQxKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9Ii41MjU5MyIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTUuMjk5NzE1Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjEzIiB5Mj0iNTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDYzODI5IiB5PSItLjA1NjYwNCIgd2lkdGg9IjEuMTI3NyIgaGVpZ2h0PSIxLjExMzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODk2MjM0MzIiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNTg4MjUgMCAwIC4wNTg4MjUgMS44ODE4IDEuODgyNSkiPgogIDxwYXRoIGQ9Im05ODQuODggMzE2Ljc1cS05LjI5MjMtMjIuNTI5LTIwLjk2Mi00NC4xMzljLTQuMzc2LTguMTU3OC05LjAyMjItMTYuMjYxLTEzLjkzOC0yNC4yMDMtMjEuMTI0LTM0LjI1Mi00Ni44OTQtNjYuNjE0LTc3LjMxMS05Ny4wMjktOTkuNTY4LTk5LjU2OC0yMTkuODMtMTQ5LjM4LTM2MC42Ny0xNDkuMzgtMTQwLjg1IDAtMjYxLjA1IDQ5LjgxMS0zNjAuNjEgMTQ5LjM4LTk5LjU2OSA5OS41NzItMTQ5LjM4IDIxOS43OC0xNDkuMzggMzYwLjYxczQ5LjgxMSAyNjEuMTEgMTQ5LjM4IDM2MC42N2M5OS41NjggOTkuNTY4IDIxOS43OCAxNDkuMzIgMzYwLjYxIDE0OS4zMiAxNDAuODQgMCAyNjEuMTEtNDkuNzU4IDM2MC42Ny0xNDkuMzIgNTQuODM2LTU0Ljg5IDk0LjU5OC0xMTYuMDQgMTE5LjIzLTE4My40MiAyMC4wNDMtNTQuOTQzIDMwLjA5Mi0xMTMuOTkgMzAuMDkyLTE3Ny4yNSAwLTQ4LjUxNS01Ljg4ODgtOTQuNTk4LTE3LjcyLTEzOC4yNS0xLjM1MDctNC45MTYzLTIuNzU1My05LjgzMjYtNC4yMTM5LTE0LjY5NS00LjQzMDItMTQuMzcxLTkuNTA4NS0yOC40NzEtMTUuMTgxLTQyLjMwMnoiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE4LjM2OCIvPgogIDxwYXRoIGlkPSJwYXRoIiBkPSJtOTg0Ljg4IDMxNi43NXEtOS4yOTIzLTIyLjUyOS0yMC45NjItNDQuMTM5Yy00LjM3Ni04LjE1NzgtOS4wMjIyLTE2LjI2MS0xMy45MzgtMjQuMjAzLTIxLjEyNC0zNC4yNTItNDYuODk0LTY2LjYxNC03Ny4zMTEtOTcuMDI5LTk5LjU2OC05OS41NjgtMjE5LjgzLTE0OS4zOC0zNjAuNjctMTQ5LjM4LTE0MC44NSAwLTI2MS4wNSA0OS44MTEtMzYwLjYxIDE0OS4zOC05OS41NjkgOTkuNTcyLTE0OS4zOCAyMTkuNzgtMTQ5LjM4IDM2MC42MXM0OS44MTEgMjYxLjExIDE0OS4zOCAzNjAuNjdjOTkuNTY4IDk5LjU2OCAyMTkuNzggMTQ5LjMyIDM2MC42MSAxNDkuMzIgMTQwLjg0IDAgMjYxLjExLTQ5Ljc1OCAzNjAuNjctMTQ5LjMyIDU0LjgzNi01NC44OSA5NC41OTgtMTE2LjA0IDExOS4yMy0xODMuNDIgMjAuMDQzLTU0Ljk0MyAzMC4wOTItMTEzLjk5IDMwLjA5Mi0xNzcuMjUgMC00OC41MTUtNS44ODg4LTk0LjU5OC0xNy43Mi0xMzguMjUtMS4zNTA3LTQuOTE2My0yLjc1NTMtOS44MzI2LTQuMjEzOS0xNC42OTUtNC40MzAyLTE0LjM3MS05LjUwODUtMjguNDcxLTE1LjE4MS00Mi4zMDJ6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjE4LjM2OCIvPgogIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjUxMS45OSIgcj0iNDU4Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZW5hYmxlLWJhY2tncm91bmQ9ImFjY3VtdWxhdGUiIGZpbGw9IiM2NjYiIHN0cm9rZS13aWR0aD0iMzguNDI2Ii8+CiAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTExLjk5IiByPSI0NTguOTkiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0iYWNjdW11bGF0ZSIgZmlsbD0idXJsKCNhKSIgc3Ryb2tlLXdpZHRoPSIzOC40MjYiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zMS45MjQgMTNjLTEuMzUwNyAwLTIuMjEyMyAwLjk5MTcyLTIuMjk3NiAyLjMwMnYyLjY3YzAuMTIxMTYgMS4xOTgxIDEuMTQ0MyAyLjE1NCAyLjM3MzggMi4xNTRhMi40MjMyIDIuNDIzMiAwIDAgMCAwLjg4ODUxLTAuMTUyNTcgMi40Mjc3IDIuNDI3NyAwIDAgMCAxLjQ4MDgtMi4wMDE0di0yLjU5ODJhMi40MTQyIDIuNDE0MiAwIDAgMC0yLjQ0NTYtMi4zNzM4em0tNC41OTk2IDUuNTY0NGExNC44NDQgMTQuODQ0IDAgMCAwLTQuMzA3OSAyLjQ1MDEgNC4zOTc3IDQuMzk3NyAwIDAgMSAxLjMzNzMgMS40ODA4YzAuMDEzNDYgMC4wMTc5Ni0wLjAwOTEgMC4wNTgzMyAwIDAuMDc2MjlhNC4yNTg2IDQuMjU4NiAwIDAgMSAwLjM3MjQ2IDAuODkzYzAuMDA5MSAwLjAyMjQ0IDAgMC4wNDkzNyAwIDAuMDcxOGE0LjU0NTggNC41NDU4IDAgMCAxIDAuMDc2MjkgMS45Mjk2Yy0wLjA1ODM0IDAuMjg3Mi0wLjE4ODQ3IDAuNTU2NDQtMC4yOTYxNyAwLjgxNjcxYTQuMjU4NiA0LjI1ODYgMCAwIDEtMy45MzU1IDIuNjcgMy45MjY1IDMuOTI2NSAwIDAgMS0yLjIyNTgtMC42Njg2M2MtMC4wOTQyMyAwLjI2OTI0LTAuMjM3ODMgMC41Mjk1Mi0wLjI5NjE3IDAuODE2NzF2MC4wNzYyOGMtMC4wODk3NCAwLjQzOTc3LTAuMTc5NSAwLjg3OTU0LTAuMjI0MzcgMS4zMzI4djAuMDc2MjhjLTAuMDQ0ODggMC40NTc3Mi0wLjA3MTggMC45NDIzNi0wLjA3MTggMS40MDkxdjAuMTQ4MDhjMCAwLjQ0NDI2IDAuMDMxNDEgMC45MDY0NiAwLjA3MTggMS4zMzczdjAuMTQ4MDljMC4wNDkzNyAwLjQyNjMgMC4xMzQ2MiAwLjg0MzY0IDAuMjI0MzcgMS4yNjEgMC4wODA3NyAwLjQxMjg0IDAuMTc5NSAwLjc5NDI4IDAuMjk2MTcgMS4xODkyYTUuOTIzNCA1LjkyMzQgMCAwIDEgMi41MjE5LTAuNzQ0OTFjMC44NjE1OS0wLjA0NDg4IDEuNjYwMyAwLjIwNjQyIDIuMzAyIDAuNjczMTFhMy45NDQ0IDMuOTQ0NCAwIDAgMSAxLjQwOTEgMS44NDg4IDQuNjMxIDQuNjMxIDAgMCAxIDAuMjk2MTcgMS43MDUyYzAgMS4yMDcxLTAuOTg3MjMgMi43OTEyLTEuNzA1MiAzLjU2NzUgMC4yOTE2OCAwLjIyNDM3IDAuNTc0MzkgMC40NTc3MiAwLjg4ODUxIDAuNjY0MTQgMC4zNzY5NCAwLjI1MTMgMC43MTc5OSAwLjUyOTUyIDEuMTEyOSAwLjc0NDkxIDAuNTY1NDIgMC4zMDUxNCAxLjE3NTcgMC41ODMzNiAxLjc4MTUgMC44MTY3MSAwLjExNjY3IDAuMDQ0ODggMC4yNDY4MSAwLjA1Mzg1IDAuMzcyNDYgMC4wNzE4YTIuNTEzIDIuNTEzIDAgMCAxLTAuMDc2MjktMC41MjA1NGMwLTEuODg0NyAyLjEyNy0zLjQxMDQgNC43NTIyLTMuNDEwNCAyLjYyMDcgMCA0Ljc0NzcgMS41MjU3IDQuNzQ3NyAzLjQxMDQgMCAwLjE3MDUyLTAuMDQ0ODggMC4zNTg5OS0wLjA3NjI4IDAuNTIwNTQgMC43MTc5OS0wLjI0NjgxIDEuNDIyNS0wLjUzODQ5IDIuMDc3Ny0wLjg4ODUxIDAuNTA3MDgtMC4yNjkyNCAwLjk0MjM2LTAuNTY5OSAxLjQxMzUtMC44OTMgMC4xNDM2LTAuMDk4NzIgMC4zMDUxNC0wLjE4ODQ3IDAuNDQ0MjYtMC4yOTYxNyAwLjExMjE4LTAuMDgwNzcgMC4xODg0Ny0wLjIwNjQyIDAuMjk2MTctMC4yOTYxN2E0LjU5MDYgNC41OTA2IDAgMCAxLTAuODE2NzEtMC44MTY3MSAzLjg5NTEgMy44OTUxIDAgMCAxLTAuODE2NzEtMS43ODE1IDUuMDkzMiA1LjA5MzIgMCAwIDEtMC4wNzE4LTAuODg4NTFjMC0wLjU3ODg4IDAuMTMwMTQtMS4xNDQzIDAuMjk2MTctMS42MzM0IDAuMDA0NS0wLjAyMjQ0LTAuMDA5MS0wLjA1Mzg1IDAtMC4wNzYyOWEzLjY3OTcgMy42Nzk3IDAgMCAxIDAuMjk2MTctMC42NjQxNGMwLjEzNDYyLTAuMjI0MzcgMC4yNzgyMi0wLjQwMzg3IDAuNDQ4NzQtMC41OTY4MyAwLjE3NTAxLTAuMjA2NDIgMC4zNzY5NC0wLjM1NDUgMC41OTIzNC0wLjUxNjA1YTMuNjM0OCAzLjYzNDggMCAwIDEgMS4zMzI4LTAuNjczMTEgNC4zNTczIDQuMzU3MyAwIDAgMSAwLjgxNjcxLTAuMTQzNmMwLjY2ODYzLTAuMDQwMzkgMS43OTUgMC4yMjg4NiAyLjY3IDAuNzQwNDIgMC4xMDc3LTAuMzcyNDYgMC4yMjQzNy0wLjcyNjk2IDAuMzAwNjYtMS4xMTI5IDAuMDg1MjYtMC40MTczMyAwLjE3MDUyLTAuODM0NjYgMC4yMjQzNy0xLjI2MSAwLTAuMDQ5MzYtMC4wMDkxLTAuMDk4NzMgMC0wLjE0ODA5YTE0Ljk0MyAxNC45NDMgMCAwIDAgMC0yLjk3MDdjLTAuMDQ5MzctMC40NDg3NC0wLjEzNDYyLTAuODkzLTAuMjI0MzctMS4zMzI4LTAuMDA5MS0wLjAyMjQ0IDAtMC4wNTM4NiAwLTAuMDc2MjktMC4wNjczLTAuMzE0MTItMC4xOTI5Ni0wLjU5NjgzLTAuMzAwNjYtMC44ODg1MWEzLjkyMiAzLjkyMiAwIDAgMS0yLjIyNTggMC42Njg2MiA0LjIzMTYgNC4yMzE2IDAgMCAxLTMuMDQyNS0xLjI2MSA0LjUwOTkgNC41MDk5IDAgMCAxLTAuNTE2MDUtMC42NzMxMSA0LjI0OTYgNC4yNDk2IDAgMCAxLTAuMjI0MzctNC40NTE1IDQuMjQ5NiA0LjI0OTYgMCAwIDEgMC41MjA1NC0wLjgxMjIyIDQuNTMyMyA0LjUzMjMgMCAwIDEgMC43NDA0Mi0wLjY3MzEyIDE0LjE4IDE0LjE4IDAgMCAwLTQuMjI3Mi0yLjQ0NTZjMC4wMzE0MSAwLjE2NjA0IDAuMDcxNzkgMC4zNTAwMiAwLjA3MTc5IDAuNTIwNTQgMCAxLjg4NDctMi4xMjcgMy40MTA0LTQuNzQ3NyAzLjQxMDQtMS42NDI0IDAtMy4wNzg0LTAuNTc0MzktMy45MzU1LTEuNDgwOGEzLjQxMDQgMy40MTA0IDAgMCAxLTAuNDQ0MjctMC41OTIzMiAyLjYyNTEgMi42MjUxIDAgMCAxLTAuMzY3OTctMS4zMzczYzAtMC4xNzA1MiAwLjA0MDM5LTAuMzU4OTkgMC4wNzE4LTAuNTIwNTR6bS0xMC4zMTcgMS42MzM0YTIuNDcyNiAyLjQ3MjYgMCAwIDAtMS40ODA4IDEuMTEyOSAyLjQyMzIgMi40MjMyIDAgMCAwIDAuNzQwNDIgMy4zMzg2bDEuOTI5NiAxLjE4OTIgMC43NDA0MiAwLjQ0NDI1YTIuOTE2OCAyLjkxNjggMCAwIDAgMC45NjQ4IDAuMjI0MzcgMi44NDA1IDIuODQwNSAwIDAgMCAxLjg1NzgtMC43NDQ5MSAyLjMzMzUgMi4zMzM1IDAgMCAwIDAuNzQwNDMtMS43MDUyIDIuNDc3MSAyLjQ3NzEgMCAwIDAtMC44MTY3MS0xLjg1NzhsLTAuODg4NTEtMC41MTYwNi0yLjAwNTktMS4xODkyYTIuMzA2NSAyLjMwNjUgMCAwIDAtMS43ODE1LTAuMjk2MTd6bTI5LjA5MiAwYTIuMzE1NSAyLjMxNTUgMCAwIDAtMC44OTMgMC4yOTYxN2wtMi4wMDE0IDEuMTg5Mi0wLjg5MyAwLjUyMDU0Yy0wLjAyNjkzIDAuMDE3OTUtMC4wNDQ4OCAwLjA0NDg4LTAuMDcxNzkgMC4wNzE4YTIuMTA5MSAyLjEwOTEgMCAwIDAtMC43NDQ5MSAxLjcwNTIgMi4zMzM1IDIuMzMzNSAwIDAgMCAwLjc0NDkxIDEuNzA1MiAyLjgzNjEgMi44MzYxIDAgMCAwIDIuODE4MSAwLjU5MjM0bDAuNzQwNDMtMC40Mzk3NyAxLjkyOTYtMS4xODkyYTIuNDIzMiAyLjQyMzIgMCAwIDAgMC43NDQ5MS0zLjMzODYgMi4zNTU5IDIuMzU1OSAwIDAgMC0yLjM3ODMtMS4xMTI5em0tMTQuMDk5IDcuMDQ5N2E0Ljc0OTkgNC43NDk5IDAgMSAxIDAgOS40OTk5Yy0xLjMxNDggMC0yLjQ4MTUtMC41NTE5NS0zLjMzODYtMS40MTM1LTAuMjE1NC0wLjIxMDkxLTAuNDI2MzEtMC40MTI4NC0wLjU5NjgzLTAuNjY0MTRhNC43ODM2IDQuNzgzNiAwIDAgMS0wLjgxNjcxLTIuNjc0NWMwLTAuMzI3NTggMC4wMTM0Ny0wLjY1NTE2IDAuMDc2MjktMC45NjQ4IDAuNDQ0MjUtMi4xNjI5IDIuMzc4My0zLjc4MjkgNC42NzU5LTMuNzgyOXptMCAyLjM3ODNjLTAuOTg3MjMgMC0xLjc5NSAwLjYyODI0LTIuMTU0IDEuNDgwOGEyLjIzMDMgMi4yMzAzIDAgMCAwLTAuMjI0MzcgMC44ODg1MSAyLjM3MzggMi4zNzM4IDAgMSAwIDIuMzc4My0yLjM3Mzh6bS0xMi4wOTggNy45MzgzYy0wLjU1MTk1IDAuMDU4MzMtMC43MDAwNCAwLjE5NzQ1LTAuOTY0OCAwLjI5NjE3bC0wLjUxNjA1IDAuMjk2MTctMS45Mjk2IDEuMTg0N2EyLjQyMzIgMi40MjMyIDAgMCAwLTAuNzQ0OTEgMy4zNDMxIDIuNDQ1NiAyLjQ0NTYgMCAwIDAgMy4zMzg2IDAuODEyMjJsMS45Mjk2LTEuMTg0NyAwLjY3MzExLTAuNDQ4NzRhMi43NTUzIDIuNzU1MyAwIDAgMCAwLjczNTk0LTEuMTg0NyAxLjQ4NTMgMS40ODUzIDAgMCAwIDAuMDc2MjktMC40NDg3NCAyLjg2MyAyLjg2MyAwIDAgMC0wLjc0MDQyLTEuODUzMyAyLjYwMjcgMi42MDI3IDAgMCAwLTAuODE2NzEtMC42NjQxNCAyLjA2NDIgMi4wNjQyIDAgMCAwLTEuMDQxMS0wLjE0ODA4em0yNC4yNjggMC4xNDgwOGEyLjUzMDkgMi41MzA5IDAgMCAwLTIuNTI2NCAyLjUyMTljMCAwLjY1MDY4IDAuMTgzOTggMS4xMjE5IDAuNTk2ODMgMS41NTcxbDAuNzQwNDMgMC41MjA1NCAxLjkyOTYgMS4xODQ3YTIuNDQ1NiAyLjQ0NTYgMCAwIDAgMy4zMzg2LTAuODEyMjIgMi40MjMyIDIuNDIzMiAwIDAgMC0wLjc0MDQyLTMuMzQzMWwtMS45Mjk2LTEuMTg0N2MtMC4xNzA1Mi0wLjA5ODczLTAuMzMyMDctMC4yMTA5MS0wLjUyMDU0LTAuMjk2MTdhMi43NTUzIDIuNzU1MyAwIDAgMC0wLjg4ODUxLTAuMTQ4MDh6bS0xMi4xNyA2LjE1NjdhMi40NDU2IDIuNDQ1NiAwIDAgMC0wLjg5MyAwLjE0ODA4IDMuMDkxOCAzLjA5MTggMCAwIDAtMC44MTY3MSAwLjUyMDU0IDIuMTk4OCAyLjE5ODggMCAwIDAtMC44MTIyMiAxLjQ4MDh2Mi42MDcyYzAgMS4zMTAzIDEuMDk0OSAyLjM3MzggMi40NDU2IDIuMzczOGEyLjQxNDIgMi40MTQyIDAgMCAwIDIuNDUwMS0yLjM3ODN2LTIuNTkzN2EyLjQwOTcgMi40MDk3IDAgMCAwLTIuMzc4My0yLjE1NHoiIGZpbHRlcj0idXJsKCNlKSIgb3BhY2l0eT0iLjc1IiBzdHJva2Utd2lkdGg9IjMuNzc5NiIvPgogPHBhdGggZD0ibTMxLjkyNCAxM2MtMS4zNTA3IDAtMi4yMTIzIDAuOTkxNzItMi4yOTc2IDIuMzAydjIuNjdjMC4xMjExNiAxLjE5ODEgMS4xNDQzIDIuMTU0IDIuMzczOCAyLjE1NGEyLjQyMzIgMi40MjMyIDAgMCAwIDAuODg4NTEtMC4xNTI1NyAyLjQyNzcgMi40Mjc3IDAgMCAwIDEuNDgwOC0yLjAwMTR2LTIuNTk4MmEyLjQxNDIgMi40MTQyIDAgMCAwLTIuNDQ1Ni0yLjM3Mzh6bS00LjU5OTYgNS41NjQ0YTE0Ljg0NCAxNC44NDQgMCAwIDAtNC4zMDc5IDIuNDUwMSA0LjM5NzcgNC4zOTc3IDAgMCAxIDEuMzM3MyAxLjQ4MDhjMC4wMTM0NiAwLjAxNzk2LTAuMDA5MSAwLjA1ODMzIDAgMC4wNzYyOWE0LjI1ODYgNC4yNTg2IDAgMCAxIDAuMzcyNDYgMC44OTNjMC4wMDkxIDAuMDIyNDQgMCAwLjA0OTM3IDAgMC4wNzE4YTQuNTQ1OCA0LjU0NTggMCAwIDEgMC4wNzYyOSAxLjkyOTZjLTAuMDU4MzQgMC4yODcyLTAuMTg4NDcgMC41NTY0NC0wLjI5NjE3IDAuODE2NzFhNC4yNTg2IDQuMjU4NiAwIDAgMS0zLjkzNTUgMi42NyAzLjkyNjUgMy45MjY1IDAgMCAxLTIuMjI1OC0wLjY2ODYzYy0wLjA5NDIzIDAuMjY5MjQtMC4yMzc4MyAwLjUyOTUyLTAuMjk2MTcgMC44MTY3MXYwLjA3NjI4Yy0wLjA4OTc0IDAuNDM5NzctMC4xNzk1IDAuODc5NTQtMC4yMjQzNyAxLjMzMjh2MC4wNzYyOGMtMC4wNDQ4OCAwLjQ1NzcyLTAuMDcxOCAwLjk0MjM2LTAuMDcxOCAxLjQwOTF2MC4xNDgwOGMwIDAuNDQ0MjYgMC4wMzE0MSAwLjkwNjQ2IDAuMDcxOCAxLjMzNzN2MC4xNDgwOWMwLjA0OTM3IDAuNDI2MyAwLjEzNDYyIDAuODQzNjQgMC4yMjQzNyAxLjI2MSAwLjA4MDc3IDAuNDEyODQgMC4xNzk1IDAuNzk0MjggMC4yOTYxNyAxLjE4OTJhNS45MjM0IDUuOTIzNCAwIDAgMSAyLjUyMTktMC43NDQ5MWMwLjg2MTU5LTAuMDQ0ODggMS42NjAzIDAuMjA2NDIgMi4zMDIgMC42NzMxMWEzLjk0NDQgMy45NDQ0IDAgMCAxIDEuNDA5MSAxLjg0ODggNC42MzEgNC42MzEgMCAwIDEgMC4yOTYxNyAxLjcwNTJjMCAxLjIwNzEtMC45ODcyMyAyLjc5MTItMS43MDUyIDMuNTY3NSAwLjI5MTY4IDAuMjI0MzcgMC41NzQzOSAwLjQ1NzcyIDAuODg4NTEgMC42NjQxNCAwLjM3Njk0IDAuMjUxMyAwLjcxNzk5IDAuNTI5NTIgMS4xMTI5IDAuNzQ0OTEgMC41NjU0MiAwLjMwNTE0IDEuMTc1NyAwLjU4MzM2IDEuNzgxNSAwLjgxNjcxIDAuMTE2NjcgMC4wNDQ4OCAwLjI0NjgxIDAuMDUzODUgMC4zNzI0NiAwLjA3MThhMi41MTMgMi41MTMgMCAwIDEtMC4wNzYyOS0wLjUyMDU0YzAtMS44ODQ3IDIuMTI3LTMuNDEwNCA0Ljc1MjItMy40MTA0IDIuNjIwNyAwIDQuNzQ3NyAxLjUyNTcgNC43NDc3IDMuNDEwNCAwIDAuMTcwNTItMC4wNDQ4OCAwLjM1ODk5LTAuMDc2MjggMC41MjA1NCAwLjcxNzk5LTAuMjQ2ODEgMS40MjI1LTAuNTM4NDkgMi4wNzc3LTAuODg4NTEgMC41MDcwOC0wLjI2OTI0IDAuOTQyMzYtMC41Njk5IDEuNDEzNS0wLjg5MyAwLjE0MzYtMC4wOTg3MiAwLjMwNTE0LTAuMTg4NDcgMC40NDQyNi0wLjI5NjE3IDAuMTEyMTgtMC4wODA3NyAwLjE4ODQ3LTAuMjA2NDIgMC4yOTYxNy0wLjI5NjE3YTQuNTkwNiA0LjU5MDYgMCAwIDEtMC44MTY3MS0wLjgxNjcxIDMuODk1MSAzLjg5NTEgMCAwIDEtMC44MTY3MS0xLjc4MTUgNS4wOTMyIDUuMDkzMiAwIDAgMS0wLjA3MTgtMC44ODg1MWMwLTAuNTc4ODggMC4xMzAxNC0xLjE0NDMgMC4yOTYxNy0xLjYzMzQgMC4wMDQ1LTAuMDIyNDQtMC4wMDkxLTAuMDUzODUgMC0wLjA3NjI5YTMuNjc5NyAzLjY3OTcgMCAwIDEgMC4yOTYxNy0wLjY2NDE0YzAuMTM0NjItMC4yMjQzNyAwLjI3ODIyLTAuNDAzODcgMC40NDg3NC0wLjU5NjgzIDAuMTc1MDEtMC4yMDY0MiAwLjM3Njk0LTAuMzU0NSAwLjU5MjM0LTAuNTE2MDVhMy42MzQ4IDMuNjM0OCAwIDAgMSAxLjMzMjgtMC42NzMxMSA0LjM1NzMgNC4zNTczIDAgMCAxIDAuODE2NzEtMC4xNDM2YzAuNjY4NjMtMC4wNDAzOSAxLjc5NSAwLjIyODg2IDIuNjcgMC43NDA0MiAwLjEwNzctMC4zNzI0NiAwLjIyNDM3LTAuNzI2OTYgMC4zMDA2Ni0xLjExMjkgMC4wODUyNi0wLjQxNzMzIDAuMTcwNTItMC44MzQ2NiAwLjIyNDM3LTEuMjYxIDAtMC4wNDkzNi0wLjAwOTEtMC4wOTg3MyAwLTAuMTQ4MDlhMTQuOTQzIDE0Ljk0MyAwIDAgMCAwLTIuOTcwN2MtMC4wNDkzNy0wLjQ0ODc0LTAuMTM0NjItMC44OTMtMC4yMjQzNy0xLjMzMjgtMC4wMDkxLTAuMDIyNDQgMC0wLjA1Mzg2IDAtMC4wNzYyOS0wLjA2NzMtMC4zMTQxMi0wLjE5Mjk2LTAuNTk2ODMtMC4zMDA2Ni0wLjg4ODUxYTMuOTIyIDMuOTIyIDAgMCAxLTIuMjI1OCAwLjY2ODYyIDQuMjMxNiA0LjIzMTYgMCAwIDEtMy4wNDI1LTEuMjYxIDQuNTA5OSA0LjUwOTkgMCAwIDEtMC41MTYwNS0wLjY3MzExIDQuMjQ5NiA0LjI0OTYgMCAwIDEtMC4yMjQzNy00LjQ1MTUgNC4yNDk2IDQuMjQ5NiAwIDAgMSAwLjUyMDU0LTAuODEyMjIgNC41MzIzIDQuNTMyMyAwIDAgMSAwLjc0MDQyLTAuNjczMTIgMTQuMTggMTQuMTggMCAwIDAtNC4yMjcyLTIuNDQ1NmMwLjAzMTQxIDAuMTY2MDQgMC4wNzE3OSAwLjM1MDAyIDAuMDcxNzkgMC41MjA1NCAwIDEuODg0Ny0yLjEyNyAzLjQxMDQtNC43NDc3IDMuNDEwNC0xLjY0MjQgMC0zLjA3ODQtMC41NzQzOS0zLjkzNTUtMS40ODA4YTMuNDEwNCAzLjQxMDQgMCAwIDEtMC40NDQyNy0wLjU5MjMyIDIuNjI1MSAyLjYyNTEgMCAwIDEtMC4zNjc5Ny0xLjMzNzNjMC0wLjE3MDUyIDAuMDQwMzktMC4zNTg5OSAwLjA3MTgtMC41MjA1NHptLTEwLjMxNyAxLjYzMzRhMi40NzI2IDIuNDcyNiAwIDAgMC0xLjQ4MDggMS4xMTI5IDIuNDIzMiAyLjQyMzIgMCAwIDAgMC43NDA0MiAzLjMzODZsMS45Mjk2IDEuMTg5MiAwLjc0MDQyIDAuNDQ0MjVhMi45MTY4IDIuOTE2OCAwIDAgMCAwLjk2NDggMC4yMjQzNyAyLjg0MDUgMi44NDA1IDAgMCAwIDEuODU3OC0wLjc0NDkxIDIuMzMzNSAyLjMzMzUgMCAwIDAgMC43NDA0My0xLjcwNTIgMi40NzcxIDIuNDc3MSAwIDAgMC0wLjgxNjcxLTEuODU3OGwtMC44ODg1MS0wLjUxNjA2LTIuMDA1OS0xLjE4OTJhMi4zMDY1IDIuMzA2NSAwIDAgMC0xLjc4MTUtMC4yOTYxN3ptMjkuMDkyIDBhMi4zMTU1IDIuMzE1NSAwIDAgMC0wLjg5MyAwLjI5NjE3bC0yLjAwMTQgMS4xODkyLTAuODkzIDAuNTIwNTRjLTAuMDI2OTMgMC4wMTc5NS0wLjA0NDg4IDAuMDQ0ODgtMC4wNzE3OSAwLjA3MThhMi4xMDkxIDIuMTA5MSAwIDAgMC0wLjc0NDkxIDEuNzA1MiAyLjMzMzUgMi4zMzM1IDAgMCAwIDAuNzQ0OTEgMS43MDUyIDIuODM2MSAyLjgzNjEgMCAwIDAgMi44MTgxIDAuNTkyMzRsMC43NDA0My0wLjQzOTc3IDEuOTI5Ni0xLjE4OTJhMi40MjMyIDIuNDIzMiAwIDAgMCAwLjc0NDkxLTMuMzM4NiAyLjM1NTkgMi4zNTU5IDAgMCAwLTIuMzc4My0xLjExMjl6bS0xNC4wOTkgNy4wNDk3YTQuNzQ5OSA0Ljc0OTkgMCAxIDEgMCA5LjQ5OTljLTEuMzE0OCAwLTIuNDgxNS0wLjU1MTk1LTMuMzM4Ni0xLjQxMzUtMC4yMTU0LTAuMjEwOTEtMC40MjYzMS0wLjQxMjg0LTAuNTk2ODMtMC42NjQxNGE0Ljc4MzYgNC43ODM2IDAgMCAxLTAuODE2NzEtMi42NzQ1YzAtMC4zMjc1OCAwLjAxMzQ3LTAuNjU1MTYgMC4wNzYyOS0wLjk2NDggMC40NDQyNS0yLjE2MjkgMi4zNzgzLTMuNzgyOSA0LjY3NTktMy43ODI5em0wIDIuMzc4M2MtMC45ODcyMyAwLTEuNzk1IDAuNjI4MjQtMi4xNTQgMS40ODA4YTIuMjMwMyAyLjIzMDMgMCAwIDAtMC4yMjQzNyAwLjg4ODUxIDIuMzczOCAyLjM3MzggMCAxIDAgMi4zNzgzLTIuMzczOHptLTEyLjA5OCA3LjkzODNjLTAuNTUxOTUgMC4wNTgzMy0wLjcwMDA0IDAuMTk3NDUtMC45NjQ4IDAuMjk2MTdsLTAuNTE2MDUgMC4yOTYxNy0xLjkyOTYgMS4xODQ3YTIuNDIzMiAyLjQyMzIgMCAwIDAtMC43NDQ5MSAzLjM0MzEgMi40NDU2IDIuNDQ1NiAwIDAgMCAzLjMzODYgMC44MTIyMmwxLjkyOTYtMS4xODQ3IDAuNjczMTEtMC40NDg3NGEyLjc1NTMgMi43NTUzIDAgMCAwIDAuNzM1OTQtMS4xODQ3IDEuNDg1MyAxLjQ4NTMgMCAwIDAgMC4wNzYyOS0wLjQ0ODc0IDIuODYzIDIuODYzIDAgMCAwLTAuNzQwNDItMS44NTMzIDIuNjAyNyAyLjYwMjcgMCAwIDAtMC44MTY3MS0wLjY2NDE0IDIuMDY0MiAyLjA2NDIgMCAwIDAtMS4wNDExLTAuMTQ4MDh6bTI0LjI2OCAwLjE0ODA4YTIuNTMwOSAyLjUzMDkgMCAwIDAtMi41MjY0IDIuNTIxOWMwIDAuNjUwNjggMC4xODM5OCAxLjEyMTkgMC41OTY4MyAxLjU1NzFsMC43NDA0MyAwLjUyMDU0IDEuOTI5NiAxLjE4NDdhMi40NDU2IDIuNDQ1NiAwIDAgMCAzLjMzODYtMC44MTIyMiAyLjQyMzIgMi40MjMyIDAgMCAwLTAuNzQwNDItMy4zNDMxbC0xLjkyOTYtMS4xODQ3Yy0wLjE3MDUyLTAuMDk4NzMtMC4zMzIwNy0wLjIxMDkxLTAuNTIwNTQtMC4yOTYxN2EyLjc1NTMgMi43NTUzIDAgMCAwLTAuODg4NTEtMC4xNDgwOHptLTEyLjE3IDYuMTU2N2EyLjQ0NTYgMi40NDU2IDAgMCAwLTAuODkzIDAuMTQ4MDggMy4wOTE4IDMuMDkxOCAwIDAgMC0wLjgxNjcxIDAuNTIwNTQgMi4xOTg4IDIuMTk4OCAwIDAgMC0wLjgxMjIyIDEuNDgwOHYyLjYwNzJjMCAxLjMxMDMgMS4wOTQ5IDIuMzczOCAyLjQ0NTYgMi4zNzM4YTIuNDE0MiAyLjQxNDIgMCAwIDAgMi40NTAxLTIuMzc4M3YtMi41OTM3YTIuNDA5NyAyLjQwOTcgMCAwIDAtMi4zNzgzLTIuMTU0eiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIzLjc3OTYiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"mines,gnome mines,game mines,mines\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Mines.desktop\"\nLABEL oc.launch=\"gnome-mines.Gnome-mines\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Mines\"\nLABEL oc.displayname=\"gnome-mines (alpine)\"\nLABEL oc.path=\"/usr/bin/gnome-mines\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Mines\"\nENV APPBIN \"/usr/bin/gnome-mines\"\nENV APP \"/usr/bin/gnome-mines\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/mines/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mines/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Mines

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Mines.d\n
"},{"location":"applications/mines/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Mines.d -t Mines .\n
"},{"location":"applications/mines/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Mines > Mines.json\ndocker image save Mines -o Mines.tar\nctr -n k8s.io images import Mines.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Mines.json\n\n
"},{"location":"applications/nautilus/","title":"nautilus","text":""},{"location":"applications/nautilus/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/nautilus/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/nautilus/#ubuntu-packages","title":"Ubuntu packages","text":"
dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs\n
"},{"location":"applications/nautilus/#displayname","title":"Displayname","text":"
FileManager\n
"},{"location":"applications/nautilus/#path","title":"Path","text":"
/usr/bin/nautilus\n
"},{"location":"applications/nautilus/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/nautilus/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/nautilus/#wm_class","title":"WM_CLASS","text":"
org.gnome.Nautilus.Org.gnome.Nautilus\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/nautilus/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Nautilus.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/nautilus/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\nCOPY composer/node /composer/node\nRUN cd /composer/node/ocdownload && npm install\nCOPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\nCOPY composer/desktop_download.py /composer/desktop_download.py\nENV NAUTILUS_PYTHON_DEBUG=misc\n
"},{"location":"applications/nautilus/#json-dump","title":"JSON dump","text":"

json source file nautilus.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"preruncommands\": [\n        \"RUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\",\n        \"COPY composer/node /composer/node\",\n        \"RUN cd /composer/node/ocdownload && npm install\",\n        \"COPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\",\n        \"COPY composer/desktop_download.py /composer/desktop_download.py\",\n        \"ENV NAUTILUS_PYTHON_DEBUG=misc\"\n    ],\n    \"debpackage\": \"dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs\",\n    \"icon\": \"circle_filemanager.svg\",\n    \"keyword\": \"file,manager,nautilus\",\n    \"launch\": \"org.gnome.Nautilus.Org.gnome.Nautilus\",\n    \"name\": \"nautilus\",\n    \"displayname\": \"FileManager\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/nautilus\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Nautilus.desktop\",\n    \"usedefaultapplication\": true,\n    \"quick\": true\n}\n
"},{"location":"applications/nautilus/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output nautilus.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/nautilus.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @nautilus.d.3.0.json\n\n
"},{"location":"applications/nautilus/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\nCOPY composer/node /composer/node\nRUN cd /composer/node/ocdownload && npm install\nCOPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\nCOPY composer/desktop_download.py /composer/desktop_download.py\nENV NAUTILUS_PYTHON_DEBUG=misc\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_filemanager.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIGlkPSJDYWxjdWxhdG9yIgogICB3aWR0aD0iNjQiCiAgIGhlaWdodD0iNjQiCiAgIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIKICAgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIgogICB2ZXJzaW9uPSIxLjEiCiAgIHZpZXdCb3g9IjAgMCA2NCA2NCIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZmlsZW1hbmFnZXIuc3ZnIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjUgKDIwNjBlYzFmOWYsIDIwMjAtMDQtMDgpIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGEyNDQ1NSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxNDQwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjYxNSIKICAgICBpZD0ibmFtZWR2aWV3MjQ0NTMiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjMuNjkiCiAgICAgaW5rc2NhcGU6Y3g9Ii0xNC4wNzA0NjEiCiAgICAgaW5rc2NhcGU6Y3k9IjMyIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iQ2FsY3VsYXRvciIgLz4KICA8ZGVmcwogICAgIGlkPSJkZWZzMjQ0MTMiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiMyZjVmZGQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDM5MiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzFhN2ZkNCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI0Mzk0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjUyMCIKICAgICAgIHgyPSI1MjAiCiAgICAgICB5MT0iNCIKICAgICAgIHkyPSIxMDI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNDQwMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiNmZWM1ODkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDM5NyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iI2YzNGYxNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI0Mzk5IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImQiCiAgICAgICB4MT0iNTIwIgogICAgICAgeDI9IjUyMCIKICAgICAgIHkxPSI0IgogICAgICAgeTI9IjEwMjQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNjA4NjI3MywwLDAsMC4wNjA1NDkwMiwwLjc4MzE2OCwwLjkxODY2OTUpIj4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzExMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI0NDAzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjM2IzYjNiIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjQ0MDUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYyIKICAgICAgIHgxPSI1MjAiCiAgICAgICB4Mj0iNTIwIgogICAgICAgeTE9IjQiCiAgICAgICB5Mj0iMTAyNCIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNjk0NTI0NCwwLDAsMC4wNjk0NTI0NCwtMy41MjYyMDYzLC0zLjU5NTY2NSkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHhsaW5rOmhyZWY9IiNhIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYiIKICAgICAgIHgxPSI3NjAiCiAgICAgICB4Mj0iNzYwIgogICAgICAgeTE9IjQiCiAgICAgICB5Mj0iMTAyNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeGxpbms6aHJlZj0iI2EiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDYyNzQ1LDAsMCwwLjA2Mjc0NSwtMC4xMjU0OSwtMC4xMjU0OSkiIC8+CiAgICA8ZmlsdGVyCiAgICAgICBpZD0iZSIKICAgICAgIHg9Ii0uMDM2IgogICAgICAgeT0iLS4wMzYiCiAgICAgICB3aWR0aD0iMS4wNzIiCiAgICAgICBoZWlnaHQ9IjEuMDcyIgogICAgICAgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5IgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXIyNDQxMCIgLz4KICAgIDwvZmlsdGVyPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYy0xIgogICAgICAgeDE9Ii0yNi4yMDEiCiAgICAgICB4Mj0iLTI2LjIwMSIKICAgICAgIHkxPSIxMDcwLjIiCiAgICAgICB5Mj0iMTA4Mi42IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjNzhjM2ZkIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTQzOSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzdiYzZmZiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDU0NDEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYi04IgogICAgICAgeDE9Ii05LjkxMTk5OTciCiAgICAgICB4Mj0iLTkuOTExOTk5NyIKICAgICAgIHkxPSIxMDgxLjQiCiAgICAgICB5Mj0iMTEzOS44IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjMzVhNWZjIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTQ0NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzQ1YzBmZiIKICAgICAgICAgb2Zmc2V0PSIuNSIKICAgICAgICAgaWQ9InN0b3A1NDQ2IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjNGRhY2Y2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNTQ0OCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJhLTciCiAgICAgICB4MT0iLTkuNjE2OTk5NiIKICAgICAgIHgyPSItOS42MTY5OTk2IgogICAgICAgeTE9IjExMzguNCIKICAgICAgIHkyPSIxMTQwLjIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3Atb3BhY2l0eT0iLjA0Njc4NCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDU0NTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A1NDUzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImQtOSIKICAgICAgIHgxPSI4IgogICAgICAgeDI9IjgiCiAgICAgICB5MT0iMiIKICAgICAgIHkyPSIxNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzAzYjZlYyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI2OTI1IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjMTNjMGY3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjY5MjciIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iZC0zIgogICAgICAgeDE9IjEwMS4xOCIKICAgICAgIHgyPSIxMDEuMTgiCiAgICAgICB5MT0iOTIxLjQ4OTk5IgogICAgICAgeTI9IjEwMDAuMiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4yMjMxNjc5NiwwLDAsMC4yMTcyMDYyNCw4LjMwMjQzMTEsLTE3NC4xMTE0NCkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiMwM2I2ZWMiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyOTMwMiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzEzYzBmNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI5MzA0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPGNpcmNsZQogICAgIGlkPSJjaXJjbGUyNDQxNSIKICAgICBzdHlsZT0ib3BhY2l0eTowLjI1O3N0cm9rZS13aWR0aDoxNS45Mzc5OTk3MztwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsO2ZpbHRlcjp1cmwoI2UpIgogICAgIHI9IjQ3OC4xMiIKICAgICBjeT0iNTEyIgogICAgIGN4PSI1MTIiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNjI3NDUsMCwwLDAuMDYyNzQ1LC0wLjEyNTQ5LC0wLjEyNTQ5KSIgLz4KICA8ZwogICAgIHN0eWxlPSJzdHJva2Utd2lkdGg6MTUuOTM3OTk5NzMiCiAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjA2MjQ5OTY3KSIKICAgICBpZD0ic2hhZG93IiAvPgogIDxjaXJjbGUKICAgICBjeD0iMzEuOTk5OTUiCiAgICAgY3k9IjMxLjk5OTk1IgogICAgIHI9IjI5Ljk5OTY0IgogICAgIHN0eWxlPSJmaWxsOnVybCgjYyk7c3Ryb2tlLXdpZHRoOjEuMDAwMDI5ODtwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIgogICAgIGlkPSJjaXJjbGUyNDQxOCIgLz4KICA8ZWxsaXBzZQogICAgIGN4PSIzMS45MTQ0NTUiCiAgICAgY3k9IjMxLjk1MDA0MyIKICAgICBzdHlsZT0iZmlsbDp1cmwoI2QpO3N0cm9rZS13aWR0aDowLjk2NzUyNzAzO3BhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiCiAgICAgaWQ9ImNpcmNsZTI0NDIwIgogICAgIHJ4PSIyNi4yODg0NDEiCiAgICAgcnk9IjI2LjE1MjkzOSIgLz4KICA8ZwogICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMTg0NDA1MjUsMCwwLDAuMTg0NDE0MTgsMTMuNDQ3NDEzLDEzLjA3MzQ3NSkiCiAgICAgaWQ9Imc1NDY2Ij4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2MtMSkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4yMTM5LDAsMCwyLjIxMzksMTA5LjUsLTIzNDQuOSkiCiAgICAgICBkPSJtIC00NC43NjIsMTA3MC4yIGggMjIuMTMxIGMgMy4yODcsMCA0LjY1Miw3LjA3MSA3LjcyOCw3LjA3MSBoIDUxLjUyMiBhIDMuMjc2LDMuMjc2IDAgMCAxIDMuMjgzLDMuMjgzIHYgNTAuNTA4IGMgMCwxLjgxOSAtMS40NjQsLTIuMDIgLTMuMjgzLC0yLjAyIGggLTgxLjM4IGEgMy4yNzYsMy4yNzYgMCAwIDEgLTMuMjgzLC0zLjI4MyB2IC01Mi4yNzUgYSAzLjI3NiwzLjI3NiAwIDAgMSAzLjI4MywtMy4yODMgeiIKICAgICAgIGlkPSJwYXRoNTQ1OCIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2ItOCkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4yMTM5LDAsMCwyLjIxMzksMTA5LjUsLTIzNDQuOSkiCiAgICAgICBkPSJtIC00NC43NjIsMTA4MS4zIGggODEuMzggYSAzLjI3NiwzLjI3NiAwIDAgMSAzLjI4MywzLjI4MyB2IDUyLjI3NSBhIDMuMjc2LDMuMjc2IDAgMCAxIC0zLjI4MywzLjI4MyBoIC04MS4zOCBhIDMuMjc2LDMuMjc2IDAgMCAxIC0zLjI4MywtMy4yODMgdiAtNTIuMjc1IGEgMy4yNzYsMy4yNzYgMCAwIDEgMy4yODMsLTMuMjgzIHoiCiAgICAgICBpZD0icGF0aDU0NjAiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gMy4xNiwxNjUuODQgdiAyLjIxNCBIIDE5Ny44NCBWIDE2NS44NCBIIDMuMTUgWiBtIDAsNC44NyB2IDEuMTc2IGMgMCwwLjM1OSAwLjAxOSwwLjY5NCAwLjA2OCwxLjAzOCBoIDE5NC41NSBjIDAuMDUsLTAuMzQ0IDAuMDY5LC0wLjY3OSAwLjA2OSwtMS4wMzggViAxNzAuNzEgSCAzLjE1NyBaIgogICAgICAgc3R5bGU9InRleHQtaW5kZW50OjA7dGV4dC10cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjAuMDc5OTk5OTgiCiAgICAgICBpZD0icGF0aDU0NjIiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMjEzOSwwLDAsMi4yMTM5LDEwOS41LC0yMzQ0LjkpIgogICAgICAgZD0ibSAtNDcuNzUsMTEzOC4yIGEgMy4yOCwzLjI4IDAgMCAwIDMsMS45MzggaCA4MS4zNzUgYyAxLjM0LDAgMi40ODgsLTAuNzkzIDMsLTEuOTM4IHoiCiAgICAgICBzdHlsZT0idGV4dC1pbmRlbnQ6MDt0ZXh0LXRyYW5zZm9ybTpub25lO29wYWNpdHk6MC4yNTtmaWxsOnVybCgjYS03KSIKICAgICAgIGlkPSJwYXRoNTQ2NCIgLz4KICA8L2c+CiAgPHBhdGgKICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgIGQ9Im0gMjUuNjQ1NjcsMjYuMDI1NzM2IGEgMC42MDI0NTU0OCwwLjU4NjM1NzU4IDAgMCAwIC0wLjYwMjM4OCwwLjU4NjI5MSB2IDE1LjkwMzMzOSBhIDAuNjAyNDU1NDgsMC41ODYzNTc1OCAwIDAgMCAwLjYwMjM4OCwwLjU4NjI2OSBoIDEyLjEyMzI5NyBhIDAuNjAyNDU1NDgsMC41ODYzNTc1OCAwIDAgMCAwLjYwMjM4OCwtMC41ODYyNjkgViAzMi4yNDYxNTIgbCAtNi4zOTA5MTYsLTYuMjIwMTA1IHogbSAwLjYwMjM4OCwxLjE3MjYwNCBoIDQuMzg4NTI3IGMgMC42ODkzNTQsMC4wNTc5OCAxLjE0NTk1MiwwLjM0NjYwMiAxLjE0NTk1MiwxLjgxMzg2NSB2IDIuODU4MjM1IGggMy4wMzA3MDkgYyAwLjczNzcxLDAgMi4wNjk4ODMsLTAuMDI2NjQgMi4zNTMxNzUsMC43Njk0OTYgdiA5LjI4OTA5NSBIIDI2LjI0Nzk4NiBaIgogICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO3RleHQtaW5kZW50OjA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC1kZWNvcmF0aW9uLWxpbmU6bm9uZTt0ZXh0LWRlY29yYXRpb24tc3R5bGU6c29saWQ7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOiMwMDAwMDA7dGV4dC10cmFuc2Zvcm06bm9uZTt3aGl0ZS1zcGFjZTpub3JtYWw7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO3NvbGlkLWNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2QtMyk7c3Ryb2tlLXdpZHRoOjIuMjU3NDA1MDQ7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG8iCiAgICAgaWQ9InBhdGgyOTMxOSIgLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"nautilus,file,manager,nautilus\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Nautilus.desktop\"\nLABEL oc.launch=\"org.gnome.Nautilus.Org.gnome.Nautilus\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"nautilus\"\nLABEL oc.displayname=\"FileManager\"\nLABEL oc.path=\"/usr/bin/nautilus\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"nautilus\"\nENV APPBIN \"/usr/bin/nautilus\"\nENV APP \"/usr/bin/nautilus\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/nautilus/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/nautilus/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application nautilus

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/nautilus.d\n
"},{"location":"applications/nautilus/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f nautilus.d -t nautilus .\n
"},{"location":"applications/nautilus/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect nautilus > nautilus.json\ndocker image save nautilus -o nautilus.tar\nctr -n k8s.io images import nautilus.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @nautilus.json\n\n
"},{"location":"applications/netbeans/","title":"Netbeans","text":""},{"location":"applications/netbeans/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk

"},{"location":"applications/netbeans/#use-ubuntu-package","title":"use ubuntu package","text":"

netbeans

"},{"location":"applications/netbeans/#display-name","title":"Display name","text":"

\"Netbeans\"

"},{"location":"applications/netbeans/#path","title":"path","text":"

\"/usr/bin/netbeans\"

"},{"location":"applications/notepad-wine/","title":"notepad-wine","text":""},{"location":"applications/notepad-wine/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.wine

"},{"location":"applications/notepad-wine/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/notepad-wine/#alpine-packages","title":"Alpine packages","text":"
wine\n
"},{"location":"applications/notepad-wine/#displayname","title":"Displayname","text":"
Notepad Wine (alpine)\n
"},{"location":"applications/notepad-wine/#path","title":"Path","text":"
/usr/bin/notepad\n
"},{"location":"applications/notepad-wine/#mimetype","title":"Mimetype","text":"
application/text;\n
"},{"location":"applications/notepad-wine/#file-extensions","title":"File extensions","text":"

\"txt;log;\"

"},{"location":"applications/notepad-wine/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/notepad-wine/#wm_class","title":"WM_CLASS","text":"
notepad.exe.notepad.exe\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/notepad-wine/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
"},{"location":"applications/notepad-wine/#json-dump","title":"JSON dump","text":"

json source file notepad-wine.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n    ],\n    \"apkpackage\": \"wine\",\n    \"icon\": \"notepad.svg\",\n    \"keyword\": \"wine,notepad,text\",\n    \"launch\": \"notepad.exe.notepad.exe\",\n    \"name\": \"notepad-wine\",\n    \"displayname\": \"Notepad Wine (alpine)\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\": \"txt;log;\",\n    \"path\": \"/usr/bin/notepad\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/notepad-wine/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output notepad-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepad-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepad-wine.d.3.0.json\n\n
"},{"location":"applications/notepad-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"notepad.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMjU2IgogICBoZWlnaHQ9IjI1NiIKICAgaWQ9InN2ZzQ3NDIiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40NyByMjI1ODMiCiAgIHNvZGlwb2RpOmRvY25hbWU9Im5vdGVwYWQuc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDc0NCI+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9Ijc0NC4wOTQ0OCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzcyLjA0NzI0IDogMzUwLjc4NzM5IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTQ3NTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTQ4MjAiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTM1MiIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1Mzc0IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTUzOTkiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTQzMCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NDUyIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjIiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTU2Mi0zIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjItOCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTYyLTM4IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjItNSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTYyLTAiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxwYXR0ZXJuCiAgICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgd2lkdGg9IjExNC44OTQ2OCIKICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgcGF0dGVyblRyYW5zZm9ybT0idHJhbnNsYXRlKDI4LjAzMzg4Niw5MTQuMzUzODYpIgogICAgICAgaWQ9InBhdHRlcm41NjgwIj4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NjQ3IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjguMDMzODg2LC05MTQuMzUzODYpIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDEyNy4xNDI4NiwxMjMuODU3MTQgYyA4LjI1MDc4LDAuMDIzNiAxMy42NDMwNCwzLjQ0MTc0IDE0LjI4NTcxLDEyLjUgbCAtMC4zNTcxNCw4MS43ODU3MiBjIC0wLjY2MzI4LDEyLjA5OCAtNy4xNzQ4OSwxMS45Njc2NSAtMTIuODU3MTQsMTMuNTcxNDMgbCAtNTEuOTY0Mjg5LDAuMTc4NTcgQyA2Ni40MDYyMTYsMjMwLjg1NzI1IDYxLjUwMTAyOCwyMjcuMDA5NjkgNTkuODIxNDI4LDIxNy4yNSBsIDAuODkyODU4LC03OS44MjE0MyBjIDAuNDAwODQxLC01Ljk4MTU2IDIuMjQyOTA2LC0xMC43ODM5NCA3Ljg1NzE0MywtMTIuNSBsIDU4LjU3MTQzMSwtMS4wNzE0MyB6IgogICAgICAgICAgIGlkPSJwYXRoNDgyNiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiCiAgICAgICAgICAgaWQ9InBhdGg0ODMwIgogICAgICAgICAgIGQ9Im0gMTI5LjkyMDc4LDEyNC4xMDk2OCAtMTcuMzg2MTYsODAuMTQzNTggYyAtMi45MzYxMiwxMS41OTI5MyAtOS40NDc3MywxMC40NTI0MiAtMTUuNjM1MDU5LDExLjA0NjA1IGwgLTM3LjAyOTk0MSwtMC4yMDc1NCAwLjg0NDY2NiwtNzcuNjYzMiBjIDAuNDAwODQxLC01Ljk4MTU2IDIuMjQyOTA2LC0xMC43ODM5NCA3Ljg1NzE0MywtMTIuNSBsIDYxLjM0OTM1MSwtMC44MTg4OSB6IgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjYxODAyNTg7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjkuNzAwNTI2LDEwMTUuOTk2NyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjkuMzIxNzE5LDEwMDYuMDIxNCA2MC4zNTY2MTEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDItMiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTYiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Ik0gNjkuMTMyMzE2LDk4NS44ODE1IDEyOS40ODg5Myw5ODUuNjI5IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTEiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDItMCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2Ny45NjQzMjYsOTY1LjM5NDMzIDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTYiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTYtMSIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2Ny43NzQ5MjMsOTQ1LjI1NDQxIDYwLjM1NjYxNywtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTEtNSIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6IzVmZDVkNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMzcuMTQyODU4LDk5MC41NzY0NyBjIC0xMC44NDI4MTUsLTIuOTU5MzUgLTcuNjkxMTg2LC04Ljg5NzQxIC01LjA2MTI3NiwtMTQuOTgyMDYgTCA1Ni42MTI0LDkyNy45NTM5MiBjIDEuNTM1NTgyLC00LjI0MzI3IDcuNDI3MjYyLC03LjI0OTE1IDExLjI0NDc0MywtNi42NjMxNiBsIDYwLjM1NzE0NywtMC4zNTcxNSBjIDMuNzA5MjcsMC44NjA0OSA4Ljc4Nzc2LDAuODA4MTYgNC4yODU3MSw3LjE0Mjg2IGwgLTI3LjQ1NjY3LDUzLjY5Mzk4IGMgLTEuMDI0MjMsNS44MDg2OSAtNy42NDMyNjMsOC43NjE1MSAtMTEuNDk3MjgyLDguOTEwNjIgbCAtNTYuNDAzMTksLTAuMTA0NiB6IgogICAgICAgICAgIGlkPSJwYXRoNDgyOCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY1LjUzNTk3OSw5MzcuODQ1NTcgNDUuNzEzNzYxLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTkiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTktNCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9Imc1NTUwIj4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1NDY4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1NDY2IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMC40Njg5MDEsMC40NjMxNjA3NSkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMyNjI3MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIKICAgICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2Ni05IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMS4yMDQ4NTEsMC40NTk0NDM3NCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTkiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMyNjI3MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIKICAgICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2Ni04IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zMi4xMTAzOTksMC43MTE5ODE4OCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMDkiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjYtNiIKICAgICAgICAgICAgIGQ9Im0gMTIyLjMyMTQzLDEyOC41ODkyOSBjIC03LjAzNjgsLTcuMzIxNDggMy4yNjY3NywtMTMuNzQ3MzQgNC4yODU3MSwtNi4yNSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM4MzgzODI7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KICAgICAgICA8L2c+CiAgICAgICAgPGcKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDIuNjgwNDY4LDAuOTIxMTkxMzMpIgogICAgICAgICAgIGlkPSJnNTU1MC01NiI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4wNDUxMTI4LDAsMCwxLjQ3MzY4NDIsLTEyNy4zMTgxNSw3MzUuNDIyNCkiCiAgICAgICAgICAgICBkPSJtIDEyMi45ODYwNywxMjguNzgzOTIgYyAwLDAuNjYyNSAtMC4zOTU3MywxLjE5OTU2IC0wLjg4Mzg4LDEuMTk5NTYgLTAuNDg4MTYsMCAtMC44ODM4OSwtMC41MzcwNiAtMC44ODM4OSwtMS4xOTk1NiAwLC0wLjY2MjUgMC4zOTU3MywtMS4xOTk1NiAwLjg4Mzg5LC0xLjE5OTU2IDAuNDg4MTUsMCAwLjg4Mzg4LDAuNTM3MDYgMC44ODM4OCwxLjE5OTU2IHoiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeT0iMS4xOTk1NTYxIgogICAgICAgICAgICAgc29kaXBvZGk6cng9IjAuODgzODgzNDgiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeT0iMTI4Ljc4MzkyIgogICAgICAgICAgICAgc29kaXBvZGk6Y3g9IjEyMi4xMDIxOSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2OC0xIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1NDY2LTEiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTk4Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1NDY4LTQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjYtODEiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICA8L3BhdHRlcm4+CiAgICA8cGF0dGVybgogICAgICAgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHdpZHRoPSIxMjQuMjQ4NzYiCiAgICAgICBoZWlnaHQ9IjEyNC4yNDg3NiIKICAgICAgIHBhdHRlcm5UcmFuc2Zvcm09InRyYW5zbGF0ZSgyMi4yMjMzNTYsOTA5LjkzMDY2KSIKICAgICAgIGlkPSJwYXR0ZXJuNTg0NCI+CiAgICAgIDxyZWN0CiAgICAgICAgIHk9IjEuMTM2ODY4NGUtMTMiCiAgICAgICAgIHg9IjAiCiAgICAgICAgIGhlaWdodD0iMTI0LjI0ODc2IgogICAgICAgICB3aWR0aD0iMTI0LjI0ODc2IgogICAgICAgICBpZD0icmVjdDU4NDIiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGlkPSJyZWN0NTcxNCIKICAgICAgICAgeT0iNC40MjMyMTc4IgogICAgICAgICB4PSI1LjgxMDUyOTciCiAgICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgICB3aWR0aD0iMTE0Ljg5NDY4IgogICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTpub25lIiAvPgogICAgICA8ZwogICAgICAgICBpZD0iZzU3NzgiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMi4yMjMzNTYsLTkwOS45MzA2NikiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMTI3LjE0Mjg2LDEyMy44NTcxNCBjIDguMjUwNzgsMC4wMjM2IDEzLjY0MzA0LDMuNDQxNzQgMTQuMjg1NzEsMTIuNSBsIC0wLjM1NzE0LDgxLjc4NTcyIGMgLTAuNjYzMjgsMTIuMDk4IC03LjE3NDg5LDExLjk2NzY1IC0xMi44NTcxNCwxMy41NzE0MyBsIC01MS45NjQyODksMC4xNzg1NyBDIDY2LjQwNjIxNiwyMzAuODU3MjUgNjEuNTAxMDI4LDIyNy4wMDk2OSA1OS44MjE0MjgsMjE3LjI1IGwgMC44OTI4NTgsLTc5LjgyMTQzIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNTguNTcxNDMxLC0xLjA3MTQzIHoiCiAgICAgICAgICAgaWQ9InBhdGg1NzgwIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIKICAgICAgICAgICBpZD0icGF0aDU3ODIiCiAgICAgICAgICAgZD0ibSAxMjkuOTIwNzgsMTI0LjEwOTY4IC0xNy4zODYxNiw4MC4xNDM1OCBjIC0yLjkzNjEyLDExLjU5MjkzIC05LjQ0NzczLDEwLjQ1MjQyIC0xNS42MzUwNTksMTEuMDQ2MDUgbCAtMzcuMDI5OTQxLC0wLjIwNzU0IDAuODQ0NjY2LC03Ny42NjMyIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNjEuMzQ5MzUxLC0wLjgxODg5IHoiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNjE4MDI1ODtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS43MDA1MjYsMTAxNS45OTY3IDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTc4NCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS4zMjE3MTksMTAwNi4wMjE0IDYwLjM1NjYxMSwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTc4NiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzg4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJNIDY5LjEzMjMxNiw5ODUuODgxNSAxMjkuNDg4OTMsOTg1LjYyOSIKICAgICAgICAgICBpZD0icGF0aDU3OTAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU3OTIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjcuOTY0MzI2LDk2NS4zOTQzMyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU3OTQiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzk2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY3Ljc3NDkyMyw5NDUuMjU0NDEgNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzk4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDojNWZkNWQ0O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSAzNy4xNDI4NTgsOTkwLjU3NjQ3IGMgLTEwLjg0MjgxNSwtMi45NTkzNSAtNy42OTExODYsLTguODk3NDEgLTUuMDYxMjc2LC0xNC45ODIwNiBMIDU2LjYxMjQsOTI3Ljk1MzkyIGMgMS41MzU1ODIsLTQuMjQzMjcgNy40MjcyNjIsLTcuMjQ5MTUgMTEuMjQ0NzQzLC02LjY2MzE2IGwgNjAuMzU3MTQ3LC0wLjM1NzE1IGMgMy43MDkyNywwLjg2MDQ5IDguNzg3NzYsMC44MDgxNiA0LjI4NTcxLDcuMTQyODYgbCAtMjcuNDU2NjcsNTMuNjkzOTggYyAtMS4wMjQyMyw1LjgwODY5IC03LjY0MzI2Myw4Ljc2MTUxIC0xMS40OTcyODIsOC45MTA2MiBsIC01Ni40MDMxOSwtMC4xMDQ2IHoiCiAgICAgICAgICAgaWQ9InBhdGg1ODAwIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzE3MTcxODtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjUuNTM1OTc5LDkzNy44NDU1NyA0NS43MTM3NjEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU4MDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1ODA0IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzU4MDYiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MDgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTAiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwLjQ2ODkwMSwwLjQ2MzE2MDc1KSIKICAgICAgICAgICBpZD0iZzU4MTIiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTYiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjIwNDg1MSwwLjQ1OTQ0Mzc0KSIKICAgICAgICAgICBpZD0iZzU4MTgiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjIiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMyLjExMDM5OSwwLjcxMTk4MTg4KSIKICAgICAgICAgICBpZD0iZzU4MjQiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjgiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyLjY4MDQ2OCwwLjkyMTE5MTMzKSIKICAgICAgICAgICBpZD0iZzU4MzAiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MzIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MzQiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1ODM2Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1ODM4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1ODQwIgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgPC9wYXR0ZXJuPgogICAgPHBhdHRlcm4KICAgICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB3aWR0aD0iMTI0LjI0ODc2IgogICAgICAgaGVpZ2h0PSIxMjQuMjQ4NzYiCiAgICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMi4xMDU2OTEyLDAsMCwyLjEwNTY5MTIsLTkuMDkxMzcyOSw3OTMuNzYzMTEpIgogICAgICAgaWQ9InBhdHRlcm41OTUwIj4KICAgICAgPHJlY3QKICAgICAgICAgaWQ9InJlY3Q1ODgwIgogICAgICAgICB5PSIxLjEzNjg2ODRlLTEzIgogICAgICAgICB4PSIwIgogICAgICAgICBoZWlnaHQ9IjEyNC4yNDg3NiIKICAgICAgICAgd2lkdGg9IjEyNC4yNDg3NiIKICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6bm9uZSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgeT0iMS4xMzY4Njg0ZS0xMyIKICAgICAgICAgeD0iMCIKICAgICAgICAgaGVpZ2h0PSIxMjQuMjQ4NzYiCiAgICAgICAgIHdpZHRoPSIxMjQuMjQ4NzYiCiAgICAgICAgIGlkPSJyZWN0NTg4MiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGlkPSJyZWN0NTg4NCIKICAgICAgICAgeT0iNC40MjMyMTc4IgogICAgICAgICB4PSI1LjgxMDUyOTciCiAgICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgICB3aWR0aD0iMTE0Ljg5NDY4IgogICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTpub25lIiAvPgogICAgICA8ZwogICAgICAgICBpZD0iZzU4ODYiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMi4yMjMzNTYsLTkwOS45MzA2NikiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMTI3LjE0Mjg2LDEyMy44NTcxNCBjIDguMjUwNzgsMC4wMjM2IDEzLjY0MzA0LDMuNDQxNzQgMTQuMjg1NzEsMTIuNSBsIC0wLjM1NzE0LDgxLjc4NTcyIGMgLTAuNjYzMjgsMTIuMDk4IC03LjE3NDg5LDExLjk2NzY1IC0xMi44NTcxNCwxMy41NzE0MyBsIC01MS45NjQyODksMC4xNzg1NyBDIDY2LjQwNjIxNiwyMzAuODU3MjUgNjEuNTAxMDI4LDIyNy4wMDk2OSA1OS44MjE0MjgsMjE3LjI1IGwgMC44OTI4NTgsLTc5LjgyMTQzIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNTguNTcxNDMxLC0xLjA3MTQzIHoiCiAgICAgICAgICAgaWQ9InBhdGg1ODg4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIKICAgICAgICAgICBpZD0icGF0aDU4OTAiCiAgICAgICAgICAgZD0ibSAxMjkuOTIwNzgsMTI0LjEwOTY4IC0xNy4zODYxNiw4MC4xNDM1OCBjIC0yLjkzNjEyLDExLjU5MjkzIC05LjQ0NzczLDEwLjQ1MjQyIC0xNS42MzUwNTksMTEuMDQ2MDUgbCAtMzcuMDI5OTQxLC0wLjIwNzU0IDAuODQ0NjY2LC03Ny42NjMyIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNjEuMzQ5MzUxLC0wLjgxODg5IHoiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNjE4MDI1ODtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS43MDA1MjYsMTAxNS45OTY3IDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTg5MiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS4zMjE3MTksMTAwNi4wMjE0IDYwLjM1NjYxMSwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTg5NCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1ODk2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJNIDY5LjEzMjMxNiw5ODUuODgxNSAxMjkuNDg4OTMsOTg1LjYyOSIKICAgICAgICAgICBpZD0icGF0aDU4OTgiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MDAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjcuOTY0MzI2LDk2NS4zOTQzMyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTA0IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY3Ljc3NDkyMyw5NDUuMjU0NDEgNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTA2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDojNWZkNWQ0O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSAzNy4xNDI4NTgsOTkwLjU3NjQ3IGMgLTEwLjg0MjgxNSwtMi45NTkzNSAtNy42OTExODYsLTguODk3NDEgLTUuMDYxMjc2LC0xNC45ODIwNiBMIDU2LjYxMjQsOTI3Ljk1MzkyIGMgMS41MzU1ODIsLTQuMjQzMjcgNy40MjcyNjIsLTcuMjQ5MTUgMTEuMjQ0NzQzLC02LjY2MzE2IGwgNjAuMzU3MTQ3LC0wLjM1NzE1IGMgMy43MDkyNywwLjg2MDQ5IDguNzg3NzYsMC44MDgxNiA0LjI4NTcxLDcuMTQyODYgbCAtMjcuNDU2NjcsNTMuNjkzOTggYyAtMS4wMjQyMyw1LjgwODY5IC03LjY0MzI2Myw4Ljc2MTUxIC0xMS40OTcyODIsOC45MTA2MiBsIC01Ni40MDMxOSwtMC4xMDQ2IHoiCiAgICAgICAgICAgaWQ9InBhdGg1OTA4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzE3MTcxODtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjUuNTM1OTc5LDkzNy44NDU1NyA0NS43MTM3NjEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MTAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTEyIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzU5MTQiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MTgiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwLjQ2ODkwMSwwLjQ2MzE2MDc1KSIKICAgICAgICAgICBpZD0iZzU5MjAiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjQiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjIwNDg1MSwwLjQ1OTQ0Mzc0KSIKICAgICAgICAgICBpZD0iZzU5MjYiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzAiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMyLjExMDM5OSwwLjcxMTk4MTg4KSIKICAgICAgICAgICBpZD0iZzU5MzIiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzYiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyLjY4MDQ2OCwwLjkyMTE5MTMzKSIKICAgICAgICAgICBpZD0iZzU5MzgiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5NDAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5NDIiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1OTQ0Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1OTQ2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1OTQ4IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgPC9wYXR0ZXJuPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMC45ODk5NDk0OSIKICAgICBpbmtzY2FwZTpjeD0iMTA0Ljk4MzQ4IgogICAgIGlua3NjYXBlOmN5PSIxMjkuNDQ4MzgiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI4NTEiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNjU3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIzMTIiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NzQ3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC03OTYuMzYyMTgpIj4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3BhdHRlcm41OTUwKTtzdHJva2U6bm9uZSIKICAgICAgIHdpZHRoPSIyNjEuNjI5NTIiCiAgICAgICBoZWlnaHQ9IjI2MS42Mjk1MiIKICAgICAgIHg9Ii05LjA5MTM3MjUiCiAgICAgICB5PSI3OTMuNzYzMTIiCiAgICAgICBpZD0icmVjdDU5ODciIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"notepad-wine,wine,notepad,text\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"notepad.exe.notepad.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"notepad-wine\"\nLABEL oc.displayname=\"Notepad Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/notepad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/text;\"\nLABEL oc.fileextensions=\"txt;log;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"notepad-wine\"\nENV APPBIN \"/usr/bin/notepad\"\nENV APP \"/usr/bin/notepad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/notepad-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/notepad-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application notepad-wine

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepad-wine.d\n
"},{"location":"applications/notepad-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f notepad-wine.d -t notepad-wine .\n
"},{"location":"applications/notepad-wine/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect notepad-wine > notepad-wine.json\ndocker image save notepad-wine -o notepad-wine.tar\nctr -n k8s.io images import notepad-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepad-wine.json\n\n
"},{"location":"applications/notepadqq/","title":"notepadqq","text":""},{"location":"applications/notepadqq/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/notepadqq/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/notepadqq/#ubuntu-packages","title":"Ubuntu packages","text":"
notepadqq\n
"},{"location":"applications/notepadqq/#path","title":"Path","text":"
/usr/bin/notepadqq\n
"},{"location":"applications/notepadqq/#mimetype","title":"Mimetype","text":"
text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\n
"},{"location":"applications/notepadqq/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/notepadqq/#wm_class","title":"WM_CLASS","text":"
notepadqq-bin.Notepadqq\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/notepadqq/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/notepadqq.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/notepadqq/#json-dump","title":"JSON dump","text":"

json source file notepadqq.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,development\",\n    \"debpackage\": \"notepadqq\",\n    \"icon\": \"notepadqq.svg\",\n    \"keyword\": \"notepad,plus,editor\",\n    \"launch\": \"notepadqq-bin.Notepadqq\",\n    \"name\": \"notepadqq\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    },\n    \"path\": \"/usr/bin/notepadqq\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/notepadqq.desktop\"\n}\n
"},{"location":"applications/notepadqq/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output notepadqq.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepadqq.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepadqq.d.3.0.json\n\n
"},{"location":"applications/notepadqq/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends notepadqq && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"notepadqq.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzIiCiAgIHZpZXdCb3g9IjAgMCAxOTIgMTkxLjk5OTk5IgogICBoZWlnaHQ9IjE5MiIKICAgd2lkdGg9IjE5MiI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0Mjk2Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A0Mjk4IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2NDY0NjQ7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNDMwMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNjQ2NDY0O3N0b3Atb3BhY2l0eTowIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9Ik9tYnJhXzEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDI4NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDQyODYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00LjAwMDAwNTYsLTIuOTY4NzUpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTAzNi41NzkzIgogICAgICAgeDI9Ijk4LjM2MzQ4IgogICAgICAgeTE9Ijk5OS4zMjk0MSIKICAgICAgIHgxPSI1OS4xMjUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MjgwIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDI5NiIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDcuNjIyMTgyNmUtOCwxLjMzODA2MzQsLTEuNzExOTA1NCw5Ljc1MTc0NjhlLTgsLTI1Ny4xMjQxNSw4MjkuMjczNDQpIgogICAgICAgcj0iNjUuMDAwMDA4IgogICAgICAgZnk9Ii0xNjYuMTk2MTciCiAgICAgICBmeD0iMjguNzI2MDEzIgogICAgICAgY3k9Ii0xNjYuMTk2MTciCiAgICAgICBjeD0iMjguNzI2MDEzIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDE5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNPbWJyYV8xIiAvPgogICAgPGZpbHRlcgogICAgICAgeD0iLTAuMDUwMDAwMDAwMDAwMDAwMDAzIgogICAgICAgd2lkdGg9IjEuMTAwMDAwMDAwMDAwMDAwMSIKICAgICAgIHk9Ii0wLjAyOTk5OTk5OTk5OTk5OTk5OSIKICAgICAgIGhlaWdodD0iMS4wNjAwMDAwMDAwMDAwMDAxIgogICAgICAgaWQ9ImZpbHRlcjQ2NTMiCiAgICAgICBzdHlsZT0iY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOnNSR0I7Ij4KICAgICAgPGZlRmxvb2QKICAgICAgICAgaWQ9ImZlRmxvb2Q0NjU1IgogICAgICAgICByZXN1bHQ9ImZsb29kIgogICAgICAgICBmbG9vZC1jb2xvcj0icmdiKDAsMCwwKSIKICAgICAgICAgZmxvb2Qtb3BhY2l0eT0iMC40NTAwMDAwMDAwMDAwMDAwMSIgLz4KICAgICAgPGZlQ29tcG9zaXRlCiAgICAgICAgIGlkPSJmZUNvbXBvc2l0ZTQ2NTciCiAgICAgICAgIHJlc3VsdD0iY29tcG9zaXRlMSIKICAgICAgICAgb3BlcmF0b3I9ImluIgogICAgICAgICBpbjI9IlNvdXJjZUdyYXBoaWMiCiAgICAgICAgIGluPSJmbG9vZCIgLz4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGR5PSIzIgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0NjU5IgogICAgICAgICByZXN1bHQ9ImJsdXIiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMSAxLjUiCiAgICAgICAgIGluPSJjb21wb3NpdGUxIiAvPgogICAgICA8ZmVPZmZzZXQKICAgICAgICAgaWQ9ImZlT2Zmc2V0NDY2MSIKICAgICAgICAgcmVzdWx0PSJvZmZzZXQiCiAgICAgICAgIGR5PSIzIgogICAgICAgICBkeD0iMCIgLz4KICAgICAgPGZlQ29tcG9zaXRlCiAgICAgICAgIGlkPSJmZUNvbXBvc2l0ZTQ2NjMiCiAgICAgICAgIHJlc3VsdD0iY29tcG9zaXRlMiIKICAgICAgICAgb3BlcmF0b3I9Im92ZXIiCiAgICAgICAgIGluMj0ib2Zmc2V0IgogICAgICAgICBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC04NjAuMzYyMikiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtNC00IgogICAgICAgZD0ibSAxMzYsODY3LjM2MDIzIHYgMC4wMDQgaCAtNjQuNjU4MTgxIC0zMy4zMTA1NSAtNS4zNzEwOSBjIC0yLjU3MjcsMCAtNC42NDQ1NCwyLjA2NjE5IC00LjY0NDU0LDQuNjMyODIgdiAzNi41OTc2NSBjIDAsMC4wMzI3IDAuMDA1OCwwLjA2NDIgMC4wMDk4LDAuMDk1NyBsIC0wLjAwMiwxNC42NzE4NyBoIC0wLjAyMzQ0IHYgOSAxIDEwIDM1IDEgMSA2Ljg1OTM4IDEuMTQwNjIgMSBoIDAuMDA5OCB2IDAuMDAyIGwgLTAuMDAzOSwxOS43NDYwMyBoIC0wLjAwNTkgdiAwIDMxLjY4NzUgYyAwLDIuNTI4OSAyLjA0OTAxLDQuNTY0NCA0LjU5Mzc1LDQuNTY0NCBoIDUuNDUzMTMgMzMuMzMyMDMgNzIuNTY2MzgxIGMgMS4zODgwOSwwIDIuNzQzNTMsLTAuMTQ3NCA0LjA1MDc4LC0wLjQyNTcgMC4zMjY5NiwtMC4wNyAwLjY1MTc5LC0wLjE0NjUgMC45NzI2NiwtMC4yMzI1IDAuNjQxMTMsLTAuMTcxNyAxLjI3MDQzLC0wLjM3NjkgMS44ODQ3NywtMC42MTEzIDAuMzA3NDQsLTAuMTE3MyAwLjYxMTk5LC0wLjI0MjYgMC45MTIxLC0wLjM3NSA0LjIwMTUxLC0xLjg1MyA3LjY2NDI1LC01LjE1NzggOS44MjAzMiwtOS4zMjAzIDAuNjE2MDIsLTEuMTg5MyAxLjEyNjE1LC0yLjQ0ODIgMS41MTU2MiwtMy43NjM3IDAuNTg0MjEsLTEuOTczMiAwLjg5ODQ0LC02LjI1MTkgMC44OTg0NCwtNi4yNTE5IHYgLTEuMTQ2NSAtMTQuMTI3IC0yMC43NDc5OCAtOCAtMSAtNDYgLTEgLTcuODYxMzMgLTEuMTM4NjcgLTMzLjg3MzA1IGMgMCwtMC4yMjQzNyAtMC4wMDksLTAuNDQ3MjcgLTAuMDE1NiwtMC42Njk5MiB2IC0wLjAwMiAtMC4zOTI1OCBjIDAsLTIuMTg3NiAtMC4zMTQyMywtNC4yOTY1NiAtMC44OTg0NCwtNi4yNzczNCAtMC4zODk0NywtMS4zMjA1MiAtMC44OTk2MSwtMi41ODM1MSAtMS41MTU2MywtMy43NzczNSAtMi4zMTAzNiwtNC40Nzc0NCAtNi4xMjAwNCwtNy45NjU5OCAtMTAuNzMyNDIsLTkuNzMyNDIgLTAuMzA3NDUsLTAuMTE3NzggLTAuNjE3MjgsLTAuMjI3ODIgLTAuOTMxNjQsLTAuMzMwMDggLTAuNjI5MzIsLTAuMjA0NyAtMS4yNzEyMiwtMC4zNzc2OSAtMS45MjU3OCwtMC41MTc1OCAtMC4zMjY5NiwtMC4wNjk5IC0wLjY1NTY0LC0wLjEzMjQ2IC0wLjk4ODI4LC0wLjE4NTU0IC0wLjk3NTMxLC0wLjE1NTY0IC0xLjk3NTA2LC0wLjIzNDYzIC0yLjk5MjE5LC0wLjIzODI4IHYgLTAuMDA2IGggLTggeiIKICAgICAgIHN0eWxlPSJmaWxsOiM2NDY0NjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyNDY1MykiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtNCIKICAgICAgIGQ9Im0gMjguMDAwMDI0LDEwMDkuMTExNiB2IDMxLjY4ODEgYyAwLDIuNTI4OSAyLjA0ODE1LDQuNTY0NSA0LjU5Mjg5LDQuNTY0NSBoIDUuNDUzNyAzMy4zMzEyMSA3Mi41NjgwOTYgYyAxMS4xMSwwIDIwLjA1NDE0LC0yMC45Nzk5IDIwLjA1NDE0LC0yMC45Nzk5IHYgLTE1LjI3MjcgeiIKICAgICAgIHN0eWxlPSJmaWxsOiM2NDY0NjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtMy0zIgogICAgICAgZD0ibSAzMi42NTkyNTksODY3LjM2NDE4IGMgLTIuNTcyNywwIC00LjY0MzY0LDIuMDY2MDggLTQuNjQzNjQsNC42MzI3MSB2IDM2LjU5ODIxIGMgMCwwLjA1IDAuMDA5LDAuMDk3IDAuMDEzNywwLjE0NiBIIDE2My45ODQwOCB2IC0yMC4zMTY1NSBjIDAsLTExLjY2NzIgLTguOTQ0MTcsLTIxLjA2MDM3IC0yMC4wNTQxOCwtMjEuMDYwMzcgaCAtNzIuNTg5MTcxIC0zMy4zMDk3NCAtNS4zNzE3MiB6IgogICAgICAgc3R5bGU9ImZpbGw6IzkxOTE5MTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icmVjdDQxMzYtNDAiCiAgICAgICBkPSJtIDMyLjY3NDg3NCw4NjguMzY2NzkgYyAtMi41NzI2OSwwIC00LjY0MzY1LDIuMDcyMTMgLTQuNjQzNjUsNC42NDYzIGwgLTAuMDMxMiwxNjYuNzUxODEgYyAwLDIuNTQ2MSAyLjA0ODE2LDQuNTk1NSA0LjU5MjksNC41OTU1IGggNS40NTM3IDMzLjMzMTIxIDcyLjU2ODA4NiBjIDExLjExLDAgMjAuMDU0MTQsLTkuNDIwOCAyMC4wNTQxNCwtMjEuMTIyMyBWIDg4OS40ODkwMSBjIDAsLTExLjcwMTQ2IC04Ljk0NDE0LC0yMS4xMjIyMiAtMjAuMDU0MTQsLTIxLjEyMjIyIGggLTcyLjU4OTU1NiAtMzMuMzA5NzQgLTUuMzcxNzIgeiIKICAgICAgIHN0eWxlPSJmaWxsOiM3NTc1NzU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5MTkuNTAyNTYiCiAgICAgICB4PSIyNy45OTk5OTgiCiAgICAgICBoZWlnaHQ9IjYzLjg1OTYzOCIKICAgICAgIHdpZHRoPSIxMzUuOTk5OTgiCiAgICAgICBpZD0icmVjdDQxNjctMS0zIgogICAgICAgc3R5bGU9ImZpbGw6IzcwYmY3MztmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIG1hc2s9Im5vbmUiCiAgICAgICBjbGlwLXBhdGg9Im5vbmUiCiAgICAgICBpZD0icmVjdDQxMzYtNDAtOSIKICAgICAgIGQ9Im0gMjguMDA3NzgzLDk5My4zNjE1NyA1MS41ODc4MTMsNTAuOTk3NTMgaCA2NC4zMzgwNTQgYyA0LjE0ODgyLDAgNy45OTU3MywtMS4zMTQ3IDExLjE4NzUsLTMuNTcwMyBsIDUuNzA3MDMsLTYuMTcxOSBjIDEuOTkxOTksLTMuMjgyNyAzLjE2MDE1LC03LjE3OTggMy4xNjAxNSwtMTEuMzgwOCBsIDhlLTUsLTI5Ljg3NDUzIGggLTAuMDA4IC0xMzUuOTcyODE3IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDI4MCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5NDcuMzYyMTgiCiAgICAgICB4PSIyNy45OTk5OTgiCiAgICAgICBoZWlnaHQ9IjQ2IgogICAgICAgd2lkdGg9IjEzNS45OTk5OCIKICAgICAgIGlkPSJyZWN0NDE2Ny0xLTEiCiAgICAgICBzdHlsZT0iZmlsbDojNDQ5NjRiO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5MjAuMzYyMTgiCiAgICAgICB4PSIyOC4wMDAwMDYiCiAgICAgICBoZWlnaHQ9IjcxLjk5OTk5MiIKICAgICAgIHdpZHRoPSIxMzUuOTk5OTgiCiAgICAgICBpZD0icmVjdDQxNjctMSIKICAgICAgIHN0eWxlPSJmaWxsOiM0Y2FmNTA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxyZWN0CiAgICAgICB5PSI4NjcuMzYxODIiCiAgICAgICB4PSIxMzYiCiAgICAgICBoZWlnaHQ9IjE3OC4wMDA3MyIKICAgICAgIHdpZHRoPSI4IgogICAgICAgaWQ9InJlY3Q0MzA3LTUiCiAgICAgICBzdHlsZT0iZmlsbDojNDI0MjQyO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPC9nPgogIDxnCiAgICAgc3R5bGU9ImRpc3BsYXk6bm9uZSIKICAgICBpZD0ibGF5ZXIyIj4KICAgIDx0ZXh0CiAgICAgICBpZD0idGV4dDQzMDMtMCIKICAgICAgIHk9Ijk2OC40NDgxMiIKICAgICAgIHg9IjQ3LjcyNDYwOSIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2xpbmUtaGVpZ2h0OjAlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtODYwLjM2MjIpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjQ1cHg7bGluZS1oZWlnaHQ6MS4yNTtmb250LWZhbWlseTpWZXJkYW5hOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246VmVyZGFuYTtsZXR0ZXItc3BhY2luZzowcHg7ZmlsbDojZTBlMGUwO2ZpbGwtb3BhY2l0eToxIgogICAgICAgICB5PSI5NjguNDQ4MTIiCiAgICAgICAgIHg9IjQ3LjcyNDYwOSIKICAgICAgICAgaWQ9InRzcGFuNDMwNS04Ij5ucXE8L3RzcGFuPjwvdGV4dD4KICA8L2c+CiAgPGcKICAgICBpZD0iZzUzMTYiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj4KICAgIDxnCiAgICAgICBpZD0idGV4dDUzMTQiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6NDBweDtsaW5lLWhlaWdodDoxMjUlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC04NjAuMzYyMikiCiAgICAgICBhcmlhLWxhYmVsPSJucXEiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDUzMTgiCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0NXB4O2ZvbnQtZmFtaWx5OlZlcmRhbmE7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpWZXJkYW5hO2xldHRlci1zcGFjaW5nOjBweDtmaWxsOiNlMGUwZTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNzIuMzEyMDEyLDk2OC40NDgxMiBoIC00LjEzMDg2IHYgLTEzLjk3NDYxIHEgMCwtMS42OTE4OSAtMC4xOTc3NTQsLTMuMTY0MDYgLTAuMTk3NzUzLC0xLjQ5NDE0IC0wLjcyNTA5NywtMi4zMjkxIC0wLjU0OTMxNywtMC45MjI4NSAtMS41ODIwMzEsLTEuMzYyMzEgLTEuMDMyNzE1LC0wLjQ2MTQyIC0yLjY4MDY2NSwtMC40NjE0MiAtMS42OTE4OTQsMCAtMy41Mzc1OTcsMC44MzQ5NiAtMS44NDU3MDMsMC44MzQ5NiAtMy41Mzc1OTgsMi4xMzEzNCB2IDE4LjMyNTIgaCAtNC4xMzA4NTkgdiAtMjQuNTQzNDYgaCA0LjEzMDg1OSB2IDIuNzI0NjEgcSAxLjkzMzU5NCwtMS42MDQgMy45OTkwMjQsLTIuNTA0ODggMi4wNjU0MjksLTAuOTAwODggNC4yNDA3MjIsLTAuOTAwODggMy45NzcwNTEsMCA2LjA2NDQ1MywyLjM5NTAyIDIuMDg3NDAzLDIuMzk1MDIgMi4wODc0MDMsNi44OTk0MSB6IiAvPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDUzMjAiCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0NXB4O2ZvbnQtZmFtaWx5OlZlcmRhbmE7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpWZXJkYW5hO2xldHRlci1zcGFjaW5nOjBweDtmaWxsOiNlMGUwZTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gMTAwLjE3MzM0LDk3Ny41MDA4NSBoIC00LjEzMDg2IHYgLTExLjgyMTI4IHEgLTEuOTExNjIxLDEuNjQ3OTQgLTMuODAxMjY5LDIuNDYwOTMgLTEuODg5NjQ5LDAuNzkxMDIgLTQuMDg2OTE0LDAuNzkxMDIgLTQuMzcyNTU5LDAgLTYuOTg3MzA1LC0zLjM2MTgyIC0yLjU5Mjc3MywtMy4zODM3OSAtMi41OTI3NzMsLTkuMzE2NCAwLC0zLjE2NDA3IDAuOTAwODc5LC01LjU4MTA2IDAuOTIyODUxLC0yLjQzODk2IDIuNDE2OTkyLC00LjA4NjkxIDEuNDUwMTk1LC0xLjYwNDAxIDMuNDA1NzYyLC0yLjQ4MjkxIDEuOTU1NTY2LC0wLjg3ODkxIDQuMTMwODU5LC0wLjg3ODkxIDEuOTc3NTM5LDAgMy40OTM2NTIsMC40Mzk0NSAxLjUzODA4NiwwLjQzOTQ2IDMuMTIwMTE3LDEuMjk2MzkgbCAwLjI2MzY3MiwtMS4wNTQ2OSBoIDMuODY3MTg4IHogbSAtNC4xMzA4NiwtMTUuMjkyOTYgdiAtMTMuODg2NzIgcSAtMS43MTM4NjcsLTAuNzY5MDUgLTMuMDMyMjI2LC0xLjA3NjY2IC0xLjMxODM1OSwtMC4zMDc2MiAtMi44NTY0NDUsLTAuMzA3NjIgLTMuNTgxNTQzLDAgLTUuNDQ5MjE5LDIuNDM4OTYgLTEuODY3Njc2LDIuNDE3IC0xLjg2NzY3Niw2LjY3OTY5IDAsNC4zMDY2NCAxLjQ5NDE0MSw2LjYzNTc0IDEuNTE2MTEzLDIuMzA3MTMgNC43NDYwOTMsMi4zMDcxMyAxLjgwMTc1OCwwIDMuNjAzNTE2LC0wLjc2OTA0IDEuODAxNzU4LC0wLjc5MTAyIDMuMzYxODE2LC0yLjAyMTQ4IHoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoNTMyMiIKICAgICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjQ1cHg7Zm9udC1mYW1pbHk6VmVyZGFuYTstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlZlcmRhbmE7bGV0dGVyLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MSIKICAgICAgICAgZD0ibSAxMjguMjEwNDUsOTc3LjUwMDg1IGggLTQuMTMwODYgdiAtMTEuODIxMjggcSAtMS45MTE2MiwxLjY0Nzk0IC0zLjgwMTI3LDIuNDYwOTMgLTEuODg5NjUsMC43OTEwMiAtNC4wODY5MSwwLjc5MTAyIC00LjM3MjU2LDAgLTYuOTg3MzEsLTMuMzYxODIgLTIuNTkyNzcsLTMuMzgzNzkgLTIuNTkyNzcsLTkuMzE2NCAwLC0zLjE2NDA3IDAuOTAwODgsLTUuNTgxMDYgMC45MjI4NSwtMi40Mzg5NiAyLjQxNjk5LC00LjA4NjkxIDEuNDUwMTksLTEuNjA0MDEgMy40MDU3NiwtMi40ODI5MSAxLjk1NTU3LC0wLjg3ODkxIDQuMTMwODYsLTAuODc4OTEgMS45Nzc1NCwwIDMuNDkzNjUsMC40Mzk0NSAxLjUzODA5LDAuNDM5NDYgMy4xMjAxMiwxLjI5NjM5IGwgMC4yNjM2NywtMS4wNTQ2OSBoIDMuODY3MTkgeiBtIC00LjEzMDg2LC0xNS4yOTI5NiB2IC0xMy44ODY3MiBxIC0xLjcxMzg3LC0wLjc2OTA1IC0zLjAzMjIzLC0xLjA3NjY2IC0xLjMxODM2LC0wLjMwNzYyIC0yLjg1NjQ0LC0wLjMwNzYyIC0zLjU4MTU0LDAgLTUuNDQ5MjIsMi40Mzg5NiAtMS44Njc2OCwyLjQxNyAtMS44Njc2OCw2LjY3OTY5IDAsNC4zMDY2NCAxLjQ5NDE0LDYuNjM1NzQgMS41MTYxMiwyLjMwNzEzIDQuNzQ2MSwyLjMwNzEzIDEuODAxNzYsMCAzLjYwMzUxLC0wLjc2OTA0IDEuODAxNzYsLTAuNzkxMDIgMy4zNjE4MiwtMi4wMjE0OCB6IiAvPgogICAgPC9nPgogIDwvZz4KICA8ZwogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICBpZD0ibGF5ZXIzIj4KICAgIDxwYXRoCiAgICAgICBpZD0icmVjdDQxMzYtNC00LTUiCiAgICAgICBkPSJtIDMyLjY2MDAyNCw4NjcuMzY0MTcgYyAtMi41NzI3LDAgLTQuNjQ0NTMsMi4wNjYxOCAtNC42NDQ1Myw0LjYzMjgxIHYgMzYuNTk3NjYgYyAwLDAuMDMyNyAwLjAwNiwwLjA2NDIgMC4wMSwwLjA5NTcgbCAtMC4wMDQsMjMuNjcxODggaCAtMC4wMjE1IHYgMSA0NSAxIDEgaCAwLjAxMTczIGwgLTAuMDA2LDI4Ljc0OTk4IGggLTAuMDA2IHYgMzEuNjg3NSBjIDAsMi41Mjg5IDIuMDQ5LDQuNTY0NSA0LjU5Mzc0LDQuNTY0NSBoIDUuNDUzMTUgMzMuMzMyMDIgNzIuNTY2Njc2IGMgMTEuMTEsMCAyMC4wNTQ2OCwtMjAuOTgwNSAyMC4wNTQ2OCwtMjAuOTgwNSB2IC0xLjE0NjUgLTQyLjg3NDk4IGggMi44ZS00IHYgLTEgLTQ2IC0xIGggLTIuOGUtNCB2IC00Mi44NzMwNSBjIDAsLTAuMjI0NzcgLTAuMDA5LC0wLjQ0Njg4IC0wLjAxNTYsLTAuNjY5OTIgdiAtMC4zOTQ1MyBjIDAsLTExLjY2NzIgLTguOTQ0NjgsLTIxLjA2MDU1IC0yMC4wNTQ2OSwtMjEuMDYwNTUgaCAtNzIuNTg4MTY2IC0zMy4zMTA1NSAtNS4zNzEwOCB6IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtODYwLjM2MjIpIiAvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"notepadqq,notepad,plus,editor\"\nLABEL oc.cat=\"utilities,development\"\nLABEL oc.desktopfile=\"notepadqq.desktop\"\nLABEL oc.launch=\"notepadqq-bin.Notepadqq\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"notepadqq\"\nLABEL oc.displayname=\"notepadqq\"\nLABEL oc.path=\"/usr/bin/notepadqq\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"notepadqq\"\nENV APPBIN \"/usr/bin/notepadqq\"\nENV APP \"/usr/bin/notepadqq\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/notepadqq/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/notepadqq/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application notepadqq

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepadqq.d\n
"},{"location":"applications/notepadqq/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f notepadqq.d -t notepadqq .\n
"},{"location":"applications/notepadqq/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect notepadqq > notepadqq.json\ndocker image save notepadqq -o notepadqq.tar\nctr -n k8s.io images import notepadqq.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepadqq.json\n\n
"},{"location":"applications/octave/","title":"octave","text":""},{"location":"applications/octave/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/octave/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/octave/#ubuntu-packages","title":"Ubuntu packages","text":"
octave\n
"},{"location":"applications/octave/#path","title":"Path","text":"
/usr/bin/octave\n
"},{"location":"applications/octave/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/octave/#wm_class","title":"WM_CLASS","text":"
octave-gui.octave-gui\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/octave/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/www.octave.org-octave.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/octave/#json-dump","title":"JSON dump","text":"

json source file octave.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"octave\",\n    \"icon\": \"Gnu-octave-logo.svg\",\n    \"keyword\": \"octave\",\n    \"launch\": \"octave-gui.octave-gui\",\n    \"name\": \"octave\",\n    \"path\": \"/usr/bin/octave\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktop\": \"www.octave.org-octave.desktop.desktop\",\n    \"desktopfile\": \"/usr/share/applications/www.octave.org-octave.desktop\"\n}\n
"},{"location":"applications/octave/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output octave.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/octave.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @octave.d.3.0.json\n\n
"},{"location":"applications/octave/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends octave && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"Gnu-octave-logo.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iMjgzLjI4OTEyIgogICBoZWlnaHQ9IjI4My4yODgzMyIKICAgaWQ9InN2ZzI4NzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDcgcjIyNTgzIgogICBzb2RpcG9kaTpkb2NuYW1lPSJkcmF3aW5nLnN2ZyI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMjk0MiI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI2NDAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNDgzIgogICAgIGlkPSJuYW1lZHZpZXcyOTQwIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIwLjIyNDI1NzM5IgogICAgIGlua3NjYXBlOmN4PSIxMzguNjkxOCIKICAgICBpbmtzY2FwZTpjeT0iMTQ3LjgyNTI1IgogICAgIGlua3NjYXBlOndpbmRvdy14PSI2NDgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjE0NCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzI4NzIiIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczI4NzQiPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMTgyLjk4MzciCiAgICAgICBjeT0iMzk1LjA0ODcxIgogICAgICAgcj0iMTQ4Ljk1MzA5IgogICAgICAgZng9IjE4Mi45ODM3IgogICAgICAgZnk9IjM5NS4wNDg3MSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDMwMzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzU1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMjI5MTQzMzQsLTAuMjQ5MDE0NzksMC43NjQzNTcyLDAuODMwNjQyNjgsLTI3Mi44NTMzNywtMTU5LjY5NDgyKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc1NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1NyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwOGNiZTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxnCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjMzLjM1NTQ0LC0zOTAuNzE4MDIpIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjQ1MTk3MjMsMCwwLDguNDUxOTcyMywtMjc4LjQ1MDEyLC00MDMuODI5NzUpIgogICAgICAgaWQ9ImczMDI1Ij4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSA2Ni40MzIxMDMsOTcuNDg4Njc5IGMgLTUuMTk1ODQsNS42NDY0MzEgLTMuOTM2NjEsMTYuMTY5MDMxIDIuODExMDcsMjMuNTAxODcxIDYuNzQ3NjgsNy4zMzI4NSAxNi40Mjg5OCw4LjY5OTU1IDIxLjYyNDgzLDMuMDUzMTIgNS4xOTU4NSwtNS42NDY0MyAzLjk0MDIsLTE2LjE2OTQ2IC0yLjgwNzQ5LC0yMy41MDIzIC02Ljc0NzY4LC03LjMzMjg2MSAtMTYuNDMyNTYsLTguNjk5MTMxIC0yMS42Mjg0MSwtMy4wNTI2OTEgeiBtIDQuNzExNDksMi4zNDU1MyBjIDQuMDgyNTYsLTQuNDM2NTkgMTEuNTg5LC0zLjQ3MTUyIDE2Ljc2NzQxLDIuMTU1OTYxIDUuMTc4NDIsNS42Mjc1IDYuMDY2NDcsMTMuNzg0OTEgMS45ODM5MSwxOC4yMjE1IC00LjA4MjU2LDQuNDM2NTggLTExLjU5MDk3LDMuNDczNjkgLTE2Ljc2OTM5LC0yLjE1MzgxIC01LjE3ODQyLC01LjYyNzUgLTYuMDY0NDksLTEzLjc4NzA0IC0xLjk4MTkzLC0xOC4yMjM2NTEgeiIKICAgICAgICAgaWQ9InBhdGg1ODc0IgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzAzMyk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHdpZHRoPSI0LjM0OTg1NCIKICAgICAgICAgaGVpZ2h0PSI0LjM0OTg1NCIKICAgICAgICAgcng9IjAuNzY5NTg5NjYiCiAgICAgICAgIHJ5PSIwLjc2OTU4OTY2IgogICAgICAgICB4PSI4NS4zODE1NjEiCiAgICAgICAgIHk9Ijk5LjQ5Mzg4MSIKICAgICAgICAgaWQ9InJlY3Q1ODc2IgogICAgICAgICBzdHlsZT0iZmlsbDojZmY3ZjJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZDQ1NTAwO3N0cm9rZS13aWR0aDowLjc0NDAzNzk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICA8cmVjdAogICAgICAgICB3aWR0aD0iMTAuMjQ1NDM2IgogICAgICAgICBoZWlnaHQ9IjEwLjI0NTQzNiIKICAgICAgICAgcng9IjEuODEyNjU0NSIKICAgICAgICAgcnk9IjEuODEyNjU0NSIKICAgICAgICAgeD0iNjAuOTI2NTkiCiAgICAgICAgIHk9IjEwNS4yMjQ1IgogICAgICAgICBpZD0icmVjdDU4NzgiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZjdmMmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNkNDU1MDA7c3Ryb2tlLXdpZHRoOjAuNzQ0MDM3OTk7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHdpZHRoPSI2LjE4OTc1MzEiCiAgICAgICAgIGhlaWdodD0iNi4xODk3NTMxIgogICAgICAgICByeD0iMS4wOTUxMTAyIgogICAgICAgICByeT0iMS4wOTUxMTAyIgogICAgICAgICB4PSI4Ny40MDQ3MzkiCiAgICAgICAgIHk9IjExOC42MzcwNSIKICAgICAgICAgaWQ9InJlY3Q1ODgwIgogICAgICAgICBzdHlsZT0iZmlsbDojZmY3ZjJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZDQ1NTAwO3N0cm9rZS13aWR0aDowLjc0NDAzNzk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"octave,octave\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"www.octave.org-octave.desktop\"\nLABEL oc.launch=\"octave-gui.octave-gui\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"octave\"\nLABEL oc.displayname=\"octave\"\nLABEL oc.path=\"/usr/bin/octave\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"octave\"\nENV APPBIN \"/usr/bin/octave\"\nENV APP \"/usr/bin/octave\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/octave/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/octave/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application octave

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/octave.d\n
"},{"location":"applications/octave/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f octave.d -t octave .\n
"},{"location":"applications/octave/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect octave > octave.json\ndocker image save octave -o octave.tar\nctr -n k8s.io images import octave.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @octave.json\n\n
"},{"location":"applications/onlyoffice/","title":"onlyoffice","text":""},{"location":"applications/onlyoffice/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/onlyoffice/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/onlyoffice/#ubuntu-packages","title":"Ubuntu packages","text":"
onlyoffice-desktopeditors\n
"},{"location":"applications/onlyoffice/#licence","title":"Licence","text":"

** This application is NO FREE. ** You need to build it manually.

"},{"location":"applications/onlyoffice/#displayname","title":"Displayname","text":"
OnlyOffice\n
"},{"location":"applications/onlyoffice/#path","title":"Path","text":"
/usr/bin/desktopeditors\n
"},{"location":"applications/onlyoffice/#mimetype","title":"Mimetype","text":"
application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\n
"},{"location":"applications/onlyoffice/#file-extensions","title":"File extensions","text":"

\"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\"

"},{"location":"applications/onlyoffice/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/onlyoffice/#wm_class","title":"WM_CLASS","text":"
DesktopEditors.DesktopEditors\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/onlyoffice/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/onlyoffice-desktopeditors.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/onlyoffice/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\" > /etc/apt/sources.list.d/onlyoffice.list\nRUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/onlyoffice/#json-dump","title":"JSON dump","text":"

json source file onlyoffice.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"preruncommands\": [\n        \"RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\",\n        \"RUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\\\" > /etc/apt/sources.list.d/onlyoffice.list\",\n        \"RUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"debpackage\": \"onlyoffice-desktopeditors\",\n    \"icon\": \"onlyoffice-desktopeditors.svg\",\n    \"installrecommends\": true,\n    \"keyword\": \"office,onlyoffice,desktop,editor\",\n    \"launch\": \"DesktopEditors.DesktopEditors\",\n    \"name\": \"onlyoffice\",\n    \"displayname\": \"OnlyOffice\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/desktopeditors\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\",\n    \"args\": \"\",\n    \"fileextensions\": \"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\",\n    \"desktopfile\": \"/usr/share/applications/onlyoffice-desktopeditors.desktop\",\n    \"licence\": \"non-free\"\n}\n
"},{"location":"applications/onlyoffice/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output onlyoffice.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/onlyoffice.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @onlyoffice.d.3.0.json\n\n
"},{"location":"applications/onlyoffice/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\" > /etc/apt/sources.list.d/onlyoffice.list\nRUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y onlyoffice-desktopeditors && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"onlyoffice-desktopeditors.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNzIiIGhlaWdodD0iNjciIHZpZXdCb3g9IjAgMCA3MiA2NyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zMS41MDMzIDY1Ljc3NDJMMS44OTE4NCA1Mi4xODA1Qy0wLjYzMDYxNSA1MC45OTM3IC0wLjYzMDYxNSA0OS4xNTk2IDEuODkxODQgNDguMDgwOEwxMi4yMDEgNDMuMzMzN0wzMS4zOTM2IDUyLjE4MDVDMzMuOTE2MSA1My4zNjcyIDM3Ljk3NCA1My4zNjcyIDQwLjM4NjggNTIuMTgwNUw1OS41Nzk0IDQzLjMzMzdMNjkuODg4NiA0OC4wODA4QzcyLjQxMSA0OS4yNjc1IDcyLjQxMSA1MS4xMDE2IDY5Ljg4ODYgNTIuMTgwNUw0MC4yNzcxIDY1Ljc3NDJDMzcuOTc0IDY2Ljg1MyAzMy45MTYxIDY2Ljg1MyAzMS41MDMzIDY1Ljc3NDJaIiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXIpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzEuNTAzMyA0OS4wNTE2TDEuODkxODQgMzUuNDU3OEMtMC42MzA2MTUgMzQuMjcxMSAtMC42MzA2MTUgMzIuNDM3IDEuODkxODQgMzEuMzU4MUwxMS45ODE3IDI2LjcxOUwzMS41MDMzIDM1LjY3MzZDMzQuMDI1OCAzNi44NjAzIDM4LjA4MzYgMzYuODYwMyA0MC40OTY0IDM1LjY3MzZMNjAuMDE4MSAyNi43MTlMNzAuMTA3OSAzMS4zNTgxQzcyLjYzMDQgMzIuNTQ0OSA3Mi42MzA0IDM0LjM3OSA3MC4xMDc5IDM1LjQ1NzhMNDAuNDk2NCA0OS4wNTE2QzM3Ljk3NCA1MC4yMzgzIDMzLjkxNjEgNTAuMjM4MyAzMS41MDMzIDQ5LjA1MTZaIiBmaWxsPSJ1cmwoI3BhaW50MV9saW5lYXIpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzEuNTAzMyAzMi43NjA2TDEuODkxODQgMTkuMTY2OUMtMC42MzA2MTUgMTcuOTgwMSAtMC42MzA2MTUgMTYuMTQ2IDEuODkxODQgMTUuMDY3MkwzMS41MDMzIDEuNDczNDRDMzQuMDI1OCAwLjI4NjY4NSAzOC4wODM2IDAuMjg2Njg1IDQwLjQ5NjQgMS40NzM0NEw3MC4xMDc5IDE1LjA2NzJDNzIuNjMwNCAxNi4yNTM5IDcyLjYzMDQgMTguMDg4IDcwLjEwNzkgMTkuMTY2OUw0MC40OTY0IDMyLjc2MDZDMzcuOTc0IDMzLjgzOTUgMzMuOTE2MSAzMy44Mzk1IDMxLjUwMzMgMzIuNzYwNloiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcikiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhciIgeDE9IjM1Ljk3NDMiIHkxPSI3OC42NTk0IiB4Mj0iMzUuOTc0MyIgeTI9IjI5LjAzMDIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0ZDQzJCMSIvPgo8c3RvcCBvZmZzZXQ9IjAuODg0OCIgc3RvcC1jb2xvcj0iI0Q5NDIwQiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXIiIHgxPSIzNS45NzQzIiB5MT0iNTcuMTcxMyIgeDI9IjM1Ljk3NDMiIHkyPSIyNC41MzE2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNERUVEQzkiLz4KPHN0b3Agb2Zmc2V0PSIwLjY2MDYiIHN0b3AtY29sb3I9IiM4QkJBMjUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyIiB4MT0iMzUuOTc0MyIgeTE9IjQzLjk1NDciIHgyPSIzNS45NzQzIiB5Mj0iLTAuNDYwODYyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNDMkVCRkEiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMjZBOERFIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"onlyoffice,office,onlyoffice,desktop,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"onlyoffice-desktopeditors.desktop\"\nLABEL oc.launch=\"DesktopEditors.DesktopEditors\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"onlyoffice\"\nLABEL oc.displayname=\"OnlyOffice\"\nLABEL oc.path=\"/usr/bin/desktopeditors\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\"\nLABEL oc.fileextensions=\"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"onlyoffice\"\nENV APPBIN \"/usr/bin/desktopeditors\"\nENV APP \"/usr/bin/desktopeditors\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/onlyoffice/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/onlyoffice/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application onlyoffice

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/onlyoffice.d\n
"},{"location":"applications/onlyoffice/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f onlyoffice.d -t onlyoffice .\n
"},{"location":"applications/onlyoffice/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect onlyoffice > onlyoffice.json\ndocker image save onlyoffice -o onlyoffice.tar\nctr -n k8s.io images import onlyoffice.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @onlyoffice.json\n\n
"},{"location":"applications/openshift/","title":"openshift","text":""},{"location":"applications/openshift/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/openshift/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.3 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.3 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/openshift/#ubuntu-packages","title":"Ubuntu packages","text":"
rhc gnome-terminal\n
"},{"location":"applications/openshift/#arguments","title":"Arguments","text":"

\"--disable-factory --class openshift.cli\"

"},{"location":"applications/openshift/#displayname","title":"Displayname","text":"
OpenShift cli\n
"},{"location":"applications/openshift/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/openshift/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/openshift/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.openshift.cli\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/openshift/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN cd /tmp && wget \"https://cli.run.pivotal.io/stable?release=linux64-binary\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\n
"},{"location":"applications/openshift/#json-dump","title":"JSON dump","text":"

json source file

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN cd /tmp && wget \\\"https://cli.run.pivotal.io/stable?release=linux64-binary\\\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\"\n    ],\n    \"debpackage\": \"rhc gnome-terminal\",\n    \"icon\": \"openshift.svg\",\n    \"keyword\": \"oc,openshift\",\n    \"launch\": \"gnome-terminal-server.openshift.cli\",\n    \"name\": \"openshift\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"displayname\": \"OpenShift cli\",\n    \"args\": \"--disable-factory --class openshift.cli\",\n    \"quick\": true\n}\n
"},{"location":"applications/openshift/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output openshift.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/openshift.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @openshift.json\n\n
"},{"location":"applications/openshift/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN cd /tmp && wget \"https://cli.run.pivotal.io/stable?release=linux64-binary\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends rhc gnome-terminal && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"openshift.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIGJ5IE1hcnN1cGlsYW1pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNzE5IgogICBoZWlnaHQ9Ijc2OCIKICAgdmlld0JveD0iLTEuNzMzODY3MSAtMS43MzM4NjcxIDYxLjI2MzMwNDIgNjUuNDA4MjI5MiIKICAgaWQ9InN2ZzQ1NDUzIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDU0NTUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDU0LjIyNzgyLDExLjk4NjYxNSBjIC0wLjU3MjUsLTEuMTgyNSAtMS4yMzUsLTIuMzIzNzUwNCAtMi4wMDM3NSwtMy40MDAwMDA0IGwgLTguMjEyNSwyLjk4ODc1MDQgYyAwLjk1NSwwLjk3NzUgMS43NTc1LDIuMDc2MjUgMi40MTM3NSwzLjI1MTI1IGwgNy44MDI1LC0yLjg0IHogbSAtMzYuMzAyODcsOS4wODMzOCAtOC4yMTUsMi45ODg3NSBjIDAuMTA1LDEuMzE3NSAwLjMzMjUsMi42MTg3NSAwLjY1MTI1LDMuODkzNzUgbCA3LjgwMzc1LC0yLjg0MTI1IGMgLTAuMjUzNzUsLTEuMzIgLTAuMzQzNzUsLTIuNjggLTAuMjQsLTQuMDQxMjUiCiAgICAgaWQ9InBhdGg0NDU2MCIKICAgICBzdHlsZT0iZmlsbDojYzIyMTMzO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSAzNi4xNTYyLDkuNjYwMTE0NiBjIDEuNzA4NzUsMC43OTc1MDA0IDMuMTg4NzUsMS44ODUwMDA0IDQuNDM3NSwzLjE2MDAwMDQgbCA4LjIxMjUsLTIuOTg4NzUwNCBjIC0yLjI3NSwtMy4xOTI1IC01LjM3Mzc1LC01Ljg2IC05LjE3LC03LjYzMTI1IC0xMS43NDEyNSwtNS40NzUgLTI1Ljc0ODc1LC0wLjM3NzUgLTMxLjIyMjUsMTEuMzYyNTAwNCAtMS43NzI1LDMuNzk4NzUgLTIuNDMxMjUsNy44MzM3NSAtMi4xMjEyNSwxMS43NDEyNSBsIDguMjEzNzUsLTIuOTg4NzUgYyAwLjEzNjI1LC0xLjc4IDAuNTcsLTMuNTYzNzUgMS4zNjYyNSwtNS4yNzM3NSBDIDE5LjQyOTk1LDkuNDEzODY0NiAyOC41Mjg3LDYuMTAzODY0NiAzNi4xNTYyLDkuNjYwMTE0NiIKICAgICBpZD0icGF0aDQ0NTY0IgogICAgIHN0eWxlPSJmaWxsOiNkYjIxMmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDQ0LjkxNTgyLDI0LjY2ODI0NSBjIC0wLjEzMTI1LDEuNzc4NzUgLTAuNTgsMy41NjI1IC0xLjM3ODc1LDUuMjczNzUgLTMuNTU2MjUsNy42Mjg3NSAtMTIuNjU2MjUsMTAuOTM4NzUgLTIwLjI4MjUsNy4zODI1IC0xLjcxMTI1LC0wLjc5ODc1IC0zLjIwMjUsLTEuODc3NSAtNC40NDYyNSwtMy4xNTUgbCAtOC4xOTYyNSwyLjk4MjUgYyAyLjI3LDMuMTkyNSA1LjM2NSw1Ljg2MTI1IDkuMTYzNzUsNy42MzM3NSAxMS43NDEyNSw1LjQ3Mzc1IDI1Ljc0NjI1LDAuMzc2MjUgMzEuMjIxMjUsLTExLjM2NSAxLjc3Mzc1LC0zLjc5NjI1IDIuNDI3NSwtNy44MzEyNSAyLjExNSwtMTEuNzM1IGwgLTguMTk2MjUsMi45ODI1IHoiCiAgICAgaWQ9InBhdGg0NDU3MiIKICAgICBzdHlsZT0iZmlsbDojZGIyMTJlO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSA0Ni45MzU0NSwxNC42NDExMTUgLTcuODAzNzUsMi44NCBjIDEuNDUsMi41OTc1IDIuMTM1LDUuNTg3NSAxLjkxLDguNTk1IGwgOC4xOTYyNSwtMi45ODEyNSBjIC0wLjIzNSwtMi45NDEyNSAtMS4wMTg3NSwtNS44MTI1IC0yLjMwMjUsLTguNDUzNzUgbSAtMzYuMDYyNzUsMTMuMTI0IC03LjgwMzc1LDIuODQyNSBjIDAuNzE2MjUsMi44NDUgMS45Niw1LjU0ODc1IDMuNjcsNy45NTUgbCA4LjE5NSwtMi45ODM3NSBjIC0yLjEwMzc1LC0yLjE2IC0zLjUwMjUsLTQuODkzNzUgLTQuMDYxMjUsLTcuODEzNzUiCiAgICAgaWQ9InBhdGg0NDU3NiIKICAgICBzdHlsZT0iZmlsbDojZWIyMTI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSA1My4wMzgzMiw5LjgyMjk5NDYgYyAtMC4yNTg3NSwtMC40MiAtMC41Mjc1LC0wLjgzMzc1IC0wLjgxMzc1LC0xLjIzNjI1IGwgLTguMjEyNSwyLjk4ODc1MDQgYyAwLjM2MTI1LDAuMzcgMC42OTM3NSwwLjc2MjUgMS4wMTEyNSwxLjE2NSBsIDguMDE1LC0yLjkxNzUwMDQgeiBNIDE3Ljg5MzU3LDIyLjcxOTM2NSBjIC0wLjAyLC0wLjU0NzUgLTAuMDExMywtMS4wOTc1IDAuMDMxMiwtMS42NDg3NSBsIC04LjIxNSwyLjk4ODc1IGMgMC4wNDI1LDAuNTI2MjUgMC4xMDg3NSwxLjA0ODc1IDAuMTg3NSwxLjU3IGwgNy45OTYyNSwtMi45MSB6IgogICAgIGlkPSJwYXRoNDQ1ODQiCiAgICAgc3R5bGU9ImZpbGw6I2FkMjEzYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz4KICA8cGF0aAogICAgIGQ9Im0gNTMuMTExNTcsMjEuNjg1NjE1IC04LjE5NjI1LDIuOTgyNSBjIC0wLjA4NjMsMS4xOCAtMC4zMTYyNSwyLjM2MjUgLTAuNjkyNSwzLjUyNSBsIDguOTIxMjUsLTMuMjUyNSBjIDAuMDYzOCwtMS4wOSAwLjA1MzcsLTIuMTc3NSAtMC4wMzI1LC0zLjI1NSBtIC00Mi40OTg3NSwxNS40Njc1IGMgMC42MzEyNSwwLjg4ODc1IDEuMzMsMS43MzYyNSAyLjA4ODc1LDIuNTM2MjUgbCA4LjkyMjUsLTMuMjUzNzUgYyAtMS4wNDI1LC0wLjY1MjUgLTEuOTg1LC0xLjQxMzc1IC0yLjgxNjI1LC0yLjI2NjI1IGwgLTguMTk1LDIuOTgzNzUgeiIKICAgICBpZD0icGF0aDQ0NTg4IgogICAgIHN0eWxlPSJmaWxsOiNiYTIxMzM7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDUyLjY4OTMyLDU0LjUzMjExNSAwLDAuNzQgMi4xNDYyNSwwIDAsNi41NTM3NSAwLjgxMjUsMCAwLC02LjU1Mzc1IDIuMTQ3NSwwIDAsLTAuNzQgLTUuMTA2MjUsMCB6IG0gLTQuOTI4NSwwLjczOTM4IDAsMi40MTc1IDIsMCAwLDAuNzQgLTIsMCAwLDMuMzk2MjUgLTAuODEyNSwwIDAsLTcuMjkyNSA0LjI4MjUsMCAwLDAuNzM4NzUgLTMuNDcsMCB6IG0gLTMuNzE3NzUsLTAuNzM4NSAwLjgxMjUsMCAwLDcuMjkzNzUgLTAuODEyNSwwIDAsLTcuMjkzNzUgeiBtIC0yLjkwNDI1LDcuMjkyODcgMCwtMy40Mzg3NSAtMy42MjYyNSwwIDAsMy40Mzg3NSAtMC44MTI1LDAgMCwtNy4yOTM3NSAwLjgxMjUsMCAwLDMuMTE2MjUgMy42MjYyNSwwIDAsLTMuMTE2MjUgMC44MTI1LDAgMCw3LjI5Mzc1IC0wLjgxMjUsMCB6IG0gLTguNjY2NzUsMC4xMTQ2MyBjIC0wLjk5LDAgLTEuODc2MjUsLTAuNDI3NSAtMi40NDg3NSwtMS4wMSBsIDAuNTQyNSwtMC42MDUgYyAwLjU1MTI1LDAuNTMxMjUgMS4xODc1LDAuODc2MjUgMS45Mzc1LDAuODc2MjUgMC45Njg3NSwwIDEuNTczNzUsLTAuNDggMS41NzM3NSwtMS4yNTEyNSAwLC0wLjY3NzUgLTAuNDA2MjUsLTEuMDYyNSAtMS43NCwtMS41NDI1IC0xLjU3Mzc1LC0wLjU2MjUgLTIuMTA1LC0xLjA3MjUgLTIuMTA1LC0yLjEyNSAwLC0xLjE2NzUgMC45MTYyNSwtMS44NjYyNSAyLjI4MTI1LC0xLjg2NjI1IDAuOTgsMCAxLjYwNSwwLjI5MjUgMi4yMiwwLjc4MjUgbCAtMC41MjEyNSwwLjYzNSBjIC0wLjUzMTI1LC0wLjQzNzUgLTEuMDIxMjUsLTAuNjc3NSAtMS43NSwtMC42Nzc1IC0xLjAwMTI1LDAgLTEuNDE3NSwwLjUgLTEuNDE3NSwxLjA3Mzc1IDAsMC42MDUgMC4yNzEyNSwwLjk0NzUgMS43MywxLjQ3IDEuNjE1LDAuNTgyNSAyLjExNSwxLjEyNSAyLjExNSwyLjIwODc1IDAsMS4xNDYyNSAtMC44OTYyNSwyLjAzMTI1IC0yLjQxNzUsMi4wMzEyNSBtIC01Ljc0MTUsLTAuMTE0NjMgLTIuNjc3NSwtMy45OCBjIC0wLjE3NzUsLTAuMjcxMjUgLTAuNDE3NSwtMC42MzYyNSAtMC41MTEyNSwtMC44MjM3NSAwLDAuMjcxMjUgMC4wMjEyLDEuMTg3NSAwLjAyMTIsMS41OTM3NSBsIDAsMy4yMSAtMS40Mzg3NSwwIDAsLTcuMjkzNzUgMS4zOTYyNSwwIDIuNTg1LDMuODU1IGMgMC4xNzc1LDAuMjcxMjUgMC40MTYyNSwwLjYzNjI1IDAuNTEsMC44MjM3NSAwLC0wLjI3MTI1IC0wLjAyLC0xLjE4NzUgLTAuMDIsLTEuNTk1IGwgMCwtMy4wODM3NSAxLjQzNzUsMCAwLDcuMjkzNzUgLTEuMzAyNSwwIHogbSAtMTEuNTAxMTIsMCAwLC03LjI5Mzc1IDUuMDYzNzUsMCAwLDEuNDI3NSAtMy42MDUsMCAwLDEuMjYxMjUgMi4wOTUsMCAwLDEuNDE2MjUgLTIuMDk1LDAgMCwxLjc2MTI1IDMuNzYxMjUsMCAwLDEuNDI3NSAtNS4yMiwwIHogbSAtNC4xNDQ3NSwtMi41ODM2MiAtMS42MDUsMCAwLDIuNTgzNzUgLTEuNDU4NzUsMCAwLC03LjI5Mzc1IDMuMTg4NzUsMCBjIDEuMzc1LDAgMi41MTEyNSwwLjc2MTI1IDIuNTExMjUsMi4zMTI1IDAsMS42ODg3NSAtMS4xMjUsMi4zOTc1IC0yLjYzNjI1LDIuMzk3NSBtIDAuMDczOCwtMy4yOTI1IC0xLjY3ODc1LDAgMCwxLjg3NSAxLjY5ODc1LDAgYyAwLjY3NzUsMCAxLjA0MjUsLTAuMzEzNzUgMS4wNDI1LC0wLjk0ODc1IDAsLTAuNjM1IC0wLjQxNzUsLTAuOTI2MjUgLTEuMDYyNSwtMC45MjYyNSBNIDMuMjEsNjEuOTQwNDk1IGMgLTEuOTA3NSwwIC0zLjIxLC0xLjM5NjI1IC0zLjIxLC0zLjc1MTI1IDAsLTIuMzU1IDEuMzIzNzUsLTMuNzcyNSAzLjIzMTI1LC0zLjc3MjUgMS44OTYyNSwwIDMuMTk4NzUsMS4zOTc1IDMuMTk4NzUsMy43NTI1IDAsMi4zNTUgLTEuMzIzNzUsMy43NzEyNSAtMy4yMiwzLjc3MTI1IG0gLTAuMDEsLTYuMDc1IGMgLTEuMDIxMjUsMCAtMS42OTg3NSwwLjgyMzc1IC0xLjY5ODc1LDIuMzAzNzUgMCwxLjQ4IDAuNzA4NzUsMi4zMjI1IDEuNzMsMi4zMjI1IDEuMDIxMjUsMCAxLjY5NzUsLTAuODIyNSAxLjY5NzUsLTIuMzAyNSAwLC0xLjQ4IC0wLjcwNzUsLTIuMzIzNzUgLTEuNzI4NzUsLTIuMzIzNzUiCiAgICAgaWQ9InBhdGg0NDYyMiIKICAgICBzdHlsZT0iZmlsbDojMjQxZjIxO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4KPCEtLSB2ZXJzaW9uOiAyMDExMDMxMSwgb3JpZ2luYWwgc2l6ZTogNTcuNzk1NTcgNjEuOTQwNDk1LCBib3JkZXI6IDMlIC0tPgo=\"\nLABEL oc.keyword=\"openshift,oc,openshift\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.openshift.cli\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--disable-factory --class openshift.cli\"\nLABEL oc.name=\"openshift\"\nLABEL oc.displayname=\"OpenShift cli\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"openshift\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class openshift.cli\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/openshift/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/openshift/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application openshift

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/openshift.d\n
"},{"location":"applications/openshift/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f openshift.d -t openshift .\n
"},{"location":"applications/openshift/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect openshift > openshift.json\ndocker image save openshift -o openshift.tar\nctr -n k8s.io images import openshift.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @openshift.json\n\n
"},{"location":"applications/pinta/","title":"Pinta","text":""},{"location":"applications/pinta/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/pinta/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/pinta/#alpine-packages","title":"Alpine packages","text":"
pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\n
"},{"location":"applications/pinta/#displayname","title":"Displayname","text":"
Pinta (alpine)\n
"},{"location":"applications/pinta/#path","title":"Path","text":"
/usr/bin/pinta\n
"},{"location":"applications/pinta/#mimetype","title":"Mimetype","text":"
image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\n
"},{"location":"applications/pinta/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/pinta/#wm_class","title":"WM_CLASS","text":"
Pinta.Pinta\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/pinta/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/pinta.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/pinta/#json-dump","title":"JSON dump","text":"

json source file pinta.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"displayname\": \"Pinta (alpine)\",\n    \"apkpackage\": \"pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\",\n    \"icon\": \"pinta.svg\",\n    \"keyword\": \"pinta,paint\",\n    \"launch\": \"Pinta.Pinta\",\n    \"name\": \"Pinta\",\n    \"path\": \"/usr/bin/pinta\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\",\n    \"desktopfile\": \"/usr/share/applications/pinta.desktop\"\n}\n
"},{"location":"applications/pinta/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output pinta.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/pinta.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @pinta.d.3.0.json\n\n
"},{"location":"applications/pinta/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\nLABEL oc.icon=\"pinta.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL2lua3NjYXBlLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iOTAuMDAwMDAwIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iOTAuMDAwMDAwIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9Ii9ob21lL2FuZHJlYXMvcHJvamVrdC9iaWxkL3RhbmdvL3NjYWxhYmxlL2RyYXctcGVuY2lsMy5wbmciCiAgIHdpZHRoPSI0OHB4IgogICBoZWlnaHQ9IjQ4cHgiCiAgIGlkPSJzdmc5MTIxIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQzK2RldmVsIgogICBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS90aWdlcnQvY3ZzL2ZyZWVkZXNrdG9wLm9yZy90YW5nby1pY29uLXRoZW1lL3NjYWxhYmxlL2NhdGVnb3JpZXMiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImFwcGxpY2F0aW9ucy1ncmFwaGljcy5zdmciCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzMyI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY4MzUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY4MzciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjgzOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3NDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY3NTAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMyYjU1ODI7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjc1MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3MjEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY3MjMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzYzc0YjE7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjcyNSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2NTEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjJmMmYyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY2NTMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjM2MzYzM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjY1NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2MjkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYWVhZWFlO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY2MzEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjNGM0YzQ7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjYzMyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI0NDYiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI0NDgiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjQ1MCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NzUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NzciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk3OSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NjMiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNjk2OTY5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NjUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk2NyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NTEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNmUzZDA5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NTMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjk1OSIKICAgICAgICAgb2Zmc2V0PSIwLjI0MjQyNDI1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWE4MTEzO3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzVjMzMwNztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMC42MjEyMTIxMiIKICAgICAgICAgaWQ9InN0b3A2OTYxIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTA3YzEyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDY5NTUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTM5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2JkYmRiZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A2OTQxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY5NDciCiAgICAgICAgIG9mZnNldD0iMC4zMzMzMzMzNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UyZTJlMjtzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhM2EzYTM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAuNjY2NjY2NjkiCiAgICAgICAgIGlkPSJzdG9wNjk0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RkZGRkZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2OTQzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkzOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NDUiCiAgICAgICB4MT0iMTkuMzk0NzM1IgogICAgICAgeTE9IjMwLjAwMTMzMSIKICAgICAgIHgyPSIyMy4xMDkzMzEiCiAgICAgICB5Mj0iMzMuNDM4ODMxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0zLjkwNjk1LC0xLjgwMjg1NikiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5NTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTU3IgogICAgICAgeDE9IjI4LjA1ODYzMiIKICAgICAgIHkxPSIxOC44Njc3NjciCiAgICAgICB4Mj0iMzMuNDM2OTg1IgogICAgICAgeTI9IjIzLjc0Mjc2NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMy45MDY5NSwtMS44MDI4NTYpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTYzIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50Njk2OSIKICAgICAgIGN4PSIxNS40MTUxMDEiCiAgICAgICBjeT0iMzUuMzU2NTA2IgogICAgICAgZng9IjE1LjQxNTEwMSIKICAgICAgIGZ5PSIzNS4zNTY1MDYiCiAgICAgICByPSI3LjU3OTE1NjEiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTk0NjU1LDMuMjYyODc2ZS0xNiw2LjU2NDU0NmUtMTMsMC45NjkzMjIsLTQuNTgzMDE3LDAuMTY1OTE5KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTc1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50Njk4MSIKICAgICAgIGN4PSIyNi43ODE2NyIKICAgICAgIGN5PSI0Mi4zNDMxNDciCiAgICAgICBmeD0iMjYuNzgxNjciCiAgICAgICBmeT0iNDIuMzQzMTQ3IgogICAgICAgcj0iMTQuNDA3MzAxIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjI4MjIwOSwxLjY3OTIxMmUtMTUsMzAuMzkzNTUpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0NDYiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNDUyIgogICAgICAgeDE9IjEzLjIzNjE1NSIKICAgICAgIHkxPSIzNy43NTIyNDciCiAgICAgICB4Mj0iNy43NTIxMDkxIgogICAgICAgeTI9IjQyLjI4MjE0NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjg1MjI5OCwwLDAsMC44NTIyOTgsLTEuNjc1MTA3LDMuNzUzOTc3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njk3NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDY5MDMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC4yODIyMDksMi45MzYxMjhlLTE1LDMwLjM5MzU1KSIKICAgICAgIGN4PSIyNi43ODE2NyIKICAgICAgIGN5PSI0Mi4zNDMxNDciCiAgICAgICBmeD0iMjYuNzgxNjciCiAgICAgICBmeT0iNDIuMzQzMTQ3IgogICAgICAgcj0iMTQuNDA3MzAxIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2ODM1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAwNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjQ4LjI1IgogICAgICAgeTE9IjU0Ljc1IgogICAgICAgeDI9IjQ4LjI1IgogICAgICAgeTI9IjcxLjI1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjcxODkxNCwwLDAsMC43MTg5MTQsLTEuODk3MTAzLC0yMC42ODYwNikiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDEwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNzM3MzA3LDAsMCwwLjc3MDg1NCwtOC41MzIwMjMsNy4xMjE2MzYpIgogICAgICAgeDE9IjYwLjE2ODc2NiIKICAgICAgIHkxPSI0MC4xMTk3OTciCiAgICAgICB4Mj0iNjAuNDQwOTk0IgogICAgICAgeTI9IjQzLjg2OTc5NyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njc0OCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMTQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC43MTg5MTQsMCwwLDAuNzE4OTE0LC0xLjg5NzEwMywtMjIuNDI0ODEpIgogICAgICAgeDE9IjQ5Ljg1MzAzNyIKICAgICAgIHkxPSI2NC4yNTk2MjMiCiAgICAgICB4Mj0iNjIuNzY4MjIxIgogICAgICAgeTI9IjY0LjI1OTYyMyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjYyOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMTciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44ODg2MTksMCwwLDAuNzE4OTE0LC0xOC4yOTc2OCw5LjQ3MTcyOCkiCiAgICAgICB4MT0iNjEuODcxODQ1IgogICAgICAgeTE9IjI5LjYxNTIyMyIKICAgICAgIHgyPSI2MS44NzE4NDUiCiAgICAgICB5Mj0iNDEuNDU5MjYzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NjUxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAyMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjcxOTQ0LDAsMCwwLjcxODkxNCwtNy42OTYyNTIsOS40NzE3MjgpIgogICAgICAgeDE9IjUzLjE2ODc2NiIKICAgICAgIHkxPSIyNC4yNDQ3OTciCiAgICAgICB4Mj0iNjkuNjkwOTk0IgogICAgICAgeTI9IjI0LjI0NDc5NyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjcyMSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMjUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44NjI0ODIsMCwwLDAuNTgwNzE4LC0xNi4yNTY5NywxMS4wMTM0OCkiCiAgICAgICB4MT0iNTIuNzE3OTM2IgogICAgICAgeTE9IjIuMzE2MTYzOCIKICAgICAgIHgyPSI2Ny40NjU5ODgiCiAgICAgICB5Mj0iMi4zMTYxNjM4IiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjAuMTcyNTQ5MDIiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjQiCiAgICAgaW5rc2NhcGU6Y3g9IjYxLjAzNjM2MyIKICAgICBpbmtzY2FwZTpjeT0iMjUuODYzOTA2IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBzaG93Z3VpZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMjk1IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjExNTEiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjQ3MiIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iZmFsc2UiCiAgICAgc3Ryb2tlPSIjMjA0YTg3IgogICAgIGZpbGw9IiMzNDY1YTQiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+R3JhcGhpY3MgQ2F0ZWdvcnk8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlIC8+CiAgICAgICAgPGRjOmNyZWF0b3I+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZT5KYWt1YiBTdGVpbmVyPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxjYzpsaWNlbnNlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjAvIiAvPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+Z3JhcGhpY3M8L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5jYXRlZ29yeTwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnBpeGVsPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+dmVjdG9yPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+ZWRpdG9yPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+ZHJhdzwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnBhaW50PC9yZGY6bGk+CiAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxkYzpzb3VyY2U+aHR0cDovL3RhbmdvLXByb2plY3Qub3JnPC9kYzpzb3VyY2U+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjAvIj4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvUmVwcm9kdWN0aW9uIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EaXN0cmlidXRpb24iIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9Ob3RpY2UiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9BdHRyaWJ1dGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGVyaXZhdGl2ZVdvcmtzIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvU2hhcmVBbGlrZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDY5MjI0LDAsMCwxLjEyMjk3NSw1Ljc2OTAyOCwtNy4xMTYxNikiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGQ9Ik0gNDEuMTg4OTcxIDQyLjM0MzE0NyBBIDE0LjQwNzMwMSA0LjA2NTg2NDEgMCAxIDEgIDEyLjM3NDM2OSw0Mi4zNDMxNDcgQSAxNC40MDczMDEgNC4wNjU4NjQxIDAgMSAxICA0MS4xODg5NzEgNDIuMzQzMTQ3IHoiCiAgICAgICBzb2RpcG9kaTpyeT0iNC4wNjU4NjQxIgogICAgICAgc29kaXBvZGk6cng9IjE0LjQwNzMwMSIKICAgICAgIHNvZGlwb2RpOmN5PSI0Mi4zNDMxNDciCiAgICAgICBzb2RpcG9kaTpjeD0iMjYuNzgxNjciCiAgICAgICBpZD0icGF0aDY5MDEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjM7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ2OTAzKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDY5NTcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNjczOTA3O3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGQ9Ik0gMTkuNjUxNjgyLDIyLjU4NjczNSBMIDIzLjcxNzU0NiwyNi4zODc0MzMgQyAzMC45MDUwNDUsMTkuMzI0OTM0IDQxLjUwMDYwNiwyLjQxMDE0NTUgNDEuNTAwNjA2LDIuNDEwMTQ1NSBDIDQxLjkzMDA5NiwxLjE4NTY5OTMgNDAuNDEzMzYxLDAuNDE0MjUyNjQgMzkuNjU0MjU0LDEuMjM5NjUwNSBDIDM5LjY1NDI1NCwxLjIzOTY1MDUgMjUuOTY0MTgxLDE1LjMzNjczNiAxOS42NTE2ODIsMjIuNTg2NzM1IHogIgogICAgICAgaWQ9InBhdGg2OTM3IgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ2OTQ1KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6Izg4OGE4NTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDEyLjA1MDI4NSwzMi44MTM4OTQgTCAxNC4yOTY2MDUsMzQuNzQ3NzE0IEwgMjIuNzg5MzcxLDI3LjM4MDY4MyBMIDIzLjA2NDQzMiwyNi42NzQ4NTUgTCAyNC4xNTg4MzcsMjYuNjU3MDQgQyAyMy43MjEzMzcsMjUuMDk0NTQgMjEuMjE3MzIzLDIyLjI3MzU4NSAxOS4zNDIzMjMsMjIuMjczNTg1IEwgMTkuNDI0MzQyLDIzLjM2MzY2IEwgMTguNzU0MzUxLDIzLjc0MzY4NyBMIDEyLjA1MDI4NSwzMi44MTM4OTQgeiAiCiAgICAgICBpZD0icGF0aDY5MzUiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDY5ODEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGlkPSJwYXRoNjk3MyIKICAgICAgIHNvZGlwb2RpOmN4PSIyNi43ODE2NyIKICAgICAgIHNvZGlwb2RpOmN5PSI0Mi4zNDMxNDciCiAgICAgICBzb2RpcG9kaTpyeD0iMTQuNDA3MzAxIgogICAgICAgc29kaXBvZGk6cnk9IjQuMDY1ODY0MSIKICAgICAgIGQ9Ik0gNDEuMTg4OTcxIDQyLjM0MzE0NyBBIDE0LjQwNzMwMSA0LjA2NTg2NDEgMCAxIDEgIDEyLjM3NDM2OSw0Mi4zNDMxNDcgQSAxNC40MDczMDEgNC4wNjU4NjQxIDAgMSAxICA0MS4xODg5NzEgNDIuMzQzMTQ3IHoiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzM4MzcsMCwwLDEsLTIwLjkyNjQsLTMuNDA5MDExKSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50Njk2OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDEuNzU3NzA5LDQwLjcyMzkxNSBDIDguMzYzMDIxNiw0MC43MjM5MTUgMTMuMzc1ODk2LDQxLjUxMDUxNiAxNC4zMjQ5MzQsMzYuNzA0ODQyIEMgMTUuMDg5NzI3LDMyLjgzMjEzMyA5Ljc2NDYwOTYsMzAuOTc2NDgyIDcuMTI1ODAyNiwzNC40MzM3OTEgQyA0LjU4Mzc5OSwzNy43NjQyNyAxLjc1NzcwOSw0MC43MjM5MTUgMS43NTc3MDksNDAuNzIzOTE1IHogIgogICAgICAgaWQ9InBhdGg2OTMzIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc2MiIC8+CiAgICA8cGF0aAogICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC41Mjc3Nzc4Mjtjb2xvcjojMDAwMDAwO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBpZD0icGF0aDY5NzEiCiAgICAgICBzb2RpcG9kaTpjeD0iNy42MjQ5OTkiCiAgICAgICBzb2RpcG9kaTpjeT0iMzcuNzUiCiAgICAgICBzb2RpcG9kaTpyeD0iMS4yNDk5OTk5IgogICAgICAgc29kaXBvZGk6cnk9IjEuMjQ5OTk5OSIKICAgICAgIGQ9Ik0gOC44NzQ5OTg5IDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgNi4zNzQ5OTkyLDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgOC44NzQ5OTg5IDM3Ljc1IHoiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODUyMjk4LDAsMCwwLjg1MjI5OCwzLjczMzU1NCwyLjU3NTYwNCkiIC8+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC43ODc4NjcsMCwwLDAuNzg3ODY3LDE0LjI2NTM4LC00LjcyMzM2NikiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGQ9Ik0gOC44NzQ5OTg5IDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgNi4zNzQ5OTkyLDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgOC44NzQ5OTg5IDM3Ljc1IHoiCiAgICAgICBzb2RpcG9kaTpyeT0iMS4yNDk5OTk5IgogICAgICAgc29kaXBvZGk6cng9IjEuMjQ5OTk5OSIKICAgICAgIHNvZGlwb2RpOmN5PSIzNy43NSIKICAgICAgIHNvZGlwb2RpOmN4PSI3LjYyNDk5OSIKICAgICAgIGlkPSJwYXRoNjk4MyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgZD0iTSAxOC45NDE0MzgsMjYuMzk4MTU0IEwgMTMuNjM4MTM3LDMyLjU0MTE0NCIKICAgICAgIGlkPSJwYXRoNjk4NSIKICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNDI3Nzc3NzY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyNDUyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDMuMDcwODg3Miw0MC4wNjg5NzYgQyAzLjA3MDg4NzIsNDAuMDY4OTc2IDYuNDExOTk4NiwzOC40MjcxNTUgNy44MzU3MTU2LDM1Ljk4MjE0NyBDIDguMzM5NDIyNiwzNS4xMTcxMSA5LjQ4MDA4ODYsMzUuODU1MzExIDguNzc3MzgxNiwzNi43MTY2NDYgQyA3LjI1OTU1MzYsMzguNTc3MTA0IDMuMDcwODg3Miw0MC4wNjg5NzYgMy4wNzA4ODcyLDQwLjA2ODk3NiB6ICIKICAgICAgIGlkPSJwYXRoMTU3MSIKICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNTMzMzMzMjc7Y29sb3I6IzAwMDAwMDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgaWQ9InBhdGgyNDU0IgogICAgICAgc29kaXBvZGk6Y3g9IjcuNjI0OTk5IgogICAgICAgc29kaXBvZGk6Y3k9IjM3Ljc1IgogICAgICAgc29kaXBvZGk6cng9IjEuMjQ5OTk5OSIKICAgICAgIHNvZGlwb2RpOnJ5PSIxLjI0OTk5OTkiCiAgICAgICBkPSJNIDguODc0OTk4OSAzNy43NSBBIDEuMjQ5OTk5OSAxLjI0OTk5OTkgMCAxIDEgIDYuMzc0OTk5MiwzNy43NSBBIDEuMjQ5OTk5OSAxLjI0OTk5OTkgMCAxIDEgIDguODc0OTk4OSAzNy43NSB6IgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjIzNzg2NywwLDAsMC4yMzc4NjcsMzguNDMzODksLTcuMTAxMDI4KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzcwMzgiPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3NjIgogICAgICAgICBpZD0icGF0aDY2NTkiCiAgICAgICAgIGQ9Ik0gMzUuMTI2OTQsNy4zNTAwNzU5IEMgMzIuMDY5MDg0LDcuNDM3MzY0OCAyOS42NDI1NTEsOC40MDYxNTg0IDI5LjY0MjU1MSw5LjU3NDQwOTUgQyAyOS42NDI1NTEsOS44NTIxMDg1IDI5LjY0MjU1MSwxMi44NjY4MjkgMjkuNjQyNTUxLDEzLjE0NDUyOCBDIDI5LjY0MjU1MSwxNC4zNzAyMzQgMzIuMzEzNDgzLDE1LjM2ODg2MSAzNS41ODM5NzEsMTUuMzY4ODYxIEMgMzguODU0NDU3LDE1LjM2ODg2MSA0MS41LDE0LjM3MDIzNCA0MS41LDEzLjE0NDUyOCBDIDQxLjUsMTIuODY2ODI5IDQxLjUsOS44NTIxMDg1IDQxLjUsOS41NzQ0MDk1IEMgNDEuNSw4LjM0ODcwMzMgMzguODU0NDU3LDcuMzUwMDc1OSAzNS41ODM5NzEsNy4zNTAwNzU5IEMgMzUuNDMwNjY2LDcuMzUwMDc1OSAzNS4yNzczMjUsNy4zNDU3ODI2IDM1LjEyNjk0LDcuMzUwMDc1OSB6ICIKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzAyNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMyMDRhODc7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8cGF0aAogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjg4NjI3OCwwLDAsMC40Njg5MTQsLTEwLjQ0MzkyLC05LjcxODg1OSkiCiAgICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICAgIGQ9Ik0gNTcuMzc1IDQ5Ljc1IEEgNS4zNzUgMS41IDAgMSAxICA0Ni42MjUsNDkuNzUgQSA1LjM3NSAxLjUgMCAxIDEgIDU3LjM3NSA0OS43NSB6IgogICAgICAgICBzb2RpcG9kaTpyeT0iMS41IgogICAgICAgICBzb2RpcG9kaTpyeD0iNS4zNzUiCiAgICAgICAgIHNvZGlwb2RpOmN5PSI0OS43NSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjUyIgogICAgICAgICBpZD0icGF0aDY3MjkiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6IzM0NjVhNDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC45OTk5OTk4MjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpZD0icGF0aDY2MTciCiAgICAgICAgIGQ9Ik0gMjcuOTI2NDQ3LDM5LjE1NTQ2NyBMIDI4Ljk3MzQ1NiwxNy44MDYwMzIgTCAzMS40NjAxMDIsMTQuMTQyNTIgQyAzMy40MzEzOTQsMTMuNTA3MDgzIDM4LjE4NjUyOSwxMy41MDcwODMgMzkuOTY3MDUsMTQuMTQyNTIgTCA0Mi40NTM2OTcsMTcuMTc0MzkzIEwgNDUuMDcxMjIsMzkuNjYwNzggTCAyNy45MjY0NDcsMzkuMTU1NDY3IHogIgogICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MDIwKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzVhNWE1YTtzdHJva2Utd2lkdGg6MS4wMDAwMDAzNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3pjYyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2NjE5IgogICAgICAgICBkPSJNIDI4LjgyODQ5NSwzOC44OTYxMDggQyAyOC44Mjg0OTUsMzguODk2MTA4IDMxLjQxOTE2OCwyOS4zNjQ1NjUgMzYuMzY4NjgzLDI5LjM2NDU2NSBDIDQxLjQ3NTI4NCwyOS4zNjQ1NjUgNDQuNTM3MjE4LDM5LjI3NzM3IDQ0LjUzNzIxOCwzOS4yNzczNyBMIDI4LjgyODQ5NSwzOC44OTYxMDggeiAiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2NjQxIgogICAgICAgICBkPSJNIDI5LjE4MDEzOCwyMC40OTg3MDggTCAyOC44ODQyMjUsMjYuOTczNDUgQyAzMC41NDY3MTQsMjUuODk1MDc5IDQwLjg3NjczNiwyNS43MDg5NjQgNDMuMjI3ODUsMjcuMzYxMDk4IEwgNDIuNTI2MzAyLDIwLjc2Mzc4NSBDIDQxLjEyODM0MiwxOS44MTA2MzEgMzEuOTQzNDY0LDE5LjI4NTU0IDI5LjE4MDEzOCwyMC40OTg3MDggeiAiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC41OTQ0NDQzO2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZmZmZmZmO3N0cm9rZS13aWR0aDoxLjAwMDAwMDEyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgZD0iTSAyOS4wNDg3NjIsMzguMjIyMDk2IEwgMjkuOTI2MjU5LDE4LjAyNzc4NCBMIDMxLjc2NjIyNiwxNC45OTQ5NDkgQyAzMy41ODQ3ODIsMTQuNDAyNzc0IDM3Ljk3MTQ4NCwxNC40MDI3NzQgMzkuNjE0MDQ5LDE0Ljk5NDk0OSBMIDQxLjU3NDUzLDE3LjUyNzUzNSBMIDQ0LjAyNjc1NCwzOC43NzU5IEwgMjkuMDQ4NzYyLDM4LjIyMjA5NiB6ICIKICAgICAgICAgaWQ9InBhdGg2NjcwIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHJ5PSIwLjg4Mzg4MzY2IgogICAgICAgICByeD0iMC44ODM4ODQxMyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgeT0iMzcuNTM2MTMzIgogICAgICAgICB4PSIyNi41MTI3ODkiCiAgICAgICAgIGhlaWdodD0iMy45Mjc3NTI1IgogICAgICAgICB3aWR0aD0iMTkuOTc0NDEzIgogICAgICAgICBpZD0icmVjdDU3NDIiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNWE1YTVhO3N0cm9rZS13aWR0aDoxLjAwMDAwMDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8cGF0aAogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpZD0icGF0aDY2NjgiCiAgICAgICAgIGQ9Ik0gMjkuMzk1MjE5LDE3Ljk5NjQ1MSBDIDMxLjI2OTc1NiwxNi42MzAyNjMgMzguNDkzMTUzLDE2LjM0MTI3NyA0Mi4xMTUxMzksMTcuMzg5NzQ3IEwgMzkuNzc3NzMzLDE0LjUwNDEyNCBDIDM3LjI5OTUzMiwxMy44MzY5MTYgMzMuODUzMzg2LDE0LjEyODM1OCAzMS41MDIyNzIsMTQuNTczMTY0IEwgMjkuMzk1MjE5LDE3Ljk5NjQ1MSB6ICIKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2ODMzIgogICAgICAgICBkPSJNIDMxLjE3Mjk0MSwxNy40MTYzODIgTCAzMS4xNzI5NDEsMzIuODczMDMzIEwgMzQuNDA4MDU0LDI5LjI3ODQ2MyBMIDM0LjA0ODU5NywxNi42OTc0NjggTCAzMS4xNzI5NDEsMTcuNDE2MzgyIHogIgogICAgICAgICBzdHlsZT0ib3BhY2l0eTowLjg2MTExMTA5O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzAwNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8ZwogICAgICAgICBzdHlsZT0ib3BhY2l0eTowLjU3Nzc3Nzc4IgogICAgICAgICBpZD0iZzcwMzMiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZTZlN2U2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtvcGFjaXR5OjAuNDExMTExMTEiCiAgICAgICAgICAgZD0iTSAzMS4wMDkzOTEsOS4zODA5NzM4IEwgMzEuMDA5MzkxLDEyLjYyMTAwOSBDIDMxLjAwOTM5MSwxMi42MjEwMDkgMzEuNjIwNTgsMTIuMjczMzIzIDMyLDEyLjI1OTY4OCBMIDMyLDkgQyAzMS41MTg0MjgsOS4wNjk0NjI2IDMxLjAwOTM5MSw5LjM4MDk3MzggMzEuMDA5MzkxLDkuMzgwOTczOCB6ICIKICAgICAgICAgICBpZD0icGF0aDY2NjYiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpZD0icGF0aDcwMjkiCiAgICAgICAgICAgZD0iTSAzMy4wMDkzOTEsOC43NTk5NjQ4IEwgMzMuMDA5MzkxLDEyIEMgMzMuMDA5MzkxLDEyIDMzLjYyMDU4LDExLjkxNzQ3OSAzNCwxMS45MDM4NDQgTCAzNCw4LjU4ODkxMzMgQyAzMy40ODgzOTksOC42MTQ3MTc5IDMzLjAwOTM5MSw4Ljc1OTk2NDggMzMuMDA5MzkxLDguNzU5OTY0OCB6ICIKICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNlNmU3ZTY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZTZlN2U2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtvcGFjaXR5OjAuNDQ0NDQ0NDQiCiAgICAgICAgICAgZD0iTSAzNS4wMDkzOTEsOC41NjEwOTEgTCAzNS4wMDkzOTEsMTEuODU2MzY5IEMgMzUuMDA5MzkxLDExLjg1NjM2OSAzNS41NjUzMzcsMTEuODUxMTg3IDM2LDExLjg3MDY5OCBMIDM2LDguNTMzNjcwNiBDIDM1LjQ5OTQ0OCw4LjQ4MjEzNTQgMzUuMDA5MzkxLDguNTYxMDkxIDM1LjAwOTM5MSw4LjU2MTA5MSB6ICIKICAgICAgICAgICBpZD0icGF0aDcwMzEiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"pinta,pinta,paint\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"pinta.desktop\"\nLABEL oc.launch=\"Pinta.Pinta\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Pinta\"\nLABEL oc.displayname=\"Pinta (alpine)\"\nLABEL oc.path=\"/usr/bin/pinta\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Pinta\"\nENV APPBIN \"/usr/bin/pinta\"\nENV APP \"/usr/bin/pinta\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/pinta/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/pinta/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Pinta

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Pinta.d\n
"},{"location":"applications/pinta/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Pinta.d -t Pinta .\n
"},{"location":"applications/pinta/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Pinta > Pinta.json\ndocker image save Pinta -o Pinta.tar\nctr -n k8s.io images import Pinta.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Pinta.json\n\n
"},{"location":"applications/planner/","title":"Planner","text":""},{"location":"applications/planner/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/planner/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/planner/#ubuntu-packages","title":"Ubuntu packages","text":"
planner\n
"},{"location":"applications/planner/#path","title":"Path","text":"
/usr/bin/planner\n
"},{"location":"applications/planner/#mimetype","title":"Mimetype","text":"
application/x-planner;\n
"},{"location":"applications/planner/#file-extensions","title":"File extensions","text":"

\"mpp;mpx\"

"},{"location":"applications/planner/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"mpp;mpx\"

"},{"location":"applications/planner/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/planner/#wm_class","title":"WM_CLASS","text":"
planner.Planner\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/planner/#json-dump","title":"JSON dump","text":"

json source file planner.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"planner\",\n    \"icon\": \"planner.svg\",\n    \"launch\": \"planner.Planner\",\n    \"name\": \"Planner\",\n    \"path\": \"/usr/bin/planner\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"application/x-planner;\",\n    \"fileextensions\": \"mpp;mpx\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"legacyfileextensions\": \"mpp;mpx\"\n}\n
"},{"location":"applications/planner/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output planner.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/planner.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @planner.d.3.0.json\n\n
"},{"location":"applications/planner/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends planner && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"planner.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDQ5MCA0OTAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ5MCA0OTA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxnPg0KCQk8ZyBpZD0iWE1MSURfODFfIj4NCgkJCTxnPg0KCQkJCTxwb2x5Z29uIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiBwb2ludHM9IjQ4MCwyOTcuNSA0MTUsMzYyLjUgNDE1LDI5Ny41IAkJCQkiLz4NCgkJCQk8cG9seWdvbiBzdHlsZT0iZmlsbDojRkZGRkZGOyIgcG9pbnRzPSI0ODAsNTIuNSA0ODAsMjk3LjUgNDE1LDI5Ny41IDQxNSwzNjIuNSAxMCwzNjIuNSAxMCw1Mi41IAkJCQkiLz4NCgkJCTwvZz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiBkPSJNNDkwLDUyLjVjMC01LjUyMi00LjQ3Ny0xMC0xMC0xMEgxMGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMHYzMTBjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGg0MDVsMCwwDQoJCQkJYzIuNjAyLTAuMDAxLDUuMTU5LTEuMDE2LDcuMDcxLTIuOTI5bDY1LTY1YzEuOTEyLTEuOTEzLDIuOTA0LTQuNDcsMi45MDUtNy4wNzFINDkwVjUyLjV6IE00MTUsMjg3LjVjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTANCgkJCQl2NTVIMjB2LTI5MGg0NTB2MjI1SDQxNXogTTQyNSwzMzguMzU3VjMwNy41aDMwLjg1OEw0MjUsMzM4LjM1N3oiLz4NCgkJPC9nPg0KCTwvZz4NCgk8Zz4NCgkJPGcgaWQ9IlhNTElEXzgyXyI+DQoJCQk8Zz4NCgkJCQk8cmVjdCB4PSI2MCIgeT0iOTcuNSIgc3R5bGU9ImZpbGw6I0FGQjZCQjsiIHdpZHRoPSIxMjAiIGhlaWdodD0iNjAiLz4NCgkJCQk8cmVjdCB4PSIyNTAiIHk9IjEwMi41IiBzdHlsZT0iZmlsbDojQUZCNkJCOyIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI1MCIvPg0KCQkJCTxyZWN0IHg9IjI1MCIgeT0iMTgyLjUiIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjUwIi8+DQoJCQkJPHJlY3QgeD0iMjUwIiB5PSIyNjIuNSIgc3R5bGU9ImZpbGw6I0FGQjZCQjsiIHdpZHRoPSIxMDAiIGhlaWdodD0iNTAiLz4NCgkJCTwvZz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiBkPSJNMjUwLDE2Mi41aDEwMGM1LjUyMywwLDEwLTQuNDc4LDEwLTEwdi01MGMwLTUuNTIyLTQuNDc3LTEwLTEwLTEwSDI1MGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMA0KCQkJCXYxNWgtMjVjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTB2NzVoLTgwdi0zNWg1NWM1LjUyMywwLDEwLTQuNDc4LDEwLTEwdi02MGMwLTUuNTIyLTQuNDc3LTEwLTEwLTEwSDYwYy01LjUyMywwLTEwLDQuNDc4LTEwLDEwDQoJCQkJdjYwYzAsNS41MjIsNC40NzcsMTAsMTAsMTBoNDV2NDVjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGg5MHY3MGMwLDUuNTIyLDQuNDc3LDEwLDEwLDEwaDI1djEwYzAsNS41MjIsNC40NzcsMTAsMTAsMTBoMTAwDQoJCQkJYzUuNTIzLDAsMTAtNC40NzgsMTAtMTB2LTUwYzAtNS41MjItNC40NzctMTAtMTAtMTBIMjUwYy01LjUyMywwLTEwLDQuNDc4LTEwLDEwdjIwaC0xNXYtNjBoMTV2MTBjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGgxMDANCgkJCQljNS41MjMsMCwxMC00LjQ3OCwxMC0xMHYtNTBjMC01LjUyMi00LjQ3Ny0xMC0xMC0xMEgyNTBjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTB2MjBoLTE1di02NWgxNXYxNQ0KCQkJCUMyNDAsMTU4LjAyMiwyNDQuNDc3LDE2Mi41LDI1MCwxNjIuNXogTTI2MCwxMTIuNWg4MHYzMGgtODBWMTEyLjV6IE03MCwxMDcuNWgxMDB2NDBINzBWMTA3LjV6IE0yNjAsMjcyLjVoODB2MzBoLTgwVjI3Mi41eg0KCQkJCSBNMjYwLDE5Mi41aDgwdjMwaC04MFYxOTIuNXoiLz4NCgkJPC9nPg0KCTwvZz4NCgk8Zz4NCgkJPHJlY3QgeD0iNTAiIHk9IjI0Ny41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9Ijc1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI1MCIgeT0iMjc3LjUiIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiB3aWR0aD0iNzUiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjUwIiB5PSIzMDcuNSIgc3R5bGU9ImZpbGw6IzIzMUYyMDsiIHdpZHRoPSIxMzAiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjEzNSIgeT0iMjQ3LjUiIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjM4MCIgeT0iOTIuNSIgc3R5bGU9ImZpbGw6IzIzMUYyMDsiIHdpZHRoPSIyNSIgaGVpZ2h0PSIyMCIvPg0KCTwvZz4NCgk8Zz4NCgkJPHJlY3QgeD0iNDIwIiB5PSI5Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjEyMi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjEyMi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjE1Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjE1Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjE4Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjE4Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8ZyBpZD0iWE1MSURfODNfIj4NCgkJCTxnPg0KCQkJCTxwb2x5Z29uIHN0eWxlPSJmaWxsOiNFN0VDRUQ7IiBwb2ludHM9IjQ4MCw0MTcuNSA0MjAsNDM3LjUgNDIwLDM5Ny41IAkJCQkiLz4NCgkJCQk8cmVjdCB4PSIxMCIgeT0iMzk3LjUiIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiB3aWR0aD0iNjAiIGhlaWdodD0iNDAiLz4NCgkJCQk8cmVjdCB4PSI3MCIgeT0iMzk3LjUiIHN0eWxlPSJmaWxsOiNGRkQyNDg7IiB3aWR0aD0iMzUwIiBoZWlnaHQ9IjQwIi8+DQoJCQk8L2c+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojMjMxRjIwOyIgZD0iTTQ4My4xNjIsNDA4LjAxM2wtNjAtMjBjLTEuMDMzLTAuMzQ0LTIuMS0wLjQ5OC0zLjE2Mi0wLjQ5OFYzODcuNUgxMGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMHY0MA0KCQkJCWMwLDUuNTIyLDQuNDc3LDEwLDEwLDEwaDQxMGwwLDBoMC4wMDFjMS4wNjEsMCwyLjEyOS0wLjE2OSwzLjE2MS0wLjUxM2w2MC0yMGM0LjA4My0xLjM2MSw2LjgzOC01LjE4Myw2LjgzOC05LjQ4Nw0KCQkJCUM0OTAsNDEzLjE5Niw0ODcuMjQ2LDQwOS4zNzQsNDgzLjE2Miw0MDguMDEzeiBNNjAsNDI3LjVIMjB2LTIwaDQwVjQyNy41eiBNNDEwLDQwNy41djIwSDgwdi0yMEg0MTB6IE00MzAsNDIzLjYyNnYtMTIuMjUyDQoJCQkJbDE4LjM3Nyw2LjEyNkw0MzAsNDIzLjYyNnoiLz4NCgkJPC9nPg0KCTwvZz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K\"\nLABEL oc.keyword=\"planner\"\nLABEL oc.cat=\"office\"\nLABEL oc.launch=\"planner.Planner\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Planner\"\nLABEL oc.displayname=\"Planner\"\nLABEL oc.path=\"/usr/bin/planner\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-planner;\"\nLABEL oc.fileextensions=\"mpp;mpx\"\nLABEL oc.legacyfileextensions=\"mpp;mpx\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Planner\"\nENV APPBIN \"/usr/bin/planner\"\nENV APP \"/usr/bin/planner\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/planner/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/planner/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Planner

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Planner.d\n
"},{"location":"applications/planner/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Planner.d -t Planner .\n
"},{"location":"applications/planner/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Planner > Planner.json\ndocker image save Planner -o Planner.tar\nctr -n k8s.io images import Planner.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Planner.json\n\n
"},{"location":"applications/postman/","title":"postman","text":""},{"location":"applications/postman/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/postman/#displayname","title":"Displayname","text":"
Postman\n
"},{"location":"applications/postman/#path","title":"Path","text":"
/usr/local/bin/Postman/app/Postman\n
"},{"location":"applications/postman/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/postman/#wm_class","title":"WM_CLASS","text":"
postman.Postman\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/postman/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin  libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\n
"},{"location":"applications/postman/#json-dump","title":"JSON dump","text":"

json source file postman.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin  libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\",\n        \"RUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\"\n    ],\n    \"cat\": \"development\",\n    \"debpackage\": \"\",\n    \"installrecommends\": false,\n    \"icon\": \"circle_postman.svg\",\n    \"keyword\": \"http,post,json\",\n    \"launch\": \"postman.Postman\",\n    \"displayname\": \"Postman\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"postman\",\n    \"path\": \"/usr/local/bin/Postman/app/Postman\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\"\n}\n
"},{"location":"applications/postman/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output postman.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/postman.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @postman.d.3.0.json\n\n
"},{"location":"applications/postman/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin  libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\nLABEL oc.icon=\"circle_postman.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMjEiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijk5LjAzNiIgeDI9Ijk5LjAzNiIgeTE9Ii0uNTA0NzIiIHkyPSIxOTkuODQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjMgMCAwIC4zIDIgMi4wMDE1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBpZD0ic3RvcDIiIHN0b3AtY29sb3I9IiNmZjUxMjIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDQiIHN0b3AtY29sb3I9IiNmZmFmMjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI3IiBzdGREZXZpYXRpb249IjE0LjA1OTg2MyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4NzAiIHgxPSI1MS41NzkiIHgyPSI1My4yNzEiIHkxPSItMzYuOTUxIiB5Mj0iNzcuNjQ3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODY0IiBzdG9wLWNvbG9yPSIjZmVlMGQ1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A4NjYiIHN0b3AtY29sb3I9IiNmYmZhYmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyODg4IiB4PSItLjA0OCIgeT0iLS4wNDgiIHdpZHRoPSIxLjA5NiIgaGVpZ2h0PSIxLjA5NiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjg5MCIgc3RkRGV2aWF0aW9uPSIyLjU0OTkxNjMiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgaWQ9ImNpcmNsZTIzIiB0cmFuc2Zvcm09Im1hdHJpeCguMDY0MDEyIDAgMCAuMDY0MDEyIC0uNzQyMjYgLTIuNjIpIiBjeD0iNTExLjUiIGN5PSI1NDAuODYiIHI9IjQ2OC42NiIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjYyMiIvPgogPGNpcmNsZSBpZD0iY2lyY2xlMjUiIGN4PSIzMiIgY3k9IjMyLjAwMiIgcj0iMzAiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2EpIi8+CiA8ZyBpZD0iZzg3NCIgdHJhbnNmb3JtPSJtYXRyaXgoLjM3NjQ5IDAgMCAuMzc2NDkgMTEuNzgzIDIzLjg2KSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjg4OCkiIG9wYWNpdHk9Ii4xNSI+CiAgPHBhdGggaWQ9InBhdGg4NzIiIHRyYW5zZm9ybT0ibWF0cml4KDIuNjU2MSAwIDAgMi42NTYxIC0zMS4yOTcgLTYzLjM3NCkiIGQ9Im0zMS4zODkgOC4wMDU5Yy0xMS42NDggMC4yNzA0MS0yMS42NjMgOS4wMjE3LTIzLjE5MSAyMC45MzQtMS42ODYzIDEzLjE0NCA3LjU5NjEgMjUuMTc3IDIwLjc0IDI2Ljg2MyAxMy4xNDQgMS42ODYzIDI1LjE2NS03LjU5NDEgMjYuODY1LTIwLjczOCAxLjY4NjMtMTMuMTQ0LTcuNTk1My0yNS4xNzktMjAuNzU0LTI2Ljg2NS0xLjIzMjMtMC4xNTk0NC0yLjQ1NTItMC4yMjEzMy0zLjY2MDItMC4xOTMzNnptMTEuODU5IDkuMDI3M2MwLjg1NTc0LTAuMDM2MDMxIDEuNzI0MSAwLjIzMjEgMi40Mzc1IDAuODA4NTlsLTMuMjI4NSAzLjIxMjljLTAuMDg2NDc1IDAuMTAwODktMC4wODY0NzUgMC4yNDQ4MSAwIDAuMzQ1N2wyLjUwNzggMi40OTQxYy0xLjQxMjQgMC42OTE4LTMuMTEzNiAwLjQwMzQ3LTQuMjA5LTAuNzIwN2wwLjAxMzY3MiAwLjAyOTI5N2MtMS4zOTgtMS40NTU3LTEuMzQwNC0zLjc2MjEgMC4xMTUyNC01LjE2MDIgMC42NjI5Ny0wLjYzNDE1IDEuNTA3NS0wLjk3Mzc0IDIuMzYzMy0xLjAwOTh6bTIuNzgzMiAxLjEzODdjMS4zMjU5IDEuNDI2OCAxLjI4MjggMy42NDc3LTAuMTE1MjMgNS4wMzEyLTAuMTcyOTUgMC4xNTg1NC0wLjM0NzA1IDAuMzE3NTYtMC41NDg4MyAwLjQ0NzI3bC0yLjQwNjItMi40MDgyIDMuMDcwMy0zLjA3MDN6bS0wLjEyMTA5IDEuODUzNWMtMC4wNTk0NTEtMC4wMTA4MS0wLjEyMzk5LTguNzRlLTQgLTAuMTgxNjQgMC4wMzUxNTYtMC4xMjk3MSAwLjA1NzY1Mi0wLjIwMjE4IDAuMjE1OTktMC4xNDQ1MyAwLjM0NTcgMCAwLjAxNDQyIDAuMDEzNjcyIDAuMDE0ODc3IDAuMDEzNjcyIDAuMDI5Mjk3IDAuMTQ0MTIgMC4yODgyNSAwLjExNjU4IDAuNjQ3NTctMC4wOTk2MDkgMC44OTI1OC0wLjEwMDg5IDAuMTAwODktMC4xMTY1MSAwLjI3NDExLTAuMDE1NjI1IDAuMzc1bDAuMDE1NjI1IDAuMDE1NjI1YzAuMDU3NjUgMC4wMTQ0MiAwLjEyOTg1IDAuMDE0NDIgMC4xODc1IDAgMC4wNzIwNjIgMCAwLjE1NzkzLTAuMDQzOTEgMC4yMDExNy0wLjEwMTU2IDAuMzYwMzEtMC40MTc5NiAwLjQzMTMtMS4wMDggMC4xNzE4OC0xLjQ5OC0wLjAzNjAzMS0wLjA1MDQ0NS0wLjA4ODk4Ni0wLjA4Mjk0MS0wLjE0ODQ0LTAuMDkzNzV6bS03LjI0NjEgMi41MTc2YzAuNTE1OTIgMC4wNDE2NjEgMC45MjA5NyAwLjI4NTcgMS4zMjgxIDAuNjE3MTktMC40NDY3OSAwLjAxNDQyLTAuODY0NTcgMC4xODY4My0xLjE4MTYgMC41MDM5MWwtOC45MDgyIDguOTA2Mi0xLjkwMjMtMS45MDIzYzYuNTcyMS02LjU2MTMgOS4xMTYzLTguMjUgMTAuNjY0LTguMTI1em0xLjM1NzQgMS4xNjhjMC4zMTcwOCAwIDAuNjMzODkgMC4xMTc2NiAwLjg3ODkxIDAuMzU1NDcgMC4yNDUwMSAwLjI0NTAxIDAuMzczNzkgMC41NzY3MSAwLjM1OTM4IDAuOTA4Mi0wLjAxNDQxMiAwLjM0NTktMC4xNTg1NCAwLjY2MzkzLTAuNDE3OTcgMC44OTQ1M2wtOS4zODI4IDguMjczNC0xLjE5NTMtMS4yNTM5IDguODc3LTguODIyM2MwLjI0NTAxLTAuMjM3OCAwLjU2Mzc4LTAuMzU1NDcgMC44ODA4Ni0wLjM1NTQ3em0xLjM4MjggMi4yMzA1Yy0wLjMwMjY2IDIuNjgwNy00LjA3ODEgNi40ODU0LTcuOTU1MSAxMC4xODlsLTEuNjcxOS0xLjY3MTkgOS4zODA5LTguMjU3OGMwLjA4NjQ3NS0wLjA3MjA2MSAwLjE3NDAzLTAuMTU4ODggMC4yNDYwOS0wLjI1OTc3em0tMTMuNzUgNS4wMTU2IDEuNzczNCAxLjgxNjQtNC4wMjE1IDAuODYzMjhjLTAuMDg2NDc1IDAuMDE0NDE5LTAuMTczMDktMC4wNDI0MzQtMC4xODc1LTAuMTI4OTEtMC4wMTQ0MTItMC4wNTc2NTItMi42OWUtNCAtMC4xMDEyOSAwLjA0Mjk2OS0wLjE0NDUzbDAuMDQyOTY5LTAuMDU2NjQgMi4zNDk2LTIuMzQ5NnptMi4yNzczIDIuMzQ5NiAwLjk5NDE0IDAuOTIxODgtMi4yMDUxIDAuNTYyNWMtMC4wNDMyMzcgMC4wMjg4MzktMC4wODU2NjkgMC4wMjg4MzktMC4xMjg5MSAwLTAuMDI4ODI0LTAuMDQzMjQtMC4wMjg4MjQtMC4xMDEzIDAtMC4xNDQ1M2wxLjMzOTgtMS4zMzk4em0xLjQxMjEgMS4zNjkxIDEuNzQ0MSAxLjc0MjJjLTMuMTEzMSAyLjU5NDItNi41NDI0IDQuODAxLTEwLjIwMyA2LjU0NDl2MC4wMjczNDNoLTAuMDE1NjI1Yy0wLjE4NzM2IDAuMTAwODgtMC4yODczOCAwLjMwNDA5LTAuMjQ0MTQgMC41MDU4NmwwLjQwMjM0IDEuNzI4NWMwLjAyODgyNCAwLjExNTMtMC4wMjg3NTkgMC4yMzE0MS0wLjExNTI0IDAuMjg5MDYtMC4wODY0NzUgMC4wNzIwNjQtMC4yMTUwNSAwLjA3MjA2NC0wLjI4NzExIDBsLTIuNDUxMi0yLjUyMzQgNy41MjM0LTcuNTM3MSAzLjY0NjUtMC43NzczNHptLTExLjU1OSA4LjY3NTggMi40NTEyIDIuNDM1NS00LjIwOS0wLjI3MzQ0Yy0wLjA1NzY1Mi0wLjAxNDQyLTAuMTE2NDUtMC4wNTgzMjMtMC4xMzA4Ni0wLjEwMTU2LTAuMDE0NDE5LTAuMDU3NjQ4LTAuMDE0NDE5LTAuMTE0OTYgMC0wLjE1ODJsMS44ODg3LTEuOTAyM3oiIG9wYWNpdHk9IjEiIHN0cm9rZS13aWR0aD0iLjE0NDEyIi8+CiA8L2c+CiA8ZyBpZD0iZzUzIiB0cmFuc2Zvcm09Im1hdHJpeCguMzc2NDkgMCAwIC4zNzY0OSAxMS43ODMgMjMuODYpIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50ODcwKSI+CiAgPHBhdGggaWQ9InBhdGgyMiIgdHJhbnNmb3JtPSJtYXRyaXgoMi42NTYxIDAgMCAyLjY1NjEgLTMxLjI5NyAtNjMuMzc0KSIgZD0ibTMxLjM4OSA4LjAwNTljLTExLjY0OCAwLjI3MDQxLTIxLjY2MyA5LjAyMTctMjMuMTkxIDIwLjkzNC0xLjY4NjMgMTMuMTQ0IDcuNTk2MSAyNS4xNzcgMjAuNzQgMjYuODYzIDEzLjE0NCAxLjY4NjMgMjUuMTY1LTcuNTk0MSAyNi44NjUtMjAuNzM4IDEuNjg2My0xMy4xNDQtNy41OTUzLTI1LjE3OS0yMC43NTQtMjYuODY1LTEuMjMyMy0wLjE1OTQ0LTIuNDU1Mi0wLjIyMTMzLTMuNjYwMi0wLjE5MzM2em0xMS44NTkgOS4wMjczYzAuODU1NzQtMC4wMzYwMzEgMS43MjQxIDAuMjMyMSAyLjQzNzUgMC44MDg1OWwtMy4yMjg1IDMuMjEyOWMtMC4wODY0NzUgMC4xMDA4OS0wLjA4NjQ3NSAwLjI0NDgxIDAgMC4zNDU3bDIuNTA3OCAyLjQ5NDFjLTEuNDEyNCAwLjY5MTgtMy4xMTM2IDAuNDAzNDctNC4yMDktMC43MjA3bDAuMDEzNjcyIDAuMDI5Mjk3Yy0xLjM5OC0xLjQ1NTctMS4zNDA0LTMuNzYyMSAwLjExNTI0LTUuMTYwMiAwLjY2Mjk3LTAuNjM0MTUgMS41MDc1LTAuOTczNzQgMi4zNjMzLTEuMDA5OHptMi43ODMyIDEuMTM4N2MxLjMyNTkgMS40MjY4IDEuMjgyOCAzLjY0NzctMC4xMTUyMyA1LjAzMTItMC4xNzI5NSAwLjE1ODU0LTAuMzQ3MDUgMC4zMTc1Ni0wLjU0ODgzIDAuNDQ3MjdsLTIuNDA2Mi0yLjQwODIgMy4wNzAzLTMuMDcwM3ptLTAuMTIxMDkgMS44NTM1Yy0wLjA1OTQ1MS0wLjAxMDgxLTAuMTIzOTktOC43NGUtNCAtMC4xODE2NCAwLjAzNTE1Ni0wLjEyOTcxIDAuMDU3NjUyLTAuMjAyMTggMC4yMTU5OS0wLjE0NDUzIDAuMzQ1NyAwIDAuMDE0NDIgMC4wMTM2NzIgMC4wMTQ4NzcgMC4wMTM2NzIgMC4wMjkyOTcgMC4xNDQxMiAwLjI4ODI1IDAuMTE2NTggMC42NDc1Ny0wLjA5OTYwOSAwLjg5MjU4LTAuMTAwODkgMC4xMDA4OS0wLjExNjUxIDAuMjc0MTEtMC4wMTU2MjUgMC4zNzVsMC4wMTU2MjUgMC4wMTU2MjVjMC4wNTc2NSAwLjAxNDQyIDAuMTI5ODUgMC4wMTQ0MiAwLjE4NzUgMCAwLjA3MjA2MiAwIDAuMTU3OTMtMC4wNDM5MSAwLjIwMTE3LTAuMTAxNTYgMC4zNjAzMS0wLjQxNzk2IDAuNDMxMy0xLjAwOCAwLjE3MTg4LTEuNDk4LTAuMDM2MDMxLTAuMDUwNDQ1LTAuMDg4OTg2LTAuMDgyOTQxLTAuMTQ4NDQtMC4wOTM3NXptLTcuMjQ2MSAyLjUxNzZjMC41MTU5MiAwLjA0MTY2MSAwLjkyMDk3IDAuMjg1NyAxLjMyODEgMC42MTcxOS0wLjQ0Njc5IDAuMDE0NDItMC44NjQ1NyAwLjE4NjgzLTEuMTgxNiAwLjUwMzkxbC04LjkwODIgOC45MDYyLTEuOTAyMy0xLjkwMjNjNi41NzIxLTYuNTYxMyA5LjExNjMtOC4yNSAxMC42NjQtOC4xMjV6bTEuMzU3NCAxLjE2OGMwLjMxNzA4IDAgMC42MzM4OSAwLjExNzY2IDAuODc4OTEgMC4zNTU0NyAwLjI0NTAxIDAuMjQ1MDEgMC4zNzM3OSAwLjU3NjcxIDAuMzU5MzggMC45MDgyLTAuMDE0NDEyIDAuMzQ1OS0wLjE1ODU0IDAuNjYzOTMtMC40MTc5NyAwLjg5NDUzbC05LjM4MjggOC4yNzM0LTEuMTk1My0xLjI1MzkgOC44NzctOC44MjIzYzAuMjQ1MDEtMC4yMzc4IDAuNTYzNzgtMC4zNTU0NyAwLjg4MDg2LTAuMzU1NDd6bTEuMzgyOCAyLjIzMDVjLTAuMzAyNjYgMi42ODA3LTQuMDc4MSA2LjQ4NTQtNy45NTUxIDEwLjE4OWwtMS42NzE5LTEuNjcxOSA5LjM4MDktOC4yNTc4YzAuMDg2NDc1LTAuMDcyMDYxIDAuMTc0MDMtMC4xNTg4OCAwLjI0NjA5LTAuMjU5Nzd6bS0xMy43NSA1LjAxNTYgMS43NzM0IDEuODE2NC00LjAyMTUgMC44NjMyOGMtMC4wODY0NzUgMC4wMTQ0MTktMC4xNzMwOS0wLjA0MjQzNC0wLjE4NzUtMC4xMjg5MS0wLjAxNDQxMi0wLjA1NzY1Mi0yLjY5ZS00IC0wLjEwMTI5IDAuMDQyOTY5LTAuMTQ0NTNsMC4wNDI5NjktMC4wNTY2NCAyLjM0OTYtMi4zNDk2em0yLjI3NzMgMi4zNDk2IDAuOTk0MTQgMC45MjE4OC0yLjIwNTEgMC41NjI1Yy0wLjA0MzIzNyAwLjAyODgzOS0wLjA4NTY2OSAwLjAyODgzOS0wLjEyODkxIDAtMC4wMjg4MjQtMC4wNDMyNC0wLjAyODgyNC0wLjEwMTMgMC0wLjE0NDUzbDEuMzM5OC0xLjMzOTh6bTEuNDEyMSAxLjM2OTEgMS43NDQxIDEuNzQyMmMtMy4xMTMxIDIuNTk0Mi02LjU0MjQgNC44MDEtMTAuMjAzIDYuNTQ0OXYwLjAyNzM0M2gtMC4wMTU2MjVjLTAuMTg3MzYgMC4xMDA4OC0wLjI4NzM4IDAuMzA0MDktMC4yNDQxNCAwLjUwNTg2bDAuNDAyMzQgMS43Mjg1YzAuMDI4ODI0IDAuMTE1My0wLjAyODc1OSAwLjIzMTQxLTAuMTE1MjQgMC4yODkwNi0wLjA4NjQ3NSAwLjA3MjA2NC0wLjIxNTA1IDAuMDcyMDY0LTAuMjg3MTEgMGwtMi40NTEyLTIuNTIzNCA3LjUyMzQtNy41MzcxIDMuNjQ2NS0wLjc3NzM0em0tMTEuNTU5IDguNjc1OCAyLjQ1MTIgMi40MzU1LTQuMjA5LTAuMjczNDRjLTAuMDU3NjUyLTAuMDE0NDItMC4xMTY0NS0wLjA1ODMyMy0wLjEzMDg2LTAuMTAxNTYtMC4wMTQ0MTktMC4wNTc2NDgtMC4wMTQ0MTktMC4xMTQ5NiAwLTAuMTU4MmwxLjg4ODctMS45MDIzeiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg3MCkiIHN0cm9rZS13aWR0aD0iLjE0NDEyIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"postman,http,post,json\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"postman.Postman\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"postman\"\nLABEL oc.displayname=\"Postman\"\nLABEL oc.path=\"/usr/local/bin/Postman/app/Postman\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"postman\"\nENV APPBIN \"/usr/local/bin/Postman/app/Postman\"\nENV APP \"/usr/local/bin/Postman/app/Postman\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/postman/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/postman/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application postman

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/postman.d\n
"},{"location":"applications/postman/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f postman.d -t postman .\n
"},{"location":"applications/postman/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect postman > postman.json\ndocker image save postman -o postman.tar\nctr -n k8s.io images import postman.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @postman.json\n\n
"},{"location":"applications/powershell/","title":"powershell","text":""},{"location":"applications/powershell/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/powershell/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/powershell/#alpine-packages","title":"Alpine packages","text":"
powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\n
"},{"location":"applications/powershell/#arguments","title":"Arguments","text":"

\"--class=powershell -- /usr/bin/pwsh\"

"},{"location":"applications/powershell/#displayname","title":"Displayname","text":"
Powershell\n
"},{"location":"applications/powershell/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/powershell/#mimetype","title":"Mimetype","text":"
application/hlp;\n
"},{"location":"applications/powershell/#file-extensions","title":"File extensions","text":"

\"hlp;\"

"},{"location":"applications/powershell/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/powershell/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.powershell\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/powershell/#json-dump","title":"JSON dump","text":"

json source file powershell.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\",\n    \"icon\": \"powershell.svg\",\n    \"keyword\": \"powershell\",\n    \"launch\": \"gnome-terminal-server.powershell\",\n    \"name\": \"powershell\",\n    \"displayname\": \"Powershell\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"application/hlp;\",\n    \"fileextensions\": \"hlp;\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--class=powershell -- /usr/bin/pwsh\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/powershell/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output powershell.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/powershell.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @powershell.d.3.0.json\n\n
"},{"location":"applications/powershell/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\nLABEL oc.icon=\"powershell.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IlBvd2VyU2hlbGwiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIyMDQuNjkxcHgiIGhlaWdodD0iMTU0LjUyMXB4IiB2aWV3Qm94PSIwIDAgMjA0LjY5MSAxNTQuNTIxIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMDQuNjkxIDE1NC41MjE7IgoJIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxwYXRoIHN0eWxlPSJkaXNwbGF5Om5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMjY3MUJFOyIgZD0iTS00Ny41NDcsMjI2Ljg3MgoJCWMwLTk3LjEyOSwwLjA5NC0xOTQuMjU5LTAuMTk1LTI5MS4zODdjLTAuMDIxLTYuOTgyLDEuNDA0LTguNDExLDguMzg4LTguMzg5Yzk0LjM5NywwLjI5MiwxODguNzk4LDAuMjkyLDI4My4xOTUsMAoJCWM2Ljk4NC0wLjAyMiw4LjQxLDEuNDA3LDguMzg5LDguMzg5Yy0wLjI4OSw5Ny4xMjgtMC4xOTUsMTk0LjI1OC0wLjE5NSwyOTEuMzg3Yy0zLjIzOCwyLjAwOC02LjgzNywxLjEyOS0xMC4yNjgsMS4xMzEKCQljLTkzLjAxNSwwLjA0OS0xODYuMDMxLDAuMDQ5LTI3OS4wNDcsMEMtNDAuNzExLDIyOC4wMDEtNDQuMzEsMjI4Ljg4LTQ3LjU0NywyMjYuODcyeiIvPgoJPHBhdGggc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0UwRUFGNTsiIGQ9Ik0xMjAuMTQsMC4wMzJjMjMuMDExLTAuMDA4LDQ2LjAyMy0wLjA3OCw2OS4wMzQsMC4wMTkKCQljMTMuNjgsMC4wNTYsMTcuNTM3LDQuNjI3LDE0LjU4OCwxOC4xMzdjLTguNjM2LDM5LjU2Ni0xNy40NjYsNzkuMDkyLTI2LjQxNSwxMTguNTg5Yy0yLjgzLDEyLjQ4NC05LjMzMiwxNy41OTgtMjIuNDY1LDE3LjYzNwoJCWMtNDYuMDIzLDAuMTM3LTkyLjA0NiwwLjE1Mi0xMzguMDY4LTAuMDA2Yy0xNS4wNDMtMC4wNTMtMTktNS4xNDgtMTUuNzU5LTE5LjQwNEM5Ljg0OSw5Ni4yODcsMTguNjksNTcuNTgyLDI3LjYwMiwxOC44OTIKCQlDMzAuOTk3LDQuMTQ4LDM2LjA5OSwwLjEsNTEuMTA0LDAuMDU3Qzc0LjExNi0wLjAwOCw5Ny4xMjgsMC4wNCwxMjAuMTQsMC4wMzJ6Ii8+Cgk8cGF0aCBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMjY3MUJFOyIgZD0iTTg1LjM2NSwxNDkuODEzYy0yMy4wMTQtMC4wMDgtNDYuMDI5LDAuMDk4LTY5LjA0Mi0wLjA1MwoJCWMtMTEuNjctMC4wNzYtMTMuNzkyLTIuODMtMTEuMTY1LTE0LjI0NGM4LjkwNi0zOC43MSwxOC4wOTktNzcuMzU1LDI2LjgwNy0xMTYuMTA5QzM0LjMsOS4wMTMsMzkuMzM3LDQuNDE5LDUwLjQ3Myw0LjUyMgoJCWM0Ni4wMjQsMC40MjcsOTIuMDU2LDAuMTM3LDEzOC4wODMsMC4xODRjMTEuNTQzLDAuMDExLDEzLjQ4MSwyLjQ4LDEwLjg5LDE0LjE4N2MtOC40MTMsMzguMDA3LTE2Ljg3OSw3Ni4wMDMtMjUuNDk0LDExMy45NjUKCQljLTMuMjI0LDE0LjIwNy02LjkzOCwxNi45MTgtMjEuODg1LDE2Ljk1MUMxMjkuODMzLDE0OS44NTYsMTA3LjU5OCwxNDkuODIxLDg1LjM2NSwxNDkuODEzeiIvPgoJPHBhdGggc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZERkRGRTsiIGQ9Ik0xMDQuOTQ4LDczLjk1MWMtMS41NDMtMS44MS0zLjIzNy0zLjg5NC01LjAzMS01Ljg4NgoJCWMtMTAuMTczLTExLjMtMjAuMjU2LTIyLjY4NC0zMC42MS0zMy44MTVjLTQuNzM4LTUuMDk0LTYuMjQ4LTEwLjA0MS0wLjU1OC0xNS4wNjljNS42MjMtNC45NywxMS4xNDgtNC41MywxNi4zMDYsMS4xODgKCQljMTQuMzY1LDE1LjkxOSwyOC43MTMsMzEuODU2LDQzLjMxNiw0Ny41NTZjNS40NTIsNS44NjQsNC4xODIsOS44NTEtMS44MjMsMTQuMTk2Yy0yMy4wNDksMTYuNjgzLTQ1Ljk2OCwzMy41NDctNjguODYyLDUwLjQ0MwoJCWMtNS4xNDYsMy43OTktMTAuMDUyLDQuNzUtMTQuMjA5LTAuODYxYy00LjU4Ni02LjE4OS0wLjM0My05Ljg3MSw0LjQxNC0xMy4zMzVjMTcuMDEzLTEyLjM5MiwzMy45OTMtMjQuODMsNTAuOS0zNy4zNjYKCQlDMTAxLjE0Niw3OS4yNTYsMTA0LjUyNyw3OC4yMzgsMTA0Ljk0OCw3My45NTF6Ii8+Cgk8cGF0aCBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkNGREZEOyIgZD0iTTExMi4yMzUsMTMzLjgxOWMtNi4xOTYsMC0xMi40MDEsMC4yMTMtMTguNTgzLTAuMDY4CgkJYy00LjkzMi0wLjIyMy03LjktMi45NzktNy44MzgtOC4xNzRjMC4wNi00LjkxMiwyLjUzNi04LjYwNSw3LjQ2My04LjczOGMxMy41NDItMC4zNjMsMjcuMTA0LTAuMjg1LDQwLjY1MS0wLjAyCgkJYzQuMzA1LDAuMDg0LDcuNDgzLDIuODg5LDcuNDU3LDcuMzc1Yy0wLjAzMSw1LjE0Ni0yLjczOSw5LjEzMy04LjI1LDkuNDY1Yy02Ljk0NCwwLjQyLTEzLjkzMSwwLjEwNC0yMC44OTksMC4xMDQKCQlDMTEyLjIzNSwxMzMuNzgsMTEyLjIzNSwxMzMuOCwxMTIuMjM1LDEzMy44MTl6Ii8+CjwvZz4KPC9zdmc+\"\nLABEL oc.keyword=\"powershell,powershell\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"gnome-terminal-server.powershell\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nENV ARGS=\"--class=powershell -- /usr/bin/pwsh\"\nLABEL oc.name=\"powershell\"\nLABEL oc.displayname=\"Powershell\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/hlp;\"\nLABEL oc.fileextensions=\"hlp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"powershell\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--class=powershell -- /usr/bin/pwsh\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/powershell/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/powershell/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application powershell

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/powershell.d\n
"},{"location":"applications/powershell/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f powershell.d -t powershell .\n
"},{"location":"applications/powershell/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect powershell > powershell.json\ndocker image save powershell -o powershell.tar\nctr -n k8s.io images import powershell.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @powershell.json\n\n
"},{"location":"applications/putty-unix/","title":"putty-unix","text":""},{"location":"applications/putty-unix/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/putty-unix/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/putty-unix/#alpine-packages","title":"Alpine packages","text":"
putty\n
"},{"location":"applications/putty-unix/#displayname","title":"Displayname","text":"
Putty Unix\n
"},{"location":"applications/putty-unix/#path","title":"Path","text":"
/usr/bin/putty\n
"},{"location":"applications/putty-unix/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/putty-unix/#wm_class","title":"WM_CLASS","text":"
putty.Putty\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/putty-unix/#json-dump","title":"JSON dump","text":"

json source file putty-unix.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"args\": \"\",\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"putty\",\n    \"icon\": \"circle_putty-unix.svg\",\n    \"keyword\": \"putty,ssh,terminal\",\n    \"launch\": \"putty.Putty\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"putty-unix\",\n    \"displayname\": \"Putty Unix\",\n    \"path\": \"/usr/bin/putty\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/putty-unix/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output putty-unix.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-unix.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-unix.d.3.0.json\n\n
"},{"location":"applications/putty-unix/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update putty\nLABEL oc.icon=\"circle_putty-unix.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI1MTkuMiIgeDI9IjUxOS4yIiB5MT0iMTAyNC44IiB5Mj0iNC44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wNjM1ODYgMCAwIC4wNjM1ODMgLS41NTYxNyAtLjU1Mjg1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNjA2MDYwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQxNDE0MSIgb2Zmc2V0PSIuMDE5NTUxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTFlMWUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZyIgeD0iLS4wMzE2NTIiIHk9Ii0uMDQxOTQ3IiB3aWR0aD0iMS4wNjMzIiBoZWlnaHQ9IjEuMDgzOSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC42MTA2NTg0MiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjQwOS41NyIgeDI9IjQwOS45NCIgeTE9IjU0Mi44IiB5Mj0iNTA0LjE5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDUyMywwLDAsMS4wMjc2LC03Mi41NjgsLTguNjkzMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg2ZDBmYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNzk0ZjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMzg2LjU5IiB4Mj0iNDE0LjQ5IiB5MT0iNTMyLjk3IiB5Mj0iNTMwLjU5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC44NTcxNyAwIDAgLjg1NzE5IC0yOTEuNDMgLTQxMi4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYmViZWIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iaSIgeD0iLS4wNTk5OTgiIHk9Ii0uMDYwMDAyIiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjY5OTk5NzkyIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iNDguNSIgeDI9IjQ4LjUiIHkxPSIzOSIgeTI9IjU4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4xNzIzMSAwIDAgLjE3MDI1IDE1LjY1MSAtMTA1LjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTc2OWNjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlZTZmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgY3g9IjQwMC41NyIgY3k9IjUzMS44IiByPSIxNCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KIDxwYXRoIGQ9Im01MC4yNDkgOC4xOTMycS0zLjg1OTctMi45NzI1LTguNDQ0LTQuNTU1Ny00LjczNzItMS42MzczLTkuODAyMS0xLjYzNzNjLTE2LjU3IDAtMzAuMDAzIDEzLjQzMi0zMC4wMDMgMzAuMDAxIDAgMTUuMTU4IDExLjI0NSAyNy42ODQgMjUuODQ1IDI5LjcwOSAwLjcxMjE2IDAuMDk4NTUgMS40MzM5IDAuMTc0ODUgMi4xNTg3IDAuMjE5MzYgMC42NjEyOCAwLjA0MTMzIDEuMzI1OCAwLjA2OTk0IDEuOTk5OCAwLjA2OTk0IDE2LjU2NyAwIDI5Ljk5Ny0xMy40MzIgMjkuOTk3LTI5Ljk5OSAwLTEuMzA5OC0wLjA4MjY2LTIuNjAzNy0wLjI0NDgxLTMuODY1OC0wLjE4NzU4LTEuNDc1MS0wLjQ5Mjc5LTIuOTA5LTAuODgzODctNC4zMDQ2cS0xLjMyODktNC42ODkyLTQuMDgyMi04LjcyNjUtMi43MjE1LTMuOTc3MS02LjU0MDEtNi45MTEyeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIuOTk3MjQiLz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC40NjU4NiAtLjA1NTU2NiAuMDU3MjU4IC40NTIwOSAtMjExLjQxIC0xNTYuNjMpIj4KICA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjczNSAuMjEzMjUgLS4yMTMyNSAxLjczNSAtNDYuMTE3IC01MjkuNzYpIiB4PSIzMzQuMjMiIHk9IjUxMy4xMyIgd2lkdGg9IjQ2LjMwMyIgaGVpZ2h0PSIzNC45MzkiIHJ5PSIxLjY0NDIiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWxsPSJ1cmwoI2EpIi8+CiAgPGcgZmlsbD0iI2Q1ZmZmZiI+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ5OC4zNSIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODkuODMiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDgxLjMxIiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjQ2NTg2IC0uMDU1NTY2IC4wNTcyNTggLjQ1MjA5IC0yMDYuNDEgLTE0OS42MykiPgogIDxyZWN0IHRyYW5zZm9ybT0ibWF0cml4KDEuNzM1IC4yMTMyNSAtLjIxMzI1IDEuNzM1IC00Ni4xMTcgLTUyOS43NikiIHg9IjMzNC4yMyIgeT0iNTEzLjEzIiB3aWR0aD0iNDYuMzAzIiBoZWlnaHQ9IjM0LjkzOSIgcnk9IjEuNjQ0MiIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuNzUiLz4KICA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjczNSAuMjEzMjUgLS4yMTMyNSAxLjczNSAtNDYuMTE3IC01MjkuNzYpIiB4PSIzMzQuMjMiIHk9IjUxMy4xMyIgd2lkdGg9IjQ2LjMwMyIgaGVpZ2h0PSIzNC45MzkiIHJ5PSIxLjY0NDIiIGZpbGw9InVybCgjYSkiLz4KICA8ZyBmaWxsPSIjZDVmZmZmIj4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDk4LjM1IiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ4OS44MyIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODEuMzEiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICA8L2c+CiA8L2c+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KC44NTQwOSAuMDcyNTY5IC0uMDcyODMgLjg1NDA5IC0yNTUuMzcgLTQzNS4yNikiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNpKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguOTk2NDEgLjA4NDY2MiAtLjA4NDk2NCAuOTk2MzggMCAwKSIgZD0ibTYzLjkyOSA0My43ODFhMTIgMTIuMDAxIDAgMCAxLTEyIDEyLjAwMSAxMiAxMi4wMDEgMCAwIDEtMTItMTIuMDAxIDEyIDEyLjAwMSAwIDAgMSAxMi0xMi4wMDEgMTIgMTIuMDAxIDAgMCAxIDEyIDEyLjAwMXoiIGZpbGw9InVybCgjaCkiLz4KIDxwYXRoIGQ9Im01MCAzOS03IDExaDZsLTIgOCA3LTExaC02eiIgZmlsbD0idXJsKCNkKSIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"putty-unix,putty,ssh,terminal\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"putty.Putty\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"putty-unix\"\nLABEL oc.displayname=\"Putty Unix\"\nLABEL oc.path=\"/usr/bin/putty\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"putty-unix\"\nENV APPBIN \"/usr/bin/putty\"\nENV APP \"/usr/bin/putty\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/putty-unix/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/putty-unix/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application putty-unix

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-unix.d\n
"},{"location":"applications/putty-unix/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f putty-unix.d -t putty-unix .\n
"},{"location":"applications/putty-unix/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect putty-unix > putty-unix.json\ndocker image save putty-unix -o putty-unix.tar\nctr -n k8s.io images import putty-unix.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-unix.json\n\n
"},{"location":"applications/putty-wine/","title":"putty-wine","text":""},{"location":"applications/putty-wine/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.minimal

"},{"location":"applications/putty-wine/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/putty-wine/#alpine-packages","title":"Alpine packages","text":"
wine\n
"},{"location":"applications/putty-wine/#arguments","title":"Arguments","text":"

\"/composer/bin/putty.exe\"

"},{"location":"applications/putty-wine/#displayname","title":"Displayname","text":"
Putty Wine (alpine)\n
"},{"location":"applications/putty-wine/#path","title":"Path","text":"
/usr/bin/wine64\n
"},{"location":"applications/putty-wine/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/putty-wine/#wm_class","title":"WM_CLASS","text":"
putty.exe.putty.exe\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/putty-wine/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN mkdir -p /composer/bin\nRUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\n
"},{"location":"applications/putty-wine/#json-dump","title":"JSON dump","text":"

json source file putty-wine.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.minimal\",\n    \"preruncommands\": [\n        \"ENV WINEARCH=win64\",\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n        \"RUN mkdir -p /composer/bin\",\n        \"RUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\"\n    ],\n    \"args\": \"/composer/bin/putty.exe\",\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"wine\",\n    \"icon\": \"putty.svg\",\n    \"keyword\": \"wine,putty,ssh,terminal\",\n    \"launch\": \"putty.exe.putty.exe\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"putty-wine\",\n    \"displayname\": \"Putty Wine (alpine)\",\n    \"path\": \"/usr/bin/wine64\"\n}\n
"},{"location":"applications/putty-wine/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output putty-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-wine.d.3.0.json\n\n
"},{"location":"applications/putty-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN mkdir -p /composer/bin\nRUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"putty.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMjAwMTA5MDQvL0VOIgoiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPgo8IS0tIENyZWF0ZWQgd2l0aCBJbmtzY2FwZSAoaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvKSAtLT48c3ZnIGhlaWdodD0iMTI4LjAwMDAwcHQiIGlkPSJzdmcxMTU4IiBpbmtzY2FwZTp2ZXJzaW9uPSIwLjM5Y3ZzIiBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS9hbmR5L0Rlc2t0b3AvZXRpcXVldHRlLWljb25zLTAuMy9zY2FsYWJsZS9hcHBzIiBzb2RpcG9kaTpkb2NuYW1lPSJnbm9tZS10ZXJtaW5hbC5zdmciIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiIHdpZHRoPSIxMjguMDAwMDBwdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiPgogIDxtZXRhZGF0YT4KICAgIDxyZGY6UkRGIHhtbG5zOmNjPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPGNjOldvcmsgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzp0aXRsZT5FdGlxdWV0dGUgSWNvbnM8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkZXNjcmlwdGlvbj48L2RjOmRlc2NyaXB0aW9uPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+aGFzaDwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPjwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPmFwcGxpY2F0aW9uPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+Y29tcHV0ZXI8L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5pY29uczwvcmRmOmxpPgogICAgICAgICAgPC9yZGY6QmFnPgogICAgICAgIDwvZGM6c3ViamVjdD4KICAgICAgICA8ZGM6cHVibGlzaGVyPgogICAgICAgICAgPGNjOkFnZW50IHJkZjphYm91dD0iaHR0cDovL3d3dy5vcGVuY2xpcGFydC5vcmciPgogICAgICAgICAgICA8ZGM6dGl0bGU+QW5keSBGaXR6c2ltb248L2RjOnRpdGxlPgogICAgICAgICAgPC9jYzpBZ2VudD4KICAgICAgICA8L2RjOnB1Ymxpc2hlcj4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkFuZHkgRml0enNpbW9uPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpyaWdodHM+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZT5BbmR5IEZpdHpzaW1vbjwvZGM6dGl0bGU+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6cmlnaHRzPgogICAgICAgIDxkYzpkYXRlPjwvZGM6ZGF0ZT4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+CiAgICAgICAgPGNjOmxpY2Vuc2UgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9QdWJsaWNEb21haW4iLz4KICAgICAgICA8ZGM6bGFuZ3VhZ2U+ZW48L2RjOmxhbmd1YWdlPgogICAgICA8L2NjOldvcms+CiAgICAgIDxjYzpMaWNlbnNlIHJkZjphYm91dD0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvUHVibGljRG9tYWluIj4KICAgICAgICA8Y2M6cGVybWl0cyByZGY6cmVzb3VyY2U9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjL1JlcHJvZHVjdGlvbiIvPgogICAgICAgIDxjYzpwZXJtaXRzIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGlzdHJpYnV0aW9uIi8+CiAgICAgICAgPGNjOnBlcm1pdHMgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EZXJpdmF0aXZlV29ya3MiLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMgaWQ9ImRlZnMxMTYwIj4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQxNzIyIj4KICAgICAgPHN0b3AgaWQ9InN0b3AxNzIzIiBvZmZzZXQ9IjAuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogICAgICA8c3RvcCBpZD0ic3RvcDE3MjQiIG9mZnNldD0iMS4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjAwMDAwMDA7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE3MjEiIHgxPSIwLjg1NzE0Mjg3IiB4Mj0iMC42NTUxNzI0MSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTcyMiIgeTE9Ii0wLjQ2MDkzNzUwIiB5Mj0iMC43MzQzNzUwMCIvPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MTgiPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MTkiIG9mZnNldD0iMC4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjcwMDU2NDk4OyIvPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MjAiIG9mZnNldD0iMS4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjAwMDAwMDA7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDMwNDUiIHgxPSIwLjY3NzI5MDg2IiB4Mj0iMC41MDU5NzYwOCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTUxOCIgeTE9Ii0xLjEyOTAzMjMiIHkyPSIwLjg3MDk2Nzc1Ii8+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTU0NCI+CiAgICAgIDxzdG9wIGlkPSJzdG9wMTU0NSIgb2Zmc2V0PSIwLjAwMDAwMDAiIHN0eWxlPSJzdG9wLWNvbG9yOiMzNzUzNjc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTQ3IiBvZmZzZXQ9IjAuNDMxNTY0MjQiIHN0eWxlPSJzdG9wLWNvbG9yOiMzZTZhOGM7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTQ2IiBvZmZzZXQ9IjEuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6IzhjYzZlZTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQzMDQ2IiB4MT0iMC43MDUzMTM5OCIgeDI9IjAuNzM0Mjk5NTQiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE1NDQiIHkxPSItMC4zNTkzNzUwMCIgeTI9IjEuNDM3NTAwMCIvPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MTEiPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MTIiIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwMDtzdG9wLW9wYWNpdHk6MTsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTEzIiBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmY7c3RvcC1vcGFjaXR5OjE7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MzciIHgxPSIwLjc3MjAyMDcwIiB4Mj0iMC42MDYyMTc2MiIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTUxMSIgeTE9IjMuNzk1NDU0NSIgeTI9Ii0wLjE0MzkzOTM5Ii8+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTgwNiI+CiAgICAgIDxzdG9wIGlkPSJzdG9wMTgwNyIgb2Zmc2V0PSIwLjAwMDAwMDAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNDA3ODQzMTQ7Ii8+CiAgICAgIDxzdG9wIGlkPSJzdG9wMzI3NiIgb2Zmc2V0PSIwLjY0Nzc3NzgwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjA3OTA5NjA0MjsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxODA4IiBvZmZzZXQ9IjEuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MC4wMDAwMDAwOyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudCBjeD0iMC40OTAzMjI1OSIgY3k9IjAuNTA2NDkzNTEiIGZ4PSIwLjU0MzU1NDAxIiBmeT0iMC4xOTIzMDc3MCIgaWQ9InJhZGlhbEdyYWRpZW50MTUyOCIgcj0iMC40NjAxNDI4OCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTgwNiIvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3IGJvcmRlcmNvbG9yPSIjNjY2NjY2IiBib3JkZXJvcGFjaXR5PSIxLjAiIGlkPSJiYXNlIiBpbmtzY2FwZTpjeD0iMTY3LjIxNDkwIiBpbmtzY2FwZTpjeT0iMzAuNzMyNTc4IiBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIiBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIiBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI1OTciIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzgzIiBpbmtzY2FwZTp3aW5kb3cteD0iLTUiIGlua3NjYXBlOndpbmRvdy15PSI3MSIgaW5rc2NhcGU6em9vbT0iMS41NDU3MzkxIiBwYWdlY29sb3I9IiNmZmZmZmYiLz4KICA8cGF0aCBkPSJNIDgyLjA1NTMxMyAxNzUuODM1MjQgQSA1Ni4xNDMxMDggNTYuMTQzMTA4IDAgMSAwIC0zMC4yMzA5MDQsMTc1LjgzNTI0IEEgNTYuMTQzMTA4IDU2LjE0MzEwOCAwIDEgMCA4Mi4wNTUzMTMgMTc1LjgzNTI0IHoiIGlkPSJwYXRoMjY3MyIgc29kaXBvZGk6Y3g9IjI1LjkxMjIwNSIgc29kaXBvZGk6Y3k9IjE3NS44MzUyNCIgc29kaXBvZGk6cng9IjU2LjE0MzEwOCIgc29kaXBvZGk6cnk9IjU2LjE0MzEwOCIgc29kaXBvZGk6dHlwZT0iYXJjIiBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTUyOCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0OyIgdHJhbnNmb3JtPSJtYXRyaXgoMS41ODcxNzQsMC4wMDAwMDAsMC4wMDAwMDAsMC4zNTc5NzYsNDcuOTI2NzIsNTguMDE0MDQpIi8+CiAgPHBhdGggZD0iTSA4Mi4wNTUzMTMgMTc1LjgzNTI0IEEgNTYuMTQzMTA4IDU2LjE0MzEwOCAwIDEgMCAtMzAuMjMwOTA0LDE3NS44MzUyNCBBIDU2LjE0MzEwOCA1Ni4xNDMxMDggMCAxIDAgODIuMDU1MzEzIDE3NS44MzUyNCB6IiBpZD0icGF0aDI0NDkiIHNvZGlwb2RpOmN4PSIyNS45MTIyMDUiIHNvZGlwb2RpOmN5PSIxNzUuODM1MjQiIHNvZGlwb2RpOnJ4PSI1Ni4xNDMxMDgiIHNvZGlwb2RpOnJ5PSI1Ni4xNDMxMDgiIHNvZGlwb2RpOnR5cGU9ImFyYyIgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE1MjgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDsiIHRyYW5zZm9ybT0ibWF0cml4KDEuMzIzNTEyLDAuMDAwMDAwLDAuMDAwMDAwLDAuMzE0OTU1LDM4LjI2MDYwLDYxLjcxNDQwKSIvPgogIDxwYXRoIGQ9Ik0gMjQuNDA3Mzc4LDIxLjEyNzQ5MCBDIDE3LjU1NjcwMSwyMS4xNjQxMzEgOS40MjM5MDM2LDI5LjQ4NTU4NyAxMC40OTIzODEsMzYuMjUyNDk3IEwgMjEuMzgyMzg1LDEwNS4yMjI1MiBDIDIyLjI1MjMyNCwxMTAuNzMyMTAgMjYuNjk1MDExLDExNy45OTk0NyAzMi4yNzIzODksMTE3LjkyNzUyIEwgMTI2LjA0NzM3LDExNi43MTc1MiBDIDEzMS4xODg0NSwxMTYuNjUxMTggMTM2LjQzNjc1LDExMS40NTM3NCAxMzcuNTQyMzQsMTA2LjQzMjUyIEwgMTUyLjA2MjM3LDQwLjQ4NzQ5OCBDIDE1My44MzE4NCwzMi40NTEwOTMgMTQ1Ljc3MTE4LDIwLjQ3ODQ4MiAxMzcuNTQyMzQsMjAuNTIyNDg5IEwgMjQuNDA3Mzc4LDIxLjEyNzQ5MCB6ICIgaWQ9InBhdGgyNjUzIiBzb2RpcG9kaTpub2RldHlwZXM9ImN6enp6enp6eiIgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDE1MzcpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoyLjEyNTAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogIDxwYXRoIGQ9Ik0gMjMuODAyNDA3LDM1LjY0NzQ5MyBMIDMzLjQ4MjM2OSwxMDUuODI3NTEgTCAxMzAuMjgyNDIsMTAyLjgwMjUyIEwgMTM4Ljc1MjQ5LDM1LjA0MjUwMiBMIDIzLjgwMjQwNywzNS42NDc0OTMgeiAiIGlkPSJwYXRoMjY1NCIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDMwNDYpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50MzA0NSk7c3Ryb2tlLXdpZHRoOjEuMTQ3MTk1MjtzdHJva2Utb3BhY2l0eTowLjMxMjg0OTEzOyIvPgogIDxwYXRoIGQ9Ik0gMjMuODgyNTE4LDIwLjY1MDQ2OSBDIDE0LjkxMjc4MSwyMC42ODM4OTkgMTEuMzE5MDc5LDI2Ljk4OTE1NiAxMi4zODc1NTYsMzIuOTcwNTAwIEMgMTcuODgyOTk2LDI3LjU3NjY2NyAyMC4wNTA4MzEsMjUuNDY0NTA5IDI1Ljg0ODc4MSwyNS4zNDE1MTQgTCAxMzAuMzYyNTEsMjQuNDQ1NDc2IEMgMTQxLjU1NTA0LDIzLjY3MjQxOSAxNDIuMjQxOTMsMjcuMDk4MzQ0IDE0OS40MjAwMCwzNC40NDYzNDAgQyAxNDkuNzQzNTQsMzAuOTA1NzY5IDE0NS4yNDYzMiwyMC4xOTgxMjQgMTM3LjAxNzQ3LDIwLjIyODc5NyBMIDIzLjg4MjUxOCwyMC42NTA0NjkgeiAiIGlkPSJwYXRoMjY1NSIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY3p6IiBzdHlsZT0iZmlsbDojMTkxOTE5O2ZpbGwtb3BhY2l0eTowLjIwNzU0NzE3O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoyLjEyNTAwMDA7Ii8+CiAgPHBhdGggZD0iTSAyMy4zNTg4MzksMzEuNzkxMjk2IEMgMjMuMzU4ODM5LDMxLjc5MTI5NiAzOC4xMTc2NjgsNzEuMjE5MTU3IDYyLjAzODkwOCw2NS4zNjE2NTcgQyA4NS45NjAxNDksNTkuNTA0MTU3IDExNy40MzU0OSw1NS45ODk2NjQgMTI0Ljk4OTU1LDc4LjI0ODE4MSBDIDEzMi41NDM2NCwxMDAuNTA2NjkgMTMwLjAyNTYyLDk5LjMzNTE4NyAxMzAuMDI1NjIsOTkuMzM1MTg3IEwgMzMuNTM2NDM2LDk4LjE2MzY4NyBMIDIzLjM1ODgzOSwzMS43OTEyOTYgeiAiIGlkPSJwYXRoMjY1OCIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxNzIxKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7Ii8+PHRleHQgaWQ9InRleHQxMjMyIiBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7Zm9udC1mYW1pbHk6aGVsdmV0aWNhOyIgeD0iMS4wODA3NzYxIiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIxODAuMzI4MzUiPjx0c3BhbiBpZD0idHNwYW4xMjMzIj5UZXJtaW5hbDwvdHNwYW4+PC90ZXh0Pjx0ZXh0IGlkPSJ0ZXh0MTIzNSIgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O2ZvbnQtZmFtaWx5OmhlbHZldGljYTsiIHRyYW5zZm9ybT0ic2NhbGUoMC4yNDY3MjksMC4yNDY3MjkpIiB4PSIyMy4xODgzNTEiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ijc1Mi40Mjg2NSI+PHRzcGFuIGlkPSJ0c3BhbjEyMzYiPlNWRyAgSW1hZ2UgQ3JlYXRlZCBieSBBbmRyZXcgRml0enNpbW9uPC90c3Bhbj48dHNwYW4gaWQ9InRzcGFuMjE5NSIgc29kaXBvZGk6cm9sZT0ibGluZSIgeD0iMjMuMTg4MzUxIiB5PSI3NjQuNDI4NjUiPkljb24gaW5zcGlyZWQgYnkgR2FycmV0cyBCbHVlY3VydmUgR2FpbSBpY29uPC90c3Bhbj48L3RleHQ+CiAgPHBhdGggZD0iTSA3Mi43Nzc0NjIsNjguNjkzNTY4IEwgNzIuNzc3NDYyLDczLjIzNTU4OCBMIDU3LjYwMTg5OSw3My4yMzU1ODggTCA1Ny42MDE4OTksNjguNjkzNTY4IEwgNzIuNzc3NDYyLDY4LjY5MzU2OCB6IE0gMzYuNTA3Mjk2LDQ3LjYwMzA5OCBMIDM2LjUwNzI5Niw0My4yMDE5MTYgTCA1NC43OTIxMzcsNTEuMzUyOTA2IEwgNTQuNzkyMTM3LDU1LjUwNzYyMyBMIDM2LjUwNzI5Niw2My42NTg2MTQgTCAzNi41MDcyOTYsNTkuMjU3NDMyIEwgNTAuMjcwODQ3LDUzLjQ0Nzg2OSBMIDM2LjUwNzI5Niw0Ny42MDMwOTggeiAiIGlkPSJ0ZXh0OTM3IiBzdHlsZT0iZm9udC1zaXplOjI0LjAwMDAwMDtmb250LXN0eWxlOm9ibGlxdWU7Zm9udC13ZWlnaHQ6Ym9sZDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjAuNzk4NzQyMTI7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7Ii8+Cjwvc3ZnPgoK\"\nLABEL oc.keyword=\"putty-wine,wine,putty,ssh,terminal\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"putty.exe.putty.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nENV ARGS=\"/composer/bin/putty.exe\"\nLABEL oc.name=\"putty-wine\"\nLABEL oc.displayname=\"Putty Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/wine64\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"putty-wine\"\nENV APPBIN \"/usr/bin/wine64\"\nLABEL oc.args=\"/composer/bin/putty.exe\"\nENV APP \"/usr/bin/wine64\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/putty-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/putty-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application putty-wine

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-wine.d\n
"},{"location":"applications/putty-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f putty-wine.d -t putty-wine .\n
"},{"location":"applications/putty-wine/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect putty-wine > putty-wine.json\ndocker image save putty-wine -o putty-wine.tar\nctr -n k8s.io images import putty-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-wine.json\n\n
"},{"location":"applications/qelectrotech/","title":"qElectrotech","text":""},{"location":"applications/qelectrotech/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/qelectrotech/#distribution","title":"Distribution","text":"

ubuntu

"},{"location":"applications/qelectrotech/#ubuntu-packages","title":"Ubuntu packages","text":"
qelectrotech\n
"},{"location":"applications/qelectrotech/#path","title":"Path","text":"
/usr/bin/qelectrotech\n
"},{"location":"applications/qelectrotech/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/qelectrotech/#wm_class","title":"WM_CLASS","text":"
qelectrotech.Qelectrotech\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/qelectrotech/#json-dump","title":"JSON dump","text":"

json source file qelectrotech.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"qelectrotech\",\n    \"icon\": \"qelectrotech.svg\",\n    \"keyword\": \"qelectrotech\",\n    \"launch\": \"qelectrotech.Qelectrotech\",\n    \"name\": \"qElectrotech\",\n    \"path\": \"/usr/bin/qelectrotech\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/qelectrotech/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output qelectrotech.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/qelectrotech.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @qelectrotech.d.3.0.json\n\n
"},{"location":"applications/qelectrotech/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends qelectrotech && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"qelectrotech.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxMi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDUxNDQ4KSAgLS0+Cgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiCiAgIGlkPSJMaXZlbGxvXzEiCiAgIHdpZHRoPSIxMjgiCiAgIGhlaWdodD0iMTI4IgogICB2aWV3Qm94PSIwIDAgMTE2IDExNiIKICAgb3ZlcmZsb3c9InZpc2libGUiCiAgIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDExNiAxMTYiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYrZGV2ZWwiCiAgIHNvZGlwb2RpOmRvY25hbWU9IiBRRWxlY3Ryb1RlY2guc3ZneiIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmd6Lmlua3NjYXBlIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9Ii9ob21lL3BpbmhlaXJvL3BpY3Mvb3h5Z2VuLWljb25zL3NjYWxhYmxlL2FwcHMvUUVsZWN0cm9UZWNoMTI4LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjM2MCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjM2MCI+PG1ldGFkYXRhCiAgIGlkPSJtZXRhZGF0YTM3NzQiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGU+PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgaWQ9ImRlZnMzNzcyIj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM0MCI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MzQyIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MzQ0IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzMDMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNTMwNSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDUzMDciIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MjY3Ij48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUyNjkiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTMxNSIKICAgICAgIG9mZnNldD0iMC42ODY4MjY5NCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNDk4MDM5MjI7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjE2NjY2NjY3OyIKICAgICAgIG9mZnNldD0iMC43ODcyNTk1OCIKICAgICAgIGlkPSJzdG9wNTMxNyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDUyNzEiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE4MyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MTg1IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNTE4NyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTUzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UzZTNlMztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUxNTUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlM2UzZTM7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MTU3IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3NhbmRfYml0bWFwIgogICAgIGlkPSJwYXR0ZXJuNTE0OSIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTk3MzAxMSwxMTQuOTM4MzUsLTM4LjgwNjk1NikiIC8+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpzdG9ja2lkPSJTYW5kIChiaXRtYXApIgogICAgIGlkPSJwYXR0ZXJuNTY3NiIKICAgICBoZWlnaHQ9IjI1NiIKICAgICB3aWR0aD0iMjU2IgogICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjwhLS0gU2VhbWxlc3MgdGV4dHVyZSBwcm92aWRlZCBieSBGcmVlU2VhbWxlc3NUZXh0dXJlcy5jb20gLS0+PCEtLSBMaWNlbnNlOiBjcmVhdGl2ZSBjb21tb25zIGF0dHJpYnV0aW9uIC0tPjxpbWFnZQogICAgICAgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFJQUl3QWpBQUQvMndCREFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCIEFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUgvMndCREFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIgQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUgvd0FBUkNBRUVBUVFEQVNJQSBBaEVCQXhFQi84UUFIUUFBQWdJREFRRUJBQUFBQUFBQUFBQUFCZ2NGQ0FBREJBa0JBdi9FQUVJUUFBSUNBQVVEQkFFQ0JBUUZBd0VJIEF3VUdCQWNCQXdnVkZnQVhKUUlSRkNZbklUVVlKRFpGRXpFM1Jna1NRVlZXS0ZGMVpUUTRSMWRoWm1kMmhZYVYvOFFBR1FFQUFnTUIgQUFBQUFBQUFBQUFBQUFBQUFnTUFBUVFGLzhRQU94RUFBZ0lCQXdNREJBRUJCZ1VEQlFFQUFRSURFUklFRXlFQUlqRWpNa0VVUWxGaCBNME1GSkZKaWNZRTBVNUdoc1JWamNuT0N3dEhoOFAvYUFBd0RBUUFDRVFNUkFEOEFyMnlDNm5yUkxyZTM2K3p2OEZqZkpMWW4wYlpCIGdRdEMyaDN1NG9IcCt5S3JXME5iRDJCTXNiYjN3NjRFMFlXK1hrTWVBaHVyamdBQmdBcUtnOEQrd1BpU3JwSDhkRGpBdTdUNWFOajAgMlNzQzdhWGE0ZElWUFQ5YzJNSlBSYTN3WkJFeTFJVkpRQXlxMnNFRUNuczlscytLTjlKZHF2MkJnZmw5Z0Fmb3dWRkhnNi9nV28xVSBqUDAza3FmNFRXN0NZVmJPY1BtdVN4TEtLL0g2MitIVzZmTEhoMVJESDc0aDJaM2tGKzd4dmxYSS9hSUFBNThmOCtId3JjcDljdml2IGU1ZVZWdEp1NlNTaU1DUzdJOWVzbjhMNlFVS0dHRDdnbnNqNStPRDJuOXRPTGRRRTFkWFpxek9Pd1Nyamx1Z0Q1L253RHo0eVJ5WVQgR1daMmRJeklra2ZwU05BdGJJVmlYd3UzczB3OGNmbVJMRzd3UEdtQ1BOR1MyV1c0NUhlL2dZMzIwTE5mbnA1SjQ5MGdaZVRtMUxEQyBVUFlLR2t5OU45MldRWTRIYlRRNzIxcWdNT0MxekNHbnVCQ1o4Q2o5US9BK0NvYUh0bjR1NE9BUGVBQU1HLzR2aTdOTTlINVZvSitvIGUzMHJzUGxXbzJzSkF4aElpQjJoTjU1Rk1FSWI1Q2hyWWNjNFFWS3dJRnFKN040c1p3Zm0xb28vZ1BBWThCNldOVDJZRHI2NURKbXYgYmFKWnprSHE3cytCc0llcGh5aC9zM2FIZEJ3Y0VPR0h0UmdtSE9Id0ozQmlkTnRBd1lqOXJra0Y1LzMrL2RTTlowVzBYSklEMUxYMSBWMG0rU251Z1lrZ0FoMU93bUhJVVhsUmY1d3pxRXRTeUVNZWhxdEQzQldqd3lMUFp0WFpoanc3QkxSLzZIK2Zuai9VbmNSNHp4ek9yIHlvNmFoREQyTEFjTndwSXp0SE5YR1FmVG5IdHFzajFJaXpyTHBwNEZLUlBDOFdkSEhoOHdDb1NWTXFVa3h5SmRkd2FoU1VqcTlmejYgZm1EN2ZyR05USzI3UnJOa2FNN2xyZXNueHlRN0JmQU1NZ1ltQ0U5a1VCMitWS1BmSUtlalBLdXI4bTRUKy83K0ErZzRiLzJIRWR3eiBiTXZKenh1Qy9rT2xnTlhKQThsV1ZmdG44TkpSaHNhS1lIMlRXOTFtQTh4aC9rQjZsWTB6YzFkb0pvd00xVnhzSHg4QWduK0E4QjZZIFQ0NGFqSHl2NjN6V2pQc2g4VWdMSUpUbFViSXJLYlYxWHNMU0JReDBORFc0YjVNcjl3Zzgvbm5FTm1SaWdwNVJ2ellrN0IrWGQvOEEgUHIvWlVjekxWNmZhclFnVkxWM3p6RC9ZVkh1QUg1YWVCS0NZb0Z3WGpOOEovd0FPdHlEaDdrRktDdG95TnlpekJtOWhRbHFWRGJxQyBmZmorRDlpZllSS3F4c3hmMUpGVENOTWtqdjcweVl5TElQdGFTU1d1Y1FPY282d0gwNFV4MmtkbWtac3BKS3dBVjhRa1F4NW94eEpkIG5MTGl1T3A3UVUzZFhzSUMydmhLN0xHc0kzZHp4cHBQV3d3aDd1S1VOYlVXWVFYTElaSEQ4ZjhBQjIxZmJWWGpUTTBDeGlNRGRuYzAgREFQMUIxRndIWUg3QXFyTTVxRlRhekcyRG0xdXRtRnh4TjNkSHRTMmsvdVIyNTdOMUtIK0dIcmREd1ErU0hLMDdsbkxnd1dTbE5zdyB4SHBNSTdiQUE1L2l2bno2Q2dpdDRQQkN3Y3d6YjRIRmJzNW9XNUs5ZERzQmFGT3EzeUxYdGMwMnlWZXQxV3Qyb0g0K0hhbTFnQWczIEJack44M1RZN1JkdURvUFBzUDMvQUtnYndIc2xnMm8xV3FHdVpBVzR0cU5wYXAycVpIYkErbk9WTFZ6d2V2dzdJSDFJQjZUSEdFZEQgcjg5QmhpM2xvRkUyYjk3dzU5N2Y1NEFCa2tacFN4WjMzYWtKTDV4bzdVSGlqZWhuaHhrMktYYTBvSFVpWEVNbVNKZzVTMGpyT3NlUyBNelZYNHMwQ2Vlb0VkbDFQS3JNd0J5bkJ0R3E1S05wN0lEY240bnhRUGZnV3lFRStHK0xhMnRrREJ6a0VCSHJmMmFiNEdrMGMyN2M0IDJCK1FRSG4wSHJkWUdYRHErNEprQ3hrODJIN3dWTFlLdVNpT0R1WVYxZXZIeG9vZGdaRU1Qeng5SG1BZjdIdGd4REZzek53bm0xNGYgcnY4QXdGQndBZGl1NkIzd3hVc0FvMXY4MnhueGtkMmdPbmo2OVExZUxMUFNsdGdyZFA4QWgyb3lEMlN1UUpIdmdZV1ZrWHhuZkFqdCBTWno5L3dEN0JoUHRnZTZGd3BkaWJWV2NOVlF5UzJyeVBEY1Zkc2hsSmJEWEo1YnNDdHpFd05NRDEvZzg0MmZiVUV3em95dTBMTlFIIE9FdXh6Z093QVAzOWdhaXVWUnZPYnFsVmhxSXJvWDkyR1g0NXlJOGl1cHVKSzBqT01jYzZGM2UySTcrQjdzZ1AxNDV2aGcwdlY5ZDIgV0x0b1cwV1RHVks1eWFkYkhDdDNZd3ZNbW55cGJDN1NwNi9hbDJwNGREdFN2MXVDZVlFTkd1QW43L1p2ZElTUVovOEFyNCtBQVB5LyBXbFBlRS90V2t0cjVEd28xWHM1dGxoMG15TFlxZGtLVWpZZTF3MThPeVBsRGh3NDlibk5xZlBnek1Wa29MWmlmOWJkb2dCL3dHTDk3IDJFVDJ0a3I2bGlXVUd1QWxFclN3Z2t0Z3RTcTNCZU1OQ3V2RkxrVzhBOHlHeVExdFBaRWNDNDl1ZHNSaWxvak5qQ0pPK2NCUWZmMzYgWGluRHFzV1ljRTBYcUViWmxYamUwOGhxdWFTV01ORXJUZ2gxZk1JUS9lWXQvd0E0anRyQUJCek5zdzRLVDl0a2VNR0ErQSsvZTNTciBmWmxXUjhOMloyUUtNNUhqR0dMeHBhNVhaeUdReEFYazN3SktyVFJyZGU0azRvdnRyTjZPRjBhN1RaRGZqcXhjTjBjQmVZNGJOVlpKIFBNbUcyMlZkUHlSOWhUQUthd2xiR2hqekNHNEIvcjdKQm4xOVdqVVl0KzMxZFg3UWRrelp2WU4vNERib0RnSUNxSU5zdEJJMDdWN1IgWWF1Q2NPNlVwdHRndzFOVHhacjVMUTBqZm9aQ0crVEllbVBoOFBzc25nWjNCc1dobzV6dmZDZC8yRGY5L1BvUFI1VWF2WDRHUGsyWCBhRjVPeUhkd2RsRTEreURXQmVjS3Y1WWVvZUd3R0Zzd1ltTW16ZzU5WDc0SDR3TGFCak52ZFhlQTJBQWY4QmgxRHZraVdrUGhKTmdWIEtic0trWWNubEZlMkU0Y2JxOFdXRi9EWUZ0d2ZGdUd0anpFRnRzREVHeW93eDhmQmhQdWtFMk5CL2Z3QUR3QlFpTlpzQ0hsZEtkbFIgTDJhOFRHbU9XRm1rNHlzOXc0SkdUY0M5dllrbkdmbk5PREltUEdOMnZObi9BRVBRMnRzbGZ4WWV5bnJVN00xeUhweW5IaUhuVitKbSBBWHhJY25LcTAraDMyWXRoMlMwRERVZXIvVVBWYko5b1Z5Wk00azFjRU9JUDBGQjZZVFF2MkFNdFFiV21xQjJXM3k3cVpHbG1CMmhqIDlYYktBVjJGb2xJZmV6NWtOd1R4NFo0UGQ2ZmhqSG1yL3dCTjhDZWY3Ukg5L0FiQUFHNlBwTkRxV0hYekdyMlJ2MmxXcFpMWkhodTEgZ3BOYjIwbTBOWTFqSjVBd3RoM0RraWZET0hTTGJPMnlzeXF2Mnp0UkpTVFp6RS92K0gwRStBVXVXaHBhUWhtRWRvVDdrSktTUXQ2aCBjRU5QWUphSFl5Ylh0MmxEQ2VZUXc5VncwOWdXMnJ0Zjl3eEp2bkdXWjRDQkRaejhSZmZsOSs5eFpadlFHU042S1Jia01lMy9BRFZ3IGt1Ylp4akQxWXNGekpRWktPaWlaTXBXMm5HYjUwODI1NStCNmFWVmNubksvaXVRTy9KbVhYTEJNcVdLMU8weW0zeHRyMWY0M0orR0wgdHBJMzdqN0ppeUdPejVBeE9uOFJlREF3bnRpeThuTWNlRDhBUDcvKy9nUFdMVWhZRjZXcWhuNTl5RWh1bSs2WHdJV1J6RmhWUlU4UCBhN0RwRjhxdXNBOWJ2a08rR1JnM3pqN1kxSjlHNFdnTHJNbThHd2lTYnQwQnNIWG52bG80c1dMR3ZsdEtwSlBTR1JrWWEzMzVJVTAvIGRLeUZ2aGpqYmhNMDloektjSEJubUFDRDNQYTN3bXNvL20zamYrQW9KL2dMOGZlVXhIdlRUd0x1eVZQaC9NcmthcFM3QStHd01LMkIgMCt5eGJRSDVnWlc1Z2Z2QUhycWZaNzVSNGNtemZyV2U5dTNCK0FnSDcrd2ROWVJOT3VXYXpLaU9HS2VtbWRDbzN5OVM4TzQ0cGp4dyBjdUdDTjQ5TXhrQ0hUdE1xdVE5eUsrbnJOV2p4OUdSVEt1MUprOVczYjBqVU5sdU5JcThiWDJvSWxhSUV5dHFWaEk5ZTJwUjltbUt2IFBLY3BvNC9NTUI1a09hUW1jODM0Sit2QS9CcE4yQkhnQWZmUUI5K1FPcDRvVWowWU1zZzlUWmk0ekdhaHU5aE1DSG5HT3o1NW8ySDUgakJNTUdYeERtWU1pcStiQk9UM25pN1IrS3JSMlE2QVBvUDhBcEZzQjg4RjZtTDAwN3RGSjJyWDFuVUJhcmJaQzJrTUhDQ0M4SHNaWCBseWhjTndxdERodmljdHI2Zk9RN1FBbzc1eGxwUTZ6L0FON1k3L3NCL3dEejYwdHRtQjNKSDFnZHk5TWJZcTNTN0pLOUgwK05TZnc4IFhLcEdVaDJRd1RIeDhvZXEwOWdoenVIOEgvR2FIYUtNTU9PeHNKc0lEWUFGUlBwL3BDaGhjTHd1Mm1rcVpwei9BSGxHTWxkc1pxTDIgVmJIbklNT0Z4NUVzeDNIU1ZJM1Z5aWxQUkF4eHMxMzUzWUlIR05mZG4ybXlYM01zdVlCdHF3ZFMxdFpLazRWZFdVZGtHdUVTcTVWOCBXRWVpR05RT3ptRU9xekZmcllMVkxjQUY1c2dtVGZGY1k5UEFSSnBONDMrM2ZQOEFBVUVBRXgzQlBBMnc0WnRqR0tVdFVNdCtZenY0IGQ3TjR1ZWlLOHJidzc0SHJleUUvUytIVlcycjFLdWRzNEdMck1tRHE3VHhTZlB3TDloN2MrMkNIVHg1U2taaWUyNXEycE11bml0NUsgNlFXM1pnaUxjVUR3TXBXN0E0QjYzVDN4RFlKcXFQY0xMbzliV1JuS05zM3MzOSs3dXI5dUg2aTZnU0MzTnJsd3lhMHFBUHZBRmxVYiBDSHQ1S1NrVEl0akNSY1d5T1lMYkk0VnV0MkFuOER4NXdZUmthMEdnbU10VHRkL1VBRDh1b0lEcGpJc2I0UmoyMWhIK2JDazkzNm9mIEI4L0E2RWxsZmRrWEVHdHhpYWRheHh6am80L0lYdU4wUjVITWppVm9lVlVicXJXMGNPQWxkRXNqaTFURTE1VFkyaXBidHNhMnJIQU8gTDRpUkxnNGVuVTl0OWFIVEF1M2lpSDZWZ0ppN0pXTDkzZTM4NnZvVEJoOXJPc3dpNW1LdWxCOFpDUUYzeWFsc0pISlhYY0R1aHlVTSB0YmFiekJicmRiVzdIRHA1Z0dwSjlEUWJJUmxtMEdqYzNoMjV2aCtJbjRBQTVBd1B4Mm4xMkxNb2x6R0Qyb05TWk0ySkZyMm9EK2w1IGZZYjRQWEd3MlBFUTAvaldwdW42VHh0SGxhbGlRZ3cxcG5GbEJlQjN3WUszdmRDZlVMWUFBQTMxVVROTjlsMTNRNFlWVEp2U3ZBckYgSlhtaHFaTEFzeUlybnJZMUJSYTNwOFBEK3VROGJJOGVkQlF5YXh1aFBmRGxvdXh6OVVIOVQ1OCt2ZXprUUVPb2UyakNMdWJjaHgzWCBQY3Q3dHB3Y2NjUExYMDE0ZHRDeXRTVEhUMUE0SXZUdm5zYnNkK0ZxVER1TjVNT0NPVXBSWjA1V2xnV1E3VmV5YXF0T3VhMURsK095IExiZ1ZEaTNONFBVNU1Ub1FlWmF1S0dQWkora3h3OXNDWGVRbWo0UEJvMkVlR0FBZnd3NUJqMDVjdXQ2N0ZXaGttUmJJMnUwKzRhbGIgSkYyT3kvRmh2bHRNSjYwRnV2NWw4R0hDYkQrWXF2bG9xVFV5RGRRb3RXcUFZajJpYkNIT0FvTDlzQy96Nm9xNnVDT1U0dXRsSE5xVSBvZVVreGkyNUdLL0VMZGpKdGdpMWVIN3ZuNVVEajF1Q2VId0RuYUI1N29EQm1MdFNZVDkvUDdCeDgvMDRFZDBJVkJETUxjWEZKc0lwIFQ1UHZRTnIzVUFXZkdnWDhxS1lUOW50U3RvYWd3Ky9JRU5WMnlzM3dxekRIamUwcjhSWUgvd0RQZnlrVEJ2cUlvYzNhRVJ1elN4SzcgU0pqc3l1OHJ4NTRaU1lvcThaRzJGaTF4Rm1SRmRxVFR1cFdUL2x4c2ZWanErZDdGTyt4anQrMWkzUWZlRmdSN0xwOTJjbGRKcE9zVyBoVlVrZ2hYcWV3THkzVXFHa1dOWEtIYUQ3TWh1RndQakJ2a0J2dHF1ZnZLdnBmWnlZUHVpYjd1dno5OStBZTJFYkhxOTAwdE9GYjAyIG0yRU5mTlpGZXN2ZEFDK2FjR3hidTJrWGVyN1FvY2pnM2lFOWJtVmh5cWZZQ21jTUV4aFJEWmtZNGxHOU81eGc4K0F4QWIrdnM1c0ggajZ6TU1zcW9MQ05wR2JER2xrK3psV1FwdmtXWEU1UXR1Q2U0TWkyeVdvUDdjdHRmdnV6c3hNV2hqTjh3eENIQUNEejVBOXovQUVFciBkTGxLV3NUbTlWTGRBaDgxYnB4SVI3T1ExZVdZaXhXemEyUmZoNDJtSFphMkhyZ0p0SHdIaGtXVVlvTFJtWjROcE94OCszOCtBUWQvIDZJUEk2UmtOMmNZczQ5YzVTd1JuZVcrTWR5MDU1QVljWFlvcEdTcFpibVc5d2c1UnRZWEhGNkdWVTJYYUtOZGRqaE1UOHFRN1FNck8galcwN1BqSi9EODFZVU93dUVvVzJBWHhicjljTVVQRDJad1pBYzlRUFBCZ21NYUdqdStqL0FJdTJBQjkvUC81a2xnTFk4cEhwT3h0TyBWeldSZGtVeFVyWXY4a1lLOWNPMTZRVStZUnc3VncwTzRHQmtCZ2JnclNCdGd6akhuRW4vQUg4ZlFmUCtmRmN5eUhRb0NXM2ZOR2pZIGRMQjZLVTBkMlE0ekV0Z1VOaFBja1QwOWtEbUdTWVFod1VPQmROT3JheU1GK1RCbXpmQno3OC83QWdnSDdxTnR5R0tEVmdIYlJmQ1oga294SjIvdDY4V0U0SnA2c3JHRmJmTURMZHdPREp4dmdiQStLdkJobFhsSGpnL05naU9nLzJBQWc0ZENnWWJPWXhkY2x3dXdrWU1aaiBTNkY0OTFtaGQrQlhSbGxaSm9ramVkSk1EbkdaUTdTYzV1c01jc2VXZmJ3em5ERUFHeWVtZFdkZ1haZnFGWnlZTEpFZ0thWk5xYS9hIGo1UzlJOTJrMWRxWFQ2aDdPdDZrREQ0bnY2SE83UG53ZDJNM2RDaDBaWkIyalZ4dEgyRGdQK3J3RHBic2xnUTAxSGg5ME02U05RdzUgdVhHSk8xZjJhNHlyRzFIaTY1MVVKOWtUTElNVVB3K3lVZEQ1YURXMWxtS1Uyek0yOWhPRG4xOEJicDkrWHo5UmRNN3ZBVXNHbzc0ZCB3TjhFdEpaUTlUakN3V2N5VmY1UW83dmxYdzE5Yk1VUE1UMFBrZ05EWUxhQ0dPVHE2dldmaERmQjdkUG45LzhBUEgrZy9UMjJRbmRIIHptUEtySFR3TmltSTEzVXVURHY2OHlBU2w4NmM3azdYMlFoM3dudmhnaE1nd0xBbkk0ZThsbFh0QW5iN3hhUE5uallPUCszdUE2V0YgaVl4U08yeWlUUmg0WUpiajA4bk9TQmNWdjQ1NExVVFhWcXJzMHEzREpoQy92NUw1QlA4QWh4L1Z3L2tuNVhiaVY1ZTdIQTIyMDFhSCBLUDFCMTNpOWhFVnVzQVB1a2ZJSE9Yb2I5TGRUOGdqbTFoYWV2Vk95QWxzK2gzdEEyRnh6M0RPeWs5cGRUZVRMSm8rV3N4bDVmVkVnIGVyTEFuT3ZKNnliMHFmUysyenF1Wk5FZXNQSDBEOG1Ka2hDRkszUkpUVWN0QVdJL29ya3JMakxQcnBwdWhCSmNSeFIya0w2eElrdDggTVJERlFSRWpKeE1RQ2txVm5UY1A3WnYwZFVURmZwbmI4cGFZbitUNUZILy9BSENCL3dDbnRUTnBBN01BelB2QVpFMFMxYlRWWjVxeiBYSDQ2di9JT1hKWTJuL0pzdTd1TnpKZGtKTHZBSkIyQzJERlM2bHNiR1BMWThQTUQ3dzRja3JuK1FuTFpPOHZ4bU0rN082TWZ4dDNEIHdBQUFmaDA4WFhlbk80MnBETXA1S0hWN0dNdU9SdHNoVG1DeGFRcnZpZTRCK1lYWUhXMTdsVlNFS2xlSENvRmw4VnlhTWQ0VDdvUDMgNUIrL0FPZ25UbTY1K3BEQmxHUWFOQ0Y3ZmFna3RIU2F4cSt2b2NwV3VKeWlsN0FNZnF0c2xnZjArcFZYeG4zM05tdkJKMlRnTnU0diAyR0NEd0VBenJNWDF0ak9FbEp1MDYzR3Q1cXFiWWF2MUZUTEFYb2NvcHlpdWEzNDNETVB0MkJ5RjJJOEMwTGEzZ1p4ZmJDWGhFbXF6IDU4QmJ2QUxkUVVFQlVjdXcyQWJKQlN0SjdkdEZJMjB4dHNxdCs3SlFmeGZQVFpBc3JaT1V6UHVaekZIbHlvRkNLRkxybThpMVhRcXogMHBRN1JtVHg1S3l6Tll4aHRxNUNTNzd4blNLbm1PVVZocThxaGpvYUhNaHAvTUZxY2gzQlduK3I3UnlZbnduSEVIc0FBK3dZbi9BQiBOZ0VOVkdrR3hERlFKcmhVcWVta2xLd3F2YWoybjhzbmdlYnE5eTRMNGUxSEFQWkVQRVBnMi9BYW56eFl0NVdmd203Z3dIMzRCK3A3IHAyVm5EMHh1U21Tc2JXNWNCdk9EVjdWenUwTGN5aHkzUEhLd2p0U3A0K2ttUkRmSHpBZ3ljRCtmMnJXU2VuT3J5ZkJraTBjVG4wRisgOCtmQWRMRjRxY081VXVoaG90aE1qVkZtRzRpUUhRMStwdzFJZ1phSFkxUFZmRGNET204eHVDMjFnU0FHeDJRWldaUlhKL2hNMjdBeiAvZ01QYkRmNFRGcUpIVjg4RnhiRjB5Z2VRY1J1RGI2YlViVlBhMUpnSDhybDNMSWxqUUlwVDFFUXVBOXlLamNOSEltSXd5NEliSnJ4IGJqdDZjd2NXano4dGIweU1lb3BTWkRKSWFwNTl6WEs0N3hGMCsxa0JRNnJYNjNxdGF0OHhaREJNT2N3VW9LRzhqTnJSbVpIQ2JKNS8gSDNQbjE4LzBiS2NOa1hLenRydU5uTWxEcStUR3MxNEdnS2ZpQnowVjNsRkhEbUZWMG15ekszWC9BT1FYNlduTWhOR0ZGTGZabmgyTiA4SDhCd0UraFlvT0tUcmRvRm1jdlNqWEpxaHdsblpWYjNIYktkRHFaZitHQmxYeUx0QjhJTGI1eVNhSFh3Ky9PRUE0aDhadVJYWnNUIG5oQVFEZ0dQL3RBa0NIS0dSV3E4b1NRTGdQWEJKczFITUt5T1h1QURLcHdvcjhnbUxZZVpWZk1BOVYyWGFDaXE3WXpLNHZjem5DUDcgL3dEUWZzSFVLeW94a1V1ZVdMcThlQVp4TEpFN2p1ZjNiU25HdXpnVzNucGpkNFJXWkdkYUJkR3l0R2lna2pRclFyYjNXVU5rYy9OTCA0Nk1JL3IwMkxoU1lHYUt4dEc3QVMwZzJFamtnS2ZEbW9sb01WaWxGdC8yZ1BNL282ZEFyQ2ZneUl3c3BqOTQ4NWp2L0FCLzJQSU93IExFZk1yaEl2dFZpNmxXV0tBMHRPMFdMWDExdU9tK0h2OHFJQjRHUE1Keklub1V2Rmp0VEdycDhKUHczUjhlUnJ3YjNzNXo3M3dmdlogQlFHY2puSGhqUndMdStEWTF6SnFHU0xjd0FzRVFPbXhaZS9CMENXWWNERGc0T0FiOGdIb0VNWXNxNkhVRE1iZHF1ZHZ2NERZQUtDZiAzK1NYOHVsNHRObmx4RHJGa2ZMV01ha0lqUVlhYmY4QW1XMEJVME5ETU1FTndyZVlZVCtITlczendrUGJPTHZJd0c3V2liMy9BSDgrIEFxTFlOZ1pJR3lYTVl1WFJHUzdNTTRvQTVVTXR1eWFwY3NoeXRjcldPNDBJTUtvdHlxMWJXNXRZRXJWdC9pSGNDYXNHallwQTZkdzggTk50VE8wOFZVazZTN0N5bllhdks0RzRMdzJjOXB6WG1qNWhBTzRXUk1EMlJYOHljcE9DR0Q3WnZPMXJMejkyTmd3UDcvdjhBaUE2NyBJNGV4Q2luWHdITnJmSE9uekxSdGhIL2lRNUVZcm01YnV1UUN5TDYySERtSmdjZWh0WEQvQUp5R3N2Tlh0QXNZRENKSnNHQTM4L3lEIGYraVN5RWV2NnJSODVqRjhiVlFJRVlXSUhvY2RlaE5CNFNCMmNnWTVKRFpQOWhzR01HWXNqRmNvVEo3SUVkZ2VQZ05nK2c5YnRSR1kgbFVFWWZHaXk3eVNVbnZrYkVtTTQ5VjdDeVBsU2xzUGgwOHR1QzJobUZ0UHdSKzRGbGcyVEZtS0ZHWkdCaEVrMytyQi9RUDM2Q1dKZyBLQ05qVXNTeExVazIwRnlWWWxMeU43bDVSWHdzV09SWlJvVmpBdDJjbzZPcjdUNFo0VVFaWW44MGJBQzJCeVRRcG5NandyMWUyWnlsIGNqaDJsclN0KzNvZXduQ3Q5UGNPVmJTOVhNV3QrQnNoZVpOaDd4Qm4yZ0JlSWF5c3Znc21OZURac0k4YytmZ0hINmkrL05vZ2wxL2wgUGg1WFNMc0pWbFdvMGF3MmhZVEpaOU9XbTRpOVBiUkZaT04xQXQyb1loajF0Vjd3WFM3dzFubE8yTTZPa3BKdmYrUG52dndEQitSbCA2YWhVT2VRU1F4ckpiWHhTeWJSaWtGWE9NS1laOHNhNHdKNjRDRmpyWmd4eEJQMk51dkE5WE14R1dWZjZNYzRUVjNkMEFBUDcrZUFkIFJ4QnNSODU4dUN2bWk1a0N5S01tRFlrZk90U3A2Y01WS2VZWElBdHVMSjJIaG1FL2g3VTJwN2JzL0pueFhzejk3dXlqOS9md0hzQXcgUHZ5dzhqR0thVXBwbkxySnN5R0tXT1NNVUVMYmtMWlpjMEFGeDhIUElZdFl4STBtSjNZbzhWYWNEYmtTUTNraUczeEFzV2VjKzNoYSA1RDFPcjE5eXN5c29Da2h4cnpzRjJCeTJCOG9IVUJZVTBYS3JJQW1yWjhQY0ZidURJbmp3NlB1R3hvWXg1NVJ4ZzRiQ2VmOEFBQU4vIDJEcG5WbThyNmJsMm9obm1xMm5ab0d4ckNIQjJtNkY2WUxGcndHSi9xUXRoNlQreUF3TndmVCtNMmdVNE53bTBmZmY4RjhCeUEvajAgQnRDRytOdGYzOW11U3FOckVlcTIxWVk4Wk1FUzFvb2VMWEtMRGo2M01HRTk4VzA5ay9pSFQ2MHRTSHdaRHdHTFBOdlo0NEQvQU5OZyA2WVZUdm1ZaHNBNUlWN0lTU1ZsNmIxdGhZSzlwTmZFb1lzcC9GQTVjZnBNT3lNb2V5S2ZUMVY4cjlTYWc3Tnp4WEdXLytFOVBEeHlCIEFmdC9vVHJLeVRTTk1obDNVRWl4eWZVTkZCcTBraG1oa1pTMEVLUnA3UXRpSVdXdXUwRHE0cFkwazB5ZzdHb080MGVReWoyemhUdkogeGhuOERCdkJzOFgxWHRzNFg4Z3d1SHNteUU5eW1SWmEvd0RrQ0l5eFZkaGlvWWY4Vk9IekM3aERCdm45U2t5ZkZ5Zk9IYnpqK0FBQSBBQi9GQlA0UnBnSFlnWlREMW91WDhiUFpSNjR4UDRZRDE2dHhUNlJhQlNHdjQ0dUNmRG1FRnUxRks4UG5CeGd4RHdXZDhTVFpzNEFBIGZvZmZ0L3hhakFudUdVdHNvc0RNazFqbWdTVlpPRGhhbGtPOHpHbTZuUFJRNit5VS9EdURaOFBnMUw1eDhKMW5UYlFVMlBaVFp4K1EgZjl2Ny93Qll2bUt2Y21ET2dUNlROaDloQ2UxWW56RERNc1k4V0FsQS9BMjlEaDZrSVkrWjgvWVlWYi90WXlvT2JmMkRZTWNQMy9vQSBNSW5KZDN2Q3N6ZU5FZVA5YjUvMEg0NnpnQkpRWUVlVHhobXUxdVVWdXVYcXFGK2VXNlc2dURzak5LSjU2N3Irc2kxQmxuZkVUM3dDIHJzTTFYZkJJdDhNTDh4Ym1PRElZSHpJTURmbW9Qd2E1R2puSncyRWRqbjdCejRBdjlHMThEeWxRWmsydWRTVlN2MVk2aDFVSmJGb00gbVRxUWR3N2tldGdDNVF1SHJuYXU0RnRmTUk1NGdCT2UzNVFSa1k0N093UjQ0Q2ZBZlFlZmRKOWJlRmU2WS94YkJ0UjJ1Q0xXNjJKWCBqSzNXOU9PRFJVcllydERKWCtLM1Q5Y01pZlR6aGNWRDR0cVBodWRvdENNejcyYjRPZlFXQS80QkJQOEFWdEsvVzgzV1JZaVN1V3JEIGsyZHpCa3IxdzdWcDlzUHBSb0UxZkVNc0c4TGJKYWo1WU16OGdOcVA3TE9rdDhlaVlQZXpld29QSUVGK1BnSDQvbmxiWjFNSXRJNmggVDN2aUlPZkFwVHVaL3JieEtBMnhZVStOZHpUQmtrem1rbDdncTViZW5OZjhRY2hzN1hPMzc5NE05YlczVHFSRHRITURLNmZ4S3docCBpVk1rMGpITU9EaFdYeFh6VDBVbG1FOWtNZlJGdGd0UTRBci9BQU9MYXovUXhNNWFKei9yd0hmei9SV1BzUkxnQzBPZWtHRkxOK0dTIEV4MG5KWDFTWktWK2Vja3NCYk1HSm5KQjh6dEtReG5ZL3dCTDQrd1JKQ2MrWDkvL0FIOC9pMnRSRlR6SXBSUHVRTWt5UUticVFRTFkgdENqVDFvTzZIS2k2ajZ2VncvTUE1aGJNSjdBaHRTSGNFK2o1aU1NOW1abUJtL0I3K2dnSDRCejdnTlM4c3d3V015aDloRHhtcUE0RSBoSyt0c2tnc1lsdEZUaTMySFg0Y3dIY05uWDJRNVpZOVM3a1lWQTBXZ01XY1BPSEFHd2NCUGdPZkg5YWpDSVhLakllV2R6dGxNYW9WIDNabHJQeXRVUE5ta011VWg3TnUzalR6bGVaSXk4TDRyeDgva2RkaGlSbGhxUG1GQTFrQkVsM3AvVkZwN3E4UGVWZ3IwTytJcW5RNVQgY0hCRFpGdlNYTlQyVFlXQUM4N1lpdmxvakJteDlremdHb2dIZDFCZnYxdUF2ajVpa2gzTmFDdWgwbW5nZGFTM0UwajM5V05yL01sUiBTMTNLN2d3V1JEWk5HYWVoL01WZTBDbEJzZ21UVjBPek1FYzNzbEhud0Z1N0EvQU1NWDZ0TFlwbEh4MFc3TWZVTlNhczZuNUttcncxIHRIcHhEcSt4bmVtNHU0V1FINWd0d3F2Mk9CVjRFSGdNV1NqNHpMUE52Mzgvc0FBK0F3Mzg4clBMbUdXRE9NZ3Bra3haZVRHc0syQU8gbFpHWVdTeHRRUzlVcmtIc0J3TUorb1MxRnRoN3FUM0NoMVgvQUZrS0xYNXN3ZGppQ0FQMEcvUHg0K2Y2elB6Z1U4UXN1RVgvQUxpayBHV1BQL0wyVTJQT1E3UWZMQWhYdHp6ZmhpdU9PTWJVSTNKczN1VTVLME1jQ2JPVkN1azBvd2FmajlNMi9WVEkybm5FbWJpU0tPZkdDIFdIcVlvMjdGTVlQbVU4bjJwalg0ZXhxMHdVbXBiSjRYSXJzd3dIVnh2ZkQ0Qi9mZ0FEWU9ubWxuQTU1NHQ4OEJaS3VmTExzbGxpTDkga1Y2UStZS2NwY1dWWkZIOERNR0Z0YlQyU25TREFCZU83KzZQbW5vbnduN3dBUG56NkNnZ1BZK2t6allsdHJJTkF1ZGVqYmd4Y0pMdSA4V3BXN1JFY0h5TExhS3ZEc0JpWVloc2pKaXlQRjhXQmRNRmtwL2dkb1ZuWmp4dmY5ZmZRYWlBY0JBTTZISGRiVzFHVW5lZHlPMWtXIFJLbVZ1a0IyVEpyOWhyZTBOWDFaU3F2UTJBUE1jTGdxdVlBcFBZV0RmRnNtVVFueG0vZTZ1ZVAwN3Vua0FBZndrbTRyWnNxU0lJY2MgNUZEU2JrWkJqUm1zWmJ0dlJvRk1EdytYYkkvYmdPNTBtRHJHdk1rc0U5WEtpL08zdGNwZk9ZN2wrVzFEcGM0R3ArWUJnUTFKYjJGLyBZVEJoMlYrU0FTa3M4VkRqNWpKTXArR0hJQnppSDhEdHRaaXpmRFFUc3pDcnJST2UzdS9WRWZQZ04vV0l0Zk1OcFhCY2lnWFo4dVFDIGNpTUZicElmSCtJSnBMSWNYVGVuM0JRNjJIVDN4ZmhuSi9MVWZjOXJhTE1lWGhKMk1IVVhkM254L1lBUFh5WThVZlpaQkpGcm1tTnMgeVcxa3JkZ3JlNEtIMDM2MGJJbFhKcUVLV01uMTlEMmlaTXNoUFRvTDVZUHpwak1zMmdoMGI3bkFkWGVBZmovYUxnTDkxdkFNbVpQWSBLclBGT2ZyY0M4bTNaNGZIMnlIVjlqY3hmSHh4TWN3bVhDSElJYzVDc0NCekRiQ2d1MzFtcTBqZkFaOStQdno4QTJCQjZGSnUwc1hUIEJuWjJMdHQ0V0ZZZ0RGc3FqV1I3N2VJd3RkMWliSDdjL3dEd2p5cSsxYjd4V1VqUnhqLzVrL2JSZ2N5OEh4Y3NUT3pjMVBXd01CRHIgZDNqdzc0SDh3ZlBpV2hxMDRmY05WODhmQTYreUk4QnduMXk0TXlNci9qUDZUYVA0aTlzSDczdDNvOElTRk5Tc0N0NTZreVZ2WnpRZSBDV0ZwL1d6Rm9VamNFVXAyYmN0d3AvVEdZUTVuZUNIQTRmOEFBY0Ztek9MOG1SMGxKQ2ZyOSt2MUJRUUNDc2N0MGVLK3BiQmNEWFliIHA5SXlhdWQ2L2NNN2hFSW9CeGl4YlV3bVhCeVRaeDVocVViZ3RxMVE5UUxMUStMUE9Fa0k3K2ZQL1FlQTlXUFI2M2JhdlQyV1VpWk4gankxYUdnaUtQLzRsZFpGMjBRbk9kZlJJcmVPVDV0VmlMc2ZjTFRWYktRSHhyTVdjTFZ4Vlpvd1YyMk1GZ0JmcWo1Ky84OHdZQUl0eCBvOW1OcFpvbENWdENmR0tPUGVWdTY1SnR1MGdyanVYZFBCSXJMdVBwMHhtbjI0MmpVazU0UmlWcFVVaWg0M1dXN05sYm9lQWlMZGZNIHlwTXQ4YUQyU05NVHc2VHlnbFc4Z1RNRnVWaEh2aDRHSWVvUmtjSWRYaHdjK2ozMjR0cjd5SzZOWmh6bXpzOGJBZVAxRy9kZGxONWcgK3dhZnM1b3pYeTBTU2lCN0lzRmtJZGZpY0NsUzZjSzVhWnZ6S2ZEekU5a3g0TytONTVIaExKUG5peTh2R3lKSVBmei9BUFlBSFJWZSBDL0RNdmxBeThyT3FVTzBJWTBUUjhNUGJFdTdHaERzSVdCWkhBUGRrT0d0c2kvRHRUUzBQZ1RrT3pMZnZoRDJ6Wkt1NE9mQVB6OGZQIC9RY1Z1TFM3UVZ6RHNycStjazVOSTJFYUxJOHdiSHMxREtJYkZGcmt5djhBYmREWkVJUFlBZWp6dzg5T3JmYTZIRjRmU2dtTHlmd1EgZC8zL0FPZ2xJUVZYRVpQRzZiZ2FmZmtpSjlzN3lZSmx0MGNVd1hNdmVhNDl4UmJhU1ZNSEVNaU5qbXVQMUdKVzRQSnd6eVczN3d0RCB0YTdFOFl5RXV2bnl2QTZRdDZiN1BxQWJTYVFZcjBiWUJiZ1lGc0tXemc0OHdtQjNDbjArWkJnRDFKSG1MSXg4RjJZemJJRTRQc0IvIHdIUWRjT29TcjFlcDg1eU10VnRHTW5KVWw2dHlXbTlvcHpkQmJaRktzZy9aMDlrVHc2LzI0b2NncEtxMlRzd1cwVm1zbkVnMkU1OEEgUWZ2eDkrNk55bG1TT2NMWm5uZ1FPNzE0UzQvVExVdnhQaWdWOVhGaDArWStRdzh3UFBNUVZKd1F6a05HNEdMR0kyQ1RhSnM2QVgzNSBCUDdCejdxWHN3V3IvU1dOY1QxS0c1WjFTMWtqMmNxNFJLclRhbFlYS0wzUW1CL2hwL3p3NE9mUjc0RFQxbkRkSGtZRHdkdDgvVkNQIFB3SHdBeEt6bUtPcGxhU3lCRHpsSmNlNDdEakhMdG9jL1BQNFN6OXVhdENFU3MybUYxa1FWeEgreHk1OGdmNkc0dENIZFZ0bFZtQnMgWS9OMHk0TWp2bFpadG5nYXBiUjF5b05yQzJUTGlSQkIyUFBGNmVTVXFzeVdST0pDNUIyZWVnZXJLS0VXa3V5NEdjaktuUi9YNmVzNiA4a0oxck50dVJ4ak9NMDhSODRsRnlDZ1ZsbTFIREJxNmxQSncyWS9KRForUUdibkhObjVXR1NqemxHQUpsd1h1MmhCUldoTHhTQllQIHF3bVpxYW5aMG1wVTdZOVdGUlRTcnRBNHFDdEM5M21nS3Y1NU5lQWRabVk4a2drK1NZdEx5ZnovQU1OMVpNZUxXNEZCdUU5RGNJeVMgR2ZMSUV0R2RwWHBld254eXBHSUJwSXhhQ2U0VExWZkE0OFBxYVE2L3JRSFpGWkV4ZjVNQmhIYWszaEJma0Rmd1BnRUhJOWIzUVVTMiBxSzdtTEFXeWllUlIzZ2JXNmZiQmpzM2NjcVV0a0E4eGt0U3R3OW9UQWRadUVHQ0hSa1dyeWRHc3dQOEFmUUhud0hBUUhSZk15ME15IHZ1QjZMazNZazVXOWx0UEZuVEI4dUhGc1pJbEt6NHdodzZmY0VOa2NLM1ZaNCtCQk1ER2IrSE5tWmdlbmpaRWZmeitQSUQvc2ZpTzcgRnNLNk9TZUxCbVg5cUVZK2YyRjlxVHhLRUJBNm1yR2xHT1l6S3JzaUdZVDRmZW12OVBFSEFuYi9BTFZuL21rL2lJL1FhQ0FRZTd2UiBYRTJaR0JlRXFaWGQ4TTQ0N3ZTZ1lzTzIvd0NXejVIcDlBUXlCVGx0STNjRXJMMU8zY2NteDcrenRyZ0E4bStrbTRRNjNiWTVpMnErIHpqZHFTaVNrSno3SVRoN0RNRnZsWk9RRjhYekRJSVpKZ2VydzZyWmEvUHAxeFdSaFJvSjdGeloyMy9ZT2ZIOS9BZFdWekdCOHlXQ2sgelM1U2VtOGxYenNrMndZbzNSelYremk2dmJDaWIrTm9ka2FrSmdkZXdnZ2JBdW41Z3htUXhmSmdmaFAzL0ZmUDdBQTZYMlpUN281TyBoSzJoYWVFbVVqa2tvaGdDMVZ2RU1GSlREWEo0d1FaWWVOa1E0WkRaQUtlcEk2ZVRyUFRtK0RFWkhTY1VrNEF4UHZ4OC9pQXg2R282IFhBREQ2OVBjcWY2M3pVS3lDbzlxems5VG1GTGFTR2lVbi9NTWNiUTBQZUlQYjg5OHlzL29iTVRCNGZSMkQvTHord2FHRVRxVlkzZGMgM0t0RGkvNHBZN3V4N3JxalZjMnRKSFZnMkxpdmhXaTV1dk83Qkw0dmlnUERYZkZGWWVHRDNCUFE4cHF2VkpyUjJzaGhEbUxERHIwTSBxQjdjY2JjSWR3dUMzcUVaR0FPcXdMUVVwM0Jua29yck9IQ2ZObjkvNTgvSCtyVU9nZWt6THJmMEJ0dTFiczRLeURheVg2cnVDd1ZPIEg4b1RMVjYzK3lXUXlYV244d09OcS9BYWpDTlVDc0xXVmw0MUQrY3FMei9hSUI0Q29tcFJzdXd5RG9laHltY3RnVTNURzdmSXIzVHEgb0pBZXJ4YlpYTXFHUGlUSEF4TWNDRTE0eFg3TVZaak5XWXNXemI0RTV0aDkreHd4MkRya3I5Z3E4RFg5ZXZnc2JXOXdXMEhOdGtkSiBHT0ZlekdpbXhNVVgzUU1NbEQzQWhzamhWYlUrNDg0TVZtamQwT2N2QVRHaytBb1A5Z0FBRDY1QTl4eW1UQ1ozUklWeHlQRXNNakVtIHg4UnFwRmVHdjdhSlFMYnlnaE1JMHpaM2t3cXFJQVhGcnlzZ214UUhnNWNIWWM0cHEvOEFndVZoSWJJSHU3T1FLeUR3eWErNzdEZkMgOXFDbE9DK0hwK1pNaG1DSzIxUUxRUXpoaEdKdm1MendaMTlyVWZ0Z1A5b3NNRDc4ODJCMGZUelJYdVhRVXlOcGpiVW10eEsvUUlHaiA2eWhPUlIzdmlwY1BoV28rUGtORElmQTNDcFVkYlpxZ0ZxN010UEJ1N0t1T1B3Qi9ZUDhBdjFKNWh4Yk14MVZTcmtDNzE2bTJReWJPIFlxdFhYb2NxeG5jQzVCMkN5TEloaDZyRHB5SFZkbDBmeXBQclBhNnY4RzdCRWtHZTgrZlFkL3c2c0lEcXF0NzR3bVZ6cFZ2NTJRN1EgSlJsT09ucmxzVk95SVFDWFVvdGs1Sk0xT1Z2TTNEdHloc0NqY1JnbWpLNVJaWnZ4YzcxWGpzQUErL2MrNkdNQ2FSakpnSVFoM0ZrZSBrTUMwQkNVcnY4bW55WEVuMk5sUUZuYU00QSsyclA1NFUrUGp4WG41NnJTUHJNeGRPWldOTEFXclROVllBK0VZWGpPdjhna1BpYUtzIEpEdHB3WDN5SERXN2daQ0hGWHhmVXAxVmsxbG5hTE1HQStFaExVNENmQUw1L3dBQmdWVWVESDFVd1pOUVZmYlMzYmNwRDA4VmxiRjUgVEUrbkUrVUxYZ0xUTUhzaWZNeERzaEVPY1BEMUw2eTh2Z3RaSjJwNFhIRStnZ0Q2Q0F4WHdIRzJFTlNlV0d6bGRJeVg5a1Z4dmNGdyBZN3JINmhLM2ZFM2xHOFdERER1QzJodzE5UEJ0dFlQbThiWmNtMkVrZTdEZk9jZkFBTmdBQU1UQlFmTFJ6bnQxTXhkTlZBMkNCczZQIDlxTTU3dWhMRFFweXNGQmZxeFB0T3lNRVRBUmcyMWZwNWVHTjVlTVZjV3NveHgyTlk0bnp6Qmd3SDhNY0dUTEtxdUhoZkJheWRHaU8gTm14YXlTUlhkRURFbndicmk2M01wOFF3ZHpRVmZiOGkrU1c0NUhOYzMxRzNMVFhhclIrdDVyUzFMZG5TajJvaTR5QTNPcGRzVDJnVyBXUkJoZ2VZNGV0MVhNWUljNnRDTmFXcXlQUEYwTlp4cXVydnlwdjREejUvSGY1R2xIaVBiV1duMSs5MHlOczdTTlJ0eDA1YkI1SVI2IDlNYWdkVDZScDlUVSt3T0JvYjVNRC9FZUorbitsbmpEZzN2VUJMRUlEdzkwRyt6NERrREJnL2phdXlXSXBURDFmS1NleVdRQk1YcXAgcDlTMGJhRFkrSzZicWFLTkZxTDZHNEdkUGI0aEw2ZWoxb1FuM2d1V1lUdEI4ZXJNUndubk8wV3dZQU5nMkMwV29ONFI3VXQyZEZxdiBSMnphV0ZkY0hSQTloQmxpNDI5eWllaTJhdUxqcGN6QzBrK25VM0NlcHY2a3JZUEsyMGkwaDZPbkxzQ25rTDJ4UHIzL0FDK2s5SFRQIEdHWTdicnV2cDJoR3pZSW4weVRHWUZpbFVYRVVpU3d5V1ZsUnlxTUtTVXhLN1FOamNLd1NpdmZINUEveStvSTMrZjQ4Zm5JVW9zZ1cgcmdWTzRBTkdWdkowdTF5U2JWT3dERlNwNWFaWXRYcVo2MEphZStMY3dPWjI4eE9vZHdnVnd0L2FPVGM0MlIyUjhENkNBQThCMkJCZCBreDBzUVdERzNkbFdvazVXb3lqUnRJMWZVdW5VeERRd05ubGhkb010ZnA2M01XNWlnbnpFZDhJV1hUcklNWm1pK0NZeXEwa0phUGdQIFA5b3Qvd0NtTzJQa0I4MGVEYXZmS2ZVcU50NTJOUkxReWJVWDJ4dmxLMXhpNHZzbjBsak1NV1RhQVlIUTlvdmJ3bnM0dFdwcDV4M3QgSjJRQ3Y0bmtISDlUOGFUMEFXNXBDaUt6amJLU3l1Q3haZGNjbnBxeUtnYTF4bnRxSTAxZzlEcnRXNWpIY00yZTRiZ2ZBd0pwTmxaeCBydXN2TkkyaWxBc2NBR0tEWUhwOVI0OGxZOGxXTWg0OVNDSlpwSEVSeksxdWJheHpTWEhQYTR1ekxXMlFFYTJ4MEszOG9aRW1TUkFqIEtzbjhVNkFBRW5BM3RaR3VCbGJlM0hsUUVOVEU5Y3J4dnEvTnJhazRRR1k3Y3ZTYkNqbDRoNG92VzFRNGRlWkdUdFkzMG12c2x4Y1AgMUQ4YjNNb1VKakFSc0pxSHRUWVBQZ09RYkRPMWVQSUU3SFNSZ2VqUXVkUHZlN0ZQR3p0TWJSY2JpaHBwYmZqQStad01PWURENGdTdCBTQkNDWStobE1CWncyRTRPL0FENEFCd0hud0J0L3dBdlBPSitWcVdhcnNwTjNEclltd0UrWlUrMFZlNWFqNkhLUG84eE1od29hZnp6IFlTQ2ljNXlUVjJqalBDVGJ0NEFBZkFIei9zQUQxcys3NXptWmNhclcxR0paOU5HbFBCRU1BR0NaWXpqWWJQU1Q0UXc0MVpNSXpYNmUgcUlkbjFxakdHWVcwM0l0RERtRnBHMGMrL1lvSjgrd2MrNnBORTBjV3BiVHFnMUV2MUdvaWsxTTBzaVFUdnRaU2xwWGZaZ1dsOU9QQyBHUDdJMXlOcVhWa2FyU2pWVFRiVVR4eHZ0TFFPbEE3bGFqOXRxQWVTUVR3SzY3SENIcUVVcVR2SjdVb2RKMUxXanMyMkZvbmR0T29kIGdRejBTMk1CYmgzZ21XcGhaTXdnSGVNV0VDRGg0b3o0VHJQRUdGZGpYNWVxTUFBNUJoaUFyYUV1ZlZIVEZmMi9qVTFNcVNIRjFBcWIgYWdOeEljcVJFMXloeGhiMFN0NHhNcXdQTVlGdHFndUZhTkFobjNTME1lYzRjSk9JT0lERGtDQWdZbjdiT0NlcDJXK0dNTExvMVNMNiBsb2RvM0pJczViajZjQTlTMk13cHI3TTd3T0MzWkVPWi9xV1BnUVh3b3pLL0dSbFY2aCt5WnhCZnZBbjhkLzZTZFQ2c016S3ZpdDBOIFNRN0ltVmZhaEdKR3lhclYyRndWN2xiQUlHR1BEMlF0c2lFdHA1anRMYUFIL2E3UlVCUGhMc2srQTl6L0FENCtmeGFzRWo2YVdQV0YgTlpMTE04Z2pTTTZmQ05zY1lTd2ViSXJ6VGtMZDhxUG1GNHZxYzlJNGlUNlpJRll5ZlVneUtlK2FzWXNNdTJrN3VSZVhYSFgxVjBuWiBkVnA5TnZtbnVTa2k0ZDZpWEN3dFZBOXM3eHRGVHE0dFBjSENadkZKcDYrWWVEdytlY2NCbktPVGI0RXBMMlA3K2ZBY0IzL29rT0R6IElaTFc1VHZXTWthNU5TQWtWL1Vyc3JzS0VMcS9ma044SVZCZG1Ga0lmSDJUbHZ3R3BQV2VMUGd3WmlrdTNuOGYrd1lkV0VNTkY4dEcgV2V1bXVVTUpTY0NxN2pxZG9tQjVGRGJXQnNMVkFCTUwrRVF4RFQyVCtSZkhDMmdmQmhndFhSbG5lLzhBZndBQWdyK0dCL0dxTnNQayBodE9NalJZTXcyZXU0UEpkN1l1RE9ZRk14c0paeFY3VUlUSENaWkMyNEQ1anhXbFA3R3ljRzdON21qOElONC9YL3dDdno3NzBWTklDIFV6VFQ4TncrRWl5TldieVI0bXR3QmNSa2F4YXlmaWpJQjZtZmZKaUNjZkNSUnd4eG9SWjl1TEc3NURFVjIyWmp1QVB6UTU1U1NLOXEgVVBtcDVLdlNGYnJabVdZYUhLNDRvR0dRRHNqNXZDR1BUMGZWTFlDSE9tY2xGdEpUWTNaMlNRZ0JCd1FkL3dEUGdPTllzQnNnV3dobiBrT3d0aFVnTW1wekx0bkJtRHNqS3B4OGFNU0NmRFJMZ3V5Wnc5V0E0NzR5TTNlUVZ3WGhLU2sycDJpNTk0RFlFRXdaRGh5eGw4KzdxIDRFSWh2aGh0aVdRNERaREVIaWdmbEZHUmZUM0NaTW9kOFlOOGJhdmdRYTNHRE9MOXpBWnRKZGpxRGdmUDdCNERwYnVEQXI1TXdQYUUgck83TUxqSXlPNGRQTVZmTER2aXZRMm91cFh6NWdkYitGZTlvUG51UWZEaWVNL29aR3F0MmRqZUw4Qi9YbjJ3UHlXQ3ZFMFlONW9VUSAxeUoydzJTQmY2ZjVIUEY5TVVTQmtta2dmQTZsWTNLSE9rVVV5dFFYaVcxSVAyNGVHNm1FY2hUNlNZVzZXTXFxM25SY2tiY1llSFlTICs3cDR1Vk1sY0RZSWEyR2x6R1JnWks1VWs5RHRUQVlNS0ZLenFBSCtMamdESGZ2QUFGL29rcnVRK0ljeHFiYU1TU1ZCWm8xdFlhWHkgRnVPa0o0dG9ySTlYTEo5OC9oN1pEQytuM0VldEZEZUdTekt6YWJrNHljcTRJRU9Id0Z1Z2NhaTdRMUYwVlpZL1VRWnhkZ081VktxdCBGYnUvY0dabnI2UjhXMFd3Q0xNTUMzWkMzWkVPNENFemZ0SDlTempGbUUxZlRtOG95T2JTVGZBZTd0UmZmZ0hQbGp2aTJCVnh1VkFaIExJc0t4cXJDTDJrZTFFT3YwbHdLRk5RbTFoMkM0TlBlb1NrNjRXM0JrT0hxL3BhZFc2ejM0NE5abk5qWVB6L0FVSHdIUDQyWlZrYVAgY2N1eUlMQTVUR3plTGVjaHhYN3Mzd3NMSEd3bDlsb2o5dkVnTHFlMUpMN0srVGcyWEhpdVRDcERsWGhuQUNtNXRQM1pEdWxKNURjQSBlR3dMeTJldEYzcmtXeUw4T3Q2Z3BPMUUrd1ljRzI3UWJWVjhaaWZQRm1vQWZOdWNIOEVFQmJwK29rSkM2RmJzeXV6WkNaL2lucElFIERha241RFhUUEhsc0MrTUxRcjlyME9HaDF1K0J5RmtvOC9WaFV2MW0zeFpTczNrR0VTZWNXNy92NUIyRStuNi9zVGFxeVQ1VHZ1VHMgQm1KQlpmcXhia1d3eUM1Uys1U2d3L0NuM3g4REdDRXhWdG9oUTlqYm43MWZ1YVBWd1Q5L1FiZEFIL0FINTZvaWlHRkhzaDZwYTNRTCBhcTlWa3hIQlBEc0ZtODhmSWI0VVd4OHl5SWEyeVVPNGM0QXVEYk8zTjVxL25UejNScTVJUjlnZmdIdmkvZE9qM0dLczM5UkVTUWp2IGlsMmlRb2lrN2ZUVE5xVEU0Wis1c3VCN0VwWXlpcHhqSEkyRWllMGR5NG56Zi9ZOWRsbU5Hb0FXbjIxZWFSaFc0RFRTUzA4V0VIZHEgbHNsM1pHZ0MySzc1YWpBeWNEVzN4OHArWWNmTEIrRFQ2TXpjQ0prZ2JzazhIWUQ5UkgvUHYrd0d0enJkWG4zRE94QXk2QzFRNmJyVSBKTVE3Y3JBbU1qVGJTbkZQSWFnWU1HYlV1Rk9yOFJxWkE0S2JVWVdYcG41eXRkci9BR3hQOENQWVA2RGllZnA4N2wxdm5YSUJXNHNPIHlGV3RMQ1NYZm5rd2g4Tm90b3NCRnpGOURaSmxKbUhCZld3ZTRBV3BrN3YxZjNmUmtjM2FLU2IrL0lQUHQvMyt0Tms2aks3emFUTVYgeStWWGVySnFIZG0ySklkcitYM2ZkRTFzb2VVdHVGcHA0ZGJ4bVYrSCtlUVEzZjZOL29hY3RHcnF1N3VvSUEvc0NENThwQWp5S0NIdyBUM0NOTjFKTXNLWGN0TVhqbzVwaTFGMU44OVJKSFVPTTBGeVlZVE5oN01lWllhYXljN1VaOXBER3pseFpDRW50cDYwYUhyNFhVMWJ4IEo5Y1NvZ2VzYXhzbGh0UW1yNmcrZVlkdGtNdXh3OEdCYkJnVDU1cm1ER2Q4S1ZDallwV29mRklBdno5aS9ZQUQyQjdqbUQwZFhmR28gWFBKVktIYlVLcnBZK3NMSWppWEJOUTJGWDRld0o1aWg0ZkQvQUx6M1EyTmt0OFlVSzJac1pzM3NiQno0K2ZQNy93QmJiR1NHM1RvYyB5aGxCdEZLYWs2MFBWTUFmd0l4QlU3SGxKMHk5N3MwKzR5cUd2dkNySUpMMVlUN2VoMVV0WWV1bVNudUM5VldtZlUrbndYcDlIcjVCIDZjTzBySXNqS2lXMUxvSzFBbGthYjNhOVY1Z3FUT2VCVkVlekRiUXVrMkNrbVN5Tm1tSi93SUJHQXF3bm16TUgzRllCaExzNFBpZmYga0hmOFQ3OGZTUzhEWVJwSm5NaUJCSklGZ1hTNmU4R1JWUVJ4U052SENOSTEzYU51b2pBNm1DVEs1bURuYWNsakxGRWtna254TWNiUCBFaWJwZmFlbVpSaFhDOTU2TnN5SE1kOU41NEEyd3EzcG5VT3EyVExYeVZrRUVlWll4U0pLY3R2RGh6QmlXWTJkSFBWL1plOHN5elRZIHYyM3NJRU9jZjJFL3o1QlA5VnZzU3U1SE5GV2VHckZraHE1NGJFdkFDN0Q2Y3Zsb1RGNERwem1WZVljTGh1eFBReUFjSHVId1puYk4gb3VUem5DYXVPVkVmQUw2RHY1L29xU3hhVytEM1hpV3FodHJFb0hRTFpWNmY0K2tKNSswTE5pbjYzVDRiNVNaaXF3OWdPQ3J1RDVWYiBJVHhGMmc4czJ5QXpld2ZxQThCc0V3MlpsZnJsc0t0Y3JnMGxXRnF3NlRMSjlib1duZGVmSXJScUVWenlHdzRvZmVDWmFqQjg1RDRsIGFtR0t6dGU1ZytiRzBkQjJBQWYyQkIyQWtWb0dmQ1hKRmZVdXFibTVqNjI0UmRMVjd3QU5IMlhYTkE1RytvZHBaSWtqZHR1eEgyeG4gQ0tLTVlwemovSFo3ajdpUGl6MHBHbFE1Y1lEQjVwVmxnMVdxekRUUU1tVmpRMTNVd3dKNkNXQk01Y1JrTHVibjZtWjRtMDQvb3kxdSBJdXowcjF5WkJwYVBWSlByZHdVaU1RQXlRbDBGblJQbjBYVGVvTE9tbjVvN1p6aUljYkttWVYrMWFkV2JZc1piS0lqZWZpWklCdDlUIG1FbVpkZUVSZ2FVSnlNaXQxRDBRbEFRTitBY2hSZldXWkRVNlpuU3pxa1FsRHJ0c3FjVEhzaHNLeEdPVzR0aGFxNkZpK0Jab3hwNEcgcG0waFpqUlk3bms4V2EyelYwVFZtckl2bXhNV1NuMmc3dUJKRHI3VVVFczlrQXFTUVBzaEpYNnlEMXpYT3NWbnFWUElROVF0d1dveSBPRmdHTEdBM0EyNGJZc3RCU3M4ZGsxZTlxd0dPL3dDSjhBQWYra2t0cmRtTkF2T3Nxb0haYkQxZndCaHRpWWVIWEhaQ3VyaVJhdWhrIEVOa21Zc2lHNE1udHFBYmFQY09NaXhhTWpkMGZ2QjlCUCszUFQvVnpaaEE1ZDNZY2ZYSmdrdG5zNTJyRU94a25pd1RBdG9MUkhLR3YgdzZIZkZ0d3Fwd1F6bFNrTGF3VHlielYvSm5uaEtTYkIvWDhiZHgrZzFGU2RrcmNtQmVIWURWNUlsa3dLZlczZFBtYWFaQzhIdEJ5aSBOQXVZNEdOUWhpdDJSa1gzd0cyaitWSis1N1dMS0EzYndiOGcvcUErL0g3ajVWbFNKRmhoZUpvaTQzTXJzTVU5bTNJdERHVHZxejJuIG9aRWFBc0pONFRPanBJY1pZUElYRStyR004ZWVGOFhSSTRIVDRvNm8xTThsMTdjbE4yUXRyY3BWc2hUcSt3akZiaWQrdENteWx0UTYgL01USHZqYjRQaDNGZ1BRM2ozclBhL3lwc21KeTNlUUFPQSszVUN0MEhaRmcxZmJXVkFoamM1U20vTDFVVzFXeEJoRHE4bGVybFhjTCBBVzRlOFdSdUFkSHRzaFMwR1k4a3hkeTduK29SSEFBRDREOS9ZQUNsZkZ1cDgxNER1ZFMyUlcrb1N3YzRhdk1NeWs2bnNKbEZ5a2REIFBVTjh4UHZpbnk3Z25vZnp5Q0c4WWxCbG9WZWpQTnFmZG5nLzRBQWY1OTEyT2xzMzVVRmdPR1VVeVhacTBxbmpiWlU3VnBxeUxZZkogVVZlVjJsa1QzQVA4eGt3cTZIOEJQNzRRKzc1UW9UOTNaM3E1NEFWRWYyRG56OTFaU2ZISDA5UmVxUjZrVHNqZ0JQWUV5TzY2Zll1VSBlZG5sY2VWczhMTXFsNVljNFdpRGlYS1I1MnJ1UjhWRWU1WGN0TjdSM0d1dTJyNGVwU29MRWg2akxMNDNxdTA4TGNaVGoyRU5zQ3dsIHNwRnRoRGNxZkh1RU14REViaHZrQmcrRHRqTUxhQ2F6aWttK0RnUFBuOS8yQUFVZzBwZ1hFL090Vk1NVmNrNzlIN1hubHNld2h5Z3Qgc0tXTW5qekZxQjF2alpBeE80ZmlxN21UcThvVFJqbU85bkFGUW53SDBIOWV4UFpNdERyOFBseVlkYnRTYlQ2a0pZSmhKZnNLdDVWaiAwNWNuSkdDSE1EMnJEVzE4UHY0QS9PNHlzMmdMUnZOMWNiOThPQStmOC9BMG1QcE94aC95cXZhcmFmSjU1U2QzQXduSTdZNFZ6SzR1IEx0UStoL2toa2hwOE9DK0VUeXI3MlorVEtnM3BKN3FJT3dBRDU4K3dZSDJGVmFPUUNQYVFQZzBhdGNiWWxjU2kwTnVzaVNMYTdCc1YgMWNiWk9yTkk4cnAvR3puK095cGFoODVVQWVSV05jOWNaeFhUeFpTdHNwTm1jRGZNNVNkMThDNGZMK0xFaUFENjJ3UTdJVzRjMHhoeiBtQW5vY0V4eWJ0ZXpZbkhkSlNmNkJRWDd3QURxZWZFY2dMSUVseWZZS1RZVmcxWFV0ZXg2VE9oNGo0ZVY5UWl1TDVBNDk3RTlQWkNEIGhPVXJBUFBGa0V5UlFvc3MxVjdJYmVBQUFBZkFBUEFIeVFPUXk3R0gxNmtKb2RidUNmcVFKTzdCVXBpMEhldDY1bGJvbXNoQmpXNnIgTVh4TVgyUklQRDU5Y29hd1R4YVBhcTdSNzJQSDdCc0IvWU9nL01VMlFDeVdkbEtSaVN0cVRVZ0x5dk1KYzNUMHh5TFNnTXdldHJjTyB5US9lQnc1YTRQaVBNV2VVQzBVcHdud1lBQUFQNytBNkVzWkZWRWRIY1d5QjJNZWNiVmk0T0xlYU5pdTJoenowY1lWS3h6RlBHWHdmIEgxSXdjNHoybThjZ1EzSHVKeDU2WkMvZ0RhT2VQbThCRThYVzlGTHQ4TzI4TzZHZWl5eWptWUh3ekZrUXpFUDRjN2o5bDF5dDhaMnYgak85aFBQb08vbndEOWowSGc3Y0tkcjY5aTIwTlNiQ0YweUVZaCtTSElMMXdWeTBNSUdNSHhNVnYzVTVpNEIveGVCNUlNWnlndmpMdyBieDJOQkFlZjZHN1lyOUxnS2hKdDAwc2pJeUhnS1NrSzdJMVdBSlczdzlXUlNWWkRBSHJjT1lEdmxnV29xbng4OEdudkl0WEtET2NiIEpzWi8yUDhBbjlnNnRFUXR5czdWVXlVQm9UN3NySFdsTWY1Y2VIZnpCY1llME4ycStVWUlKOE5EaHZqZ1BNVnkrZTZyRDJ6N05XWUogS1NUZlBuNUJmdjdCMW1lT0k3VTB0Nm5abWpRU1E5MzB0NlU2WXBJUG1OTVE3VFdQT09BOTNXamMxTU1ld2dqaVdmMTBoMUVVUzdpUCBXTExLa2FTR2dEbHV0TFdTNFlndGtqVmRIeldPbjRhR21nV1RWRnFERDJqRTRyWVY0V0ZpS29pSlE4V1lQWkp0Sm1LM2ZQaDBlQkh0IDFWb2FNekZLdlpobmRFSmFPSDM0Ky9lQUFkUTlabkY5amVIeG90RGxvRjN3cllzNGFiN0NUMTRPTHg3b0s4TmZEb2Joczh6WjU4RDQgRUNIOURGMW16Rysxd1JINC93QUJmVC9uK2dPdjdjdnl2bkRVVm0xOHFWYytWZlp5VEVUN09xenQ2WWFJcGF1U2t4ZnJma2xWL0RjRyBTZDNoclRaeG5BME5aSnZBUUlrUEdQMS93Q0RzRXdwTURvcFptVEx0QWtFZHE1cXRrWGg5UDNZd05sa0s4cElGb2EzOE9xNmZjREV4IGZtUVR5K1BWZmQ1UXhmR1RwdTBUZmdQb1BXcG9uRDZoWlZDc1hTTVNYZWJtS0tXT05Wb0NPTWJwVkZ5YkNpYk9WREx2MjBMWXd0c28gRS9pb24ybXljalhpcTVxajF4M0JRZG0yTlg5MkdhZ1R3aklCRzF1Sjc1V0ZJRTF1MEpyWlY1NVE1SkVzaVp2Qy93QnhnTm9UenU1TCBOb1hKVUN6NFFJYzM3ZnovQVBsMHBWUGkrVlpCSmpTRU01RG5vY1lUSFNTUTkzY0hLVldTdVVpV0FZRHJmY2l5Rjh1Y3N1bjFMWjhSIGxORkNmQnpadEpCN0I1L2YvQVhMcU96Qjdrdmg4MWpoalVPdnM2eUJOZm4zQWUyZCtBTm11VVhrRGdZbWJPeUR3N1ZQK2VjRDdadWcgeDU3WEhIWjQ1OTlmUG44T2hDOUt5ZklvT3ZaK2FIakt0akhpVXIvR2RoOE1QS0tNUDA4aERaUG1HUHJjRnRIejFWd0dib3JyRE1jQyBKUDdBdi8yRGY3a2paaUVidHc4SHpsa0I4Y1ZXUDVQbnBRa1JWRFpYbDhIaXFyL1c3djhBWFFIVjdKYmp2a2ZqbDJKWk4zYVZodHNHIEt4bVd4TGh0RnRmRlRlSDl5S1RxdUVZY0RPdzg3Z3NqTThrNnYydzV3bEpCNFB5RHY1L3BrTUZ3V1lrQThtMEtxY0l3MWpMb0NRUGYgSWNlc3JJc1pYM1cyazhnbi9EY0dPWXdUSndGd0EyTnlZWjlHOEordjcvd0krL2NCRlE2bWo1Uy9rd01tc2VTWGREVzNjUG41eEN3byBibFhOZ3E3U3lENFlleU9IN2gzVTVoc2JnVDR1TFdTZXllYy8zOTduOWdqYXkwOTVsdFd4blZKS0pTVlVxaGJzSGRsdFhpVEZZV1c0IHV5WEJ5UXhodkZnR0FiYXdWS3FoOXNhVmRHSi9TUWdQZndHRy93RDY0VEJSUmQ4VUhiblY0UmloR2xXTHh0dWJGaml1T1NjWGtHQ1MgUEpSVldTN2s0M0hCeTdjK3ppaldJNStSRGp0VUN2S3pNa1htMVdrNU9hWUNWN1lLcTFSNWN3Q1VMbEhMaDRlWnpFdzRKMFA2ZUJhMSBzWnV2T2VEL0FFa0hpL2Z2K3dQM1RhMWNJOThDM0NtVmRvZHF1cG0ycTlxNHNIZkJ0SHJ6SWVLSkVYa25lQU8rR0ljUDRjNVNZQUlNIE9NZWhUUU1lWGcyYjgvNEZCMkFBQTZDRGhETXFWUG1CVTM0MWhSYkNJaXFIYWtsSHBHR1VBMkZYTVZQY0xJWkptRDVaSHpZS0hYNmsgY01JNnkrVTNVQXlxd3V5YkJ2NEEvd0RvZjZuVlpTcFZTUUZHV3AxQXhMaFBQUzRkZ04xdFdlMU9ObjQyRFp3c0xQTVZXeDFiampCaSAyS0RVVklLSEhXYzBEU1dBQjJ3cy9IMCtrQjZmZXY4QUZoOWE0cEZDSzdiMnp4UjA1eGxmaGJ4azUycXNmYStWL2JqeXo2ZnVlQStpIDVjbVFTOXVFbmFXalVXYzhLRnQyKzRkdjVGNnY5ZktFTlBNdTd0Z04yMlRzQUcxQjh0d2ZGZDNWOTRYMXU0SmhpdDNEa2dLaDJDcFYgVkQzTjh0QlpSbmcyYkNISDRBQTJEWUFDRDA0TXN1NEFSZDJjY21KTXl2aHJzcDBPNy9qSVBLaXhDaWJEWUZzdXQxdTRCK1lOUjVmYiBWWDdNTHRCR0dIQW52c0I5KzkvN0JBdURvcnFWd1E1VmZHRXF5RWdQSjR1aHVHMDlyNVVTeHhkYmorTnZpMllodUVQY1AwWkNheVV0IERIZlB1MXEvbDQ4ZlFjZC82TzJCSHJkWHJzT1pGdmthdmI5ZkZ0U3RoVld6RU1PMEFWNU5ybjZmaW5vY3hrK1o4K3dKN3d1RXlaUVggY0R5alZja2hBYjhBL29FL2dmNmlsWklvUkhtZnFFV1NFdW1HYVd0TUJreDUvSHh4K1IwYkxpU2hhTXZGVVRLaloxdGdBTVRRck96USBvMVI1UFNJbUN4OENIVExIWHkwdHpKV2RHbHVESU5ZSzlaSHlTMklZRlBJSWVvU2JEbTJwaXlBLzBPQnlieXJ0SEp2eGR3ajZDZ253IEcvNGRPRDE1WWRkRDNNaGk2OXFXN0pXb1JTMHRQREpNSTNIVzhXeG9tQlF3d01reVl0aHc2KzROVUJ3YlVjT01yTnBLTXl5OEc2dTIgTkJmcmRBUHdBK0EzOUc4c0tac2hxVHJIenBOWXFSaUxMSG1MQ2VGTXcwUGk4VTRlNG1NUDV5R1FaSndGd1BYOEhKbzNLQ2JOc215UCBBRGZ6L3R2L0FCOXdQQ3ZzelpXOWpLN3NrLzRwSlNTTFlhcGhpV3lJY1VUZHpSRC9BS2JjSzNXOFhDdWJNWUFPTElUck5vZkdaWk9PIHdUd0NDZlA3QWYzOEJIOU1yODNmY3ZiSXRWN0g1eHY1N1RkRDhkTGRZM0xTZSs4VXdBdVI4Nkd5aS9PNWozTmZaaDdXdmhWcGRicjggVXc3RktsYXJSWkxCdkw4SDVvMlBZVmJ0RXF3aGZKS3Z2aTdFTzFBNGYzZ3p5R0lOd1JtZkVyVUN5ajdKaURBSVBuMkRmd0I5eldCYyBCR242clZZRXF3bmFzVWpPQ2Z4QVZ1K0IyRXhGVGVMM0l0a0dSUDFJR0RGYi9EdFR1QTIvRFdWbmRCZ3c1NFE1d0h3RDhmUG9IU0JJIEw3NGtBL2dIbEJiTVFGdU1rYm1TVjdZaHlvZ2x5UFdvUVhFT0hkbGtXUW5oNTJtbmZweklUOHA1d0lFU2VQZ04vd0Riei9RMmpzbEYgd0pGaEN6TXdJUnlvWTFlRGgycXJpekpjb0dKRkYyUlg2M2FnZWgrWUQyU3EzeGZ3T01uT1dqN05zbkNmUG56L0FDQStBUGdDbVZuayBMcXJuY3JlVkZ5enhJd3ZsUXVOdlhCdS9pdWk3UWdWblE3U0pIcDRuYmJHMnA5b2tiMHhqeFpka3NOd0R6VG1zeVl2cTRleUxCTTFLIGtod05uSk5aRUZVRFNBaVlMcVVTK1JFTWl5Y3dEekZ0Z0QyTUJvK3k0UDVmRnE1UDhvNFdqejdmL3dCLzREMHppT1k2S1ZrV2RhR1YgeHVZQlpQbG1BOVN0Rk9MYXZVb29YYlMzOE5QUTRkYmhtRHVNQlQzeEhRK00vV1djNEVDSklOZ1Bud0cvSDJCQjZwK0R1d09lcWZFTiB6eEptT1MzVjBTdDhtd2lCZGJRMWQzbGk0YmdIbU1oaWErRU1JTStydUtyYU53TW96N0draFA2QUFIMEhwa1ZJajVRWVdlbEpxVFV0IGhWQnAyUVpmY0d4NjNMT0ZJdEFuRzJnN2pOUThMSDdxRG9iVjIvUFBEZ3NvMVg3WnNadmhDTUFQb093UHgvOEFRWkVjYmNSTzY0Mm8gdFFrZzNaSHYrTm8wdGFBcDhoWnNGT1JYVWpraTVlTm5TcStsbkRZSkZkYm00UUc5M1pqeUt4Sjg5RzFmcGJwbFpTMnBKcXE3T3g3NSBOWlYrWU1TQ3dkb3ErSlhOTncrWVRZZHdUTElJVFFiYW5nUVZxRTBaRFEyWkdCdXh2Zk5nQWIrZmZ3QUJCWkN1bjZmNStvZzhCdFdwIEszbVY4MU1rdnNPbnA0bUdlN2UzSmFLZVFyZUhXNWpnZGdUSU0vQnVOc2l5OHRIazlsQ0hEbmFMZndBQ290Z1AwelQxOXNZNkR6bWcgRFpxM1ZlcVVQcXJYa2V6bkQ0akltMjA3cHF1bnI3aFc3SXRza053Vy93RDB2dGtBTnViNHI5c3dlSVRVUHdGLzM4QUFRZkFPYU9ubyBXMTBuT2QycVNIYmRSUkpoSUhwaXUyVldMYUN5YUJmQ0FkYnNpdDVrMXdRMnFBUWJRYkl6RFB5Ly9xaWJCLzhBZnorR3dUY25jeUhkIDJ4Nm1tRWpHV0NTWFVkZ3hhS1dCYWpIbU9SWGZNRjdWTVJrUWdVeEV0QTh0cHA1bWQ0ZlFoMCtyMkYwcm1iTStwTkpPVWtpd0FqMjEgT2NoY0JVbVFzak1wRndtTGs4Q1NXM2VFeVdGVzhQNUM4dGdTaVJhT01OZlc1aTM4eUdRaGd5REJXbnc5c1YzeDVXWGdKVnpzYzMvSCBmOS9BZE8xcFpGOTNGMWk3dmdFSk1QMTZreEtQem9hK2ticEt0aVVobUhBd0hzZDhUOXdEMXo1NzVhTXMrVEovMXQ1OEFBZnRnQUFPIGhwZ21DeWo0bi9BbUlNeGRhMG1YWkNxa1hRdlE5MHNJV204ZzJlNFBtWHh2Q3Eyc0Z0SEhCbUtlK25vbWNDRzNZSGp3SDM3QjlOb08gK1dwVXVwd1BmcG1ud1ptdVllcEIza09BRWUyZkYwK3J3R3VxclgrZWN3bWNndFJxdHBmVWdiNVdmRjFmK3R1Nk5WOC9RUUhnRDZFQSBqS2pLSGtWM2RVZU4yV2FXSGNqbDJ3eW5hWmE5Z29zWHJrQ3ViRVBIR2tjVVpTQkM2c2djeE5VY1ZGWXh1d3lYam1iWmNENEJVOFVOIGxDRDRMdEJwN1A0TzlNdTllMDV3Y2E0VXZUcjVVcDUzcHdvdEVIeFBUN1VoMXU0UGtFQ1FmQWUyVysrWHc4Ly9BQUFEWVBvUFFIWGIgUlpHcVdvME03QWFqYnN4NU5rTHkvRDFSTUZoTWdHeHRQWXFMTStZR3Jmdll5Vis0VGg5ZnovbVcrekN5cU16STV6dlp2LzVkUDBIdiArd2NlWFhkcVdoUTVlNlZlRzdhVjZESE5yRFRBQzY4YkNXb3RFTnNVb29ZSjdpdHNrUGI1bW8xRHI4ODFkeTFob0tkcy93Qmt4d3czIC93QUFmQWRNaHpyQkhDM0l5T1F1Z1dTdmF2VzQybVVQa1ZMYUc4QUJWWkhzRU1jWUR6SWN5WVBtNHFUQWVuT0pQOERrOFVlclVsMk8gUDJ3UHg4QS9ZdngrS05LM3BOS2gxSnpVUzZhZmNyQ2JUeHo2YWRkdDlTdW9YNmlOcEV5MUcxUUYrcGZVYjZrQ1NWVmNSTGpNQTRDRyBPU1htTmtBOU40eGkyTHh4UTduTnJhanFQdmtKZE05NnlJTmIvd0RFS2RxeXoxVlNUMHV6SENnV2oxYWRSZW91MzFNQkRDMkJxQnNkIFJjYk5sUzJ1M0dRcEY5Q1U0V21KemM0RlkwZXZ3ekZDbm04K1JMWUMyZFhsVU5UR21NY3RnL1ZiZG54SzNaaUFOZW5RSXRwTVZHRzIgQnlWTUY0VkJWck5INUxocUNwa2l0cnRoQjRVZGxEcWtLQzdoUVdYTnpZd2w0OVVYSDBwcWJuU1BSWGhJTFVVRk80QllGZkdQNlA4QSAxL1hUZm85VGZlSnkzM2YzYlZlZVAvYS9mai9RZlBIbFlQUjc4VjBPd3BRdktKSHMwd0VsUEI2Z1VkM21BVmVzaWxJR0NCZ1BEbUdQIHZpT0JIMXBhamgrTGlpT001djhBMkFBZkFZYkEvQUxwTGF2Y21iV2JnVk0xakdHMkRTYWpVN3dCc2luNmN0U1ZwZlU1U0gyL21MUmkgK0Z1MVBPUU9XNmMrTXZOeUZWbDYvVDkvOWp3QS92OEEwc1ZzZk1zR1loeFExR29GekdlMjdEVDlZb2NoaGNYUGhDYXJzZmJkYlc0YyB4REgxV2oyV3dLUVAvUzlEWnF6Unpac0ljdDN3QjgrL0FINStoNnJYNnpYTFFNTWFRNFJxSDdNRWxQbFRTSGQ0ZlpIYStTZGszeDhzIGl0Mk9laDl5MDVENGVUR2RyOXNPSlBDVG5BYmRQZ0FDQ2ZQOU5sRWJwSnQ0R3NGMUxMRktrY3lOZFJUUEVrK0ViMGJEQTVrR2lNVDAgcEpwRWtoTFN5TzdaWUV2Q1hYRVJsc0k1Wkl0eStDMkxERWhiOGk4c2ZSdUN1RFZwbjIvS2RxdjBpMkNkc2lYWkdwdXlLZnNKUDJGZSBxYTQ2Zzdqek5RbGJwNWtkTWdnY0lCdms0ekRIQm14ZGtvM3Z4ODhmOENmeFBxdTFXRFZnWlF5VmFid3BIcXZtVnRUckFuNXpCTDRhICtDYlFybHcvMVVtT0FkZjRyUEliR3lNMkJSWEpzeU9id1NkZzU4QS9ZRC9WaXFEMUFRMUpIcmV0SzBzbGJyZHkwdXJlb1NRQkpJOXMgTFlFcmZOWDNMWkNlK1E2ckQxdUhyOFBBYlNId1RGbUUrTGpGbm14dit2a0g5RC8yQjJWY251Q2JsblExakdKT1RtVVBHcjBnWXIyMiBMNTVrTHJKWEtOOTRKL0czQkQyOWJhdjRnSjljd3lZeXJ5anc4OTBRbk9UNERnTDhBQUlQVmFNNnVSUW1vMHlSYWxIbWdnamllSnRXIEk5UHZrVHJnODBnK3BqamlrS1N5UHM1aVBNeXh6UnJjd2gwOGpTYVpwbjArQUxUQkpXZ2prMWNjTU1rZTdMSEZZZ2tuZGNsVTd1elogV0xJVldPUmZsaVFDRmV1VGFOcFBPcjYyaHRoR0dOUFh5eUhGS085b1ZKREhwNjNEMmV0dDRWancvVHh1Nk1zSzR0NVdRYVM3Sk5WbyBPL245L3dDZkh6L3dZU1R0UDcrN1dCcE10VFRPWU91dGNId0lGYkNtRjI5aWxPT2NpNGwwVGFiZmNNUmlBRjZlYmo1K3VwWk1uV0xOIGlVTzJmNjdQT0FWNndWLzFWOENZVHVNZG1RdzlqVmZiWXNvQkc1MHB3VzRpK241TGpFbUFjVk81RHhoZ0RtSzIrWXQxZk5lTVdDZUQgWkdmZEJmSmtkSlNkUER3ZmZ2ZCtQMUZ3SHJjeUNxcnlrZWpkUEhaL3N5cEtxa3czeHFvdmhQczFidERhZGhoMmhwN29kUFpLM1pIQyBHandHQnQ0MFRScms1eFdmbTNiQ29qNS93SFZUT1JKcDlPck9mcXY3cnFFUVJIWWpTRjVScUhWcDQ1Skkxd0lZUnhQamxic3ZhSHVNIDR3U1NHSlBTak9waGtVWTU3cEdhRmU2c2NGcHJOMlRpT2hXeUdpbzU5a08xalR4dEp3NjV0U0xadEhtWENwMTVEVFVOaEEyZ2hzRzggUGxKekdRZVluTnZBOTRKc3lHOXN3em13TTJFQUlPL2dPUDdCaGFGVG94UHRxNkdPb1YzZ052MmhXOXh0Y2hiR0lCWk9RNWQycHRUViBXblRNTHJxeDhXNEdJSnRyQ2ZpSFpzSHdYZ04yTkt1MUhxSkJ3QUFQMFA0VmtGdWo0R0RoMGhTaHltcFhNSk5PT0dvVFQyOEpDMktxIC9uaDZrMkJrVDdURDJtaDAvRGVLbEh6N1UzTjVxL2M5OHE2MFFod0J6N0h0RDdIK2hzRzhBNnpyKzdHT3M2bHRHSFBzaEpsOW56eXUgSmg0bEtuRnhkd2htSmlGWkc0TGZCTFE0T0dXS3pWMmpqS1ArdFZXN2JvQmYyQitma0REUVkzWmxjbk4yMm9tYXF1c2dHcXorVHhmbiA1NTZFU29GWGNPNGpjaENNY1pGeHdjbnV2SEltcTVzbXgxYTUwVDdORm85blZDR3pwTnByaUhxWnJKb3JDeUdDV251VGtrZkxyZGZ4IHNoUER1QWY0YngyUGZLNU1FOFZmRVo1dEpTZGdBQUQ2Q3dJSjhBQVRLMnJtTW9ncW1idVc3YVBDODQyV2tOUTBoRU1XTnUxY3lqQTkgRERzaUhaREl2bVBuNzk4UEZuNTRzak43Qm05LzVBZi9BTEIxRHJZdVJBVjJROEJhdFNBZW04cFNwRnBjRHc4dERxOFdqMk5LL0c5cSBYd25tRThnNEkvYi9BTGpTN3lXZVRyT3hoRGVDTy9lZlBvT0h2MDVRNUJZdmkxZFFlbURUbHB3dEI4YTBtcEY5UDBzTWZlME9CcWF2IFdBQ24rbXlHTVJDUkpqQytJMTBVOWJMU0dXN2VHVmM4a2NVbkVLY2ZjVi8xTDUvMGdUM3FYQ2xLa2MrYnVNZlVSTHl6bGhqNVhJWTEgdUErNDVVdzQ4OUxiRTVPc20xNTRta3lCeGlrazdUaXRmeFl0d2J6QitLTVFwdGhRQ3A4YzVVTmNKUjRJSklVbUhJSkNlcmxMQ2xBVSA0ZkRtTWlmYWdlZjI1YldDQThPQ0tzaTJsbTJQWXdtd2MrL3ovVVBqWEJWNGFtMDhOZkdUSkR6eVEySVBhbFV3SmhwcDV0c1lDNEVJIGtOYjRlNEw2ZXE5cjYwK1lNcURpeU04bkxSQ2V6OGZRVDRBK0E5OEZ1dDArOFh3REpQZ3VueHNPQlpGa0wwZ1BwdlQyR1krV2hFUE4gRlZML0FNeVloekE0L0ZxeEg4SFczbG0ydFovWkRaemYzNStmZ0NDL0h6OXE5T1dubTh0VHpmVzJuNFZZc3pUK01yZkpPaFFObUhVZyBKWEZPTUVSRlVqemErNW1LZTVxTWxvc3pWYzArbTRzWDYxQ2F4WnFPSHg5SG9ZbjQzWDRQTVlQU2JCUDFZVjhXYWVUUi9UT0tuZzlOIEVLMTZFcHNrN2ZHM0o5MlQyZ3JtUUNZTUYyWUp0eEk1Rk1xeThSc1RqSkh0U3g1UnlVMkxOZVdCb0FBNUNVTmtzVFQ2WTdxV1dOZHkgVEcxSk1URUNCY0dFT2VBdTR1MElZNkhRNjFqTVpGLzhsVmVlVlZzWXNvYlFNSjRZQkRZUkIvN0FmNllWc2NzZ0N3N2JWVEtON1NubiBhV25rVWtoTE1JamxUaDZWRFQ0Ykl0MVhUMXFPRU1HZTRHMVZ1ODFBK0RPTW80UTJrbktpUDRjK1A5STJaVmJ3NUorL0FaaUJmd3V0IHdsVGZEeVNGeDRYY1ZiS2JmVEZnTGRibU9IbDYvbVZ6MnZQZG54anlyMWV6RTBjNGs3R2c3QWYyRHdBQXcwLzVjT2U0YndycmFTK1cgRWVmMnpoNzRQcktZTGxSTEdjazhlR01NaGpraEFNMVBqQUJhc1NmRnhhTWpZdTNOdWZJT0dMOEFma0UvMUhkRks5MEltanZlaU10NyBlV0dESytBNytHd2ZIdG9uRTVjQ3lPMXlORzdKSzdPaGRkc2NsTWdCYlhYYlpzY0U4ZEtzUHpEL0FCTW1CeXFUREFubTFzWVBodUNRIFlhQUtuekxqK0MzOHhQWkhDWjhBZ2VhdzZ5czdXdGJHRTV2NytBZnYwUGdFL3Fra05rQ2pnNWxvWkpJRThraFZOWHI1d1Y5UGFlTHIgbHNhQ20zMC9NcCtiYWhqNFp3RGVIYXZuRnZsR2kzdk5tK0RuN2RxTHovNkw5eGdCeFRucFlIbHVjcFE3R0R1MFJvYWcrMHpMdXJDMiBCY3FZNEo5cUdFTmJoL0RzYWVRbjJNdC9sRGMyYmU2dXdPYi9BTEFBOW1EREZTc2xpTkNscGpNYVpJRmVwSml2aHdOVElUQU5nQ1RGIGpPVEM1UlM5Znd1QnpERXhnRHRRQmZmSGhqSi9mRmxHK2ttLzJBQjBySEYxMi9VMnB6RS9HTlI5aGFYN3J4b2Ruemw3aFhKSi9HKzQgeVJab1NtYlZrNkZjWXhRKy9JOTMyMTRKTkRSbGtMSWdORElCZ2JscURQUTlTRFl3WE5aMVAvRGFJb2xYK1oyVG1NaUhEVytCNzhQYiBVZVlUR0ZCWXhaQmhLdS9FUi9ZQUgwRStBbVpnTjBJTWg3TlRUcVMxV05WYVNwMmdxOTJXeDhQQVlsWG9ZWmdaTFVEc2hpSFlESmllIHE3RnF1Qm0ydnhoenpadytBdzU5MGphVGVGOWpzQVpYMEF3eU8xZzV4SmRqaDhCL0R4WlFzVTJkZnJpVzRRK04vd0Q0ZnR5cUhXZnEgNHlzK2JiSmpzSDM3ei9UeVpCMTgwaTBIaGNVODdQazlEalZsSFZUKzB3N2s0UWUwNXNpLzJUTVZXdHcyRGlwN3RMQmg3bnRZd1pzaiBzYy83QnY4QWlCQUZ1cTByS0dRVFNhWXlEVE8rTStEWUZHQ1VieXhheGZiUTVOOVFCakdzakRGSTdXUTNsakphaGsrTHhvZDN6bDRGIGNrZzhncjIrUFZhNXN0a2pEYWdQTWp2WUdkZ2pxWWRvY3JDUEM0WTlicXR3V3c3Z1BaQWUzejJwd3Q4WUw0eU1CbS95cDkrUWZQNDcgQnBiR0ZEaXFkWWdhSHdrNTJjTnJkMzdxTGNlVzROQUdKZHd0UTJlMUE2MkhzbmVEbkQ3YXhtTXl5TC9ZOWtOLzVmOEFZT21vaHRCUSB5TDFPTnRsclkyenFxVlVudWhmQklnMkdFTXBZUlFwaXd2aTJZcmNPbmtJWGJSZ1F6a3g1dC9nZVB1RWRnZ00vNzdBL0h6L1NNdnZJIGgwdzd6VmRpY05PRFUyZ1Z5a24vQUxlTEYyemJpcSsxOFpMa0FXak14RHNlTFBESFFOdnFVOE1VZW51c1VYQUc2cFdIc3dyNSszcS8gWU1HQ28ySlFtUWgwR0x5Qk5NN1h2U1ZHWlpBbERjc1lXdHJ0L3dDSnMrMlNnaFk1RkdVTGJmcWVLM2N2dDVzREg4aTcrSzUrdkFkSCBZMHVHTHJySmJWVlhyMnBVamxUVVBMQitMcWJSS2NDQmd3eU9Fd3h3TTJCcTc1NzRqSTNreG05bkt1L0VSLzhBWUFIc3dyUW1PRURNIFNXaktUZ2xuWnR0TWpDT2ZFbG8vbWlqREtUV1hlTElob2VMallFeURBcS9pcjRqSXo0cmpHWTVkZ1EyRFFUNkQ5QnczOCtoNi9iUDggSjBBbExHTXNqS3VKOFpza0FiSUhpR1FYcUNMZkVEV0JNUTlQYmhNVDJDSEFRKzdVNWJXV2ZsRE45SlNYWkgyQis0Q2Zmbi9xWUJzRSBsREozTTBXRFc3YTdCWHdIYk5UNTFoWFE4VldMQWlYSVh0OE5QZktydUNraUV5RGRWd0tRTU85TFBGMWw1T2MyQ0hmNy9pQXdBSDF5IFFPQm51NzFPNzF1eW5IY0NjWEhKRlI0RkZnMlZHZ3ZOaXJ4aWtjdkZrNk1DNlZsZ0xLRVpkOFp6RzR0aXdCejBTMksyTWtybTBvTVMgTmg2YmF1UE5HVFZZZHMrVTVTeFl0YkgyT0hyZGtxdVlRY2FkMVNwODlIWkZrWnp5My9PR3pnTStnNG9QZDBCdjU4dlJ5TFFVaHpiYSBpaDF2T2R6eEpoUHNqNVU3WW4xZkZsMXllNUFZdXd4ZkZXTFk5YlZkUEM4aC9NclBIbmd3WjlKQ1ZXL3Z6OGZRWDQvdi9TM3BxNkpDIDQ2Wk0vRkpXN1BET0ZrZkhKY0dFd3BWWHl3TmN6RjRPeVRBOHorbFVPd0xhK3M3WGFCTVlqMmpWM24vMy9DM2NlcGNlVUlXcjNDbEogdEdoQ1RSbkcyRlByR3ZYaFRaUHIxbzNKZGkvZGdkRER3cXJJaDFYVXNQZ0F6SGFBcHpsbVJuY0lrdkovNkNnZ0FCL2tDSjU4TXRLayBicjJSdVppT3g4OGlCR2Z1eHhPUjQ5dzQ2Y3NHWk1yeUkrSm1wVU4xdGJWMmVPR3pCQXJqRStiNDdaRFJXYzlzcndOYlhHMnJLcmR0IFh3NEYya1VOREtkdm5MVVl0c0h6SEMxQTlKanc5alh6L0l3MWxHS2NHV2VFbTdSZVBvSi9ZRUh6d0ZJVk10dHNDbjdHeWhxMkhUWmogdEwwenBOek5HcHBQVFRvazlMUXlOcUxhSDhRUDh6Q2ZSNmxWY01Zc29lMkRPRW0vQWUrL3YyT0hUc2tXUlErVThxZ0ZzeWRSOUF0cSA1VXp1WVpROTR6SWVGU2xkU290N0FUTElwTXV0VnV1ek1OUE9tQlNDVEdWNEZrOXRSZ2ZDTVFJSFlmb0hIL1VDV0RTZFh4YkFaQmQwIDM4cEo5akt0YmllNUhCMTViYUxhcjBEcGZjQjlrTXEyK0dIQmYyTlNyK0JYSWZrMVg5b0dZNGJ1eEpPQUVGKzMvRStBUG43RHhsWFYgQnRQZ1pKVmwwOHhPNE1iWlhjUnh0bmRNSW5rd3hVTVJrcEpHSmxrRXJENm9OL0ZKRnFJbzhjTVZUSVJuVWtoSTVaa0dSVExkWWoyRiBUcG1VK2wyV1l6bWpUNCtjMnRXd20wVFgrY3lXUkVtaTJoZWxDOFNFTk9mSWEybitEbldoQVZXUW04dmdzWjRUK2dRRy93RG53QUErIE5vY2lZaHRtMTJoTWsxSzIzTlVwWmZRcGcvWjVYMmkybjIwR1RFeGNENVcvRDJwU1FHMVZNY0c3eXJKTjRTZFBINy93RFlEL0FGZG4gVW9qNkc4cmlwblQ2U29FeG1rcFFrZVlUMGVXdDhEVTBOeXF0Z21CM0J3NUlQWkp5R1FQWVEwYkVXaWV5TzdXajc4K1ByNEEvN251ayBqWWxlU0lHWERhQ2FmWTlWcTVpbktjZUtaVDdmK0dmdTZ6VTBWWEMvV3hsdlR6TEl3R05oWHg2cnpyREVXelBKejZTOEFWOENBUVQ2IENBUDRNYVNPU29iZE56N25TZ0tyd011NzNjOGloUjV2aFdMUXNXRWVlRmNTbk93YUZxY1Z3OGMrNiszeFZtaUZxQm9iaytPemtldjYgU3RobnhKeERtS3J1Q3d0aGlxWjVEY0I0WkRwTlBaREZnV284VDAvWXd3d25UZG9MUEJ3Z1RnNEFCL3Y3ZityYUVLM2gwT3BvZGFUMSB0dUE1cWVTNE8zMlJINDBCaXRrcDhoa0poaVlZWkpoQmtzWURxUTRQL1ZDdXpJMVZtOTdxdCs0Q2YzOUJRVDNVOVc2bVlzQnNKTGlhIE5yYzlkTGpHbDEraHc3QVhwa1hGZVBPUmk0QTc1U2N5MVBaa3hReUhia1BXZTFsQ1l2bXh0SjFHSUlEbndEZ0lCQjZhanh2REhjajUgYlVESjJHMVRFYTJKQ1REc0JzY0hOTlhvdGN6V0FQeVd0cmdmTVU4NUFYeDV3UDJ6N3lkekVjSnNpUFVYZ0Q2Q2Z3NllkUmxNa0FYRiBJeGt6QVFySVpDVTJuUjRvWThOdTN5VmxrenlGRktPVkdHUkVhWm1EdkxNckxBVjdIZVQrUjNHUko4SlFyemZQUFN4eXlsbVhKcHZhIGROeDRiR3pxTlZIK1lIUTdnVHkzWnROZDN4b01XaGRscUxmd3pOd2NIYlhEWTdJRjJZcnZoTkdCdTN1YzRDaElJRHorL2hMSzhWL28gb1FxZ256czZ4ek5UWk5CWHhYK1RjeG1uUTRxVnFhT29hSVFXMldoOVNGSnkzOWwyRDRGcHJlS09oWHVUZVRnUTVpRGZqMVJNR0hBVCA3QWYwNStuK3A3SGRLeGJZbGtLUktBNEV1VUFUMWJsbVNNaHBKNU53Y0ljT3lMSTNoUFkxVUN3QUs1Vzl6dmdXczc1ZGdRSnNIdmlBIEFJT0FEcnNJSzZYTElFak1YT0Nja1EwbHNWNjkrT1doMmhUYlozR2NCNkhEWktIY0U2djZybmNQZk9OK3d0OHN3bThXanNnUHRGLy8gQUg1SWdpSVpjTk1VTGlRSXVud3hrYVdDV1JpZHc1WjdLS0JRd29ubngwWTFVOFU4VXVuazFJZFl6RVdmVVo0T0lwSVpRUFNIOU9kMSB1L3VCK09xNVpPajkvc1hJOURBd1dlaVZ4UDhBVG16aCtaV3ZxZWJ1RndxNWt4aVUzTU1vNFRKcUZ5elU3TVhWMWlrR1lJRDF4OHpOIHo4Z1Y2SXNETHo1UTJHT2w1K2RXUzlRUVpZUUJNSUZFalRHZUhMU3o2YTlUaGxtcVQxZHBoR1JhK09IRkpVUlJEbFdLbWlBY0Z3R0wgRlplYU9nejYxcnMvbnlKMDQrVENzR0J5UFlidG5SNWFlKzU0U2I1T3dCWnRiTlpuOS9KK2YzMVllY2dINm1md0Q3LzlQMStqL3dCVCAxQldKbUErQnpGZDhHcE9jMmtySUVrWWJJankzQVVtcVVXVXlkNExnaDF1dGhsLzRMNFBBMXpOWm5rcDdqRWU3QWdSSFBnQUdLRGhmIHV3b09pejBETFBsQzlMQjBsKzFDSko4R3dFSWxxWjlaNGpDYlhYUlJ3WHpGS1BnWVFaSFFyaWd2OTBJNGZIMmZjWGZERkpxNDRmeHggd1BBV0RqL1RQVDh4SHpiZ0pKcTVra2srbXh0a083aHdPeUY0eFY2WUpybXhnN0Rha0txME8xWWJCWkJ6OGxuREJQZ1l0WldUbG83SSBqZ2VBZ0QvN0FBNDE5TEx0RndFc3A4eVczVUxZSWNrcDZacGdHdjJ4d1Y0dHNKc3ZoOE95RTlQaEo3QlQ3d2gyaFBwMU9yUFQwVUtMIEt6d20wYVRCVzZmN1JJTy84L2ZpVmxTS1Znc0pjaFE3VEgzK2F4RmNWemZKdXgrT2dETkl5eE51TkQveTBYS3ZIbHNsODF4eCthOEQgclM2UTFzcGxwSzQ3Mm90bmx5MUgrc3RQL3dBT254S2ZjbG9PNzQrY2ZoaDRhZHFEY05uUjZXdUQ0QzNXWXhvRjZoUm0rWUpJTit0MiBvajl1cjREWUQ2cnZCSDFVVWpENHUrSkpzRFl3MlN3anI0MUZXQkU1bEZ0alYrZVQvbUxkVnpIQU9RbVZ6QW50dk1DYU1UYUJsbUEzIFoyQ2ZsM2dJRDhSSUtDVk9tbUNhajBua3FUNGh5WHlrV29rdld2UUtHUXMyR2VybXZiRkFtQ0V5SHc4UHVDM0JmR0NwVWN6Mnp0Qm8gZWRpTmhOOEFJRDhmNENBQWRXV2tFS3p6VXNEVURSUStvY0RBVzcxVTJCUDFJSzdEOFZ5ZGlndUg4TzdIRFVKVDh5d0ppckJ2QTlRTyBKTlpLZm84YjJFT1ZGK2lDQS9UcEJrTVZTc24xS0pOdHlDQnM1SVkrQTBycFE1am9ieVpEYkxMM05sd2NhYnR4QjAwenRDSFV5dDJTIFRpcjB1ZkZQeU1EaWR5Mk9LNDBhOW1CMVR0clJhbVV1Yy9XMjBPcFUyWXo3VXNpSk1sUGxaWGRLWksvVDlTRXd3dG1HRmJzYTJoNCsgZDR4WFF5Yk43ZHJnYjhmQUgvQVk3L08ySlNkaUhyVnJlNUswMDZza3k2UnNhMmRPeCtqY2l2VEg4UHVBdFhEcjlQaDBPcXpHS2V5UCBGMGorRDhtUm53cFppeUVkZ2wyZG9qNzkvUU8vbjYrekh5WmxXWE5ycGNyZTI1c29DRVUyaTZ5UkNJWXhhQ3dyNFpDR2htRnZnYSs0IE5RK3Y1OVZtSGxtWjBKNFprY0lsR3dtT3diOTdiQWZzelZEVmZWTUg2TUpvRm1YWFVOWFZ1Z3lUU2VrR2NBOHNwVGpCcVVFa0RaWisgcXBEbXAvMjFBc24xclR4NmhQcUY3NWo2VXQzd1lGL0ZBWU1EMi9tQTJuVUZTOCtQeklZbGNpeDduamhUTHdlV1UxOFZadGxySjZSRSBjYnZXQVFTbktpb2E5eWFTc1JWWTE1TjN4VzhoV0Nud2luM3Q0STA3U2RHWU5sZWFMM2FkWDloQldpMmRPTVo5RHdHL0Z2ZTFzeEFoIDBpZUFWa2JMa3VldEJUMCtsMVNVbEpmZWU0c0lBLzZsOWVUT290Z3ZEVDdxTGZLNnU1dkNGeW1uVjJySFQvV1dRa01Nc1hHRUpwV3EgeUNHNFdtWmg0QVBVYjk3TEJzbmN2Rm9aU250M1NlRHlDZmZzZXZzZ2V2aGtPc1pTNXlUbEJJR3cxZnFqU2JBL0hLYXZPWEcrZVZ1eSBHSWI1WUV5ZFpkb1dZanJZeTM4RmNZc25NUWwySFBBSDkrUDFGVVhVa0hVNjdLWnVjTHN0a3RHdDgwZEp0aGZUeVZzSk15S2hwRkkxIHpTWkF4RFExdmpROHhQUTJEbksyekZPQjRyT0FSSjRPZlB2MzlmYi9BTkdOeVU4K3hIWkdmL0RRam8xODVXZUxGVVRadmpPRXg5bUEgL09jZTU0cXF0aFhnMzVzbjlVVy9xc3RETWluSm1VNzV4dFY1VXQxbEhUOGhQU0UvWVphYkZNT0VORG1WWERXMkJiK2V2ei9oakNkbyBhZEVaWjdYTzFvNytBUDhBZ01mc0NDVzZMVHhiUVNuNVZoU1NXbmhrWkJNZkp0U09XdmlwV2hlQTIwbmo1aTNEVDBJdzRMYlVRVDU4IDROajRyakp3NEV4QmZyK0l2QVl1WVhaQ21hekZYS0ExaXlhYjJnbEppRHp4Z1BMbVBxYlhxYTVPTGhNVCtJTWpnUWh0U0d2OTFJYXogdGVBd21jQ2IyOEFENkRzRy93Q3dkYlVveE1BdUJnb1V5VW15QmRtMUtrVi9xaXA5UHNKYnE5RGR5aUc0RUpoaXEyU0hNWHpIWld3RiBKcURzeXpqaWpJMjlHM2J6NkRzRDgvYys2SFR5dUlaVkNQR2tjbTJxTUxkNjh2Q29vU0llTVhHUEh4MFVrY1VyeEs4a2JQTnQ3WWc5IEtPUE1keXp5RE1KSXVLZG1Kb2s4L2lldFJEWUFOSHRWdmdTVC9NTTZleHVtVmZwTzFQaVE5T1pXSWgxMHVFSnRiM0ErQjA5Z0QyTlcgbi9wWWljWnE4bldhejdXZ0UvcjRBZnczL2Y2T0k5QnFhUllGV1QyMjFEWi9UbWViWmJma3F0VE5pMjBTbmREbElaQU95Zk1oMlFRRCAxekExQVR6bjlVTkNOc2J0MnVCdjJEQjJpMkRZT254bDNyQ1Y0N1VHUElkYjB5eDE2N05pL1VrTWdXVzdIRnFjb3BhbG9Xb2hUREV3IHl2cDl4ZGp6M3cyWkdmRmRtSjJwemE2NnJRZC9BQUtpUDdCMVBHRXlHZXJ0UGlsS3JxNnlFeGpDUzZucVdZbmxwaXVldU05S01jd3MgaGtEaDAvNlBBY09WT0N5c3RHSXhHM3Y5VUh3RDl3SEErQWt4REtJdzd3elB6QXpyRXRPb1U1Z1N6eFpZWml3RDhna2ppeVFLa2huWCBDZXNROGF1VEcwYkFacElNVGVkQXFmdG9tamZHNFdEUjY1cDlrVTBocVUyVEtBdjdFd1VhQkllemswUzY1VjhDS0crQjJRek1IaG9NIDlQbm8xUGt5YlFyMW1zdkhzRTgvdi9BVDYrZlA3eWdkOEtKWVp0Q3ZoSzFGZFBmMTdHd2c1RDVoUThwdmx0d3g3SytXUVkrdnNsZEggaUI2eG9hTjdQZFpzM0Nic043Ky9jQkFBQUIvM0ZHUWhZRFJobk1hUWVDS21haHNrc2ZOZkUvdVI4VklmUDJlRlpHOFRDRDVzSStlaiB1RHl6QzFjWVRPYkpzZUw5Ky9nQUd3TUZQS0ZFMkdCWENnZFREMXBZVGFwTDh4d1gyeGJUYWJkL2loK1lVbmpNaHd5QzNWWjRoQXRSIGszUEJvZVdZNWdrNzJmOEFvSi9mOWdBQ1VkR0VqbThuUkFLcXN2SnV6NHJ4UStlZU9nK29SK3hHZUxMeXlQNXFxdnRIN3IvVS9ucU4gbUFrdElvUHZkTHVBazd1VllzaThRbG9hdnpDVStWa3JxNmZ4dER4ZklmSU9LejNDeXpoaFpHZldWaDRPQk44QUFPN3A4QjdIc1JacyBIbExHeTA4QWVtTm9FV1lOcWhCd3c0a0hBbmtobzQyUW1PRko0cDYyUjRxcEw1N0V3VFptZ29NM3czK3dNQ0NmMzhCc0hVT1VRakhhIE04Qk0xNlNjSlV4U2lHUGhoNVllTEZsbnE1WFBoMm9IWkhCd0h1RmpZc0Q0ZHA4WVRGdEc1by81UkJuMEhnUG4zNEFBbmxlUXR0RU4gUEZpNWpiM1ZEOGVNVnU0WFJ6dzloTGpTcGc4eGl0ekZ0YlgrMWQ4V0JQQnVIR1NtNXZLT0VOKzJQMzdmeitIVFN6UnZiTzZ2RzdMUCBKRTFJOVk0RldxMys4VVFNYitiQUFudXcwN0lBN0lqeG96WlNESThpU1dodUFVdGVtbEd6WGR3QlRLeVc1Ni9rMnJBV3hvZVZNdEd2IGRPOE5xSXNMSUx0QmVzYXVVOGU0TWllaGgwTWZEZzRwN2JYTGdqazFjb00yTzBmK3FCaXYvd0JnWVJUTXF1VVl5YUhzWVl0MXZkelUgTllaQmdrbjh3UTAwVHcxUElNbGJtSWNMbUJoVmdXaTJnMlFZekZCWk5HM3VycnNCbmtFK0FBZnYzVW02Wm1ZTHNCOFEzZXZVbXQzSyBaNGVZU0RyMVZ1UUhmZ0xJUGhobVNuOTRYOGE1bnNLR2oyUWpER2ovQUZ4ZDdSOXdCOStma0xud0FCMDVyWXIvQUdhcXJVMkd0MUs3IEtmMjBUUTZyTXNpV25vWjRTQmxHRjlERG1KaGlHdm1LNW9kd3JRNEhXYnhGMWNNWmdiczdKT3dIOS84QVA3QjBCa3pwTjN6M0s3TGwgSUpGeHdkM0pHZUZ0UzBvc2tYMGFsWUFYQzNWV0xxK1FQTkgvQUY4ZVNlcWM2cUE3aFl3eHhsRDBObEpWZTFScWNqdXcyUFhySWg0YiArQk1EMC91cHM1aFBjRG1uaTBQRC9hS0hLTXh3SGlrL2ZzZC9QWWJBZmMxWGc0OWxxOU1yZ2FnYXVsNVNUVGwzRDlOTmthZjFOa2NuIEpzdENVWHI3Z1lleUZ0a1R3OXFkajRFR3QyWVorTTBaNE5KSnQ0QWMrNCtBNStmNldJdFhqMXlEczZBR1pMa0d2aklnTzhmSkR1QmIgaHRTdTdSWE1NZXlURnR3VzBQallNRHdOcWhqSHBYNXlzdkFRMmJlTUFIZ04vd0NmWTNHdFNZWUExWFROKzAzcVdKVW5xTWNPYmozQyBzcTN4UXhmRXhkakxiQWh1SEc0ZGtNQWNHcE1IODR6Y1h4ZWJNKzdYYWMrZytmeHdQZ0h5YWhWVlZFWlNXWkpFaTFCZWtiK1BNdjIrIG5qa3VJeWJMSnVWSzhyR256UDFBa1JuUjQ1RzB5bktlTjBCRWJGTEYzYmdEajUvVjFYMUdXSXljMHpseWZROWJ2YjQxTzNlaHd6aDEgaFhBTGNyQ3E5cFc2L3RSUDB4dUZWMVdRRDl0TFErQ1lKb3JPVVdkOE40YzRBSC9idTVnQTM4OHJQV0pyTjFocDlKNmN3TmVxVlAxQiBVcWxmRS9KcjB4MmZRK1BKdGpjaFcwOWtXN0l0UmdtUVh4d29kSDV5c29iNXdZSTdHM2Jmejc4QVBuL1A5S1JRWHJuRHVhdHFHMHJWIGlTckZuMHBQMVVMd0ZqSUwzNGJTR2l4NGJBSG1vY090N0krRkJ4SHZqVVlHUE82ZjdKL3I0LzUvNzkwdHhFZ1BHdGNSYUY1MVhLVHEgZ1pEZU1pd3ROUVozZkVSWHRjREZjT2VieUhoaUc5bGdIb0ZsMk1IczFaYU9EckIzQTJsYi9pQjkvUG4rcTJrWmdBczVkRWpkWC9sMiBaMk5FVWNiTVZma0I3SEM0ODJqVEdRUmdSaEpYZVN5bXlrcU5oZzBiMis1Vk5sd29Ra2NuS2hjZHhaRmU3bVN6clZzWWxiVnpWZmN6IHN2VjhodUdtZVd5YnBZVnlWZnQ4d09IbXJjTndtdkdKQURWWWNteks1UVl6L3dCYkEvMy9BTno0RHF1elJlR3FUSm1KSzRtMmNFYXEgK21hbXUrRFRzNGxQRnZsT1hJaG1GOFA4UDhrTUNmdjF3UURrMFk4aThCZ3c1c2hzNStoLyt3ZE1GYlhxdjNESnNZeW51ejR1QjcrbCAvd0NERFYyR1pYTk9DZE5CNmIzVVd3OWJ1QWZlT1dqa05WaDFuMnYremIyRTkrMFgrWi9yakVTUWFSZkRWYXVrSFVoaGt6K1czSXZoIHoxZnFhZUNzYUpYS2FIWDVpM011QVFIVDFvNHBMNTZ1WEFtTUYyaGlpN0k3Y0grd0FOL0FjKzZTSTVvcy9UK28yQkhOcG9abXgwOE8geEZIR2lxMU5zK0N6SEY4N0FwY0xZM2YrSnhNWXR5Rm85UlBISnV5U1NkbnF5bkZMc2tsVSszdTdqZldBMWRmRm5HclVGZkJpcGJhNyBZbTdDSDJQUnVvQzduQkQ3c0pyNVpBNThNZk1tTXBCN2d6MkFEWTF3TXp5VUtvM0Ivd0FYSTU4QWZRV0Evd0NmUVlHd0VQTFNOUGRQIHdKZGtFZzRGa0pXRTBKTElIWDFxNVB2aXU0RVB3bVlaRERBWXRUczlXazZZOG8xb1dnVDlnbUtTZFFmdng4QjBlVVhWOTZNYTNEU2EgMG9GL1pHTkpOMDdIckhPa1dGTVZ6eW52MHh4VDVnZUdZWTdSRGc5dUF6M0FZelUyMGNtQjcyN0hPQTcrQVBuK1FQeWZxdERLVlZIMSBPSnJkazIxV0NRcXY4dFgxSUo4ZDNoOE5MVzByMlF3TFlkd2U0Y3h4WkxHQTEvc1poblpTZ3RhS0hIWUp6aC9mdlA3QUFQOEFSR0YzIEVySTlZelRXSzg3a0xSam5JY2pjSkhCdXE0dXhRbWpWUkd5bGtraFdLT1poRkdnMnBZWldaekZFdU40S29CejhraGhpVkwrNzhJYnYgWUZrYXBVM1RIVjFrSkUwWmR4QlZWcEYzVEZkWGg0SG5CZ3RTdDRhMnljZnc0azM3R2hreWFHaHN4UDhBWkRqOC9BQUhBVjhBZ2dCVyBuN1F1UzFjeFZ6YlZzNXRjQU5ialhkUHF0a1lHMWJpZ2RoaXJhKzRWWE1UN1VaTEJmT2VkcFRtMlBMUWhqRms0NnBLU2NBSC9BR0FiIEFmeDYzTWc5UHFDbDdPTXU5aFNhZjVVcFE2M3JFOUlYbHNXbWx2aWg2Zm1CNFllYW4vRGcwczRBUWQ4RFdiK0tCbVdYa0pkaVM4YisgdnYzL0FFNjJ4bXlTTHI4T3IzU24zSFc3UUF1U3Nnd0cvaUM5c0tHa2N5cXRnbVEzQ3lBK0k5YmVQMk1QemtYYUgwYzI3VmNjUG53QSBEZnovQUorMmVMRm1VSkxnNVFobEhGRk9RYk5aV2JGZkE1dndNWmxWWGlDdzZZakc1R05TVEFrZHBhaHVTQTN0cHhlVGl4MUpWQUtqIDZscVFQSkVXNXRKaDZCRGY2ZHBDSFdMZ2tyY3JVKzdJbHlYQVB1QmtMMXhUNWlBaEtvSzhRVHhpejRvVm9FOEFucGRxVEErN0FBUU0gVi9BL2lzc3dQUWR5MG5rd0VpdmJJRzAvQzFhSkR4bkRSOHNPaHlteDhRMC9oOHlHNE1uSGpKd0N3WHhYSmpncUhweVdkUXV5QkhhcSAzNC92NEJBUG9Pd00yVG1LK0xBSCtlaDZlTGFRME01YkErdDVsYnlyc1RiUXMwOUtEMkFZcCsxRnVHSC9BSjV0K2VDY0JpTlY5TnJMIE45MjRPQVA3K2cvZndIWDB4VjlickY0QVlxUmtxVVBOSkRVaXdDVU5wbG1KUUZobEM3czVndDhraWRuM0NuWUZ3VC9tRXhoUlg4R2IgOEg5QlBuei9BTG9PT1JnOGNwWkRORGpNSm95b3hqNXJKVWYrcjRBWTRxRXNjSExqU0pLQU9XT1VPMTdJaDR4N3JpaWl1cjhObDRzRSBjMmpiY2hXelBaN21BMVVub0RKcHVmTGFVK0IxTGFOWk1pRVRMQzlQdHFmRDNnd0dEZk1PSVpEZlU4bXMzSUxHSXlPRUNkcTlnZnNPIGZBRUhxeTBlK2ZsWEJZVXF3S3hHb2RYMlF5UzNESjA5bzlzR0s1RjFraHkxdGdEbUtyVzN5SFY2MmNmS3ZQV05XNk04K3l3aW81dm0gM1B0Z0FQNS8zNlpEWlgrWll5M2ZHdXZLejJSY1hBN0lwMS9jMS9jZW1SYkdyS3htZ3h5Umt1Q3Q2M1EyQndPVDEvQkh1Q29CbkYzcCBaT0cvQjRQK0hQaisvZ0FDbENNaUcwV0pNZ0ZHcC92SlNyRi9keUhBekFsRGxkN3FiQW9lOFlHSWN3T1BNVG9DKytIR1FaN29lMmYxIHNFNENmZnNRRDl2L0FGZEJqS3NMYlR1bUFTTWJUbS9tVkxhcXJ0NU4yM0lBNkdQZGorbnpYY1NHYU10TktkeUJjdjhBRE13M0RlSnkgemFRMkJqanplNWY1SmtaQktGT2hoU0JPT2NNVGkyRlpVUlpkalYrUEtOVTNNZDVveFNNSXhsT3lJUWlKbk0vcXc5QTFrQkRXdk9rZSB1UWRLQlZLT2JnSkt6blFJUXRHc3E3YUh0WFhyR3ZXbEVyRjVaV3BEcmtGcHRKTjRNQ3EyTE94c2FQa0FUWHB2c1RJekZ6MGsyd3BsIEsrUk45RXZQeUZuSkVZWldmR2crcUdKRzUwMmxQa1dmazhjbjgrT2s3akRnY0FjQVdUUS8xc2YrT3EwSEh5WmZENmt1Nkd0eGFUUSsgNklsZkpYbHlGd3BHcGQwaVRDQWVxNjNoaDF1d080d0ZmcFpxY0ZrWXJ0QXl6RGlUellHZy93QkFvT3dkVzA5ZmRSWE1RMmlLWTB1UCBsdGFZNDFaVitOdHF2MkdHbWxHRnlpcmEreUlhMkdEcDlnVEFmbnNLM1psbHBmS2cvdmdJK0JmdlBnRDUvb1BoNWpoYUNHU0ROdVRVIHRlb1kxYkUxdWh6RitzbkJ5cThURUY0a0ZyQXhERDJSdkNxZUhlWVdDYXUwSXlNRENKUE9QUDdBQUFkY1poT2VCYlFuNXJrcTF2YWkgNE5VbDZuKzFhZkVjRU9LN3M3NHQ5azNBT0haT1Boems4ZytUZU05K0ZjWnNkWE9ydHY4QXdId0hUSnlzbTRaQWt2b3k3a0IzZHg0SiBNTWR2YW1pc3lsRG5rRGhndFhrYUtLUXdYdzY2aEpwSkJJZzB6UUxJQnFkTklEcGRUcE5UL2VGN0pCcVVtanV5clJHbFpWdkhqNVZnIDVpM3BwbFY0L2g1OXpMZHNYUlc3czcyRW4wMlVZYnVsVEI5YjZrTlBZY09HcS8yVXJBYmRuck1ZVUZzeFB3bG9vKy8vQU9UOGY2UEogOXFMK1RJbU5GdERiUlpMZnlaUHlPWVBCYVlLVFVoOEF6SEJEUTYzdmdQTXhEd1ZKZ2dJOFB5bTJNeHczaWJSMEhzR0FRVUVBZVBuMyB4WUdaUzkzWG82MGhtdU5TMXU3ek5UTm1vOWUxdlg2NkhmTGEwOW5xNW1KL0pBL3c0WkNaMzRjTGErWXpVYXJsQmhOSCs3OEJQZ0Q1IDgrQVFRQURqa1dRNlFLenVBZStWamFOaFNpU1RZUmlaVzQvZ1pRV1dmRmZoNkd5SVRoalpCQXcxVkxqV25HOXI3TnJKTjROMWNiQ1cgNkF3MkIrUG4zN3BZQ3RHb0NQdlpxbHN1RzFuUXFyYmRSOGU5UFRzcXZkMFRvMlJMT2lJeU03UlJ2TkxIMllVWTFsbGJZa0dmYTY1ZSBlVlBGRzZQV2VvQzFYaEpVaGFyR1crM29ONHErdlh4b3MyR3J2a3M5S3F2NWpneUliNVc3QjdnYlFSRWVuM216S2JxOTVHVlc3QkFtIC9vTDl2L3NmZnVxclVXbnlFZ2dHWExhVys2bGFHSkxadHdjZkxjQ2wzQ1UxOGgxZUhNTGZ0REhwODdrQ0hhbkJrWVdVSnZQQ1RidjkgQmZnQjgvOEFyaXlGT2g2N1BqMitLMEhxY2hvYjR0bG1EVHExRUtjTUhnSWx5QWh4NWlaVDhNUE1UMXV4bEtybTJxNFpQdWcwUFBPRSBtcnNBWUIrUG53R0NEc0hVT0xaTHdRMlRPbjZhUTVMSlk2cmY5NGgyMHJ1OEt4azFUaWxKaS9NVzRlQWRidEJiQjRyODg1TW8wVzBWIGZabStCQWV4OC9BQUg3WVQ0RHEwWFBjRU95KzRVMjJoYVVPY2J1bmtsbndGTXZnYzg1ZUJWUGF0RzJNaXd4NUt5eU5GSkVqbkROV1cgS0NEUEdoUllpNzdRQ1RZcklhQWVVMFpNcXl3OXRXZGIrU04yOGx2RHU0eW9zdUxLcDhoYWkyeU1qSncrWkIrK0txM2NDTjJiWmlZTiAzTnBKekhnQi93REVmbnpaYkg1ZGZCMDlrbFZqR0Foc2thWERHTENZQkxJZVE2eVBSUSs4Y3doek1HQndnejAvQlZtamJNeGZCak41IHRKQi8xOS90OCtINm4xOWZ1a083TzdHcXlhOVBFdHBjRU81cENPWVBXMHZPVFJEWWVTSjh4a1F4OHdIOXRhbVFtekZFTmxyTUdrdTEgWGNCUGdOZ1BuMkRZRFZHaFdmS2NLbFBBWHgyTDJEbEcxUUFIeVovQWljcGhqYVgwOXd4cmlyRnUxR1JnTWZBWUlPSWNvVXJCWHQ4bSBETnUyT0xCVVcvc0FCZ0FiQWF1clF4aUNONDhzc0JLTUhockM4MDV2TzdIY0t4dm0rQUs0eU03bmN3eHJHRGRRNVZlRDdpK1BudC9IIFhKYURRVUZ1amhSa3FxMlMxRTJ2VUNuTFlUMnFNSlczTFVZa2JwdUQ1OHd3eVExOHdqbnRONTZEanRpdWg0a3puMG5BQmkvQU9mZUEgUXROZDRMNmt5Vmk1VzBreVNVVXhKaVZlN0VnOWhRMEk5d09MTXZENmV5T0FldjJTY0JJWUExc1p1bUZtREFuK2xaL2dQNy9pZUFGVCBXdnRHYkRQVlVrT3J2bkR5UkozL0FNYUc0V0ZNZkZkSWN2aGo1aUVIVDZyTUQzQUhBNGtxMlRabnNyK2MzdWt6bXdmdit3WXZ5cnJlIDFId0FEeVF3c2FFczVJbUxjdmVMVVIzZGtjb3JZK05FTWZETTNBaDRMYmdIT1R5QUpWTWNHNHVUSmZTZlBvT0lFKy9iK2Y2a1pLaFUgQnhkRVRkWHo0SmFlZi83NUdaeWxjWjQ1SDNFV1ZjaXdWOWx2NGc2NFZWWi9MV2ZhRDRvVU9iNE94OWJxOXExUFZlbk82Y2xBR2lrOSB0WG1BbGJhdXZiODBNS2ErUTk0cmQ4NWdIVHBrNVRRSzBCY1padHJHTElNSmFMdHYrd0h3UHV3SUtDTFRHUlBucTU2QVpKREhiS0pLIFRDcjB5MUk5M0dKUUFTTEYybzRHTzZsSmgrUUJ3ZExPRDRENHlURnEyNTQvZGdlLy93QlFIejRFQngyZzJkZ3VTWFRSbXJwSnlhMFYgUWxlcThPemg2Uk1HU2hJRm9tTDVod1phZlE1Zy93QTh3SVR2dWU2Qy9ZNTRRSHY0QUJ2NEEvMDdMTWgwUFh3LzREUnFvMDhUTGFmVSBDSmFMSUJ5SllkTnNaVEYyaGdRbUJ3OWtieGFFTkhiV0JTZ3A2d3pib3NvcU83QmNOLzd1Z09QdndIcEs2bU5HaFI1VXoxcjZpWFRxIDhXUmxrM1JMUGdwZEpJWTAzb2dpU1I4Y2tNd0xCWGZUQTdzckIwVFRKREhLVWF0cU1aYktuZzVjQ1FnOXZqOTlEN3dzMWNWMGUxbmYgNmxrWkQ1cU5YN3prWkxqWEJsMGpLMWlSTUtveEp0K0VKTnJxR3VoeHhIMUh0akdyUTBqNlIyUHFzNDBkOUdJTTk2TU0wMndlb1hjQiBnT2tZZE0yV1pjRkU4THV4YnIxWHBtdmFmMUNHYXZpbHE1MUJUQ0RLaHpMc3NnUFI1amx0d1ZLMUI4RVlvci9vN2hOaUFQd0Evd0RYIHord0tmVW93bmJCdDRGcmZPNmhCa3c5bmpvZnFFWThjbEFTMjYyS3hnVUlNeVFvaUdPdFNHOXJ3TC9tUi93RG1aaVMxaDZmVUZOcjIgS0hnd1lyeDAvaGIxdzAzMUl1U0VsTnJwcWY2cmZJWTJaZEYvWk9zaXZZWUdwWWxudEFkZm1YdTRwN0l0am9Tcldkb0tidXRyQXpGOCBHYzVDR3VjZ0FCL0UrQVFmY0F5QlpJMjlTZWFaSlpwNUFESHVTQkpKZDFJbmt6WExiTWhVTmlNckp4WHBidEhOSk5LVWhpV0xhaWtDIGtoNUhqamppYVZFcnZ6RVlMTGtOdTZ5Zkt3ZXEvRDdMVXlXdzJjeU5UR3ExY3ZWdjh4d3IxYmFJckRZL0pQbUxlOGRreDlxUWY0c1AgNGpIekJaRnREdzhuT2JPenlnOGY5MzcyMkNzWlNxNzRSdzZHazF6VmEyZWJjNk5ML3dBRmtSMGhEK1ZFc2F1UTQ5UFd6RElZRGo2ciBnOGdBdFRJVEdOSDFsSDVzYjU4QVFRRDlidm44WTI4RWNkY2xkMTdhR2FCTjFpVFc3QXMycHlTZlU2OElBeXE5S0ZIQmZ2aFBUM0JiIG1ENjNCVHlCNmN5Ym1ydEN6NXVyZ213UDJIZ0g0QUFBV0tTeCtvUzh5bWRYT2JuYjlGc2hiTER6eVRmQ25aRXFtMTRDcnVEaGZEaDMgNE1PQkRsU0dRQTJwRFp2RjhtUjNaM1NmdjJQN0FmNkdMRUlxSzZlcGtyaVJ0dVNLU0dWNDNSbzZhL2FDRGtQY1JYYlprdVc5dVBGTSByeUpISnhIVWJSdWV4a2p5cU82YXhiWFMvamxWaDVBdDNPSk5scVMzeHN6eEozSU95VHlFeEt0dVhZeFQ4SjF1K0lkOFRNRnVlaHA2IEhlQzJzczFYMDN1ZjNiei9BUDFmdmNBQnJkRjJSY0VnK0x5czQyQnpiSXVPdlE2SGN3ZVhEcVd1V0U4ZVQyQlBNVlhaRElZSWNWN2cgY3FUeWF6MnYrajJpYitndjM3K0E0RDAxTXpUbkRYS2JZNVYwbnVLMjFZUnRocSsycU5yZUxNRnhTejRydzJDWlc5a09FeUhZRU5IUCBmQWhMYXpqVisyTEx3RUNKTHh2L0FOK1BvT3dkSjl0YU5VREc4V3BsUmM2clNRRzFCbE9aK1RUS08yWXVTYnFhRjZqRnNmcHZUMlJQIEQzd1BNQTYwdUY4VlUvYkxrZldaWkIzWWtoRG13QUQ2Q3dId0FBK2NTb2pHUGNobG1HbVpKSVNZcEVUWkM3ck9YbGppbHdEb1J0U1AgN2psaGE1Z3JaTkR1cEtxSTRqQjA3ZGtjYlk3YWlQSGpIRnJKYnZ2d3RjeVFxck5RRmRJNGVlRnppSWRJczBMWnNkY3ZMUGlCNHF2WiBoL0ZPZjF4OERUVU95R0Z3T2ZsdHB4SkxUNHJlYzk3cnF4QVlBRnVnQUQ5c0dNbGxnMStVVW9jTTcyRlJWZWxMSXRwM3JZeGJWTHU5IGJ5anluYlZYOGdZOEdSa1QxdkdhY24xL3lwd0pzeXgzZlJuZkQ2T2c3QWY4K2dkUGZVK085Q3RiWmNWQnJKM3BXTlRER3BjcjArTEQgdUd2aEUwK0FVSU9PdFFQaWlHRzgvTFZKK0xCWXo0ejRxOVhyQ3hoaGc3cEhBTU1EeStmNCtBVFVoVFczRzJBUHRrbkVtZ3JDUUhkbyBaTE9ZRjRPVWl4SExqZnpGc3V5R0dSZm1IRkxpYlZ4bmRCbG1FM2ovQUZVQUlQOEFRUDJCZ3VOcDNqY05IOU84cVNKSEpsdTQ1eHZFIHgyMlZZM3JjRFZJamVLR05rOU5rMkE2aUo5MUJqdUtWeHZHV0dWZWNtcitKaDRQdUorS0lvaHc3RnFWNGFvRG1lSlhOcExoMjA3bUsgcnF1MkMzQTY0dGc4Qmh1REpNVDN5R3lkeUlGYUVIdzRoTEwxVjZHemJGdmU5Z0FBRFlPZmRiN0ltSGE1ek03TnRETytaQW1jVHZnbCBaMWJ0a09MdERSOHdmRDRlWTVoeHNIQjRIT2ZDYnlMdEFaN2IyYk9uMEUvNS9IRS8wd283STZad3M5WHhtNEgvQU9lazJrdTJBK0RyIEppTGI0bXJ6UktUeUlka2NJY09ZbnVFNVN1QURPaDhaRjRvMitjS3E3OWczL3dBLzBwWkdPVUd0eUcrTWN5TnVpMmJVMkJiemlDUjMgR1RlNDI4RVdSRFE3SURReC9ucVBJUWVjL2FGbkU0RVNMUlI2aWZnRy93RG53SFFrcUpacE1hY1F4NTR2THR0dEExaEM4anhRM3VHOSBwVnlvWjVZcmlVSHFHT0lkcVBNY1I3c04zQUg4WlZpUHhadngwMm9jeDVGcmQySWJiWG9RbFh5VGFLUThPeWVQaDNCeGVKejFEVCtCIHNuekpZOHdxd0dFOUJNRTBhaDdrL3JidWxoc0I4QWY5dVA4QVM5NUJDY2pqSXBVaUJrNU9Va3V5OVY1N0pxQmhMaTJoSVRZdk1FOHcgWWhPQ0p3OEcyajN5ZE0vYTJabSs3YkpzR0tDZlB2M2dKSkhPYWpHMjNMSmR6Tm5TWmtYVjBTM0J3RDF2ZHlmWXd0c3hhTHMyZFByZCA4aHA2Zk5lS1dZRU5xY056cTlYZWRqN3BCRWMrZzcrQTREd0xyVE1kSnJhdDlxb3RQTnVGM0V0U0REWCtjU1g3WXRWTnU2c2tQbmxmIDRoOU1iSlNabjRlL1lOdHFHTE1lYXZmTzVqd2I3cEk1L29VZktKOXh0Mlk0bU1RVFZvNW83eHpFZUJCcVJaWTZMRWRsMzNVc1phbmogYko0TXI5Y3gxSkRRajdsT2ZFWnVwWCszczdXdmlIYUYrMktIMUFWNnhtUnVKNXBEalZQY25hT0pmRTBCTHU1TlpGOTg3cVdwVzkxOCBic2J2QlBWUTZNVGFGY1lMQjhKZHVmVzc5KzJBQmowbjRaeTNDakpuR2FxTVZ1WVBUSk1zUFpBRkg0ZVV0cGhpL0Q0MjRUSENZSEh6IEoxbHI2aTFCK2M5ME9EUEJ2aEp3Ky9iL0FGRnYvSUFGNnBBZXpOT2RzREx1YlppM3A3cTk4a3RxTzdad2VJdHREUXZTbGVxMkJ3N1YgektyTUQvZ3o5U0dBTlFXVVpvYUJuKzlqaUNBZmo1OStmdGc2U2JKbVVXcEw5Vm9jVlZqVzFxZ21YR0pzaTJzNlJjWWVwYTUxQ2FYMyB3UGFFeFBob1pkOFlBN3gzUVBZTGF5TVY5ekdITmpka2QrQWZvQWZ0Z3QwTkpKQk1qYWpUU3pUUXZnb2VHVFAxSXpqTWpERVZ0eUJvIHd3Snp4TFV0WTlUVXJQRzBNTXNDWnJ1aGcwUHJzWGwzMVk5L3J1MGNxTkk5eDFrdmFiNkZiRUYwbTIycFQ2bFE5ZWtodGxua0NzcEEgMnZVK1ZnVWFCSlFwVmFlK3NqaFNhSEQ1NThCQWJaMWtFeGl0dWF5YzdvMWRnZjRDdm4vWS92NnJrWmNORFF4dVUwVEgvSEt5VUJlcSBjYTFFSGNPME9TblV2SkU5eGlVbVltTXBDWXFnYS9SUEprNnY0TWpBN1JTVGJ4L1g0RHo5UkFIWVUyT3F1ek5acHJ0dnp1SGRxbnNEIFdBdG1FZ3hYTm9VZzBIcXJIaDdJcDR4Y0hJSWRqY2VBem53bU1GMWVzakRqdHpZSGkvZUFxTUJzSFViSStQYlMrQnBLQk1DWEF1TlMgbE10QWJEcjlIbWFmWlJZWFY2ZTRMYklHbXNrSWd5SEFOZ05vTVBXYlBjbFg4bUJwTlhCUHZ3QUFmNThmNjFibnB3UnUyODhXZUV6QyBwQm50NVo4blAycmo3Y2FQbStFcU9kVGh3SGRGTVgvTTI3bzUyTWF6UEdKOCtiNTZuaGRxUGpIVWRlMUtuVlhwTDA2Nm9BNXUrYllQIFh3cjNHbm5yR21hUUZka2NERGhXN0pNaGtJZUxicUFyT2Q5NTNRWXpjMkNKTlY0bjBFQnNCOC83S1cwTFlzUytYQU9VelZzYloyYkQgVzRpdVNzN1R2VTh5TEtYa0lYL0p6R1F3bjlyNmVha01oQU9Zck52dERTekkxVnBQYTQ0QUFIMzcvd0ErY0VldTVGTFd4WjBXVWVKYyBqeUpOZTJEZVZQdEFsa3U2S3BsS0h0UWV5ZGgyUU44QXhCMitCQjROK1pPVGZkcVRPZnYvQUdpQVArSFJIVDkwVS8zczFRd0ZjYS9xIHVwc2t0MWxUNGZ0L1lUSktWMnpTcTBHUjBPMHc0ZUc0SjYzT2JWOThlREhpeWpNaXBCdWt3Zm4zNjNkL0FmZmtTWWFZVFNOdk9nZUYgSTFqL0FKRnp5TEJwZWJqV2hzeDREYkpmdWJMZzR5K3BJamlpVU9FbGxtY2pOQkhGR1pDMGNYYnQxZ1F3ellNR1UyTUtlQzFBVkhlaiBScDdBVXZiOE1rNGJNTkVXQkRkNnZFNC9GWVVPcnpEaVltVU9ZRGg3QVpLNXJTd0lDcmFpenhlMEZvWThkN2VEb1BQcmQ4QWYzOTF3IEczVTNnZHZpb0gzUFdyVEthSXd1bkF2YWQyV0RYeTFwOFBKS3hiUzBuc3dlV1hwK2FvTi9iVWh0NzI5Vm8rUG1IZFEzYUtRYnQ3SGcgT08vZWZwUlY5RDFQWTBOa3JtS2g2a0tycTg4U1NLLzNJZllWY1JRTm03Q3RweGlGNGRQcjliQmN3UDJOTS9GNVhhM2czL1FQbjhENSA4QS9nTE9CNmp1T0JSZGNha1F1Y1NaZm1LZGhCaHg3dWFZcEhVWmNWTmdYQmVxeVpNTU1reHd0Ukh1aGdudEprWU13RjJZekFqWVc3IE1WOS9BQU5nUWZmcGJSS1pRcGVGSm90VkpLalNMcXBZeEhyc0ZHRWs3Q0pwQkZES2tzY0R2dDdpTkl3R0N0bzNua2pMUjd4U2FIVGEgZVpJdnBWQWZSeExHSFAwbU1ZZ1NRcHFETnRSNFF4ek5nK0I2cDhaYUErb1lxUmZWWC9oL04xOEJjaWROWFlialh4WE9xUkxEUnhrdiBPa1FxN1cxQTJwM1FReXhGY0RaOEpPZ2tmUStUUTAyTUp5dUxEZzZubEF4MlJuVGN5Q2VxdDNGZzh5dUt5cW5OVGxVUEVSd2NaTVZkIFUzRTRNQlp4ellrTDByazlaYlFLNldERklYcmpNUTZXRUJCUmtPS2F5d2NRWEN5eEdHVDZjNjZCZlZNYldMSlNiVTVBV0RqUnJFMWYgSEg3UDVIWEVsWUxMSXNnMG00c2pxK1drRE5tcll0YmI0czNkbWhmY2FIRmJiWVpBYmtMTVdOUFE2bGNMR3pxQnFlK0tUQW83dTRLOCBWc1o0cjQ0V25aQmhsY0liaE1hdTZGbDFYOVp3ZkNiTURTZFVUdFZlQ0NlQUg3ZHhRZXR4Q24xNDhIbUFSZHBrcVoxQlExdXdzRW1zIERIdnFNUE1NcG5XeDVnd3h3M0RtR0FRODRJaHR3V1ZsV3REQW04QkxSLzdBZllLaUFQM1ZuRlpza1Nxbk1aVmZES3V1RHVkcHZlQ0ggK0NZTE9GY3VUQlNOYzNZbnd3L0pObnE4UEJBRUxhYXJVV1hrb1V2SVpnYjJUNzhmZmdCOC93QWd3UStNeXF6eklCVjFkRGpaTGM3UCArSTlQNE9XRGxIeTJOMDRmTVd3NjJ0N2dIK0JwdnZqRXp0alFVUnVjYzIvUUJ6Ny9BSEIxaDBrMjdHanAyN1hva0Zvbnl3QUlhNHBYIHh1L0I4ZkJibkhzYXJUN1RNRlZ6REk3UEVWTXNRRjRaRDFZVnpxMTVIam14eU9xOTJBdnVpa0wweHRvWWFFeWJrcVdOZksvYXR3VnUgSmZFTm9kN0dUb2ZlekY4N3FReDVnSDNBUTJvUHlZb0xHRStiZjUvWHdBQStBUG55UzNMSVpKUkFPTGZOUFp2VDIrWHh4NjBKbGtXQiBMWkpTdVdwdHlXeUhBN3RoaDA5eGNPOUsvQW5XUXNNdW96dVpadHFYWi9YeDgrZjhBZjZ4a01US3FPTlZhZ1NiSXQ3Q1MrT1ltSjloIE1oUjhFT1ZjNHNGYnJhR1ltTWpBSCtBUWdRY08yWlRkQ1J3M3ZZTS96NCtmQWJCc0ZxRi9McVNmRDJHVnFjSldkRkpTV0crQ1FHOEUgakFEWXk4NVNnL0d6Q2ZNTU1oQ1orTDhIaGs4b1U1TWNxNDI3WWdOZzM4LzdiQnJZeXg2cUE5d1NPR1NBcys3TGhINmUyQWlReVJrciAzMkpVTjJNTWU2OHltTklaSGpqaDczM0h1TEZCSTlaTTc1SEhLaGlNVDRQU1pRbm1PMFE2OVhCZE0xS25wb0VJSlI3SXlyWXZubVNIIExsQVpnK0duMlFodmxrTUNHY1VoNmtxM1l6ZHI3a1psbzRFODRnb0o5K3QzWUFHd0dwUXhsdTl1UGk1UEdraytWTVcyd3dxdXhoSWYgQ2xTc0lzOHlNQmhEcmVrMlNueDRlYWg4U1I0WlBnYjV4azU0VGZ3R3diQjUvcVQ0dXRIay9KYldNd2dXRTduNDFlMSs0V0YyOTJ2ayBJRk5XMkNHWTA5dUgxOFBCUE1FOEhocDZadUJyUDczaTg3Ky9mZjhBcFNyY3hDWEVNd3VUOXlBU29hUUpUMlE4SFhsdzhoOTBEejR2IHpPUnpJZkg0YlZBc0E4RDJ4Wi9HWk9xLy9JUHYzSC9QNHl5UnlNSWhnbmFCSEJFRmpRZzgxR3NnalM3SHNSTXZ1dWdWMXJJOUJaQmsgN0k2R1ZqY2o1R00yN3NESStOY0NTUnFKT09OdGtlSWVaWURIVzU0ZytyZURWVjh4a1U2ZkpYQXZ5NGRJZ2FjUEFaaWZEWkxnaDF1biByNGRIeDAzb2M0d3NzelJhQ3o1c0o3WWJCNEIrNmtteXNuZzg4RS8rSGhROXdVNVp6UUhiUklkSmh0TVF3VW9ld2hZRFRmWUZ3VExJIE1Na3RnaG84QmYwMDdQd1pvVi83SmFQNWRRVUhmOGVBZ0FtTzBFSEp3ZG54OGZIZFZ0QWt5V0VIU1h6dGx6MnBWTlhpaHdDM3ZBZGsgRC9NcmtDd050Y3JReFo0R1RyTUhWM0NhckFJT1BIejRBQnNBR0hydTJGZXY3YXBaRGRuOVZTTE9xV0luMFBNMUVGbHR5T3IwVVdZSCAxdUhzaWsyUVBhQWZnWkNmT0Q5aldpME5zQmhNTWNOZ1BnQUMvdjhBaDFxbmkySTRYRWFaMUcwZW1kYzl1U1NncE10ajFJTVM4MGVBIHhpRHlaSGJ4Yk5FNnM3QmplVUlsRTNKTW4rWEQ0eHYzWk5lVlVLcnEwUWlPWW4yUWVYTmhkakQ1cGR0R3ZVNDhOajJFbjIxZHp4ZkUgcFBJYk9aWkxVaHVFeWNlVHoxcUo2eVRhS3ZxRGZEWVJLT0FENS84QW9FL2owbVZkc1Q0ekpZUlJjeVdUQ3REd1N2WEJxaHlKY0tVTCBpU21nT29UTElEcDVpWXZyVUg2RzhibU1LTkZaazk4TjFkOStQNytBNThmQUdEQlZZUFRTbDFVdVh4TU5ubVJKZjRsWGtyK3Erd2tJIENyTHpSVjYzYUhlQVBXNmUrT0NjY0EyaDg1YlppZkYzblkrYlhaejdZUGRDNENmNmtjdXlPMHR1Wkl0Y1VIYjVXY05iSTRjT3JzTlAgdVVvc21pN2dYekJod1cyVkRIekZYY0h3NG4wYjR1b0daNTgyRHgvb0grL3FqaFk1OXp5S21GTHAydXF2WUxtdU5uMU1lRG5tZmJqeiBSYmNwSFZIeTdVTHJrZHcxaWk4aXR5alo1ckhnRTlRV2E2QTR0WjUxSXBDMnBHTEJ6NHp1SEFwRmdGb2I0bXU1NVh0Und0U3QyU2szIHd4WC9BSUJnbjF6Z3pMS0hxTVdSaHp6YU9nZ04vQWIvQUwvMEVwYlJTZGMwR1lzRW8rVVM0WnBoYmxrTk9xVGFDUlpHL0NISkRjSEcgSEQrSGZBZXIrSzJXd1V0OHduZVpSRDhIdlp2dEhzRnUrQVA3KzFEREFMcHZNcG1Menkyck9zYW1iYTdQb2RWOGhUOGE1SzF6YUhjRCB1cERaUHgrSHNiRk9nY2IzTVdMSjdIc2h3SHlBQi9YM2dGTEh0MnYwalQrU3FWM0RyY3Q4Vll6RElzNDg4TUljb0JZU2o0NFdBNElmIDRyWlBodkZhV0FwVldoMW1zaTN6Yk5rZHNNVDZEdjUvbndEclJHejJkd3VpRFV4dVhSOGFEaHFCWEh1UGJ4eU9pZm5FRGw5bllpWDggeHFWeEdYK1RuNDVMRTlvSFFITWo2a0txcXY1V2JEUU04eXlhaDBqdk1TOE1CcVgrSFNVbnA5UHJmZFFPNEw3SWpvWi91b3lFM25uaCBObWVYYlpIam40QkI0RGgxYUtZNk1pNU5aRDNKRkprWTNBYllTUHFFTU5GZXNnQk4rWFl3Y2l5SWRxVldoN2dIbkFTRUNEVzZNODFmIGNuR1Fic2IzMzMzOUJBZTUvcGV2aTJ3THJoTURNZDVxVm5DNmZyY3NyNXo3SGR5OW9DbUVERjI4d3RvYkluelI0Zm5sZjhWbUU4RU0gWFpudGFQQ2ZvTy83QWhZbityV2toRkVLSk5PMDFUN3EwNG9yYVlwMTFmOEFKelg2cHkxeVBwVm5mUkk0TmpwWlplMXZxOUx4eDFlZyBUVnF6cWRmR1phMzFKQitsZ3dPb0RGNmdCNzA0NTVHaWxhTU95UUpLZ2RocFhweVRWTHVWMlkyU0RpMTJlQlhMSVluSGZDdnJJKzJaIGI1ZDFpMDZScUUrTndSdWZjY2ZIZDU2ODhwRmJ2Rmd5QnNVOE5ObDdCRGtwWkJrczVYeERsQ2pERkZ6UGhwOHg4UTVnOWN0UlNZSjQgT0V6ZmZmM3YzOEIrZ0RZTmdmQytqUXoxYjV6SXI1UEcxZDJDS1pBOGVYN1laTHVwR1g4V3lPMnllNFdRWU1ENWtCU2NZQVA2eVVHRSB5Zk5naVQ1ODk0RGZ6L1NsSHZrZTFRZVVVcm1aWkJoSVcxdElhQ1JqajMzS2hueVZNc0NIYWRWbUdUaC93WHhmL25GaEdWME5aSjlyIHNYYzV2LzRqMkRZRUY4VjJ2ekxIUzdnYlhLWkdaQTFldHRleU5YVHZTNVlPQXRCVWkyMFlYekZEdmllaHA0LzV6NFFmT0JzeXkwVTMgKzk3MjhQejgvQUg3d0hUWkZ4czM3eVBTbmd0NXNjV1c1ZDBmeFNiYit3M1ZkdDJNOE16REVxTXR6enRUMWppUWU0N1p1NzQ4VlI4LyBBNDRMNDhOTUFsR2l3cERJaHBEczJLN3RuTC96SzVQRmdOYzh2RHpNWmkzRFg3Z0IxS09mRG5CMWxEZkt6S2NKU1FoeEIyQS85K2Z1IG94Z3Jld1ZMTUoxZW1yWXd4azNNTlNKRnRBVmRJbWkwTzQwT0x1SEEzeGtjTFVYK1ZjZWZPWURMTTRHTVdhclNRZ1Nxd0RBQVFmb0kgRHB5NnBaQXRqcXV0d05jekJ4N0JicHdTUG1aM2Ixd2pIV3hEc1p3K1l5R0h1MUlhK1llQUJDZkJaT2MxZUxaaGh4SnE3WXdHd2Y4QSBXb2o2bTAvNVppZVV0cTFDbFZ5VlZ0MDZxSW1RQkpHR3dNaG5vZ3UwQTdnSG9adzNpdHlFeHFQV2hkTTdrMTVLKzJJeHhKTnV3TStBIEFBRUZBZnZmclBOT3pRSzRSNXNza1FJWlZ3ckhaaE8zTEhlVnYzdGZ0Tko4RjBLcHVNbVNSKzFXTHR5OGJWbWdGZk5BazJhSXVqZGQgRFp5czBOTnpNNWNBb2NiTm5nZk1XMDRPRENZdTRwTXVSRFpDRzhQbjF2RXcxQVY4RDh6YytVRXZOL2VQUGY1UDNJREE0Y0Q0TmhLSyBabUtMNHVEUnJDcmpVT3lDeGdXc01LSEtEcDZIRFpLVE1Rc0E0T3kvZ0t2Qmhnc29UMlBlNnVCbndCLytuMzdwaFI0OXF0dEQwQ0dxIEJrb3FIWmEzR2JOUDRHalk0bFBhTGFzSURZd2R3bVdweVFQeURZN0xYL2RQNU5WNzR6REVmWk44K2c3L0FPZndQcVFmbXB5a2h5N28gV0xnSEFNcW1raWtyWnpwcGgyVUtsdTFkZTNLR25ZVnhNcUNKKzl0a0NCQnF3bldZc21OZXRsOVNRY1lFSEFCanZ3RS8xb2Q0MlVDUSB2VW05RUlsZkRQRXhXeGNxd0dOaWhpZko1NkZXT2VDc25ac1RXa1FqdXc5S1JrMSszaHI0L0g1ZjZ1cHlKOWdUTlBySFhvMkdydmhxIHZVY2tZdmlKTUEwa0o0YkRJK3kzTXROYnNCd1ZZQ2UyZ3c3Tnhkb1dhek9jSk5vNEQyOEErbjlncXZkR1pYZHlPRnRadGFUR1NodzEgdEtVT09UcjJ2MjB3TEZ5eWliTUgyUXQxdStHSmpCOEd5L2dOVXpreUVMWmtidWliQ0cveEYxWW9XaDZJSXRSekR6dmFsZjUrclFsZiArbnlobEFiUzhYK0l2Uy9odWdaUFpPOXJleVN5RGgvRXQ4Q0REWldhNUdoWlo4T0UyaHdJQWZxSUFmd1h6eDlQMkJVOGZOeXlSNVdNIDJRU256S0s3Z01tUzBDUTlYdVZaRktsUkhBd245MUZzT1E0cStWZXBWWHhtMy9zeXk4YWgvd0RxQVBuL0FPLzFFNkZ5MEpmSE9Ob1cgZE1NY0xERkJrMmFQa01KTFgya1kvZ1pJMTRWMVF2ZzZOTkZKY2h6Q2NxMkhwZ1k4anV6SjVyRVc1ZzdSYml2UjlZb1o2d3JSems2cCBHMklRUXhwQVNuMk1lcklERjI4eER0UmJaT1B1RnFQbGZiNDRNMjFxN05abHFjSmR2Y0J3SHRDQTM4QlYxeFQ3RU1zbVNtNXRrTWp0IGxEWXk5VjliMlE0TU5rTkRsMnZLUG5jaERtR09lRHBtQ0l2b1p3T1Qvd0I4NzN2aHpmOEFZRUVCc0MvMHdpakFVb2NXWlhaNEJiaHIgYnNFcjJ2M3l0NUVzdytBV0ZvK0d3TWFIY0V4a1F5Q0dEZlUrZk9jQ2RtSWF1VEdiSWJTQWFDQmZxRXdQZ09lZ0xGVlhZR1pRVmJoOSBVc293U1BabzFTczJ2NGJzSGxoLzV2VURiU2VQbVErSDhiSU9BTTlYemFqaUZsWlZ5ak16ZUVOdkhQZ0hBUUNDZnc2UVpqUU1rVGQ3IG9rbVl4M1MzdFljR3NPN2ptOGhSRkRwMnl3WXFzNVd1MW1qZWtTUWU4TzM5T1dPeHN5VTNMU2R2SFZNM0Jnc2h0dEF3K05FTWFlYUIgcmEyRUxPVmJRbHNrdE5ZSEpvNCt0MXU5dUVPcTluTnFYd0RZY1l6YldNV1FhVCttL245Zy9ZT28xNHJwTGNqQTM1NnJYRmJtVDBudSB4bkdDTXZuaDZ6WEtLWVQvQUtlaDZrTVdDdDBhQTRBZDRXV1pYN21Fd1p2WkFYUHZiZjM3M1B1RFZvNkExS3hFOHpWV2RxOVBCckNVIGtnenB2MU92Qzh0cHA3bVNHNHA4TzFGdVlZV3lFTkluMS9QcmpCR3dRMzNIOG8rYzJCKzU5Z0FRWDVCV0lNZ1YwOE9CK1VVR2pWcmggTWxoanpLZk1OaGVMVnlSYURRdDJoRFEzeFBXNFpBeHp5QlVzRncyenRlekU5a3RGSmVPZkFNRUh3R3dha0FFQ0pBbTNDYklTR0NYZiBra0pVVE8wTXF4WndUUkZvMVZaRG5rekVyZ0E2bVNaWmk4dzNuaW1FSmIyRnlhS05YZmpqSWtjbU5tOEt5RjVCMlYzWGROMVZZbHdYIFRGZkdQSnZNODNUSG0xR1Y0RXVGOFZLSkZvWWNmd05rbVREREFZeGJjTGEzZDVHSzl5TFRNY3dTQW0vMEdmQWMrZmtKKzZUTXl6SHogTnBka01nY2xBcmUydE9wc1RJc0lDNEpDSFVwNndueG9tVi9NVDJUR3lKdDRQbS9Zb2JYeVpGeEtWbXNvNFFKVjJLRHY3OEFQdjNWaiB3V25EVkhSRlo0NmxxOUJLS3RWV3FaVHZsV1hNNnBxbnJldWJRdUtpR2xhd2ZXUXZhcUdYc0J3N1oxQWVWS3NXR2dvenJMTThIRWtGIGo2ZjB3NURnQVlLdlNPY1VPNFdGWDFnOGJUMXc4L3FZQzA0ZGtXRWh5aWt0TmNqQy93QmgrNURIVzdCYWlPOTA4cEk3S3prN2t1UkcgR0E5N1NRZkg3OEFIL1lCMGxGRFJuSENlR0tvR1dNeFJ4blNSY1NCVWloWGJ4a0xweTBtV0lZWVdWSXNabUtLMmNNM05aSU9aM3h1aCBZdmR4NUgyRkI3cjRzVXBvZXBBV0RHdTc1YlZYTlF0cFVyTnRBYndkSVcyaXhwWXVyOFY4UDNVMmREcjlrOThKN3d5V2JXYjRVSmt6IGdURTMvd0R1RGY4QXFTZ1VlUXRxNUUrdnE1dUN5QnVhZW9xWGZCTDdEd01BN3E3a0g1Z3lKd2VaTUlCMVdlNHdBYko3MWVyaytEaFAgNy9idS9nQUQ4QUFRTXlzNGVWYkd6UUJxQUhiWWRXcVkvVEhiUWFJeUs4V3dwUXNQeHN4Q3JlR0hzQmJCM1NuM3djbWRqV2k1RmxaUiB3bG83SDNkWU9Bb051bnovQUU3R1NQWGJiWUZrSG9xU3RqYStjQnJ2ZkFZTlVDbTRGRVBUZ2VGd3g4UGVKaGdPUFQ2NTdnSWxqVE56IFYzekZtUndpU0UyQS9nQVA3QWZ4NmtaYU5JQ1Z5eVVGMWdoeGpNZHBzeGhNemh0Mi9kYmJtWHRUSGxya0k3SzYwaHBsREhKMmNrYnMganZTNVowbExpTUFHNU44VkxIcDhJcW4xditXbzFuVnBuVmM3MkJXNGVqMU5iS1BrUUNCY0dCUGNKbHFja3I5YngwOGI2OExid3pGQyBneDVPSktTa2c5L3FJL2gyaVFqL0FGdVYxTm5xOVhKU3Erc2hiVzJpWVN1NlFxNmtLM2R6QlJXbGkyZ1BYOHlaNGN3UWwrUEE2aklhIHp1alFqTXh6emFPL0gzN0FCei83QWJSOHUyS3FrRXFiSC9HczRXU05pVEdjN09GZXVCUThwbER6aTRWdVkrWmRnZFA1VjJ2MlBBWncgUGN5UU5KZHduUGo0REQ3OGZRZW9HWmZLL21uRlVXeGt1MktHaHY2bEhBMVdqeXc3NHI2WlNpSGFoOXdNTWxidmkyNE9HcWl0R0U4MSBHQm1vVW9MV1NlOTcyREFJQUFCYnVJRHFta3BXYlpTUzNNcWgrYmpjSmhnYS9ra3diRlB1eHZJVjBVVUtzNm5mbVIxOWpaM3lBQ09LIEhpUkk1UFBPR1BGNUNxMnJSdnRkdGFLd2NrZTZhUXBZYTdVd3FQRTZHcTZueWxKK2w5SnVaMXNaOGJDWTRSOTBNVExIYzV3d3FNV0cgdTNzTTJMNm5vd3FTWkpDSmdhaGxKTW5PdlJ4WnFLckxyUkVCMk8yUFVzcUJtcnMyQW16bVZlem9iU1lTTWh0WjVRQm5aaEdGWGdEZyBrdzUrbWJJY3N6QjBqUzNnN0ZQeEc1b0tFQ1RGbVNQVm5YT1QrMlk0bFdQWnZBQkwrcDBvdWdCZGJ4cS9OV2Y5Zk5hSlA3TWlhUjJRIDByTVdVYk9xTkFrRURuVC9BS0hTd21LZGthZmJZTVZmU3p0SnJLd1FNa3NReVdTbUx1RE9RRXNteWxzZTRkdDJSd1cyQmIzN0NmQi8gMnVUR0E2VC9BTThRQ0Rqc0FFQjFWRWhYNGR5VTZ4c3M4TnE2NE0zT3BTSmFGaFZpd05nZXViUW1XMEJ1Q3Y4QVQzeVJqd0RyMHl1WSBEaEFuUWxrWXJxN016Vlg5Sk9lMi9uK21Rd0hWOE9MeVF5NVQrbmd3TDA2dTdZcnNsaEs5aFdSY2licUVBbm1RZ1hoelE0ZjZmQlE2IHVBbk1XWW1yN1o0UEVMc0hQbjdmd0cvOVhZMDc2VTN3cnAvdFcvZjRxR1RTN2VhcWdjNHRSYnNCZW1KcXUyYVZTaUdQbUxiZ0g5dmggODhvODhEOFloN21UT1ZkVi9Cd0NDZlgrZkFQQWRDV1g2WVBPZ2hobGFZUWJzOFczRzhuOU1GczJ4dnUrRFg3NlhHQXpJamw1RktJOCBZMDcyWThqM0J6anplSzRuanczSHgxVkdzdzZlMFIyUjNxcXBkblhJZGdjd1d6RlRzSmY2UmJWU0IrZUIzeUd0MVdRbWNUcjk4ZzhHIGVVTjhabGtHa21rbndIUHVBL3IxUEo3QTBhbTE4YlE0R3E3SXNKb1czK3pRN0pxUUh1NWl4NjViSXQ4R0xRdUg3Z0htYlBCZ1lkMUwgSEdQTzEwYlptOXUzMEhmK1FmcjBnYVhtUjVVZk9GcTRHNDF0M2h5YTllR3JpOVpJY3JkbWhOWEI1aTRHWGg2Mnd2Z09mdjFWb1pNWSBocXl3TStrN0h2NThCdjREcGtTR0JneWhjT1VtM0F5YWRjcm1wWXhuV0V2aVE5Y3hteE5LVEsrV3c3Z3R3NGZ3MnB0WHp6VUhHY1hWIDJaR09iSnZ1L2dUNEQrd1ZxRitwWlpML0FMekM2blNxWnRoR2pVOHd5eTRTZG50eUdIZng3Y2VVNmVWRUtCM2NhZGdkOHh4YnNneHggQ1l4WnBuZHRmZXRmdStyT1dSYmtqVG1wdUJuVkFIR2tvcjRTbHlEMXFXUmdZcVd4cXl0Q045UERyYkpEaDhEQkhwL0IyUjVabGNYMiB6T08yeU80QSsvQVAwQWROUUpWQzJlSDl0QXkxUlMyZXNKYnMyOEE1NndMNW0wT2h5OVBvRmNYNGEyaHA4dmJwaU9CWWEwbldvak0xIFlOS3lzOEp0R3JuZ0F3WThCWHo3K0JBVjFhRnF5TmRhSFlTYnFXeVZ0a1EwTzdFaG91QjJNQ2VHdEVTMExHcmV2NjNRazdoOWJyNzUgWXo0d1FBWWY5UmRRZlNNTFIzL24zdUFBYi8wbVZQbEF2V1d0Mk03alFsa0hoc2xUcCtwU1dwQklNVktlbHBxYUhuMVducDVpbjYzbyA4UDIwK3FoL0tJZm5EZXg3L3dDZlB2eDhCc0J3TEdpUEpHNkNXRk1wNDJqRXhqOEJBSXMwM3M2ZXpsSGdSNGZQdGZJaUV4S2lTcnBKIFhDUkJqc3lON2NpNlUrT05qRVpFbkk4aXVTb2d5WllzT0JhRWgyQ1E4b3d0MWswRGJJSGlaWUZvVS9sTWxnQnpGSjN5SDVoOVNIcVEgT1p5YjdNVE9XanZmQVY5QmZuN3dCOStoNFpETWxVUFlTMnJnWDhhNUhqZnlMSXFXanBhMnIxZXZJWlNIVjhPSDhOUHVCZ21JOXQveCBEenJJWnJnNHZVQ052YVNieFBnRDZDQTREMVpXZXRQaDFKczFvVTBSY3I3dUVSMU5UNzVYWkluQ0pvdVh5Z0I4SWFoRU1Rb1dvdERwIGNGU1VDRk9yYk5XaFhrcElGZGFUYVh2N0lBQUF3SUhWUlJPc0o4cE8vd0NKcUFwTFNLT3pjeVJjU1NPcXNhcXQxcTJkTW9VV25NWkcgV1pUNVVWNkplbXZMWVliNFZUQlJHdzlUSVVSamdNNGo4Z1FNVjkvWHoyUFRsUGN4Mk44ckt0eTRCczlyL0xmWmVmOEFpYjhlT3VaViBNa2J1TlBTTElZekxqaEdTTnlRTmg2c1lwY0d4VEt6d0s1Z3Jvc1JURFVlcW9abXNWdXNUeWVNc0t0bVNIWkZtcll1MnJZVFhKOHIvIEFJZUdjRTlrSGg2NXJTMGFsUnVNOFhLUEF3SDNSQ1ZYKy84QS9nTnVxVGgySlpkaDAvbTF6THRFQytWV0VFMCt0bUdDV3lBVmVYdzIgRllBZFBjSHhidFRraU9wVi93QXFReVpOWHBzYVQvMFRCMjZnZ0Q3OTlCMkRNclVacURzVkNzN1VocUxkbEpWQTZrRzI3bGRPQVJpeSBHVVBXYUsxQlRLL2g5aGk5YnA3aGpha0RnZGNvUXhacThtOGs5ai9mOS9Yei9nRC9BRnVlSzdhS2d0Q0drTm55YXhjbFVscDdxZHFmIExnWVhCeXB1SWVGdzJBeERRN1VjT1k5bklGUHFTcTRWQlp1bk5XWmxnNWFLUzduRDREdTZBNCtmQVAyUjIzSUpJcFNqVEJERzZJNGwgaGFOc2ZxbzVEU2IwYUJZZzYwbVdRNVd1ZGtJZUtWZFJHSFZGYU5vcHl1Mjhlb1c5cmFOc1VrSkxVL09ORHRhKzJwWkI4ZUs1dkM1ayBneU5yK3lBeVRHWVYrd2p6QUpNYWpJckRLS01oQlAxSWZzM3pQZ0VQbkI3TVJrTW84MW1EQ0d6YVB2OEF3RHdIVnRMUTVSRnk0ZGpWIGZXTW5PdG9tZ0NZOVBwS2UyQjVVVmhBM0l0ajdVNDJZTVRCNWhWMjQ4RG1leXdMUmhtUGV6OU9mQUFIQWRnNjgvcUlhUSttQjB0UlkgVHIvcmRLbjZxR3hyMC9XcFc0Q1pORnByQ1RUSHRnZThMSW1CNFpBeTFBVi9EQU5naXE3NE1XZnVxUThiOTdIOS93Q3J4eU5YaW5TSiBoVksyZ1lrcDg5a0NLYS9NaWFaNm5NU2xlcDRzV0dQaG1BK0VNd3dZTlEvbHZ3K01WZHRuN0liNTkrSXQvd0FiZFBnRGtseE1TTG5FIDhUaVJvNDN4amFNMXRNcVluRE1oNzVid09vSkZramthUmtrUmt3alNhUEtlSXQ3dDFpNHl5cGNiQTlwNTZYdGZzRWNNbm1BRGxuRGMgazlDVW14SGZCcnhFRG5vdFRucFMzVjlWN3hhaWV5RDBOcTdYd0ViYkZtbTFkWjRPN0pMc2JQOEF0djhBaWd2M1JoWDlOYWlLcXZpdCAzekpobTRieHNsT0I2ZmZHaGVoNmdpa1FXVW1NQmhiVzN4Nzd3UTRKNGZBTnpCbkYzei9lM2dVRStBQUFQMzhKaDNRNFhMVTdKRnNhIFlFRzFvQjNaSE1EV0FzWXJsenZubWN4ZjVoRHVCOG1EL3dBbGowTzFGdFl3UXlpeVQzdm14dy92NERBQisvMlZxZDBVNnZjSzNpa00gaU5TZW01OEczR3ZYa3E3U0hGaTJIYTdJL25HUU80ZnJPbjEvM0hUK01pL0tkMFVrSnY4QTkrZnQvQUFBQkkrR21sS3diNkxuUFNwdSBJa1lLaVFSUzJOeHoya0pnbVpIbGE2WVk0dFRxWWlId3JiUU95K3BMSWh0RWVMSWJXVnRSems4SGpqcU9JUjdnaTF2RGQyTTh0Sjh1IHptUzQxOXFzNlJFV25LdWRVdDhETGcvaWRUazliMDN6TVZ0NGJlZXdXUW5VRFJRNnlqY0o0VGhpZnh0MStBSDM0K0E4L1dSZzFBTnQgZ0V0VUFaSlNZWUd5SFo0b2NrZVQxTlBUYWxyMDgwUTdRTUlhR3RyY3doeFU5WUFFRmc4OW0yaG1HblRsWEcvUGdELzdEdjc0dUJmVCArNmxxTWRCYyt1YXRHUTIyUjYzcjEzTFN6MHI1VjhURitadkMybnZnK1lEeFlMTG5JWXphMmhaZVhpMGppU2o4QnQxQndBUDJ3QUkxIDRxclZwUVV1eWFXVFhDcm9ZdXdvMWUyZzdhZTVEWXRORlhyelJZeUlQRDkxSVlkOEhHRldBNFFQaDhaZkNoTm0rN096eHNHL3Z4L28gNUZqYnVOenZLN3lTQnUyUjR3VXlhU1R1TGJOakVZQzl3OGpuckZKdUtwU0puS1JRaUVLelpWbUY5UW1oaEdvWHZhamoyK2VyTEw5YiB4MjNUdlVybStHRFo2MWJDSnl6QTJ0NjNpTWtwWFhnTXFIaXlHTElaSWJoOHlDaC9QM2dueWhvMnozTmhEZlBqL3dDL24wRUJwVmc4IHlqYndhVmNXN0lOZUp1TWxUVHgyck9tSXFFMFJjRmNDbnNFUjhiMUJrRER6TjRUMSsydmgxbXpiWGhqalNWWE8zUHZBL3dCQXZ3RkogMW5aSFpIVEpaMUpDME1tTmloalZlMkJ6WWVwelZkeUxSYXY5cmdRNkhtV1JNWDRjQ0FSbm84eGxKSWU2RFBkMk4rK0cvbi9mZ1BXbiBVb1VCMTg4T3hrV25xVlNyaXEycEMrSDBaaDdqdFNuTGtYZ0xsRElNakozVW1KN0I4N2g3YThHQ1pNcHlabVIvTnZBRGdHLzdCNTlPIG9WeEd5eFNDUjgyVVpMaEgyWUFsNUxiRExMZ1ltNkp2NDZlRlYxakt4K3RnaGVYTGhrbEM1UjQ0OFhpTzdJK0NhNmgwOTgwNkpCUmIgYUo3STdIb3NOMkV1RFVZRGlaaUhZNlJVc1dhdjF1SE1WdVloc0NHMVQ3QXdWVnNYeGNYem5aT0UrQTJCKzRDZUFIbGpxSUlKL3dBeSB2YlFUYTNDTGRWRFcxdHNoUHpwR3p5cmxFMDJVMUNNRzhjdzNnZ3R2RGJhQ2x5UVgrTDZnR2JJazFkeC9ZTi8zOCtmQU1oRHErd0plIFc3YWZBd2ZuWVpEWklnL0pyZmhFemRKYXVyc2hHSERyZjdKOUhRMDhGeVI1WnlqNDgyOGo5MGF0MzhCditCOCtBQUlKc3B4OU9jdnYgd3hrRld5RERrZW9xSWowL1ZaaDNtTkNKWHI1WXkyUCtHNGg1Z2RnN3FnVi9lL0pxL09jTFVTVW1yY0QvQUwvbDM4UW55Wnl3UnBnNiB1ZGlFeG9tNEV5a2pqeUxaSjUzY2d1UDJFWHpZRXdzeWdLeVlJN2FnTzV4engyN1FDbXJ4eTFtcjl0OGRWSy94Tk1Ha0hWbm5ZNmFnIElUVlBXRHMyc0xnaGdYZ3QvTXRneUtoajVpR0gxSDBtK1YrblFvREFldUpiWnhndkhhd1dPUDhBN0FNZjBQM1lzbGd0U3RKR28rQmEgdFkxZFlXVXRZMDR2bUh1dDJGT2k2ZmRLTlNsSVFBdkRRcUhNT0tkTlIyMVB3aE1pTnA3dVRIQW84SFBkM2ZmY0F3WWUrREFsQ09uTiBiZ1pSSzFjcFZRRTV6UFlDV0FsNzhrYUFKYVYrUHhFeloxdkg1bGpjZmdQR0ZtTS9qQ1lJMzk0QUh6NERmd0NEN0d4aVJIRFZQVmQzIEhyYVcwT3IrMHVOWGh6QVozY09CeS9pT0ZnVEZzeGRpZlc2OURncVE5RG5KN05XYXVyRS91eHRKd0FiQjUvZnovVm1SWGtqS24yWkIgMkZwSXNoQ2hrUWdDT1BHd1NZNGx6c1pEdEZhSUVXT0JoYmw0OTZKNHBERkxHVEpHWWxabGtpYXdNeVFvSzNpVkpOMkdjY21aaDR4aSBoNXVjU0pORmhwTFpaRU5EYUloaTBMYWx0S3VIK0hEaHpONFlKalUrVmUyMERER000dDhzell3bFhoRG4vd0JBQWJCVytIWGN3TldhIFRZd0V4OFBPbVNWTXdCbVdnSlE0aWJ1a1ZrK0lIOTArR3Z3MVZ0WHlFN2sxWml5aFJaODM3Y0Jmai91QTRBZjdBWlJiQXE2b1pESGogWkl5U3JkVE1kMmpIRDBQNVlFOHQyQVlzbFBUM0JQQVRQd2VlYW1SblpzUlpObTgyRWVBQURZTi93UDdCaTM3TkZaMzhVc3QyTjV3WSBrTlhsZkl6a2VXeVBrb1MrTkVNZ1krR3lHSmpndGc4UGdWekNKMitocS9uVW53ZS9vSUQzQWVmT0RjRmVuL0p5dHQvVCt4eng5OW5qIDR4OG0rczdjc3h6eTdHZXNhckhBVjVQblAvYkVpamQ5V1dxQk10alV6bnJkZldZOWhjNG8xVk5xWlJzMnBkUTdBb0xDZHA3eG1UY0cgNWt0U3E4RmxPRVkxTGI0RUhUNHQ1eHh4ck8xTURLUnlEMWVyRkE5TDdpZndxNFJZYnN0Mnk2VjA5YVlMNHRQS2t0ejlGdG1wVlhQSyBSSzhXVlBWNmRUcS9jVEpjTDZXSmV4c2dHZ3FWcHJXRm1JU3JlQXJIMVloUVo2M0Y5ZnhRdmJCK0swdXY2ZkZVZi9pd0xJWkxPdEFQIEdVekZoTlRoWHRrT1VwZGpTcGpCVmRrTWhpWXR1Q0Z5MGg5UDVNVVYxbG1CbXd1bmkxRCtHd1c2ZjgrQVQ5aUljZTM2WHM5OHRDMmwgc01HVDdzcWRmR29hOUs1bGR6WTBJWmp0dStXUkQ0ZHM1dzhRcVhtSDdVTUdlYk9mL3dDdnYzVjFwaTRDcW4wejhhV09STGVOelZxNCBzWTd2SE5uMkhnampxc1dDS1dZRm8zV1dTU0NXMGtqUVV6QnNlN0N4UW9lNnVPbExSOWdTSGR3R3hOYVdxN2JjNnBSdDh5TTViSHFjIHl4anhab3ZteVdDSGNGYnpLSGNMQVd3ZjVwZUE0d1lVN1BvK3lHd2h3QjREcjBhVzNubTQ4T3hvUmpoT294OHV3U1FTZFBid3d2bmQgQmVybEVaRjl3RG1BOTJMWkdZOFFHQnRhc0JtbnEwS3ZxQW5pN2NKdFh6K3dZVkY3OVZGUzBld0tRekt4MWM5NWdsaFdDSHNpSVBTWCBaZllWdXhwUW1WRk1FSWkzeU5ibUVIRUp0OEE0aDl6TjBHTEx3RSs4YitBMy9wOEM3UXkyTW00SDAxVlVwZ2J1UkV2REphakV1WktzIGFYWTEzT0E4T3lKOHkxR1FnWSt2ODRjZHNmT0RQUGhEYVA4QVlENEJnQWMrd1JJWXBKR2VKMFdGcVRoczQxQXJlaGVTaGhkeDR2aWIgcHUwWTh0aldWVUlkWHoyWld4ZmRqOU5qSHR1REhLbVdkTnd3N2FBQjd5ZXRHWXZnODFEVzAyMVZadEE1dVRYN0NPTHBKZ3Q0RlRLTiBENXM2ZkRwOWJUeUg4aFY4OEh1WXdYeWRaQm0vOXY0SUg3LzF5QzdvTVVpanRYSXc4azhwSHEzcWQ0RHJUUkUvRjl4cGtXeUdBekRXIDdJVzl3RG5MTVQrS21PY0N5Z3haNFNiL0FIL3dHSDBFQXppRmJ5SUMrSE0yWERHNmIwamhKYXR6RHRlR0hBK0psTm5JcmRidmt0RG0gcjh5MUI2K2VhZzR6dGUwREVaNENHemJ4NSszVC9VUFRlbjliY25qT2dSWEJKdFM3bXRrc0loYlZZMS9MNVFlcklDcjRqNjNEc2lHaCBzcEJ3c1p0dENCWXhqdVlMUS82SjJUM2YvUHIrd0FBQzl0QW1jeHd2aU1WZVRtaUVQSXJMODg4ZkJ2b1J1S3pGVlNaRlFpVXlKakpCIEcyRnlOSGJWN2VGeTc2SnlXdWlsVE9hWjJpNkNWeU8rUy8xV0xoMUxMSFpMVUhMQjlRVVZlQTFMTUFjOG1NamhDVHFyYWp5ZUIrWVUgR2NYOEdrK0RQWW4xOC9zQ0Qwb0ZjZkRNbEE2YTUyUktaS2x6cklkOFh5RzRXRkRybG9sb2FZWTdxWEJXNGRrMUlmREJ0dVBia3h5WiBvVnhnemhPeWJBZkFlZjhBUDlEWTlMY001d2FtMVNHMlJYcjVuTWx4MU90bmw5ZFR5Z3NTQktHUGgvRER6RkNyMDg1L0lOUmtZekZFIE1tekhFa0liT0g5Z1BnRC9BSURCVjF1WU9XTTRUQXp2bmFieG9HdlZ0M2tOV2xmVVJ2RDVTS1EwTkNkYUtHSERCMXVZNFEvbnIvQncgL2ZKWXVSR1puanpad0NBOEFmMy9BR0J5Uk5EdWw1TTBTRkk4cXgyNVBzbHJJM1Z0MjJQUHVIbnFBeGtSc3NYWXpxNnRtTGJieHNVRiBGZThHN1BQTmZIVmpIQk9UYUNjbXFyajZVbE1jZ0NXeTVNS1FuWEJTZGlDWUFrMktHbWhvbjF0VFlRSFl6WnNPUFB3OVdmSFdBYTBrIGovUm5aVUZUV3dnbVBrd2NyT3VkYXVXaDY3aUVxeVpORXVtbS9NeXQyWnNWQmx3QXRZOTRpRmQ4SCtobEtHczQ0bURBT1NyaFI2Um4gR1RKZkxUb1VHS1R6WWEzbERZeGhoT01HVVduNXVkQThnRHNHMCtSRGtGdnA2c2dxTHJjTlhmaXovd0NiMUpFektyQ2FGUVFDQm1UUSBPUEY4WFdYNEhqcXNkNnRFTXBROE9leGdiUkF3TEhTVk1oYWp0VitvK0hHUE83NUsyK3lBK0xKVmI1L1BUN0FBbkU5R2VTZ3YreWVmIGZrQUFBQUh3RDkxYWpVYllGNlpvZnVYRWFrbTRJR20vU3JwN3ArcTA4eEVUd0I3Q01VVzdSVDRiSUhzaGJJT0VJOFA1Vk1XU2ZGeG0geHU5MmNIUWYwK2c3L2pEdkQ1RHBEVC9meTVmQ1M3TldveXZodE9HS1pQQjFPSEZUWmFiekFnbm1JZGtHR1R6bGFFRkt1ZUN2SXQ4WiBsaEgvQUJjRDRDQTU5VVNDL0gzNS9haUtQYkYyeEU5Y2l2bEpub0dkVGdrT2s1MEIzN3RWellTYTBjZm1JYWZWWmRsSDRUajFnUHVKIGhaUmxmRW1UOWtrSURQc0FESHRGc0FCQkJtMG03QkFXUVRUSThpUlR4UkpJOGNVdWtqbW1oRVFqM0lJeHFFWjVTZkpRS29zbnBDQ1Ygb3BaVEl5VmdIVkdvbzdXWWt1dTRTVTRCb1k0K0d5NFNhQVFGNmthN3NJOG5Rd2xQenh0WEZ1M3Vuc09KY0x1Rnk4QU53NFcrbnJmeiBEQkJiMzZ2NTRQNnp6d21UL3dBN1VBQU8wV3dBUFB3N2pEajVyck1mTEdRNHlmU013YnhkRG8xWHJMaTVTc3BVb09QK2gxdStCeUtHIGpnVi80TGd6WW9hdnpsRzNzM2dmNUFmL0FHRFlZZExYNjNTSkFGRGQzYU5TZVYyY3RlT0J1ME83M1lCS01Ob1BqNVg3SUhodyt5ZkogQWRMRUlGVjg1Um1ncXpMSnlyZ2pzOFliK0JQNy93QmFWczVhRjB3ODVjeWhwSnF5cHFCWnR3RGNpUTJHQ2lHdzF6R1c2djVMd09HbiAvVlQxZjFvOFRHYmxGb0U5ak5oUFA3QUFxTC9mMnFKb2xXWlErcWsyM1FLMGptTjVJeEhESEhJV3BzczlwbXhyMHpZeWU3NkpsbGFPIEFzNkRMT2xpT1VhMFkvYWxMZ1RmUEp5RkRpdXBqVDJ2c2xja1ErcjdUZGNGU1BsdjFqM0NyZVpXNWhUWkh2VkJYdERnSHpaNGJJK0wgY3doWkJ4U1lHMnVZZkdmb3J6dmFSVnp3L2NCUC9Yei9BTEwxZ2ZMUU1zQ2UrTkRJL2diYXVCMnMxZlBFc2VZVzBMVXp6NHlqM0NxMiBTcTNDMUhBdzFkbjU2b3RqQ2ZQSGtadmV5UEd3ZjJEa0hXUkd0azBlMm9sYW9LMHhDNUxiV05rYWZIYzdwdnNDd2JUVHBUWStOR205IHdEV1ErSW1JZ2UrTlRZUHNxMHpEMDh2Z3dZU3g0VFY1dmo3OWh4OSt4eHdtRk13YnZPT0hzRm5UNnV5VEZoU2JZTVdyK1RURDVWN1kgNU5ESllEMzh4OHAvajlxTldualQvUDU0TUdJYXVNOEo0TSsvTDUvMzU5MElra2oxVXF2cHBCRGhEV3NWczg2enVKNHNSVWtGaktiYyA5ZmN2YmkyKzlEUm9VSzd5TE1qc0ZqZnQzSSswSklHczFsUnRjVFhIY2I2a3U3NURqNTVYbEdMUnRxaDY5Wkd1eUs5aWZXNVNKWDFvIEhsc2VJN3FLQmhQMmQ0QU1DSEJYQnZBMmZhd2RYQk1jWDdnTDhBUDQ3K2Y0aFliVmZVQ28zMFNCb2JCd3JXNnlOTzZodzlLTk1PRTAgUG9pNHl5aFA0aFpDMHlKNThQWS96OFd0WlpTWlZDR2Y2WDRtOFBmQUJqaGd3SDJyVytsZTdESURPbFVFZUpCNjBwKzQ2bnFkMnM2diA1YWVlS0x5RzVNZzlEUTdVcXR3Y0NFTUhQWDYwdFJQSnJMUUxXU1lQWTBrSHY3OGc3K2ZQNEFDUTVhbGIzYzZQbXdzanRmOEFxQ3lYIGF3azkyUFhBdkdGaDhVcWxxV0d3TWkzWkNleUo1Q2FxdHZMWUszM2ZWMWNaai9Zei93RC9BQkMvQURrMjQyYVNHMWhrZG1FZzU5YzQgZlRpdnlQVTV2bmpqcXNYa2dHY3JuQkVqS2cxSEloL2tXUk9jc3UwcWNoaFRjTmwyMVhXNDZXaDFIY0NRNVpKdHcxQXA4WlR6NnJ0byBnd3ZsalBpOVY5Y3VKQ3lMSXJkUFFzWENaQmdPTnRVN01adVVib1QrN1ZjRC9ZTmc4LzFhaXY4QWc1NWNWVU5YQTM2cWxIWnRZWTlWIHF0c1Y2WGNoY3VVZURzRGc0cC96WERBT3E3ZWVObUdZbWhxOVo3R2JTZjA5dC80Qy9uK2x1cGtDQUczRWtYS1ZBdS9OUzJwby9iR3YgNWJJVVYxNDlMaHI0ZXExdUVZWk40YXJhWDN4SFpCZ3hEVmhqTi9XeHpmOEFqLzZmcWVDbHZMWEE0ZXFuSmtsV0VCVmY1Z1BUSmhoTSBLNHVXNVZ6WkpCRDJkOGNGdGdUMnFBUVVuaGtabVpEYUZsNWQ3UnBOMk4vditBREFCdndzenlxellQMk8wcWgxeHdrZkFwZ2JQcHhVIGNJL2dzVGx6MDJNcTBjWVNOQzRSUVYwNHp0SS9mSTU3Y2NjbHhXamxiZHdybEpuS25RN3VVMDlqUEtvNFBsTFp1emFuYXU1RFloaTMgTmhsVkxNSU9ESXlJY044c0NIdnpnM0kvT1NpdU1KK0VTSFpIUVVIZiswV3diQTVzdXY1REhWOW5hWHoxYnhwaUduM1pZVjh3N1VqMSBsRGNqMVQxMGVyYjhEclRJdDhnUTdHQko1QTVXL0ppaFJaM3p6Wno5UDJBK2Z3cm9ZQjAycmtYdzhHQXU3dGxBVGxPTzhPNWtkVERKIGtxWFhLdkRYNWx3Y0RRL3JhcWVZRVBrbTJQbkJtYlpBbnNBQUFBSDdBL0g1bTFMSVlOUHJZazIvVldTTkR1OWVyZXo1T2NqcWJIRmkgM2VyeFh6ZURDSE0rR1A0TytMNEUzTUo3cGlTSmczWUpWMy9mL3dCZ0FTUjVKR2pkNUhaSXJraFpHd3VOQ2lHSmdRMzlLU1JBOThibCBsZUNwR09QWTNJeWR0L1VnbEZaWkkySVlYWXJMajROQWZQVEM4SWVLc2dHZFpCc2EyNmlpVXpFT1NNeTVrWFRuRWUzS0VRK1hzNjJ5IEo2M3hKZnJRSGdUclBIdEF6STV2ZSswUjlCQUgvd0JnUWZrT3hNd002QVRNcXp1RXhRN0pFa0hnOWZsclVmRTNFQ2U3UHA4TjgrR2ggcjh5ZFdtQ2txek1Ia28rSTNCL04wZWY4QSt2eC9vclgwOW5paCtHMStOZHJ5SU5UL01ESWFTWTVHTFYxNnhsY1BhRXhPVzRiNTdyZCA0QWJCbmcxdjZHaDIrTUJtemFTam4vUC9BTEIxSldRNFUzRnFkYlBaVHNNUFhTWXRHSVFQVWF2cjB4TlE2OXE5RGgvTU1HSVppR256IFhpbG5BODFKL0dlVUxMTWMyTkpPSDBHM1FIMzVndzZXWmR6VUxLOGpTd3kzQ0ZTTzczTWJaam54alhhSzdyUElybGdDQkhqUk1jYzcgZFRsSElZekY3R3BidlB1NDdlUE9YQ3JhYWpUTHBSNzRUTXJPZHUvR1RhUHNrdmlRcHNpZFVyRlY0dGtUdG4xVVRFTXdudzUwOGVCMiBkR0dJbkdVYnVpRE43L3Y1L2orTy92eGhNRE5GYUIyclNYY2poSnFVb2tzakNZdWJPSXFiSVV0R1hiUXVuMC9nWWNPK0dHRHR6UHE5IDhWYkplV1pZVi9ZSGovNTk3QUg1QjZKTElSN0FBcGllWm5oNzFEL1cyeGdjQTdCTGhub3FtMEsvODRZV3c2ZkQ4SFA0SFl6SXpZb2UgTE1UZURRVC9BTmo2K3diL0FOT3dwUlorZVF0cnZkTU4xS2VwOUFYdFVDMkhJWEc0TThWc1RRTU1mRGNBOVZtV1J3d2FvRndkeG9aUiBadENyeWF6c21IZ0FDLzhBOWc2dmRRU1J0T2lTWXpHZU9WMXkrbmt0UUFpOGVtT01Fc1kwZVRmRjdEQ3RyQk94STVNWXdCSWdQZG4zIGN1OTJ6LzVibzExNStsTFFNWUxiMmVLYmF0Mk95SUFuNW1kWDlaR0xRcTh0WTNkUmVEcDRlRk1tSjdJQzA4VmUyenBoTVlybFAzekUgSjlDL1lOZ1A5ZWpUUWgxRUZzQ21RekhjQkxWUlY0MnJyTjVJTnNpc29kaldndkhuSzRCN0luMVZEY0Z0dlpBUUZnZ1RuRCtsN01KZyA2dTJTcS9ZQUE1NmZQOUl4a0wzRmxhTmIrU2tpekVnUHAvTHNjV3g3QnNwWHJIQ3IybTE3dFR3OVBPTVJpd3hmR0FPMUtVK3BwK0ZGIDhwS0l3d0hoai95NFkxRnYvUGNNY0srQjA5WDR1U3lqd0dORGlqWXltNFF3d2RlaHRFVmVzYVhTYWVZV2pCZUh1REpPUHA1NXFXN00gZWV6ZFprd2Ztd2VGdWdOZ1FmMkFaV2FiYmxFbTNnOHFSU2dlb2Eyc2lraWxaSXZ0eUNPTXZrbkZhQUpVbEl2OGlJNU4rTHVoNDVyNCA2UE1jdXF4Y2dibFhkREcyUW1yWnV3bDhPN0Q3Q01GQUx2U0pSUElmTm1CbVN5RjhPMVBsWHZtSCtqaFFuOUpON0h2L0FPLzhCNmZCIGkzRnM4aDE3Sy8wMnlpVEl3MkJjR29wZ2lRejEzMmFodEUxZmNOUGRWc2t4RHNEMjNHeStOb3pOendtVDk2dWRrZjYvNEErL0FBQ2wgeEI2YjdWVjNaM1YycEEwdTJwQ0pjZ21WN1g2bytSV2hldEQ0Znc2clQ2clQvc2h3RVFiYkczUHVoOW1PSklUbkFEN0J2LzdCQXAraiBjd0dJV0VrWnBoMnAreTYzQ05qd0hRMmhUM1JEczJVckIxOHhNUTN3d251REp2emdwVWR5WjVhT01zM205amZrSDJRZGcyQUFMRGNuIDNUS2lvYXlFaHdlTDIxYWMrN243aFdKUFRIV1JJeVFhUjBqYUYrZS9UbmlNVllySHU1czNmQUZXUU80TElzeHVNTldhMDUybTlrMUQgdTF0UkE3VmN4QmV1QkVsS2I1cDlETUtmY0hKT0grQ3FXMEcwR1lSbVo3cS85ZnlpRDd1K2YzLzZESTEvcERiS1JGOFNVbmFwYmF0ViB3WkxORHcwTlBFb1pRb1dBaTZmSThrK3lUTjVWSjVBOWpNK2g4Wlp2dXhzNS9UNEIrQUFEL1VkTTFFT0NSWUV5dm1qSk4zK0crU2tWIHZaOHhmWVVORGl1NnZYS0dQRHJrT1luL0FBSEE0ZXNFQzFUTnpWeWpOdm52L3dDZkg4RC9BRTdCZG9JQlJIU2E1S0xkWEFkUzFQa3AgYkFOY1RBa3hYUDhBRXpUZG9NakF5V1JXNWdSeURZd09vRDRPQlN6RmZVWTg0SEFpU2srMi93RDcvd0NmQkoyak1TckE4TVQ3VnlNOCBTd0puZGV0SzhXNVdKdWxGRHlCWTZqUnh5c1poTWpvanNpaVM0bjdjYnlTNU1mSW9XZkhucGIxQnAwc1FVNFh4bWxBSnNheG1LbUxXIHVObUYwZGtwdXVXR3VhbFVPZVEzQmtRakE5Ym5xUjg4amlCZ3pFcU1HV3BhSE5RZXc0c0h0Z3dNSFRDSHNBZktYM0RnVkdzbFZjUGIgYW51QmJ1YU9KZkZmUkcyUlpWUHA5Vm1JbHFLRDRvVERsTDNoWmNIM3JNbytjR09CRWsyRFFQZm53QTgvdno4cTBkb2RFMlFlUGFhYiBhc2hQdmgyYlJKakp1YU92UGRYb2N0RWFFOWd1QncweFEwTjhJTWxpd1A0ZUdwYjJ4Q2FPVFdwamRxU0QrZ2dEL1VrNlphM1lJZlRyIFVDNGsyMDRacEpzaUIzRGxBa09tMXlrSWR5bUt2bUxkMlVuVDh6dXBzSSsycUJNZHN4ZE5qS2d0VGhQQi93QmdQL3NEOCtXT1Y5U3cgZWswMHJtVlpkTEpORklYTU1FVXYxQmwwOGUvSEp0UnNFWEhIdUJia0VoRTZRd1NDRW9KbzRVaFpwMzNJMTN0VVFKTk8rS1hJdStTVyBydHhBNTNPdzFRMDlNbmh4MmJwemhMZGhaUmVyeTFvUG1UVy84UWJPMFVPTFBvWStxNW1qUmptQmtDeU95emVRQjRqRmhvVjdnWlVhIHI5bHdZTi9QK3dEREVCV1NzektXMjI1bkMyaW1XVE90c1BnV2FLZlBWL0xXMml4blo4S1F5QWNPbm1BNWkwSmlxQklIdVNERmw4Zk8gTW5FbEoyUFlEMy8wQzdGZnZFT3RDQUVYcHV6blpiVFlhUzd0RnFhYjNpSTRkcFJPcUJERGowT3lGdERodmxvVlhYTDVzUDBabDA1KyBNT2NKTmd6K0huOWcrZzA1cWV2by9Zc1BtOXNhQkR6MGxiNVJNY0hDelE4dFhiSlI2WVFmREZ3SVZrVE40T2R3TEwyY21qQzFkbUorIEVkdm9KL0RIdEY1K1F5SzY3aXM2aDY3cEk4SGVpUGRIazJGWHgzTllKOXRWMVV4VlRTTFNSVmlBY2tiUEQyeVVNc2FBUGJ4eDF1TUkgOGZLU3pCVE52aEpyY0NCamFoRWNPMUdKYjUrUXJ1cHV0MStZSHJkOGhtZUgvQXNBOHFzblkxb0YyWU1CNG16WndBQTkrZkg5L1BtMiBaVzZIZHkrVGNzVStuTW16QTYzeGU3TzhIZXdYWTFUdVFzT3dUS2ZvZGJjSWEvYWxjNmg4THBCcDd5em9mSmhpTzdHL2RmQVl2eUMvIEFOL1B1WUh3UEtqMjFBcmxsU1UvRFZGVzZtaldwOGVuSWN0OFUzS3VUQ2ZjRlZQZ2VxMlFnR2VEeEQ1ME1ueWhvZVVZSFNZVDZDQVAgMjYvZUFQOEFVQzJWUEpiVnV0eDdRQnNpcFhMalphNkZVUDhBTDJKb2Q2bEYyUVFob2I0WS9NRDVPc3RQUTUyNXZQS0dXMytFOXJ0LyA3UkFGOCsvYkFmTXpKbEcwQVJIamRTcmhmVWVRMWhISXdidXo3Z3JVTUNDTVd5TlFLeXEwTXd0MHJqL0NTTDgwYnY4QTI4Zk5qcFByIGF2SGxMNnFrWlUxa1Q3TE1LUzhyMkVCdGhUY0w1S0NiSGxMZkpFUFRHbnpPWHc3RzQrMnFwaXMyYW1yNHdzd0dFOW5qWUFIN0FBMysgNEVjNXA2UEw1SlhuMTdiU3E3dURiTFlKalUwSkZxSWJScGxReWo0d1ZXNE9ESnZBOVBlTWJRcWF4dU0yWStGR1ptODN2bXdiK0EvciA3cW9zTjhkSGRUSldEZE9FYTFFT3pXU3NtaXlDVzcxWEZQWElVUFRFOE8rUGt4OFhIQzRFZ0RnZUJwNVAyS0RCaU9FQ1dqYWlDQTJBIEEvQUFIVmhNdTJGT3hpbWRaZFFUVzFQRGJsWnQ4QjJTMkdIK0phTFlSU3hueitHOXdEekUrMUNINWFZSittVHRBc3ZtRHk4bk9FM1ogcHpmZ0I4QUFQbndEOGZVc2R1akJxU0s4SW1TSjQyeXh2Y1IwTVpyQVk3VWNQazVaOXVOUnNQVnM0Ym1DbGw0a0VZc09pUDhBYm5hbCBqUjlvNE5kQjVCZm1wREFlYlQyYzdPRTZxOXBSaHJ0SUU0UGtVU3JpNGJnSGZERndVbk0rSFhKK2UrSTh6Y2tQak9HT3lCRWZFK2c4ICtmZ0FCKzYzR0RBdXZvOE9saWkzR2FqTkQxdTd5R3JPWU5tbEhoTjhDOExQNDIrV1M0SWJnK0hMTFg1NE44R2NEdEVZem5BbmcrQW4gMTlCNEMvUDNTSFR5RWgzdUJQMHQ5emxKa3N4d0M4SFBHS3ZiTzZJRjNHQUtmSWR5REZEWHhESVZ2UUo0ZUJWUkg1UVY3TWVLcjdYTyAyd2UzUCtmVzcwL3E3dXhMNHZuNmZyQkQzOGVQQjYzWGxlcGJPdGplSlVYVGcrSHNiUVpOUWxic2t5azdnd09IaysrT05yTlpxOXlQIEx6dllRSWN3ZnJkMkFBZytmY3NqUjhDVjh6V2Nha1J5UjFXTzR0UDd1Y2VmSVkvNlVJbURGQ3lNaXV5Sk5HMmNjbU9BSlUwdml4WTUgcS9QU3lITWhZcXVKekJCMDFFYlNPdENldXN6MjREN3l6TW1hUWREZy9MbnpzeG5CTTZTNEdsaHVsQzgwT1NZaE9ibkJCY3doUHpHViBYQitsVFBnekJqT290dnMrMEtLSXhhOXM2cVhHeDJvWUxoNFlNQ3RZOWFVLzZzdGNqWTVvbExISGdkb3RTMDVseWtaUEZnODBZWG5LIGE3QUdwMGxWU1FQcFp3U2dPZkczT2xoWUtIbzYxdkhNZWcwcm9mWnlqNHJrcG9VMUN3YnJvTnlZOG1sSm9rY21qd2F1aGRmQnI0SFIgNllCbFcwb0JsTVlGSnJkb3M1dDB5bzh5eU9FT0I1OTA0WXRIdk1XekZrQjc0SUxkalBsUDBQWXpJc3JLdTBkekhpcmdnUkhQdndBLyBzQ0NnMEgxdlI2cnFOU0h2ZVZhdHdWZE1WM1kzRXJlMUxDYUVpMUs1dHBJY25Od1lERlZ6S2ZxdERxK1pCdW56bko3ZnB0bzA5TElJIElFU1FaOUJmajREZ05SZXkyRjM1bVpUQU5GdVdtOVN0UURYc2RUcmZPUTdRYkxnckE5c0thSGNJZGtXUStQa3h3aDc4d0FXb3dqTTEgb0ZHYmZEZFhKS09BcUxZVUZDQUh3SFhZTHpMOG53ekN2UHpnZzFEbUJHRzZCclV3TmhpMExrU0JZcWFucC9HNjN0UXduOHFiVjl0YSBXUVdzM0pwelJpYndiNXNqOTNmb1BQaitKK2trbVZBa1VVMm43STVZaExIaEhESWUxTmhDVDJSUnFrZUdROW9iTHVvUGtsamRpenVtIG9MdXp5QkhyemppRHdhcW1BUHp5YTQ1Mnp5QXVMaGtMaklkSFBkT0VpSmFTdDJhSVUyL0NtNVVwTm1mRGZMcnBTWTNwK09CNnIwTlYgVHlaTjlLTTJMeTZwTHNEUCt5RUEvcjdxZnZCYnVROVlpZkthS05DVURtNXlrcDF1MUVpRVJhQXRDUUx0cWsxK0gyM2NBNkd2YjRwTyBFOUhYR1o1YUt2RnJKMDI3VW1jUG56NEFCdjRFQUFUTnl4TlFGU3RrSmNkejJxdVphQTJTcG8vR3c2UE1BeFpZRnltRUdVd3Q4UEQ3IHk4S1E4Q0RobEdaREtjWi8vd0FCOSs4K2JXcFhhdkZzMjVyUUFucE5ibVVrYTc1R2RSby9UZ3R4U2dpcGRuWUhBeDRlR25yZURhM2cgVGpoMnpWMmdaYjV6aElUWUgyM2VQb1BnT2p2VVR4NHpRcEdza0l0VjV2Y3g4aGdZMndDZzk4YmVTUmp6a0NZcUM4VHYyWWlTT1EyNiB5Y0JrWmE3TWFGR3puZmhjZTdzaDJCSTFOM29NMDUzVGtvRmVsQTZrcHRFMENueElhc1VzS0xWOHdleVEzQU90bVBtVnloMkJQVm9ZIHpsRFJ5WklkdGtCbi93RDRBK1lMN0lwdEZmZ1o1U3dsSVEwT0Zvc01kRHZnZ1cydG9LcGxYcmZBcGxQdnRKaHlId1FEZ2VzYmMrTHQgQ004bkRmYTdnUjgvVVd3SDlnNmNGaVUreXZrZDgxYVJlNURocU1zaXRsTWhuT0dnK1krT1ZjcENIYUVNZXR3MC9VSmNJZGdNSTZHbiBnS3JoY1pGMDVVQ01jdEdya2w0QUg4SDQrQVA3L2doNm5vdlRmbGFUMlNlNU5WWEpKNkcyM0hVOE1QMm5jWEtWYkd3cmErNEdETlZXIHBNSFF1MHZhUkhEOFphQlpNbmFudUV4eEFQMndlNEFCMGxIaWlTTWFPWkl0TzdyREdyUTd0VG5neGdtU1B4eGJlRFk3UlJ0cnhUdEwgSzJwaDNwblE2eGh1elJiZW5iR3N0cDF1UVVSSkdidzRwaUdKNmhoWTlieXJZaHhRMmNwYWhJQWQvd0REb1ZnTzc0TWlzS3ZVcmdQaCB3MXV5RnRQY0lZUDlKeTN0bkY3TVJuanVqU2UvL1FlZmJDZkFSRHBKZkZ6VkllWE5SbGUrWlpMUXM1d0pEYTNMWXlrMnZBTVdHd1REIFBhdUg1bHE3Zklmd3lZd29zZWNOOEpPZjVJT3dkTlNaWCtuOVNJTGVWWmE0MnpESUZTK1FTczZQYkJnOEwxQ1lKc05oZkU5OE1mTXMgQ1dxb2FlZW5CMFlZVTNNWThKSVREZjhBWVA4QU1CMVhzZlZkUHJGOGNjc3ZKTjJRaHpMc2lTVnV3aDh0a1ZuS1hYTDVOWDVqZ3lWcyB0M1pWNjJqZ1hDQkIzTkdLREdaR0I3NXNmZ05nMzhCN01FU2xwMkVudmhaeWdqbUtRN2VQcklrU1MrelBsV0taazhNTVQwdTJkSUkwIFhzaG1qeEc1RUt5SXYrUjQ3dkFlMitmTldMWVFOZ3ErMWEvYXUxVFVjRzE4eXRyREgwNjV5K3AyUnVqdnhka1Q0ZUNlaDJxSFh3NnIgaFlGRGd6RlpNelJ6alpOazRSejRBZkFiQmlCNnNoVjV5T2tQcjVXbVVlU1J0d1h4cUhvZlVoU1Y1TDVhcTFmYVR3c080QnpFempkMiBPQmlkOXRWY0ZuaTR1ek5qeE44NDM5KzluN0ZCN3ZDcU8yTEY4V3hwMVRhdjB4MUx5UlBrMnhVNUlrd05sYi9GMWpPV0Q0UW1WdkRNIEJ3NUFQWENsY0NHRDVNc2xMUVJtYm11OW5UNEJCZmdDRHNCL3BQNjFGTzFGZG9mTTB6eExPRjFpYktzQmluNDZRbmxFMVRxK0taY04gNFQvNXdnWS9uNEZqVEJuMWZrM2hBaHgrQUh6NERZUFA1ZFFrV3NuaDBMNmZjVFQ3T3NlbUdta0U2U3hTNmFEYStwaUU0bDJwbzlVbSBaMjRuTUQ0VFNTUnc2dE0zMGtFMm9qbWhEeTVhUm9TWW1Md05XOU1yeXd5K210SmdRaTdoWnJLNGpxeUVOUHZDNlNvSVdCem45VlY3IHNkMnh3UTFzaDJIVGE1c0o4S0xkWDJvOWg0YTI0TDZmL3dDbjg5T1QyWVlVUXhheURDWW0vdjN0NTkreDZxS3YxZlltMWpjb1hYdkogZEkyY0VVM0Myb2J4RXNnVzVSQlo1OEh6QTVoYk1HR0I4MkdyMjFIK3pib2pNMitlN3dmQWMvOEEyRHFCcnUvWmI0WVBIb3R3TGRrUyBxeENMMUg1eDU0U0Z1eG5MczEyM1lYQmJXNjNtYmd0N0N2Z1hoa0pqQmZ1VDgzK3dmdjIvODlKTEExVUE1TXlIVlZlb2JzNFdVcWt1IDRDZUJhUFlYVjloQVNoZ2V0NDJSdzlESDF1OFlFRzJEdWJNcmk3TXJMNlRzWDlnUWZBZE9pYnVjMWplS3FTZFU4YW90NENWLzd6VW4gSnlreFRkb1VuWjBrbUVLb3Q5bExabGJiZVJaSHhMbUdPS0dDNDJ4QUVaWTdWRUJtek5admltR1pFTmorWnFpbUdSc25UaFpHY1hlQyB4alMrVnU2a1NnY2Vuc2hpazN6Y0Z1MWZBdFFjbXNpN1BXQmZaT2s2dUI3L0FMOWlmZnQvNnNoVjhneFlKV3lBekc0TGVja0FrQjNlIEE5NUQ1ZGJ1WEhqMnpyL0E2ZmZMSVQyRGZPWU51enZMUHloWjJQdWpxSFIzN3RGc0cvc0hJTjBmUE9IblJQcHUzNytKSWNXeVFqQXcgSksyUWljb3hxaDhzYVpYeGVIVDhSd2wxOEhybXRkSjl0TlQzZ3pOQXRhSm5PRWhFYjZDQUFIejYvd0JCTU5rcGQzc1F3TFNLM3JlWiBhcDlraU5GaFRLL2w4OHBHc2dLdWhwN0lHZkE3NEhUNGRxUUsvYlp3YXpHWjhWM25mQWxYSlJ6OFJBVDRBQWc5UnR0V0RCbzFsampSIEp0MkdJVlI3REx0TEhzMzNZaGhObVFSMjRuSVVWcUxDRk5sNUlHZ0NVaDNCRWtvak4zZWU4QUc0eEtaVWM2V0JPT2p3cEk1N0ZjY0wgam1XV2VTZUwyb24yUVczV0s3aTdrWkI4Tng0Zk0yL0NDQkh2aU90ckJQaTZ5TTVzN1lnejREdTZmMzgrQXdtSmkyS2JkaEZwRmthayBKakd0a2l3OVBUMWRJbVZmZHp2YUI3NjNnNE1uSkNIem0wZTJnMlREYXhhelpteG16YndBMy96NkQ1OXkycERXNEVkRXNVb1lxWFRlIGh1dDF1OVhwS3EwM3hqWXozUTJBS2FSV3BpZmZGY09KRDRDbldFQnFyZG5XVmk0MlltY0M0YjRBUVdBQWdBR0JBZmtLb0FleENCNVQgRC80UWRieFVzNWJVeUV5dDlxWkdnWFU1NVhUeUh6TFUwOS9jT1ZOcENwWUsyTXQvYTl6Qjc0N2MrUWtFL3NEQWZRY2RjVEdKSlRFZCBPWE16N3Vxa2NZUmdZNHE2MTdKTGJKTDd5bzdseDZVK2JPR2xqZDBIMDg2YlhmSVl6TWtVcEVkaTlyZFJpY3VTUU9QUFRzeks3dXk3IG15azNLQmN5M3hLZ1VrdElzazhZMmNEWTFoU21oOUgxdWh1Qmh3aFdETVZaK29DZThzbkJrTzBDZXhwS1RhSVBZSDQrQUFiQnlESmcgK3M0RDVhaXVCUTNaVnRCRE4xT1FoMC9JdGlrLzVzNkxEVi9EY0hDWk1jTEE1eHlBQ0R0VGM2YTRNaW5EYnNFNTkvMUFIK3BpMEhDRyBVdlFQWUt1blhaYzFWVS9HaU1BRU84TmxWdEZjRnF2RjJRUVQzREd4M0NaeSs0cUhxKzZVZFBadjlUTVVjMzk0NTl3SDMyRHBBNXR5IExhNXFZeWJRVnhvM080UkpkMkJWQTAvWjB3OGVYb3QzV1F3Sjh5cTJTeUloR1pha0JQZ1RtVGszZVVaM1VxNjBhdU9jQlA3Qno3ZisgbHFxeEtnUkV3UkE2aU5iZDkrV1NVaFpMRy90MkZKd2p4c0dqblMwN2JoTmp2a3JKL040a1Z4eCtUODlSc2RiUzdmbVEzeXZhZnNpWSBlQXlXd3d5TWtpd2x0TkFsWXF1K0VJYjVnSGh6RStINzc4OFRIbG1GcTdOc2Z0L3NFQUFQL1FlckVyVXo4YnJsSTV0QklMSVljVkpUIFI2eHY2djhBVUpnbW5sSW9obUcrNEJESXhyYmUvd0NFRURaOXRLcTFpamxFUEgzU1FnVklZRUhrRDhlNTZnTDZVZU9ZSkZmMHl1QVggZS9RRlgyMWFJbXdKdVNQRTh5UTNkRFYxc2ZNVDRhMnR2aEFQY1VDdjU5alBpeU01UnVieFZ4dXJYaEIrK256OVJQM1I0VXJOMHRVZyBlaXNlY3lhZTdHc2hTYkY4a1NNTDB5dVFJalVaRnRRZStNZ2ZrbGJyN0kxQVNBSEFPTVp5Z3RHV2Q3U1hiRGYzN0RBQit3Z2pxRklTIEowVE5pcnRMbnY4QUMyN3J0cnQ1OGIybXQvRWZxbnJRZHdWM0lQdGJDUEhHUmF5QTdqM3gyTnVUN2NqMm0rallXTHZUTnpFTzJzckogZnhwUU9nU3VlVEI2UW5sRmRUZk1CQkNZbm1BN2lISUI2NTdmMU5Zemh3WjhWM2taK3B2WUtpZi9BS0RzSFhHMEZLVGQ5aEZsTERzaSBtYTByZW5MQ3Noa1BORHZDdHJhVHpRWTdxSWJocExaZEpZLyt3enBqTXlxOVgyK3pBd1pzMkR4N3VvUGdEKy9wa3dRYTYwTWFhWUd0IHluMzh4UzJUSnMxZ0pPRFJadHdXTjhUZEh3ZW45MUUvamJCVy9MV0huQWRaV1VQRGpHR3lkOE1lL20vOCtBY0JZVlpwZm8rWk1zR2cgb2VvZW42NXpyc3hrTGFxOEtiNUthRjQ4NVF5SHc2MzdxSWRYbUtkQXNIOG1qWGsrQzNuWTNZMmsyb2VBSCtmSHdHd0h5WjVPOGtZNSBZK2pqRSs1VmYxSGhsaUdQeHRNOTVkOVV0clJZN0o4N1RzKzcvd0F2Wng0eCtkM1B6a01BbDkyWGJnT0hxa3VtdDcrMVNid2syUWsxIGlTckloZVQ0WCtIWEt0WnIyNHNwOHhpeU9DZWhrWms3Y0FMeHRaTjhhT1RJNFJKOEEvSVA0aVA0c0hTM2gyUUhNcjhOSUY3STdiYUUgcktRWUpFTE5SQU1WSW9keVEvaHpMVU1haEdSZzRyQUhnYkdEakVZb3IzbFdXeWJJOGJBL0g4SDdZRDUvcXMyNGJPMHJvS2xDMHhlbiBVTUNGNmpKZFVMV3JaS3VHdTA0dFRyUlpLY3d1Ynl5UHl3WXhUOWpIZXJFRDY2M0lMQTMwak1QVTdJdnI5ZnBQSDhhL1FnT0dMV0lKIGVwRCtBOGtMVFZSMlEvOEFoOWtpVnNSNlpjRmZoNzQrVmxGZkxJWDRlcERlRU90MkZ3YXJwbytCZUVQa3dzWHRtSENRbS8yNzkrd1ggMEJCNml6VENXVU5BZ1JwazJHUjVSbEJKZTJYV1Y1cmtVS2NuVXJ1V0FRTVIwbVJJeXlKRTJUeGJUVExWZDZuMzNacmROOGM0QlBMWCB3NXN0TEtXV3RqVzFqVDkveldSdFlSNUt3bzhSRGNxdmxxNnVocjliaDlTQ0daUStIOXkwOTh2N2MyWjhyQ29FYkFIc213SVA5QWdQIFkvUzBQSUZyWmhxYlZld20ybnp3RzJuY2VuOGZFbUJmSG5JOCtqekMyWW1URU84R1NEUEhuamhnbXpGQmJNc2c3UndDSFA3K0ErL0EgRzB2bVhpdVZNRGFHbk53N25XV05OMGovQUlLU1BpQ0VNb3ZGSHluK056REFkeHJkeEROVGJlRSs0a05HSjRxN01UL0tKdjhBRVd3YiA5ejVCZmQzZVNvN0dxY09MdW1zZm1PV1NOWHQ0NVFXZkdoRFhud1doOERtY3dtQjEvR3hnTGVlMUZ1SGQ5b1YrYzhKZGpTT2ZvTStmIDJEWUQ0QmFNUXNnWXU2Rjl1SjBqczRSRVVyTGx3Um54enpkZkhUcFJISkxFVmsyblZBanB0UlVLcWlURWtOM2JlNE5WY0VXYkNXakwgUnp5dlQ5clY4eXBJSmNoa2xPdDRaaFBYcGprNUx6a0xmT051RXpVSWh3OW40a3YxcE9NTS9QTGtabGw0M3ZZdmFvdGgyQkJQbjJvYyB1QmdUZTdWU2dhWlNYYUtrMG13LzR5VFlEQ1lGeW9oU2tXUmcweHpIRkQxQ0orS2VxdHFnQjJmRVh0YnlNQjBtYjdWZ0FHSUQ4dW9KIC9xSEJwN1lHbVZMYlZYb2RTdzF5OGlUdkhzaWpOTjdDK3hSZFpXaFY4MGhXNGN3WW1MZGYyb2pnYS9RNElmY3hkRGpHYzRiM3pnUC8gQU1BZlZVUzNLQVI1YVVtMlVuS0x0WVdja1JFZXdRRmI0bUpMM3BRc2ZtQy9WWmQ4cml1Slk2SlhObEo5bDFZaGpHVlgwNldXeW5hVCBTSGJZQUZ1WUFRQjgvVVFBbzRxTVlrZEpLdFV3a2llM2JFcWpDT1I2eUlORTFXSm9OelZ6U1J0YU9CQmxNQ1RVc3R4dlJrZW80bS9pIEtyUUpHZTV3UmliQkZjeG1Ia3M5UFhLVGpKNVJWNURYNlRuT0RETWZHaGhLeFVNZ0dmSVloYk1MNGRWYldDZURtY1pLN25nRHE3ZTAgZmdJQSsvSHdIVDRITUdudTBHaERxV0JjeHVqUmNPN09QMXZZTnNGazk4VGFSMGxsRnNndDhraDJwQzNpZlV0NEFkVy9jeDVROXMyTyBya2syYzRDL1c3c0RBQTJCL1dveVF6Tlh6TDRLSWRGYW5MQnVhTk12aFZ0T2oyRVA4WFNJVTRId05EcDk4cE9HNEdLNXJPd0o5allEIEhrbzBDN01PQSs2T0w5aWhlL2dOL3JIZEF0Z1YyeXF5YUdIVzBtd2JnTnFhZlJ1UzNyeWVVdEIzY2ozNHJjT1NNaTJ3TGFxMjEvZEwgVXlvck9MK2pCQWdSSkJnSDZvdUF2d0R3Q2xtaW1rdERxQzhlN01zeng3MTVHTWxOM0pOd2RvNXhYR3h3YjRaaExwbFdVN01rSTJZWiBVYnVrSEJDczQvcFgzVU83T2lBUlhkUEVabElXVytIbWg4bVlVRGQxTXFUWVFBNnJxL3RqdHlldGROVjRaQmJEc2pnbnJaRG5IOFVGIHRISnZZMURxOVpHZjZXdkI4QWdyNEFBQTMvbzhiREZtVjZQckd4b3BoQWNIeFAwdXFaakpEaDhWdG9UWlordW5CZzA5aDZydml0dzkgZ1ZzMUFiZ0ExelpIdTBQak16SE82SnZZQUFBQjUvZ09DcXRSWHNSeVpHcXdXT3E0cVJsQndoYU5uSHpGbTk3cFNtTHJsODdQekE3SSBIZkxnVzdVc3V2MjIxSm1MTUwyd21jKzd2SElPUVlvTDhmNkNuV1JNVW80ZXZtaW1hMzdxdytRMkFIUFYrV2ZNVHpDcnVSaXY5TitOIGJ3NjNNTDljVUQvOXZEczVQNnl5dkdMc2NlRUZCQWZmdkFkR1kyRWtZMUtwcUVqaE9ucVZNSkgwN1kzRzAwRFF5dWFVY3pOTmpkeGkgUEo4MWJ6TGtZaHQ1UEhKaUQyTEpGbGd5SlF4ck5yRm0rT1JYTXZaZFc1TnFIaHpXL291aDJFd3lGRk93emhHcHNWWWtDeGxqS21yWSA0NWlpdzUxM0xaUjVaVXl1WlJpVlhxcXllaDFmMUloQlYvVmxJaDhLblJRdGZKT2RLZC90UzltRW1LREplUStJUWl0MTBWV1dmQUhwIEZzRTJVd1hWTU03TExzRmxNY2dPM0ZqOWd6SjB2T2lGTW80VWlrVWdRUEJWYmxnRmtZaERsOGJuVnhwcUNpRkIvYU1LRlZ3aGlnS3ggeExTWXhvdVpwRUZLT2ZIKy9Wdkp1T3puWFFBdXhZODN5U0NmREQ5L0g1L1BWamRQdXErME5PdGxxdDVMazFCczFvbURkUjBkcXJoMyBiYklPaklhdUtpWUdXVEc0SWtLbi93Q2ZIYWh3akl5MlpXSHBSeG1QcHh3QjQra0Zoamh5QmZ0NmZCdkdreXMxaEtybTM5S1VjK3JOIFpxK0xIVG5SWXNLVlE5c2lEMkFmSGdsV0Yxc3VRRGVxeTBDbURrU3k4TWFhV3ZVOE91OWVtb1FDOVVCM0gvbUFzTVJwdm1aYzl4MDAgcm1wYmNqMVNnWXhhdjJVUGl2UTY1ZktuaXJINTRyZHdRdzVqalp2K0YrdE40R0RPVUV5WVA4Sm83OS9RTkIxRjREam91UlpGeWo5USBaNmV0MjNhalIzSUxZMjFNSXIzS0pXNmFmVnUwSEN5TEl0UjgvSkZjMW9uNzR5TTFaL2lBbnpZMmtuRjgrQUFjL1A4QVRXTVVjaGpFIHN3ZU45S3pnTHRYdTd1SmJ1ZmNrT0p6azdjdTN0SFFBTXlRbHNCbjlSV0Q1MXNiQU45cTFsdUFqOFY4M3dWUjh3NGgwZnBMWTRxZlcgNTR6WVh4QjZUZVZYM3l0UGxqRm1nQ3lkeU40WkVJeDlxQTNoUzJJY25XYjRVZWJNQmhPRXZIYUkrZllINSs2RDdvSU9ESEhXN0cxZiBEU1EyMzN5MmtpMElkOEQ2OWxuZ05aQzN4d1gxdGxmSEJQWkhDWmFoNm4zeWovOEFTOFhVQXdIYUlNM1ZZQkNmOEQ0REh6K2pUWUpzIHVkWmhMTzB5NmNGRlp6U1NEWURPblVFa01TRUtzYitIVmdSSCtxYmVwNzRkMjd4M01JMVBEdTBYWmVGeHZPK2UrSVJmcjlBWDM5Q3ggUGJDMjh2THBkM1ExVmlua3EzYWdPVFYxc2FYNjlWWkZUOWthNmJFMEF0dUV5dDN3T240TDZHMUlkb1VzOFRCbG1QbG9lYzN0MjREeSBEc0dmMkRZQUN5Uk5FczdPSENHTllnc1Z4b2tzc3F4eGFkSjU0bmtUZXhtV1VIQ295cE9iQU0yNHBFbUtCM1FUSEdWbHpqZW9vSXo5IFUyUXV0b0dQampKeDl0blNZUjdjclNodytuMm9IV1RlV2dCd2Y0aEVDNFZ1cHpLYitXTGl2aEJ3c2h3VHpDZVFXOEtsdkQvY3l2M3kgWm5qZTBnR2c4QlFVSHBENmZ3Wmp1WXlMbERnYmFlMml2UWdtNkppNUdyM2hzb1RFUE1aQ3lPNmtOazdnR01XMGVQNUlUd2ZMUVdlRCBoTHNTZGdBQVA3QnY2d1Y3WU9hZUtuc21wWldUVzk0NmVEbzBTOFdFSC9LZ0cyaEpTdVVQZ2RiaDdzK1pzelVCY0ZKcTJ4NTR2V2UrIEJON0JnQUIrM2RnMy9uMWhiVWZOVUdhREd2bk5xdVd6T0h5eDd0WkFld2c2YlhJbWtkbkh3M0RTdUhNVSt3ZWZIbm9NTVlURnE1TjUgQmRyM1k0L2JCK3I5MU5OOVRJbXFMNldOTk1ydmxNaDlDZmJ4OVY1Y2ZTa2V6bERqSnRFRDFKTSswSmhFdXk2elhNbUFkY1A0WkpmYyBsNWQrT0E1N1MxK0I4ckcrUWEzYjhkUG5vZFBxV2t0REpWSXAyUWVmR0FzNE5FVnNsRktyWUxJcXV5QTdLbmtNTFVnT0Y4VG1RWHdOIFdaLzcyOGYvQUp1bjM3WUhCM1BjTDRYOG5Oc2F0MEFEUE1TWWdkSmhoMnd4RWZCTXA4VzYvY09Id3c0Y2N5VGorbStlcXA0MFpWNnUgVEp2SENlRCtmZmdIZ09rYlg5c1c0THB1amFNMCsxV2JUMGZVVTJ1NURXTU5xY3NudEZjN1dCcC90dUhZNlRaQzdCM1VVa0QrSEo4MyBPNVBjbjRRSnY3OGc4ZjJBL3dCTTNOSXcxeFBJd0FOL2FYYzhEWEZiMGxQeU53bENNVDFlNzh5TUgwS3JPUjRSTEZ0a2RQc2F4MmRtIHM5WXhLWUdqYVVEUUgxOVBnTWNWL0RvSUdkWW9ZNEUxTVNSN2tNTTBzMHJ1K3pNMFRTU1BPMHNranZnck16UzhXQlgzRzVRcnlTU2ggb1M3SkU3N0F4VHV5QUFTemhWSG16bCtCWFFJK0hOUDlxa2FTN1FVTzdNZ2JKQ2FlM2k3TW1Ra1F3SjVzS0FaaERra01PK1BqQXQ3QyB3Z2Y2WlZ4aXlUMlQyMkNva0ErZzhCNnZJMEs2L21zQjYvUXN6K0Y0RG5jaDIzSjFJZHFpbklXaG9tVitobVE5YnJlL3VFNENubm5oIGszTjhLTE9QQ1Foejh2SGo3QnNEOGdkVVZWMlZmc0taRFhEME5BenJCRzNaTHRCcXF1Unp3OXlGWGl6RzlQNDNEbVErTjhENEdqd3ggZ3hYRnN6TURDRy85L0w1OSs5MzUrN0I3WVl6WEJWZHpLM0dkczJHdHhGY2F0c0ZzR0tsT2liR2lzakFZbVF3OWtUTjRnbnZvOHhtNCBIVjdNVDRVa20vMzhBZlArQXdMVFF5eW1IUFVPVWpoYktUKzBodVIzSGpSa09TWlozNU5ZNG56bHd5YWFObWxJZ1NOOVJ1WXg2VS9UIHhqSXJacXBPVjRyeFpKOGRURHhROVVWOHZyYTVTNlRldGtYbUFxMnpWZlZRTnI4U3RnWlNSY2d1SFg1aW40YUhNaHA1ZzQyMStlZUggMFlUZkZjWThuT2JKUGFJL3NCOSs0RXY5UExVNU1xdnZRMUxvRzVrRmtWekF5N2xlK05TRlByeGNES0t5eWt3ZTRyZmVCOFR5REk4VyBYOXFwNFlNRnE2d3MrYXE3Zno1OStBSDM3cERyRkxnOGI3VldpcFJxM1gxcVZXMnFaL0F4a05qSUIxUUZqcjV5Q0l1UG5KSm04SS9iIDZBRUVNeXlWYUJnejZTazdBQXhRVCtJRGdQUjdYOVIxL3A5ck93alZmT0ExOHNGMjd4dkdmWHVvR0pha3I0bG9XTk1JSjVpbjZyMmUgcjBQODRUNTBLc3lkb0MvYTFBanRqd0UrZ2ZpSitmajRBak51NnFTUlprWkZRNU5lYzZ6ejAwa0Uvam1HTmRQS2tuOVRmY1lKdFhJcyB0L2RvNG5WMXpjU05HRngwN0loQVJvRFo4eUdlTnhYYVlrYm5MRmVLR3dTSUJpWkFVcXhRR3AzeVlzT3R6R2RnMlE3UVRLOXFYVVpWIGEvRHBORERzckl3T0RXMjhEYWpCTkdRMmdZVDN2SFl1QTcvai9rQU5jdTJMWXNaZ1pNTXFvS0JyMXlzSmtsMSt5VGEvckl3TGxXYlkgMFdrMTliY05ONjI0UGkvc1lGUG5xcUdzMllMS0RCbTkxY2JlQUI5QkFIei9BSUJnRURCU1BQUXE5dW1wYXJyY3VCNXQyUHpockF2WCBZaG4rL0FHYTRRN0lNT0JoOFlKbGpiZTJvOHhadkpvcStzM25oQ1NiK2duL0FHUG9MOGY2M1dCSWNHTzJHck4xRG1JeVN4bUZzVGdxIGh3OVRoNHRZV0ZLc2FZd0IxdnVReXA3ZzRZa0NGbGhBNnlUVjdRc3daM1IyVGY4QTc5d0ZCQVAzUzNDTGdrbVozMFY0RVNXVWJ2OEEgekMrbWdkSlpvNHNrRFNLSDJzeGFqY0ZpaG9OaTlPc3l4U0pYdHMyclhmTjBlS0h6enoxcFF5Q1cwVm5jRlhpOUs5T0hxNU1XanA3TSAzQ2Vqc1JocHU1ZVRaVGduc2t5WlQ3SmNGZjFaWEpDMER5cWhFMWxYS1BMenNudWNBQVB2MkcvNy9NWEp5elRjbFowQnRxc2JZUXVFIE5zMnA2T2gyZVd1Q2tiYVUvaTJRbnZpM2NIQXc0K3QzaDhYejFPM0Fzck8xczJ4N0hhWDZvUG4vQU4vVzIrV1FCQjhSbnVGeHBLUlcgNDBRdm1ENUQ1aFE4SkF4V1J3aFZXWWhRekhKSGlld0FaM0owYmkvZ3plTytlZjhBQWIrZjZNVEMyeWEzTFFNVkpLRHY5Mlg3YzNjSyAwYkNzSWVXVzAwb3c3Q3RmTVEzQndjSzNZSmxPbmg5TGVNN1g4R1p0bDRUaHdIZjBFK2ZQZ09qY3Z1QkhWNDRWOEY1ZDNETEd5QmdnIDU0dmtXUVAyZWdacldSNDN5MUxZMWtMamY4NXBZeUl1bDdoNUk1ODlMeW9OYmVxZEpyQzVOSEZJMG1PbzBQY21OSlYrMHV4aUxpVHcgczFvQjdoTWZiSW0yUGRiaXR6YTJIYWxxNGg0RENhRVU1elZ3TUx6MWdxSThBeFA0WW5ycHVtV3kyQzBHRWl3V1NTZW42VVVtK2RRRiAvTGRQdTYxRkthYjAyMEM1QXhhZ2RQZlU5ZzdWbmsrQUVNRENhdWhyS3p2WnRKMzlCL3I0L3Y4QTFVdS9KR295MUNDclpiNEdHZ1dpIHZnbFR4ODdVVWovTVF4ZGhBazViK0pXNkcrVEVOeFcxV0I4Q3ErZGNuRjRETjdCN0h2OEFzQUQyNjB6NUZGNVhENTZra3V0ZXEvYlogSVYxVURXN1k0bnBTOXFNUTJUNWt6VWhkbHdmemh6QWhaWnd4V1pObzR5amZka2pZQUFEZnYzOCt0RlNOWTVFTzN1V3pzL2RuSjJGbiBtbTRxOGhndUJxbU5ucHNUYjdPc3ZLTE1zRzJhU1FJRGNRZFFPM2JrVkhGazVoU3ZiV1hUZ3FPMkk5Y3JjT0tCSktLZVVyeFNweU9OIHJHeVlqaHpLdmJhbExlenpFL1RmTXRSaGNIZ0RvLzhBbmR6U1pQYzNuc2wvWDNnRUh3Q0QxTVdRSGpsQmVTcnU3VXQzOUFmQnJ1WXIgMTJIeStlV2dqZ1Zka1gxdmphZk1Na01MR243RE9jU2ZpM2xtUjdSeHcyRHRFQXQxQkFlQVNWMFdCRG5xWWV1VTJudjhGb1czNHNRaCAyY1lTRU04VWQ3R3B0OTRmRG1hZTdUaDhFTndLUG56cGJOeWZGNVpmdXdSSEFiK0FYK1FZNytieDlUYm81TDdna0JxeDAzNXdhbjlTIEZteUZ1Z1VlaGx1V1VpV00wSjdoRGNGdUhUOE93SHl1WHpUZnNjUHhiUVU5MHFycnNlRUUvai9zRUFnMWh0eUlTdWFjNU5lSVNpdGMgYzVaV2ZrVmo4M3hIY1NxVmQ4YUtrbWl4RWUzRExJOUNyd3pVVll5SnV4ZEFrcCtIZGpHajJFQnYzVUl5ZjRRR1NXcTVVSks1WlB1VCBzaUx1U2syQytQRDBudHkzT2JSL21DYk0rSWZnOWtOOW92c0FEZ0lEWUVQUmJSY2p2VjlmYVpGZlZjMnAxUUpNWnNjQUw1SFhxM3VTIHBXd1hZNGRnVzRiaHFjZXpDK1lncVhFb0tlODdYemttRENWY2tvK3dBRDREd0Q5MGFwY3l3TEFYN2FqWlZENmtBTnlhZXdsRE9EZzQgTDkzVU9yZ1VqUnZYS2ZYNWhreFpBN2dRWFA4QTFJYWQ1c3haWnU2Q3lzSExSTi83K1A4QTkvWUdUVmJBUFl6bXJUc2pxdWRxbHFwViAxSUtiQW5tS1h0aVlteWwzbVZiMmkrTWxxVS9UNGZqWU95cS9uMGV0dkt5K2YzczMrL2dEL2dNY2VyZjZlVzFhQ0grNzZtSFZhZUZWIHFPTFZpVkl1d1dhMk4wTTNuY3NEc3F5eEZlTkZwNVpOMkl4VE1aTy9VUUhIRm5jcWZkYkVERTRpK1dCNnBtRHYxSEREOVJXYVp0UjIgZkVldkt1WVhpMm1wWFhsdXIzSjNpMk0rTCtuc3gyckQ3ZXR3WHhQYlp6Z3pQUEYwWlpCL2k3ejc5YnZQa0VCMWJsQmRhNURJdEtQRyBSTHRtUlJWTU1hbWoyOXFQZ3pYejB1RVYrY29UakRlNzN4VVlUOC9LMXo0UVFreXNyTXZuMUMvU0ZPQXpTUnNPQjNIRkJBTDU5TkFqIEFPQlVZZXRHT3BaTm5TczZVV1QzYjVERGlCVGRRZ0g0akFaVzVpMnRoeDYxTzVnaGJ3c3JQYTk1M3lyblpKQmdMZFFUL1B1bStqTEYgcUJoZEJGTlFSS1BWYWFkUVVpZlh0NUdSRGkwSG5mVDZCYjhGRFRlNFM2VXF3YzRZVXZQVXE0aU14TkRXTUZsSUJtemlQaXZ2L0g4WCAwRGhnZW9Wc1hNYXVlelVNWnR1SnRzc0lRRHA0blNhV2VRWW01SWxUWnNaaHR4Y1Y2ZnRjUG1VcHRHbGt5UnA2TW9rOVNWWllvbGpmIENtamxZQnZLdDJNRFh5Nkw4eko0ZlU3S2dFaVZrSG5aa1lhL3RTdmJBVXpFdVU3bmdOOE1HRVBXQWhvY05ncDg1QWNJSEcrREs2dVQgV3Q3U2F1ZVArL24zNWdQejFCclVOamhwK29kTlNhY0pJWWhrcjFIMUZKN08yT0FGOExSUU5ianJVWkdSa3Jka3I2WTFWTFY5OGJPVSBKdmxYVm96SFBOblBvUGdOL1BuMzhqdmxOMk1MUG9aUzREYnRxMEQzSkxEdUdUY0VzektWOVFwNW90UzhMSVQ1Z2ZlRjl3bmYrb2VrIEppendPcnhuYXVydTZKellGOUI4Ky9kQWJRcncxTFVvWVRXMVBKQVpVTnRyS3YxVWEwUzYzUFNwY285V3hDSk5odUVQajYzZ2h1RUIgVm1EQ2dzV3MyWUQ4SUQ4Ly9rQWZzSXJLclRUT2U4NXpNZjhBRlJYdC9WV2ViUG54eDFBN1NPcUVJVU96QkVycG50UnJsUUJ0Y3ZQUCBDL0g0NkZTRnFYWlByUE9TTTBDYmZLMURrb2dkSlNhL3B5WlY0SFQzS3NhWUF0U3lPMWEyNEQwTlZQRDN3NCtjWnB4WEoyWnpid2YvIEFJRnNIVTh0NWJSQVlJWjYwQU5wVEZ5bVVtK2EzbXBOUHFZZnZjdlNya3JjZWhoME5rdUN5Q0hhdXRLUFBISERqTk5sUHZEc0Q0UHkgQUJVU0QzZFArL1psdGxQcVJ6SFVaWHcyVC9PYnNybUZyVVJXVzExTTdxNnVaSUlka0I0WWVZd2JHMjJCc2RWck5tYldUS0EzYnptSCBuOWd4eDJEc2RaQ25mQ0crQ3MwQzdFaDQyTFV4aDJWUjh1V2VUU3dBWGFoQXcrSjdqRER1QzNCZ0w4REdZczltMWZqSnczZ2JCL2ZqIDZEejRCMEtoUXlNb21pbCtkUUR0Nmh2YVF6U2QyY25KRHZpTXVPMGRYN00ybGxTUnhqbEc1RTJCdXhUV2xaMXlhTjBQRmMvQjYzYUYgaktkZW1aNlRvVnFXcFZyQVRwSHFVUFY0a1A4QUt0aTBLNTIreU85bGtWc251RXo0R3dmTXJTOG1uYzJiWkFteGdFSC9BQ1lOL3dBWSA0ZUhyTlhNYWU2Q3YwYWJHcHI0L3Fkb01kNVd3cHZtSXluQVBNT1NRdzZHSDI5a2Q1NDU4cDFQSm94UVdMSm8vQ1RkNFZDZkFmUVFIIFViRGJjVndZQnpWSkRTZDBBeHBaQThZY0Mxa1N1V2FmVHhoUExoMXVHSGhwL0ZZQ2VCK1k4N1dMSmsvdTIrSU93ZjM4L3dCTnF6Rk4gNGNvZGV6ODEySldjeHUwYVhYOE9aSWxoMDIycTlxOURXMDk4cXVHWW1WdXZtR284bmdXcmMzbFhLY1o1c2JDYkEvOEFkMzNRWDhBZiBqTlBESkVyRkYweVJTTVpTOWF1SjRvakZFVk9KK29qYjZoak5IY1g4YUFzY3JVd3NjMll2Ym1YQldZK3llTndNMGQrTm1zUlJ4bHlzIDhESG5mWDBPMkwzdW01enpITVVybWlvWVJoZU5RbG5LOFF4VXJRNzAybXVIYmNQcW9NVU9ua0VPeHUrRjAwN3htekh3V3NQSVQvU3Ygd0FEQS9zSFFRSHpLenNzWGNFcXRNazJCclJ3SldFSHpyT0RxYklybFBsVkt5cis4VVBka3g4VDVqVlVpZTJ3YUcvaUZLTkJOWk9KSiB1N0xVN1JIN2RQbjZEMy9vUHFlajN5TGJCNVNsNXhLMmp5UzIzR1FaSHl0MTVrNTVYb3NwREg3UC9KdzJDR2M4OUFXeGpOdWdzWWNDIGIwRFA3QmhzRDk1OWtENGJiWE15WTVWVmVWdEorYWVweGhNV0ZrMlJERHVZQ1pjajVaQSsrUGhzaTJ5T0RHOFcybjNUMlRXY2JRMUcgSTNCemYrNEg1ZjhBOHFpNmpsbzFqWm5jWklFQWRzLzR5T2ZDMWVmSTU0K2VoamE4L1R6dERHM2RqaElTdWErRGVISFBGM2ZGVVFTdCBWYkp0Y0JPYW5QV2ZwNXBnNTZtaHJpNTZYYlQ4NVo3dG40Wmg2Y1Y5YnBOenBtbXBrZ1pvK3hwSlNRK2hQV3VaZ3RmMmRpaFlReHViIEp3bUdTK2RhYXpUYlRzR3Vrb2VjdWVxSy9sMXNDeWtPS3VYb3g1OUJ6NEFiT2x5MzhDTnJKWHpsck9OSHFVV3dyM0JUNjBhRDNwaFogbXpMbnJWbGtPQlFGWlBCanM2M2pTeFVMS0UwTE1uOW43a2hQSHZmNnBjMjVGdGlMUE5Eckg5UklPTUllT1A4QWlRUEZEeHRmdi94KyA2STJTbTRjQ203VXVTalBqZHFuRFZwWnFQVzRGZ1labG9WTEVUVmRQSU9GYnNqSmNFTndmQVo3aVU0TThySGpGbm0vKy9qNERZRC9kIDNyanAvVm84QVY5d2xWVTRFcmFiYTlVbXl0M0I4VjFOUEZMSDhGdG9CNmY0SE1XMlJQcS9HY0JzQUNiV2lkWnE1Um1HUEd5R3puUGogK3dBTi9RVC9BR0lhbFY4VnN0UlNxRE9OaHlpU0RMTUZlc2xrTDB5cjN5V3J0SGIvQUo0WWZEQ2V2bUZWUzRIVmFlekRCVFFzb3p3RSBkVGFPQXFLM1YvQitmZ0ZSTCs1TFlFTlh5d3d1ektyU2FCSzNOVzh0SHlqelIzSUtORXM5cDlmRStxM3d3aHJYMlE0QjFJUUdwa3dlIFh5aHlheThVbUVxMzMrL2ZpTHJuYXZTeDZ2UnJGS0pwMGltaWsxS3g4UjZxTmJLd3pwejJiZ1NaZTQxUERHOUhDanJqMUR4U3ZKRjYgYzBrTWtLVERtU0Rjd0JraU5DcEJpQ3JmSC9mcGUyQmJEUStOQ0crVDZsR3BPVlRMYjJubUVxbmljRFYyRk5sYmVZY0szMUNPREhjRSBPZGJWUDIxaXlmOEFxZ0ZFMmI3c2J3WVBBSVBzZmZqKzZ2TEVJWGNMdG1BeHUyL0hzbC9MVndrdzZQaUdNZTdENE1ocDh4YnF2Wi9EIHprUGdjRXdzckNHMExKTUdrL1J3QURuMkIvei9BRTRLckYzZ2tWWkRNM21ZQ1oxQmFuRFphNkVNeFY4dUhVb0d6U2pRNEQ0ZU16bmsgeitlVXVCd0xVdDlHS0svc2poTms4QS9JTDhnL1lPb3hnSUExZVBYdGpJZXlFM3lhN2N3SlRFOVNEZ1VPd2hiNG40TWpKTTQ0SEltQSBhamI0RnFNRXhlMWsxa0hWK3lBd0IvRUIva2Y2SUxjU2lNSStvRUpxU0o4NDVOa2p0ak9LNU8yZllsYzBlZU9hQXhkcFp3N2FiZVhlIEJUQ1FiM0tiYVpOdVZ0dG4zSlZyK2V2dHFhYWxOSWFJY0JDUE50elpvSDRtbjhhN1NLblpFTVhiQjRXdHNCZ3hWYkl5YmhOVlI5d0EgWG1ZekxMNHJrOThkallSSDMvWUQ0RGYrcXU1akloSnNPWlBpaHlTVEYrTkVNYzJIcENIRmZJalFBbUVGdVozVXF2Y09EbjYvNXdoOCBGNVF6TElNSTdwTy8vd0JBOEI4K2FxOWdPdG9WZmNBZStIeC9ob1R0WkhLTk5NeVJkM3lxSGlYSTVQaWVZUTdVZkdRUEFEZ3dEaFBhIHY2b0tFeG05cEJ2Zi93Qmd3UDhBbisyUldZZXVWdUhsV3F5RXE5N1lxVjNNQUV4akVmSDBYZk8xbUdCYlpFK0hEN2Z3ems0ZWVWYkkgWmlmUENiTmorTHU3cjhnNGdQYy9zRGpLTVZTVXAyV3lRWjVZeHZpRmFlUEVmeVk5Z3k0Q1B5YjZEYVZIa01JZEVPM1RPbGYzaUtXTyBaYUZuTGJpRVpQSXY2ajR3NzJGWWxxTkZTMkRMU0NqNVVxR2V6bEl2SDFPQVZlelprV3hoUGNhWW5zbHFWWE1RekErMUFZRndxVTVMIC9GL2FCblJ3Z1RnNzhBUXZvSjgrQXhEN291U0d1YXVPYmhybVpENlF5RzdDTU1qVllIUEticSsrZFBveUczcDdJeU9GVnJqQXRuRzMgZ2VFeG1HWElyMW1UNzJ1d1I0UEgrQW4vQUQ0QUFXMWRxeTBtVlBWVnMxbllDTksxTVhtR294cUVhYXE0ellURW0xTlNWbmtuTTlPZiBRbFZ3NTUwMlBQZWpNSHdraXlHdTBLejlKejFoRENUaUJOQTF2TXc5UHJ3L2JwVzlQdVN2WHJIRVR5VU1DK1dndzRtR3JVQlp0ajJnIG0yRlNJdGxUMC9lTDREekhBTk9nT0NHZHJkNXQ5cGZGbXMvQ2hOZzgrd2JCNEJVVExKYlJ4dW1YMDhNY3hYMDJvdUdhUHh1VllMQ3ggVnJ5YjRPVlhXd1dTWkNkMTBScUIzS3BTYU5ZNEdtbzNmaGFzN3RQN0FDcHVtM3lBVUEwNE5NNmhIWmVSMGt3MFliWGJTK20zY1lZRCBGcTJSdzlrWURGY3oyQ0FxcDR3WDlHWnRrU2JSeEFlQTgrQXc2amJZT0F4ZDJOVlMwM25YWStNYlUvd3g0M0prVmtZcVVEcUVwR3hxIDNZSWJnbnZpZEM0MkRxVnc3akYyWlo5dTJlK2YzOEFlWC9QZ0VHU1QwK09aMFoxalh3WkRmM3lVa2pvandlemc2blc5WHhWNlUwT00gOVBNUTdzaHJiQSs3OWFHSEQreHFHK2NtU0RZUkpxdEJmajZDQVBnRUkrZmFreGJ2eTMxT3lISzBKbGZ1MWcwYlNkSTNSRGFyQWlCNiBRbGFjRTJwVEJDMUpnZUdIVDEvZzhCZnVudXFUV1doWDVNRHRJSmp3SEhZSDdZRCt3RkdaSTQzbGtmZmRwcExETGpHMUZBTXdwM0RWIDhiY3NmemxseGl1VENVd0lJbjlJcUdLRGNBMGtaNzBZZHRWa0tQTjM0NDVyR2pzQXROek02QmFCZ0kxSnNPTkxxOFBuWFI4TW1yMGkgZWNqRlh3N2dtTWlJSFg3SnZCOHdiUWNQYkVNV3MyWWoyaWt1NE0rQVArZnQzWU9yS2c5T2VzRFR6WGtPcjJLbERWWktXc1pickl4TSBUNm1VK1VXTllVV3VMSUhtRTlrbXNsa1dBWm4wUFlBQTdjQXpiQmJ5VEJtemZzQVFUNStvdVA3QWZxd1JNNnczWjh6cTYweTJTTnRSIGowcjA1YTdoU2N3enA4cCtMeUtuSmZQNExlOTNBdDJxbnNtRDVBSVU4NHZLeGhnOFlnM2JFTHgvMlh6OXZId0hSSlJkcVEyMVg3MDYgdnRWRzhadFkwNVExWGphM2pzTDVja3E3bGV1V1FkZHRWb2EzOE8wQTdVQnNDQTFHTUhrVjNNNXlFQ093UDlQQUFNRUhvakxQMnZnaiBiVHFWV3N0UUkxNVNPQThZNDJjMm8yY2UwWThncXdxbUFkMXlvRmxFWGZId3NxSGNpbHIxQXlBcVJRakxFSElLZ3JXWXRnd21MZEkyIHFrMStHbjJSYVJaSEp6SERnZFh5cGVwWlhodUV3d25tTzVLOHRuS0g0SEJUMWxtVnFiV1daNHE0M3FIT2IvVVIvRSt3Y0I2ZkdXMFggQktCMzlXbGFBVklQbEhuOWVZQUsybnhMSktDN3VBL01UMCtxNmZoMVhxRTNpRUJUNEh3eWR2MWZoOTQvRjJDQ0EyQUFBUVBicVNqayBGY29wclptTG5WdFpOZzJkSHMweGFsWW1XeXQ0dGlpUUpSYmNLM1d0UGR3UGt3YytBejNkcWQrWDFjV2pJeHp6ZFZ2d0Q2RHY0QitRIFpoVGVOUUJtMkt4S2FlRDJwQncxU3JhMkpSd09kSFU1a3BvbE9WYy9jSHhEY0E5cWZNQmNmclQ2eXM4WGViTTlqYVQ1OEI0QStnOCsgQm94cWptcFIwRHhTYmFhakVKSWtzY3J5TzIwYlNUYlZXZkViTldSSmxTdmFReHFWZGtSbzZ5Vkk4UjNWVjl4L0gvYy9ucU5rTUZmcCBGUjAvWEw1Vzl0Sk50VkxoY1ZQdFVKWCtZNUhsNjBIeFBYK0JtRnVZNEQrOFNIL0l6Qmd4b0Z2T3g3MzcvUVVIWVBQZ0lETk9hbElGIHFaMmJUYjNhSWVBeUxjdGZkcklSNGtPcFFNUk5QUXlEZ3Rybkd3N0F0L0FYcDg2R3piVzBMS01jdEUzc2V3ZXg4L3NHSUJ6MjNhZG0gUFl2a1ZsV3BaRDNyQ3p2aXROaHVBWVRXd3F1V0ZPcnJGd0V3eENleVVrbjRiRFFCREZsRzFvMDJqK3V5bk1jZC9mZ09JREZnQUxkVCBvTmtzRmx5UU0rWUVvZHR5UWRoUjY5UFBCWXh6SmhQU2pBOWtXNGVHek1HeG5sOXRCbVJpTUwzTm1lTVRiczhiL3dDQVArZjZrT2wwIDJtakc3TnFaTng1WERhK1lOSU1wbWxLSStJdU9MZEVjYTBOdUZJVXRpdWZWNms2bVdiS0tLQ0RGSWxaSVk5dVBtT0tRRUprY2FNbU4gV2JBdSthQ3JoNDFldUQ1bXpadzB3TFQ2dUVwNjIxQjdZV3hZdUloSzdJd2NsY0dSRERqL0FKMkpBOUJzZ21UNVJ0bTlwSnQ0L0xyOCBBdzU4ZjZaQ1ZXYnhVRmlKN0c1SWFsblZMa203WUlUYm1zQ0crQWFtTEN6d2RnVDk0cmU3RnNlSHJtdEI2RjcyWU1WMmdZTTVzN0d6IGlDQVh3REJ2NEJmUHhyWVBNQVVjYkZyUkRXOVBabGt0R1dHUFRLdkUwL2pjaTlja1ZQY0VKd01jd1pHQVA4OWZucXNNbitHK1M4SjUgczhId0NDZmZzQUdQVWsyTWx1ZGtsVjhmQ1VreFZTckpwd09xalNDOXpLS0pWdVNNQWRrWmFmbXJZOHdxZ2VlQTNEazc0cnJPeHBKdSBrLzdCK25nRzY2REZKWVVrdlBHRXNrMHVtMUM3bmhvVmlmdm9qdVZtL3dBTkVXZWxhVFVNOGdrTU1jVHh4dTZFL3dBSEFUSVRpaFk0IEdKK084VWI2WHFPNkE0Q25reFdOUEczWVpTVGZLSzNBTkNuZkI0REU1UStEekQ1WkZibUU4ZW5nOVBDZjdNbTV0RlhQS3ljU2JzM3ggQnhBYi9zQURvcUtWUFg1UTVEWEFObkpOL0k3VUQ3Yi9BT0NuMGpWWXQ4TEN5dW9WZm16REZrUTNER240S2t3UGxIclpONW9lK0ZsNSBCbTlrT2JBKytBKy9kSitzNGFuOGNEbTAya3V3ZlZkTXNpVkhEWlZnVTZIUFVPOEZVTXc0dm1KaW4zRHVnWXduNEhxNERyQk96ME5tIFI4VW5IdFhpdm9KNWYyRDllcXc5UVdYclJYZExXbkJJMGo1QW10ZEpHSHB0aXdsK0F4SjRzVHFDVlliZXY0WFpZOWpXbmI1K0ZnaEwgOEVKRGFGckViY0gvQURKZnFPSGZaZ1lzVjcwK2hlWGhhVEdRRkJXTlpiVU9Hblc4UU11OXRva2pqMzVVZkdQTEdCTkNWcXJ1eUs1UyBHTUJkeDNZVmxoYTBLSExIbnFVdEN0MGVWVTlWdmtDWXlYQnBwU1l0SWg3bURxNlJNcTg5TFEyaHdYN1V2aWhsdFBzZ2V0NHZnL2c5IFYyK1RWM3hac3c1M1NOOCszL0g5RUhuMGt3QzZQdjIzTWtYUmxoRXE5clRteW4yeFc1Q1F0cHJSdzIrSWRmMVVZY0tUVDdVN3FkbFYgOERhaUdqSTJOeUU3eVJ3Z1Q2Q2ZQOTNRRDkwWDZqeWkrR3FMVWhFaTZlNkwwMUpPcTViaHZBZFdrbHBsaTJPazF5cnNZOVBoNmZFVCAvbG5yVmNVUGlpY1FlUml1aDArTE5tYnNTbmpIZ0MrL0FjQUFEcjdtWFlQbFdaTXN2V1JrMlJZYnZEZHE5VjdPMDB2RllwNmErYWhBIEl0YmNHU0dHdUFPSFQxdFZVZ0FLZERxRDhEazk4Tm13bS9nQUFBQWc3QS9Id2FTWHNlT1hVMlVXUGs3Mm4xTWc0aldmVDluaTNLSGQgT0lMOEc2RWZhRWpyZ2dUTWtBeTdja1RzVkVrY2NtTDNYWmsySXZnWWl1cDNMc2pMYUljMnBjMnlMalQ1K2tVYmNhQlQ5aFBERlNmRCBSSUdtcjRjR09xNGJKWkZWOHdndHEraDF5K2NaZmNCYXk3aEFudWdzQ0RVWEFkZ2Z1cTFBclVPV1dqMCtMUElZMjRNcERiYWNxL1VqIFoxc1E4RDJuMklteGUrQzNWV0w0WTVCTXRSRHNHZjhBTTNOODBsNmVpZkNhdTdWYytRZC90MC85Qlk3VHEwRjBQV0diUWRjVndickcgcWhsMTFScTNKV2JXOVQ5K0dpa2J1VHJJWG5HSFJDZSt1QjliVm55c0I3VUd4ZVVMMkduTU8xMk9LQ3dZWTQ3OTdSekE4SWJiWmxlNiBRYUhocUxKZWVudnNNNFdSZWRMTzh0b1Z0UjdsdkRoRDVnaG9lNEo2T0JYL0FNcUxLMFVhR1lZYy9oNFNjRDZFQUFjQlBuOS9nQ1JTIG9zbW5jVEZKSkltUHNNY1cySjJpZXZVQ2g0eTNDMFdVODN3U0YzaU1vZTRnOGNjaWxhdVNXOXBTYjR5d2ZtdlB4elJmRnlKYWZiVlAgcmRmU3ErTmg0Z2NrN2gxUndhQk13V3IwaXJubkFlWVF6RkQzWXlKNjNPNGZxMEJ2aE96QmJSZVN5RDJRM2hzQy93QUJxTGYrcW96SyAwc2hJaDJReHR0ZW03Q2JWUmJiSEJxQTF2TFF3TGt2VnlMK240OTFFOE9QWks1QXI0SEJrZVNmMGI4b213aHdBZi9zRy9nTGRabGlGIE1wWE15bU1EYU5KNVJoVHNKZXM2WHg3dWhGVXdDYmRqaGZGRDArbnpId2Y4NkJSNEdjeUl2UFA5N1ZkNS93QUFCQUh3SFNaUTdjYUkgRmdNb2F4cnlDVnZGaGc2eWNBTGlQdzdjbE5SOXRGSHh3WkUrWXlXUUhUNWtHZXZvZGpTeWZGK1RjSFNRaVRnQXFJQUFYd0hnTVpBTiBSTElzUVI1RWJMUEtYMUV5bGVVTEMrQjJvd0pTdUdMY3FUbHlBRlR5UVJaeURNdW1LeGdKdVJpTWVJM2p6WExEbkZzaGRuampwekdEIEZxVWpIQWhtTlBvRWxLMUxhZUpka1Z1U3RCc0RGTEdMSnBSd3Arck40VHpBY2ZNT0FkUURhY2NFYmk2dXNqUDZKUnNYM1lNSDVBNEMgZlJvTlB2alQ3YUdTcjVSNWtWYmFhaGtTeUxnem5DbkE0RXBYcDZwYlVzRU90dUZWN1I4SnF1a2hTMWNHSGxtYU56WnVFNzN2NEIrNSA4L0lMOXNDWlF4OW9KRjV3OTBoMUxjeXZNSk1OZ0hrbnRrNFZ5aDFrZUtHQi9iZUhXK3BCY1gzQnFRMCtsbmlHTXN4WEtMRHpnYnc4IC9qK3ZuL2Q1VkdsM1JGcGV3cmsxNmtyajczTmFUWWNnUFlWYkNURG01TzhWeWIrU0xhMjRQdTNoemxMTDdiajNmR0M2dS9aSGIvVjcgd0NENTlnaGoyNU5hcVJ4aEpQcDU1YjFKZU9aNUloR1FwYWFlVkpFRUFhVkhpaXJjam95VVNyamxMRHB5OHR1ZHdDSmw5U0NNR1BiUiB5clBHMTVOUlNSdmFjZ3ZGbTNjUU9rYjhabFZpRWRzdHFyZXdnNnFZcjhTSEFwcTlZd3ZoNmZEZk5uWkNIOGd2dmtFd3pFMWNvTUZnIHpmOEFZQUMvdi83OTF4N1F5NVJpd3Q1R2tzbXIrQU5pdmt3Mml3b1pROHY3b3RqM0J3VDdVaDF0WDYyanRvK0FjaHM1TVh0aFBId2cgUStnOEJ4dzMvb0UxRU5yQWgyWUJsTkZoTXRrWlJoa1hySUx6R2lobjFYaTJ4YlJWUHNDWnZGVm9iNHZvbGpOdndIaUd6RENuak5rNyBvMVhpZi9FUjhBQlA5QkpDeUdoTnJmNVd6eVNTdmFiczEyUWVUMmdUREZpL3VRY2hEcmR3WkZ0Yjg0MmtOOTVNVEtGQ2J6NXRKMy8yIFBnRCt3ZENJMlJrbmQ1aThxSzdFU1VEK0I3ZnQ1NStiNnRtYlpNWkNBUjFTaEtrR1JXOXlTL1V2SHQ3VXg3dk9WOVJxdlpqNVh6d2sgVDZIYW5ZUEFUNHpGVzlxTGFldzR5M0xpOWpKOWZ6RTlEcCtIL3FOWmFlZUJvUzBNM1RjOWtTWFlHZ2dFSStBcVB3QitZWUpnT3Z0VyBselhKUHF1TWg1dWNObHI3Sk04eEZQTU1UeUhNS2dNSWkydjRIRU8wTGFndzFtelVOWFdWa0hWd1EyY1BnSDgrQUFlNS9xM1Y0YWIwIGRqWkhaSDVzdDJwbFUrRVhoNkhaMmw5c21SU2paS1BWWFg3SndOd3ArdHg4d0gzQVBja0dlMytXSnY4QTgrUHZ6OXdEcFYxV2gxL3EgQ3NnQ1ppMXZHcmRJRzF1dmN3MVVTQ3hoWGNxOXVTdVVPd0poZ3h2RU53UTlocDk4ZUZzWFJyNXVlK0JLU09QSGFJL3dGKzgvMHd2QSAyY3drUTcrTzg2UllZWUVZV00yeXZKcTVYR3ZtK0ZxclIra1JTSldBL0FJQVB3UHdPckthVjlBdEo2aVJWMTJLdWwzRmZyWE0xRTJhIEZwNklvSzl1YW1RL3FySVo2UVdJUDArbTBhcHNRK0JKU0JwQ1NZQTUyQlRJQXNaVEFSbHRoRWFUeUdXQzNzK2RVTXpMYXAyZ1R6WWkgSlF6L0FCRmIxSC9TYkJsTGZXYmJRN0VMalp3UUxHaCt0bEVVc1dVcThsU3dNYURsSjNvS0M4a2tVbFpDemxaTFQ2MXRxakdVQk96cSAxRktvTTFrQUFuQ3JQSE5aR3ZQUEo4SDhkVVpiSk9QbjkvOEE4Nk8yVXdodTR1eUtsWjhtcGM1a1BhaDNlbjdoY2JZTG1JdXFEVDJWIGl3NnZXcnNUekVNT1FjQWZIM3k4SHl6R1lwYUZaak82Vm9wS1A3bis3djc5MHd0TmEvUWQ4U0dSdHVTeWJhczdXdmFrWmhwZWtocXUgcG9jcTBKWjZtMDhmTXJma2pKRElHSzVzcy8yZGhrMFlvMFBTeUROSkFRR2Z3ZmorL3dDd0grcTYwK3JvOWxsYmFmQUtlTkpac01sZCAwaDJ5YS9kNFpTeHJZYUl0a1dCTWZFUVBhZ2NoRGd2bG9LU1B5Wm1WMWQ1dDlId3RJSThBSDRCdjU4L2dBUHoyWldkb09TL1JwUkR5IFgvVXNCYXFCWWJnc095VmFKTDdqVU5iVlh3OW9ocmVCaERYMCt4Z0hhVlZNYllydEJNWjV2ZkFCL3dBK0ErZ2dBV0dVcEhEQnE1a0MgUEhnMjN1K0pZcFRwMlg2YlVlbnFkb0xJUVk2TVlKV1NxQk5OSWt0VGFTQTFXY0RjeG13S1lncnpJbEhiZXV6SnUxc3VKaXQwOWtmQSBkZTZibkd3dG5xQURhTnNOQklDckZsc29VckpEaW1DRU44bUo1aUVQMk9CWUFHQ0haaGF2eVluMnUyUTV3SFlQMzhBQUtia3VqVEk3IGd6OTBaZDFyamdHaDZvWlNSWVNocDMwelBZR1RWQ0hGeGdWV24zdWhYd3Q0d3daNkJaUUpPcCt6TWFiR3ZHRHJqZzg0SDhHREZnd2YgMEY5Q3N3ZmFsalNLOVF4YktNR3U3aGFJbXdGWmtIMkZXNkdlYkhJb2hqMDRPWVE5NHNDdHppSHhLY3RreGo1VitCTTRFMUR1Mi83QiB3RS92L3VINmQ0OTBKRmR1eWFLSkRVbGNNZHZTRjVKNUNzMXZnZHhnWlZxODhaRTlidFJhWDN5eHVQdHB4YjJ4b2FFWkdlVFlNM3Y0IEFDQVBnT0E5RkJwb29jbGlXR0RjdWVlR0NsZUhWenlTUzZnZ0QrTFBKRis3UGJzWTQxMER6TTFST3J6dU9OeDVCMm9vVVJScXUyY1kgNG93cUt1UjhFOFhRWHNqTHVqTkZqWEtWTWJRTFJaQ1NXWDhUQkJlRGdRT29VQ0xEMmd0bVBoaDNBZVlCcVRBZVJnNjFXWXRvNHlkOSA3UndBUHo5K3dBTmdmME9rMys4eXJoYitsYWgxSXdoNmV3bk1EeGNld3ZtTXFrZTByaGh4Qmx1QlBXeDlXVWZaZHdIbFd0eVpOb1Y5IFBJdzVoc2h4OUFmUVQvSCtqRFZvd1dmcHptVzBCeWlTUlhyYUhrdTZQTTA5dkNRbjZnNHREVmZmSGIrN0szTWNrK3lJOWFXQUFPT0QgTlVDSHVZdzRidEZKQnZ4OCtnL3Yrd1ZRT01tdmhTbHRXanhvY0kxTTFwY0ZYYWUwOERrcjh0UHBzODJVMmVjR0JrcCsxSHhQcmNmaiB6eGdiZU43WTBQZTJJOTJHMG5Eajc4Zi9BTnZuN2xsbW5RQ0ZZWGhibFpMM1lGMGpZN2txeUtCSXNqVXVCU0NUYnhheFpYb1RGQ3JFIE1aZzZiRUt0VzN1VCtwc3ZhbVdNNGpjNFNTVEVzTWlNaGMvZm1XMFQ3TVQ3a1hLVEpRMjE5Tnk3QWhqV0NrVEZYSWRzT1N2WkJCa2YgV1N0OEpnOE40L2c5a0RDYlRWN04yck5wR0gvL0FIejlxRWNwYWpKY0ZiMldIMVVMYnJhRjhhUzJFeFlWd1hCL05LNGtDcnd5TU44byBkUFQ1akE0Yjh2bmtma3lNVmFCbjVST1dpY2ZuNEFmd0FIOGZZYk9ORmJ1N2dTVGNxMmttNXNxdHlUdlpEaFpEaHlRRFNOODZnbWh3IElPRU9xME13K01HRnhkd0xMNUpXYU0wYm16YklrblBBYkJzQUEvdjY5ckpMSVFKbE1odXpMdGZ6YkR3Yk1GdXZWLzhBbzJ6WHhEUSsgTnVGcUxiZ3RrSm41UWdWV3lMTmx0QXRHV1RtTzkrNTgvd0ErNUI1NFpBczBibDBSbndLTXpybmxtVkFOV3RZNG5pemRqa1Z5eU5kaSBTTjFkenVPcXhTSTIzVm1tTEpUWmVWb1pENStUd1NUTGtEbEsvWkE5Tnd3aWV1RXBLbThHRU5QYkhCWHNhMkZkTlpCNWpqY1BUMm4xIGVHMzZ3QjRPWVVaaGJRVFp2MlRrSC9ZT0E5YWdhZXYyMGNBNXFHN0d5VEpDK1c0QnpGa05rd1hGNTRVY0NESW5va08xQTQrWjVEMlcgNnpadnlZTXdTUWpzRC83Qy9BSDdvamZLM2JOMHVXeTIxa2YzWU5waWtzT2xiT3IyOEY3dEs1THlhNWNmaG9hNHR2aUduaDBjQ3dLVSBGa1plTDhHV1FuTmpld1B4OUJRY0QvZ0o0R25sRHltZWl6NGRYV2RYeUhHaVdBQlpDQmFZVXNZVFhOalEyQXpEbUtFTXc0TWlPaHAvIGNVUFdiTmFIYUJHM3U3S1RCLzJEWUFCOCtwVlZJMjFEK25HemwyOE5zenJoUSszUGF5UE5MbVdIQzBBWXkrb3Z4dE9qNUFWSndMcEggK3k3N2pUWFE0RmRMMDVSOTRDMXVtZFYvTUFtbDIwYmF0cXdrK3Q4bFhMVEFMa3c4OFErWWZjR1NxeC8zeXY3YU9JZjFkREp2SndJYSAzdysvWWJBdjgreFg0R2p6RFpROTZMZC9UeVFRbGFyaEdpRURKNk1wclo3NWZLRnZaNWhoT1pKZytHcW9kZ0tWSDJweG5sRE53ZjhBIHY0RHdCOWYyRS9aQTRuMHZRVGd5SkR1NFdqYlNsVXFsTEgyRmZDT2tHQmFha1BseUxhOHlKOE44UW9hK1lWWjdBcEhBL0p0Um4yYmUgM2FyamlEYnUvd0RIMEUrQTZvcnFNMUdHSW9ORHlVMndsczlhQmdLSnNnQ2sxZWtXUEY3ZXlnTmtPRXh3RG1Wc3dQMk95MDhmaFZheSB6Qy9jbjVzSmFnRHdIQWZZK2ZOV2tsRDRpbmVNeHM0NUx5UFcwSzRxOFgrVC93Qk9pMllvWDNnSDJrcnRkOHNDY1J3Y1I3cS93am5wIDJVbURYd0xKVDZtR3BrYlpFcFZzaVhwM1E1aU93NzlLMVlKc3BrSHdrL2toZ3dQaHRZRlA0ckRKazFmOHZnZ2dRM2ovQVAwRkF3YlYgbUE1aGwwU1QxZlhCYUVNODdOc1MwR3JKSHNNejVVUXB3OWhZN0hwK0h4dGc0ci9QMXluckt6cU1LYm1kN284NEFZYkFnbjBIWUQ2VCBaR1I4MUJTT1d1OXAzWlF6Unh0VHNCcVdxbnB6ZEs1TEpzVmt0QjhEOGtyY3l3R05oNGs4TWd6aTZ2ajJPQ2YxQnY4QXdGK0FlL1N4IFpJZHFHa1BUSHFIVGVTSkxIYVpKaGFFL0pqdTdnTFRSTFJWNWh3RDh3RG1BdzhNOEFSNkhjY3htdDhweGpmY1VsSmVOZ2ZqOXVuOS8gUGRIaExxSlpKdy85R1JWMGJwRWQ1MkNCRW16UnBJcnBzV2lkYkpiTU5TMGwyUkkyU3M5eXU4ZGtrZVBQWXhEVmxsVGNmYjFkY2ZhRCBRK0E3M3lseDJ0RndZNWdSZXFlN082R0ZrVkwyOTBseFJEQjlQbUxka0Q3SXJtZW4yWDNJNHlyL0FKTUIyaUVka2JueDkrUDgrZnV2IHFXUG9QS3F1OHJ6MVlYTkdoSGtPaW9rZXQ2bGdTMlI4UE80dDhjT0hwOE44aHA5Z0dQZ01DbHZDTXNsRU9zOEtyZGdsWFBCOSsvOEEgYy8wZ1d3NHRORHd0dHNwd2Y3bVBPRGF3bUxnVlhCSVE0dmNKTkF2bjVnVzVsd0J5Q0dDZ0w3YThJYnlUUTlzUnFyQ2hPY0w3OHdQdyBEOS9ZQnN3RDB2MUxxQXpyYUtEWkpLcjVqYkVNV2NOVjNlRytIbCtLK1BqZ25zZGIyUjQvNTI0S2ZKRmtZTGZiTThJN0pQOEFUK0lBIC9zQi9ySzBNZXBURUx0dVp0NWR2c2RPRnRkTXlqYjAzeHVGSVR1OW1RQVFkUEU3d3M0ZDd6UXFnWXhQRzhiNFl5T2tjc3QzUklWaWggSEpCTjlyeWRLTHl6eGdEbXE5blA3VXgyb1NkNmZhZ05UcnpKWE5qUzFlTGFZK1l0bUszbVBsb2NxdHFuN0xlSVR5TVY4ZFFvdzU5SiBCNytBL1FCNEFEbUthM2hwem9kM251d1RubWNFd2FHU0dIczJaWXd0c2xGSVh6QTdJaHpFOVBoMXlBUUlDcis2QzNuODJCSGE4TGRRIFQrd0lJRGZ3RjBqQlJnWTdBaHJrYWlCcEt1YkMwOFlXQlE5RVUrd2hoWXZUZ2h2aGdneWQ3SmpoRHdNZTJvQkUrWVR2TGdaTWw3Z3cgbkFmUC93Q1dPQUhJZUE5WDFlWUFvY00yU1NNR1NuQnpVK1dEV1JoeUExUFVvdDhubUZ1R3QzWmp3K3VRTlA4QXoyVGpQQTFuWS84QSBwNEFCdi9BZWozRkVpaVFQSnR1anEwYTVJMUdpRmV4ZDhXY2VEOGM4VzBlMVcyMVBKblVPM0xGanR5eVI4eFNvdTJUaFpJYVRJR2ppIEVETlhzNExiRHhUR3l4NnJHR2hrcGNFN0Nuci9BTXg4aWxsY3B5QmJNOHdzZ1BBaC9QWUlBUHRud1BqSXdIaWIyTS93RS84QTViL0cgNWxrVEhLMUtaYUNpVEdQSWFTeUtiVE5KYW1DeWNyNmMzY1hLbUVROTJUR1I4M0J3VmEwcjk4UjBQYTFlcjJhczNnMWh2bmdQb08vZyBPbmtQQjJlMEdIQmN6WFlKbmQxRUQ4d0FVLzVnc1d3MUtyekI4TU90bHc1ajd4VXYxV2sxa1lVNE43RysxeHp6L2dNZVFkVjFGdzZiIFY2dnM0emxYbGYyU2VzbGtyTGhOaEIySmtWOUw5aExCUmtZQTc2dGw1aWVQaC9BUDZlY0RMTVRGb1pOWk80NE94emdIOVA3L0FMQTUgZ3NpeXFqb2p5cGdxcFBWMkFTU2R2a2drVUtGMzVIU28zK25sMDAwZzNFZ2ZNbThLNVhnbW05MWY3VjROOVNSMmkvNHBiWXpxMTBSMSA3MjlxcThuNWVxOGxRSWF6ZmxJWWxvVEVOZ3Nkd1Q2clk3SXdtQTFOZzdjTGRtUE9IR1diR3JzRWtIVVFBQUEvVmZQZ0lkd1Qyd0MrIEorL1dRU2hsRTRsTGFLQnNnZzdoMDArSlRXaUd3TGNNUGpaRU1neWNTK0FxNDdZVUtNM3VrODMzOEJ2NEEvdi9BRVNWTmZsUVY3UzkgMkdiTGZCcmhmdWRWMVpWUHAxcDlmU1dRQ0JpQVhLSHc5OFpBOHd3UHNocVEzRFRTOEIxbXpVTjhac1Fac0did3c0Q3ZnUUYrOEI2NiA5VEdaYWo1UjllMk1yMWpvblR3MXdWZFoxUDN4UnREOGtQSHBjV3IwOWZ0UmsxT1RGdUV3WVRwN2dBNDJ6OG51VDlmQ0hOZ3Q3bndBIEFBUDlMMGNpaVlxNmYzbU12RVo1VWlKYmNpMDhvWlpKWm9kM0hNcVFvN2Uwa2pNVTNVUnVnRXFTN1Y3TXhXSmNMOGtSM2sxUnBaMjEgcnN0dk9YQWh1RWV3U0NxdUZIQnRzNmZrc2dtdDlua080ZXI3UWlYeVVtY1Bxc3c0SWEyd0o2cnFISHozZ09UR1BuMlpITk8zZ1A4QSBZTDl2NTkrMVBtTGJrNFBsU3E5TWttVXlIakZuZ2srUEVOOXBGellVT202VC9uSzNobUdQM1ZWSmdVWnk0TXMwWVVHV1k4SkZvcFBBIFFMOEFQbmtBQXdIMDBmVDNCRGlIdFJpYllVYVp4Vi83UExkOGNzcXROY3Bkb1hJaHNER3lWV1lFV3F3UTUyM25rYTFFWW4vVE95VmMgRVIwRStnN0FmQVB6OEFiTGhSbW1zRFhhMmRNNmhGdGIxU3RWKzJ3a0dOSzVoc3V5K0VLaG90Tm9aR0UzbUM1bnVBKzJLM09PQ09uTCBQQTN2a3gxS2RYWjRYd0NGdjYrQlg5Z05wWW1kY2RRN3phaDBTVEN0UnU1RDFTYktiV2RLQUxlOGYxeXRVa2pCVVJvRWhvUnFpbGFqIE5ZcVQzWGpqd2FGMmVCMGpxck1FTFFCdFZYbnM1MmRwK1FOM0NqY2xmc0prbEZHR1ZiVGc0VExzRHVDZlpGZ01pcUJISHZoczZ4encgWU04M2RpT0F4UDdBZlBuK3VNNkxtVnBsa29zREprd3lBMDNadGZrczVnTFE5K3IyeGtNT1FmR1R1cFZhM3ZFRjhUK0t3L3E2dXNqTiA3OS82QmZqL0FPbVBXbVpSK1dHSVowb1c3eVQwRE8ybXlEekp4T1loeWw1eWNsdGZEdUFkOFR3OWdUQWFHd3dIakRnelEwYllETjc1ICsvZ1BmMzJDSGtUQlo2M0s5UExnQkpyMHlxcmdsSEpMYlJFaHhSZTF5azc0ZmRTRytjd1QrV3I3NU8yd1o5Ry96TmcvZi81ODJMQlMgb1VIUnNBcW16N3pXMmg0UHY3cUk4WThna25vVmlqRHhHUmNOUWppUjJzc1ZqUUROcUFGMWtPTDV2cG5WUXdGREpSdkhpODhrbkhnKyAwdENUVlk5SS9pTWxXRmQyOE1DR0h0U245TVFldnpFN2IwT3VVOTVXYmthS3oyTTJrdXlPQStncisvOEFVWWx2QWhvMDhPQzVtUTM2IDJtZjhVQmx6T2s0R0U3VDdNcVlVbnY3SkMweHZrUzRIRnduVHg0RTM3ck5OcXd3bGlGeHh4QUFRR09BREFBQXhWakkyMDNYeS9ES0EgVlcvaVZYRFZLV0hNQng4U3Q0dnk5UVRRbnVFeGtRdzdJWVlERUVDblZvMUJpZktFUG5LT2JkZ20vdnlEL3E3NzRYdncxUjVldXUwdyA5eHdORkZCQXFIcHF2Nm5ENHpUTlpUSk5ZVjhCcmtNLzJQZGlIYWt4alg4QWFDdjNTMHA2eWpxNVIzck0zZ0VxOEhqanNCN0ZneHg2IEF5d2lRRk5OYVIrcXVvRUd6L0hYdVRVU1FaeVNGdStSSGFzVnlSZUN4TWxMQzMxVzRhamk1TzRJNEUrNjdYMlpWUUhma1JhMXo1NVUgdVlCbisxZEdLVGhpQmNrbHRMMkF0aldDdlU4bzVDWXRvR0Y0UFZhY1lUN1VYNGJ3ZXZDZk9tRFBkWEp2T3lKSnNHZzlvbjUrQVg1MSBaelZKY2tkOG1XMWJRb2E2dmpIVXB2QmZyR0dyeEhDdWE1WHFscS9iekFjT3lVK1hIdzJvQ3dQaXJEZVhsREtlYzgyY1BnSDQvc0gwIERyU2p4dzlHV2pUTGxtNXphaHhja0hxRU0xSkRYNWEyaEFaYWEwSWErbmgxc09ZN1h6SjF0Sjc1T1c3eXJOWFY5enF2c203QTBFK0EgdDFBMy9mOEFwd1BGTjJRbXZGNUJXaGJHMUttSGtBcXJ2bGUxL1lSZzkvWG5IdmhwK0VNejh3NDJzRUJWWkhsbUY4bUorRU5uTGRZRCArRy83QjFGUlduelp0eUhaQ3hpYVd2VG5JM2tVNEh6dHgyZjBCUTZoWm80MlRCNG5FMHJGV0ZZeUx0N2JqemVGdFk0dklXUlhTQkYzIEFEbjNSVXBxZ2c4YXZTYkl0MWtZcGs5R1hxM2ZEMFRVdlhNejRmYmQ4TVVtUE1jdUgyWGFnY1p3TlhKNEE5NzV3L2NmZnZ2d0RvYjAgOTJRMFBsNExlYUJvRzlYRFVqTWRyQzAvNU5NMHV2VE5Qb0YzUE9jTWhNdUJQWkxVbU9Fd0hTMVgxcHMvZkxGWDFNNmVuakIyOC92LyBBSUFDQTJCa05oUmtybFB0clpyZ1c0UjZaL0RMcVFxVjJxOUlyZFhQZDd1WHVENDRWdW4zeENJT0VGU1lKNk9ZUmJNYUZmOEFLZjhBIGZ3R0w5anNIQVQ4Q2x0RDRVdHlacWxxVnd2VXd4aDBpd3JRdFFPSGJERmpQaFo3aXJiQk1tR0dSd21YQWgyTVFyL1k4ZU10SEdkOHggcFFKNEFBdjcrL2JCMW5NRzVGR0dMbDVFTUtUWllmVTR5dW0xTklBMkc3R0lwVWFudzNIU205ek5CVlp5dDI3UExLWTFBV09GMWhlVyBOa1cyL3dDVzZzTEYycHNZMGJjVUZuVVMwNTEzUTdXdHJUZ3J2Q1RmTGdpdFNscWh2alVKVUYwS3I2Q0FxT1pjSVpwRTBYZUt3a04yIFZoZDg2ekNBZXg4MGZNWW5ZVFBobER6RTF5OGNHY3RuWGxWNjExQ3N5ZXpOUUhSMHA2ZzVrcXdyWHlXOXpGQmF5dXllTmMvUmFycm0gbTF0bWZEQTV1SUZqZVIvanhqa2NwSUxmNGpZdG4xNSs5Y2ZETWJ2WElrWjBZMDZnQURWVEFDZ0J4d0JoL3dEcm4vZjhjd3RxUWFiUiB3Z2c4ajhIc3NYWDY4MStmeDA3RmUxS1R0QkxNRUt2UGFoNlp5dE45dE8rb0JrRHVHbkJiMUdWelRqMitUS2ZUOFhDcTBLcSsyKy9FIEVPcTFzb1RGdm1xc21jcTRKd2hnQUgwRS93QSszOUJzVzJXeElwK3pMQ0YxVmJVbWswaGtVa2dmTVpLL3NPN2JRaTNHQmloNnZwOTggdml0Z3hnaERWUU5mMldxekZrbTBWZjJ6ZUxSQ0JLcmZuNm9YNzZEc0dDeEh5TXlxaGpVMFR5U1RWYXZXQVJlWDJScVY2OWg2Z3F2UyBMR3RCYnRCd3JkYmgxWE1JTWlPK2FmOEFVdHh0bXhGMmdzczNhNUpOblAzL0FHQkJBWXI3SXFkTDFNVDRhZm84dTUyUUxJZDNDN0N5IE80ekI1WU9kdENuTlJnSEN2OTRXMzJiaXdmQmdWKytLcklzMW1ydEducXpQN0Z6L0FHQkJmdWZZOU5FV0RmM2lSR1FhbU40M1FSRFogODdSWVJ4Umd4dzkyVWpFbW1GS0tOcVY1Q2p0RStEcnBsVUlZUkx1K3BCRlNzZFBQaklOM0pJNlhjSUl5N2JDbGZKQ3U3aStaV0RXTSBhMUxMSkVpMWdYWW41RFlZVFFPSlJvbUR2bVkxdlZaZ2hEQnFSSGxTMzR1MEdaRzl6ZUdKOCtBMy9mOEFwd0E4eWw0cWZxb296VmVTIGJUeG5tMXNMK250SkRpUTljbmw0bzVUSENHWVc5bkRzQzNCVXZPVldMNVJ1WXp0ZHNtd2Z2Ky84QndycWNPUTdHcGV2V2hjZHFsQW4gZ1FSaHE5a3A5NGxzaXVlcHg4UEtEaFNjU3Q0Y3poNjJjcVhsc0ZPWmZ4ZXpNeHdKK3dQd0RZSDdrRDkxUGJoSERWM2NFQU5aei9ueSBtcXJpMWtWWFhzaFR1Q3hsZDNpeFE0NkgyZlczQU9QTVFZRTl0VlhDekJuNXlSdGtxNTI0L3dDNTgvaDU4QW1IVHFZNjNKcy9xWkdWIDl6MlNReXRGSkV5bGUrTnFSbkZwbHdQdHN2ZlVzb1lsRVhjaFZuaFFZM0hLZlNjdnpkMDlESGpubnFCcitqbmpVT3dwK24wWGtJRGcgR1pCcnhaQmkxTG9iUGxSVjVYdEJQSHA1aHdNdzdUVCs2a0RuaHpqSXlyeGZiUDhBcmJZTmdmajZEMG1XQlR2UzBFdXNSbGwycDNnUyBFbGJVMkNzV1F3V2gyTmFDODBLOE1oTURoL3ZnL25EYW4wdGhXOW1icGdqRXpnUHpuQWZmei9UclpOS2kzZDB4RHRYVFFuMlFIRnA5IEoyRTRXb2trQ3hnQ2VkNVFHR3dUTHNRMDhQaVE5cXpUNjBuQjBZWXI4NVovTnUyQi9nSUR3SG4ySElmSmprNEFiQm51d1JrbERXUkkgcmJoUkN2SmxjZ1dIU3FMVDE4UE00MnRtWEJrYWxLME9Lekhrbnp6a3lPRVNjQWUvbnovQVQvVDBlV1RiMUNNam9FbGRYZDlxZVBIYSBzRFQwK2VmSDlWY2NSN3N1TWJMR2QzTTRUSEN1QkpCcWFCQi93WmJYL2JjL2RkQitZMEhiQktVL1BnYWRQbUJWdlM3RXA5YnIxZlNOIHFWMGhFVFlUQStVL2RreERXeC96ckxUL0FKejRNc3hvYUJuM2JtMkIvd0RZUDFBZGJiSWVLcnErME5Mcy9TKzcyUWVmRENrV2oycGUgVmtSTEl4MCtxZDhTZzZlWWhtSzNUekh6RlgrUlZVTm1SaW1DeXMrRThCdi9BRDQrZTJEcGhvOWtHTEJob2ROMXlueVZ1VlV0a1hIWiBCSnczWXhTTXFJbXl1UHNnZ3doc25JRnQ0bjh0T01oTkg5dVRBOTdkZ2V3SU9HQUFBd0g4YTZzbUZYdERBU3FxVllTU05hUGpPN3dIIGlPSHc1UUZJYUpSZ2d5T0MzRGh6Rjh4WXo0NE5yWHRoUVp0bXgvZCtlbitmZnY0RHFFWWtpWkxoMHFSckp6Nzh2YWZIYUJnYjkzbjkgZE5rWE1xc0p5bW5lUjR6NDI2MjhoWE9STmlqYTFWMStMSXI3UlpqdURBMlc1WE4yZnFDOGx1d2w5d3NKd3IyOTJqYWJHdEJQcS92eCBXNWhEcmRnaHprTlBmSnpKV1ZHdEZvTEt6UjNOdDhYMzVCZmdIOS9VaHlPeUdXZ0RWUlJFR3VGcXpHMVRhU1ZTcDY5RHNZQ0psQVEvIEpPSDJRbnA0OTdzYXlsL0duWHlzaGd2dG1UM3QyZDBmMlA4QW53QUJCUHp5M1ZjaHlIcC9QTE9sUGpia29BbEd6aVRSTDM3RVNCUXogSEd6UGRTR2hrQTg0OHZxV3pvM0E4Um14L3dDbGZQdGdRZWZkS3B3cDRIVGJwbkdmOFp0RzBQV05PV3c4Sk5QaCtlSzlqS2RqY2tYKyBTT0ZWMlFZSUIrNVk4OStyTUxReGpOVlp2K2dlZklMQisvbjFMRXhqWnJoRWhkcFkwaDhHVHNWR1pyL294ckdnNDd6WnRmSFJTU3FXIDdPOUI3WDhaZUw3ZWFyL1Uvd0RucXdESVFiS2d6TWtYY2lyWkZlaXlmNHYrV3J4REFFVzJXZ1ZEa09ZV3BEbXJpK1lSMUs4S0g1aDUgUm9zejhYWTlxN2RRWDc5LzM4K05SN29qMUFRTUdjb3c3S3JkWkZiaWU3UTB3dzFYYUF0ZVRiR1cxK3QxdStKbFBzakJNT1ZMWDArYyBZR2VLODRrcExzY0FQK0Q4Z2dEL0FFU0tkbU5sUVRJWXVWY0JKMjAwbmlRbEhBMkUwWEU0T2RYaWRSamtoajF1K0hDazJSOFgwTTVVIHBEdW9ZWnlmM21qVHFUNE0rQXh4QWMrMzgrc2N5dDZqWE9ZWVpWUDFka3NhU3R4R2pPczRPa0J4Y1g3UUhzQjhVRENlWVF4OE9DZVggMzFIcmY3NTJ5M3dJN2ZmZ0FEZ0o4QXdJSjkwa2tRaURNWGoyazA5U1o3dThKL3BybmdrVUNSTXQvdlJJSnEyMHlkY2w2b2FhZWFlTCBSUVJKTHFaTlNZMWhHMURHenhRdklpeWIwcVJ2bmd3VXRMSHQ5eEc1ZEJuTGJRSE0yQnF1c3QzMUxwTmtXcm5QNG13RW1IWkFoOEEyIGdrQWFiWkI5Sm9TRlQ0Y3dQV3diYmFGMHduQ3pOMHE5WmVYaXJqaVQvWDMvQU9tbGtNQTlYdytrNlJ0L0pxNnVMZWhza3V0OTQ1RFQgOVhwdHh2a1Y4c0Q1bGtUV1d0OFdNNDJrT0s3WU1GODVKZ3pic2I5bjVCUCtmNkd3SDhQZWF5dzdRbzBiVytKU3NkUEM5cXdBMjFZQyBRSEFGRlA0b2RmOEEyZlo2ZlQrNWRnWHhZMHdwV1NHcml5WnozMk0vdjRBQjFpUFQ0Y05wL3dCSmVvSXpYcWtxYVJ0U3RrY2dEMG5iIERZWTFMZDJMdUYxdllINUl1elRlaHI4TTRCNTVYS2Z6bXIxZXMzbzRFQ0cvUHNHd2IrZzFGaGtXV0RZVFZ4eTdhVGxwb0FkUHR5VFkgNllad3Zvekx1UzM5TXRSeUdIYzNEaTNwbTN2cHRTc3I2UXhvWm9zWXBkdWVLWkZ3ckJsbGhhU044KzZ3cmRtUGszMDJtUm9zVFE5RCAxSWFMYVdBMUxZYmJka2FuRWRxczRld3A5b2NzS1Jabkc3VUQ3eEQ0SEJVaHo0cWh5YXlyVVBaZ3paS1RObXo3OGdXNkE4QUE2YWpSIFg4eG9lRnV1V2xWWEUreTZIU2J1c2kxRStwMGlxKzQybnVyM3h3WUdSa1QyUlBXeURnRGJVOURnekVZWWhpK2N2RHQydTM4LzlmUDkgVS9NUjJSdHpEdHRKQzNKQXdLOWtwRWN3N0o1YmhzVmlWMWVHUHJlbjBOa2hoMkF4VmZNSUNOTUpqR2w4L1pEWnNHL2U1OCtBdyt2bSAwUHNtcnVDcUJTR1MwcTNTRDFTcnhBRVNYMnd5ZnRDN3RWVk5HTjRmRERnNFRmQjh3c281RHJNWVVxOW1XZUU3SWNBYkIraC96K3ZiIFVOSVlsU0h5MGdSUDVKSVl0Tkd6bmtWblZnYzRDMXRydnBDU01TU3h1cUMrQlVhOTBhY0RuYmtWSHMrY2NhRjJDUmJ6QmFsTXJHSzcgM0FicjFjRzF4TXI0bERqOGxLUG4zejhiZGszRlBtZk1PVDZQN3hHQ1dQS1AxK2tuTmdBYytBZnY2OUtJK1pGa0dHamg5YnBOSXJhUyAyMGRrbUtmTFRMa3FXWll3R0d2aHc5a0dFTndJR0p4N2xxcmlNWm53cHdibTFYWTQ0Z0Q2RHo0QnY0Q3hUd1FLYUxkUkZBeFNsaFZkIHFoc0daVGRoV0FIcXRYWGtNbzVSQ2xqUTA5Y3NoRXVDeURJNThPTnhBOGpwNHg1KzhqQVpzMmJCK0F4OEJzQitIanZqNWQwTzVrT3QgS1RHbmhWNURiRDFFTlRLbnhFTldpeEpUNEhIMnAzSW1NbmNDbm9ObHVHbmlxK0RNMVhvYnk4MVVraE9jSDBHM1FIUGdBREhwWi9raiBrWHVTVGF4T1VxRTdsZy94eVIzalFQZGQzd0ZvNU1qWm5XVlpEY3pQbkp4V0lORlJYejdXNTQvTmZtQnIrUUhyU1lIbEhsdXlFTXBYIHJzV1h5UjVYRWgrR2x2NU53bUo4eVlZaDg4ZUh4d1BmTUoxQlY1VGM2UENKSnM0ZkFQMkMvaS9BRC9YSGJDZGNqa3QwL1E3a1NwUE8gRElnMWhhQTQwalhwbUswQ1h4b21MNGN3SGNIeUc0Qi9uOHRWVnNtalZlVlJoaHdJYi9ZRC93Qit3WHo0QVB5NzBTMXhmaDgzWkRTRyBtMkgyOStHQk1NTXc5S1lVMVgzQU90aHc4d3dubUViY0ZJNHVJenkwYm04bkhaSjV6L1g3OC9IOS9QeVJnVWpsQTluU21oMlNUeTVuIFJuZ2crS3BCaGNKTGxRM01sdHcvbkU5a2hzQWV4cDYrQlI1aXlzYm9NR2ZzWnozWUFEOXlEOVZKRkZOcUJxSmY2RXJHTlBQcWJMUUYgOHY4QTZVOGk0NC9jVGZGR05OSXVqbTBrY2FDR1ZFamRVR0Z4aVdLYkUrYkc1REd3UEdJVWpuS3dIbytuL1NmYlRaRW9jb0hHNXo0dCBrbUVPU3poN3ZXNVJwMzZ1ZjZ3NUpNWlhEbkFHOEt6cXRiSmpCZFg3WjdPeHZ3Q0NmK2duei9UT1J4K2srZ3JnU1lyazdmNElZYS90IGkvYW1vclRQU08xaSswdG9KL01GdEQ0ZUhUNFlOOFQzd0hNSnJOb0lqeWpXb2svK1AxRmpnZndQcjlGWHlSUWRCWFlCUEJpVC9xY1QgSWVuaXZTR1NIVjRqSUJpbHBSNE80US91QmdPdncycm1GYVRUQ0tURjkzeGlPYmRxdUJuL0FPL253SHRkNnFHQVhZTlpxb3VwYXhqTyAxYU5Wa2JobldvdjJiY0Z5SGl6bVVaSENZSHArNEh3T3dJYlZwYVh3UGsza3FMV1hudlphSVRqNS9ZTmdQOW91dFVramxtUnAwa1NSIEkzWVJkdTNlVkxFYmJhdm5JMDJkTHd1UE9kSTJEQTdTWnBobkZJTnhPK1NHSmNoMlpWbVcrUEIveFdLdTJZRHE4OCthZFRMNHFqYWwgcHNrdDBpanZselNJa094anluWE5qSWM5YnJlMUxUTUJ4OE9kWmRnYkhNSjRGRmNZamcrRW05L1FRSFBqNkRicjhBZ2FucU9xOU9lcCBRYlN5YWtrdFlDdVNKV0VPMDlwOGUyQS9BN05pdVZxRDF1bnpFVGpkZ1Z2MmxjSHl1WHpreFFYdG15WWZxZjhBUDdCMC9TT1pvNVRRIG1wUldaNW1vYXlOVFdjMzFsVyttdXZYRmVtZ1UxVDlQSXdEaGd5UFRJdDRUSnNERjhJYzNSbWpCNlJ0NkNPcU93WXZ3RG41L0REcXUgRnVCNmZxcExkdU9nZU5tUTd2OEF6aWU0TUV4b0Y3V2VNTUNmOHhQaGh0NGVNVTlTcmtNVFdkMDkzalpEZXdZZTMzN2dBQzFaWHlvTSBNWFpDeFhDUVkxeWoyMk4vY0tQZ2M5VUk4R2dkZXpUeXlacVlwckNid1d3UmdNcXhCQnNYYmNDdWJ4NWN5YVVPV0ZWVit1R25oT3QvIG45c2R6cmdjTVdROVY2NmUyZmpjUFRHSG1WdlBtTlRhdm4rU2M1cHUwTnp3Tjcyam4vb0ovZ1BuNmRBN01GdHNQT0RKcGcyeUMzWUsgSmptTTRna1E3UXRDcDNLS3lYQnZGSkdFOHdRcXVxenllZWF6Q3lUS0ZNU1p6WkRaejNBSC9md1BSVURiQ0VTeUZXd2MyeVA4QThZciBkVGtLc05vaVRHZ0MyV01CTU1JZjRiSW9KN0JNNGlRc3RINDBURjdwdm05bXpuQVQvQVVFL2gwK0dTUmREbFVkdE82NDRFa2x5bHFWIDhoNzRzSWV3aHhWWDJFTGNqQkMxSWRWcDlQaHlFejUvTFFlMlZBVW9jWXMvZHZBdndCK1A5Ulcya0dJc3lPaVJvZTFGdThpOHROajUgRkREbWp5RDVPUlVkb2JXa2hoZklnNU8yR0dPRWRMbGZOOTR4b1dUZkJlWTByNnJLQzNqVEk3aDFKcXpiVVVxOWtNaUhVN3ZVRlMxSyBrUGpraDJCVzlielM3ZzRZTGM0RnFRK0N0bENZdmMxbmhKc0lqbnovQUlEZitmZFU2b2VPSGNpaDVEdWxxYmVCdmkwN21LOXIxZmxoIHdNb3RkK3pwOHlHdDN3SHdIdUgrK0UvRjVWMFBrMnlXaTdnd0FEWUFBQStmOXV5czNTdThveGMxMG5qekphbW9LWVNZVmRQcCtweE0gekZOK0xUZFZrSzM1ZzRXUXlNQmk0dFBBL1R4VmI0TSswTFBCd2lTa281OEI0RHdHSFRPamhsOTNaSzlGcGpJT2ZDa3dKTFQ3T1R6SSBuaHNxSlkxMzhQWkpnY08rTWkvREJuazVTbkI5UFROVjc0ODc1c2h2bitBRC92d0M0ektGQ1M0RjVDR1pvMDJrYVFWbXlvekdPUE94IFlrblhrY0ZxTkFGakplVkdkc2NWQ00yYjdmRzJrYTB0NGQyUjRza2NDdVdvbjJRMFFLdnJIS1YzMXR1d3BNcTVnWWJDQTRWazRPVlMgNldoZFN6Q0MyNFZ2TVQxdGdEMk5BcitmL1V6NHJyT0FNSWsvZnRnL2Z6L0lGNnJsQmJROGZLQXBMSmNHYTRSdTVGUHNsYmlUQ0kwRiBuS1Voa0UrR2hodzhOeGZEZ0llaHZHMkV4YlE4NzV6Yll3R3dZZ1VIejZDd2x1dDdBc2ZUM1dMSGxVK1M3Y05WeDE3VjZUazBmYkFhIExjYkRGc1o5Y082aWZkbGI4Z1d3ZDAvYXZKaThHZEZCbTBud0Q4QWZ1QStBNkNYU3M0OWZITzMyU3lEVEdWVzZBa0dLZnM1b3JIbmcgdTJFUGVDRVA0Ymg4d2VZcm0rRjQ4OE9ETXNxNVJZMk01dlp3K0FBSC9vTDhmNlZEQ3BkOFFpYmFaOWlFWlVWRkVxenhIOGd4eVNWWiBCQTdiY2U5Y3o3NTBqZGo1cXZBeWJLVnZubVNSL05xRnRzckZhZHpFTXpjbW51VlVyNVVySkZieVVTUTFMWml2VnNvQ0xIbGYrY0RoIDArSENJVEFkdE1EYURtNERLdktjbFI3UjJUei9BT3ZhSS9qMVNmTUlhZjZic3c5VlF1WmpNdWxEUUw1a1dGVllkc0RnWlVTeGdNT3cgQThPSGFqSk1YMlMxSjVEVFRCV3hqTXJxNk1NdFRBMmN4QWZsMStRUUgyQzEwTmtwZGpzQ3d3MWwzbEpKVy9ENDhZcVV3cnNPMTQyYSArUGpnUW1MWWV5T044RDRsd0lHSFJrWXB3WVlqaEVrSWo5M2RnL3I3RHJ5U3R5aDgxY2VEemxaZWRHVzN5dlg5dGtOVU5vLzJtNUFiIEk0Mkhodmhod0lUSzVudU05cVpFWlpmUHMzQ2NQMy8vQUtIOE9yZ0xUdE9JODAvaVh2aWxqemtZTnRoTnhZOGtreFlwSXQrRGFEaXcgbnJUeHdzVVNSSk04R1dXeWNOc3RrTU9QY0FPVHhZNjlhZEpuL0ZjMDhhZEUrd1U5RGZkY05HK2svYmpRN05OY3FOZTZOejZZRFppNCBkWkhmRlVERHFyakcwaUNIcllWY0RaY3RnajdsbnpoVTdOenZWNmNQWDZNbkt6cW0xaEhRdGZGUmlmT1k2WFFwNGdEQnpaeXQ2TFRiIGxCT2l5VE9kTVA4QXFMMWJLVlhXU3BPVmJOL29LK2h6WDJwUUxIRkwwU1dFbXFySlQxQkZlRENoWjFuazBtdUxzVTE4S0lXT0tiT2wgYkZiRkxsc2k2Qm9HaGZIQXZoc2VxeFJGd3ZGRkY1ZWFBRiszcHE2ZURGaTZvTlc5dFZocXVXNmtvanVGcDVsVjhCemRPRmFRNU5jcSBaTS9ESVBjU3E0WWhEUHVJU3ByUnVnM0N4WjN4Q3Q4WHZlT0tQdndFRGhoaWZBOWNkUmxMRXpVdlQzVXU4WEhRTlM5L3F5MUFaMVlNIEVwYm9jWFhya21oMTlQY0xoUTdVcmNlWHVMYjhZTEp1ZTZJMitKSVEzaHY3OXNHL253SFRzaDZnNnp0cExzNnRHM09XNnJRMnEybFAgVVF5Wk8wdURSVGVuc1dodzhHVDRkYnA4d2dIc2F0R0RnNGprMkJRbVR3TnUzK2RSY0JBYi9qMGt5aEJ3VjNCVmR3T250YkdoczVidyBzaDJWRTkzTVJEMU9DbnZ1ZzRRMCt5RU53dUF4QmdML0FCVXdNc3krTVZsNUIwbTdWZDJEQUh3RlJBRC9BT1hUZVBUSklpaU9ZMGpQIEZwdFFjOVErMURwbzJFaXNETEw3Vkl6bE9HWkMrU1NLN3J4dElYUjVjb2tsMWNja3UyYzg4U3FReVFSbXNXc0txK1JaNmdVdWt6NVMgczc0VXQrZnpDYStTYkRUMlJiSHNNT3ozS3duS20rWVhBaHZsMkliNHdUSndFZUJWYklaaWRvUGhNbWNOaE44OC9VSUEvVVQ4L2RXRCBzdERFTGxkQjgxWmlZV1NNVDVWZlUvQ0F1K282SEUxQXFUT3JxRUI4aFdQaW5USUdOUE50WVBic0l3WmFjdEZHS1dvRUMwcWJZQVFEIEJldHpIL2xRRlhxdklXSmZ0bWFqM0hOZG8xYnZjeGpZTFhKSjJOc2gwNlcyT1N0VmEvaHFFcmRiaVZ1UlpVaUN3SWNHWXNyTllGUnQgbUEwclZFa25ENEErZnhmajl1OUt4bzFFM0l1VnRUSXVVTm9xSGJWUHJkZTZSeHRlbzZuTXJtN3E5UTFkYlR3OE9IcUVEekxBL285OCBuV3ArNkkzQi9OZ3ord0gwRFlNZGdaTnhIcDVSUENpYWpVbkVNL2UyUVFHRmtvYk1qRURibXlmQ205TnI0cVAwNVhTU0o4OU5DcmtuIHRqOUlWdUxKenV4cmxjc1dLWkFwNmdycHRGSGdQWDBlYmplZFkxS0h6YkkrV1BNT0RBNzc5YUFuR0t0cjVnT0hwUGgvdytJandKeHcgV2JNYU56WnY4N1UvZjlnL2Z6eW43Y3pLSGFLWXYyQWVTYkNsT3lTMksrb1NZT2JMVXRvQ3ZWekVXL3lvSDFJZk1YOThVckFnVHZzMyBLRmtZYzdvaE5nd2ZrSEUvano3cnNPSEVPcFJaS2gyMVBvSEpsVEpLUVIwb3JjZTdvZGpGV0ZEc2F0OTRUNlRzaXQzQlBoVnkyang3IFVaWmtab0tFeGxWdXdTN1B2d0FBZjU5ajBxNFlkTHNad0dzYkhwN2RnSzVUOWIxbFYrZFlkZ1M3Z0FpNm4zNll2Sis4YWtLM2hwK0EgU0FQYmJVTU14UGk0c21ETmhPY1AzQVFHSUFCajBvSjlSWVZaaWl1eVdrWDgxMDJtZUNmTTFISkloZkxiYTlvTFhOZ21PMlVWWGhNayBpSzZzelNpT08rSFNXS1dDUGNjeHM2TXF1TnJNTVMyUUJHN1F6SFN0Q2cwRGNsMlNaalFrbXl5c05BdERZdHExU2lYeVZEMmRQcXR3IHBQdzl4ZTZrRGNDZTE4R0puQWdUZk1kL1BnTi9BYitOdWdjUll4QXhRVmd0U2s3TGpnRUxFS2ZtUnhKaFhhRjVvbEIyQmJEb2RxUTQgYkFIc1o4Y08zTmJqQmxZRkJndEhTZDhPSDhiZC9mejc5MGJLQ1d3VnBoTVkyT2gwaElzWjhHMmE4TlVPdjc1bXVSUVNydnNQdFd0TCBkMkliSXZ6RWREK2VjVCs1blBHWW4vRU83Y0gvQUgvWU4vMkJnbkdETmQ5UGI1THBhbVZ0M3pibXVOSXI5MnlVK0pEdVMwRk9yd0FmIG1CZ3hUOXFKemdIbmNmc3RVVHlhTmFEUXNvd05KN0pnd0I4L3dFLzU5K2VId2xXSkJqaE9ZUzEzbmVOTVJRcXFQRm56NTZHT05Xa2EgeWpaSmtNR3l4d3c0UEE5MlhCL1I0NTRFSStaVjZSUzlZWlI2eUpKbHRBaEMybmVHSDAvbG1Sb1Y0ajVGVHlFT3EwT3QzQXhZQzNPNyBIMlp4c25aaXZhRkcyL3duZXpoOEF3YkErL2ZnRFVUNDh5Z3J3Vzd1S0lkdFcwME9CdGVqekE5WHRZZTJuSVRGVFE3QlpFUCtUZkdDIEpCUTdnQWd3NnlNZk1MTEdXb0V0RTI4QUFHQUFCajduejRwRHpOSzhXcTArQUFwaS9xWlRYYXJsNE95T0ZmeElkamdWUFgwbXA3QlogQmlxNWtNd1FEMDdBcjhDRGNPNWpRME16TmdiMlREWUVFQWduOS9ZRDYrWHhkb0xpZlpDUTRrbHRWUFdjcFRLZWZCcWVKTUhrT0pGbCB6RSt5SzNmRU9ZWVlBNXc5ODg1TUdGTjBXU1p3NEVxNUhRUUdMOHZyNS9mOGM3WnpMSzVURjJUQm5XTFprT1FERW8rVDFoR3Nqa1VjIHNBT0xzVnRSb1lVRG9xS2dqalZIaWx0eGlWVW1OemptYm90NHhOQnVhZG1veTY2RGQ3NHV6S1VnOW8yUnBvMVhOdE9JRDRCZUpmOEEgRDRocEdvSzJsc2dIUTlabHdlOWZRL3IvQVBPREx5eGZFYmZQTm83OGZQZ0VId0dCOUd5RGpZMGF2TEl2aDhvMGJwWFYwTlNYcmdNMSA2cmxvaUdyNEhrMmlLL0RRN0hwOWtYRTliQjhmUFBBZDVLZmVmTnBQT1Y5K0FnVCtQZ01PT0cwWmxTMTNEdCsxUTZpQmlvYitKSHpGIHNQRVpMR0tjb0tQZzlrdUJDcCs3RU5nTUhGSmZiVGFmdGl1TEpqRGxYQk82Z0RqK3diKy9QM1QrYzVpZkYwdjE1Vi9iRzBZWm1zYWMgYkxZVzYzSVhIVzlvSWY4QURrZXRSUFkwTzdGc3VuOGtyaWxpQUVFWXJObWZCYk1NcXMyazRmMENnbjkvQUFPaWoyNDJpaXdtazNwSSB3elpibFNDU0tSNUtvVm1ZbEdOL3ZJMVJZeXRLTGFSQmh3bVpxa05CVUI1dkNqWjQ4amdmS2xCaTQ5bGc2M3FyS01iYmI0RWF2TDRGIFZSM2V0K0dpWXRqUThONGZJYWV5TDdLRHJUdG8xSWRaMW1VR2R6QWV5Sk8vNEFENEEvaUFBSCt4WGtMNlpJWkRPbmhEcTZ3bDFWVzMgY2dTcjIyZlBBWWhTMEpsZ0I2M3VEUm5RNGNldGc2bEhVdEJyWlpHV2hjb3orOXZHL3dEcy9IMEVCMFlPQ080T3dNYlBxNXdaRSt5bCBzYTczZzFYWXZ1NmVMUTdaZlNqNVg5YjJSMmZEM0FQK0RQOEFudkJoWktOQ3VUSm83dmFJUUhzQitvY0g0LzFJMVBEWFA0U0liUmFDIEUyVlcyTFpKckh2YzFPVkVTdW1pcUl3RlBnR0dXK0tIZTRaOWFzWnNuempuR0dhNDZjZVNuNisrT0dLL2dBd2ZtRDFNWU1pUFBMTzAgMmNqR09LT0hIVnE3MDJ6R054cWttazNIVWZkeU9NTFlRcDNZb29EdDV3eDd6enlneGlBV1pMWXAyK1YrRGY2cmxmTGR1VkdHampTbSBWYWlsa3RHSVJzSDJFcWgzZUdlVjZSeFY0ZnpBNGR3TU1nL1k3TEgyVzhCMlptVnlpTXpiMmJDWUgzL1lENEIreHg2Y0V5MUNqdWgvIDRTdlQ2a3lXZ0haUGozbGRpK2o0V05WK3dpK1BoNWkyNFF6QkRFR2hzRGJCRG93eERGc3l5RDJSMi9ZTmdQOEFnT2h0VHJ0YmFMRWEgalRjeVdRcWxMcjAzeExRU2RuWVZzV1VweUxhQ0dRbVZXK0dIQnc0ZWpUNlBQSTVoR1Jya1YyWlplTFJDZjcrL1lFRmc2NHhaVmthRiBmSmQwTmtOMHkwV3BHbHI0ZXBhSFlZYjRoTmhTa2JnSUIyUVBERG1MQlpNSURoODViV2RyN21lYk5WY2NRVCtQMzdwWnc3NHdxTTQrIG56UlpMa2lNMllYY1hEdC9qWXIzVTlONHJsaWJzYXBPVWRJbWVSQklSY2I0WUV2QzFpNUV5b05YcDVlR3pvSTJIVVpBeXI1T1ZtZ1MgV2RZS1R5eVFOeVEvK28zeFdoYklUZm1XUXl3MC9BSDRGSFpHYXMyajdPQ0NiSituMEh6L0FMbmsxYnNSb3FOYmdQbWRVcUpXaWVGRSB5S3JXeDhSYmxKdmU0cE1UM0F4TTA5c2plUVpIaERZSjd4VmF5elBtTzVnd24zZytBOEI5ZzYwbUNoQjN0QVBYTVd0NU9tOThQVmRFIGFJZWRZQmFZZUtGbWlWTUlNajQrelRLMHZoemtCUGJaeklUSmkwTjZXZkNCUForNThnNGJBQTZuckV1Z1dac0d2TXFvTlBkWGFleksgM1VyQzBXclh6eFlYS1FKYTVLYmNHRVBEY0Z0a1pDRGhCN1hXMGM0eVRhQmIwVFJ6YnRzZkFYNyt2dC9mb3dZTVNSbWtGQ0pObmN4aiBJQldKV3pGeWRwd1d2VTU1WERrWUZCR0FaVStwZG9KM2tiRk50TWZXbWFqVUVlUjNZNjc4azcxeDVVclFRVzN5WmJVdGp1d2Flbm9hIFRFdGh3dmlRMk9Ea1VhOStRMTlibUxiSlZjTWN5UVo5Z0tYMGJsQ0d6REtydXdJRUJuL0FZWUlKL3dCeVNIU2VuTmNzVjJzRUZxV0ogSWRsNmV5VERkSGJHK0Y0T1VBdGtxdWEzWDRaaGttYk9uaC9uODhnc2hNWWg3blVEdzdKUG4vdjNnUDBjMWx1bmYyM0xDMVNuZ0xhKyB6NzQzV3I5UlEybjFPeUZjQzdnWXEyUXF1R0hNTGN4Z0RxdkgxRlZXeG02Q3hqTnZlOTgrQVB6OEE0Q2Z3UG9jZlUrWXJoMVZwbjZlIHlUSkF0cEE3VDBQWVZQeThhNVBDWlVWOFR6RVBDR1ptY3c0R1E3VlRMTVdTaFNvRms1K1VRZFJIK0Fuei9JTU9tamNqWGNDdkhJRVkgeG82RVRySEdVeGpFRjkyT1JCYmNYNEdQUW95eVBTMk50RURzMDI2alNjNVNPK0NiT2RERmNYdWozZHZOdXRSRXlHTHN4MmNyNHRwUyB6dTFjbnRQTVE5TjdadWlha0liUkRyOHhXL1oreUlkZnZuUEdDZjNJWmhuRjJhczNoMjdYV29md3QwQUFRUHZ3Q3Qrbk5rc0RTcmJrIE9BeDNOSkc1VkFqUk9wQndsb0V1SFEvZU9JTEREMXNQYWdka3VBZXlVRFpkd0FVZDhHRENpSHhuL1JNRy9iRDlndzMvQUs0NnZUNmIgU0FWL0hxVnVDaXFUaVhBN01OZldFaDFlSm1LN1JVOFZYbVU4K0lRZXlGdTdGOWt0VGo4ODUvUWF1amV3UUliUi93QXU4KzM5K1FVRyBYZE8zOWw1Q3FwejlLNlNaZ1Z2YUZybUxzdWFuN2pMMmcwTUlHSXQ0bUVObFdnNWdjeUJEOUlQczViV1hqbmlNdGZka2xIUGNCUHI1IDkreEFBS2xpU1ZGU1IwS0R5RU9kMkVEV2UzRzQya1FWWjd5MzJVMXdob3lKSVVRdUtKTHlGTnVNWTV1QmcyZFdMSGIvQUttNjZqcmcgWkI2bFlCNEMrVzAydzN4d05pVS8rSlpIdGkxSEpYc0lwYlZxTUw1VDc0dHpEQTVrcXZ0ZEFWV1Y1WnF2UTBaWnczdEpCN0FmUG4zNyBuM1RPVjNoUERKeExVRWhxdWt0cUtETlBDUlg3c05SMkhhN2FwRUNMUWlIOFFtOE1qSlI0ZXVIeFBzeXVRNnl6UGlHc2pMVWR0UEZvIHZINkFQOS9IdzhvWXJPcWw4TytSYzZuQnVVMUlFUWhlV2NqMU95TkFHbkxhS0dIQ1pEVG55RytFRzlIUXg5YVBDRzhyUDhSbFpyT0Qgc2ttM2pZSDdnSi8rb0FrZkRiS3B6SFpTWEh5UUJybmNuY2ZOSlVmTG1XTktZWlQ0SFQ3c0Q2dGVOMm9BaG5BSSt5NExJTXJNcFZ5eSBqSTlYTzFvbzRBQUFQNy8rL3dBSmNxaW9QWWlxVCtheEFQNjhIam5pK2VsSUZDdTdpMFhISTM3YlBISHpkVi8yK2Vud3ZodzlRVldOIC9oeStQWVdWbk5seHEyVG5EMnh3VndSYXBRS2VubWFmY0VOd3NoZ01BNTVCdFIvdk5YcTlaak5rU2NEbmdGOUJQL1FhanJlMEM3UWIgZmhXWEtBRXNaNGVOM0FRNjlZQzB3b0FYaWprSFQvc1llSHlCa2d6Ni9mQVFjWjlvUnNOOE4vOEFUREVBZjJBQThkT2FuWGFZVU1WOCBwRTdJU2RTTHRaRERUNEZ3c2o1dHRTbE1ERjQvczZmUStudGJJTWs0Q3dQbGN2aU5qcUxGdkpNNWRuTmpoOC9VUjgrQXdQbitrRXVPIGlmRkh0UUVDN1NsdXkxdHQ0TzdWSzRkNEtSQTFQY2l1K0w2Zjh5MUliSU9zZ0dmVHdLb0gzTVdMc3pZemZlMUh2dytnZ0FIQVFDQy8gUnhXVEFTQjJ4YU5IVERPUHdyaHNtcStiRkd1Qlp2aTFYMkVTYmVtYThXeHp4ckMrTFc3c2ZJNEh6ZDlFaVdVc0JJS095dFhPZDhPQiBxS3E2WXIzblhnZDM4OXRiUnQ2R3lCOW5jUGh0UjZ3Sit6TEx5K0s0ejI1c2s3QUFBWXNHUGdEN0NxY29sTGl1cXl0VXVtL3Z3Qm1WIEsyVmZROVNvSEQ0dFgyRll3c3d3T0hMM3hrY0NIZ2JCVWdlNS9RM24raWRqNUIrdXdkUUxwYkRneDZoRU5qeWlSc01aWkFuZUJrR0IgNWxQN0RXVmNpMXRmVytOcDlrQnVTSExhcjdzNnR2Tm1ZN21NQnUyeW5INEF2b1BQdC9BOVpJVDFkajNnVVVQRE9XL0pZWGxQc0tyMCBmaS9jMG9odUxBSGh6QTVnd1FoMk1wRCtLQjFsNTVRekRQQ2I1c0h0c0cvOURHR2VPRXpMc3U2YWZVbFBmamxsMlpVbDEvaXhIejI4IGRObTIxbW1XRjk2cDNoak9PRzRZZ2dMZTVzYnpISGRYNXF5RS9wdktXSllLbXQxS2VhdGdYQTRTV3Zub2NqamNYVG5wN2FVMXdyOUQgUTdnc2plQ0JpQ1ByODhxbUNiTVVLWW94dzJFZHVBbjkvQUFOL0FBSFpIRmp1TmpTbVZaMWdjdEFxVVFmWkMzWUFtbnhjcHNpeW9ZKyBIVytHbnVaVmZKR285UjZrcTJSM2Z0R3IvQmhFbDJ3OEFnZ04vUGdENlp0bVJYYlFZRHo0dGhTVnRqU1ZLSW51Q1RJTEdGY1hYdTY3IGZDaHc1c1BtQmc0MnArK2NaKytQT3hoQWxvOEIyREJCeC9mN1VPUHlFUFIyZVZ6T0NCUUprT3BDZFRHa1ZWY0Y2SWV0Q1dMS1EyQU0gdHc2MytHdnZoeXl4N2JQaHMzS0ZjbXNnd2dUNkNBUC9BTC9oaDB5YUNkdHA0ZExDc004elFrcXRTZlp2TWt2MmJ0eDJNVFdDOGtIcCBVY3NjU01qTzVtaVF2S1ViREtpaFVFZDllR28yZVNlRGZSNW9ycis5TDRZTEN6VEljYldLYTFFa2hvckZVejJGUFBSYkNWOVFNTWdaIDh3WXNnaERlRzJ3SHVjdHJETlE3UzhveVBWM2d3QURIWUQ3NkFBZEo5d1U0N09RTVpwNmpRaUhjR1R3amJsdStONGNwVVNMU0szOE8gSnlSa01KN0pYUE1VT0FubzFaNGkzblkwazNTWndBZ24wSGYvQUw4ZzFYVDZ6RjFubUt2Y0dHYlQ0dGhqVjZ2MlRPcGN0LzhBZWEwKyBsRnRmWlRDZkRXMlVnWXFzOFErZE1zd1lodmp5TWVQdXdOQkFZZ0FIZ2VuOUl1ZzJrTWZjdE5Hb0JqS3pnamJYK05WMkJiREk1Sm9sIHlWN0lJSjhOYm1VbkRIcmM1U3ErZk9oMUF6Q2lqT3pIQW1OMkkvQWVmYkJ2NERvWWpxWW1sZFZ0Sm5WOU84QnprU0F4eFJPQTFMZ1ogeEVoQm8wVnFqVmszd2RWaEt2QS9PUWRmRmxDT2JGK0QrS3NmbnJ6QTFoM3JxM2Fya3pwajJLVnFmTnhWa0RrWVY3cEZVNk9pMWVDaiBUdlRLUGVyMUZWS1hZTW9yWGxoRTU1bWNWYzBvM2pGTHdaMDNKS1RCdzNFeDZJRWZPdmFGVjE2aGt1VTVab2dqYXRlWkRtNHpubk1yIGFocjZyeXA2d3IvMG14UWFPTldsNUl2SktaN0JIZWpZaHdrem5TcGsrS0hLWmhmY2wwUUlDeVljREp6clVvMHlLaURUZjJsU0lpak8gYVhPbFZSM1pGamthTjJ4Tm55YTZYdmFueTJyMHp0d1dkWFFLeDRKSUN4S29CcmdBQVVUeDBqMkZmWHF0cnVucmZVZ1F5Sll6WmthbyBNK0ExZXZKelBTWlRDRk0rdW4zWmZLQWlVUE5oa0dHYVptT0JwYlllNThxd29ucHJuT3lxdldvcTNYdVg2bHIxM3MwdzZlcTExUmY4IFV6VUpwL3R3R0lrSTZndzZqVUtSSlJFMnVhak9PbVFzVmRVQjRPd3V1YlZLVW1oeVozRWk0VHNUOFllRkVxcnRGZ0M0TDJzTTBQTG0gNU0vT3M2NWVzZHhISTRkZzZwQ0ZjTVF3RnZ3R3V3UDBEWFF4QUNSYUFGNnF6WEZuOG45L3Zyenl2aG5LYVg2dDB2MlRTUHBHS1ZpWCBGL3d2Z0Y4MkU1emdvaHlMbjIzVkN6dUt4Y0lMTnlYbUV5Q01oQ01BRlJYRmhFN0lGNVl4U2pnQi9yV2NCY2o1V2RKdC9kMmsra2o5IDY0V3ZncVJnN0EwTkxVY1BDaFVVVm1LY3BnOVQzbEI1aDRldUdSaGVDc2xDWitQQ3NNam5LZUFMTGtPbytIajZjbkxWTXYxS3VablcgZGFvaWYvVXlsbkI5THFRNjMydUxnNFpmRERrOEVFY25yWTZJMzlqU3N5cXpSemFYYllxQzBlV2VXQkl0Y3FHV05YUXZ3T3FmWnlvaCB0V2t0MmE4YTlUVjBrbmc0ck9uWXFZelBCNWllWmJ4Z1VrWDlhbVZ5WnVZeExZZjFsQW9ncDZGSU1haEoyWk9Hdzh5WXZ5L1JrZW5MIHdHcTBndDl2L3dERUF0V2dzeTRMbHJHcy9UcDVxNXJuQWFXc0FwV2NVeTkraHlXM2Rhc0FxUEIrakFMbk45Zk81ejF0VmRrSTRtTEcgVUo0b0FPRndjdGRDd1FtWG5XZEdwTzJPVHhIS3c1OE11R0xEL010bkUrUlpvOVlTQVBBQTRYd0srQjFmZ09qWm1RbS84V0RMZVhGdSB1eGgwWHk3OHRlaG5TOE0xZHNnOHV2c1FzNUl6VWRtakM2NTZVaWRqWlE5ZUFsblVmbHFNUVpsTW9VUWJUSVNmSkdRTUk5WWRNRi90IGhtbzZqZXM4TXRRenVvRm1MS2J6aUk1UUlpUVVrU3hYT2xabGZwdVFQYUkvcVVhN0w1SHJ6akpaQUVadVNuNXhIUHpCa1FMQ1RzZlEgcmVqT3M2Vzd1MCtweVptcWQ2eVltcnE2c212QS93Q25XdU5WV05NVkMzZDRnQytVODE1OG4vcWV2eEJRaE9iUUZtNS9wbkhJb3NDZSBRSmtKWmhFdlZDWHZRODFwWk5lMVNCdHVQR2paV1hORDJ5UlZmVm41VFk2cnhBTk9ic1p4RWN3WmM1Y0lUQVdjd1VpdEZsdXQyMU1vIG42alh3bVRUclpSWDF3TVR4VWxrQ0NCQlVGcW83TUZTRDhrd1I5Y05XZ2wycVl0QkRFNHNBaUZXcVhObkNpT0sxWDJXbTUxblRmRVUgamozTGhpMzNMWTVvK1JkQzZQUHoxVS84aC8yLy9EcmowOFYyR3ViVC9kVG95eWlBajBxNFRUMUFISnlsNkJJSkN6bzF5S0x1OW52USBSV1BRS2tSNXZxQSttY1RVRlBNek03RDFqVldmaDY1L3FMTlloZGFReVRzUXpsMXBwZlRyY0VBbHNvWmQxY0EzeUZ3NkZpNTZZRExHIENWVEpoVDBnd283YTg3NEJBVllYcjljK0FjSUc0OC9PVUZDUE85TWtUa0h4akRuV2RVNVAwK3E1UDh4LzhnZitPbHA3bC8yLzhKMTYgZHJTN0F4YkxLRkJjMGlwK2lDbmErbXlObXJKT2JDamVnNVdpdFdUZ2lmOEFNdXlzNmNuK3RkV0hlNFhaNUZvWHFYTWE5eUhIUEVzRyBDcGpQQkNzMk5UZlBpNDFUL3dBQi9TanJOWDU1d2hhTHc0MndXejFwaFkyQW5WS3Y2MmpJdExKT1JFV3YvUVRpamxESm41ZGNydVRuIFNnK2ZrRjhZR1liRDduc2pBWEd5ODZ6cEVBQmtqc1g2cUhuOGk2UCtvL1BWdDdKUDNHd1A3QnF3ZjBma2RWY3FsNk1PL3F4UmhucDkgRmFBSUZOYVZMQlhjSzFJTUFjb3F0RnlVYlcxT1hKNnd4czBhWVM4aGN0Q3ZIWW12c1NFZm1HNi9GUm9JYkJLVmxUMGo4UFRtMmNwVSBQTTFGQktKc0M1bkd5SE0xbjEvWDFsenZUalpEc3Ura215V1JETU9MajZ5UlZTT0FHZVpsem1sWmlIUTh6TlA0bTBzaktsWnlLWFdmIDhBVmdNenJPdE9wQVNLQjFBVnRwVXlYaHNIWVpKWW80dFF5VzZhaFlORHBPbUpNbXBzayt0OG0vT04rZno4OVV5dEhMSnJyN2JHbnkgT3lNZWZXa2JJUjVjZUQ2U09BUTVreXk5UXVWN1pFbkxhVlBJWFdIRDFoSHBSQVlqZlJpUXh5SklVZEZGc0dVYzlNYUpuUjdvNm05WSBseDNqU3crenBmcVVhMmY3WFhybHJWN2M2clZZSUJ4TXFhbnBTd3NUQ0Q2WFExNjJWd2djaUs2YmtjU3ora2VlaXhpS3laZHdjZVBCIGpzWHA5VURPczZWSUI5WEVhNUYwZmtmeGVEOGRQajUwT3F2bXRweCtuVVBpdy9ETFp4YnlMTkVkSmovaHhNYnJxMTBvM0VSZWJFc1ogSVl0T3RiVzRJclpycUI2WlVKaWp4U3hDaGNzamtHWmtjalBqbGhSWWZZckNOYWxQTmlaU1JZSHB5d3hpeGxsdVp3ZzA5SGJHZFg4cSBpaHV0WW5Yejg3eGkya2ExckF5cS9JRytITW5wYWNtWTFhWnNqL21zY01hVDVpMmZLd08vVGxtZzJvUUZYWEZlekJxZmdCWWgyU3RRIDhyMTUxblN0UDM2UFU1OS9yL2YzZWJ2emZtaGY1cnB1b0pqblV4a3hrM2VIYjQyNjl0Zms5YjgyZGJiRFlvL09aOVFsdU5FeHFxU3EgdlF3emoyWFY4NlNlUFJSK3FsNUh1VE5oMjB5NDdrendTeHRyaCtyTWRZN0VHTGhXc2lNWXdwcktFcUhxV3JHYVNhYVZ0UkdxaXc2NSBzTFBseGhLeVcwMWVnVVhSeEtaWHpQRkZhbVZSanpHWldnR2s5VUVab0ZJcjljVG9OZlZDanJHVURVMGl2aXJLczdPVWpzQkxOenM2IHpxUkFCWWdBQU83eHg4cDBwdjhBaW5QeWNiUHllZWtKT3FaVU9pbUNuU3ZwbXkxT3ZJTHE5amYxZ1pHY1htdmdFcnFBbkFqd3VLUHkgRlRQVW9OaExlTXIxTHcxYkZRM0NLYUpabG5jOE13bGt3dlFGWlVLdmpOSkdsMlpOYW5ObUwzRG9oMTMyOHdIMm5QVnk1d01WMGFrNyBJU3FkWDFjajZsWEp6QndPT0dPWlhxSWxwbUJPd1I4MExCa3BEd25ibTE1YkpuV2RhR0p5WGs4U3lrZm9zWXNpUHdUUXMvTkMrbHgrIDUwK3hrZ0RKOWpCZHpFTXZnaGJPSUlJRm12SjZNMTJ2am1tM1VQWFVTbXJtdWxKdzFGam9IcHRpU0lieDhHZWFuMGVBU1RLMGVEem8gUUNMS1RHTmk5ZnFNamJBT0p1YUJJdVlac2F4aFhQOEFWSE01MkhvL2NLcDE0ZHFIdU5lOUpBOU5PazlKei9adGkyVVVteENWaFc2MSBXMW9kemRVYnNRZnlVc2ZtQThvbk91QmU5UnFDMUlxOGt2QWFBWGxpUlRURWloMDdCWHpyT3NzWUIxSWNnRjNnaUx1UjNNVnl4TE41IFlyazJKSk5XYXF6MDRFL1Q2SGs4R1FEOUJ0bklEOEJxRjE1b1g0NlNPcUswUFNRUzcvUGpLM3FaUzlGSWFYZFBOOFY4SVZraU5CaUQgbjZRZXVwVG00U3k4eVdSY0p5cVhpQXMweXlwbWN6NExEZTVNTEc3dHd3NjJUbzVpRkVVc3NFYSswUTZWOVlDUTdOYTVjMDNVRGJxMyBreW8rVW9rRmdlTmthSXkxelRzcklXRGlvVkhFTWtoTG5tNittRFQrQmtMNjZ3UEVGdkxGNVU3SUVteG1kWjF1c25UNlppU1diUEppIGJacWFLcko1TldhczhXZnoxa2NBem9TQlp1LzM3ZlA1NllGWitnWmNGSFd0Y2pHSzJ0bFkzSUxSelNQVjJGMURoR1duN0kwelZoYkwgYlhaVDA0dEVvM2tycFVrMFQxV2Q2Qkp3Wk9LSThZY0ROVGlraUxpU3pGWll6VzByaVRSOXZqV1pnejJJNUlzMmxvNFZrTWtIbEdXMSA4WlpScExBbUZsTGU1REtCSG1GOExEaWVvWUxrUkpxSDZ5ZVhuRmlhV1JJRVNzaWZuV2RaazkybS9VU2dmb0FwUUg0QS9IVTFqdXVsIDFHTE10eU1UaXhGbTE1TkVXZjJlZW9XNGRaMXpoRSs2YStGK3RVSGd5dEU2Zlh3OUlHQU5uTEhDU0FzTnFlTUR5Q0FhYVA4QVVLVWkgSTJ5eWVjV1YxakxBaVBrQ1J1UUlqaUJSTnpHTmQxYUpVSWwzVWxwamxIekxVdUVyVzB5MU5mdGp6MUptTDVHVzR0NURYa0Nqa3habyBDeFNXUlRrTFJHU2txaE9SRzlDL2xHc3VhRWk1VU03Rkc1a29mSXpyT3NXcEpUVlJSb1NrYXpSNG9wS290aXpTaWxGbmswT2V1Z2lxIHdreVVOVU1sWkFHclZMcTc4L1BWb05Fdi9EZzA4YW5LVTdrdjNwWXh4MzBPVE1COU9VdXdhM3pNck5oeGN5SVU5R2NRS3R0ZHRqV2IgbTRTakV2SWpTRHJHVHhFQThnT3BnZlNKVWwxZUJDODZ6ck91M0hMS0ZVQ1NTdVB2YjhwKyt1UEpIR1hjbEVKTE1TU3FrazM1SnI5RCAvcDEvLzlrPSAiCiAgICAgICB5PSIwIgogICAgICAgeD0iMCIKICAgICAgIGlkPSJpbWFnZTU2NzgiCiAgICAgICBoZWlnaHQ9IjI2MCIKICAgICAgIHdpZHRoPSIyNjAiIC8+PC9wYXR0ZXJuPjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6c3RvY2tpZD0iU2FuZCAoYml0bWFwKSIKICAgICBpZD0icGF0dGVybjU2NTYiCiAgICAgaGVpZ2h0PSIyNTYiCiAgICAgd2lkdGg9IjI1NiIKICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIj48IS0tIFNlYW1sZXNzIHRleHR1cmUgcHJvdmlkZWQgYnkgRnJlZVNlYW1sZXNzVGV4dHVyZXMuY29tIC0tPjwhLS0gTGljZW5zZTogY3JlYXRpdmUgY29tbW9ucyBhdHRyaWJ1dGlvbiAtLT48aW1hZ2UKICAgICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVFTa1pKUmdBQkFRSUFJd0FqQUFELzJ3QkRBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQiBBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFILzJ3QkRBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCIEFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFIL3dBQVJDQUVFQVFRREFTSUEgQWhFQkF4RUIvOFFBSFFBQUFnSURBUUVCQUFBQUFBQUFBQUFBQmdjRkNBQURCQWtCQXYvRUFFSVFBQUlDQUFVREJBRUNCQVFGQXdFSSBBd1VHQkFjQkF3Z1ZGZ0FYSlFJUkZDWW5JVFVZSkRaRkV6RTNSZ2tTUVZWV0tGRjFaVFE0UjFkaFptZDJoWWFWLzhRQUdRRUFBZ01CIEFBQUFBQUFBQUFBQUFBQUFBZ01BQVFRRi84UUFPeEVBQWdJQkF3TURCQUVCQmdVREJRRUFBUUlERVJJRUV5RUFJakVqTWtFVVFsRmggTTBNRkpGSmljWUUwVTVHaHNSVmpjbk9Dd3RIaDhQL2FBQXdEQVFBQ0VRTVJBRDhBcjJ5QzZuclJMcmUzNit6djhGamZKTFluMGJaQiBnUXRDMmgzdTRvSHAreUtyVzBOYkQyQk1zYmIzdzY0RTBZVytYa01lQWh1cmpnQUJnQXFLZzhEK3dQaVNycEg4ZERqQXU3VDVhTmowIDJTc0M3YVhhNGRJVlBUOWMyTUpQUmEzd1pCRXkxSVZKUUF5cTJzRUVDbnM5bHMrS045SmRxdjJCZ2ZsOWdBZm93VkZIZzYvZ1dvMVUgalAwM2txZjRUVzdDWVZiT2NQbXVTeExLSy9INjIrSFc2ZkxIaDFSREg3NGgyWjNrRis3eHZsWEkvYUlBQTU4ZjgrSHdyY3A5Y3ZpdiBlNWVWVnRKdTZTU2lNQ1M3STllc244TDZRVUtHR0Q3Z25zajUrT0Qybjl0T0xkUUUxZFhacXpPT3dTcmpsdWdENS9ud0R6NHlSeVlUIEdXWjJkSXpJa2tmcFNOQXRiSVZpWHd1M3MwdzhjZm1STEc3d1BHbUNQTkdTMldXNDVIZS9nWTMyMExOZm5wNUo0OTBnWmVUbTFMREMgVVBZS0dreTlOOTJXUVk0SGJUUTcyMXFnTU9DMXpDR251QkNaOENqOVEvQStDb2FIdG40dTRPQVBlQUFNRy80dmk3Tk05SDVWb0orbyBlMzByc1BsV28yc0pBeGhJaUIyaE41NUZNRUliNUNoclljYzRRVkt3SUZxSjdONHNad2ZtMW9vL2dQQVk4QjZXTlQyWURyNjVESm12IGJhSlp6a0hxN3MrQnNJZXBoeWgvczNhSGRCd2NFT0dIdFJnbUhPSHdKM0JpZE50QXdZajlya2tGNS8zKy9kU05aMFcwWEpJRDFMWDEgVjBtK1NudWdZa2dBaDFPd21ISVVYbFJmNXd6cUV0U3lFTWVocXREM0JXand5TFBadFhaaGp3N0JMUi82SCtmbmovVW5jUjR6eHpPciB5bzZhaEREMkxBY053cEl6dEhOWEdRZlRuSHRxc2oxSWl6ckxwcDRGS1JQQzhXZEhIaDh3Q29TVk1xVWt4eUpkZHdhaFNVanE5Zno2IGZtRDdmckdOVEsyN1JyTmthTTdscmVzbnh5UTdCZkFNTWdZbUNFOWtVQjIrVktQZklLZWpQS3VyOG00VCsvNytBK2c0Yi8ySEVkd3ogYk12Snp4dUMva09sZ05YSkE4bFdWZnRuOE5KUmhzYUtZSDJUVzkxbUE4eGgva0I2bFkwemMxZG9Kb3dNMVZ4c0h4OEFnbitBOEI2WSBUNDRhakh5djYzeldqUHNoOFVnTElKVGxVYklyS2JWMVhzTFNCUXgwTkRXNGI1TXI5d2c4L25uRU5tUmlncDVSdnpZazdCK1hkLzhBIFByL1pVY3pMVjZmYXJRZ1ZMVjN6ekQvWVZIdUFINWFlQktDWW9Gd1hqTjhKL3dBT3R5RGg3a0ZLQ3RveU55aXpCbTloUWxxVkRicUMgZmZqK0Q5aWZZUktxeHN4ZjFKRlRDTk1ranY3MHlZeUxJUHRhU1NXdWNRT2NvNndIMDRVeDJrZG1rWnNwSkt3QVY4UWtReDVveHhKZCBuTExpdU9wN1FVM2RYc0lDMnZoSzdMR3NJM2R6eHBwUFd3d2g3dUtVTmJVV1lRWExJWkhEOGY4QUIyMWZiVlhqVE0wQ3hpTURkbmMwIERBUDFCMUZ3SFlIN0Fxck01cUZUYXpHMkRtMXV0bUZ4eE4zZEh0UzJrL3VSMjU3TjFLSCtHSHJkRHdRK1NISzA3bG5MZ3dXU2xOc3cgeEhwTUk3YkFBNS9pdm56NkNnaXQ0UEJDd2N3emI0SEZiczVvVzVLOWREc0JhRk9xM3lMWHRjMDJ5VmV0MVd0Mm9INCtIYW0xZ0FnMyBCWnJOODNUWTdSZHVEb1BQc1AzL0FLZ2J3SHNsZzJvMVdxR3VaQVc0dHFOcGFwMnFaSGJBK25PVkxWendldnc3SUgxSUI2VEhHRWREIHI4OUJoaTNsb0ZFMmI5N3c1OTdmNTRBQmtrWnBTeFozM2FrSkw1eG83VUhpamVobmh4azJLWGEwb0hVaVhFTW1TSmc1UzBqck9zZVMgTXpWWDRzMENlZW9FZGwxUEtyTXdCeW5CdEdxNUtOcDdJRGNuNG54UVBmZ1d5RUUrRytMYTJ0a0RCemtFQkhyZjJhYjRHazBjMjdjNCAyQitRUUhuMEhyZFlHWERxKzRKa0N4azgySDd3VkxZS3VTaU9EdVlWMWV2SHhvb2RnWkVNUHp4OUhtQWY3SHRneERGc3pOd25tMTRmIHJ2OEF3RkJ3QWRpdTZCM3d4VXNBbzF2ODJ4bnhrZDJnT25qNjlRMWVMTFBTbHRncmRQOEFoMm95RDJTdVFKSHZnWVdWa1h4bmZBanQgU1p6OS93RDdCaFB0Z2U2RndwZGliVldjTlZReVMycnlQRGNWZHNobEpiRFhKNWJzQ3R6RXdOTUQxL2c4NDJmYlVFd3pveXUwTE5RSCBPRXV4emdPd0FQMzlnYWl1VlJ2T2JxbFZocUlyb1g5MkdYNDV5SThpdXB1Skswak9NY2M2RjNlMkk3K0I3c2dQMTQ1dmhnMHZWOWQyIFdMdG9XMFdUR1ZLNXlhZGJIQ3QzWXd2TW1ueXBiQzdTcDYvYWwycDRkRHRTdjF1Q2VZRU5HdUFuNy9admRJU1FaLzhBcjQrQUFQeS8gV2xQZUUvdFdrdHI1RHdvMVhzNXRsaDBteUxZcWRrS1VqWWUxdzE4T3lQbERodzQ5Ym5OcWZQZ3pNVmtvTFppZjliZG9nQi93R0w5NyAyRVQydGtyNmxpV1VHdUFsRXJTd2drdGd0U3EzQmVNTkN1dkZMa1c4QTh5R3lRMXRQWkVjQzQ5dWRzUmlsb2pOakNKTytjQlFmZjM2IFhpbkRxc1dZY0UwWHFFYlpsWGplMDhocXVhU1dNTkVyVGdoMWZNSVEvZVl0L3dBNGp0ckFCQnpOc3c0S1Q5dGtlTUdBK0ErL2UzU3IgZlpsV1I4TjJaMlFLTTVIakdHTHhwYTVYWnlHUXhBWGszd0pLclRScmRlNGs0b3Z0ck42T0YwYTdUWkRmanF4Y04wY0JlWTRiTlZaSiBQTW1HMjJWZFB5UjloVEFLYXdsYkdoanpDRzRCL3I3SkJuMTlXalVZdCszMWRYN1Fka3padllOLzREYm9EZ0lDcUlOc3RCSTA3VjdSIFlhdUNjTzZVcHR0Z3cxTlR4WnI1TFEwamZvWkNHK1RJZW1QaDhQc3NuZ1ozQnNXaG81enZmQ2QvMkRmOS9Qb1BSNVVhdlg0R1BrMlggYUY1T3lIZHdkbEUxK3lEV0JlY0t2NVllb2VHd0dGc3dZbU1temc1OVg3NEg0d0xhQmpOdmRYZUEyQUFmOEJoMUR2a2lXa1BoSk5nViBLYnNLa1ljbmxGZTJFNGNicThXV0YvRFlGdHdmRnVHdGp6RUZ0c0RFR3lvd3g4ZkJoUHVrRTJOQi9md0FEd0JRaU5ac0NIbGRLZGxSIEwyYThUR21PV0ZtazR5czl3NEpHVGNDOXZZa25HZm5OT0RJbVBHTjJ2Tm4vQUVQUTJ0c2xmeFlleW5yVTdNMXlIcHluSGlIblYrSm0gQVh4SWNuS3EwK2gzMll0aDJTMEREVWVyL1VQVmJKOW9WeVpNNGsxY0VPSVAwRkI2WVRRdjJBTXRRYldtcUIyVzN5N3FaR2xtQjJoaiA5WGJLQVYyRm9sSWZlejVrTndUeDRaNFBkNmZoakhtci93Qk44Q2VmN1JIOS9BYkFBRzZQcE5EcVdIWHpHcjJSdjJsV3BaTFpIaHUxIGdwTmIyMG0wTlkxako1QXd0aDNEa2lmRE9IU0xiTzJ5c3lxdjJ6dFJKU1RaekUvditIMEUrQVV1V2hwYVFobUVkb1Q3a0pLU1F0NmggY0VOUFlKYUhZeWJYdDJsRENlWVF3OVZ3MDlnVzJydGY5d3hKdm5HV1o0Q0JEWno4UmZmbDkrOXhaWnZRR1NONktSYmtNZTMvQURWdyBrdWJaeGpEMVlzRnpKUVpLT2lpWk1wVzJuR2I1MDgyNTUrQjZhVlZjbm5LL2l1UU8vSm1YWExCTXFXSzFPMHltM3h0cjFmNDNKK0dMIHRwSTM3ajdKaXlHT3o1QXhPbjhSZURBd250aXk4bk1jZUQ4QVA3LysvZ1BXTFVoWUY2V3FobjU5eUVodW0rNlh3SVdSekZoVlJVOFAgYTdEcEY4cXVzQTlidmtPK0dSZzN6ajdZMUo5RzRXZ0xyTW04R3dpU2J0MEJzSFhudmxvNHNXTEd2bHRLcEpQU0dSa1lhMzM1SVUwLyBkS3lGdmhqamJoTTA5aHpLY0hCbm1BQ0QzUGEzd21zby9tM2pmK0FvSi9nTDhmZVV4SHZUVHdMdXlWUGgvTXJrYXBTN0ErR3dNSzJCIDAreXhiUUg1Z1pXNWdmdkFIcnFmWjc1UjRjbXpmcldlOXUzQitBZ0g3K3dkTllSTk91V2F6S2lPR0tlbW1kQ28zeTlTOE80NHBqeHcgY3VHQ040OU14a0NIVHRNcXVROXlLK25yTldqeDlHUlRLdTFKazlXM2IwalVObHVOSXE4Ylgyb0lsYUlFeXRxVmhJOWUycFI5bW1LdiBQS2NwbzQvTU1CNWtPYVFtYzgzNEordkEvQnBOMkJIZ0FmZlFCOStRT3A0b1VqMFlNc2c5VFppNHpHYWh1OWhNQ0huR096NTVvMkg1IGpCTU1HWHhEbVlNaXErYkJPVDNuaTdSK0tyUjJRNkFQb1A4QXBGc0I4OEY2bUwwMDd0RkoyclgxblVCYXJiWkMya01IQ0NDOEhzWlggbHloY053cXREaHZpY3RyNmZPUTdRQW83NXhscFE2ei9BTjdZNy9zQi93RHo2MHR0bUIzSkgxZ2R5OU1iWXEzUzdKSzlIMCtOU2Z3OCBYS3BHVWgyUXdUSHg4b2VxMDlnaHp1SDhIL0dhSGFLTU1PT3hzSnNJRFlBRlJQcC9wQ2hoY0x3dTJta3FacHovQUhsR01sZHNacUwyIFZiSG5JTU9GeDVFc3gzSFNWSTNWeWlsUFJBeHhzMTM1M1lJSEdOZmRuMm15WDNNc3VZQnRxd2RTMXRaS2s0VmRXVWRrR3VFU3E1VjggV0VlaUdOUU96bUVPcXpGZnJZTFZMY0FGNXNnbVRmRmNZOVBBUkpwTjQzKzNmUDhBQVVFQUV4M0JQQTJ3NFp0akdLVXRVTXQrWXp2NCBkN040dWVpSzhyYnc3NEhyZXlFL1MrSFZXMnIxS3VkczRHTHJNbURxN1R4U2ZQd0w5aDdjKzJDSFR4NVNrWmllMjVxMnBNdW5pdDVLIDZRVzNaZ2lMY1VEd01wVzdBNEI2M1QzeERZSnFxUGNMTG85YldSbktOczNzMzkrN3VyOXVINmk2Z1NDM05ybHd5YTBxQVB2QUZsVWIgQ0h0NUtTa1RJdGpDUmNXeU9ZTGJJNFZ1dDJBbjhEeDV3WVJrYTBHZ21NdFR0ZC9VQUQ4dW9JRHBqSXNiNFJqMjFoSCtiQ2s5MzZvZiBCOC9BNkVsbGZka1hFR3R4aWFkYXh4empvNC9JWHVOMFI1SE1qaVZvZVZVYnFyVzBjT0FsZEVzamkxVEUxNVRZMmlwYnRzYTJySEFPIEw0aVJMZzRlblU5dDlhSFRBdTNpaUg2VmdKaTdKV0w5M2UzODZ2b1RCaDlyT3N3aTVtS3VsQjhaQ1FGM3lhbHNKSEpYWGNEdWh5VU0gdGJhYnpCYnJkYlc3SERwNWdHcEo5RFFiSVJsbTBHamMzaDI1dmgrSW40QUE1QXdQeDJuMTJMTW9sekdEMm9OU1pNMkpGcjJvRCtsNSBmWWI0UFhHdzJQRVEwL2pXcHVuNlR4dEhsYWxpUWd3MXBuRmxCZUIzd1lLM3ZkQ2ZVTFlBQUEzMVVUTk45bDEzUTRZVlRKdlN2QXJGIEpYbWhxWkxBc3lJcm5yWTFCUmEzcDhQRCt1UThiSThlZEJReWF4dWhQZkRsb3V4ejlVSDlUNTgrdmV6a1FFT29lMmpDTHViY2h4M1ggUGN0N3Rwd2NjY1BMWDAxNGR0Q3l0U1RIVDFBNEl2VHZuc2JzZCtGcVREdU41TU9DT1VwUlowNVdsZ1dRN1ZleWFxdE91YTFEbCtPeSBMYmdWRGkzTjRQVTVNVG9RZVphdUtHUFpKK2t4dzlzQ1hlUW1qNFBCbzJFZUdBQWZ3dzVCajA1Y3V0NjdGV2hrbVJiSTJ1MCs0YWxiIEpGMk95L0Zodmx0TUo2MEZ1djVsOEdIQ2JEK1lxdmxvcVRVeURkUW90V3FBWWoyaWJDSE9Bb0w5c0MvejZvcTZ1Q09VNHV0bEhOcVUgb2VVa3hpMjVHSy9FTGRqSnRnaTFlSDd2bjVVRGoxdUNlSHdEbmFCNTdvREJtTHRTWVQ5L1A3Qng4LzA0RWQwSVZCRE1MY1hGSnNJcCBUNVB2UU5yM1VBV2ZHZ1g4cUtZVDludFN0b2FndysvSUVOVjJ5czN3cXpESGplMHI4UllIL3dEUGZ5a1RCdnFJb2MzYUVSdXpTeEs3IFNKanN5dThyeDU0WlNZb3E4WkcyRmkxeEZtUkZkcVRUdXBXVC9seHNmVmpxK2Q3Rk8reGp0KzFpM1FmZUZnUjdMcDkyY2xkSnBPc1cgaFZVa2doWHFld0x5M1VxR2tXTlhLSGFEN01odUZ3UGpCdmtCdnRxdWZ2S3ZwZlp5WVB1aWI3dXZ6OTkrQWUyRWJIcTkwMHRPRmIwMiBtMkVOZk5aRmVzdmRBQythY0d4YnUya1hlcjdRb2NqZzNpRTlibVZoeXFmWUNtY01FeGhSRFprWTRsRzlPNXhnOCtBeEFiK3ZzNXNIIGo2ek1Nc3FvTENOcEdiREdsayt6bFdRcHZrV1hFNVF0dUNlNE1pMnlXb1A3Y3R0ZnZ1enN4TVdoak44d3hDSEFDRHo1QTl6L0FFRXIgZExsS1dzVG05VkxkQWg4MWJweElSN09RMWVXWWl4V3phMlJmaDQybUhaYTJIcmdKdEh3SGhrV1VZb0xSbVo0TnBPeDgrMzgrQVFkLyA2SVBJNlJrTjJjWXM0OWM1U3dSbmVXK01keTA1NUFZY1hZb3BHU3BaYm1XOXdnNVJ0WVhIRjZHVlUyWGFLTmRkamhNVDhxUTdRTXJPIGpXMDdQakovRDgxWVVPd3VFb1cyQVh4YnI5Y01VUEQyWndaQWM5UVBQQmdtTWFHanUrai9BSXUyQUI5L1AvNWtsZ0xZOHBIcE94dE8gVnpXUmRrVXhVcll2OGtZSzljTzE2UVUrWVJ3N1Z3ME80R0JrQmdiZ3JTQnRnempIbkVuL0FIOGZRZlArZkZjeXlIUW9DVzNmTkdqWSBkTEI2S1UwZDJRNHpFdGdVTmhQY2tUMDlrRG1HU1lRaHdVT0JkTk9yYXlNRitUQm16ZkJ6NzgvN0FnZ0g3cU50eUdLRFZnSGJSZkNaIGtveEoyL3Q2OFdFNEpwNnNyR0ZiZk1ETGR3T0RKeHZnYkErS3ZCaGxYbEhqZy9OZ2lPZy8yQUFnNGRDZ1liT1l4ZGNsd3V3a1lNWmogUzZGNDkxbWhkK0JYUmxsWkpva2plZEpNRG5HWlE3U2M1dXNNY3NlV2Zid3puREVBR3llbWRXZGdYWmZxRlp5WUxKRWdLYVpOcWEvYSBqNVM5STkyazFkcVhUNmg3T3Q2a0RENG52NkhPN1Bud2QyTTNkQ2gwWlpCMmpWeHRIMkRnUCtyd0RwYnNsZ1EwMUhoOTBNNlNOUXc1IHVYR0pPMWYyYTR5ckcxSGk2NTFVSjlrVExJTVVQdyt5VWRENWFEVzFsbUtVMnpNMjloT0RuMThCYnA5K1h6OVJkTTd2QVVzR283NGQgd044RXRKWlE5VGpDd1djeVZmNVFvN3ZsWHcxOWJNVVBNVDBQa2dORFlMYUNHT1RxNnZXZmhEZkI3ZFBuOS84QVBIK2cvVDIyUW5kSCB6bVBLckhUd05pbUkxM1V1VER2Njh5QVNsODZjN2s3WDJRaDN3bnZoZ2hNZ3dMQW5JNGU4bGxYdEFuYjd4YVBObmpZT1ArM3VBNldGIGlZeFNPMnlpVFJoNFlKYmowOG5PU0JjVnY0NTRMVVRYVnFyczBxM0RKaEMvdjVMNUJQOEFoeC9Wdy9rbjVYYmlWNWU3SEEyMjAxYUggS1AxQjEzaTloRVZ1c0FQdWtmSUhPWG9iOUxkVDhnam0xaGFldlZPeUFscytoM3RBMkZ4ejNET3lrOXBkVGVUTEpvK1dzeGw1ZlZFZyBlckxBbk92SjZ5YjBxZlMrMnpxdVpORWVzUEgwRDhtSmtoQ0ZLM1JKVFVjdEFXSS9vcmtyTGpMUHJwcHVoQkpjUnhSMmtMNnhJa3Q4IE1SREZRUkVqSnhNUUNrcVZuVGNQN1p2MGRVVEZmcG5iOHBhWW4rVDVGSC8vQUhDQi93Q250VE5wQTdNQXpQdkFaRTBTMWJUVlo1cXogWEg0NnYvSU9YSlkybi9Kc3U3dU56SmRrSkx2QUpCMkMyREZTNmxzYkdQTFk4UE1EN3c0Y2tybitRbkxaTzh2eG1NKzdPNk1meHQzRCB3QUFBZmgwOFhYZW5PNDJwRE1wNUtIVjdHTXVPUnRzaFRtQ3hhUXJ2aWU0QitZWFlIVzE3bFZTRUtsZUhDb0ZsOFZ5YU1kNFQ3b1AzIDVCKy9BT2duVG02NStwREJsR1FhTkNGN2ZhZ2t0SFNheHErdm9jcFd1SnlpbDdBTWZxdHNsZ2YwK3BWWHhuMzNObXZCSjJUZ051NHYgMkdDRHdFQXpyTVgxdGpPRWxKdTA2M0d0NXFxYllhdjFGVExBWG9jb3B5aXVhMzQzRE1QdDJCeUYySThDMExhM2daeGZiQ1hoRW1xeiA1OEJidkFMZFFVRUJVY3V3MkFiSkJTdEo3ZHRGSTIweHRzcXQrN0pRZnhmUFRaQXNyWk9VelB1WnpGSGx5b0ZDS0ZMcm04aTFYUXF6IDBwUTdSbVR4NUt5ek5ZeGh0cTVDUzc3eG5TS25tT1VWaHE4cWhqb2FITWhwL01GcWNoM0JXbityN1J5WW53bkhFSHNBQSt3WW4vQUIgTmdFTlZHa0d4REZRSnJoVXFlbWtsS3dxdmFqMm44c25nZWJxOXk0TDRlMUhBUFpFUEVQZzIvQWFuenhZdDVXZndtN2d3SDM0QitwNyBwMlZuRDB4dVNtU3NiVzVjQnZPRFY3Vnp1MExjeWh5M1BIS3dqdFNwNCtrbVJEZkh6QWd5Y0QrZjJyV1Nlbk9yeWZCa2kwY1RuMEYrIDgrZkFkTEY0cWNPNVV1aGhvdGhNalZGbUc0aVFIUTErcHcxSWdaYUhZMVBWZkRjRE9tOHh1QzIxZ1NBR3gyUVpXWlJYSi9oTTI3QXogL2dNUGJEZjRURnFKSFY4OEZ4YkYweWdlUWNSdURiNmJVYlZQYTFKZ0g4cmwzTElsalFJcFQxRVF1QTl5S2pjTkhJbUl3eTRJYkpyeCBianQ2Y3djV2p6OHRiMHlNZW9wU1pESklhcDU5elhLNDd4RjArMWtCUTZyWDYzcXRhdDh4WkRCTU9jd1VvS0c4ak5yUm1aSENiSjUvIEgzUG4xOC8wYktjTmtYS3p0cnVObk1sRHErVEdzMTRHZ0tmaUJ6MFYzbEZIRG1GVjBteXpLM1gvQU9RWDZXbk1oTkdGRkxmWm5oMk4gOEg4QndFK2hZb09LVHJkb0ZtY3ZTalhKcWh3bG5aVmIzSGJLZERxWmYrR0JsWHlMdEI4SUxiNXlTYUhYdysvT0VBNGg4WnVSWFpzVCBuaEFRRGdHUC90QWtDSEtHUldxOG9TUUxnUFhCSnMxSE1LeU9YdUFES3B3b3I4Z21MWWVaVmZNQTlWMlhhQ2lxN1l6SzR2Y3puQ1A3IC93RFFmc0hVS3lveGtVdWVXTHE4ZUFaeExKRTdqdWYzYlNuR3V6Z1czbnBqZDRSV1pHZGFCZEd5dEdpZ2tqUXJRcmIzV1VOa2MvTkwgNDZNSS9yMDJMaFNZR2FLeHRHN0FTMGcyRWprZ0tmRG1vbG9NVmlsRnQvMmdQTS9vNmRBckNmZ3lJd3Nwajk0ODVqdi9BQi8yUElPdyBMRWZNcmhJdnRWaTZsV1dLQTB0TzBXTFgxMXVPbStIdjhxSUI0R1BNSnpJbm9VdkZqdFRHcnA4SlB3M1I4ZVJyd2IzczV6NzN3ZnZaIEJRR2NqbkhoalJ3THUrRFkxekpxR1NMY3dBc0VRT214WmUvQjBDV1ljRERnNE9BYjhnSG9FTVlzcTZIVURNYmRxdWR2djREWUFLQ2YgMytTWDh1bDR0Tm5seERyRmtmTFdNYWtJalFZYWJmOEFtVzBCVTBORE1NRU53cmVZWVQrSE5XM3p3a1BiT0x2SXdHN1dpYjMvQUg4KyBBcUxZTmdaSUd5WE1ZdVhSR1M3TU00b0E1VU10dXlhcGNzaHl0Y3JXTzQwSU1Lb3R5cTFiVzV0WUVyVnQvaUhjQ2FzR2pZcEE2ZHc4IE5OdFRPMDhWVWs2UzdDeW5ZYXZLNEc0THcyYzlwelhtajVoQU80V1JNRDJSWDh5Y3BPQ0dEN1p2TzFyTHo5Mk5nd1A3L3Y4QWlBNjcgSTRleENpblh3SE5yZkhPbnpMUnRoSC9pUTVFWXJtNWJ1dVFDeUw2MkhEbUpnY2VodFhEL0FKeUdzdk5YdEFzWURDSkpzR0EzOC95RCBmK2lTeUVldjZyUjg1akY4YlZRSUVZV0lIb2NkZWhOQjRTQjJjZ1k1SkRaUDloc0dNR1lzakZjb1RKN0lFZGdlUGdOZytnOWJ0UkdZIGxVRVlmR2l5N3lTVW52a2JFbU00OVY3Q3lQbFNsc1BoMDh0dUMyaG1GdFB3Uis0RmxnMlRGbUtGR1pHQmhFazMrckIvUVAzNkNXSmcgS0NOalVzU3hMVWsyMEZ5VllsTHlON2w1Ulh3c1dPUlpSb1ZqQXQyY282T3I3VDRaNFVRWlluODBiQUMyQnlUUXBuTWp3cjFlMlp5bCBjamgybHJTdCszb2V3bkN0OVBjT1ZiUzlYTVd0K0JzaGVaTmg3eEJuMmdCZUlheXN2Z3NtTmVEWnNJOGMrZmdISDZpKy9Ob2dsMS9sIFBoNVhTTHNKVmxXbzBhdzJoWVRKWjlPV200aTlQYlJGWk9OMUF0Mm9ZaGoxdFY3d1hTN3cxbmxPMk02T2twSnZmK1BudnZ3REIrUmwgNmFoVU9lUVNReHJKYlh4U3liUmlrRlhPTUtZWjhzYTR3SjY0Q0ZqclpneHhCUDJOdXZBOVhNeEdXVmY2TWM0VFYzZDBBQVA3K2VBZCBSeEJzUjg1OHVDdm1pNWtDeUtNbURZa2ZPdFNwNmNNVktlWVhJQXR1TEoySGhtRS9oN1UycDdicy9KbnhYc3o5N3V5ajkvZndIc0F3IFB2eXc4akdLYVVwcG5MckpzeUdLV09TTVVFTGJrTFpaYzBBRng4SFBJWXRZeEkwbUozWW84VmFjRGJrU1Eza2lHM3hBc1dlYyszaGEgNUQxT3IxOXlzeXNvQ2toeHJ6c0YyQnkyQjhvSFVCWVUwWEtySUFtclo4UGNGYnVESW5qdzZQdUd4b1l4NTVSeGc0YkNlZjhBQUFOLyAyRHBuVm04cjZibDJvaG5tcTJuWm9HeHJDSEIybTZGNllMRnJ3R0ovcVF0aDZUK3lBd053ZlQrTTJnVTROd20wZmZmOEY4QnlBL2owIEJ0Q0crTnRmMzltdVNxTnJFZXEyMVlZOFpNRVMxb29lTFhLTERqNjNNR0U5OFcwOWsvaUhUNjB0U0h3WkR3R0xQTnZaNDREL0FOTmcgNllWVHZtWWhzQTVJVjdJU1NWbDZiMXRoWUs5cE5mRW9Zc3AvRkE1Y2ZwTU95TW9leUtmVDFWOHI5U2FnN056eFhHVy8rRTlQRHh5QiBBZnQvb1RyS3lUU05NaGwzVUVpeHlmVU5GQnEwa2htaGtaUzBFS1JwN1F0aUlXV3V1MERxNHBZMGsweWc3R29PNDBlUXlqMnpoVHZKIHhobjhEQnZCczhYMVh0czRYOGd3dUhzbXlFOXltUlphL3dEa0NJeXhWZGhpb1lmOFZPSHpDN2hEQnZuOVNreWZGeWZPSGJ6aitBQUEgQUIvRkJQNFJwZ0hZZ1pURDFvdVg4YlBaUjY0eFA0WUQxNnR4VDZSYUJTR3Y0NHVDZkRtRUZ1MUZLOFBuQnhneER3V2Q4U1RaczRBQSBmb2ZmdC94YWpBbnVHVXRzb3NETWsxam1nU1ZaT0RoYWxrTzh6R202blBSUTYreVUvRHVEWjhQZzFMNXg4SjFuVGJRVTJQWlRaeCtRIGY5djcvd0JZdm1LdmNtRE9nVDZUTmg5aENlMVluekRETXNZOFdBbEEvQTI5RGg2a0lZK1o4L1lZVmIvdFl5b09iZjJEWU1jUDMvb0EgTUluSmQzdkNzemVORWVQOWI1LzBINDZ6Z0JKUVlFZVR4aG11MXVVVnV1WHFxRitlVzZXNnVEc2pOS0o1NjdyK3NpMUJsbmZFVDN3QyByc00xWGZCSXQ4TUw4eGJtT0RJWUh6SU1EZm1vUHdhNUdqbkp3MkVkam43Qno0QXY5RzE4RHlsUVprMnVkU1ZTdjFZNmgxVUpiRm9NIG1UcVFkdzdrZXRnQzVRdUhybmF1NEZ0Zk1JNTRnQk9lMzVRUmtZNDdPd1I0NENmQWZRZWZkSjliZUZlNlkveGJCdFIydUNMVzYySlggakszVzlPT0RSVXJZcnRESlgrSzNUOWNNaWZUemhjVkQ0dHFQaHVkb3RDTXo3MmI0T2ZRV0EvNEJCUDhBVnRLL1c4M1dSWWlTdVdyRCBrMmR6QmtyMXc3VnA5c1BwUm9FMWZFTXNHOExiSmFqNVlNejhnTnFQN0xPa3Q4ZWlZUGV6ZXdvUElFRitQZ0g0L25sYloxTUl0STZoIFQzdmlJT2ZBcFR1Wi9yYnhLQTJ4WVUrTmR6VEJra3pta2w3Z3E1YmVuTmY4UWNoczdYTzM3OTRNOWJXM1RxUkR0SE1ESzZmeEt3aHAgaVZNazBqSE1PRGhXWHhYelQwVWxtRTlrTWZSRnRndFE0QXIvQUFPTGF6L1F4TTVhSnovcndIZnovUldQc1JMZ0MwT2VrR0ZMTitHUyBFeDBuSlgxU1pLVitlY2tzQmJNR0puSkI4enRLUXhuWS93Qkw0K3dSSkNjK1g5Ly9BSDgvaTJ0UkZUeklwUlB1UU1reVFLYnFRUUxZIHRDalQxb082SEtpNmo2dlZ3L01BNWhiTUo3QWh0U0hjRStqNWlNTTltWm1CbS9CNytnZ0g0Qno3Z05TOHN3d1dNeWg5aER4bXFBNEUgaEsrdHNrZ3NZbHRGVGkzMkhYNGN3SGNOblgyUTVaWTlTN2tZVkEwV2dNV2NQT0hBR3djQlBnT2ZIOWFqQ0lYS2pJZVdkenRsTWFvViAzWmxyUHl0VVBObWtNdVVoN051M2pUemxlWkl5OEw0cng4L2tkZGhpUmxocVBtRkExa0JFbDNwL1ZGcDdxOFBlVmdyME8rSXFuUTVUIGNIQkRaRnZTWE5UMlRZV0FDODdZaXZsb2pCbXg5a3pnR29nSGQxQmZ2MXVBdmo1aWtoM05hQ3VoMG1uZ2RhUzNFMGozOVdOci9NbFIgUzEzSzdnd1dSRFpOR2FlaC9NVmUwQ2xCc2dtVFYwT3pNRWMzc2xIbndGdTdBL0FNTVg2dExZcGxIeDBXN01mVU5TYXM2bjVLbXJ3MSB0SHB4RHEreG5lbTR1NFdRSDVndHdxdjJPQlY0RUhnTVdTajR6TFBOdjM4L3NBQStBdzM4OHJQTG1HV0RPTWdwa2t4WmVUR3NLMkFPIGxaR1lXU3h0UVM5VXJrSHNCd01KK29TMUZ0aDdxVDNDaDFYL0FGa0tMWDVzd2RqaUNBUDBHL1B4NCtmNnpQemdVOFFzdUVYL0FMaWsgR1dQUC9MMlUyUE9RN1FmTEFoWHR6emZoaXVPT01iVUkzSnMzdVU1SzBNY0NiT1ZDdWswb3dhZmo5TTIvVlRJMm5uRW1iaVNLT2ZHQyBXSHFZbzI3Rk1ZUG1VOG4ycGpYNGV4cTB3VW1wYko0WElyc3d3SFZ4dmZENEIvZmdBRFlPbm1sbkE1NTR0ODhCWkt1ZkxMc2xsaUw5IGtWNlErWUtjcGNXVlpGSDhETUdGdGJUMlNuU0RBQmVPNys2UG1ub253bjd3QVBuejZDZ2dQWStrempZbHRySU5BdWRlamJneGNKTHUgOFdwVzdSRWNIeUxMYUt2RHNCaVlZaHNqSml5UEY4V0JkTUZrcC9nZG9WblpqeHZmOWZmUWFpQWNCQU02SEhkYlcxR1VuZWR5TzFrVyBSS21WdWtCMlRKcjlocmUwTlgxWlNxdlEyQVBNY0xncXVZQXBQWVdEZkZzbVVRbnhtL2U2dWVQMDd1bmtBQWZ3a200clpzcVNJSWNjIDVGRFNia1pCalJtc1pidHZSb0ZNRHcrWGJJL2JnTzUwbURyR3ZNa3NFOVhLaS9PM3RjcGZPWTdsK1cxRHBjNEdwK1lCZ1ExSmIyRi8gWVRCaDJWK1NBU2tzOFZEajVqSk1wK0dISUJ6aUg4RHR0Wml6ZkRRVHN6Q3JyUk9lM3UvVkVmUGdOL1dJdGZNTnBYQmNpZ1haOHVRQyBjaU1GYnBJZkgrSUpwTEljWFRlbjNCUTYySFQzeGZobkovTFVmYzlyYUxNZVhoSjJNSFVYZDNueC9ZQVBYeVk4VWZaWkJKRnJtbU5zIHlXMWtyZGdyZTRLSDAzNjBiSWxYSnFFS1dNbjE5RDJpWk1zaFBUb0w1WVB6cGpNczJnaDBiN25BZFhlQWZqL2FMZ0w5MXZBTW1aUFkgS3JQRk9mcmNDOG0zWjRmSDJ5SFY5amN4Zkh4eE1jd21YQ0hJSWM1Q3NDQnpEYkNndTMxbXEwamZBWjkrUHZ6OEEyQkI2Rkp1MHNYVCBCbloyTHR0NFdGWWdERnNxaldSNzdlSXd0ZDFpYkg3Yy93RHdqeXErMWI3eFdValJ4ai81ay9iUmdjeThIeGNzVE96YzFQV3dNQkRyIGQzanc3NEg4d2ZQaVdocTA0ZmNOVjg4ZkE2K3lJOEJ3bjF5NE15TXIvalA2VGFQNGk5c0g3M3QzbzhJU0ZOU3NDdDU2a3lWdlp6UWUgQ1dGcC9XekZvVWpjRVVwMmJjdHdwL1RHWVE1bmVDSEE0ZjhBQWNGbXpPTDhtUjBsSkNmcjkrdjFCUVFDQ3NjdDBlSytwYkJjRFhZYiBwOUl5YXVkNi9jTTdoRUlvQnhpeGJVd21YQnlUWng1aHFVYmd0cTFROVFMTFErTFBPRWtJNytmUC9RZUE5V1BSNjNiYXZUMldVaVpOIGp5MWFHZ2lLUC80bGRaRjIwUW5PZGZSSXJlT1Q1dFZpTHNmY0xUVmJLUUh4ck1XY0xWeFZab3dWMjJNRmdCZnFqNSsvODh3WUFJdHggbzltTnBab2xDVnRDZkdLT1BlVnU2NUp0dTBncmp1WGRQQklyTHVQcDB4bW4yNDJqVWs1NFJpVnBVVWloNDNXVzdObGJvZUFpTGRmTSB5cE10OGFEMlNOTVR3NlR5Z2xXOGdUTUZ1VmhIdmg0R0llb1JrY0lkWGh3YytqMzI0dHI3eUs2Tlpoem16czhiQWVQMUcvZGRsTjVnICt3YWZzNW96WHkwU1NpQjdJc0ZrSWRmaWNDbFM2Y0s1YVp2ektmRHpFOWt4NE8rTjU1SGhMSlBuaXk4dkd5SklQZnovQVBZQUhSVmUgQy9ETXZsQXk4ck9xVU8wSVkwVFI4TVBiRXU3R2hEc0lXQlpIQVBka09HdHNpL0R0VFMwUGdUa096TGZ2aEQyelpLdTRPZkFQejhmUCAvUWNWdUxTN1FWekRzcnErY2s1TkkyRWFMSTh3YkhzMURLSWJGRnJreXY4QWJkRFpFSVBZQWVqenc4OU9yZmE2SEY0ZlNnbUx5ZndRIGQvMy9BT2dsSVFWWEVaUEc2YmdhZmZraUo5czd5WUpsdDBjVXdYTXZlYTQ5eFJiYVNWTUhFTWlOam11UDFHSlc0UEp3enlXMzd3dEQgdGE3RThZeUV1dm55dkE2UXQ2YjdQcUFiU2FRWXIwYllCYmdZRnNLV3pnNDh3bUIzQ24wK1pCZ0QxSkhtTEl4OEYyWXpiSUU0UHNCLyB3SFFkY09vU3IxZXA4NXlNdFZ0R01uSlVsNnR5V205b3B6ZEJiWkZLc2cvWjA5a1R3Ni8yNG9jZ3BLcTJUc3dXMFZtc25FZzJFNThBIFFmdng5KzZOeWxtU09jTFpubmdRTzcxNFM0L1RMVXZ4UGlnVjlYRmgwK1krUXc4d1BQTVFWSndRemtORzRHTEdJMkNUYUpzNkFYMzUgQlA3Qno3cVhzd1dyL1NXTmNUMUtHNVoxUzFrajJjcTRSS3JUYWxZWEtMM1FtQi9ocC96dzRPZlI3NERUMW5EZEhrWUR3ZHQ4L1ZDUCBQd0h3QXhLem1LT3BsYVN5QkR6bEpjZTQ3RGpITHRvYy9QUDRTejl1YXRDRVNzMm1GMWtRVnhIK3h5NThnZjZHNHRDSGRWdGxWbUJzIFkvTjB5NE1qdmxaWnRuZ2FwYlIxeW9OckMyVExpUkJCMlBQRjZlU1Vxc3lXUk9KQzVCMmVlZ2VyS0tFV2t1eTRHY2pLblIvWDZlczYgOGtKMXJOdHVSeGpPTTA4Ujg0bEZ5Q2dWbG0xSERCcTZsUEp3MlkvSkRaK1FHYm5ITm41V0dTanpsR0FKbHdYdTJoQlJXaEx4U0JZUCBxd21acWFuWjBtcFU3WTlXRlJUU3J0QTRxQ3RDOTNtZ0t2NTVOZUFkWm1ZOGtnaytTWXRMeWZ6L0FNTjFaTWVMVzRGQnVFOURjSXlTIEdmTElFdEdkcFhwZXdueHlwR0lCcEl4YUNlNFRMVmZBNDhQcWFRNi9yUUhaRlpFeGY1TUJoSGFrM2hCZmtEZndQZ0VISTliM1FVUzIgcUs3bUxBV3lpZVJSM2diVzZmYkJqczNjY3FVdGtBOHhrdFN0dzlvVEFkWnVFR0NIUmtXcnlkR3N3UDhBZlFIbndIQVFIUmZNeTBNeSB2dUI2TGszWWs1VzlsdFBGblRCOHVIRnNaSWxLejR3aHc2ZmNFTmtjSzNWWjQrQkJNREdiK0hObVpnZW5qWkVmZnorUElEL3NmaU83IEZzSzZPU2VMQm1YOXFFWStmMkY5cVR4S0VCQTZtckdsR09Zektyc2lHWVQ0ZmVtdjlQRUhBbmIvQUxWbi9tay9pSS9RYUNBUWU3dlIgWEUyWkdCZUVxWlhkOE00NDd2U2dZc08yL3dDV3o1SHA5QVF5QlRsdEkzY0VyTDFPM2NjbXg3K3p0cmdBOG0ra200UTYzYlk1aTJxKyB6amRxU2lTa0p6N0lUaDdETUZ2bFpPUUY4WHpESUlaSmdlcnc2clphL1BwMXhXUmhSb0o3RnpaMjMvWU9mSDkvQWRXVnpHQjh5V0NrIHpTNVNlbThsWHpzazJ3WW8zUnpWK3ppNnZiQ2liK05vZGtha0pnZGV3Z2diQXVuNWd4bVF4ZkpnZmhQMy9GZlA3QUE2WDJaVDdvNU8gaEsyaGFlRW1Vamtrb2hnQzFWdkVNRkpURFhKNHdRWlllTmtRNFpEWkFLZXBJNmVUclBUbStERVpIU2NVazRBeFB2eDgvaUF4NkdvNiBYQURENjlQY3FmNjN6VUt5Q285cXprOVRtRkxhU0dpVW4vTU1jYlEwUGVJUGI4OTh5cy9vYk1UQjRmUjJEL0x6K3dhR0VUcVZZM2RjIDNLdERpLzRwWTd1eDdycWpWYzJ0SkhWZzJMaXZoV2k1dXZPN0JMNHZpZ1BEWGZGRlllR0QzQlBROHBxdlZKclIyc2hoRG1MRERyME0gcUI3Y2NiY0lkd3VDM3FFWkdBT3F3TFFVcDNCbmtvcnJPSENmTm45LzU4L0grclVPZ2VrekxyZjBCdHUxYnM0S3lEYXlYNnJ1Q3dWTyBIOG9UTFY2Myt5V1F5WFduOHdPTnEvQWFqQ05VQ3NMV1ZsNDFEK2NxTHovYUlCNENvbXBSc3V3eURvZWh5bWN0Z1UzVEc3ZklyM1RxIG9KQWVyeGJaWE1xR1BpVEhBeE1jQ0UxNHhYN01WWmpOV1lzV3piNEU1dGg5K3h3eDJEcmtyOWdxOERYOWV2Z3NiVzl3VzBITnRrZEogR09GZXpHaW14TVVYM1FNTWxEM0Foc2poVmJVKzQ4NE1WbWpkME9jdkFUR2srQW9QOWdBQUQ2NUE5eHltVENaM1JJVnh5UEVzTWpFbSB4OFJxcEZlR3Y3YUpRTGJ5Z2hNSTB6WjNrd3FxSUFYRnJ5c2dteFFIZzVjSFljNHBxLzhBZ3VWaEliSUh1N09RS3lEd3lhKzc3RGZDIDlxQ2xPQytIcCtaTWhtQ0syMVFMUVF6aGhHSnZtTHp3WjE5clVmdGdQOW9zTUQ3ODgyQjBmVHpSWHVYUVV5TnBqYlVtdHhLL1FJR2ogNnloT1JSM3ZpcGNQaFdvK1BrTkRJZkEzQ3BVZGJacWdGcTdNdFBCdTdLdU9Qd0IvWVA4QXYxSjVoeGJNeDFWU3JrQzcxNm0yUXliTyBZcXRYWG9jcXhuY0M1QjJDeUxJaGg2ckRweUhWZGwwZnlwUHJQYTZ2OEc3QkVrR2U4K2ZRZC93NnNJRHFxdDc0d21WenBWdjUyUTdRIEpSbE9PbnJsc1ZPeUlRQ1hVb3RrNUpNMU9Wdk0zRHR5aHNDamNSZ21qSzVSWlp2eGM3MVhqc0FBKy9jKzZHTUNhUmpKZ0lRaDNGa2Uga01DMEJDVXJ2OG1ueVhFbjJObFFGbmFNNEErMnJQNTRVK1BqeFhuNTZyU1ByTXhkT1pXTkxBV3JUTlZZQStFWVhqT3Y4Z2tQaWFLcyBKRHRwd1gzeUhEVzdnWkNIRlh4ZlVwMVZrMWxuYUxNR0ErRWhMVTRDZkFMNS93QUJnVlVlREgxVXdaTlFWZmJTM2JjcEQwOFZsYkY1IFRFK25FK1VMWGdMVE1Ic2lmTXhEc2hFT2NQRDFMNnk4dmd0WkoycDRYSEUrZ2dENkNBeFh3SEcyRU5TZVdHemxkSXlYOWtWeHZjRncgWTdySDZoSzNmRTNsRzhXREREdUMyaHcxOVBCdHRZUG04YlpjbTJFa2U3RGZPY2ZBQU5nQUFNVEJRZkxSem50MU14ZE5WQTJDQnM2UCA5cU01N3VoTERRcHlzRkJmcXhQdE95TUVUQVJnMjFmcDVlR041ZU1WY1dzb3h4Mk5ZNG56ekJnd0g4TWNHVExLcXVIaGZCYXlkR2lPIE5teGF5U1JYZEVERW53YnJpNjNNcDhRd2R6UVZmYjhpK1NXNDVITmMzMUczTFRYYXJSK3Q1clMxTGRuU2oyb2k0eUEzT3Bkc1QyZ1cgV1JCaGdlWTRldDFYTVlJYzZ0Q05hV3F5UFBGME5aeHF1cnZ5cHY0RHo1L0hmNUdsSGlQYldXbjErOTB5TnM3U05SdHgwNWJCNUlSNiA5TWFnZFQ2UnA5VFUrd09Cb2I1TUQvRWVKK24rbG5qRGczdlVCTEVJRHc5MEcrejREa0RCZy9qYXV5V0lwVEQxZktTZXlXUUJNWHFwIHA5UzBiYURZK0s2YnFhS05GcUw2RzRHZFBiNGhMNmVqMW9RbjNndVdZVHRCOGVyTVJ3bm5PMFd3WUFOZzJDMFdvTjRSN1V0MmRGcXYgUjJ6YVdGZGNIUkE5aEJsaTQyOXlpZWkyYXVManBjekMwaytuVTNDZXB2NmtyWVBLMjBpMGg2T25Mc0Nua0wyeFByMy9BQytrOUhUUCBHR1k3YnJ1dnAyaEd6WUluMHlUR1lGaWxVWEVVaVN3eVdWbFJ5cU1LU1V4SzdRTmpjS3dTaXZmSDVBL3krb0kzK2Y0OGZuSVVvc2dXIHJnVk80QU5HVnZKMHUxeVNiVk93REZTcDVhWll0WHFaNjBKYWUrTGN3T1oyOHhPb2R3Z1Z3dC9hT1RjNDJSMlI4RDZDQUE4QjJCQmQga3gwc1FXREczZGxXb2s1V295alJ0STFmVXVuVXhEUXdObmxoZG9NdGZwNjNNVzVpZ256RWQ4SVdYVHJJTVptaStDWXlxMGtKYVBnUCBQOW90L3dDbU8yUGtCODBlRGF2ZktmVXFOdDUyTlJMUXliVVgyeHZsSzF4aTR2c24wbGpNTVdUYUFZSFE5b3Zid25zNHRXcHA1eDN0IEoyUUN2NG5rSEg5VDhhVDBBVzVwQ2lLempiS1N5dUN4WmRjY25wcXlLZ2ExeG50cUkwMWc5RHJ0VzVqSGNNMmU0YmdmQXdKcE5sWnggcnVzdk5JMmlsQXNjQUdLRFlIcDlSNDhsWThsV01oNDlTQ0pacEhFUnpLMXViYXh6U1hIUGE0dXpMVzJRRWEyeDBLMzhvWkVtU1JBaiBLc244VTZBQUVuQTN0Wkd1QmxiZTNIbFFFTlRFOWNyeHZxL05yYWs0UUdZN2N2U2JDamw0aDRvdlcxUTRkZVpHVHRZMzBtdnNseGNQIDFEOGIzTW9VSmpBUnNKcUh0VFlQUGdPUWJETzFlUElFN0hTUmdlalF1ZFB2ZTdGUEd6dE1iUmNiaWhwcGJmakErWndNT1lERDRnU3QgU0JDQ1kraGxNQlp3MkU0Ty9BRDRBQndIbndCdC93QXZQT0orVnFXYXJzcE4zRHJZbXdFK1pVKzBWZTVhajZIS1BvOHhNaHdvYWZ6eiBZU0NpYzV5VFYyampQQ1RidDRBQWZBSHovc0FEMXMrNzV6bVpjYXJXMUdKWjlOR2xQQkVNQUdDWll6alliUFNUNFF3NDFaTUl6WDZlIHFJZG4xcWpHR1lXMDNJdEREbUZwRzBjKy9Zb0o4K3djKzZwTkUwY1dwYlRxZzFFdjFHb2lrMU0wc2lRVHZ0WlNscFhmWmdXbDlPUEMgR1A3STF5TnFYVmthclNqVlRUYlVUeHh2dExRT2xBN2xhajl0cUFlU1FUd0s2N0hDSHFFVXFUdko3VW9kSjFMV2pzMjJGb25kdE9vZCBnUXowUzJNQmJoM2dtV3BoWk13Z0hlTVdFQ0RoNG96NFRyUEVHRmRqWDVlcU1BQTVCaGlBcmFFdWZWSFRGZjIvalUxTXFTSEYxQXFiIGFnTnhJY3FSRTF5aHhoYjBTdDR4TXF3UE1ZRnRxZ3VGYU5BaG4zUzBNZWM0Y0pPSU9JRERrQ0FnWW43Yk9DZXAyVytHTUxMbzFTTDYgbG9kbzNKSXM1Ymo2Y0E5UzJNd3ByN003d09DM1pFT1ovcVdQZ1FYd296Sy9HUmxWNmgreVp4QmZ2QW44ZC82U2RUNnNNekt2aXQwTiBTUTdJbVZmYWhHSkd5YXJWMkZ3VjdsYkFJR0dQRDJRdHNpRXRwNWp0TGFBSC9hN1JVQlBoTHNrK0E5ei9BRDQrZnhhc0VqNmFXUFdGIE5aTExNOGdqU002ZkNOc2NZU3dlYklyelRrTGQ4cVBtRjR2cWM5STRpVDZaSUZZeWZVZ3lLZSthc1lzTXUyazd1UmVYWEhYMVYwblogZFZwOU52bW51U2tpNGQ2aVhDd3RWQTlzN3h0RlRxNHRQY0hDWnZGSnA2K1llRHcrZWNjQm5LT1RiNEVwTDJQNytmQWNCMy9va09EeiBJWkxXNVR2V01rYTVOU0FrVi9VcnNyc0tFTHEvZmtOOElWQmRtRmtJZkgyVGx2d0dwUFdlTFBnd1ppa3UzbjhmK3dZZFdFTU5GOHRHIFdldW11VU1KU2NDcTdqcWRvbUI1RkRiV0JzTFZBQk1MK0VReERUMlQrUmZIQzJnZkJoZ3RYUmxuZS84QWZ3QUFncitHQi9HcU5zUGsgaHRPTWpSWU13MmV1NFBKZDdZdURPWUZNeHNKWnhWN1VJVEhDWlpDMjRENWp4V2xQN0d5Y0c3TjdtajhJTjQvWC93Q3Z6NzcwVk5JQyBVelRUOE53K0VpeU5XYnlSNG10d0JjUmtheGF5ZmlqSUI2bWZmSmlDY2ZDUlJ3eHhvUlo5dUxHNzVERVYyMlpqdUFQelE1NVNTSzlxIFVQbXA1S3ZTRmJyWm1XWWFISzQ0b0dHUURzajV2Q0dQVDBmVkxZQ0hPbWNsRnRKVFkzWjJTUWdCQndRZC93RFBnT05Zc0JzZ1d3aG4ga093dGhVZ01tcHpMdG5CbURzaktweDhhTVNDZkRSTGd1eVp3OVdBNDc0eU0zZVFWd1hoS1NrMnAyaTU5NERZRUV3WkRoeXhsOCs3cSA0RUlodmhodGlXUTREWkRFSGlnZmxGR1JmVDNDWk1vZDhZTjhiYXZnUWEzR0RPTDl6QVp0SmRqcURnZlA3QjREcGJ1REFyNU13UGFFIHJPN01Makl5TzRkUE1WZkxEdml2UTJvdXBYejVnZGIrRmU5b1BudVFmRGllTS9vWkdxdDJkamVMOEIvWG4yd1B5V0N2RTBZTjVvVVEgMXlKMncyU0JmNmY1SFBGOU1VU0JrbWtnZkE2bFkzS0hPa1VVeXRRWGlXMUlQMjRlRzZtRWNoVDZTWVc2V01xcTNuUmNrYmNZZUhZUyArN3A0dVZNbGNEWUlhMkdsekdSZ1pLNVVrOUR0VEFZTUtGS3pxQUgrTGpnREhmdkFBRi9va3J1UStJY3hxYmFNU1NWQlpvMXRZYVh5IEZ1T2tKNHRvckk5WExKOTgvaDdaREMrbjNFZXRGRGVHU3pLemFiazR5Y3E0SUVPSHdGdWdjYWk3UTFGMFZaWS9VUVp4ZGdPNVZLcXQgRmJ1L2NHWm5yNlI4VzBXd0NMTU1DM1pDM1pFTzRDRXpmdEg5U3pqRm1FMWZUbThveU9iU1RmQWU3dFJmZmdIUGxqdmkyQlZ4dVZBWiBMSXNLeHFyQ0wya2UxRU92MGx3S0ZOUW0xaDJDNE5QZW9TazY0VzNCa09IcS9wYWRXNnozNDROWm5OallQei9BVUh3SFA0MlpWa2FQIGNjdXlJTEE1VEd6ZUxlY2h4WDdzM3dzTEhHd2w5bG9qOXZFZ0xxZTFKTDdLK1RnMlhIaXVUQ3BEbFhobkFDbTV0UDNaRHVsSjVEY0EgZUd3THkyZXRGM3JrV3lMOE90NmdwTzFFK3dZY0cyN1FiVlY4WmlmUEZtb0FmTnVjSDhFRUJicCtva0pDNkZic3l1elpDWi9pbnBJRSBEYWtuNURYVFBIbHNDK01MUXI5cjBPR2gxdStCeUZrbzgvVmhVdjFtM3haU3Mza0dFU2VjVzcvdjVCMkUrbjYvc1RhcXlUNVR2dVRzIEJtSkJaZnF4YmtXd3lDNVMrNVNndy9DbjN4OERHQ0V4VnRvaFE5amJuNzFmdWFQVndUOS9RYmRBSC9BSDU2b2lpR0ZIc2g2cGEzUUwgYXE5Vmt4SEJQRHNGbTg4ZkliNFVXeDh5eUlhMnlVTzRjNEF1RGJPM041cS9uVHozUnE1SVI5Z2ZnSHZpL2RPajNHS3MzOVJFU1FqdiBpbDJpUW9pazdmVFROcVRFNForNXN1QjdFcFl5aXB4akhJMkVpZTBkeTRuemYvWTlkbG1OR29BV24yMWVhUmhXNERUU1MwOFdFSGRxIGxzbDNaR2dDMks3NWFqQXljRFczeDhwK1ljZkxCK0RUNk16Y0NKa2dic2s4SFlEOVJIL1B2K3dHdHpyZFhuM0RPeEF5NkMxUTZiclUgSk1RN2NyQW1NalRiU25GUElhZ1lNR2JVdUZPcjhScVpBNEtiVVlXWHBuNXl0ZHIvQUd4UDhDUFlQNkRpZWZwODdsMXZuWElCVzRzTyB5Rld0TENTWGZua3doOE5vdG9zQkZ6RjlEWkpsSm1IQmZXd2U0QVdwazd2MWYzZlJrYzNhS1NiKy9JUFB0LzMrdE5rNmpLN3phVE1WIHkrVlhlckpxSGRtMkpJZHIrWDNmZEUxc29lVXR1RnBwNGRieG1WK0grZVFRM2Y2Ti9vYWN0R3JxdTd1b0lBL3NDRDU4cEFqeUtDSHcgVDNDTk4xSk1zS1hjdE1Yam81cGkxRjFOODlSSkhVT00wRnlZWVROaDdNZVpZYWF5YzdVWjlwREd6bHhaQ0VudHA2MGFIcjRYVTFieCBKOWNTb2dlc2F4c2xodFFtcjZnK2VZZHRrTXV4dzhHQmJCZ1Q1NXJtREdkOEtWQ2pZcFdvZkZJQXZ6OWkvWUFEMkI3am1EMGRYZkdvIFhQSlZLSGJVS3JwWStzTElqaVhCTlEyRlg0ZXdKNWloNGZEL0FMejNRMk5rdDhZVUsyWnNaczNzYkJ6NCtmUDcvd0JiYkdTRzNUb2MgeWhsQnRGS2FrNjBQVk1BZndJeEJVN0hsSjB5OTdzMCs0eXFHdnZDcklKTDFZVDdlaDFVdFlldW1TbnVDOVZXbWZVK253WHA5SHI1QiA2Y08wcklzaktpVzFMb0sxQWxrYWIzYTlWNWdxVE9lQlZFZXpEYlF1azJDa21TeU5tbUovd0lCR0Fxd25tek1IM0ZZQmhMczRQaWZmIGtIZjhUNzhmU1M4RFlScEpuTWlCQkpJRmdYUzZlOEdSVlFSeFNOdkhDTkkxM2FOdW9qQTZtQ1RLNW1EbmFjbGpMRkVrZ2tueE1jYlAgRWlicGZhZW1aUmhYQzk1Nk5zeUhNZDlONTRBMndxM3BuVU9xMlRMWHlWa0VFZVpZeFNKS2N0dkRoekJpV1kyZEhQVi9aZThzeXpUWSB2MjNzSUVPY2YyRS96NUJQOVZ2c1N1NUhORldlR3JGa2hxNTRiRXZBQzdENmN2bG9URjREcHptVmVZY0xodXhQUXlBY0h1SHdabmJOIG91VHpuQ2F1T1ZFZkFMNkR2NS9vcVN4YVcrRDNYaVdxaHRyRW9IUUxaVjZmNCtrSjUrMExOaW42M1Q0YjVTWmlxdzlnT0NydUQ1VmIgSVR4RjJnOHMyeUF6ZXdmcUE4QnNFdzJabGZybHNLdGNyZzBsV0ZxdzZUTEo5Ym9XbmRlZklyUnFFVnp5R3c0b2ZlQ1phakI4NUQ0bCBhbUdLenRlNWcrYkcwZEIyQUFmMkJCMkFrVm9HZkNYSkZmVXVxYm01ajYyNFJkTFY3d0FOSDJYWE5BNUcrb2RwWklramR0dXhIMnhuIENLS01ZcHpqL0haN2o3aVBpejBwR2xRNWNZREI1cFZsZzFXcXpEVFFNbVZqUTEzVXd3SjZDV0JNNWNSa0x1Ym42bVo0bTA0L295MXUgSXV6MHIxeVpCcGFQVkpQcmR3VWlNUUF5UWwwRm5SUG4wWFRlb0xPbW41bzdaemlJY2JLbVlWKzFhZFdiWXNaYktJamVmaVpJQnQ5VCBtRW1aZGVFUmdhVUp5TWl0MUQwUWxBUU4rQWNoUmZXV1pEVTZablN6cWtRbERydHNxY1RIc2hzS3hHT1c0dGhhcTZGaStCWm94cDRHIHBtMGhaalJZN25rOFdhMnpWMFRWbXJJdm14TVdTbjJnN3VCSkRyN1VVRXM5a0FxU1FQc2hKWDZ5RDF6WE9zVm5xVlBJUTlRdHdXb3kgT0ZnR0xHQTNBMjRiWXN0QlNzOGRrMWU5cXdHTy93Q0o4QUFmK2trdHJkbU5Bdk9zcW9IWmJEMWZ3Qmh0aVllSFhIWkN1cmlSYXVoayBFTmttWXNpRzRNbnRxQWJhUGNPTWl4YU1qZDBmdkI5QlArM1BUL1Z6WmhBNWQzWWNmWEpna3RuczUyckVPeGtuaXdUQXRvTFJIS0d2IHc2SGZGdHdxcHdRemxTa0xhd1R5YnpWL0pubmhLU2JCL1g4YmR4K2cxRlNka3JjbUJlSFlEVjVJbGt3S2ZXM2RQbWFhWkM4SHRCeWkgTkF1WTRHTlFoaXQyUmtYM3dHMmorVkorNTdXTEtBM2J3YjhnL3FBKy9IN2o1VmxTSkZoaGVKb2k0M01yc01VOW0zSXRER1R2cXoybiBvWkVhQXNKTjRUT2pwSWNaWVBJWEUrckdNOGVlRjhYUkk0SFQ0bzZvMU04bDE3Y2xOMlF0cmNwVnNoVHErd2pGYmlkK3RDbXlsdFE2IC9NVEh2amI0UGgzRmdQUTNqM3JQYS95cHNtSnkzZVFBT0ErM1VDdDBIWkZnMWZiV1ZBaGpjNVNtL0wxVVcxV3hCaERxOGxlcmxYY0wgQVc0ZThXUnVBZEh0c2hTMEdZOGt4ZHk3bitvUkhBQUQ0RDkvWUFDbGZGdXA4MTREdWRTMlJXK29Td2M0YXZNTXlrNm5zSmxGeWtkRCBQVU44eFB2aW55N2dub2Z6eUNHOFlsQmxvVmVqUE5xZmRuZy80QUFmNTkxMk9sczM1VUZnT0dVVXlYWnEwcW5qYlpVN1ZwcXlMWWZKIFVWZVYybGtUM0FQOHhrd3E2SDhCUDc0USs3NVFvVDkzWjNxNTRBVkVmMkRuejkxWlNmSEgwOVJlcVI2a1RzamdCUFlFeU82NmZZdVUgZWRubGNlVnM4TE1xbDVZYzRXaURpWEtSNTJydVI4VkVlNVhjdE43UjNHdXUycjRlcFNvTEVoNmpMTDQzcXUwOExjWlRqMkVOc0N3bCBzcEZ0aERjcWZIdUVNeERFYmh2a0JnK0R0ak1MYUNhemlrbStEZ1BQbjkvMkFBVWcwcGdYRS9PdFZNTVZjazc5SDdYbmxzZXdoeWd0IHNLV01uanpGcUIxdmpaQXhPNGZpcTdtVHE4b1RSam1POW5BRlFud0gwSDlleFBaTXREcjhQbHlZZGJ0U2JUNmtKWUpoSmZzS3Q1VmogMDVjbkpHQ0hNRDJyRFcxOFB2NEEvTzR5czJnTFJ2TjFjYjk4T0ErZjgvQTBtUHBPeGgveXF2YXJhZko1NVNkM0F3bkk3WTRWeks0dSBMdFEraC9raGtocDhPQytFVHlyNzJaK1RLZzNwSjdxSU93QUQ1OCt3WUgyRlZhT1FDUGFRUGcwYXRjYllsY1NpME51c2lTTGE3QnNWIDFjYlpPck5JOHJwL0d6bitPeXBhaDg1VUFlUldOYzljWnhYVHhaU3RzcE5tY0RmTTVTZDE4QzRmTCtMRWlBRDYyd1E3SVc0YzB4aHogbUFub2NFeHlidGV6WW5IZEpTZjZCUVg3d0FEcWVmRWNnTElFbHlmWUtUWVZnMVhVdGV4NlRPaDRqNGVWOVFpdUw1QTQ5N0U5UFpDRCBoT1VyQVBQRmtFeVJRb3NzMVY3SWJlQUFBQWZBQVBBSHlRT1F5N0dIMTZrSm9kYnVDZnFRSk83QlVwaTBIZXQ2NWxib21zaEJqVzZyIE1YeE1YMlJJUEQ1OWNvYXdUeGFQYXE3UjcyUEg3QnNCL1lPZy9NVTJRQ3lXZGxLUmlTdHFUVWdMeXZNSmMzVDB4eUxTZ013ZXRyY08geVEvZUJ3NWE0UGlQTVdlVUMwVXB3bndZQUFBUDcrQTZFc1pGVkVkSGNXeUIyTWVjYlZpNE9MZWFOaXUyaHp6MGNZVkt4ekZQR1h3ZiBIMUl3YzR6Mm04Y2dRM0h1Sng1NlpDL2dEYU9lUG04QkU4WFc5Rkx0OE8yOE82R2VpeXlqbVlId3pGa1F6RVA0YzdqOWwxeXQ4WjJ2IGpPOWhQUG9PL253RDlqMEhnN2NLZHI2OWkyME5TYkNGMHlFWWgrU0hJTDF3VnkwTUlHTUh4TVZ2M1U1aTRCL3hlQjVJTVp5Z3ZqTHcgYngyTkJBZWY2RzdZcjlMZ0toSnQwMHNqSXlIZ0tTa0s3STFXQUpXM3c5V1JTVlpEQUhyY09ZRHZsZ1dvcW54ODhHbnZJdFhLRE9jYiBKc1ovMlA4QW45ZzZ0RVF0eXM3VlV5VUJvVDdzckhXbE1mNWNlSGZ6QmNZZTBOMnErVVlJSjhORGh2amdQTVZ5K2U2ckQyejdOV1lKIEtTVGZQbjVCZnY3QjFtZU9JN1UwdDZuWm1qUVNROTMwdDZVNllwSVBtTk1RN1RXUE9PQTkzV2pjMU1NZXdnamlXZjEwaDFFVVM3aVAgV0xMS2thU0dnRGx1dExXUzRZZ3RralZkSHpXT240YUdtZ1dUVkZxREQyakU0cllWNFdGaUtvaUpROFdZUFpKdEptSzNmUGgwZUJIdCAxVm9hTXpGS3ZaaG5kRUphT0gzNCsvZUFBZFE5Wm5GOWplSHhvdERsb0Yzd3JZczRhYjdDVDE0T0x4N29LOE5mRG9iaHM4elo1OEQ0IEVDSDlERjFtekcrMXdSSDQvd0FCZlQvbitnT3Y3Y3Z5dm5EVVZtMThxVmMrVmZaeVRFVDdPcXp0NllhSXBhdVNreGZyZmtsVi9EY0cgU2QzaHJUWnhuQTBOWkp2QVFJa1BHUDEvd0NEc0V3cE1Eb3BabVRMdEFrRWRxNXF0a1hoOVAzWXdObGtLOHBJRm9hMzhPcTZmY0RFeCBmbVFUeStQVmZkNVF4ZkdUcHUwVGZnUG9QV3BvbkQ2aFpWQ3NYU01TWGVibUtLV09OVm9DT01icFZGeWJDaWJPVkRMdjIwTFl3dHNvIEUvaW9uMm15Y2pYaXE1cWoxeDNCUWRtMk5YOTJHYWdUd2pJQkcxdUo3NVdGSUUxdTBKclpWNTVRNUpFc2ladkMvd0J4Z05vVHp1NUwgTm9YSlVDejRRSWMzN2Z6L0FQbDBwVlBpK1ZaQkpqU0VNNURub2NZVEhTU1E5M2NIS1ZXU3VVaVdBWURyZmNpeUY4dWNzdW4xTFo4UiBsTkZDZkJ6WnRKQjdCNS9mL0FYTHFPekI3a3ZoODFqaGpVT3ZzNnlCTmZuM0FlMmQrQU5tdVVYa0RnWW1iT3lEdzdWUCtlY0Q3WnVnIHg1N1hISFo0NTk5ZlBuOE9oQzlLeWZJb092WithSGpLdGpIaVVyL0dkaDhNUEtLTVAwOGhEWlBtR1ByY0Z0SHoxVndHYm9yckRNY0MgSlA3QXYvMkRmN2tqWmlFYnR3OEh6bGtCOGNWV1A1UG5wUWtSVkRaWGw4SGlxci9XN3Y4QVhRSFY3SmJqdmtmamwySlpOM2FWaHRzRyBLeG1XeExodEZ0ZkZUZUg5eUtUcXVFWWNET3c4N2dzak04azZ2Mnc1d2xKQjRQeUR2NS9wa01Gd1dZa0E4bTBLcWNJdzFqTG9DUVBmIEljZXNySXNaWDNXMms4Z24vRGNHT1l3VEp3RndBMk55WVo5RzhKK3Y3L3dJKy9jQkZRNm1qNVMva3dNbXNlU1hkRFczY1BuNXhDd28gYmxYTmdxN1N5RDRZZXlPSDdoM1U1aHNiZ1Q0dUxXU2V5ZWMvMzk3bjlnamF5MDk1bHRXeG5WSktKU1ZVcWhic0hkbHRYaVRGWVdXNCB1eVhCeVF4aHZGZ0dBYmF3VktxaDlzYVZkR0ovU1FnUGZ3R0cvd0Q2NFRCUlJkOFVIYm5WNFJpaEdsV0x4dHViRmppdU9TY1hrR0NTIFBKUlZXUzdrNDNIQnk3Yyt6aWpXSTUrUkRqdFVDdkt6TWtYbTFXazVPYVlDVjdZS3ExUjVjd0NVTGxITGg0ZVp6RXc0SjBQNmVCYTEgc1p1dk9lRC9BRWtIaS9mdit3UDNUYTFjSTk4QzNDbVZkb2RxdXBtMnE5cTRzSGZCdEhyekllS0pFWGtuZUFPK0dJY1A0YzVTWUFJTSBPTWVoVFFNZVhnMmI4LzRGQjJBQUE2Q0RoRE1xVlBtQlUzNDFoUmJDSWlxSGFrbEhwR0dVQTJGWE1WUGNMSVpKbUQ1Wkh6WUtIWDZrIGNNSTZ5K1UzVUF5cXd1eWJCdjRBL3dEb2Y2blZaU3BWU1FGR1dwMUF4TGhQUFM0ZGdOMXRXZTFPTm40MkRad3NMUE1WV3gxYmpqQmkgMktEVVZJS0hIV2MwRFNXQUIyd3MvSDAra0I2ZmV2OEFGaDlhNHBGQ0s3YjJ6eFIwNXhsZmhieGs1MnFzZmErVi9ianl6NmZ1ZUEraSA1Y21RUzl1RW5hV2pVV2M4S0Z0Mis0ZHY1RjZ2OWZLRU5QTXU3dGdOMjJUc0FHMUI4dHdmRmQzVjk0WDF1NEpoaXQzRGtnS2gyQ3BWIFZEM044dEJaUm5nMmJDSEg0QUEyRFlBQ0QwNE1zdTRBUmQyY2NtSk15dmhyc3AwTzcvaklQS2l4Q2liRFlGc3V0MXU0QitZTlI1ZmIgVlg3TUx0QkdHSEFudnNCOSs5LzdCQXVEb3JxVndRNVZmR0VxeUVnUEo0dWh1RzA5cjVVU3h4ZGJqK052aTJZaHVFUGNQMFpDYXlVdCBESGZQdTFxL2w0OGZRY2QvNk8yQkhyZFhyc09aRnZrYXZiOWZGdFN0aFZXekVNTzBBVjVOcm42Zmlub2N4aytaOCt3Sjd3dUV5WlFYIGNEeWpWY2toQWI4QS9vRS9nZjZpbFpJb1JIbWZxRVdTRXVtR2FXdE1Ca3g1L0h4eCtSMGJMaVNoYU12RlVUS2paMXRnQU1UUXJPelEgbzFSNVBTSW1DeDhDSFRMSFh5MHR6SldkR2x1RElOWUs5Wkh5UzJJWUZQSUllb1NiRG0ycGl5QS8wT0J5YnlydEhKdnhkd2o2Q2dudyBHLzRkT0QxNVlkZEQzTWhpNjlxVzdKV29SUzB0UERKTUkzSFc4V3hvbUJRd3dNa3lZdGh3Nis0TlVCd2JVY09Nck5wS015eThHNnUyIE5CZnJkQVB3QStBMzlHOHNLWnNocVRySHpwTllxUmlMTEhtTENlRk13MFBpOFU0ZTRtTVA1eUdRWkp3RndQWDhISm8zS0NiTnNteVAgQURmei90di9BQjl3UEN2c3paVzlqSzdzay80cEpTU0xZYXBoaVd5SWNVVGR6UkQvQUtiY0szVzhYQ3ViTVlBT0xJVHJOb2ZHWlpPTyB3VHdDQ2ZQN0FmMzhCSDlNcjgzZmN2Ykl0VjdINXh2NTdUZEQ4ZExkWTNMU2UrOFV3QXVSODZHeWkvTzVqM05mWmg3V3ZoVnBkYnI4IFV3N0ZLbGFyUlpMQnZMOEg1bzJQWVZidEVxd2hmSkt2dmk3RU8xQTRmM2d6eUdJTndSbWZFclVDeWo3SmlEQUlQbjJEZndCOXpXQmMgQkduNnJWWUVxd25hc1VqT0NmeEFWdStCMkV4RlRlTDNJdGtHUlAxSUdERmIvRHRUdUEyL0RXVm5kQmd3NTRRNXdId0Q4ZlBvSFNCSSBMNzRrQS9nSGxCYk1RRnVNa2JtU1Y3WWh5b2dseVBXb1FYRU9IZGxrV1FuaDUybW5mcHpJVDhwNXdJRVNlUGdOL3dEYnovUTJqc2xGIHdKRmhDek13SVJ5b1kxZURoMnFyaXpKY29HSkZGMlJYNjNhZ2VoK1lEMlNxM3hmd09Nbk9XajdOc25DZlBuei9BQ0ErQVBnQ21WbmsgTHFybmNyZVZGeXp4SXd2bFF1TnZYQnUvaXVpN1FnVm5RN1NKSHA0bmJiRzJwOW9rYjB4anhaZGtzTndEelRtc3lZdnE0ZXlMQk0xSyBraHdObkpOWkVGVURTQWlZTHFVUytSRU1peWN3RHpGdGdEMk1Cbyt5NFA1ZkZxNVA4bzRXano3Zi93Qi80RDB6aU9ZNktWa1dkYUdWIHh1WUJaUGxtQTlTdEZPTGF2VW9vWGJTMzhOUFE0ZGJobUR1TUJUM3hIUStNL1dXYzRFQ0pJTmdQbndHL0gyQkI2cCtEdXdPZXFmRU4genhKbU9TM1YwU3Q4bXdpQmRiUTFkM2xpNGJnSG1NaGlhK0VNSU0rcnVLcmFOd01vejdHa2hQNkFBSDBIcGtWSWo1UVlXZWxKcVRVdCBoVkJwMlFaZmNHeDYzTE9GSXRBbkcyZzdqTlE4TEg3cURvYlYyL1BQRGdzbzFYN1pzWnZoQ01BUG9Pd1B4LzhBUVpFY2JjUk82NDJvIHRRa2czWkh2K05vMHRhQXA4aFpzRk9SWFVqa2k1ZU5uU3ErbG5EWUpGZGJtNFFHOTNaanlLeEo4OUcxZnBicGxaUzJwSnFxN094NzUgTlpWK1lNU0N3ZG9xK0pYTk53K1lUWWR3VExJSVRRYmFuZ1FWcUUwWkRRMlpHQnV4dmZOZ0FiK2Zmd0FCQlpDdW42ZjUrb2c4QnRXcCBLM21WODFNa3ZzT25wNG1HZTdlM0phS2VRcmVIVzVqZ2RnVElNL0J1TnNpeTh0SGs5bENIRG5hTGZ3QUNvdGdQMHpUMTlzWTZEem1nIERacTNWZXFVUHFyWGtlem5ENGpJbTIwN3BxdW5yN2hXN0l0c2tOd1cvd0QwdnRrQU51YjRyOXN3ZUlUVVB3Ri8zOEFBUWZBT2FPbm8gVzEwbk9kMnFTSGJkUlJKaElIcGl1MlZXTGFDeWFCZkNBZGJzaXQ1azF3UTJxQVFiUWJJekRQeS8vcWliQi84QWZ6K0d3VGNuY3lIZCAyeDZtbUVqR1dDU1hVZGd4YUtXQmFqSG1PUlhmTUY3Vk1Sa1FnVXhFdEE4dHBwNW1kNGZRaDArcjJGMHJtYk0rcE5KT1VraXdBajIxIE9jaGNCVW1Rc2pNcEZ3bUxrOENTVzNlRXlXRlc4UDVDOHRnU2lSYU9NTmZXNWkzOHlHUWhneURCV253OXNWM3g1V1hnSlZ6c2MzL0ggZjkvQWRPMXBaRjkzRjFpN3ZnRUpNUDE2a3hLUHpvYStrYnBLdGlVaG1IQXdIc2Q4VDl3RDF6NTc1YU1zK1RKLzF0NThBQWZ0Z0FBTyBocGdtQ3lqNG4vQW1JTXhkYTBtWFpDcWtYUXZROTBzSVdtOGcyZTRQbVh4dkNxMnNGdEhIQm1LZStub21jQ0czWUhqd0gzN0I5Tm9PICtXcFV1cHdQZnBtbndabXVZZXBCM2tPQUVlMmZGMCtyd0d1cXJYK2Vjd21jZ3RScXRwZlVnYjVXZkYxZit0dTZOVjgvUVFIZ0Q2RUEgaktqS0hrVjNkVWVOMldhV0hjamwyd3luYVphOWdvc1hya0N1YkVQSEdrY1VaU0JDNnNnY3hOVWNWRll4dXd5WGptYlpjRDRCVThVTiBsQ0Q0THRCcDdQNE85TXU5ZTA1d2NhNFV2VHI1VXA1M3B3b3RFSHhQVDdVaDF1NFBrRUNRZkFlMlcrK1h3OC8vQUFBRFlQb1BRSFhiIFJaR3FXbzBNN0FhamJzeDVOa0x5L0QxUk1GaE1nR3h0UFlxTE0rWUdyZnZZeVYrNFRoOWZ6L21XK3pDeXFNekk1enZadi81ZFAwSHYgK3djZVhYZHFXaFE1ZTZWZUc3YVY2REhOckRUQUM2OGJDV290RU5zVW9vWUo3aXRza1BiNW1vMURyODgxZHkxaG9LZHMvd0JreHd3MyAvd0FBZkFkTWh6ckJIQzNJeU9RdWdXU3Zhdlc0Mm1VUGtWTGFHOEFCVlpIc0VNY1lEekljeVlQbTRxVEFlbk9KUDhEazhVZXJVbDJPIFAyd1B4OEEvWXZ4K0tOSzNwTktoMUp6VVM2YWZjckNiVHh6NmFkZHQ5U3VvWDZpTnBFeTFHMVFGK3BmVWI2a0NTVlZjUkxqTUE0Q0cgT1NYbU5rQTlONHhpMkx4eFE3bk5yYWpxUHZrSmRNOTZ5SU5iL3dERUtkcXl6MVZTVDB1ekhDZ1dqMWFkUmVvdTMxTUJEQzJCcUJzZCBSY2JObFMydTNHUXBGOUNVNFdtSnpjNEZZMGV2d3pGQ25tOCtSTFlDMmRYbFVOVEdtTWN0Zy9WYmRueEszWmlBTmVuUUl0cE1WR0cyIEJ5Vk1GNFZCVnJOSDVMaHFDcGtpdHJ0aEI0VWRsRHFrS0M3aFFXWE56WXdsNDlVWEgwcHFiblNQUlhoSUxVVUZPNEJZRmZHUDZQOEEgMS9YVGZvOVRmZUp5MzNmM2JWZWVQL2EvZmovUWZQSGxZUFI3OFYwT3dwUXZLSkhzMHdFbFBCNmdVZDNtQVZlc2lsSUdDQmdQRG1HUCB2aU9CSDFwYWpoK0xpaU9NNXY4QTJBQWZBWWJBL0FMcExhdmNtYldiZ1ZNMWpHRzJEU2FqVTd3QnNpbjZjdFNWcGZVNVNIMi9tTFJpICtGdTFQT1FPVzZjK012TnlGVmw2L1Q5Lzlqd0EvdjhBMHNWc2ZNc0dZaHhRMUdvRnpHZTI3RFQ5WW9jaGhjWFBoQ2Fyc2ZiZGJXNGMgeERIMVdqMld3S1FQL1M5RFpxelJ6WnNJY3Qzd0I4Ky9BSDUraDZyWDZ6WExRTU1hUTRScUg3TUVsUGxUU0hkNGZaSGErU2RrM3g4cyBpdDJPZWg5eTA1RDRlVEdkcjlzT0pQQ1RuQWJkUGdBQ0NmUDlObEVicEp0NEdzRjFMTEZLa2N5TmRSVFBFaytFYjBiREE1a0dpTVQwIHBKcEVraExTeU83WllFdkNYWEVSbHNJNVpJdHkrQzJMREVoYjhpOHNmUnVDdURWcG4yL0tkcXYwaTJDZHNpWFpHcHV5S2ZzSlAyRmUgcWE0Nmc3anpOUWxicDVrZE1nZ2NJQnZrNHpESEJteGRrbzN2eDg4ZjhDZnhQcXUxV0RWZ1pReVZhYndwSHF2bVZ0VHJBbjV6Qkw0YSArQ2JRcmx3LzFVbU9BZGY0clBJYkd5TTJCUlhKc3lPYndTZGc1OEEvWUQvVmlxRDFBUTFKSHJldEswc2xicmR5MHVyZW9TUUJKSTlzIExZRXJmTlgzTFpDZStRNnJEMXVIcjhQQWJTSHdURm1FK0xqRm5teHYrdmtIOUQvMkIyVmNudUNibG5RMWpHSk9UbVVQR3IwZ1lyMjIgTDU1a0xySlhLTjk0Si9HM0JEMjliYXY0Z0o5Y3d5WXlyeWp3ODkwUW5PVDREZ0w4QUFJUFZhTTZ1UlFtbzB5UmFsSG1nZ2ppZUp0VyBJOVB2a1RyZzgwZytwamppa0tTeVBzNWlQTXl4elJyY3doMDhqU2FacG4wK0FMVEJKV2dqazFjY01Na2U3TEhGWWdrbmRjbFU3dXpaIFdMSVZXT1JmbGlRQ0ZldVRhTnBQT3I2Mmh0aEdHTlBYeXlIRktPOW9WSkRIcDYzRDJldHQ0Vmp3L1R4dTZNc0s0dDVXUWFTN0pOVm8gTy9uOS93Q2ZIei93WVNUdFA3KzdXQnBNdFRUT1lPdXRjSHdJRmJDbUYyOWlsT09jaTRsMFRhYmZjTVJpQUY2ZWJqNSt1cFpNbldMTiBpVU8yZjY3UE9BVjZ3Vi8xVjhDWVR1TWRtUXc5alZmYllzb0JHNTBwd1c0aStuNUxqRW1BY1ZPNUR4aGdEbUsyK1l0MWZOZU1XQ2VEIFpHZmRCZkprZEpTZFBEd2ZmdmQrUDFGd0hyY3lDcXJ5a2VqZFBIWi9zeXBLcWt3M3hxb3ZoUHMxYnREYWRoaDJocDdvZFBaSzNaSEMgR2p3R0J0NDBUUnJrNXhXZm0zYkNvajUvd0hWVE9SSnA5T3JPZnF2N3JxRVFSSFlqU0Y1UnFIVnA0NUpJMXdJWVJ4UGpsYnN2YUh1TSA0d1NTR0pQU2pPcGhrVVk1N3BHYUZlNnNjRnByTjJUaU9oV3lHaW81OWtPMWpUeHRKdzY1dFNMWnRIbVhDcDE1RFRVTmhBMmdoc0c4IFBsSnpHUWVZbk52QTk0SnN5Rzlzd3ptd00yRUFJTy9nT1A3QmhhRlRveFB0cTZHT29WM2dOdjJoVzl4dGNoYkdJQlpPUTVkMnB0VFYgV25UTUxycXg4VzRHSUp0ckNmaUhac0h3WGdOMk5LdTFIcUpCd0FBUDBQNFZrRnVqNEdEaDBoU2h5bXBYTUpOT09Hb1RUMjhKQzJLcSAvbmg2azJCa1Q3VEQybWgwL0RlS2xIejdVM041cS9jOThxNjBRaHdCejdIdEQ3SCtoc0c4QTZ6cis3R09zNmx0R0hQc2hKbDluenl1IEpoNGxLbkZ4ZHdobUppRlpHNExmQkxRNE9HV0t6VjJqaktQK3RWVzdib0JmMkIrZmtERFFZM1psY25OMjJvbWFxdXNnR3F6K1R4Zm4gNTU2RVNvRlhjTzRqY2hDTWNaRnh3Y251dkhJbXE1c214MWE1MFQ3TkZvOW5WQ0d6cE5wcmlIcVpySm9yQ3lHQ1dudVRra2ZMcmRmeCBzaFBEdUFmNGJ4MlBmSzVNRThWZkVaNXRKU2RnQUFENkN3SUo4QUFUSzJybU1vZ3FtYnVXN2FQQzg0MldrTlEwaEVNV051MWN5akE5IEREc2lIWkRJdm1Qbjc5OFBGbjU0c2pON0JtOS81QWYvQUxCMURyWXVSQVYyUThCYXRTQWVtOHBTcEZwY0R3OHREcThXajJOSy9HOXEgWHdubUU4ZzRJL2IvQUxqUzd5V2VUck94aERlQ08vZWZQb09IdjA1UTVCWXZpMWRRZW1EVGxwd3RCOGEwbXBGOVAwc01mZTBPQnFhdiBXQUNuK215R01SQ1JKakMrSTEwVTliTFNHVzdlR1ZjOGtjVW5FS2NmY1YvMUw1LzBnVDNxWENsS2tjK2J1TWZVUkx5emxoajVYSVkxIHVBKzQ1VXc0ODlMYkU1T3NtMTU0bWt5Qnhpa2s3VGl0ZnhZdHdiekIrS01RcHRoUUNwOGM1VU5jSlI0SUpJVW1ISUpDZXJsTENsQVUgNGZEbU1pZmFnZWYyNWJXQ0E4T0NLc2kybG0yUFl3bXdjKy96L1VQalhCVjRhbTA4TmZHVEpEenlRMklQYWxVd0pocHA1dHNZQzRFSSBrTmI0ZTRMNmVxOXI2MCtZTXFEaXlNOG5MUkNlejhmUVQ0QStBOThGdXQwKzhYd0RKUGd1bnhzT0JaRmtMMGdQcHZUMkdZK1doRVBOIEZWTC9BTXlZaHpBNC9GcXhIOEhXM2xtMnRaL1pEWnpmMzUrZmdDQy9IejlxOU9Xbm04dFR6ZlcybjRWWXN6VCtNcmZKT2hRTm1IVWcgSlhGT01FUkZVanphKzVtS2U1cU1sb3N6VmMwK200c1g2MUNheFpxT0h4OUhvWW40M1g0UE1ZUFNiQlAxWVY4V2FlVFIvVE9Lbmc5TiBFSzE2RXBzazdmRzNKOTJUMmdybVFDWU1GMllKdHhJNUZNcXk4UnNUakpIdFN4NVJ5VTJMTmVXQm9BQTVDVU5rc1RUNlk3cVdXTmR5IFRHMUpNVEVDQmNHRU9lQXU0dTBJWTZIUTYxak1aRi84bFZlZVZWc1lzb2JRTUo0WUJEWVJCLzdBZjZZVnNjc2dDdzdiVlRLTjdTbm4gYVdua1VraExNSWpsVGg2VkRUNGJJdDFYVDFxT0VNR2U0RzFWdTgxQStET01vNFEya25LaVA0YytQOUkyWlZidzVKKy9BWmlCZnd1dCB3bFRmRHlTRng0WGNWYktiZlRGZ0xkYm1PSGw2L21WejJ2UGRueGp5cjFlekUwYzRrN0dnN0FmMkR3QUF3MC81Y09lNGJ3cnJhUytXIEVlZjJ6aDc0UHJLWUxsUkxHY2s4ZUdNTWhqa2hBTTFQakFCYXNTZkZ4YU1qWXUzTnVmSU9HTDhBZmtFLzFIZEZLOTBJbWp2ZWlNdDcgZVdHREsrQTcrR3dmSHRvbkU1Y0N5TzF5Tkc3Sks3T2hkZHNjbE1nQmJYWGJac2NFOGRLc1B6RC9BQk1tQnlxVERBbm0xc1lQaHVDUSBZYUFLbnpMaitDMzh4UFpIQ1o4QWdlYXc2eXM3V3RiR0U1djcrQWZ2MFBnRS9xa2tOa0NqZzVsb1pKSUU4a2hWTlhyNXdWOVBhZUxyIGxzYUNtMzAvTXArYmFoajRad0RlSGF2bkZ2bEdpM3ZObStEbjdkcUx6LzZMOXhnQnhUbnBZSGx1Y3BRN0dEdTBSb2FnKzB6THVyQzIgQmNxWTRKOXFHRU5iaC9Ec2FlUW4yTXQvbERjMmJlNnV3T2IvQUxBQTltRERGU3NsaU5DbHBqTWFaSUZlcEppdmh3TlRJVEFOZ0NURiBqT1RDNVJTOWZ3dUJ6REV4Z0R0UUJmZkhoakovZkZsRytrbS8yQUIwckhGMTIvVTJwekUvR05SOWhhWDdyeG9kbnpsN2hYSkovRys0IHlSWm9TbWJWazZGY1l4USsvSTkzMjE0Sk5EUmxrTElnTkRJQmdibHFEUFE5U0RZd1hOWjFQL0RhSW9sWCtaMlRtTWlIRFcrQjc4UGIgVWVZVEdGQll4WkJoS3UvRVIvWUFIMEUrQW1aZ04wSU1oN05UVHFTMVdOVmFTcDJncTkyV3g4UEFZbFhvWVpnWkxVRHNoaUhZREppZSBxN0ZxdUJtMnZ4aHp6WncrQXc1OTBqYVRlRjlqc0FaWDBBd3lPMWc1eEpkamg4Qi9EeFpRc1UyZGZyaVc0UStOL3dENGZ0eXFIV2ZxIDR5cytiYkpqc0gzN3ovVHlaQjE4MGkwSGhjVTg3UGs5RGpWbEhWVCswdzdrNFFlMDVzaS8yVE1WV3R3MkRpcDd0TEJoN250WXdac2ogc2MvN0J2OEFpQkFGdXEwcktHUVRTYVl5RFRPK00rRFlGR0NVYnl4YXhmYlE1TjlRQmpHc2pERkk3V1EzbGpKYWhrK0x4b2Qzemw0RiBja2c4Z3IyK1BWYTVzdGtqRGFnUE1qdllHZGdqcVlkb2NyQ1BDNFk5YnF0d1d3N2dQWkFlM3oycHd0OFlMNHlNQm0veXA5K1FmUDQ3IEJwYkdGRGlxZFlnYUh3azUyY05yZDM3cUxjZVc0TkFHSmR3dFEyZTFBNjJIc25lRG5EN2F4bU15eUwvWTlrTi81ZjhBWU9tb2h0QlEgeUwxT050bHJZMnpxcVZVbnVoZkJJZzJHRU1wWVJRcGl3dmkyWXJjT25rSVhiUmdRemt4NXQvZ2VQdUVkZ2dNLzc3QS9Iei9TTXZ2SSBoMHc3elZkaWNOT0RVMmdWeWtuL0FMZUxGMnpiaXErMThaTGtBV2pNeERzZUxQREhRTnZxVThNVWVudXNVWEFHNnBXSHN3cjUrM3EvIFlNR0NvMkpRbVFoMEdMeUJOTTdYdlNWR1paQWxEY3NZV3RydC93Q0pzKzJTZ2hZNUZHVUxiZnFlSzNjdnQ1c0RIOGk3K0s1K3ZBZEggWTB1R0xyckpiVlZYcjJwVWpsVFVQTEIrTHFiUktjQ0Jnd3lPRXd4d00yQnE3NTc0akkza3htOW5LdS9FUi84QVlBSHN3clFtT0VETSBTV2pLVGdsblp0dE1qQ09mRWxvL21pakRLVFdYZUxJaG9lTGpZRXlEQXEvaXI0akl6NHJqR1k1ZGdRMkRRVDZEOUJ3MzgraDYvYlA4IEowQWxMR01zakt1Sjhac2tBYklIaUdRWHFDTGZFRFdCTVE5UGJoTVQyQ0hBUSs3VTViV1dmbEROOUpTWFpIMkIrNENmZm4vcVlCc0UgbERKM00wV0RXN2E3Qlh3SGJOVDUxaFhROFZXTEFpWElYdDhOUGZLcnVDa2lFeURkVndLUU1POUxQRjFsNU9jMkNIZjcvaUF3QUgxeSBRT0JudTcxTzcxdXluSGNDY1hISkZSNEZGZzJWR2d2TmlyeGlrY3ZGazZNQzZWbGdMS0VaZDhaekc0dGl3QnowUzJLMk1rcm0wb01TIE5oNmJhdVBOR1RWWWRzK1U1U3hZdGJIMk9IcmRrcXVZUWNhZDFTcDg5SFpGa1p6eTMvT0d6Z00rZzRvUGQwQnY1OHZSeUxRVWh6YmEgaWgxdk9kenhKaFBzajVVN1luMWZGbDF5ZTVBWXV3eGZGV0xZOWJWZFBDOGgvTXJQSG5nd1o5SkNWVy92ejhmUVg0L3YvUzNwcTZKQyA0NlpNL0ZKVzdQRE9Ga2ZISmNHRXdwVlh5d05jekY0T3lUQTh6K2xVT3dMYStzN1hhQk1ZajJqVjNuLzMvQzNjZXBjZVVJV3IzQ2xKIHRHaENUUm5HMkZQckd2WGhUWlByMW8zSmRpL2RnZEREd3FySWgxWFVzUGdBekhhQXB6bG1SbmNJa3ZKLzZDZ2dBQi9rQ0o1OE10S2sgYnIyUnVaaU94ODhpQkdmdXh4T1I0OXc0NmNzR1pNcnlJK0ptcFVOMXRiVjJlT0d6QkFyakUrYjQ3WkRSV2M5c3J3TmJYRzJyS3JkdCBYdzRGMmtVTkRLZHZuTFVZdHNIekhDMUE5Smp3OWpYei9JdzFsR0tjR1dlRW03UmVQb0ovWUVIendGSVZNdHRzQ243R3locTJIVFpqIHRMMHpwTnpOR3BwUFRUb2s5TFF5TnFMYUg4UVA4ekNmUjZsVmNNWXNvZTJET0VtL0FlKy92Mk9IVHNrV1JRK1U4cWdGc3lkUjlBdHEgNVV6dVlaUTk0ekllRlNsZFNvdDdBVExJcE11dFZ1dXpNTlBPbUJTQ1RHVjRGazl0UmdmQ01RSUhZZm9ISC9VQ1dEU2RYeGJBWkJkMCAzOHBKOWpLdGJpZTVIQjE1YmFMYXIwRHBmY0I5a01xMitHSEJmMk5TcitCWElmazFYOW9HWTRidXhKT0FFRiszL0UrQVBuN0R4bFhWIEJ0UGdaSlZsMDh4TzRNYlpYY1J4dG5kTUlua3d4VU1Sa3BKR0psa0VyRDZvTi9GSkZxSW84Y01WVElSblVraEk1WmtHUlRMZFlqMkYgVHBtVStsMldZem1qVDQrYzJ0V3dtMFRYK2N5V1JFbWkyaGVsQzhTRU5PZklhMm4rRG5XaEFWV1FtOHZnc1o0VCtnUUcvd0Rud0FBKyBOb2NpWWh0bTEyaE1rMUsyM05VcFpmUXBnL1o1WDJpMm4yMEdURXhjRDVXL0QycFNRRzFWTWNHN3lySk40U2RQSDcvd0RZRC9BRmRuIFVvajZHOHJpcG5UNlNvRXhta3BRa2VZVDBlV3Q4RFUwTnlxdGdtQjNCdzVJUFpKeUdRUFlRMGJFV2lleU83V2o3OCtQcjRBLzdudWsgallsZVNJR1hEYUNhZlk5VnE1aW5LY2VLWlQ3ZitHZnU2elUwVlhDL1d4bHZUekxJd0dOaFh4NnJ6ckRFV3pQSno2UzhBVjhDQVFUNiBDQVA0TWFTT1NvYmROejduU2dLcndNdTczYzhpaFI1dmhXTFFzV0VlZUZjU25Pd2FGcWNWdzhjKzYrM3hWbWlGcUJvYmsrT3prZXY2IFN0aG54SnhEbUtydUN3dGhpcVo1RGNCNFpEcE5QWkRGZ1dvOFQwL1l3d3duVGRvTFBCd2dUZzRBQi92N2YrcmFFSzNoME9wb2RhVDEgdHVBNXFlUzRPMzJSSDQwQml0a3A4aGtKaGlZWVpKaEJrc1lEcVE0UC9WQ3V6STFWbTk3cXQrNENmMzlCUVQzVTlXNm1Zc0JzSkxpYSBOcmM5ZExqR2wxK2h3N0FYcGtYRmVQT1JpNEE3NVNjeTFQWmt4UXlIYmtQV2UxbENZdm14dEoxR0lJRG53RGdJQkI2YWp4dkRIY2o1IGJVREoyRzFURWEySkNURHNCc2NITk5Yb3RjeldBUHlXdHJnZk1VODVBWHg1d1Ayejd5ZHpFY0pzaVBVWGdENkNmdzZZZFJsTWtBWEYgSXhrekFRcklaQ1UyblI0b1k4TnUzeVZsa3p5RkZLT1ZHR1JFYVptRHZMTXJMQVY3SGVUK1IzR1JKOEpRcnpmUFBTeHl5bG1YSnB2YSBkTng0Ykd6cU5WSCtZSFE3Z1R5M1p0TmQzeG9NV2hkbHFMZnd6TndjSGJYRFk3SUYyWXJ2aE5HQnUzdWM0Q2hJSUR6Ky9oTEs4Vi9vIG9RcWduenM2eHpOVFpOQlh4WCtUY3htblE0cVZxYU9vYUlRVzJXaDlTRkp5MzlsMkQ0RnByZUtPaFh1VGVUZ1E1aURmajFSTUdIQVQgN0FmMDUrbitwN0hkS3hiWWxrS1JLQTRFdVVBVDFibG1TTWhwSjVOd2NJY095TEkzaFBZMVVDd0FLNVc5enZnV3M3NWRnUUpzSHZpQSBBSU9BRHJzSUs2WExJRWpNWE9DY2tRMGxzVjY5K09XaDJoVGJaM0djQjZIRFpLSGNFNnY2cm5jUGZPTit3dDhzd204V2pzZ1B0Ri8vIEFINUlnaUlaY05NVUxpUUl1bnd4a2FXQ1dSaWR3NVo3S0tCUXdvbm54MFkxVThVOFV1bmsxSWRZekVXZlVaNE9JcElaUVBTSDlPZDEgdS91QitPcTVaT2o5L3NYSTlEQXdXZWlWeFA4QVRtemgrWld2cWVidUZ3cTVreGlVM01NbzRUSnFGeXpVN01YVjFpa0dZSUQxeDh6TiB6OGdWNklzREx6NVEyR09sNStkV1M5UVFaWVFCTUlGRWpUR2VITFN6NmE5VGhsbXFUMWRwaEdSYStPSEZKVVJSRGxXS21pQWNGd0dMIEZaZWFPZ3o2MXJzL255SjA0K1RDc0dCeVBZYnRuUjVhZSs1NFNiNU93Qlp0Yk5abjkvSitmMzFZZWNnSDZtZndENy85UDErai93QlQgMUJXSm1BK0J6RmQ4R3BPYzJrcklFa1liSWp5M0FVbXFVV1V5ZDRMZ2gxdXRobC80TDRQQTF6Tlpua3A3akVlN0FnUkhQZ0FHS0RoZiB1d29PaXowRExQbEM5TEIwbCsxQ0pKOEd3RUlscVo5WjRqQ2JYWFJSd1h6RktQZ1lRWkhRcmlndjkwSTRmSDJmY1hmREZKcTQ0Znh4IHdQQVdEai9UUFQ4eEh6YmdKSnE1a2trK214dGtPN2h3T3lGNHhWNllKcm14ZzdEYWtLcTBPMVliQlpCejhsbkRCUGdZdFpXVGxvN0kgamdlQWdELzdBQTQxOUxMdEZ3RXNwOHlXM1VMWUlja3A2WnBnR3YyeHdWNHRzSnN2aDhPeUU5UGhKN0JUN3doMmhQcDFPclBUMFVLTCBLendtMGFUQlc2ZjdSSU8vOC9maVZsU0tWZ3NKY2hRN1RIMytheEZjVnpmSnV4K09nRE5JeXhOdU5EL3kwWEt2SGxzbDgxeHgrYThEIHJTNlExc3BscEs0NzJvdG5seTFIK3N0UC93QU9ueEtmY2xvTzc0K2NmaGg0YWRxRGNOblI2V3VENEMzV1l4b0Y2aFJtK1lKSU4rdDIgb2o5dXI0RFlENnJ2QkgxVVVqRDR1K0pKc0RZdzJTd2pyNDFGV0JFNWxGdGpWK2VUL21MZFZ6SEFPUW1WekFudHZNQ2FNVGFCbG1BMyBaMkNmbDNnSUQ4UklLQ1ZPbW1DYWowbmtxVDRoeVh5a1dva3ZXdlFLR1FzMkdlcm12YkZBbUNFeUh3OFB1QzNCZkdDcFVjejJ6dEJvIGVkaU5oTjhBSUQ4ZjRDQUFkV1drRUt6elVzRFVEUlErb2NEQVc3MVUyQlAxSUs3RDhWeWRpZ3VIOE83SERVSlQ4eXdKaXJCdkE5UU8gSk5aS2ZvOGIyRU9WRitpQ0EvVHBCa01WU3NuMUtKTnR5Q0JzNUlZK0EwcnBRNWpvYnlaRGJMTDNObHdjYWJ0eEIwMHp0Q0hVeXQyUyBUaXIwdWZGUHlNRGlkeTJPSzQwYTltQjFUdHJSYW1VdWMvVzIwT3BVMll6N1VzaUpNbFBsWlhkS1pLL1Q5U0V3d3RtR0Zic2EyaDQrIGQ0eFhReWJON2RyZ2I4ZkFIL0FZNy9PMkpTZGlIclZyZTVLMDA2c2t5NlJzYTJkT3gramNpdlRIOFB1QXRYRHI5UGgwT3F6R0tleVAgRjBqK0Q4bVJud3BaaXlFZGdsMmRvajc5L1FPL242K3pIeVpsV1hOcnBjcmUyNXNvQ0VVMmk2eVJDSVl4YUN3cjRaQ0dobUZ2Z2ErNCBOUSt2NTlWbUhsbVowSjRaa2NJbEd3bU93Yjk3YkFmc3pWRFZmVk1INk1Kb0ZtWFhVTlhWdWd5VFNla0djQThzcFRqQnFVRWtEWlorIHFwRG1wLzIxQXNuMXJUeDZoUHFGNzVqNlV0M3dZRi9GQVlNRDIvbUEyblVGUzgrUHpJWWxjaXg3bmpoVEx3ZVdVMThWWnRscko2UkUgY2J2V0FRU25LaW9hOXlhU3NSVlkxNU4zeFc4aFdDbndpbjN0NEkwN1NkR1lObGVhTDNhZFg5aEJXaTJkT01aOUR3Ry9GdmUxc3hBaCAwaWVBVmtiTGt1ZXRCVDArbDFTVWxKZmVlNHNJQS82bDllVE9vdGd2RFQ3cUxmSzZ1NXZDRnltblYyckhUL1dXUWtNTXNYR0VKcFdxIHlDRzRXbVpoNEFQVWI5N0xCc25jdkZvWlNudDNTZUR5Q2Zmc2V2c2dldmhrT3NaUzV5VGxCSUd3MWZxalNiQS9IS2F2T1hHK2VWdXkgR0liNVlFeWRaZG9XWWpyWXkzOEZjWXNuTVFsMkhQQUg5K1AxRlVYVWtIVTY3S1p1Y0xzdGt0R3Q4MGRKdGhmVHlWc0pNeUtocEZJMSB6U1pBeERRMXZqUTh4UFEyRG5LMnpGT0I0ck9BUko0T2ZQdjM5ZmIvQU5HTnlVOCt4SFpHZi9EUWpvMTg1V2VMRlVUWnZqT0V4OW1BIC9PY2U1NHFxdGhYZzM1c245VVcvcXN0RE1pbkptVTc1eHRWNVV0MWxIVDhoUFNFL1laYWJGTU9FTkRtVlhEVzJCYitldnovaGpDZG8gYWRFWlo3WE8xbzcrQVA4QWdNZnNDQ1c2TFR4YlFTbjVWaFNTV25oa1pCTWZKdFNPV3ZpcFdoZUEyMG5qNWkzRFQwSXc0TGJVUVQ1OCA0Tmo0cmpKdzRFeEJmcitJdkFZdVlYWkNtYXpGWEtBMWl5YWIyZ2xKaUR6eGdQTG1QcWJYcWE1T0xoTVQrSU1qZ1FodFNHdjkxSWF6IHRlQXdtY0NiMjhBRDZEc0cvd0N3ZGJVb3hNQXVCZ29VeVVteUJkbTFLa1YvcWlwOVBzSmJxOURkeWlHNEVKaGlxMlNITVh6SFpXd0YgSnFEc3l6amlqSTI5RzNiejZEc0Q4L2MrNkhUeXVJWlZDUEdrY20ycU1MZDY4dkNvb1NJZU1YR1BIeDBVa2NVcnhLOGtiUE50N1lnOSBLT1BNZHl6eURNSkl1S2RtSm9rOC9pZXRSRFlBTkh0VnZnU1QvTU02ZXh1bVZmcE8xUGlROU9aV0loMTB1RUp0YjNBK0IwOWdEMk5XIG4vcFlpY1pxOG5XYXo3V2dFL3I0QWZ3My9mNk9JOUJxYVJZRldUMjIxRFovVG1lYlpiZmtxdFROaTIwU25kRGxJWkFPeWZNaDJRUUQgMXpBMUFUem45VU5DTnNidDJ1QnYyREIyaTJEWU9ueGwzckNWNDdVR1BJZGIweXgxNjdOaS9Va01nV1c3SEZxY29wYWxvV29oVERFdyB5dnA5eGRqejN3MlpHZkZkbUoycHphNjZyUWQvQUFLaVA3QjFQR0V5R2VydFBpbEtycTZ5RXhqQ1M2bnFXWW5scGl1ZXVNOUtNY3dzIGhrRGgwLzZQQWNPVk9DeXN0R0l4RzN2OVVId0Q5d0hBK0FreERLSXc3d3pQekF6ckV0T29VNWdTenhaWVppd0Q4Z2tqaXlRS2toblggQ2VzUThhdVRHMGJBWnBJTVRlZEFxZnRvbWpmRzRXRFI2NXA5a1UwaHFVMlRLQXY3RXdVYUJJZXprMFM2NVY4Q0tHK0IyUXpNSGhvTSA5UG5vMVBreWJRcjFtc3ZIc0U4L3YvQVQ2K2ZQN3lnZDhLSlladEN2aEsxRmRQZjE3R3dnNUQ1aFE4cHZsdHd4N0srV1FZK3ZzbGRIIGlCNnhvYU43UGRaczNDYnNONysvY0JBQUFCLzNGR1FoWURSaG5NYVFlQ0ttYWhza3NmTmZFL3VSOFZJZlAyZUZaRzhUQ0Q1c0krZWogdUR5ekMxY1lUT2JKc2VMOSsvZ0FHd01GUEtGRTJHQlhDZ2RURDFwWVRhcEw4eHdYMnhiVGFiZC9paCtZVW5qTWh3eUMzVlo0aEF0UiBrM1BCb2VXWTVnazcyZjhBb0ovZjlnQUNVZEdFam04blJBS3Fzdkp1ejRyeFErZWVPZytvUit4R2VMTHl5UDVxcXZ0SDdyL1UvbnFOIG1Ba3RJb1B2ZEx1QWs3dVZZc2k4UWxvYXZ6Q1UrVmtycTZmeHREeGZJZklPS3ozQ3l6aGhaR2ZXVmg0T0JOOEFBTzdwOEI3SHNSWnMgSGxMR3kwOEFlbU5vRVdZTnFoQnd3NGtIQW5raG80MlFtT0ZKNHA2MlI0cXBMNTdFd1RabWdvTTN3Myt3TUNDZjM4QnNIVU9VUWpIYSBNOEJNMTZTY0pVeFNpR1BoaDVZZUxGbG5xNVhQaDJvSFpIQndIdUZqWXNENGRwOFlURnRHNW8vNVJCbjBIZ1BuMzRBQW5sZVF0dEVOIFBGaTVqYjNWRDhlTVZ1NFhSenc5aExqU3BnOHhpdHpGdGJYKzFkOFdCUEJ1SEdTbTV2S09FTisyUDM3ZnorSFRTelJ2Yk82dkc3TFAgSkUxSTlZNEZXcTMrOFVRTWIrYkFBbnV3MDdJQTdJanhvelpTREk4aVNXaHVBVXRlbWxHelhkd0JUS3lXNTYvazJyQVd4b2VWTXRHdiBkTzhOcUlzTElMdEJlc2F1VThlNE1pZWhoME1mRGc0cDdiWExnamsxY29NMk8wZitxQml2L3dCZ1lSVE1xdVVZeWFIc1lZdDF2ZHpVIE5ZWkJna244d1EwMFR3MVBJTWxibUljTG1CaFZnV2kyZzJRWXpGQlpORzN1cnJzQm5rRStBQWZ2M1VtNlptWUxzQjhRM2V2VW10M0sgWjRlWVNEcjFWdVFIZmdMSVBoaG1Tbjk0WDhhNW5zS0dqMlFqREdqL0FGeGQ3Ujl3QjkrZmtMbndBQjA1cllyL0FHYXFyVTJHdDFLNyBLZjIwVFE2ck1zaVdub1o0U0JsR0Y5RERtSmhpR3ZtSzVvZHdyUTRIV2J4RjFjTVpnYnM3Sk93SDkvOEFQN0IwQmt6cE4zejNLN0xsIElKRnh3ZDNKR2VGdFMwb3NrWDBhbFlBWEMzVldMcStRUE5IL0FGOGVTZXFjNnFBN2hZd3h4bEQwTmxKVmUxUnFjanV3MlBYckloNGIgK0JNRDAvdXBzNWhQY0RtbmkwUEQvYUtIS014d0hpay9mc2QvUFliQWZjMVhnNDlscTlNcmdhZ2F1bDVTVFRsM0Q5Tk5rYWYxTmtjbiBKc3RDVVhyN2dZZXlGdGtUdzlxZGo0RUd0MllaK00wWjROSkp0NEFjKzQrQTUrZjZXSXRYajF5RHM2QUdaTGtHdmpJZ084ZkpEdUJiIGh0U3U3UlhNTWV5VEZ0d1cwUGpZTUR3TnFoakhwWDV5c3ZBUTJiZU1BSGdOL3dDZlkzR3RTWVlBMVhUTiswM3FXSlVucU1jT2JqM0Mgc3EzeFF4ZkV4ZGpMYkFodUhHNGRrTUFjR3BNSDg0emNYeGViTSs3WGFjK2crZnh3UGdIeWFoVlZWRVpTV1pKRWkxQmVrYitQTXYyKyBuamt1SXliTEp1Vks4ckduelAxQWtSblI0NUcweW5LZU4wQkViRkxGM2JnRGo1L1YxWDFHV0l5YzB6bHlmUTlidmI0MU8zZWh3emgxIGhYQUxjckNxOXBXNi90UlAweHVGVjFXUUQ5dExRK0NZSm9yT1VXZDhONGM0QUgvYnU1Z0EzODhyUFdKck4xaHA5SjZjd05lcVZQMUIgVXFsZkUvSnIweDJmUStQSnRqY2hXMDlrVzdJdFJnbVFYeHdvZEg1eXNvYjV3WUk3RzNiZno3OEFQbi9QOUtSUVhybkR1YXRxRzByViBpU3JGbjBwUDFVTHdGaklMMzRiU0dpeDRiQUhtb2NPdDdJK0ZCeEh2alVZR1BPNmY3Si9yNC81Lzc5MHR4RWdQR3RjUmFGNTFYS1RxIGdaRGVNaXd0TlFaM2ZFUlh0Y0RGY09lYnlIaGlHOWxnSG9GbDJNSHMxWmFPRHJCM0EybGIvaUI5L1BuK3Eya1pnQXM1ZEVqZFgvbDIgWjJORVVjYk1WZmtCN0hDNDgyalRHUVJnUmhKWGVTeW15a3FOaGcwYjIrNVZObHdvUWtjbktoY2R4WkZlN21TenJWc1lsYlZ6VmZjeiBzdlY4aHVHbWVXeWJwWVZ5VmZ0OHdPSG1yY053bXZHSkFEVlljbXpLNVFZei93QmJBLzMvQU56NERxdXpSZUdxVEptSks0bTJjRWFxICttYW11K0RUczRsUEZ2bE9YSWhtRjhQOFA4a01DZnYxd1FEazBZOGk4Qmd3NXNoczUraC8rd2RNRmJYcXYzREpzWXludXo0dUI3K2wgL3dDRERWMkdaWE5PQ2ROQjZiM1VXdzlidUFmZU9XamtOVmgxbjJ2K3piMkU5KzBYK1ovcmpFU1FhUmZEVmF1a0hVaGhreitXM0l2aCB6MWZxYWVDc2FKWEthSFg1aTNNdUFRSFQxbzRwTDU2dVhBbU1GMmhpaTdJN2NIK3dBTi9BYys2U0k1b3MvVCtvMkJITnBvWm14MDhPIHhGSEdpcTFOcytDekhGODdBcGNMWTNmK0p4TVl0eUZvOVJQSEp1eVNTZG5xeW5GTHNrbFUrM3U3amZXQTFkZkZuR3JVRmZCaXBiYTcgWW03Q0gyUFJ1b0M3bkJEN3NKcjVaQTU4TWZNbU1wQjdnejJBRFkxd016eVVLbzNCL3dBWEk1OEFmUVdBL3dDZlFZR3dFUExTTlBkUCB3SmRrRWc0RmtKV0UwSkxJSFgxcTVQdml1NEVQd21ZWkREQVl0VHM5V2s2WThvMW9XZ1Q5Z21LU2RRZnZ4OEIwZVVYVjk2TWEzRFNhIDBvRi9aR05KTjA3SHJIT2tXRk1WenludjB4eFQ1Z2VHWVk3UkRnOXVBejNBWXpVMjBjbUI3MjdIT0E3K0FQbitRUHlmcXRES1ZWSDEgT0pyZGsyMVdDUXF2OHRYMUlKOGQzaDhOTFcwcjJRd0xZZHdlNGN4eFpMR0ExL3NaaG5aU2d0YUtISFlKemgvZnZQN0FBUDhBUkdGMyBFckk5WXpUV0s4N2tMUmpuSWNqY0pIQnVxNHV4UW1qVlJHeWxra2hXS09aaEZHZzJwWVpXWnpGRXVONEtvQno4a2hoaVZMKzc4SWJ2IFlGa2FwVTNUSFYxa0pFMFpkeEJWVnBGM1RGZFhoNEhuQmd0U3Q0YTJ5Y2Z3NGszN0doa3lhR2hzeFA4QVpEajgvQUFIQVY4QWdnQlcgbjdRdVMxY3hWemJWczV0Y0FOYmpYZFBxdGtZRzFiaWdkaGlyYSs0VlhNVDdVWkxCZk9lZHBUbTJQTFFoakZrNDZwS1NjQUgvQUdBYiBBZng2M01nOVBxQ2w3T011OWhTYWY1VXBRNjNyRTlJWGxzV21sdmloNmZtQjRZZWFuL0RnMHM0QVFkOERXYitLQm1XWGtKZGlTOGIrIHZ2My9BRTYyeG15U0xyOE9yM1NuM0hXN1FBdVNzZ3dHL2lDOXNLR2tjeXF0Z21RM0N5QStJOWJlUDJNUHprWGFIMGMyN1ZjY1Bud0EgRGZ6L0FKKzJlTEZtVUpMZzVRaGxIRkZPUWJOWldiRmZBNXZ3TVpsVlhpQ3c2WWpHNUdOU1RBa2RwYWh1U0EzdHB4ZVRpeDFKVkFLaiA2bHFRUEpFVzV0Smg2QkRmNmRwQ0hXTGdrcmNyVSs3SWx5WEFQdUJrTDF4VDVpQWhLb0s4UVR4aXo0b1ZvRThBbnBkcVRBKzdBQVFNIFYvQS9pc3N3UFFkeTBua3dFaXZiSUcwL0MxYUpEeG5EUjhzT2h5bXg4UTAvaDh5RzRNbkhqSndDd1h4WEpqZ3FIcHlXZFF1eUJIYXEgMzQvdjRCQVBvT3dNMlRtSytMQUgrZWg2ZUxhUTBNNWJBK3Q1bGJ5cnNUYlFzMDlLRDJBWXArMUZ1R0gvQUo1dCtlQ2NCaU5WOU5yTCBOOTI0T0FQNytnL2Z3SFgweFY5YnJGNEFZcVJrcVVQTkpEVWl3Q1VOcGxtSlFGaGxDN3M1Z3Q4a2lkbjNDbllGd1QvbUV4aFJYOEdiIDhIOUJQbnovQUxvT09SZzhjcFpETkRqTUpveW94ajVySlVmK3I0QVk0cUVzY0hMalNKS0FPV09VTzE3SWg0eDdyaWlpdXI4Tmw0c0UgYzJqYmNoV3pQWjdtQTFVbm9ESnB1ZkxhVStCMUxhTlpNaUVUTEM5UHRxZkQzZ3dHRGZNT0laRGZVOG1zM0lMR0l5T0VDZHE5Z2ZzTyBmQUVIcXkwZStmbFhCWVVxd0t4R29kWDJReVMzREowOW85c0dLNUYxa2h5MXRnRG1LclczeUhWNjJjZkt2UFdOVzZNOCt5d2lvNXZtIDNQdGdBUDUvMzZaRFpYK1pZeTNmR3V2S3oyUmNYQTdJcDEvYzEvY2VtUmJHckt4bWd4eVJrdUN0NjNRMkJ3T1QxL0JIdUNvQm5GM3AgWk9HL0I0UCtIUGorL2dBQ2xDTWlHMFdKTWdGR3AvdkpTckYvZHlIQXpBbERsZDdxYkFvZThZR0ljd09QTVRvQysrSEdRWjdvZTJmMSBzRTRDZmZzUUQ5di9BRmRCaktzTGJUdW1BU01iVG0vbVZMYXFydDVOMjNJQTZHUGRqK256WGNTR2FNdE5LZHlCY3Y4QURNdzNEZUp5IHphUTJCamp6ZTVmNUprWkJLRk9oaFNCT09jTVRpMkZaVVJaZGpWK1BLTlUzTWQ1b3hTTUl4bE95SVFpSm5NL3F3OUExa0JEV3ZPa2UgdVFkS0JWS09iZ0pLem5RSVF0R3NxN2FIdFhYckd2V2xFckY1WldwRHJrRnB0Sk40TUNxMkxPeHNhUGtBVFhwdnNUSXpGejBrMndwbCBLK1JOOUV2UHlGbkpFWVpXZkdnK3FHSkc1MDJsUGtXZms4Y244K09rN2pEZ2NBY0FXVFEvMXNmK09xMEhIeVpmRDZrdTZHdHhhVFErIDZJbGZKWGx5RndwR3BkMGlUQ0FlcTYzaGgxdXdPNHdGZnBacWNGa1lydEF5ekRpVHpZR2cvd0JBb093ZFcwOWZkUlhNUTJpS1kwdVAgbHRhWTQxWlYrTnRxdjJHR21sR0Z5aXJhK3lJYTJHRHA5Z1RBZm5zSzNabGxwZktnL3ZnSStCZnZQZ0Q1L29QaDVqaGFDR1NETnVUVSB0ZW9ZMWJFMXVoekYrc25CeXE4VEVGNGtGckF4REQyUnZDcWVIZVlXQ2F1MEl5TURDSlBPUFA3QUFBZGNaaE9lQmJRbjVya3ExdmFpIDROVWw2bisxYWZFY0VPSzdzNzR0OWszQU9IWk9QaHprOGcrVGVNOStGY1pzZFhPcnR2OEF3SHdIVEp5c200WkFrdm95N2tCM2R4NEogTU1kdmFtaXN5bERua0RoZ3RYa2FLS1F3WHc2NmhKcEpCSWcwelFMSUJxZE5JRHBkVHBOVC9lRjdKQnFVbWp1eXJSR2xaVnZIajVWZyA1aTNwcGxWNC9oNTl6TGRzWFJXN3M3MkVuMDJVWWJ1bFRCOWI2a05QWWNPR3EvMlVyQWJkbnJNWVVGc3hQd2xvbysvL0FPVDhmNlBKIDlxTCtUSW1ORnREYlJaTGZ5WlB5T1lQQmFZS1RVaDhBekhCRFE2M3ZnUE14RHdWSmdnSThQeW0yTXh3M2liUjBIc0dBUVVFQWVQbjMgeFlHWlM5M1hvNjBobXVOUzF1N3pOVE5tbzllMXZYNjZIZkxhMDlucTVtSi9KQS93NFpDWjM0Y0xhK1l6VWFybEJoTkgrNzhCUGdENSA4K0FRUUFEamtXUTZRS3p1QWUrVmphTmhTaVNUWVJpWlc0L2daUVdXZkZmaDZHeUlUaGpaQkF3MVZMalduRzlyN05ySk40TjFjYkNXIDZBdzJCK1BuMzdwWUN0R29DUHZacWxzdUcxblFxcmJkUjhlOVBUc3F2ZDBUbzJSTE9pSXlNN1JSdk5MSDJZVVkxbGxiWWtHZmE2NWUgZVZQRkc2UFdlb0MxWGhKVWhhckdXKzNvTjRxK3ZYeG9zMkdydmtzOUtxdjVqZ3lJYjVXN0I3Z2JRUkVlbjNtekticTk1R1ZXN0JBbSAvb0w5di9zZmZ1cXJVV255RWdnR1hMYVcrNmxhR0pMWnR3Y2ZMY0NsM0NVMThoMWVITUxmdERIcDg3a0NIYW5Ca1lXVUp2UENUYnY5IEJmZ0I4LzhBcml5Rk9oNjdQajIrSzBIcWNob2I0dGxtRFRxMUVLY01IZ0lseUFoeDVpWlQ4TVBNVDF1eGxLcm0ycTRaUHVnMFBQT0UgbXJzQVlCK1Bud0dDRHNIVU9MWkx3UTJUT242YVE1TEpZNnJmOTRoMjBydThLeGsxVGlsSmkvTVc0ZUFkYnRCYkI0cjg4NU1vMFcwViBmWm0rQkFleDgvQUFIN1lUNERxMFhQY0VPeSs0VTIyaGFVT2NidW5rbG53Rk12Z2M4NWVCVlBhdEcyTWl3eDVLeXlORkpFam5ETldXIEtDRFBHaFJZaTc3UUNUWXJJYUFlVTBaTXF5dzl0V2RiK1NOMjhsdkR1NHlvc3VMS3A4aGFpMnlNakp3K1pCKytLcTNjQ04yYlppWU4gM05wSnpIZ0Ivd0RFZm56WmJINWRmQjA5a2xWakdBaHNrYVhER0xDWUJMSWVRNnlQUlErOGN3aHpNR0J3Z3owL0JWbWpiTXhmQmpONSB0SkIvMTkvdDgrSDZuMTlmdWtPN083R3F5YTlQRXRwY0VPNXBDT1lQVzB2T1RSRFllU0o4eGtReDh3SDl0YW1RbXpGRU5sck1Ha3UxIFhjQlBnTmdQbjJEWURWR2hXZktjS2xQQVh4MkwyRGxHMVFBSHlaL0FpY3BoamFYMDl3eHJpckZ1MUdSZ01mQVlJT0ljb1VyQlh0OG0gRE51Mk9MQlVXL3NBQmdBYkFhdXJReGlDTjQ4c3NCS01IaHJDODA1dk83SGNLeHZtK0FLNHlNN25jd3hyR0RkUTVWZUQ3aStQbnQvSCBYSmFEUVVGdWpoUmtxcTJTMUUydlVDbkxZVDJxTUpXM0xVWWticHVENTh3d3lRMTh3am50TjU2RGp0aXVoNGt6bjBuQUJpL0FPZmVBIFF0TmQ0TDZreVZpNVcwa3lTVVV4SmlWZTdFZzloUTBJOXdPTE12RDZleU9BZXYyU2NCSVlBMXNadW1GbURBbitsWi9nUDcvaWVBRlQgV3Z0R2JEUFZVa09ydm5EeVJKMy9BTWFHNFdGTWZGZEljdmhqNWlFSFQ2ck1EM0FIQTRrcTJUWm5zcitjM3Vrem13ZnYrd1l2eXJyZSAxSHdBRHlRd3NhRXM1SW1MY3ZlTFVSM2RrY29yWStORU1mRE0zQWg0TGJnSE9UeUFKVk1jRzR1VEpmU2ZQb09JRSsvYitmNmtaS2hVIEJ4ZEVUZFh6NEphZWYvNzVHWnlsY1o0NUgzRVdWY2l3VjlsdjRnNjRWVlovTFdmYUQ0b1VPYjRPeDlicTlxMVBWZW5PNmNsQUdpazkgdFhtQWxiYXV2YjgwTUthK1E5NHJkODVnSFRwazVUUUswQmNaWnRyR0xJTUphTHR2K3dId1B1d0lLQ0xUR1JQbnE1NkFaSkRIYktKSyBUQ3IweTFJOTNHSlFBU0xGMm80R082bEpoK1FCd2RMT0Q0RDR5VEZxMjU0L2RnZS8vd0JRSHo0RUJ4MmcyZGd1U1hUUm1ycEp5YTBWIFFsZXE4T3poNlJNR1NoSUZvbUw1aHdaYWZRNWcvd0E4d0lUdnVlNkMvWTU0UUh2NEFCdjRBLzA3TE1oMFBYdy80RFJxbzA4VExhZlUgQ0phTElCeUpZZE5zWlRGMmhnUW1CdzlrYnhhRU5IYldCU2dwNnd6Ym9zb3FPN0JjTi83dWdPUHZ3SHBLNm1OR2hSNVV6MXI2aVhUcSA4V1JsazNSTFBncGRKSVkwM29naVNSOGNrTXdMQlhmVEE3c3JCMFRUSkRIS1VhdHFNWmJLbmc1Y0NRZzl2ajk5RDd3czFjVjBlMW5mIDZsa1pENXFOWDd6a1pMalhCbDBqSzFpUk1Lb3hKdCtFSk5ycUd1aHh4SDFIdGpHclEwajZSMlBxczQwZDlHSU05Nk1NMDJ3ZW9YY0IgZ09rWWRNMldaY0ZFOEx1eGJyMVhwbXZhZjFDR2F2aWxxNTFCVENES2h6THNzZ1BSNWpsdHdWSzFCOEVZb3IvbzdoTmlBUHdBL3dEWCB6K3dLZlVvd25iQnQ0RnJmTzZoQmt3OW5qb2ZxRVk4Y2xBUzI2Mkt4Z1VJTXlRb2lHT3RTRzlyd0wvbVIvd0RtWmlTMWg2ZlVGTnIyIEtIZ3dZcngwL2hiMXcwMzFJdVNFbE5ycHFmNnJmSVkyWmRGL1pPc2l2WVlHcFlsbnRBZGZtWHU0cDdJdGpvU3JXZG9LYnV0ckF6RjggR2M1Q0d1Y2dBQi9FK0FRZmNBeUJaSTI5U2VhWkpacDVBREh1U0JKSmQxSW5relhMYk1oVU5pTXJKeFhwYnRITkpOS1VoaVdMYWlrQyBraDVIampqaWFWRXJ2ekVZTExrTnU2eWZLd2VxL0Q3TFV5V3cyY3lOVEdxMWN2VnY4eHdyMWJhSXJEWS9KUG1MZThka3g5cVFmNHNQIDRqSHpCWkZ0RHc4bk9iT3p5ZzhmOTM3MjJDc1pTcTc0Unc2R2sxelZhMmViYzZOTC93QUZrUjBoRCtWRXNhdVE0OVBXekRJWURqNnIgZzhnQXRUSVRHTkgxbEg1c2I1OEFRUUQ5YnZuOFkyOEVjZGNsZDE3YUdhQk4xaVRXN0FzMnB5U2ZVNjhJQXlxOUtGSEJmdmhQVDNCYiBtRDYzQlR5QjZjeWJtcnRDejV1cmdtd1AySGdINEFBQVdLU3grb1M4eW1kWE9ibmI5RnNoYkxEenlUZkNuWkVxbTE0Q3J1RGhmRGgzIDRNT0JEbFNHUUEycERadkY4bVIzWjNTZnYyUDdBZjZHTEVJcUs2ZXBrcmlSdHVTS1NHVjQzUm82YS9hQ0RrUGNSWGJaa3VXOXVQRk0gcnlKSEp4SFViUnVleGtqeXFPNmF4YlhTL2psVmg1QXQzT0pObHFTM3hzenhKM0lPeVR5RXhLdHVYWXhUOEoxdStJZDhUTUZ1ZWhwNiBIZUMyc3MxWDAzdWYzYnovQVAxZnZjQUJyZEYyUmNFZytMeXM0MkJ6Ykl1T3ZRNkhjd2VYRHFXdVdFOGVUMkJQTVZYWkRJWUljVjdnIGNxVHlhejJ2K2oyaWIrZ3YzNytBNEQwMU16VG5EWEtiWTVWMG51SzIxWVJ0aHErMnFOcmVMTUZ4U3o0cncyQ1pXOWtPRXlIWUVOSFAgZkFoTGF6alYrMkxMd0VDSkx4di9BTitQb093ZEo5dGFOVURHOFdwbFJjNnJTUUcxQmxPWitUVEtPMll1U2JxYUY2akZzZnB2VDJSUCBEM3dQTUE2MHVGOFZVL2JMa2ZXWlpCM1lraERtd0FENkN3SHdBQStjU29qR1BjaGxtR21aSklTWXBFVFpDN3JPWGxqaWx3RG9SdFNQIDdqbGhhNWdyWk5EdXBLcUk0akIwN2RrY2JZN2FpUEhqSEZySmJ2dnd0Y3lRcXJOUUZkSTRlZUZ6aUlkSXMwTFpzZGN2TFBpQjRxdlogaC9GT2YxeDhEVFVPeUdGd09mbHRweEpMVDRyZWM5N3JxeEFZQUZ1Z0FEOXNHTWxsZzErVVVvY003MkZSVmVsTEl0cDNyWXhiVkx1OSBieWp5bmJWWDhnWThHUmtUMXZHYWNuMS95cHdKc3l4M2ZSbmZENk9nN0FmOCtnZFBmVStPOUN0YlpjVkJySjNwV05UREdwY3IwK0xEIHVHdmhFMCtBVUlPT3RRUGlpR0c4L0xWSitMQll6NHo0cTlYckN4aGhnN3BIQU1NRHkrZjQrQVRVaFRXM0cyQVB0a25FbWdyQ1FIZG8gWkxPWUY0T1VpeEhMamZ6RnN1eUdHUmZtSEZMaWJWeG5kQmxtRTNqL0FGVUFJUDhBUVAyQmd1TnAzamNOSDlPOHFTSkhKbHU0NXh2RSB4MjJWWTNyY0RWSWplS0dOazlOazJBNmlKOTFCanVLVnh2R1dHVmVjbXIrSmg0UHVKK0tJb2h3N0ZxVjRhb0RtZUpYTnBMaDIwN21LIHJxdTJDM0E2NHRnOEJodURKTVQzeUd5ZHlJRmFFSHc0aExMMVY2R3piRnZlOWdBQURZT2ZkYjdJbUhhNXpNN050RE8rWkFtY1R2Z2wgWjFidGtPTHREUjh3ZkQ0ZVk1aHhzSEI0SE9mQ2J5THRBWjdiMmJPbjBFLzUvSEUvMHdvN0k2WndzOVh4bTRIL0FPZWsya3UyQStEciBKaUxiNG1yelJLVHlJZGtjSWNPWW51RTVTdUFET2g4WkY0bzIrY0txNzlnMy93QS8wcFpHT1VHdHlHK01jeU51aTJiVTJCYnppQ1IzIEdUZTQyOEVXUkRRN0lEUXgvbnFQSVFlYy9hRm5FNEVTTFJSNmlmZ0cvd0Rud0hRa3FKWnBNYWNReDU0dkx0dHRBMWhDOGp4UTN1RzkgcFZ5b1o1WXJpVUhxR09JZHFQTWNSN3NOM0FIOFpWaVB4WnZ4MDJvY3g1RnJkMkliYlhvUWxYeVRhS1E4T3llUGgzQnhlSnoxRFQrQiBzbnpKWTh3cXdHRTlCTUUwYWg3ay9yYnVsaHNCOEFmOXVQOEFTOTVCQ2NqaklwVWlCazVPVWt1eTlWNTdKcUJoTGkyaElUWXZNRTh3IFloT0NKdzhHMmozeWRNL2EyWm0rN2JKc0dLQ2ZQdjNnSkpIT2FqRzIzTEpkek5uU1prWFYwUzNCd0QxdmR5Zll3dHN4YUxzMmRQcmQgOGhwNmZOZUtXWUVOcWNOenE5WGVkajdwQkVjK2c3K0E0RHdMclRNZEpyYXQ5cW90UE51RjNFdFNERFgrY1NYN1l0Vk51NnNrUG5sZiA0aDlNYkpTWm40ZS9ZTnRxR0xNZWF2Zk81andiN3BJNS9vVWZLSjl4dDJZNG1NUVRWbzVvN3h6RWVCQnFSWlk2TEVkbDMzVXNaYW5qIGJKNE1yOWN4MUpEUWo3bE9mRVp1cFgrM3M3V3ZpSGFGKzJLSDFBVjZ4bVJ1SjVwRGpWUGNuYU9KZkUwQkx1NU5aRjk4N3FXcFc5MTggYnNidkJQVlE2TVRhRmNZTEI4SmR1Zlc3OSsyQUJqMG40WnkzQ2pKbkdhcU1WdVlQVEpNc1BaQUZINGVVdHBoaS9ENDI0VEhDWUhIeiBKMWxyNmkxQitjOTBPRFBCdmhKdysvYi9BRkZ2L0lBRjZwQWV6Tk9kc0RMdWJaaTNwN3E5OGt0cU83WndlSXR0RFF2U2xlcTJCdzdWIHpLck1EL2d6OVNHQU5RV1Vab2FCbis5amlDQWZqNTkrZnRnNlNiSm1VV3BMOVZvY1ZWalcxcWdtWEdKc2kyczZSY1llcGE1MUNhWDMgd1BhRXhQaG9aZDhZQTd4M1FQWUxheU1WOXpHSE5qZGtkK0Fmb0FmdGd0ME5KSkJNamFqVFN6VFF2Z29lR1RQMUl6ak1qREVWdHlCbyB3d0p6eExVdFk5VFVyUEcwTU1zQ1pydWhnMFByc1hsMzFZOS9ydTBjcU5JOXgxa3ZhYjZGYkVGMG0yMnBUNmxROWVraHRsbmtDc3BBIDJ2VStWZ1VhQkpRcFZhZStzamhTYUhENTU4QkFiWjFrRXhpdHVheWM3bzFkZ2Y0Q3ZuL1kvdjZya1pjTkRReHVVMFRIL0hLeVVCZXEgY2ExRUhjTzBPU25VdkpFOXhpVW1ZbU1wQ1lxZ2EvUlBKazZ2NE1qQTdSU1RieC9YNER6OVJBSFlVMk9xdXpOWnBydHZ6dUhkcW5zRCBXQXRtRWd4WE5vVWcwSHFySGg3SXA0eGNISUlkamNlQXpud21NRjFlc2pEanR6WUhpL2VBcU1Cc0hVYkkrUGJTK0JwS0JNQ1hBdU5TIGxNdEFiRHI5SG1hZlpSWVhWNmU0TGJJR21za0lneUhBTmdOb01QV2JQY2xYOG1CcE5YQlB2d0FBZjU4ZjYxYm5wd1J1Mjg4V2VFekMgcEJudDVaOG5QMnJqN2NhUG0rRXFPZFRod0hkRk1YL00yN281Mk1helBHSjgrYjU2bmhkcVBqSFVkZTFLblZYcEwwNjZvQTV1K2JZUCBYd3IzR25uckdtYVFGZGtjRERoVzdKTWhrSWVMYnFBck9kOTUzUVl6YzJDSk5WNG4wRUJzQjgvN0tXMExZc1MrWEFPVXpWc2JaMmJEIFc0aXVTczdUdlU4eUxLWGtJWC9KekdRd245cjZlYWtNaEFPWXJOdnREU3pJMVZwUGE0NEFBSDM3L3dBK2NFZXU1RkxXeFowV1VlSmMganlKTmUyRGVWUHRBbGt1NktwbEtIdFFleWRoMlFOOEF4QjIrQkI0TitaT1RmZHFUT2Z2L0FHaUFQK0hSSFQ5MFUvM3MxUXdGY2EvcSB1cHNrdDFsVDRmdC9ZVEpLVjJ6U3EwR1IwTzB3NGVHNEo2M09iVjk4ZURIaXlqTWlwQnVrd2ZuMzYzZC9BZmZrU1lhWVRTTnZPZ2VGIEkxai9BSkZ6eUxCcGVialdoc3g0RGJKZnViTGc0eStwSWppaVVPRWxsbWNqTkJIRkdaQzBjWGJ0MWdRd3pZTUdVMk1LZUMxQVZIZWogUnA3QVV2YjhNazRiTU5FV0JEZDZ2RTQvRllVT3J6RGlZbVVPWURoN0FaSzVyU3dJQ3JhaXp4ZTBGb1k4ZDdlRG9QUHJkOEFmMzkxdyBHM1UzZ2R2aW9IM1BXclRLYUl3dW5BdmFkMldEWHkxcDhQSkt4YlMwbnN3ZVdYcCthb04vYlVodDcyOVZvK1BtSGRRM2FLUWJ0N0hnIE9PL2VmcFJWOUQxUFkwTmtybUtoNmtLcnE4OFNTSy8zSWZZVmNSUU5tN0N0cHhpRjRkUHI5YkJjd1AyTk0vRjVYYTNnMy9RUG44RDUgOEEvZ0xPQjZqdU9CUmRjYWtRdWNTWmZtS2RoQmh4N3VhWXBIVVpjVk5nWEJlcXlaTU1Na3h3dFJIdWhnbnRKa1lNd0YyWXpBallXNyBNVjkvQUFOZ1FmZnBiUktaUXBlRkpvdFZKS2pTTHFwWXhIcnNGR0VrN0NKcEJGREtrc2NEdnQ3aU5Jd0dDdG8zbmtqTFI3eFNhSFRhIGVaSXZwVkFmUnhMR0hQMG1NWWdTUXBxRE50UjRReHpOZytCNnA4WmFBK29ZcVJmVlgvaC9OMThCY2lkTlhZYmpYeFhPcVJMRFJ4a3YgT2tRcTdXMUEycDNRUXl4RmNEWjhKT2drZlErVFEwMk1KeXVMRGc2bmxBeDJSblRjeUNlcXQzRmc4eXVLeXFuTlRsVVBFUndjWk1WZCBVM0U0TUJaeHpZa0wwcms5WmJRSzZXREZJWHJqTVE2V0VCQlJrT0theXdjUVhDeXhHR1Q2YzY2QmZWTWJXTEpTYlU1QVdEalJyRTFmIEhIN1A1SFhFbFlMTElzZzBtNHNqcStXa0RObXJZdGJiNHMzZG1oZmNhSEZiYllaQWJrTE1XTlBRNmxjTEd6cUJxZStLVEFvN3U0SzggVnNaNHI0NFduWkJobGNJYmhNYXU2RmwxWDlad2ZDYk1EU2RVVHRWZUNDZUFIN2R4UWV0eENuMTQ4SG1BUmRwa3FaMUJRMXV3c0VtcyBESHZxTVBNTXBuV3g1Z3d4dzNEbUdBUTg0SWh0d1dWbFd0REFtOEJMUi83QWZZS2lBUDNWbkZac2tTcW5NWlZmREt1dUR1ZHB2ZUNIICtDWUxPRmN1VEJTTmMzWW53dy9KTm5xOFBCQUVMYWFyVVdYa29VdklaZ2IyVDc4ZmZnQjgvd0Fnd1ErTXlxenpJQlYxZERqWkxjN1AgK0k5UDRPV0RsSHkyTjA0Zk1XdzYydDdnSCtCcHZ2akV6dGpRVVJ1Y2MyL1FCejcvQUhCMWgwazI3R2pwMjdYb2tGb255d0FJYTRwWCB4dS9COGZCYm5Ic2FyVDdUTUZWekRJN1BFVk1zUUY0WkQxWVZ6cTE1SGpteHlPcTkyQXZ1aWtMMHh0b1lhRXlia3FXTmZLL2F0d1Z1IEpmRU5vZDdHVG9mZXpGODdxUXg1Z0gzQVEyb1B5WW9MR0UrYmY1L1h3QUErQVBueVMzTElaSlJBT0xmTlBadlQyK1h4eDYwSmxrV0IgTFpKU3VXcHR5V3lIQTd0aGgwOXhjTzlLL0FuV1FzTXVvenVaWnRxWFovWHg4K2Y4QWY2eGtNVEtxT05WYWdTYkl0N0NTK09ZbUo5aCBNaFI4RU9WYzRzRmJyYUdZbU1qQUgrQVFnUWNPMlpUZENSdzN2WU0vejQrZkFiQnNGcUYvTHFTZkQyR1ZxY0pXZEZKU1dHK0NRRzhFIGpBRFl5ODVTZy9HekNmTU1NaENaK0w4SGhrOG9VNU1jcTQyN1lnTmczOC83YkJyWXl4NnFBOXdTT0dTQXMrN0xoSDZlMkFpUXlSa3IgMzJKVU4yTU1lNjh5bU5JWkhqamg3MzNIdUxGQkk5Wk03NUhIS2hpTVQ0UFNaUW5tTzBRNjlYQmRNMUtucG9FSUpSN0l5cll2bm1TSCBMbEFaZytHbjJRaHZsa01DR2NVaDZrcTNZemRyN2tabG80RTg0Z29KOSt0M1lBR3dHcFF4bHU5dVBpNVBHa2srVk1XMnd3cXV4aElmIENsU3NJczh5TUJoRHJlazJTbng0ZWFoOFNSNFpQZ2I1eGs1NFRmd0d3YkI1L3FUNHV0SGsvSmJXTXdnV0U3bjQxZTErNFdGMjkydmsgSUZOVzJDR1kwOXVIMThQQlBNRThIaHA2WnVCclA3M2k4NysvZmY4QXBTcmN4Q1hFTXd1VDl5QVNvYVFKVDJROEhYbHc4aDkwRHo0diB6T1J6SWZINGJWQXNBOEQyeFovR1pPcS8vSVB2M0gvUDR5eVJ5TUloZ25hQkhCRUZqUWc4MUdzZ2pTN0hzUk12dXVnVjFySTlCWkJrIDdJNkdWamNqNUdNMjdzREkrTmNDU1JxSk9PTnRrZUllWllESFc1NGcrcmVEVlY4eGtVNmZKWEF2eTRkSWdhY1BBWmlmRFpMZ2gxdW4gcjRkSHgwM29jNHdzc3pSYUN6NXNKN1liQjRCKzZrbXlzbmc4OEUvK0hoUTl3VTVaelFIYlJJZEpodE1Rd1VvZXdoWURUZllGd1RMSSBNTWt0Z2hvOEJmMDA3UHdab1YvN0phUDVkUVVIZjhlQWdBbU8wRUhKd2RueDhmSGRWdEFreVdFSFNYenRsejJwVk5YaWh3QzN2QWRrIEQvTXJrQ3dOdGNyUXhaNEdUck1IVjNDYXJBSU9QSHo0QUJzQUdIcnUyRmV2N2FwWkRkbjlWU0xPcVdJbjBQTTFFRmx0eU9yMFVXWUggMXVIc2lrMlFQYUFmZ1pDZk9EOWpXaTBOc0JoTU1jTmdQZ0FDL3Y4QWgxcW5pMkk0WEVhWjFHMGVtZGM5dVNTZ3BNdGoxSU1TODBlQSB4aUR5WkhieGJORTZzN0JqZVVJbEUzSk1uK1hENHh2M1pOZVZVS3JxMFFpT1luMlFlWE5oZGpENXBkdEd2VTQ4TmoyRW4yMWR6eGZFIHBQSWJPWlpMVWh1RXljZVR6MXFKNnlUYUt2cURmRFlSS09BRDUvOEFvRS9qMG1WZHNUNHpKWVJSY3lXVEN0RHdTdlhCcWh5SmNLVUwgaVNtZ09vVExJRHA1aVl2clVINkc4Ym1NS05GWms5OE4xZDkrUDcrQTU4ZkFHREJWWVBUU2wxVXVYeE1Obm1SSmY0bFhrcitxK3drSSBDckx6UlY2M2FIZUFQVzZlK09DY2NBMmg4NWJaaWZGM25ZK2JYWno3WVBkQzRDZjZrY3V5TzB0dVpJdGNVSGI1V2NOYkk0Y09yc05QIHVVb3NtaTdnWHpCaHdXMlZESHpGWGNIdzRuMGI0dW9HWjU4MkR4L29IKy9xamhZNTl6eUttRkxwMnVxdllMbXVObjFNZURubWZianogUmJjcEhWSHk3VUxya2R3MWlpOGl0eWpaNXJIZ0U5UVdhNkE0dFo1MUlwQzJwR0xCejR6dUhBcEZnRm9iNG11NTVYdFJ3dFN0MlNrMyB3eFgvQUlCZ24xemd6TEtIcU1XUmh6emFPZ2dOL0FiL0FMLzBFcGJSU2RjMEdZc0VvK1VTNFpwaGJsa05PcVRhQ1JaRy9DSEpEY0hHIEhEK0hmQWVyK0syV3dVdDh3bmVaUkQ4SHZadnRIc0Z1K0FQNysxRERBTHB2TXBtTHp5MnJPc2FtYmE3UG9kVjhoVDhhNUsxemFIY0QgdXBEWlB4K0hzYkZPZ2NiM01XTEo3SHNod0h5QUIvWDNnRkxIdDJ2MGpUK1NxVjNEcmN0OFZZekRJczQ4OE1JY29CWVNqNDRXQTRJZiA0clpQaHZGYVdBcFZXaDFtc2kzemJOa2RzTVQ2RHY1L253RHJSR3oyZHd1aURVeHVYUjhhRGhxQlhIdVBieHlPaWZuRURsOW5ZaVg4IHhxVnhHWCtUbjQ1TEU5b0hRSE1qNmtLcXF2NVdiRFFNOHl5YWgwanZNUzhNQnFYK0hTVW5wOVByZmRRTzRMN0lqb1ovdW95RTNubmggTm1lWGJaSGpuNEJCNERoMWFLWTZNaTVOWkQzSkZKa1kzQWJZU1BxRU1ORmVzZ0JOK1hZd2NpeUlkcVZXaDdnSG5BU0VDRFc2TTgxZiBjbkdRYnNiMzMzMzlCQWU1L3Bldmkyd0xyaE1ETWQ1cVZuQzZmcmNzcjV6N0hkeTlvQ21FREYyOHd0b2JJbnpSNGZubGY4Vm1FOEVNIFhabnRhUENmb08vN0FoWW4rcldraEZFS0pOTzAxVDdxMDRvcmFZcDExZjhBSnpYNnB5MXlQcFZuZlJJNE5qcFpaZTF2cTlMeHgxZWcgVFZxenFkZkdaYTMxSkIrbGd3T29ERjZnQjcwNDU1R2lsYU1PeVFKS2dkaHBYcHlUVkx1VjJZMlNEaTEyZUJYTElZbkhmQ3ZySSsyWiBiNWQxaTA2UnFFK053UnVmY2NmSGQ1Njg4cEZidkZneUJzVThOTmw3QkRrcFpCa3M1WHhEbENqREZGelBocDh4OFE1ZzljdFJTWUo0IE9FemZmZjN2MzhCK2dEWU5nZkMralF6MWI1eklyNVBHMWQyQ0taQThlWDdZWkx1cEdYOFd5TzJ5ZTRXUVlNRDVrQlNjWUFQNnlVR0UgeWZOZ2lUNTg5NERmei9TbEh2a2UxUWVVVXJtWlpCaElXMXRJYUNSamozM0tobnlWTXNDSGFkVm1HVGgvd1h4Zi9uRmhHVjBOWko5ciBzWGM1di80ajJEWUVGOFYydnpMSFM3Z2JYS1pHWkExZXR0ZXlOWFR2UzVZT0F0QlVpMjBZWHpGRHZpZWhwNC81ejRRZk9Cc3l5MFUzICs5NzI4UHo4L0FIN3dIVFpGeHMzN3lQU25ndDVzY1dXNWQwZnhTYmIrdzNWZHQyTThNekRFcU10enp0VDFqaVFlNDdadTc0OFZSOC8gQTQ0TDQ4Tk1BbEdpd3BESWhwRHMySzd0bkwveks1UEZnTmM4dkR6TVppM0RYN2dCMUtPZkRuQjFsRGZLektjSlNRaHhCMkEvOStmdSBveGdyZXdWTE1KMWVtcll3eGszTU5TSkZ0QVZkSW1pME80ME9MdUhBM3hrY0xVWCtWY2VmT1lETE00R01XYXJTUWdTcXdEQUFRZm9JIERweTZwWkF0anF1dHdOY3pCeDdCYnB3U1BtWjNiMXdqSFd4RHNadytZeUdIdTFJYStZZUFCQ2ZCWk9jMWVMWmhoeEpxN1l3R3dmOEEgV29qNm0wLzVaaWVVdHExQ2xWeVZWdDA2cUltUUJKR0d3TWhub2d1MEE3Z0hvWnczaXR5RXhxUFdoZE03azE1SysySXh4Sk51d00rQSBBQUVGQWZ2ZnJQTk96UUs0UjVzc2tRSVpWd3JIWmhPM0xIZVZ2M3RmdE5KOEYwS3B1TW1TUisxV0x0eThiVm1nRmZOQWsyYUl1amRkIERaeXMwTk56TTVjQW9jYk5uZ2ZNVzA0T0RDWXU0cE11UkRaQ0c4UG4xdkV3MUFWOEQ4emMrVUV2Ti9lUFBmNVAzSURBNGNENE5oS0sgWm1LTDR1RFJyQ3JqVU95Q3hnV3NNS0hLRHA2SERaS1RNUXNBNE95L2dLdkJoZ3NvVDJQZTZ1Qm53Qi8rbjM3cGhSNDlxdHREMENHcSBCa29xSFphM0diTlA0R2pZNGxQYUxhc0lEWXdkd21XcHlRUHlEWTdMWC9kUDVOVjc0ekRFZlpOOCtnNy9BT2Z3UHFRZm1weWtoeTdvIFdMZ0hBTXFta2lrclp6cHBoMlVLbHUxZGUzS0duWVZ4TXFDSis5dGtDQkJxd25XWXNtTmV0bDlTUWNZRUhBQmp2d0UvMW9kNDJVQ1EgdlVtOUVJbGZEUEV4V3hjcXdHTmloaWZKNTZGV09lQ3NuWnNUV2tRanV3OUtSazErM2hyNC9INWY2dXB5SjlnVE5QckhYbzJHcnZocSB2VWNrWXZpSk1BMGtKNGJESSt5M010TmJzQndWWUNlMmd3N054ZG9XYXpPY0pObzREMjhBK245Z3F2ZEdaWGR5T0Z0WnRhVEdTaHcxIHRLVU9PVHIydjIwd0xGeXlpYk1IMlF0MXUrR0pqQjhHeS9nTlV6a3lFTFprYnVpYkNHL3hGMVlvV2g2SUl0UnpEenZhbGY1K3JRbGYgK255aGxBYlM4WCtJdlMvaHVnWlBaTzlyZXlTeURoL0V0OENERFpXYTVHaFpaOE9FMmh3SUFmcUlBZndYeng5UDJCVThmTnl5UjVXTSAyUVNuektLN2dNbVMwQ1E5WHVWWkZLbFJIQXduOTFGc09RNHErVmVwVlh4bTMvc3l5OGFoL3dEcUFQbi9BTy8xRTZGeTBKZkhPTm9XIGRNTWNMREZCazJhUGtNSkxYMmtZL2daSTE0VjFRdmc2Tk5GSmNoekNjcTJIcGdZOGp1eko1ckVXNWc3UmJpdlI5WW9aNndyUnprNnAgRzJJUVF4cEFTbjJNZXJJREYyOHhEdFJiWk9QdUZxUGxmYjQ0TTIxcTdOWmxxY0pkdmNCd0h0Q0EzOEJWMXhUN0VNc21TbTV0a01qdCBsRFl5OVY5YjJRNE1Oa05EbDJ2S1BuY2hEbUdPZURwbUNJdm9ad09UL3dCODczdmh6ZjhBWUVFQnNDLzB3aWpBVW9jV1pYWjRCYmhyIGJzRXIydjN5dDVFc3crQVdGbytHd01hSGNFeGtReUNHRGZVK2ZPY0NkbUlhdVRHYkliU0FhQ0JmcUV3UGdPZWdMRlZYWUdaUVZiaDkgVXNvd1NQWm8xU3MydjRic0hsaC81dlVEYlNlUG1RK0g4YklPQU05WHphamlGbFpWeWpNemVFTnZIUGdIQVFDQ2Z3NlFaalFNa1RkNyBva21ZeDNTM3RZY0dzTzdqbThoUkZEcDJ5d1lxczVXdTFtamVrU1FlOE8zOU9XT3hzeVUzTFNkdkhWTTNCZ3NodHRBdytORU1hZWFCIHJhMkVMT1ZiUWxza3ROWUhKbzQrdDF1OXVFT3E5bk5xWHdEWWNZemJXTVdRYVQrbS9uOWcvWU9vMTRycExjakEzNTZyWEZibVQwbnUgeG5HQ012bmg2elhLS1lUL0FLZWg2a01XQ3QwYUE0QWQ0V1daWDdtRXdadlpBWFB2YmYzNzNQdURWbzZBMUt4RTh6VldkcTlQQnJDVSBrZ3pwdjFPdkM4dHBwN21TRzRwOE8xRnVZWVd5RU5JbjEvUHJqQkd3UTMzSDhvK2MyQis1OWdBUVg1QldJTWdWMDhPQitVVUdqVnJoIE1saGp6S2ZNTmhlTFZ5UmFEUXQyaERRM3hQVzRaQXh6eUJVc0Z3Mnp0ZXpFOWt0RkplT2ZBTUVId0d3YWtBRUNKQW0zQ2JJU0dDWGYga2tKVVRPME1xeFp3VFJGbzFWWkRua3pFcmdBNm1TWlppOHczbmltRUpiMkZ5YUtOWGZqaklrY21ObThLeUY1QjJWM1hkTjFWWWx3WCBURmZHUEp2TTgzVEhtMUdWNEV1RjhWS0pGb1ljZndOa21URERBWXhiY0xhM2Q1R0s5eUxUTWN3U0FtLzBHZkFjK2ZrSis2VE15ekh6IE5wZGtNZ2NsQXJlMnRPcHNUSXNJQzRKQ0hVcDZ3bnhvbVYvTVQyVEd5SnQ0UG0vWW9iWHlaRnhLVm1zbzRRSlYyS0R2NzhBUHYzVmogd1duRFZIUkZaNDZscTlCS0t0VldxWlR2bFdYTTZwcW5yZXViUXVLaUdsYXdmV1F2YXFHWHNCdzdaMUFlVktzV0dnb3pyTE04SEVrRiBqNmYwdzVEZ0FZS3ZTT2NVTzRXRlgxZzhiVDF3OC9xWUMwNGRrV0VoeWlrdE5jakMvd0JoKzVESFc3QmFpTzkwOHBJN0t6azdrdVJHIEdBOTdTUWZINzhBSC9ZQjBsRkRSbkhDZUdLb0dXTXhSeG5TUmNTQlVpaFhieGtMcHkwbVdJWVlXVklzWm1LSzJjTTNOWklPWjN4dWggWXZkeDVIMkZCN3I0c1Vwb2VwQVdER3U3NWJWWE5RdHBVck50QWJ3ZElXMml4cFl1cjhWOFAzVTJkRHI5azk4Sjd3eVdiV2I0VUpreiBnVEUzL3dEdURmOEFxU2dVZVF0cTVFK3ZxNXVDeUJ1YWVvcVhmQkw3RHdNQTdxN2tINWd5SndlWk1JQjFXZTR3QWJKNzFlcmsrRGhQIDcvYnUvZ0FEOEFBUU15czRlVmJHelFCcUFIYllkV3FZL1RIYlFhSXlLOFd3cFFzUHhzeENyZUdIc0JiQjNTbjN3Y21kaldpNUZsWlIgd2xvN0gzZFlPQW9OdW56L0FFN0dTUFhiYllGa0hvcVN0amErY0JydmZBWU5VQ200RkVQVGdlRnd4OFBlSmhnT1BUNjU3Z0lsalROeiBWM3pGbVJ3aVNFMkEvZ0FQN0FmeDZrWmFOSUNWeXlVRjFnaHhqTWRwc3hoTXpodDIvZGJibVh0VEhscmtJN0s2MGhwbERISjJja2JzIGp2UzVaMGxMaU1BRzVOOFZMSHA4SXFuMXYrV28xblZwblZjNzJCVzRlajFOYktQa1FDQmNHQlBjSmxxY2tyOWJ4MDhiNjhMYnd6RkMgZ3g1T0pLU2tnOS9xSS9oMmlRai9BRnVWMU5ucTlYSlNxK3NoYlcyaVlTdTZRcTZrSzNkekJSV2xpMmdQWDh5WjRjd1FsK1BBNmpJYSB6dWpRak14enphTy9IMzdBQnovN0FiUjh1Mktxa0VxYkgvR3M0V1NOaVRHYzdPRmV1QlE4cGxEemk0VnVZK1pkZ2RQNVYydjJQQVp3IFBjeVFOSmR3blBqNERENzhmUWVvR1pmSy9tbkZVV3hrdTJLR2h2NmxIQTFXanl3NzRyNlpTaUhhaDl3TU1sYnZpMjRPR3FpdEdFODEgR0Jtb1VvTFdTZTk3MkRBSUFBQmJ1SURxbWtwV2JaU1MzTXFoK2JqY0poZ2Eva2t3YkZQdXh2SVYwVVVLczZuZm1SMTlqWjN5QUNPSyBIaVJJNVBQT0dQRjVDcTJyUnZ0ZHRhS3dja2U2YVFwWWE3VXdxUEU2R3E2bnlsSitsOUp1WjFzWjhiQ1k0UjkwTVRMSGM1d3dxTVdHIHUzc00yTDZub3dxU1pKQ0pnYWhsSk1uT3ZSeFpxS3JMclJFQjJPMlBVc3FCbXJzMkFtem1WZXpvYlNZU01odFo1UUJuWmhHRlhnRGcga3c1K21iSWNzekIwalMzZzdGUHhHNW9LRUNURm1TUFZuWE9UKzJZNGxXUFp2QUJMK3Awb3VnQmRieHEvTldmOWZOYUpQN01pYVIyUSAwck1XVWJPcU5Ba0VEblQvQUtIU3dtS2RrYWZiWU1WZlN6dEpyS3dRTWtzUXlXU21MdURPUUVzbXlsc2U0ZHQyUndXMkJiMzdDZkIvIDJ1VEdBNlQvQU04UUNEanNBRUIxVkVoWDRkeVU2eHNzOE5xNjRNM09wU0phRmhWaXdOZ2V1YlFtVzBCdUN2OEFUM3lSandEcjB5dVkgRGhBblFsa1lycTdNelZYOUpPZTIvbittUXdIVjhPTHlReTVUK25nd0wwNnU3WXJzbGhLOWhXUmNpYnFFQW5tUWdYaHpRNGY2ZkJRNiB1QW5NV1ltcjdaNFBFTHNIUG43ZndHLzlYWTA3NlUzd3JwL3RXL2Y0cUdUUzdlYXFnYzR0UmJzQmVtSnF1MmFWU2lHUG1MYmdIOXZoIDg4bzg4RDhZaDdtVE9WZFYvQndDQ2ZYK2ZBUEFkQ1dYNllQT2doaGxhWVFiczhXM0c4bjlNRnMyeHZ1K0RYNzZYR0F6SWpsNUZLSTggWTA3Mlk4ajNCemp6ZUs0bmp3M0h4MVZHc3c2ZTBSMlIzcXFwZG5YSWRnY3dXekZUc0pmNlJiVlNCK2VCM3lHdDFXUW1jVHI5OGc4RyBlVU44WmxrR2tta253SFB1QS9yMVBKN0EwYW0xOGJRNEdxN0lzSm9XMyt6UTdKcVFIdTVpeDY1Ykl0OEdMUXVIN2dIbWJQQmdZZDFMIEhHUE8xMGJabTl1MzBIZitRZnIwZ2FYbVI1VWZPRnE0RzQxdDNoeWE5ZUdyaTlaSWNyZG1oTlhCNWk0R1hoNjJ3dmdPZnYxVm9aTVkgaHF5d00razdIdjU4QnY0RHBrU0dCZ3loY09VbTNBeWFkY3JtcFl4bldFdmlROWN4bXhOS1RLK1d3N2d0dzRmdzJwdFh6elVIR2NYViAyWkdPYkp2dS9nVDREK3dWcUYrcFpaTC9BTHpDNm5TcVp0aEdqVTh3eXk0U2RudHlHSGZ4N2NlVTZlVkVLQjNjYWRnZDh4eGJzZ3h4IENZeFpwbmR0ZmV0ZnUrck9XUmJralRtcHVCblZBSEdrb3I0U2x5RDFxV1JnWXFXeHF5dENOOVBEcmJKRGg4REJIcC9CMlI1WmxjWDIgek9PMnlPNEErL0FQMEFkTlFKVkMyZUg5dEF5MVJTMmVzSmJzMjhBNTZ3TDVtME9oeTlQb0ZjWDRhMmhwOHZicGlPQllhMG5Xb2pNMSBZTkt5czhKdEdybmdBd1k4Qlh6NytCQVYxYUZxeU5kYUhZU2JxV3lWdGtRME83RWhvdUIyTUNlR3RFUzBMR3JldjYzUWs3aDlicjc1IFl6NHdRQVlmOVJkUWZTTUxSMy9uM3VBQWIvMG1WUGxBdldXdDJNN2pRbGtIaHNsVHArcFNXcEJJTVZLZWxwcWFIbjFXbnA1aW42M28gOFAyMCtxaC9LSWZuRGV4Ny93Q2ZQdng4QnNCd0xHaVBKRzZDV0ZNcDQyakV4ajhCQUlzMDNzNmV6bEhnUjRmUHRmSWlFeEtpU3JwSiBYQ1JCanN5TjdjaTZVK09OakVaRW5JOGl1U29neVpZc09CYUVoMkNROG93dDFrMERiSUhpWllGb1UvbE1sZ0J6RkozeUg1aDlTSHFRIE9aeWI3TVRPV2p2ZkFWOUJmbjd3QjkraDRaRE1sVVBZUzJyZ1g4YTVIamZ5TElxV2pwYTJyMWV2SVpTSFY4T0g4TlB1QmdtSTl0L3ggRHpySVpyZzR2VUNOdmFTYnhQZ0Q2Q0E0RDFaV2V0UGgxSnMxb1UwUmNyN3VFUjFOVDc1WFpJbkNKb3VYeWdCOElhaEVNUW9Xb3REcCBjRlNVQ0ZPcmJOV2hYa3BJRmRhVGFYdjdJQUFBd0lIVlJST3NKOHBPL3dDSnFBcExTS096Y3lSY1NTT3FzYXF0MXEyZE1vVVduTVpHIFdaVDVVVjZKZW12TFlZYjRWVEJSR3c5VElVUmpnTTRqOGdRTVY5L1h6MlBUbFBjeDJOOHJLdHk0QnM5ci9MZlplZjhBaWI4ZU91WlYgTWtidU5QU0xJWXpMamhHU055UU5oNnNZcGNHeFRLendLNWdyb3NSVERVZXFvWm1zVnVzVHllTXNLdG1TSFpGbXJZdTJyWVRYSjhyLyBBSWVHY0U5a0hoNjVyUzBhbFJ1TThYS1BBd0gzUkNWWCsvOEEvZ051cVRoMkpaZGgwL20xekx0RUMrVldFRTArdG1HQ1d5QVZlWHcyIEZZQWRQY0h4YnRUa2lPcFYvd0FxUXlaTlhwc2FULzBUQjI2Z2dENzk5QjJETXJVWnFEc1ZDczdVaHFMZGxKVkE2a0cyN2xkT0FSaXkgR1VQV2FLMUJUSy9oOWhpOWJwN2hqYWtEZ2Rjb1F4WnE4bThrOWovZjkvWHovZ0QvQUZ1ZUs3YUtndENHa05ueWF4Y2xVbHA3cWRxZiBMZ1lYQnlwdUllRncyQXhEUTdVY09ZOW5JRlBxU3E0VkJadW5OV1psZzVhS1M3bkQ0RHU2QTQrZkFQMlIyM0lKSXBTalRCREc2STRsIGhhTnNmcW81RFNiMGFCWWc2MG1XUTVXdWRrSWVLVmRSR0hWRmFOb3B5dTI4ZW9XOXJhTnNVa0pMVS9PTkR0YSsycFpCOGVLNXZDNWsgZ3lOcit5QXlUR1lWK3dqekFKTWFqSXJES0tNaEJQMUlmczN6UGdFUG5CN01Sa01vODFtRENHemFQdjhBd0R3SFZ0TFE1UkZ5NGRqViBmV01uT3RvbWdDWTlQcEtlMkI1VVZoQTNJdGo3VTQyWU1UQjVoVjI0OERtZXl3TFJobVBlejlPZkFBSEFkZzY4L3FJYVErbUIwdFJZIFRyL3JkS242cUd4cjAvV3BXNENaTkZwckNUVEh0Z2U4TEltQjRaQXkxQVYvREFOZ2lxNzRNV2Z1cVE4Yjk3SDkvd0NyeHlOWGluU0ogaFZLMmdZa3A4OWtDS2EvTWlhWjZuTVNsZXA0c1dHUGhtQStFTXd3WU5RL2x2dytNVmR0bjdJYjU5K0l0L3dBYmRQZ0RrbHhNU0xuRSA4VGlSbzQzeGphTTF0TXFZbkRNaDc1YndPb0pGa2prYVJra1Jrd2pTYVBLZUl0N3QxaTR5eXBjYkE5cDU2WHRmc0VjTW5tQURsbkRjIGs5Q1VteEhmQnJ4RURub3RUbnBTM1Y5Vjd4YWlleUQwTnE3WHdFYmJGbW0xZFo0TzdKTHNiUDhBdHY4QWlndjNSaFg5TmFpS3F2aXQgM3pKaG00YnhzbE9CNmZmR2hlaDZnaWtRV1VtTUJoYlczeDc3d1E0SjRmQU56Qm5GM3ovZTNnVUUrQUFBUDM4SmgzUTRYTFU3SkZzYSBZRUcxb0IzWkhNRFdBc1lybHp2bm1jeGY1aER1QjhtRC93QWxqME8xRnRZd1F5aXlUM3ZteHcvdjREQUIrLzJWcWQwVTZ2Y0szaWtNIGlOU2VtNThHM0d2WGtxN1NIRmkySGE3SS9uR1FPNGZyT24xLzNIVCtNaS9LZDBVa0p2OEE5K2Z0L0FBQUJJK0dtbEt3YjZMblBTcHUgSWtZS2lRUlMyTnh6MmtKZ21aSGxhNllZNHRUcVlpSHdyYlFPeStwTElodEVlTEliV1Z0UnprOEhqanFPSVI3Z2kxdkRkMk04dEo4dSB6bVM0MTlxczZSRVduS3VkVXQ4RExnL2lkVGs5YjAzek1WdDRiZWV3V1FuVURSUTZ5amNKNFRoaWZ4dDErQUgzNCtBOC9XUmcxQU50IGdFdFVBWkpTWVlHeUhaNG9ja2VUMU5QVGFscjA4MFE3UU1JYUd0cmN3aHhVOVlBRUZnODltMmhtR25UbFhHL1BnRC83RHY3NHVCZlQgKzZscU1kQmMrdWF0R1EyMlI2M3IxM0xTejByNVY4VEYrWnZDMm52ZytZRHhZTExuSVl6YTJoWmVYaTBqaVNqOEJ0MUJ3QVAyd0FJMSA0cXJWcFFVdXlhV1RYQ3JvWXV3bzFlMmc3YWU1RFl0TkZYcnpSWXlJUEQ5MUlZZDhIR0ZXQTRRUGg4WmZDaE5tKzdPenhzRy92eC9vIDVGamJ1Tnp2Szd5U0J1MlI0d1V5YVNUdUxiTmpFWUM5dzhqbnJGSnVLcFNKbktSUWlFS3paVm1GOVFtaGhHb1h2YWpqMitlckxMOWIgeDIzVHZVcm0rR0RaNjFiQ0p5ekEydDYzaU1rcFhYZ01xSGl5R0xJWkliaDh5Q2gvUDNnbnlobzJ6M05oRGZQai93Qy9uMEVCcFZnOCB5amJ3YVZjVzdJTmVKdU1sVFR4MnJPbUlxRTBSY0ZjQ25zRVI4YjFCa0REek40VDErMnZoMW16YlhoampTVlhPM1B2QS93QkF2d0ZKIDFuWkhaSFRKWjFKQzBNbU5paGpWZTJCelllcHpWZHlMUmF2OXJnUTZIbVdSTVg0Y0NBUm5vOHhsSkllNkRQZDJOKytHL24vZmdQV24gVW9VQjE4OE94a1ducVZTcmlxMnBDK0gwWmg3anRTbkxrWGdMbERJTWpKM1VtSjdCODdoN2E4R0NaTXB5Wm1SL052QURnRy83QjU5TyBvVnhHeXhTQ1I4MlVaTGhIMllBbDVMYkRMTGdZbTZKdjQ2ZUZWMWpLeCt0Z2hlWExoa2xDNVI0NDhYaU83SStDYTZoMDk4MDZKQlJiIGFKN0k3SG9zTjJFdURVWURpWmlIWTZSVXNXYXYxdUhNVnVZaHNDRzFUN0F3VlZzWHhjWHpuWk9FK0EyQis0Q2VBSGxqcUlJSi93QXkgdmJRVGEzQ0xkVkRXMXRzaFB6cEd6eXJsRTAyVTFDTUc4Y3czZ2d0dkRiYUNseVFYK0w2Z0diSWsxZHgvWU4vMzgrZkFNaERxK3dKZSBXN2FmQXdmbllaRFpJZy9KcmZoRXpkSmF1cnNoR0hEcmY3SjlIUTA4RnlSNVp5ajQ4MjhqOTBhdDM4QnYrQjgrQUFJSnNweDlPY3Z2IHd4a0ZXeUREa2VvcUlqMC9WWmgzbU5DSlhyNVl5MlArRzRoNWdkZzdxZ1YvZS9KcS9PY0xVU1VtcmNEL0FML2wzOFFueVp5d1JwZzYgdWRpRXhvbTRFeWtqanlMWko1M2NndVAyRVh6WUV3c3lnS3lZSTdhZ081eHp4MjdRQ21yeHkxbXI5dDhkVksveE5NR2tIVm5uWTZhZyBJVFZQV0RzMnNMZ2hnWGd0L010Z3lLaGo1aUdIMUgwbStWK25Rb0RBZXVKYlp4Z3ZIYXdXT1A4QTdBTWYwUDNZc2xndFN0SkdvK0JhIHRZMWRZV1V0WTA0dm1IdXQyRk9pNmZkS05TbElRQXZEUXFITU9LZE5SMjFQd2hNaU5wN3VUSEFvOEhQZDNmZmNBd1llK0RBbENPbk4gYmdaUksxY3BWUUU1elBZQ1dBbDc4a2FBSmFWK1B4RXpaMXZINWxqY2ZnUEdGbU0vakNZSTM5NEFIejREZndDRDdHeGlSSERWUFZkMyBIcmFXME9yKzB1TlhoekFaM2NPQnkvaU9GZ1RGc3hkaWZXNjlEZ3FROURuSjdOV2F1ckUvdXh0SndBYkI1L2Z6L1ZtUlhraktuMlpCIDJGcElzaENoa1FnQ09QR3dTWTRsenNaRHRGYUlFV09CaGJsNDk2SjRwREZMR1RKR1lsWmxraWF3TXlRb0szaVZKTjJHY2NtWmg0eGkgaDV1Y1NKTkZocExaWkVORGFJaGkwTGFsdEt1SCtIRGh6TjRZSmpVK1ZlMjBEREdNNHQ4c3pZd2xYaERuL3dCQUFiQlcrSFhjd05XYSBUWXdFeDhQT21TVk13Qm1XZ0pRNGlidWtWaytJSDkwK0d2dzFWdFh5RTdrMVppeWhSWjgzN2NCZmovdUE0QWY3QVpSYkFxNm9aREhqIFpJeVNyZFRNZDJqSEQwUDVZRTh0MkFZc2xQVDNCUEFUUHdlZWFtUm5ac1JaTm04MkVlQUFEWU4vd1A3QmkzN05GWjM4VXN0Mk41d1kga05YbGZJemtlV3lQa29TK05FTWdZK0d5R0pqZ3RnOFBnVnpDSjIraHEvblVud2Uvb0lEM0FlZk9EY0Zlbi9KeXR0L1QreHp4OTluaiA0eDhtK3M3Y3N4enk3R2VzYXJIQVY1UG5QL2JFaWpkOVdXcUJNdGpVem5yZGZXWTloYzRvMVZOcVpSczJwZFE3QW9MQ2RwN3htVGNHIDVrdFNxOEZsT0VZMUxiNEVIVDR0NXh4eHJPMU1ES1J5RDFlckZBOUw3aWZ3cTRSWWJzdDJ5NlYwOWFZTDR0UEtrdHo5RnRtcFZYUEsgUks4V1ZQVjZkVHEvY1RKY0w2V0pleHNnR2dxVnByV0ZtSVNyZUFySDFZaFFaNjNGOWZ4UXZiQitLMHV2NmZGVWYvaXdMSVpMT3RBUCBHVXpGaE5UaFh0a09VcGRqU3BqQlZka01oaVl0dUNGeTBoOVA1TVVWMWxtQm13dW5pMUQrR3dXNmY4K0FUOWlJY2UzNlhzOTh0QzJsIHNNR1Q3c3FkZkdvYTlLNWxkelkwSVpqdHUrV1JENGRzNXc4UXFYbUg3VU1HZWJPZi93Q3Z2M1YxcGk0Q3FuMHo4YVdPUkxlTnpWcTQgc1k3dkhObjJIZ2pqcXNXQ0tXWUZvM1dXU1NDVzBralFVekJzZTdDeFFvZTZ1T2xMUjlnU0hkd0d4TmFXcTdiYzZwUnQ4eU01YkhxYyB5eGp4Wm92bXlXQ0hjRmJ6S0hjTEFXd2Y1cGVBNHdZVTdQbyt5R3dod0I0RHIwYVczbm00OE94b1JqaE9veDh1d1NRU2RQYnd3dm5kIEJlcmxFWkY5d0RtQTkyTFpHWThRR0J0YXNCbW5xMEt2cUFuaTdjSnRYeit3WVZGNzlWRlMwZXdLUXpLeDFjOTVnbGhXQ0hzaUlQU1ggWmZZVnV4cFFtVkZNRUlpM3lOYm1FSEVKdDhBNGg5ek4wR0xMd0UrOGIrQTMvcDhDN1F5Mk1tNEgwMVZVcGdidVJFdkRKYWpFdVpLcyBhWFkxM09BOE95Sjh5MUdRZ1krdjg0Y2RzZk9EUFBoRGFQOEFZRDRCZ0FjK3dSSVlwSkdlSjBXRnFUaHM0MUFyZWhlU2hoZHg0dmliIHB1MFk4dGpXVlVJZFh6MlpXeGZkajlOakh0dURIS21XZE53dzdhQUI3eWV0R1l2ZzgxRFcwMjFWWnRBNXVUWDdDT0xwSmd0NEZUS04gRDVzNmZEcDliVHlIOGhWODhIdVl3WHlkWkJtLzl2NElINy8xeUM3b01VaWp0WEl3OGs4cEhxM3FkNERyVFJFL0Y5eHBrV3lHQXpEVyA3SVc5d0RuTE1UK0ttT2NDeWd4WjRTYi9BSC93R0gwRUF6aUZieUlDK0hNMlhERzZiMGpoSmF0ekR0ZUdIQStKbE5uSXJkYnZrdERtIHI4eTFCNitlYWc0enRlMERFWjRDR3pieDUrM1QvVVBUZW45YmNuak9nUlhCSnRTN210a3NJaGJWWTEvTDVRZXJJQ3I0ajYzRHNpR2ggc3BCd3NadHRDQll4anVZTFEvNkoyVDNmL1ByK3dBQUM5dEFtY3h3dmlNVmVUbWlFUElyTDg4OGZCdm9SdUt6RlZTWkZRaVV5SmpKQiBHMkZ5TkhiVjdlRnk3Nkp5V3VpbFRPYVoyaTZDVnlPK1MvMVdMaDFMTEhaTFVITEI5UVVWZUExTE1BYzhtTWpoQ1RxcmFqeWVCK1lVIEdjWDhHaytEUFluMTgvc0NEMG9GY2ZETWxBNmE1MlJLWktsenJJZDhYeUc0V0ZEcmxvbG9hWVk3cVhCVzRkazFJZkRCdHVQYmt4eVogb1Z4Z3poT3liQWZBZWY4QVA5RFk5TGNNNXdhbTFTRzJSWHI1bk1seDFPdG5sOWRUeWdzU0JLR1BoL0REekZDcjA4NS9JTlJrWXpGRSBNbXpIRWtJYk9IOWdQZ0QvQUlEQlYxdVlPV000VEF6dm5hYnhvR3ZWdDNrTldsZlVSdkQ1U0tRME5DZGFLR0hEQjF1WTRRL25yL0J3IC9mSll1Ukdabmp6WndDQThBZjMvQUdCeVJORHVsNU0wU0ZJOHF4MjVQc2xySTNWdDIyUFB1SG5xQXhrUnNzWFl6cTZ0bUxiYnhzVUYgRmU4RzdQUE5mSFZqSEJPVGFDY21xcmo2VWxNY2dDV3k1TUtRblhCU2RpQ1lBazJLR21ob24xdFRZUUhZelpzT1BQdzlXZkhXQWEwayBqL1JuWlVGVFd3Z21Qa3djck91ZGF1V2g2N2lFcXlaTkV1bW0vTXl0MlpzVkJsd0F0WTk0aUZkOEgraGxLR3M0NG1EQU9TcmhSNlJuIEdUSmZMVG9VR0tUellhM2xEWXhoaE9NR1VXbjV1ZEE4Z0RzRzArUkRrRnZwNnNncUxyY05YZml6L3dDYjFKRXpLckNhRlFRQ0JtVFEgT1BGOFhXWDRIanFzZDZ0RU1wUThPZXhnYlJBd0xIU1ZNaGFqdFYrbytIR1BPNzVLMit5QStMSlZiNS9QVDdBQW5FOUdlU2d2K3llZiBma0FBQUFId0Q5MWFqVWJZRjZab2Z1WEVha200SUdtL1NycDdwK3EwOHhFVHdCN0NNVVc3UlQ0YklIc2hiSU9FSThQNVZNV1NmRnhtIHh1OTJjSFFmMCtnNy9qRHZENURwRFQvZnk1ZkNTN05Xb3l2aHRPR0taUEIxT0hGVFphYnpBZ25tSWRrR0dUemxhRUZLdWVDdkl0OFogbGhIL0FCY0Q0Q0E1OVVTQy9IMzUvYWlLUGJGMnhFOWNpdmxKbm9HZFRna09rNTBCMzd0VnpZU2EwY2ZtSWFmVlpkbEg0VGoxZ1B1SiBoWlJsZkVtVDlra0lEUHNBREh0RnNBQkJCbTBtN0JBV1FUVEk4aVJUeFJKSThjVXVram1taEVRajNJSXhxRVo1U2ZKUUtvc25wQ0NWIG9wWlRJeVZnSFZHb283V1lrdXU0U1U0Qm9ZNCtHeTRTYUFRRjZrYTdzSThuUXdsUHp4dFhGdTN1bnNPSmNMdUZ5OEFOdzRXK25yZnogREJCYjM2djU0UDZ6endtVC93QTdVQUFPMFd3QVBQdzdqRGo1cnJNZkxHUTR5ZlNNd2J4ZERvMVhyTGk1U3NwVW9PUCtoMXUrQnlLRyBqZ1YvNExnellvYXZ6bEczczNnZjVBZi9BR0RZWWRMWDYzU0pBRkRkM2FOU2VWMmN0ZU9CdTBPNzNZQktNTm9QajVYN0lIaHcreWZKIEFkTEVJRlY4NVJtZ3F6TEp5cmdqczhZYitCUDcvd0JhVnM1YUYwdzg1Y3locEpxeXBxQlp0d0RjaVEyR0NpR3cxekdXNnY1THdPR24gL1ZUMWYxbzhUR2JsRm9FOWpOaFBQN0FBcUwvZjJxSm9sV1pRK3FrMjNRSzBqbU41SXhIREhISVdwc3M5cG14cjB6WXllNzZKbGxhTyBBczZETE9saU9VYTBZL2FsTGdUZlBKeUZEaXVwalQydnNsY2tRK3I3VGRjRlNQbHYxajNDcmVaVzVoVFpIdlZCWHREZ0h6WjRiSStMIGN3aFpCeFNZRzJ1WWZHZm9yenZhUlZ6dy9jQlAvWHovQUxMMWdmTFFNc0NlK05ESS9nYmF1QjJzMWZQRXNlWVcwTFV6ejR5ajNDcTIgU3EzQzFIQXcxZG41Nm90akNmUEhrWnZleVBHd2YyRGtIV1JHdGswZTJvbGFvSzB4QzVMYldOa2FmSGM3cHZzQ3diVFRwVFkrTkdtOSB3RFdRK0ltSWdlK05UWVBzcTB6RDA4dmd3WVN4NFRWNXZqNzloeDkreHh3bUZNd2J2T09Ic0ZuVDZ1eVRGaFNiWU1XcitUVEQ1VjdZIDVOREpZRDM4eDhwL2o5cU5XbmpUL1A1NE1HSWF1TThKNE0rL0w1LzM1OTBJa2tqMVVxdnBwQkRoRFdzVnM4Nnp1SjRzUlVrRmpLYmMgOWZjdmJpMis5RFJvVUs3eUxNanNGamZ0M0krMEpJR3MxbFJ0Y1RYSGNiNmt1NzVEajU1WGxHTFJ0cWg2OVpHdXlLOWlmVzVTSlgxbyBIbHNlSTdxS0JoUDJkNEFNQ0hCWEJ2QTJmYXdkWEJNY1g3Z0w4QVA0NytmNGhZYlZmVUNvMzBTQm9iQndyVzZ5Tk82aHc5S05NT0UwIFBvaTR5eWhQNGhaQzB5SjU4UFkvejhXdFpaU1pWQ0dmNlg0bThQZkFCamhnd0gyclcrbGU3RElET2xVRWVKQjYwcCs0Nm5xZDJzNnYgNWFlZUtMeUc1TWc5RFE3VXF0d2NDRU1IUFg2MHRSUEpyTFFMV1NZUFkwa0h2NzhnNytmUDRBQ1E1YWxiM2M2UG13c2p0ZjhBcUN5WCBhd2s5MlBYQXZHRmg4VXFscVdHd01pM1pDZXlKNUNhcXR2TFlLMzNmVjFjWmovWXovd0QvQUJDL0FEazI0MmFTRzFoa2RtRWc1OWM0IGZUaXZ5UFU1dm5qanFzWGtnR2NybkJFaktnMUhJaC9rV1JPY3N1MHFjaGhUY05sMjFYVzQ2V2gxSGNDUTVaSnR3MUFwOFpUejZydG8gZ3d2bGpQaTlWOWN1SkN5TElyZFBRc1hDWkJnT050VTdNWnVVYm9UKzdWY0QvWU5nOC8xYWl2OEFnNTVjVlVOWEEzNnFsSFp0WVk5ViBxdHNWNlhjaGN1VWVEc0RnNHAvelhEQU9xN2VlTm1HWW1ocTlaN0diU2YwOXQvNEMvbitsdXBrQ0FHM0VrWEtWQXUvTlMycG8vYkd2IDViSVVWMTQ5TGhyNGVxMXVFWVpONGFyYVgzeEhaQmd4RFZoak4vV3h6ZjhBai82ZnFlQ2x2TFhBNGVxbkprbFdFQlZmNWdQVEpoaE0gSzR1VzVWelpKQkQyZDhjRnRnVDJxQVFVbmhrWm1aRGFGbDVkN1JwTjJOL3YrQURBQnZ3c3p5cXpZUDJPMHFoMXh3a2ZBcGdiUHB4VSBjSS9nc1RsejAyTXEwY1lTTkM0UlFWMDR6dEkvZkk1N2NjY2x4V2psYmR3cmxKbktuUTd1VTA5alBLbzRQbExadXphbmF1NURZaGkzIE5obFZMTUlPREl5SWNOOHNDSHZ6ZzNJL09TaXVNSitFU0haSFFVSGYrMFd3YkE1c3V2NURIVjluYVh6MWJ4cGlHbjNaWVY4dzdVajEgbERjajFUMTBlcmI4RHJUSXQ4Z1E3R0JKNUE1Vy9KaWhSWjN6elp6OVAyQStmd3JvWUIwMnJrWHc4R0F1N3RsQVRsT084TzVrZFRESiBrcVhYS3ZEWDVsd2NEUS9yYXFlWUVQa20yUG5CbWJaQW5zQUFBQUg3QS9INW0xTElZTlByWWsyL1ZXU05EdTllcmV6NU9janFiSEZpIDNlcnhYemVEQ0hNK0dQNE8rTDRFM01KN3BpU0pnM1lKVjMvZi93QmdBU1I1SkdqZDVIWklya2haR3d1TkNpR0pnUTM5S1NSQTk4YmwgbGVDcEdPUFkzSXlkdC9VZ2xGWlpJMklZWFlyTGo0TkFmUFRDOEllS3NnR2RaQnNhMjZpaVV6RU9TTXk1a1hUbkVlM0tFUStYczYyeSBKNjN4SmZyUUhnVHJQSHRBekk1dmUrMFI5QkFIL3dCZ1Fma094TXdNNkFUTXF6dUV4UTdKRWtIZzlmbHJVZkUzRUNlN1BwOE44K0doIHI4eWRXbUNrcXpNSGtvK0kzQi9OMGVmOEErdngvb3JYMDluaWgrRzErTmRyeUlOVC9NRElhU1k1R0xWMTZ4bGNQYUV4T1c0YjU3cmQgNEFiQm5nMXY2R2gyK01CbXphU2puL1AvQUxCMUpXUTRVM0ZxZGJQWlRzTVBYU1l0R0lRUFVhdnIweE5RNjlxOURoL01NR0laaUdueiBYaWxuQTgxSi9HZVVMTE1jMk5KT0gwRzNRSDM1Z3c2V1pkelVMSzhqU3d5M0NGU083M01iWmpueGpYYUs3clBJcmxnQ0JIalJNY2M3IGRUbEhJWXpGN0dwYnZQdTQ3ZVBPWENyYWFqVExwUjc0VE1yT2R1L0dUYVBza3ZpUXBzaWRVckZWNHRrVHRuMVVURU13bnc1MDhlQjIgZEdHSW5HVWJ1aURONy92NS9qK08vdnhoTURORmFCMnJTWGNqaEpxVW9rc2pDWXViT0lxYklVdEdYYlF1bjAvZ1ljTytHR0R0elBxOSA4VmJKZVdaWVYvWUhqLzU5N0FINUI2SkxJUjdBQXBpZVpuaDcxRC9XMnhnY0E3Qkxobm9xbTBLLzg0WVd3NmZEOEhQNEhZekl6WW9lIExNVGVEUVQvQU5qNit3Yi9BTk93cFJaK2VRdHJ2ZE1OMUtlcDlBWHRVQzJISVhHNE04VnNUUU1NZkRjQTlWbVdSd3dhb0Z3ZHhvWlIgWnRDcnlhenNtSGdBQy84QTlnNnZkUVNSdE9pU1l6R2VPVjF5K25rdFFBaThlbU9NRXNZMGVUZkY3REN0ckJPeEk1TVl3QklnUGRuMyBjdTkyei81Ym8xMTUrbExRTVlMYjJlS2JhdDJPeUlBbjVtZFg5WkdMUXE4dFkzZFJlRHA0ZUZNbUo3SUMwOFZlMnpwaE1ZcmxQM3pFIEo5Qy9ZTmdQOWVqVFFoMUVGc0NtUXpIY0JMVlJWNDJyck41SU5zaXNvZGpXZ3ZIbks0QjdJbjFWRGNGdHZaQVFGZ2dUbkQrbDdNSmcgNnUyU3EvWUFBNTZmUDlJeGtMM0ZsYU5iK1NraXpFZ1BwL0xzY1d4N0JzcFhySENyMm0xN3RUdzlQT01SaXd4ZkdBTzFLVStwcCtGRiA4cEtJd3dIaGoveTRZMUZ2L1BjTWNLK0IwOVg0dVN5andHTkRpall5bTRRd3dkZWh0RVZlc2FYU2FlWVdqQmVIdURKT1BwNTVxVzdNIGVlemRaa3dmbXdlRnVnTmdRZjJBWldhYmJsRW0zZzhxUlNnZW9hMnNpa2lsWkl2dHlDT012a25GYUFKVWxJdjhpSTVOK0x1aDQ1cjQgNlBNY3VxeGNnYmxYZERHMlFtclp1d2w4TzdEN0NNRkFMdlNKUlBJZk5tQm1TeUY4TzFQbFh2bUgramhRbjlKTjdIdi9BTy84QjZmQiBpM0ZzOGgxN0svMDJ5aVRJdzJCY0dvcGdpUXoxMzJhaHRFMWZjTlBkVnNreERzRDIzR3krTm96Tnp3bVQ5NnVka2Y2LzRBKy9BQUNsIHhCNmI3VlYzWjNWMnBBMHUycENKY2dtVjdYNm8rUldoZXRENGZ3NnJUNnJUL3Nod0VRYmJHM1B1aDltT0pJVG5BRDdCdi83QkFwK2ogY3dHSVdFa1pwaDJwK3k2M0NOandIUTJoVDNSRHMyVXJCMTh4TVEzd3dudURKdnpncFVkeVo1YU9NczNtOWpma0gyUWRnMkFBTERjbiAzVEtpb2F5RWh3ZUwyMWFjKzduN2hXSlBUSFdSSXlRYVIwamFGK2UvVG5pTVZZckh1NXMzZkFGV1FPNExJc3h1TU5XYTA1Mm05azFEIHUxdFJBN1ZjeEJldUJFbEtiNXA5RE1LZmNISk9IK0NxVzBHMEdZUm1aN3EvOWZ5aUQ3dStmMy82REkxL3BEYktSRjhTVW5hcGJhdFYgd1pMTkR3ME5QRW9aUW9XQWk2Zkk4ayt5VE41Vko1QTlqTStoOFpadnV4czUvVDRCK0FBRC9VZE0xRU9DUllFeXZtakpOMytHK1NrViB2Wjh4ZllVTkRpdTZ2WEtHUERya09Zbi9BQUhBNGVzRUMxVE56VnlqTnZudi93Q2ZIOEQvQUU3QmRvSUJSSFNhNUtMZFhBZFMxUGtwIGJBTmNUQWt4WFA4QUV6VGRvTWpBeVdSVzVnUnlEWXdPb0Q0T0JTekZmVVk4NEhBaVNrKzIvd0Q3L3dDZkJKMmpNU3JBOE1UN1Z5TTggU3dKbmRldEs4VzVXSnVsRkR5Qlk2alJ4eXNaaE1qb2pzaWlTNG43Y2J5UzVNZklvV2ZIbnBiMUJwMHNRVTRYeG1sQUpzYXhtS21MVyB1Tm1GMGRrcHV1V0d1YWxVT2VRM0JrUWpBOWJucVI4OGppQmd6RXFNR1dwYUhOUWV3NHNIdGd3TUhUQ0hzQWZLWDNEZ1ZHc2xWY1BiIGFudUJidWFPSmZGZlJHMlJaVlBwOVZtSWxxS0Q0b1REbEwzaFpjSDNyTW8rY0dPQkVrMkRRUGZud0E4L3Z6OHEwZG9kRTJRZVBhYWIgYXNoUHZoMmJSSmpKdWFPdlBkWG9jdEVhRTlndUJ3MHhRME44SU1saXdQNGVHcGIyeENhT1RXcGpkcVNEK2dnRC9VazZaYTNZSWZUciBVQzRrMjA0WnBKc2lCM0RsQWtPbTF5a0lkeW1Ldm1MZDJVblQ4enVwc0krMnFCTWRzeGROaktndFRoUEIvd0JnUC9zRDgrV09WOVN3IGVrMDBybVZaZExKTkZJWE1NRVV2MUJsMDhlL0hKdFJzRVhISHVCYmtFaEU2UXdTQ0VvSm80VWhacDMzSTEzdFVRSk5PK0tYSXUrU1cgcnR4QTUzT3cxUTA5TW5oeDJicHpoTGRoWlJlcnkxb1BtVFcvOFFiTzBVT0xQb1krcTVtalJqbUJrQ3lPeXplUUI0akZob1Y3Z1pVYSByOWx3WU4vUCt3RERFQldTc3pLVzIyNW5DMmltV1RPdHNQZ1dhS2ZQVi9MVzJpeG5aOEtReUFjT25tQTVpMEppcUJJSHVTREZsOGZPIE1uRWxKMlBZRDMvMEM3RmZ2RU90Q0FFWHB1em5aYlRZYVM3dEZxYWIzaUk0ZHBST3FCRERqME95RnREaHZsb1ZYWEw1c1AwWmwwNSsgTU9jSk5neitIbjlnK2cwNXFldm8vWXNQbTlzYUJEejBsYjVSTWNIQ3pROHRYYkpSNllRZkRGd0lWa1RONE9kd0xMMmNtakMxZG1KKyBFZHZvSi9ESHRGNStReUs2N2lzNmg2N3BJOEhlaVBkSGsyRlh4M05ZSjl0VjFVeFZUU0xTUlZpQWNrYlBEMnlVTXNhQVBieHgxdU1JIDhmS1N6QlROdmhKcmNDQmphaEVjTzFHSmI1K1FydXB1dDErWUhyZDhobWVIL0FzQThxc25ZMW9GMllNQjRtelp3QUE5K2ZIOS9QbTIgWlc2SGR5K1Rjc1Urbk1tekE2M3hlN084SGV3WFkxVHVRc093VEtmb2RiY0lhL2FsYzZoOExwQnA3eXpvZkpoaU83Ry9kZkFZdnlDLyBBTi9QdVlId1BLajIxQXJsbFNVL0RWRlc2bWpXcDhlbkljdDhVM0t1VENmY0ZWUGdlcTJRZ0dlRHhENTBNbnlob2VVWUhTWVQ2Q0FQIDI2L2VBUDhBVUMyVlBKYlZ1dHg3UUJzaXBYTGpaYTZGVVA4QUwySm9kNmxGMlFRaG9iNFkvTUQ1T3N0UFE1MjV2UEtHVzMrRTlydC8gN1JBRjgrL2JBZk16SmxHMEFSSGpkU3JoZlVlUTFoSEl3YnV6N2dyVU1DQ01XeU5RS3lxME13dDByai9DU0w4MGJ2OEEyOGZOanBQciBhdkhsTDZxa1pVMWtUN0xNS1M4cjJFQnRoVGNMNUtDYkhsTGZKRVBUR256T1h3N0c0KzJxcGlzMmFtcjR3c3dHRTluallBSDdBQTMrIDRFYzVwNlBMNUpYbjE3YlNxN3VEYkxZSmpVMEpGcUliUnBsUXlqNHdWVzRPREp2QTlQZU1iUXFheHVNMlkrRkdabTgzdm13YitBL3IgN3Fvc044ZEhkVEpXRGRPRWExRU96V1NzbWl5Q1c3MVhGUFhJVVBURThPK1BreDhYSEM0RWdEZ2VCcDVQMktEQmlPRUNXamFpQ0EyQSBBL0FBSFZoTXUyRk94aW1kWmRRVFcxUERibFp0OEIyUzJHSCtKYUxZUlN4bnorRzl3RHpFKzFDSDVhWUorbVR0QXN2bUR5OG5PRTNaIHB6ZmdCOEFBUG53RDhmVXNkdWpCcVNLOEltU0o0Mnl4dmNSME1ackFZN1VjUGs1Wjl1TlJzUFZzNGJtQ2xsNGtFWXNPaVA4QWJuYWwgalI5bzROZEI1QmZtcERBZWJUMmM3T0U2cTlwUmhydElFNFBrVVNyaTRiZ0hmREZ3VW5NK0hYSitlK0k4emNrUGpPR095QkVmRStnOCArZmdBQis2M0dEQXV2bzhPbGlpM0dhak5EMXU3eUdyT1lObWxIaE44QzhMUDQyK1dTNEliZytITExYNTROOEdjRHRFWXpuQW5nK0FuIDE5QjRDL1AzU0hUeUVoM3VCUDB0OXpsSmtzeHdDOEhQR0t2Yk82SUYzR0FLZklkeURGRFh4RElWdlFKNGVCVlJINVFWN01lS3I3WE8gMndlM1ArZlc3MC9xN3V4TDR2bjZmckJEMzhlUEI2M1hsZXBiT3RqZUpVWFRnK0hzYlFaTlFsYnNreWs3Z3dPSGsrK09Ock5acTl5UCBMenZZUUljd2ZyZDJBQWcrZmNzalI4Q1Y4eldjYWtSeVIxV080dFA3dWNlZklZLzZVSW1ERkN5TWl1eUpORzJjY21PQUpVMHZpeFk1IHEvUFN5SE1oWXF1SnpCQjAxRWJTT3RDZXVzejI0RDd5ek1tYVFkRGcvTG56c3huQk02UzRHbGh1bEM4ME9TWWhPYm5CQmN3aFB6R1YgWEIrbFRQZ3pCak9vdHZzKzBLS0l4YTlzNnFYR3gyb1lMaDRZTUN0WTlhVS82c3Rjalk1b2xMSEhnZG90UzA1bHlrWlBGZzgwWVhuSyBhN0FHcDBsVlNRUHBad1NnT2ZHM09saFlLSG82MXZITWVnMHJvZlp5ajRya3BvVTFDd2Jyb055WThtbEpva2NtandhdWhkZkJyNEhSIDZZQmxXMG9CbE1ZRkpyZG9zNXQweW84eXlPRU9CNTkwNFl0SHZNV3pGa0I3NElMZGpQbFAwUFl6SXNyS3UwZHpIaXJnZ1JIUHZ3QS8gc0NDZzBIMXZSNnJxTlNIdmVWYXR3VmRNVjNZM0VyZTFMQ2FFaTFLNXRwSWNuTndZREZWektmcXREcStaQnVuem5KN2ZwdG8wOUxJSSBJRVNRWjlCZmo0RGdOUmV5MkYzNW1aVEFORnVXbTlTdFFEWHNkVHJmT1E3UWJMZ3JBOXNLYUhjSWRrV1ErUGt4d2g3OHdBV293ak0xIG9GR2JmRGRYSktPQXFMWVVGQ0FId0hYWUx6TDhud3pDdlB6Z2cxRG1CR0c2QnJVd05oaTBMa1NCWXFhbnAvRzYzdFF3bjhxYlY5dGEgV1FXczNKcHpSaWJ3YjVzajkzZm9QUGorSitra21WQWtVVTJuN0k1WWhMSGhIREllMU5oQ1QyUlJxa2VHUTlvYkx1b1BrbGpkaXp1bSBvTHV6eUJIcnpqaUR3YXFtQVB6eWE0NTJ6eUF1TGhrTGpJZEhQZE9FaUphU3QyYUlVMi9DbTVVcE5tZkRmTHJwU1kzcCtPQjZyME5WIFR5Wk45S00yTHk2cExzRFAreUVBL3I3cWZ2QmJ1UTlZaWZLYUtOQ1VEbTV5a3AxdTFFaUVSYUF0Q1FMdHFrMStIMjNjQTZHdmI0cE8gRTlIWEdaNWFLdkZySjAyN1VtY1BuejRBQnY0RUFBVE55eE5RRlN0a0pjZHoycXVaYUEyU3BvL0d3NlBNQXhaWUZ5bUVHVXd0OFBENyB5OEtROENEaGxHWkRLY1ovL3dBQjkrOCtiV3BYYXZGczI1clFBbnBOYm1Va2E3NUdkUm8vVGd0eFNnaXBkbllIQXg0ZUducmVEYTNnIFRqaDJ6VjJnWmI1emhJVFlIMjNlUG9QZ09qdlVUeDR6UXBHc2tJdFY1dmN4OGhnWTJ3Q2c5OGJlU1JqemtDWXFDOFR2MllpU09RMjYgeWNCa1phN01hRkd6bmZoY2U3c2gyQkkxTjNvTTA1M1Rrb0ZlbEE2a3B0RTBDbnhJYXNVc0tMVjh3ZXlRM0FPdG1QbVZ5aDJCUFZvWSB6bERSeVpJZHRrQm4vd0Q0QStZTDdJcHRGZmdaNVN3bElRME9Gb3NNZER2Z2dXMnRvS3BsWHJmQXBsUHZ0Smh5SHdRRGdlc2JjK0x0IENNOG5EZmE3Z1I4L1VXd0g5ZzZjRmlVK3l2a2Q4MWFSZTVEaHFNc2l0bE1obk9HZytZK09WY3BDSGFFTWV0dzAvVUpjSWRnTUk2R24gZ0tyaGNaRjA1VUNNY3RHcmtsNEFIOEg0K0FQNy9naDZub3ZUZmxhVDJTZTVOVlhKSjZHMjNIVThNUDJuY1hLVmJHd3JhKzRHRE5WVyBwTUhRdTB2YVJIRDhaYUJaTW5hbnVFeHhBUDJ3ZTRBQjBsSGlpU01hT1pJdE83ckRHclE3dFRuZ3hnbVNQeHhiZURZN1JSdHJ4VHRMIEsycGgzcG5RNnhodXpSYmVuYkdzdHAxdVFVUkpHYnc0cGlHSjZoaFk5YnlyWWh4UTJjcGFoSUFkL3dERG9WZ083NE1pc0t2VXJnUGggdzF1eUZ0UGNJWVA5SnkzdG5GN01Sbmp1alNlLy9RZWZiQ2ZBUkRwSmZGelZJZVhOUmxlK1paTFFzNXdKRGEzTFl5azJ2QU1XR3dURCBQYXVINWxxN2ZJZnd5WXdvc2VjTjhKT2Y1SU93ZE5TWlgrbjlTSUxlVlphNDJ6RElGUytRU3M2UGJCZzhMMUNZSnNOaGZFOThNZk1zIENXcW9hZWVuQjBZWVUzTVk4SklURGY4QVlQOEFNQjFYc2ZWZFByRjhjY3N2Sk4yUWh6THNpU1Z1d2g4dGtWbktYWEw1Tlg1amd5VnMgdDNaVjYyamdYQ0JCM05HS0RHWkdCNzVzZmdOZzM4QjdNRVNscDJFbnZoWnlnam1LUTdlUHJJa1NTK3pQbFdLWms4TU1UMHUyZElJMCBYc2htanhHNUVLeUl2K1I0N3ZBZTIrZk5XTFlRTmdxKzFhL2F1MVRVY0cxOHl0ckRIMDY1eStwMlJ1anZ4ZGtUNGVDZWgycUhYdzZyIGhZRkRnekZaTXpSempaTms0Uno0QWZBYkJpQjZzaFY1eU9rUHI1V21VZVNSdHdYeHFIb2ZVaFNWNUw1YXExZmFUd3NPNEJ6RXpqZDIgT0JpZDl0VmNGbmk0dXpOanhOODQzOSs5bjdGQjd2Q3FPMkxGOFd4cDFUYXYweDFMeVJQazJ4VTVJa3dObGIvRjFqT1dENFFtVnZETSBCdzVBUFhDbGNDR0Q1TXNsTFFSbWJtdTluVDRCQmZnQ0RzQi9wUDYxRk8xRmRvZk0wenhMT0YxaWJLc0JpbjQ2UW5sRTFUcStLWmNOIDRULzV3Z1kvbjRGalRCbjFmazNoQWh4K0FIejREWVBQNWRRa1dzbmgwTDZmY1RUN09zZW1HbWtFNlN4UzZhRGErcGlFNGwycG85VW0gWjI0bk1ENFRTU1J3NnRNMzBrRTJvam1oRHk1YVJvU1ltTHdOVzlNcnl3eSttdEpnUWk3aFpySzRqcXlFTlB2QzZTb0lXQnpuOVZWNyBzZDJ4d1Exc2gySFRhNXNKOEtMZFgybzloNGEyNEw2Zi93Q244OU9UMllZVVF4YXlEQ1ltL3YzdDU5K3g2cUt2MWZZbTFqY29YWHZKIGRJMmNFVTNDMm9ieEVzZ1c1UkJaNThIekE1aGJNR0dCODJHcjIxSCt6Ym9qTTIrZTd3ZkFjLzhBMkRxQnJ1L1piNFlQSG90d0xka1MgcXhDTDFINXg1NFNGdXhuTHMxMjNZWEJiVzYzbWJndDdDdmdYaGtKakJmdVQ4Myt3ZnYyLzg5SkxBMVVBNU15SFZWZW9iczRXVXFrdSA0Q2VCYVBZWFY5aEFTaGdldDQyUnc5REgxdThZRUcyRHViTXJpN01yTDZUc1g5Z1FmQWRPaWJ1YzFqZUtxU2RVOGFvdDRDVi83elVuIEp5a3hUZG9Vblowa21FS290OWxMWmxiYmVSWkh4TG1HT0tHQzQyeEFFWlk3VkVCbXpOWnZpbUdaRU5qK1pxaW1HUnNuVGhaR2NYZUMgeGpTK1Z1NmtTZ2NlbnNoaWszemNGdTFmQXRRY21zaTdQV0JmWk9rNnVCNy9BTDlpZmZ0LzZzaFY4Z3hZSld5QXpHNExlY2tBa0IzZSBBOTVENWRidVhIajJ6ci9BNmZmTElUMkRmT1lOdXp2TFB5aFoyUHVqcUhSMzd0RnNHL3NISU4wZlBPSG5SUHB1MzcrSkljV3lRakF3IEpLMlFpY294cWg4c2FaWHhlSFQ4UndsMThIcm10ZEo5dE5UM2d6TkF0YUpuT0VoRWI2Q0FBSHo2L3dCQk1Oa3BkM3NRd0xTSzNyZVogYXA5a2lORmhUSy9sODhwR3NnS3VocDdJR2ZBNzRIVDRkcVFLL2Jad2F6R1o4VjNuZkFsWEpSejhSQVQ0QUFnOVJ0dFdEQm8xbGpqUiBKdDJHSVZSN0RMdExIczMzWWhoTm1RUjI0bklVVnFMQ0ZObDVJR2dDVWgzQkVrb2pOM2VlOEFHNHhLWlVjNldCT09qd3BJNTdGY2NMIGptV1dlU2VMMm9uMlFXM1dLN2k3a1pCOE54NGZNMi9DQ0JIdmlPdHJCUGk2eU01czdZZ3o0RHU2ZjM4K0F3bUppMktiZGhGcEZrYWsgSmpHdGtpdzlQVDFkSW1WZmR6dmFCNzYzZzRNbkpDSHptMGUyZzJURGF4YXpabXhtemJ3QTMvejZENTl5MnBEVzRFZEVzVW9ZcVhUZSBodXQxdTlYcEtxMDN4all6M1EyQUthUldwaWZmRmNPSkQ0Q25XRUJxcmRuV1ZpNDJZbWNDNGI0QVFXQUFnQUdCQWZrS29BZXhDQjVUIEQvNFFkYnhVczViVXlFeXQ5cVpHZ1hVNTVYVHlIekxVMDkvY09WTnBDcFlLMk10L2E5ekI3NDdjK1FrRS9zREFmUWNkY1RHSkpURWQgT1hNejd1cWtjWVJnWTRxNjE3SkxiSkw3eW83bHg2VStiT0dsamQwSDA4NmJYZklZek1rVXBFZGk5cmRSaWN1U1FPUFBUc3pLN3V5NyBteWszS0JjeTN4S2dVa3RJc2s4WTJjRFkxaFNtaDlIMXVodUJod2hXRE1WWitvQ2U4c25Ca08wQ2V4cEtUYUlQWUg0K0FBYkJ5REpnICtzNEQ1YWl1QlEzWlZ0QkROMU9RaDAvSXRpay81czZMRFYvRGNIQ1pNY0xBNXh5QUNEdFRjNmE0TWluRGJzRTU5LzFBSCtwaTBIQ0cgVXZRUFlLdW5YWmMxVlUvR2lNQUVPOE5sVnRGY0ZxdkYyUVFUM0RHeDNDWnkrNHFIcSs2VWRQWnY5VE1VYzM5NDU5d0gzMkRwQTV0eSBMYTVxWXliUVZ4bzNPNFJKZDJCVkEwL1owdzhlWG90M1dRd0o4eXEyU3lJaEdaYWtCUGdUbVRrM2VVWjNVcTYwYXVPY0JQN0J6N2YrIGxxcXhLZ1JFd1JBNmlOYmQ5K1dTVWhaTEcvdDJGSndqeHNHam5TMDdiaE5qdmtySi9ONGtWeHgrVDg5UnNkYlM3Zm1RM3l2YWZzaVkgZUF5V3d3eU1raXdsdE5BbFlxdStFSWI1Z0hoekUrSDc3ODhUSGxtRnE3TnNmdC9zRUFBUC9RZXJFclV6OGJybEk1dEJJTElZY1ZKVCBSNnh2NnY4QVVKZ21ubElvaG1HKzRCREl4cmJlL3dDRUVEWjl0S3ExaWpsRVBIM1NRZ1ZJWUVIa0Q4ZTU2Z0w2VWVPWUpGZjB5dUFYIGUvUUZYMjFhSW13SnVTUEU4eVEzZERWMXNmTVQ0YTJ0dmhBUGNVQ3Y1OWpQaXlNNVJ1YnhWeHVyWGhCKytuejlSUDNSNFVyTjB0VWcgZWlzZWN5YWU3R3NoU2JGOGtTTUwweXVRSWpVWkZ0UWUrTWdma2xicjdJMUFTQUhBT01aeWd0R1dkN1NYYkRmMzdEQUIrd2dqcUZJUyBKMFROaXJ0TG52OEFDMjdydHJ0NThiMm10L0VmcW5yUWR3VjNJUHRiQ1BIR1JheUE3ajN4Mk51VDdjajJtK2pZV0x2VE56RU8yc3JKIGZ4cFFPZ1N1ZVRCNlFubEZkVGZNQkJDWW5tQTdpSElCNjU3ZjFOWXpod1o4VjNrWitwdllLaWYvQUtEc0hYRzBGS1RkOWhGbExEc2kgbWEwcmVuTENzaGtQTkR2Q3RyYVR6UVk3cUliaHBMWmRKWS8rd3pwak15cTlYMit6QXdaczJEeDd1b1BnRCsvcGt3UWE2ME1hYVlHdCB5bjM4eFMyVEpzMWdKT0RSWnR3V044VGRId2VuOTFFL2piQlcvTFdIbkFkWldVUERqR0d5ZDhNZS9tLzgrQWNCWVZacGZvK1pNc0dnIG9lb2VuNjV6cnN4a0xhcThLYjVLYUY0ODVReUh3NjM3cUlkWG1LZEFzSDhtalhrK0MzblkzWTJrMm9lQUgrZkh3R3dIeVo1TzhrWTUgWStqakUrNVZmMUhobGlHUHh0TTk1ZDlVdHJSWTdKODdUcys3L3dBdlp4NHgrZDNQemtNQWw5MlhiZ09IcWt1bXQ3KzFTYndrMlFrMSBpU3JJaGVUNFgrSFhLdFpyMjRzcDh4aXlPQ2Voa1prN2NBTHh0Wk44YU9USTRSSjhBL0lQNGlQNHNIUzNoMlFITXI4TklGN0k3YmFFIHJLUVlKRUxOUkFNVklvZHlRL2h6TFVNYWhHUmc0ckFIZ2JHRGpFWW9yM2xXV3liSThiQS9IOEg3WUQ1L3FzMjRiTzByb0tsQzB4ZW4gVU1DRjZqSmRVTFdyWkt1R3UwNHRUclJaS2N3dWJ5eVB5d1l4VDlqSGVyRUQ2NjNJTEEzMGpNUFU3SXZyOWZwUEg4YS9RZ09HTFdJSiBlcEQrQThrTFRWUjJRLzhBaDlraVZzUjZaY0ZmaDc0K1ZsRmZMSVg0ZXBEZUVPdDJGd2FycG8rQmVFUGt3c1h0bUhDUW0vMjc5K3dYIDBCQjZpelRDV1VOQWdScGsyR1I1UmxCSmUyWFdWNXJrVUtjblVydVdBUU1SMG1SSXl5SkUyVHhiVFRMVmQ2bjMzWnJkTjhjNEJQTFggdzVzdExLV1d0alcxalQ5L3pXUnRZUjVLd284UkRjcXZscTZ1aHI5Ymg5U0NHWlErSDl5MDk4djdjMlo4ckNvRWJBSHNtd0lQOUFnUCBZL1MwUElGclpocWJWZXdtMm56d0cybmNlbjhmRW1CZkhuSTgranpDMlltVEVPOEdTRFBIbmpoZ216RkJiTXNnN1J3Q0hQNytBKy9BIEcwdm1YaXVWTURhR25OdzduV1dOTjBqL0FJS1NQaUNFTW92Rkh5bitOekRBZHhyZHhETlRiZUUrNGtOR0o0cTdNVC9LSnY4QUVXd2IgOXo1QmZkM2VTbzdHcWNPTHVtc2ZtT1dTTlh0NDVRV2ZHaERYbndXaDhEbWN3bUIxL0d4Z0xlZTFGdUhkOW9WK2M4SmRqU09mb00rZiAyRFlENEJhTVFzZ1l1NkY5dUowanM0UkVVckxsd1JueHp6ZGZIVHBSSEpMRVZrMm5WQWpwdFJVS3FpVEVrTjNiZTROVmNFV2JDV2pMIFJ6eXZUOXJWOHlwSUpjaGtsT3Q0WmhQWHBqazVMemtMZk9OdUV6VUlodzluNGt2MXBPTU0vUExrWmxsNDN2WXZhb3RoMkJCUG4yb2MgdUJnVGU3VlNnYVpTWGFLazBtdy80eVRZRENZRnlvaFNrV1JnMHh6SEZEMUNKK0tlcXRxZ0IyZkVYdGJ5TUIwbWI3VmdBR0lEOHVvSiAvcUhCcDdZR21WTGJWWG9kU3cxeThpVHZIc2lqTk43Qyt4UmRaV2hWODBoVzRjd1ltTGRmMm9qZ2EvUTRJZmN4ZERqR2M0YjN6Z1AvIEFNQWZWVVMzS0FSNWFVbTJVbktMdFlXY2tSRWV3UUZiNG1KTDNwUXNmbUMvVlpkOHJpdUpZNkpYTmxKOWwxWWhqR1ZYMDZXV3luYVQgU0hiWUFGdVlBUUI4L1VRQW80cU1Za2RKS3RVd2tpZTNiRXFqQ09SNnlJTkUxV0pvTnpWelNSdGFPQkJsTUNUVXN0eHZSa2VvNG0vaSBLclFKR2U1d1JpYkJGY3htSGtzOVBYS1RqSjVSVjVEWDZUbk9ERE1mR2hoS3hVTWdHZklZaGJNTDRkVmJXQ2VEbWNaSzduZ0RxN2UwIGZnSUErL0h3SFQ0SE1HbnUwR2hEcVdCY3h1alJjTzdPUDF2WU5zRms5OFRhUjBsbEZzZ3Q4a2gycEMzaWZVdDRBZFcvY3g1UTlzMk8gcmtrMmM0Qy9XN3NEQUEyQi9Xb3lRek5Yekw0S0lkRmFuTEJ1YU5NdmhWdE9qMkVQOFhTSVU0SHdORHA5OHBPRzRHSzVyT3dKOWpZRCBIa28wQzdNT0ErNk9MOWloZS9nTi9ySGRBdGdWMnlxeWFHSFcwbXdiZ05xYWZSdVMzcnllVXRCM2NqMzRyY09TTWkyd0xhcTIxL2RMIFV5b3JPTCtqQkFnUkpCZ0g2b3VBdndEd0NsbWlta3REcUM4ZTdNc3p4NzE1R01sTjNKTndkbzV4WEd4d2I0WmhMcGxXVTdNa0kyWVogVWJ1a0hCQ3M0L3BYM1VPN09pQVJYZFBFWmxJV1crSG1oOG1ZVURkMU1xVFlRQTZycS90anR5ZXRkTlY0WkJiRHNqZ25yWkRuSDhVRiB0SEp2WTFEcTlaR2Y2V3ZCOEFncjRBQUEzL284YkRGbVY2UHJHeG9waEFjSHhQMHVxWmpKRGg4VnRvVFpaK3VuQmcwOWg2cnZpdHc5IGdWczFBYmdBMXpaSHUwUGpNekhPNkp2WUFBQUI1L2dPQ3F0UlhzUnlaR3F3V09xNHFSbEJ3aGFObkh6Rm05N3BTbUxybDg3UHpBN0kgSGZMZ1c3VXN1djIyMUptTE1MMndtYys3dkhJT1FZb0w4ZjZDbldSTVVvNGV2bWltYTM3cXcrUTJBSFBWK1dmTVR6Q3J1Uml2OU4rTiBidzYzTUw5Y1VELzl2RHM1UDZ5eXZHTHNjZUVGQkFmZnZBZEdZMkVrWTFLcHFFamhPbnFWTUpIMDdZM0cwMERReXVhVWN6Tk5qZHhpIFBKODFiekxrWWh0NVBISmlEMkxKRmxneUpReHJOckZtK09SWE12WmRXNU5xSGh6Vy9vdWgyRXd5RkZPd3poR3BzVllrQ3hsakttclkgNDVpaXc1MTNMWlI1WlV5dVpSaVZYcXF5ZWgxZjFJaEJWL1ZsSWg4S25SUXRmSk9kS2QvdFM5bUVtS0RKZVErSVFpdDEwVldXZkFIcCBGc0UyVXdYVk1NN0xMc0ZsTWNnTzNGajlnekowdk9pRk1vNFVpa1VnUVBCVmJsZ0ZrWWhEbDhiblZ4cHFDaUZCL2FNS0ZWd2hpZ0t4IHhMU1l4b3VacEVGS09mSCsvVnZKdU96blhRQXV4WTgzeVNDZkREOS9INS9QVmpkUHVxKzBOT3RscXQ1TGsxQnMxb21EZFIwZHFyaDMgYmJJT2pJYXVLaVlHV1RHNElrS24vd0NmSGFod2pJeTJaV0hwUnhtUHB4d0I0K2tGaGpoeUJmdDZmQnZHa3lzMWhLcm0zOUtVYytyTiBacStMSFRuUllzS1ZROXNpRDJBZkhnbFdGMXN1UURlcXkwQ21Ea1N5OE1hYVd2VThPdTllbW9RQzlVQjNIL21Bc01ScHZtWmM5eDAwIHJtcGJjajFTZ1l4YXYyVVBpdlE2NWZLbmlySDU0cmR3UXc1ampaditGK3RONEdET1VFeVlQOEpvNzkvUU5CMUY0RGpvdVJaRnlqOVEgWjZldDIzYWpSM0lMWTIxTUlyM0tKVzZhZlZ1MEhDeUxJdFI4L0pGYzFvbjc0eU0xWi9pQW56WTJrbkY4K0FBYy9QOEFUV01VY2hqRSBzd2VOOUt6Z0x0WHU3dUpidWZja09Kems3Y3UzdEhRQU15UWxzQm45UldENTFzYkFOOXExbHVBajhWODN3VlI4dzRoMGZwTFk0cWZXIDU0ellYeEI2VGVWWDN5dFBsakZtZ0N5ZHlONFpFSXg5cUEzaFMySWNuV2I0VWViTUJoT0V2SGFJK2ZZSDUrNkQ3b0lPREhIVzdHMWYgRFNRMjMzeTJraTBJZDhENjlsbmdOWkMzeHdYMXRsZkhCUFpIQ1phaDZuM3lqLzhBUzhYVUF3SGFJTTNWWUJDZjhENERIeitqVFlKcyB1ZFpoTE8weTZjRkZaelNTRFlET25VRWtNU0VLc2IrSFZnUkgrcWJlcDc0ZDI3eDNNSTFQRHUwWFplRnh2TytlK0lSZnI5QVgzOUN4IFBiQzI4dkxwZDNRMVZpbmtxM2FnT1RWMXNhWDY5VlpGVDlrYTZiRTBBdHVFeXQzd09uNEw2RzFJZG9VczhUQmxtUGxvZWMzdDI0RHkgRHNHZjJEWUFDeVJORXM3T0hDR05ZZ3NWeG9rc3NxeHhhZEo1NG5rVGV4bVdVSENveXBPYkFNMjRwRW1LQjNRVEhHVmx6amVvb0l6OSBVMlF1dG9HUGpqSng5dG5TWVI3Y3JTaHcrbjJvSFdUZVdnQndmNGhFQzRWdXB6S2IrV0xpdmhCd3Nod1R6Q2VRVzhLbHZEL2N5djN5IFpuamUwZ0dnOEJRVUhwRDZmd1pqdVl5TGxEZ2JhZTJpdlFnbTZKaTVHcjNoc29URVBNWkN5TzZrTms3Z0dNVzBlUDVJVHdmTFFXZUQgaExzU2RnQUFQN0J2NndWN1lPYWVLbnNtcFpXVFc5NDZlRG8wUzhXRUgvS2dHMmhKU3VVUGdkYmg3cytac3pVQmNGSnEyeDU0dldlKyBCTjdCZ0FCKzNkZzMvbjFoYlVmTlVHYURHdm5OcXVXek9IeXg3dFpBZXdnNmJYSW1rZG5IdzNEU3VITVUrd2VmSG5vTU1ZVEZxNU41IEJkcjNZNC9iQityOTFOTjlUSW1xTDZXTk5NcnZsTWg5Q2ZieDlWNWNmU2tlemxEakp0RUQxSk0rMEpoRXV5NnpYTW1BZGNQNFpKZmMgbDVkK09BNTdTMStCOHJHK1FhM2I4ZFBub2RQcVdrdERKVklwMlFlZkdBczRORVZzbEZLcllMSXF1eUE3S25rTUxVZ09GOFRtUVh3TiBXWi83MjhmL0FKdW4zN1lIQjNQY0w0WDhuTnNhdDBBRFBNU1lnZEpoaDJ3eEVmQk1wOFc2L2NPSHd3NGNjeVRqK20rZXFwNDBaVjZ1IFRKdkhDZUQrZmZnSGdPa2JYOXNXNExwdWphTTArMVdiVDBmVVUydTVEV01OcWNzbnRGYzdXQnAvdHVIWTZUWkM3QjNVVWtEK0hKODMgTzVQY240UUp2NzhnOGYyQS93Qk0zTkl3MXhQSXdBTi9hWGM4RFhGYjBsUHlOd2xDTVQxZTc4eU1IMEtyT1I0UkxGdGtkUHNheDJkbSBzOVl4S1lHamFVRFFIMTlQZ01jVi9Eb0lHZFlvWTRFMU1TUjdrTU0wczBydSt6TTBUU1NQTzBza2p2Z3JNelM4V0JYM0c1UXJ5U1NoIG9TN0pFNzdBeFR1eUFBU3poVkhtemwrQlhRSStITlA5cWthUzdRVU83TWdiSkNhZTNpN01tUWtRd0o1c0tBWmhEa2tNTytQakF0N0Mgd2dmNlpWeGl5VDJUMjJDb2tBK2c4QjZ2STBLNi9tc0I2L1FzeitGNERuY2gyM0oxSWRxaW5JV2hvbVYraG1ROWJyZS91RTRDbm5uaCBrM044S0xPUENRaHo4dkhqN0JzRDhnZFVWVjJWZnNLWkRYRDBOQXpyQkczWkx0QnFxdVJ6dzl5Rlhpekc5UDQzRG1RK044RDRHand4IGd4WEZzek1EQ0cvOS9MNTkrOTM1KzdCN1lZelhCVmR6SzNHZHMyR3R4RmNhdHNGc0dLbE9pYkdpc2pBWW1RdzlrVE40Z252bzh4bTQgSFY3TVQ0VWttLzM4QWZQK0F3TFRReXltSFBVT1VqaGJLVCswaHVSM0hqUmtPU1paMzVOWTRuemx3eWFhTm1sSWdTTjlSdVl4NlUvVCB4aklyWnFwT1Y0cnhaSjhkVER4UTlVVjh2cmE1UzZUZXRrWG1BcTJ6VmZWUU5yOFN0Z1pTUmNndUhYNWluNGFITWhwNWc0MjErZWVIIDBZVGZGY1k4bk9iSlBhSS9zQjkrNEV2OVBMVTVNcXZ2UTFMb0c1a0ZrVnpBeTdsZStOU0ZQcnhjREtLeXlrd2U0cmZlQjhUeURJOFcgWDlxcDRZTUZxNndzK2FxN2Z6NTkrQUgzN3BEckZMZzhiN1ZXaXBScTNYMXFWVzJxWi9BeGtOaklCMVFGanI1eUNJdVBuSkptOEkvYiA2QUVFTXl5VmFCZ3o2U2s3QUF4UVQrSURnUFI3WDlSMS9wOXJPd2pWZk9BMThzRjI3eHZHZlh1b0dKYWtyNGxvV05NSUo1aW42cjJlIHIwUDg0VDUwS3N5ZG9DL2ExQWp0andFK2dmaUorZmo0QWpOdTZxU1Jaa1pGUTVOZWM2enowMGtFL2ptR05kUEtrbjlUZmNZSnRYSXMgdC9kbzRuVjF6Y1NOR0Z4MDdJaEFSb0RaOHlHZU54WGFZa2JuTEZlS0d3U0lCaVpBVXF4UUdwM3lZc090ekdkZzJRN1FUSzlxWFVaViBhL0RwTkREc3JJd09EVzI4RGFqQk5HUTJnWVQzdkhZdUE3L2ova0FOY3UyTFlzWmdaTU1xb0tCcjF5c0prbDEreVRhL3JJd0xsV2JZIDBXazE5YmNOTjYyNFBpL3NZRlBucXFHczJZTEtEQm05MWNiZUFCOUJBSHovQUlCZ0VEQlNQUFFxOXVtcGFycmN1QjV0MlB6aHJBdlggWWhuKy9BR2E0UTdJTU9CaDhZSmxqYmUybzh4WnZKb3ErczNuaENTYitnbi9BR1BvTDhmNjNXQkljR08yR3JOMURtSXlTeG1Gc1RncSBodzlUaDR0WVdGS3NhWXdCMXZ1UXlwN2c0WWtDRmxoQTZ5VFY3UXN3WjNSMlRmOEE3OXdGQkFQM1MzQ0xna21aMzBWNEVTV1VidjhBIHpDK21nZEpabzRza0RTS0gyc3hhamNGaWhvTmk5T3N5eFNKWHRzMnJYZk4wZUtIenp6MXBReUNXMFZuY0ZYaTlLOU9IcTVNV2pwN00gM0NlanNSaHB1NWVUWlRnbnNreVpUN0pjRmYxWlhKQzBEeXFoRTFsWEtQTHpzbnVjQUFQdjJHLzcvTVhKeXpUY2xaMEJ0cXNiWVF1RSBOczJwNk9oMmVXdUNrYmFVL2kyUW52aTNjSEF3NCt0M2g4WHoxTzNBc3JPMXMyeDdIYVg2b1BuL0FOL1cyK1dRQkI4Um51RnhwS1JXIDQwUXZtRDVENWhROEpBeFdSd2hWV1loUXpISkhpZXdBWjNKMGJpL2d6ZU8rZWY4QUFiK2Y2TVRDMnlhM0xRTVZKS0R2OTJYN2MzY0sgMGJDc0llV1cwMG93N0N0Zk1RM0J3Y0szWUpsT25oOUxlTTdYOEdadGw0VGh3SGYwRStmUGdPamN2dUJIVjQ0VjhGNWQzRExHeUJnZyA1NHZrV1FQMmVnWnJXUjQzeTFMWTFrTGpmODVwWXlJdWw3aDVJNTg5THlvTmJlcWRKckM1TkhGSTBtT28wUGNtTkpWKzB1eGlMaVR3IHMxb0I3aE1mYkltMlBkYml0emEySGFscTRoNERDYUVVNXpWd01MejFncUk4QXhQNFlucnB1bVd5MkMwR0Vpd1dTU2VuNlVVbStkUUYgL0xkUHU2MUZLYWIwMjBDNUF4YWdkUGZVOWc3Vm5rK0FFTURDYXVockt6dlp0SjM5Qi9yNC92OEExVXUvSkdveTFDQ3JaYjRHR2dXaSB2Z2xUeDg3VVVqL01ReGRoQWs1YitKVzZHK1RFTnhXMVdCOENxK2RjbkY0RE43QjdIdjhBc0FEMjYwejVGRjVYRDU2a2t1dGVxL2JaIElWMVVEVzdZNG5wUzlxTVEyVDVrelVoZGx3ZnpoekFoWlp3eFdaTm80eWpmZGtqWUFBRGZ2MzgrdEZTTlk1RU8zdVd6cy9kbkoyRm4gbW00cThoZ3VCcW1ObnBzVGI3T3N2S0xNc0cyYVNRSURjUWRRTzNia1ZIRms1aFN2YldYVGdxTzJJOWNyY09LQkpLS2VVcnhTcHlPTiByR3lZamh6S3ZiYWxMZXp6RS9UZk10UmhjSGdEby84QW5kelNaUGMzbnNsL1gzZ0VId0NEMU1XUUhqbEJlU3J1N1V0MzlBZkJydVlyIDEySHkrZVdnamdWZGtYMXZqYWZNTWtNTEduN0RPY1NmaTNsbVI3Unh3MkR0RUF0MUJBZUFTVjBXQkRucVlldVUybnY4Rm9XMzRzUWggMmNZU0VNOFVkN0dwdDk0ZkRtYWU3VGg4RU53S1BuenBiTnlmRjVaZnV3UkhBYitBWCtRWTcrYng5VGJvNUw3Z2tCcXgwMzV3YW45UyBGbXlGdWdVZWhsdVdVaVdNMEo3aERjRnVIVDhPd0h5dVh6VGZzY1B4YlFVOTBxcnJzZUVFL2ovc0VBZzFodHlJU3VhYzVOZUlTaXRjIGM1Wldma1ZqODN4SGNTcVZkOGFLa21peEVlM0RMSTlDcnd6VVZZeUp1eGRBa3ArSGRqR2oyRUJ2M1VJeWY0UUdTV3E1VUpLNVpQdVQgc2lMdVNrMkMrUEQwbnR5M09iUi9tQ2JNK0lmZzlrTjlvdnNBRGdJRFlFUFJiUmNqdlY5ZmFaRmZWYzJwMVFKTVpzY0FMNUhYcTN1UyBwV3dYWTRkZ1c0YmhxY2V6QytZZ3FYRW9LZTg3WHprbURDVmNrbyt3QUQ0RHdEOTBhcGN5d0xBWDdhalpWRDZrQU55YWV3bERPRGc0IEw5M1VPcmdValJ2WEtmWDVoa3haQTdnUVhQOEExSWFkNXN4Wlp1NkN5c0hMUk4vNytQOEE5L1lHVFZiQVBZem1yVHNqcXVkcWxxcFYgMUlLYkFubUtYdGlZbXlsM21WYjJpK01scVUvVDRmallPeXEvbjBldHZLeStmM3MzKy9nRC9nTWNlcmY2ZVcxYUNIKzc2bUhWYWVGViBxT0xWaVZJdXdXYTJOME0zbmNzRHNxeXhGZU5GcDVaTjJJeFRNWk8vVVFISEZuY3FmZGJFREU0aStXQjZwbUR2MUhERDlSV2FadFIyIGZFZXZLdVlYaTJtcFhYbHVyM0ozaTJNK0wrbnN4MnJEN2V0d1h4UGJaemd6UFBGMFpaQi9pN3o3OWJ2UGtFQjFibEJkYTVESXRLUEcgUkx0bVJSVk1NYW1qMjlxUGd6WHowdUVWK2NvVGpEZTczeFVZVDgvSzF6NFFRa3lzck12bjFDL1NGT0F6U1JzT0IzSEZCQUw1OU5BaiBBT0JVWWV0R09wWk5uU3M2VVdUM2I1RERpQlRkUWdINGpBWlc1aTJ0aHg2MU81Z2hid3NyUGE5NTN5cm5aSkJnTGRRVC9QdW0rakxGIHFCaGRCRk5RUktQVmFhZFFVaWZYdDVHUkRpMEhuZlQ2QmI4RkRUZTRTNlVxd2M0WVV2UFVxNGlNeE5EV01GbElCbXppUGl2di9IOFggMERoZ2VvVnNYTWF1ZXpVTVp0dUp0c3NJUURwNG5TYVdlUVltNUlsVFpzWmh0eGNWNmZ0Y1BtVXB0R2xreVJwNk1vazlTVlpZb2xqZiBDbWpsWUJ2S3QyTURYeTZMOHpKNGZVN0tnRWlWa0huWmtZYS90U3ZiQVV6RXVVN25nTjhNR0VQV0Fob2NOZ3A4NUFjSUhHK0RLNnVUIFd0N1NhdWVQKy9uMzVnUHoxQnJVTmpocCtvZE5TYWNKSVloa3IxSDFGSjdPMk9BRjhMUlFOYmpyVVpHUmtyZGtyNlkxVkxWOThiT1UgSnZsWFZvekhQTm5Qb1BnTi9QbjM4anZsTjJNTFBvWlM0RGJ0cTBEM0pMRHVHVGNFc3pLVjlRcDVvdFM4TElUNWdmZUY5d25mK29layBKaXp3T3J4bmF1cnU2SnpZRjlCOCsvZEFiUXJ3MUxVb1lUVzFQSkFaVU50ckt2MVVhMFM2M1BTcGNvOVd4Q0pOaHVFUGo2M2dodUVCIFZtRENnc1dzMllEOElEOC8va0Fmc0lyS3JUVE9lODV6TWY4QUZSWHQvVldlYlBueHgxQTdTT3FFSVVPekJFcnBudFJybFFCdGN2UFAgQy9INDZGU0ZxWFpQclBPU00wQ2JmSzFEa29nZEpTYS9weVpWNEhUM0tzYVlBdFN5TzFhMjREME5WUEQzdzQrY1pweFhKMlp6YndmLyBBSUZzSFU4dDViUkFZSVo2MEFOcFRGeW1VbSthM21wTlBxWWZ2Y3ZTcmtyY2VoaDBOa3VDeUNIYXV0S1BQSEhEak5ObFB2RHNENFB5IEFCVVNEM2RQKy9abHRsUHFSekhVWlh3MlQvT2Jzcm1GclVSV1cxMU03cTZ1WklJZGtCNFllWXdiRzIyQnNkVnJObWJXVEtBM2J6bUggbjlneHgyRHNkWkNuZkNHK0NzMEM3RWg0MkxVeGgyVlI4dVdlVFN3QVhhaEF3K0o3akREdUMzQmdMOERHWXM5bTFmakp3M2diQi9maiA2RHo0QjBLaFF5TW9taWwrZFFEdDZodmFRelNkMmNuSkR2aU11TzBkWDdNMmxsU1J4amxHNUUyQnV4VFdsWjF5YU4wUEZjL0I2M2FGIGpLZGVtWjZUb1ZxV3BWckFUcEhxVVBWNGtQOEFLdGkwSzUyK3lPOWxrVnNudUV6NEd3Zk1yUzhtbmMyYlpBbXhnRUgvQUNZTi93QVkgNGVIck5YTWFlNkN2MGFiR3ByNC9xZG9NZDVXd3B2bUl5bkFQTU9TUXc2R0gyOWtkNTQ1OHAxUEpveFFXTEpvL0NUZDRWQ2ZBZlFRSCBVYkRiY1Z3WUJ6VkpEU2QwQXhwWkE4WWNDMWtTdVdhZlR4aFBMaDF1R0hocC9GWUNlQitZODdXTEprL3UyK0lPd2YzOC93Qk5xekZOIDRjb2RlejgxMkpXY3h1MGFYWDhPWklsaDAyMnE5cTlEVzA5OHF1R1ltVnV2bUdvOG5nV3JjM2xYS2NaNXNiQ2JBLzhBZDMzUVg4QWYgak5QREpFckZGMHlSU01aUzlhdUo0b2pGRVZPSitvamI2aGpOSGNYOGFBc2NyVXdzYzJZdmJtWEJXWSt5ZU53TTBkK05tc1JSeGx5cyA4REhuZlgwTzJMM3VtNXp6SE1Vcm1pb1lSaGVOUWxuSzhReFVyUTcwMm11SGJjUHFvTVVPbmtFT3h1K0YwMDd4bXpId1dzUElUL1N2IHdBREEvc0hRUUh6S3pzc1hjRXF0TWsyQnJSd0pXRUh6ck9EcWJJcmxQbFZLeXIrOFVQZGt4OFQ1alZVaWUyd2FHL2lGS05CTlpPSkogdTdMVTdSSDdkUG42RDMvb1BxZWozeUxiQjVTbDV4SzJqeVMyM0dRWkh5dDE1azU1WG9zcERIN1AvSncyQ0djODlBV3hqTnVnc1ljQyBiMERQN0Joc0Q5NTlrRDRiYlhNeVk1VlZlVnRKK2FlcHhoTVdGazJSRER1WUNaY2o1WkErK1Boc2kyeU9ERzhXMm4zVDJUV2NiUTFHIEkzQnpmKzRINWY4QThxaTZqbG8xalpuY1pJRUFkcy80eU9mQzFlZkk1NCtlaGphOC9UenRERzNkamhJU3VhK0RlSEhQRjNmRlVRU3QgVmJKdGNCT2FuUFdmcDVwZzU2bWhyaTU2WGJUODVaN3RuNFpoNmNWOWJwTnpwbW1wa2dabyt4cEpTUStoUFd1Wmd0ZjJkaWhZUXh1YiBKd21HUytkYWF6VGJUc0d1a29lY3VlcUsvbDFzQ3lrT0t1WG94NTlCejRBYk9seTM4Q05ySlh6bHJPTkhxVVd3cjNCVDYwYUQzcGhaIG16TG5yVmxrT0JRRlpQQmpzNjNqU3hVTEtFMExNbjluN2toUEh2ZjZwYzI1RnRpTFBORHJIOVJJT01JZU9QOEFpUVBGRHh0ZnYveCsgNkkyU200Y0NtN1V1U2pQamRxbkRWcFpxUFc0RmdZWmxvVkxFVFZkUElPRmJzakpjRU53ZkFaN2lVNE04ckhqRm5tLysvajREWUQvZCAzcmpwL1ZvOEFWOXdsVlU0RXJhYmE5VW15dDNCOFYxTlBGTEg4RnRvQjZmNEhNVzJSUHEvR2NCc0FDYldpZFpxNVJtR1BHeUd6blBqICt3QU4vUVQvQUdJYWxWOFZzdFJTcURPTmh5aVNETE1GZXNsa0wweXIzeVdydEhiL0FKNFlmRENldm1GVlM0SFZhZXpEQlRRc296d0UgZFRhT0FxSzNWL0IrZmdGUkwrNUxZRU5YeXd3dXpLclNhQkszTlc4dEh5anpSM0lLTkVzOXA5ZkUrcTN3d2hyWDJRNEIxSVFHcGt3ZSBYeWh5YXk4VW1FcTMzKy9maUxybmF2U3g2dlJyRktKcDBpbWlrMUt4OFI2cU5iS3d6cHoyYmdTWmU0MVBERzlIQ2pyajFEeFN2SkY2IGMwa01rS1REbVNEY3dCa2lOQ3BCaUNyZkgvZnBlMkJiRFErTkNHK1Q2bEdwT1ZUTGIybm1FcW5pY0RWMkZObGJlWWNLMzFDT0RIY0UgT2RiVlAyMWl5ZjhBcWdGRTJiN3Nid1lQQUlQc2Zmais2dkxFSVhjTHRtQXh1Mi9Ic2wvTFZ3a3c2UGlHTWU3RDRNaHA4eGJxdlovRCB6a1BnY0V3c3JDRzBMSk1Hay9Sd0FEbjJCL3ovQUU0S3JGM2drVlpETTNtWUNaMUJhbkRaYTZFTXhWOHVIVW9HelNqUTRENGVNem5rIHorZVV1QndMVXQ5R0tLL3NqaE5rOEEvSUw4Zy9ZT294Z0lBMWVQWHRqSWV5RTN5YTdjd0pURTlTRGdVT3doYjRuNE1qSk00NEhJbUEgYWpiNEZxTUV4ZTFrMWtIVit5QXdCL0VCL2tmNklMY1NpTUkrb0VKcVNKODQ1TmtqdGpPSzVPMmZZbGMwZWVPYUF4ZHBadzdhYmVYZSBCVENRYjNLYmFaTnVWdHRuM0pWcitldnRxYWFsTklhSWNCQ1BOdHpab0g0bW44YTdTS25aRU1YYkI0V3RzQmd4VmJJeWJoTlZSOXdBIFhtWXpMTDRyazk4ZGpZUkgzL1lENERmK3F1NWpJaEpzT1pQaWh5U1RGK05FTWMySHBDSEZmSWpRQW1FRnVaM1VxdmNPRG42LzV3aDggRjVRekxJTUk3cE8vL3dCQThCOCthcTlnT3RvVmZjQWUrSHgvaG9UdFpIS05OTXlSZDN5cUhpWEk1UGllWVE3VWZHUVBBRGd3RGhQYSB2Nm9LRXhtOXBCdmYvd0Jnd1A4QW4rMlJXWWV1VnVIbFdxeUVxOTdZcVYzTUFFeGpFZkgwWGZPMW1HQmJaRStIRDdmd3prNGVlVmJJIFppZlBDYk5qK0x1N3I4ZzRnUGMvc0RqS01WU1VwMld5UVo1WXh2aUZhZVBFZnlZOWd5NENQeWI2RGFWSGtNSWRFTzNUT2xmM2lLV08gWmFGbkxiaUVaUEl2Nmo0dzcyRllscU5GUzJETFNDajVVcUdlemxJdkgxT0FWZXpaa1d4aFBjYVluc2xxVlhNUXpBKzFBWUZ3cVU1TCAvRi9hQm5Sd2dUZzc4QVF2b0o4K0F4RDdvdVNHdWF1T2Jocm1aRDZReUc3Q01NalZZSFBLYnErK2RQb3lHM3A3SXlPRlZyakF0bkczIGdlRXhtR1hJcjFtVDcydXdSNFBIK0FuL0FENEFBVzFkcXkwbVZQVlZzMW5ZQ05LMU1YbUdveHFFYWFxNHpZVEVtMU5TVm5rbk05T2YgUWxWdzU1MDJQUGVqTUh3a2l5R3UwS3o5SnoxaERDVGlCTkExdk13OVBydy9icFc5UHVTdlhySEVUeVVNQytXZ3c0bUdyVUJadGoyZyBtMkZTSXRsVDAvZUw0RHpIQU5PZ09DR2RyZDV0OXBmRm1zL0NoTmc4K3diQjRCVVRMSmJSeHVtWDA4TWN4WDAyb3VHYVB4dVZZTEN4IFZyeWI0T1ZYV3dXU1pDZDEwUnFCM0twU2FOWTRHbW8zZmhhczd0UDdBQ3B1bTN5QVVBMDROTTZoSFplUjBrdzBZYlhiUyttM2NZWUQgRnEyUnc5a1lERmN6MkNBcXA0d1g5R1p0a1NiUnhBZUE4K0F3NmpiWU9BeGQyTlZTMDNuWFkrTWJVL3d4NDNKa1ZrWXFVRHFFcEd4cSAzWUliZ252aWRDNDJEcVZ3N2pGMlpaOXUyZStmMzhBZVgvUGdFR1NUMCtPWjBaMWpYd1pEZjN5VWtqb2p3ZXpnNm5XOVh4VjZVME9NIDlQTVE3c2hyYkErNzlhR0hEK3hxRytjbVNEWVJKcXRCZmo2Q0FQZ0VJK2Zha3hidnkzMU95SEswSmxmdTFnMGJTZEkzUkRhckFpQjYgUWxhY0UycFRCQzFKZ2VHSFQxL2c4QmZ1bnVxVFdXaFg1TUR0SUpqd0hIWUg3WUQrd0ZHWkk0M2xrZmZkcHBMRExqRzFGQU13cDNEViA4YmNzZnpsbHhpdVRDVXdJSW45SXFHS0RjQTBrWjcwWWR0VmtLUE4zNDQ1ckdqc0F0TnpNNkJhQmdJMUpzT05McThQblhSOE1tcjBpIGVjakZYdzdnbU1pSUhYN0p2Qjh3YlFjUGJFTVdzMllqMmlrdTRNK0FQK2Z0M1lPcktnOU9lc0RUelhrT3IyS2xEVlpLV3NaYnJJeE0gVDZtVStVV05ZVVd1TElIbUU5a21zbGtXQVpuMFBZQUE3Y0F6YkJieVRCbXpmc0FRVDUrb3VQN0FmcXdSTTZ3M1o4enE2MHkyU050UiBqMHIwNWE3aFNjd3pwOHArTHlLbkpmUDRMZTkzQXQycW5zbUQ1QUlVODR2S3hoZzhZZzNiRUx4LzJYejl2SHdIUkpSZHFRMjFYNzA2IHZ0Vkc4WnRZMDVRMVhqYTNqc0w1Y2txN2xldVdRZGR0Vm9hMzhPMEE3VUJzQ0ExR01Ia1YzTTV5RUNPd1A5UEFBTUVIb2pMUDJ2Z2ogYlRxVldzdFFJMTVTT0E4WTQyYzJvMmNlMFk4Z3F3cW1BZDF5b0ZsRVhmSHdzcUhjaWxyMUF5QXFSUWpMRUhJS2dyV1l0Z3dtTGRJMiBxazErR24yUmFSWkhKekhEZ2RYeXBlcFpYaHVFd3dubU81Szh0bktINEhCVDFsbVZxYldXWjRxNDNxSE9iL1VSL0Urd2NCNmZHVzBYIEJLQjM5V2xhQVZJUGxIbjllWUFLMm54TEpLQzd1QS9NVDArcTZmaDFYcUUzaUVCVDRId3lkdjFmaDk0L0YyQ0NBMkFBQVFQYnFTamsgRmNvcHJabUxuVnRaTmcyZEhzMHhhbFltV3l0NHRpaVFKUmJjSzNXdFBkd1Brd2MrQXozZHFkK1gxY1dqSXh6emRWdndENkR2NEIrUSBaaFRlTlFCbTJLeEthZUQycEJ3MVNyYTJKUndPZEhVNWtwb2xPVmMvY0h4RGNBOXFmTUJjZnJUNnlzOFhlYk05amFUNThCNEErZzgrIEJveHFqbXBSMER4U2JhYWpFSklrc2NyeU8yMGJTVGJWV2ZFYk5XUkpsU3ZhUXhxVmRrUm82eVZJOFIzVlY5eC9IL2MvbnFOa01GZnAgRlIwL1hMNVc5dEpOdFZMaGNWUHRVSlgrWTVIbDYwSHhQWCtCbUZ1WTREKzhTSC9JekJneG9Gdk94NzM3L1FVSFlQUGdJRE5PYWxJRiBxWjJiVGIzYUllQXlMY3RmZHJJUjRrT3BRTVJOUFF5RGd0cm5HdzdBdC9BWHA4Nkd6YlcwTEtNY3RFM3Nld2V4OC9zR0lCejIzYWRtIFBZdmtWbFdwWkQzckN6dml0Tmh1QVlUV3dxdVdGT3JyRndFd3hDZXlVa240YkRRQkRGbEcxbzAyait1eW5NY2QvZmdPSURGZ0FMZFQgb05rc0ZseVFNK1lFb2R0eVFkaFI2OVBQQll4ekpoUFNqQTlrVzRlR3pNR3hubDl0Qm1SaU1MM05tZU1UYnM4Yi93Q0FQK2Y2a09sMCAybWpHN05xWk54NVhEYStZTklNcG1sS0krSXVPTGRFY2EwTnVGSVV0aXVmVjZrNm1XYktLS0NERklsWklZOXVQbU9LUUVKa2NhTW1OIFdiQXUrYUNyaDQxZXVENW16Wncwd0xUNnVFcDYyMUI3WVd4WXVJaEs3SXdjbGNHUkREai9BSjJKQTlCc2dtVDVSdG05cEp0NC9McjggQXc1OGY2WkNWV2J4VUZpSjdHNUlhbG5WTGttN1lJVGJtc0NHK0FhbUxDendkZ1Q5NHJlN0ZzZUhybXRCNkY3MllNVjJnWU01czdHeiBpQ0FYd0RCdjRCZlB4cllQTUFVY2JGclJEVzlQWmxrdEdXR1BUS3ZFMC9qY2k5Y2tWUGNFSndNY3daR0FQODlmbnFzTW4rRytTOEo1IHM4SHdDQ2Zmc0FHUFVrMk1sdWRrbFY4ZkNVa3hWU3JKcHdPcWpTQzl6S0tKVnVTTUFka1phZm1yWTh3cWdlZUEzRGs3NHJyT3hwSnUgay83QituZ0c2NkRGSllVa3ZQR0VzazB1bTFDN25ob1ZpZnZvanVWbS93QU5FV2VsYVRVTThna01NY1R4eHU2RS93QUhBVElUaWhZNCBHSitPOFViNlhxTzZBNENua3hXTlBHM1laU1RmS0szQU5DbmZCNERFNVErRHpENVpGYm1FOGVuZzlQQ2Y3TW01dEZYUEt5Y1NiczN4IEJ4QWIvc0FEb3FLVlBYNVE1RFhBTm5KTi9JN1VEN2IvQU9DbjBqVll0OExDeXVvVmZtekRGa1EzREduNEtrd1BsSHJaTjVvZStGbDUgQm05a09iQSsrQSsvZEorczRhbjhjRG0wMmt1d2ZWZE1zaVZIRFpWZ1U2SFBVTzhGVU13NHZtSmluM0R1Z1l3bjRIcTREckJPejBObSBSOFVuSHRYaXZvSjVmMkQ5ZXF3OVFXWHJSWGRMV25CSTBqNUFtdGRKR0hwdGl3bCtBeEo0c1RxQ1ZZYmV2NFhaWTlqV25iNStGZ2hMIDhFSkRhRnJFYmNIL0FESmZxT0hmWmdZc1Y3MCtoZVhoYVRHUUZCV05aYlVPR25XOFFNdTl0b2tqajM1VWZHUExHQk5DVnFydXlLNVMgR01CZHgzWVZsaGEwS0hMSG5xVXRDdDBlVlU5VnZrQ1l5WEJwcFNZdEloN21EcTZSTXE4OUxRMmh3WDdVdmlobHRQc2dldDR2Zy9nOSBWMitUVjN4WnN3NTNTTjgrMy9IOUVIbjBrd0M2UHYyM01rWFJsaEVxOXJUbXluMnhXNUNRdHByUncyK0lkZjFVWWNLVFQ3VTdxZGxWIDhEYWlHakkyTnlFN3lSd2dUNkNmUDkzUUQ5MFg2anlpK0dxTFVoRWk2ZTZMMDFKT3E1Ymh2QWRXa2xwbGkyT2sxeXJzWTlQaDZmRVQgL2xuclZjVVBpaWNRZVJpdWgwK0xObWJzU25qSGdDKy9BY0FBRHI3bVhZUGxXWk1zdldSazJSWWJ2RGRxOVY3TzAwdkZZcDZhK2FoQSBJdGJjR1NHR3VBT0hUMXRWVWdBS2REcUQ4RGs5OE5td20vZ0FBQUFnN0EvSHdhU1hzZU9YVTJVV1BrNzJuMU1nNGpXZlQ5bmkzS0hkIE9JTDhHNkVmYUVqcmdnVE1rQXk3Y2tUc1ZFa2NjbUwzWFprMkl2Z1lpdXAzTHNqTGFJYzJwYzJ5TGpUNStrVWJjYUJUOWhQREZTZkQgUklHbXI0Y0dPcTRiSlpGVjh3Z3RxK2gxeStjWmZjQmF5N2hBbnVnc0NEVVhBZGdmdXExQXJVT1dXajArTFBJWTI0TXBEYmFjcS9VaiBaMXNROEQybjJJbXhlK0MzVldMNFk1Qk10UkRzR2Y4QU0zTjgwbDZlaWZDYXU3VmMrUWQvdDAvOUJZN1RxMEYwUFdHYlFkY1Z3YnJHIHFobDExUnEzSldiVzlUOStHaWtidVRySVhuR0hSQ2UrdUI5YlZueXNCN1VHeGVVTDJHbk1PMTJPS0N3WVk0Nzk3UnpBOEliYlpsZTYgUWFIaHFMSmVlbnZzTTRXUmVkTE84dG9WdFI3bHZEaEQ1Z2hvZTRKNk9CWC9BTXFMSzBVYUdZWWMvaDRTY0Q2RUFBY0JQbjkvZ0NSUyBvc21uY1RGSkpJbVBzTWNXMkoyaWV2VUNoNHkzQzBXVTgzd1NGM2lNb2U0ZzhjY2lsYXVTVzlwU2I0eXdmbXZQeHpSZkZ5SmFmYlZQIHJkZlNxK05oNGdjazdoMVJ3YUJNd1dyMGlybm5BZVlRekZEM1l5SjYzTzRmcTBCdmhPekJiUmVTeUQyUTNoc0Mvd0FCcUxmK3FveksgMHNoSWgyUXh0dGVtN0NiVlJiYkhCcUExdkxRd0xrdlZ5TCtuNDkxRThPUFpLNUFyNEhCa2VTZjBiOG9td2h3QWYvc0cvZ0xkWmxpRiBNcFhNeW1NRGFOSjVSaFRzSmVzNlh4N3VoRlV3Q2JkamhmRkQwK256SHdmODZCUjRHY3lJdlBQOTdWZDUvd0FBQkFId0hTWlE3Y2FJIEZnTW9heHJ5Q1Z2RmhnNnljQUxpUHc3Y2xOUjl0Rkh4d1pFK1l5V1FIVDVrR2V2b2RqU3lmRitUY0hTUWlUZ0FxSUFBWHdIZ01aQU4gUkxJc1FSNUViTFBLWDFFeWxlVUxDK0Iyb3dKU3VHTGNxVGx5QUZUeVFSWnlETXVtS3hnSnVSaU1lSTNqelhMRG5Gc2hkbmpqcHpHRCBGcVVqSEFobU5Qb0VsSzFMYWVKZGtWdVN0QnNERkxHTEpwUndwK3JONFR6QWNmTU9BZFFEYWNjRWJpNnVzalA2SlJzWDNZTUg1QTRDIGZSb05QdmpUN2FHU3I1UjVrVmJhYWhrU3lMZ3puQ25BNEVwWHA2cGJVc0VPdHVGVjdSOEpxdWtoUzFjR0hsbWFOelp1RTczdjRCKzUgOC9JTDlzQ1pReDlvSkY1dzkwaDFMY3l2TUpNTmdIa250azRWeWgxa2VLR0IvYmVIVytwQmNYM0JxUTArbG5pR01zeFhLTER6Z2J3OCAvait2bi9kNVZHbDNSRnBld3JrMTZrcmo3M05hVFljZ1BZVmJDVERtNU84VnliK1NMYTI0UHUzaHpsTEw3YmozZkdDNnUvWkhiL1Y3IHdDRDU5Z2hqMjVOYXFSeGhKUHA1NWIxSmVPWjVJaEdRcGFhZVZKRUVBYVZIaWlyY2pveVVTcmpsTERweTh0dWR3Q0psOVNDTUdQYlIgeXJQRzE1TlJTUnZhY2d2Rm0zY1FPa2I4WmxWaUVkc3RxcmV3ZzZxWXI4U0hBcHE5WXd2aDZmRGZOblpDSDhndnZrRXd6RTFjb01GZyB6ZjhBWUFDL3YvNzkxeDdReTVSaXd0NUdrc21yK0FOaXZrdzJpd29aUTh2N290ajNCd1Q3VWgxdFg2Mmp0bytBY2hzNU1YdGhQSHdnIFErZzhCeHczL29FMUVOckFoMllCbE5GaE10a1pSaGtYcklMekdpaG4xWGkyeGJSVlBzQ1p2RlZvYjR2b2xqTnZ3SGlHekRDbmpOazcgbzFYaWYvRVI4QUJQOUJKQ3lHaE5yZjVXenlTU3ZhYnMxMlFlVDJnVERGaS91UWNoRHJkd1pGdGI4NDJrTjk1TVRLRkNiejV0SjMvMiBQZ0Qrd2RDSTJSa25kNWk4cUs3RVNVRCtCN2Z0NTUrYjZ0bWJaTVpDQVIxU2hLa0dSVzl5Uy9Vdkh0N1V4N3ZPVjlScXZaajVYendrIFQ2SGFuWVBBVDR6Rlc5cUxhZXc0eTNMaTlqSjlmekU5RHArSC9xTlphZWVCb1MwTTNUYzlrU1hZR2dnRUkrQXFQd0IrWVlKZ092dFcgbHpYSlBxdU1oNXVjTmxyN0pNOHhGUE1NVHlITUtnTUlpMnY0SEVPMExhZ3cxbXpVTlhXVmtIVndRMmNQZ0g4K0FBZTUvcTNWNGFiMCBkalpIWkg1c3QycGxVK0VYaDZIWjJsOXNtUlNqWktQVlhYN0p3TndwK3R4OHdIM0FQY2tHZTMrV0p2OEE4K1B2ejl3RHBWMVdoMS9xIENzZ0NaaTF2R3JkSUcxdXZjdzFVU0N4aFhjcTl1U3VVT3dKaGd4dkVOd1E5aHA5OGVGc1hScjV1ZStCS1NPUEhhSS93Ris4LzB3dkEgMmN3a1E3K084NlJZWVlFWVdNMnl2SnE1WEd2bStGcXJSK2tSU0pXQS9BSUFQd1B3T3JLYVY5QXRKNmlSVjEyS3VsM0ZmclhNMUUyYSBGcDZJb0s5dWFtUS9xcklaNlFXSVAwK20wYXBzUStCSlNCcENTWUE1MkJUSUFzWlRBUmx0aEVhVHlHV0MzcytkVU16TGFwMmdUellpIEpRei9BQkZiMUgvU2JCbExmV2JiUTdFTGpad1FMR2grdGxFVXNXVXE4bFN3TWFEbEozb0tDOGtrVWxaQ3psWkxUNjF0cWpHVUJPenEgMUZLb00xa0FBbkNyUEhOWkd2UFBKOEg4ZFVaYkpPUG45LzhBODZPMlV3aHU0dXlLbFo4bXBjNWtQYWgzZW43aGNiWUxtSXVxRFQyViBpdzZ2V3JzVHpFTU9RY0FmSDN5OEh5ekdZcGFGWmpPNlZvcEtQN24rN3Y3OTB3dE5hL1FkOFNHUnR1U3liYXM3V3Zha1pocGVraHF1IHBvY3EwSlo2bTA4Zk1yZmtqSkRJR0s1c3MvMmRoazBZbzBQU3lETkpBUUdmd2ZqKy93Q3dIK3E2MCtybzlsbGJhZkFLZU5KWnNNbGQgMGgyeWEvZDRaU3hyWWFJdGtXQk1mRVFQYWdjaERndmxvS1NQeVptVjFkNXQ5SHd0SUk4QUg0QnY1OC9nQVB6MlpXZG9PUy9ScFJEeSBYL1VzQmFxQlliZ3NPeVZhSkw3alVOYlZYdzlvaHJlQmhEWDAreGdIYVZWTWJZcnRCTVo1dmZBQi93QStBK2dnQVdHVXBIREJxNWtDIFBIZzIzdStKWXBUcDJYNmJVZW5xZG9MSVFZNk1ZSldTcUJOTklrdFRhU0ExV2NEY3htd0tZZ3J6SWxIYmV1ekp1MXN1Sml0MDlrZkEgZGU2Ym5Hd3RucUFEYU5zTkJJQ3JGbHNvVXJKRGltQ0VOOG1KNWlFUDJPQllBR0NIWmhhdnlZbjJ1MlE1d0hZUDM4QUFLYmt1alRJNyBnejkwWmQxcmpnR2g2b1pTUllTaHAzMHpQWUdUVkNIRnhnVlduM3VoWHd0NHd3WjZCWlFKT3Arek1hYkd2R0Ryamc4NEg4R0RGZ3dmIDBGOUNzd2ZhbGpTSzlReGJLTUd1N2hhSW13RlprSDJGVzZHZWJISW9oajA0T1lROTRzQ3R6aUh4S2N0a3hqNVYrQk00RTFEdTIvN0Igd0Uvdi91SDZkNDkwSkZkdXlhS0pEVWxjTWR2U0Y1SjVDczF2Z2R4Z1pWcTg4WkU5YnRSYVgzeXh1UHRweGIyeG9hRVpHZVRZTTN2NCBBQ0FQZ09BOUZCcG9vY2xpV0dEY3VlZUdDbGVIVnp5U1M2Z2dEK0xQSkYrN1Bic1k0MTBEek0xUk9yenVPTng1QjJvb1VSUnF1MmNZIDRvd3FLdVI4RThYUVhzakx1ak5GalhLVk1iUUxSWkNTV1g4VEJCZURnUU9vVUNMRDJndG1QaGgzQWVZQnFUQWVSZzYxV1l0bzR5ZDkgN1J3QVB6OSt3QU5nZjBPazMrOHlyaGIrbGFoMUl3aDZld25NRHhjZXd2bU1xa2UwcmhoeEJsdUJQV3g5V1VmWmR3SGxXdHlaTm9WOSBQSXc1aHNoeDlBZlFUL0grakRWb3dXZnB6bVcwQnlpU1JYcmFIa3U2UE0wOXZDUW42ZzR0RFZmZkhiKzdLM01jayt5STlhV0FBT09EIE5VQ0h1WXc0YnRGSkJ2eDgrZy92K3dWUU9NbXZoU2x0V2p4b2NJMU0xcGNGWGFlMDhEa3I4dFBwczgyVTJlY0dCa3ArMUh4UHJjZmogenhnYmVON1kwUGUySTkyRzBuRGo3OGYvQU52bjdsbG1uUUNGWVhoYmxaTDNZRjBqWTdrcXlLQklzalV1QlNDVGJ4YXhaWG9URkNyRSBNWmc2YkVLdFczdVQrcHN2YW1XTTRqYzRTU1RFc01pTWhjL2ZtVzBUN01UN2tYS1RKUTIxOU55N0FoaldDa1RGWElkc09TdlpCQmtmIFdTdDhKZzhONC9nOWtEQ2JUVjdOMnJOcEdILy9BSHo5cUVjcGFqSmNGYjJXSDFVTGJyYUY4YVMyRXhZVndYQi9OSzRrQ3J3eU1OOG8gZFBUNWpBNGI4dm5rZmt5TVZhQm41Uk9XaWNmbjRBZndBSDhmWWJPTkZidTdnU1RjcTJrbTVzcXR5VHZaRGhaRGh5UURTTjg2Z21odyBJT0VPcTBNdytNR0Z4ZHdMTDVKV2FNMGJtemJJa25QQWJCc0FBL3Y2OXJKTElRSmxNaHV6THRmemJEd2JNRnV2Vi84QW8yelh4RFErIE51RnFMYmd0a0puNVFnVld5TE5sdEF0R1dUbU85KzU4L3dBKzVCNTRaQXMwYmwwUm53S016cm5sbVZBTld0WTRuaXpkamtWeXlOZGkgU04xZHp1T3F4U0kyM1ZtbUxKVFplVm9aRDUrVHdTVExrRGxLL1pBOU53d2lldUVwS204R0VOUGJIQlhzYTJGZE5aQjVqamNQVDJuMSBlRzM2d0I0T1lVWmhiUVRadjJUa0gvWU9BOWFnYWV2MjBjQTVxRzdHeVRKQytXNEJ6RmtOa3dYRjU0VWNDRElub2tPMUE0K1o1RDJXIDZ6WnZ5WU13U1Fqc0QvN0MvQUg3b2pmSzNiTjB1V3kyMWtmM1lOcGlrc09sYk9yMjhGN3RLNUx5YTVjZmhvYTR0dmlHbmgwY0N3S1UgRmtaZUw4R1dRbk5qZXdQeDlCUWNEL2dKNEdubER5bWVpejRkWFdkWHlIR2lXQUJaQ0JhWVVzWVRYTmpRMkF6RG1LRU13NE1pT2hwLyBjVVBXYk5hSGFCRzN1N0tUQi8yRFlBQjgrcFZWSTIxRCtuR3psMjhOc3pyaFErM1BheVBOTG1XSEMwQVl5K292eHRPajVBVkp3THBIICt5NzdqVFhRNEZkTDA1Ujk0QzF1bWRWL01BbWwyMGJhdHF3ayt0OGxYTFRBTGt3ODhRK1lmY0dTcXgvM3l2N2FPSWYxZERKdkp3SWEgM3crL1liQXY4K3hYNEdqekRaUTk2TGQvVHlRUWxhcmhHaUVESjZNcHJaNzVmS0Z2WjVoaE9aSmcrR3FvZGdLVkgycHhubEROd2Y4QSB2NER3QjlmMkUvWkE0bjB2UVRneUpEdTRXamJTbFVxbExIMkZmQ09rR0JhYWtQbHlMYTh5SjhOOFFvYStZVlo3QXBIQS9KdFJuMmJlIDNhcmppRGJ1L3dESDBFK0E2b3JxTTFHR0lvTkR5VTJ3bHM5YUJnS0pzZ0NrMWVrV1BGN2V5Z05rT0V4d0RtVnN3UDJPeTA4ZmhWYXkgekMvY241c0phZ0R3SEFmWStmTldrbEQ0aW5lTXhzNDVMeVBXMEs0cThYK1Qvd0JPaTJZb1gzZ0gya3J0ZDhzQ2NSd2NSN3Evd2pucCAyVW1EWHdMSlQ2bUdwa2JaRXBWc2lYcDNRNWlPdzc5SzFZSnNwa0h3ay9raGd3UGh0WUZQNHJESmsxZjh2Z2dnUTNqL0FQMEZBd2JWIG1BNWhsMFNUMWZYQmFFTTg3TnNTMEdySkhzTXo1VVFwdzloWTdIcCtIeHRnNHIvUDF5bnJLenFNS2JtZDdvODRBWWJBZ24wSFlENlQgWkdSODFCU09XdTlwM1pRelJ4dFRzQnFXcW5wemRLNUxKc1ZrdEI4RDhrcmN5d0dOaDRrOE1nemk2dmoyT0NmMUJ2OEF3RitBZS9TeCBaSWRxR2tQVEhxSFRlU0pMSGFaSmhhRS9KanU3Z0xUUkxSVjVod0Q4d0RtQXc4TThBUjZIY2N4bXQ4cHhqZmNVbEplTmdmajl1bjkvIFBkSGhMcUpaSncvOUdSVjBicEVkNTJDQkVtelJwSXJwc1dpZGJKYk1OUzBsMlJJMlNzOXl1OGRra2VQUFl4RFZsbFRjZmIxZGNmYUQgUStBNzN5bHgydEZ3WTVnUmVxZTdPNkdGa1ZMMjkwbHhSREI5UG1MZGtEN0lybWVuMlgzSTR5ci9BSk1CMmlFZGtibng5K1A4K2Z1diBxV1BvUEtxdThyejFZWE5HaEhrT2lva2V0NmxnUzJSOFBPNHQ4Y09IcDhOOGhwOWdHUGdNQ2x2Q01zbEVPczhLcmRnbFhQQjkrLzhBIGMvMGdXdzR0TkR3dHRzcHdmN21QT0Rhd21MZ1ZYQklRNHZjSk5Bdm41Z1c1bHdCeUNHQ2dMN2E4SWJ5VFE5c1JxckNoT2NMNzh3UHcgRDkvWUJzd0QwdjFMcUF6cmFLRFpKS3I1amJFTVdjTlYzZUcrSGwrSytQamduc2RiMlI0LzUyNEtmSkZrWUxmYk04STdKUDhBVCtJQSAvc0IvckswTWVwVEVMdHVadDVkdnNkT0Z0ZE15amIwM3h1RklUdTltUUFRZFBFN3dzNGQ3elFxZ1l4UEc4YjRZeU9rY3N0M1JJVmloIEhKQk45cnlkS0x5enhnRG1xOW5QN1V4Mm9TZDZmYWdOVHJ6SlhOalMxZUxhWStZdG1LM21QbG9jcXRxbjdMZUlUeU1WOGRRb3c1OUogQjcrQS9RQjRBRG1LYTNocHpvZDNudXdUbm1jRXdhR1NHSHMyWll3dHNsRklYekE3SWh6RTlQaDF5QVFJQ3IrNkMzbjgyQkhhOExkUSBUK3dJSURmd0YwakJSZ1k3QWhya2FpQnBLdWJDMDhZV0JROUVVK3doaFl2VGdodmhnZ3lkN0pqaER3TWUyb0JFK1lUdkxnWk1sN2d3IG5BZlAvd0NXT0FISWVBOVgxZVlBb2NNMlNTTUdTbkJ6VStXRFdSaHlBMVBVb3Q4bm1GdUd0M1pqdyt1UU5QOEF6MlRqUEExblkvOEEgcDRBQnYvQWVqM0ZFaWlRUEp0dWpxMGE1STFHaUZleGQ4V2NlRDhjOFcwZTFXMjFQSm5VTzNMRmp0eXlSOHhTb3UyVGhaSWFUSUdqaSBFRE5YczRMYkR4VEd5eDZyR0doa3BjRTdDbnIvQU14OGlsbGNweUJiTTh3c2dQQWgvUFlJQVB0bndQakl3SGliMk0vd0UvOEE1Yi9HIDVsa1RISzFLWmFDaVRHUElhU3lLYlROSmFtQ3ljcjZjM2NYS21FUTkyVEdSODNCd1ZhMHI5OFIwUGExZXIyYXMzZzFodm5nUG9PL2cgT25rUEIyZTBHSEJjelhZSm5kMUVEOHdBVS81Z3NXdzFLcnpCOE1PdGx3NWo3eFV2MVdrMWtZVTRON0crMXh6ei9nTWVRZFYxRnc2YiBWNnZzNHpsWGxmMlNlc2xrckxoTmhCMkprVjlMOWhMQlJrWUE3NnRsNWllUGgvQVA2ZWNETE1URm9aTlpPNDRPeHpnSDlQNy9BTEE1IGdzaXlxam9qeXBncXBQVjJBU1Nkdmtna1VLRjM1SFNvMytubDAwMGczRWdmTW04SzVYZ21tOTFmN1Y0TjlTUjJpLzRwYll6cTEwUjEgNzI5cXE4bjVlcThsUUlhemZsSVlsb1RFTmdzZHdUNnJZN0l3bUExTmc3Y0xkbVBPSEdXYkdyc0VrSFVRQUFBL1ZmUGdJZHdUMndDKyBKKy9XUVNobEU0bExhS0JzZ2c3aDAwK0pUV2lHd0xjTVBqWkVNZ3ljUytBcTQ3WVVLTTN1azgzMzhCdjRBL3YvQUVTVk5mbFFWN1M5IDJHYkxmQnJoZnVkVjFaVlBwMXA5ZlNXUUNCaUFYS0h3OThaQTh3d1BzaHFRM0RUUzhCMW16VU44WnNRWnNHYnd3NEN2Z1FGKzhCNjYgOVRHWmFqNVI5ZTJNcjFqb25UdzF3VmRaMVAzeFJ0RDhrUEhwY1dyMDlmdFJrMU9URnVFd1lUcDdnQTQyejhudVQ5ZkNITmd0N253QSBBQVA5TDBjaWlZcTZmM21NdkVaNVVpSmJjaTA4b1paSlpvZDNITXFRbzdlMGtqTVUzVVJ1Z0VxUzdWN014V0pjTDhrUjNrMVJwWjIxIHJzdHZPWEFodUVld1NDcXVGSEJ0czZma3NnbXQ5bmtPNGVyN1FpWHlVbWNQcXN3NElhMndKNnJxSEh6M2dPVEdQbjJaSE5PM2dQOEEgWUw5djU5KzFQbUxiazRQbFNxOU1rbVV5SGpGbmdrK1BFTjlwRnpZVU9tNlQvbkszaG1HUDNWVkpnVVp5NE1zMFlVR1dZOEpGb3BQQSBRTDhBUG5rQUF3SDAwZlQzQkRpSHRSaWJZVWFaeFYvN1BMZDhjc3F0TmNwZG9YSWhzREd5VldZRVdxd1E1MjNua2ExRVluL1RPeVZjIEVSMEUrZzdBZkFQejhBYkxoUm1tc0RYYTJkTTZoRnRiMVN0Visyd2tHTks1aHN1eStFS2hvdE5vWkdFM21DNW51QSsySzNPT0NPbkwgUEEzdmt4MUtkWFo0WHdDRnY2K0JYOWdOcFltZGNkUTd6YWgwU1RDdFJ1NUQxU2JLYldkS0FMZThmMXl0VWtqQlVSb0Vob1JxaWxhaiBOWXFUM1hqandhRjJlQjBqcXJNRUxRQnRWWG5zNTJkcCtRTjNDamNsZnNKa2xGR0dWYlRnNFRMc0R1Q2ZaRmdNaXFCSEh2aHM2eHp3IFlNODNkaU9BeFA3QWZQbit1TTZMbVZwbGtvc0RKa3d5QTAzWnRma3M1Z0xROStyMnhrTU9RZkdUdXBWYTN2RUY4VCtLdy9xNnVzak4gNzkvNkJmai9BT21QV21aUitXR0laMG9XN3lUMERPMm15RHpKeE9ZaHlsNXljbHRmRHVBZDhUdzlnVEFhR3d3SGpEZ3pRMGJZRE43NSArL2dQZjMyQ0hrVEJaNjNLOVBMZ0JKcjB5cXJnbEhKTGJSRWh4UmUxeWs3NGZkU0crY3dUK1dyNzVPMndaOUcvek5nL2YvNTgyTEJTIG9VSFJzQXFtejd6VzJoNFB2N3FJOFk4Z2tub1ZpakR4R1JjTlFqaVIyc3NWalFETnFBRjFrT0w1dnBuVlF3RkRKUnZIaTg4a25IZysgMHRDVFZZOUkvaU1sV0ZkMjhNQ0dIdFNuOU1RZXZ6RTdiME91VTk1V2JrYUt6Mk0ya3V5T0ErZ3IrLzhBVVlsdkFobzA4T0M1bVEzNiAybWY4VUJsek9rNEdFN1Q3TXFZVW52N0pDMHh2a1M0SEZ3blR4NEUzN3JOTnF3d2xpRnh4eEFBUUdPQURBQUF4VmpJMjAzWHkvREtBIFZXL2lWWERWS1dITUJ4OFN0NHZ5OVFUUW51RXhrUXc3SVlZREVFQ25WbzFCaWZLRVBuS09iZGdtL3Z5RC9xNzc0WHZ3MVI1ZXV1MHcgOXh3TkZGQkFxSHBxdjZuRDR6VE5aVEpOWVY4QnJrTS8yUGRpSGFreGpYOEFhQ3YzUzBwNnlqcTVSM3JNM2dFcThIampzQjdGZ3h4NiBBeXdpUUZOTmFSK3F1b0VHei9IWHVUVVNRWnlTRnUrUkhhc1Z5UmVDeE1sTEMzMVc0YWppNU80STRFKzY3WDJaVlFIZmtSYTF6NTVVIHVZQm4rMWRHS1RoaUJja2x0TDJBdGpXQ3ZVOG81Q1l0b0dGNFBWYWNZVDdVWDRid2V2Q2ZPbURQZFhKdk95SkpzR2c5b241K0FYNTEgWnpWSmNrZDhtVzFiUW9hNnZqSFVwdkJmckdHcnhIQ3VhNVhxbHEvYnpBY095VStYSHcyb0N3UGlyRGVYbERLZWM4MmNQZ0g0L3NIMCBEclNqeHc5R1dqVExsbTV6YWh4Y2tIcUVNMUpEWDVhMmhBWmFhMElhK25oMXNPWTdYekoxdEo3NU9XN3lyTlhWOXpxdnNtN0EwRStBIHQxQTMvZjhBcHdQRk4yUW12RjVCV2hiRzFLbUhrQXFydmxlMS9ZUmc5L1huSHZocCtFTXo4dzQyc0VCVlpIbG1GOG1KK0VObkxkWUQgK0cvN0IxRlJXbnpadHlIWkN4aWFXdlRuSTNrVTRIenR4MmYwQlE2aFpvNDJUQjRuRTByRldGWXlMdDdianplRnRZNHZJV1JYU0JGMyBBRG4zUlVwcWdnOGF2U2JJdDFrWXBrOUdYcTNmRDBUVXZYTXo0ZmJkOE1VbVBNY3VIMlhhZ2Nad05YSjRBOTc1dy9jZmZ2dndEb2IwIDkyUTBQbDRMZWFCb0c5WERVak1kckMwLzVOTTB1dlROUG9GM1BPY01oTXVCUFpMVW1PRXdIUzFYMXBzL2ZMRlgxTTZlbmpCMjgvdi8gQUlBQ0EyQmtOaFJrcmxQdHJacmdXNFI2Wi9ETHFRcVYycTlJcmRYUGQ3dVh1RDQ0VnVuM3hDSU9FRlNZSjZPWVJiTWFGZjhBS2Y4QSBmd0dMOWpzSEFUOENsdEQ0VXR5WnFscVZ3dlV3eGgwaXdyUXRRT0hiREZqUGhaN2lyYkJNbUdHUndtWEFoMk1Rci9ZOGVNdEhHZDh4IHBRSjRBQXY3Ky9iQjFuTUc1RkdHTGw1RU1LVFpZZlU0eXVtMU5JQTJHN0dJcFVhbnczSFNtOXpOQlZaeXQyN1BMS1kxQVdPRjFoZVcgTmtXMi93Q1c2c0xGMnBzWTBiY1VGblVTMDUxM1E3V3RyVGdydkNUZkxnaXRTbHFodmpVSlVGMEtyNkNBcU9aY0lacEUwWGVLd2tOMiBWaGQ4NnpDQWV4ODBmTVluWVRQaGxEekUxeThjR2N0blhsVjYxMUNzeWV6TlFIUjBwNmc1a3F3clh5Vzl6RkJheXV5ZU5jL1JhcnJtIG0xdG1mREE1dUlGamVSL2p4amtjcElMZjRqWXRuMTUrOWNmRE1idlhJa1owWTA2Z0FEVlRBQ2dCeHdCaC93RHJuL2Y4Y3d0cVFhYlIgd2dnOGo4SHNzWFg2ODErZngwN0ZlMUtUdEJMTUVLdlBhaDZaeXROOXRPK29Ca0R1R25CYjFHVnpUajIrVEtmVDhYQ3EwS3ErMisvRSBFT3Exc29URnZtcXNtY3E0SndoZ0FIMEUvd0ErMzlCc1cyV3hJcCt6TENGMVZiVW1rMGhrVWtnZk1aSy9zTzdiUWkzR0JpaDZ2cDk4IHZpdGd4Z2hEVlFOZjJXcXpGa20wVmYyemVMUkNCS3JmbjZvWDc2RHNHQ3hIeU15cWhqVTBUeVNUVmF2V0FSZVgyUnFWNjloNmdxdlMgTEd0QmJ0QndyZGJoMVhNSU1pTythZjhBVXR4dG14RjJnc3MzYTVKTm5QMy9BR0JCQVlyN0lxZEwxTVQ0YWZvOHU1MlFMSWQzQzdDeSBPNHpCNVlPZHRDbk5SZ0hDdjk0VzMyYml3ZkJnVisrS3JJczFtcnRHbnF6UDdGei9BR0JCZnVmWTlORVdEZjNpUkdRYW1ONDNRUkRaIDg3UllSeFJneHc5MlVqRW1tRktLTnFWNUNqdEUrRHJwbFVJWVJMdStwQkZTc2RQUGpJTjNKSTZYY0lJeTdiQ2xmSkN1N2krWldEV00gYTFMTEpFaTFnWFluNURZWVRRT0pSb21Edm1ZMXZWWmdoREJxUkhsUzM0dTBHWkc5emVHSjgrQTMvZjhBcHdBOHlsNHFmcW9velZlUyBiVHhubTFzTCtudEpEaVE5Y25sNG81VEhDR1lXOW5Ec0MzQlV2T1ZXTDVSdVl6dGRzbXdmdisvOEJ3cnFjT1E3R3BldldoY2RxbEFuIGdRUmhxOWtwOTRsc2l1ZXB4OFBLRGhTY1N0NGN6aDYyY3FYbHNGT1pmeGV6TXh3Sit3UHdEWUg3a0Q5MVBiaEhEVjNjRUFOWnovbnkgbXFyaTFrVlhYc2hUdUN4bGQzaXhRNDZIMmZXM0FPUE1RWUU5dFZYQ3pCbjV5UnRrcTUyNC93QzU4L2g1OEFtSFRxWTYzSnMvcVpHViA5ejJTUXl0RkpFeWxlK05xUm5GcGx3UHRzdmZVc29ZbEVYY2hWbmhRWTNIS2ZTY3Z6ZDA5REhqbm5xQnIram5qVU93cCtuMFhrSURnIEdaQnJ4WkJpMUxvYlBsUlY1WHRCUEhwNWh3TXc3VFQrNmtEbmh6akl5cnhmYlA4QXJiWU5nZmo2RDBtV0JUdlMwRXVzUmxsMnAzZ1MgRWxiVTJDc1dRd1doMk5hQzgwSzhNaE1EaC92Zy9uRGFuMHRoVzltYnBnakV6Z1B6bkFmZnovVHJaTktpM2QweER0WFRRbjJRSEZwOSBKMkU0V29ra0N4Z0NlZDVRR0d3VExzUTA4UGlROXF6VDYwbkIwWVlyODVaL051MkIvZ0lEd0huMkhJZkpqazRBYkJudXdSa2xEV1JJIHJiaFJDdkpsY2dXSFNxTFQxOFBNNDJ0bVhCa2FsSzBPS3pIa256emt5T0VTY0FlL256L0FUL1QwZVdUYjFDTWpvRWxkWGQ5cWVQSGEgc0RUMCtlZkg5VmNjUjdzdU1iTEdkM000VEhDdUJKQnFhQkIvd1piWC9iYy9kZEIrWTBIYkJLVS9QZ2FkUG1CVnZTN0VwOWJyMWZTTiBxVjBoRVRZVEErVS9ka3hEV3gvenJMVC9BSno0TXN4b2FCbjNibTJCL3dEWVAxQWRiYkllS3JxKzBOTHMvUys3MlFlZkRDa1dqMnBlIFZrUkxJeDArcWQ4U2c2ZVlobUszVHpIekZYK1JWVU5tUmltQ3lzK0U4QnYvQUQ0K2UyRHBobzlrR0xCaG9kTjF5bnlWdVZVdGtYSFogQkp3M1l4U01xSW15dVBzZ2d3aHNuSUZ0NG44dE9NaE5IOXVUQTk3ZGdld0lPR0FBQXdIOGE2c21GWHREQVNxcVZZU1NOYVBqTzd3SCBpT0h3NVFGSWFKUmdneU9DM0RoekY4eFl6NDROclh0aFFadG14L2QrZW4rZmZ2NERxRVlraVpMaDBxUnJKejc4dmFmSGFCZ2I5M245IGROa1hNcXNKeW1uZVI0ejQyNjI4aFhPUk5pamExVjErTElyN1JaanVEQTJXNVhOMmZxQzhsdXdsOXdzSndyMjkyamFiR3RCUHEvdnggVzVoRHJkZ2h6a05QZkp6SldWR3RGb0xLelIzTnQ4WDM1QmZnSDkvVWh5T3lHV2dEVlJSRUd1RnF6RzFUYVNWU3A2OURzWUNKbEFRLyBKT0gyUW5wNDk3c2F5bC9Hblh5c2hndnRtVDN0MmQwZjJQOEFud0FCQlB6eTNWY2h5SHAvUExPbFBqYmtvQWxHemlUUkwzN0VTQlF6IEhHelBkU0doa0E4NDh2cVd6bzNBOFJteC93Q2xmUHRnUWVmZEtwd3A0SFRicG5HZjhadEcwUFdOT1d3OEpOUGgrZUs5aktkamNrWCsgU09GVjJRWUlCKzVZODkrck1MUXhqTlZaditnZWZJTEIrL24xTEV4alpyaEVoZHBZMGg4R1RzVkdaci9veHJHZzQ3elp0ZkhSU1NxVyA3TzlCN1g4WmVMN2Vhci9VL3dEbnF3RElRYktnek1rWGNpclpGZWl5ZjR2K1dyeERBRVcyV2dWRGtPWVdwRG1yaStZUjFLOEtINWg1IFJvc3o4WFk5cTdkUVg3OS8zOCtOUjdvajFBUU1HY293N0tyZFpGYmllN1Ewd3cxWGFBdGVUYkdXMSt0MXUrSmxQc2pCTU9WTFgwK2MgWUdlSzg0a3BMc2NBUCtEOGdnRC9BRVNLZG1ObFFUSVl1VmNCSjIwMG5pUWxIQTJFMFhFNE9kWGlkUmpraGoxdStIQ2syUjhYME01VSBwRHVvWVp5ZjNtalRxVDRNK0F4eEFjKzM4K3NjeXQ2alhPWVlaVlAxZGtzYVN0eEdqT3M0T2tCeGNYN1FIc0I4VURDZVlReDhPQ2VYIDMxSHJmNzUyeTN3STdmZmdBRGdKOEF3SUo5MGtrUWlETVhqMmswOVNaN3U4Si9wcm5na1VDUk10L3ZSSUpxMjB5ZGNsNm9hYWVhZUwgUlFSSkxxWk5TWTFoRzFER3p4UXZJaXliMHFSdm5nd1V0TEh0OXhHNWRCbkxiUUhNMkJxdXN0MzFMcE5rV3JuUDRtd0VtSFpBaDhBMiBna0FhYlpCOUpvU0ZUNGN3UFd3YmJhRjB3bkN6TjBxOVplWGlyamlUL1gzL0FPbWxrTUE5WHcrazZSdC9KcTZ1TGVoc2t1dDk0NURUIDlYcHR4dmtWOHNENWxrVFdXdDhXTTQya09LN1lNRjg1Smd6YnNiOW41QlArZjZHd0g4UGVheXc3UW8wYlcrSlNzZFBDOXF3QTIxWUMgUUhBRkZQNG9kZjhBMmZaNmZUKzVkZ1h4WTB3cFdTR3JpeVp6MzJNL3Y0QUIxaVBUNGNOcC93Qkplb0l6WHFrcWFSdFN0a2NnRDBuYiBEWVkxTGQyTHVGMXZZSDVJdXpUZWhyOE00QjU1WEtmem1yMWVzM280RUNHL1BzR3diK2cxRmhrV1dEWVRWeHk3YVRscG9BZFB0eVRZIDZZWnd2b3pMdVMzOU10UnlHSGMzRGkzcG0zdnB0U3NyNlF4b1pvc1lwZHVlS1pGd3JCbGxoYVNOOCs2d3JkbVBrMzAybVJvc1RROUQgMUlhTGFXQTFMWWJiZGthbkVkcXM0ZXdwOW9jc0tSWm5HN1VEN3hENEhCVWh6NHFoeWF5clVQWmd6WktUTm16NzhnVzZBOEFBNmFqUiBYOHhvZUZ1dVdsVlhFK3k2SFNidXNpMUUrcDBpcSs0Mm51cjN4d1lHUmtUMlJQV3lEZ0RiVTlEZ3pFWVloaStjdkR0MnUzOC85ZlA5IFUvTVIyUnR6RHR0SkMzSkF3SzlrcEVjdzdKNWJoc1ZpVjFlR1ByZW4wTmtoaDJBeFZmTUlDTk1KakdsOC9aRFpzRy9lNTgrQXcrdm0gMFBzbXJ1Q3FCU0dTMHEzU0QxU3J4QUVTWDJ3eWZ0Qzd0VlZOR040ZkREZzRUZkI4d3NvNURyTVlVcTltV2VFN0ljQWJCK2gveit2YiBVTklZbFNIeTBnUlA1SklZdE5Hem5rVm5WZ2M0QzF0cnZwQ1NNU1N4dXFDK0JVYTkwYWNEbmJrVkhzK2NjYUYyQ1JiekJhbE1yR0s3IDNBYnIxY0cxeE1yNGxEajhsS1BuM3o4YmRrM0ZQbWZNT1Q2UDd4R0NXUEtQMStrbk5nQWMrQWZ2NjlLSStaRmtHR2poOWJwTklyYVMgMjBka21LZkxUTGtxV1pZd0dHdmh3OWtHRU53SUdKeDdscXJpTVpud3B3Ym0xWFk0NGdENkR6NEJ2NEN4VHdRS2FMZFJGQXhTbGhWZCBxaHNHWlRkaFdBSHF0WFhrTW81UkNsalEwOWNzaEV1Q3lESTU4T054QThqcDR4NSs4akFaczJiQitBeDhCc0IrSGp2ajVkME81a090IEtUR25oVjVEYkQxRU5US254RU5XaXhKVDRISDJwM0ltTW5jQ25vTmx1R25pcStETTFYb2J5ODFVa2hPY0gwRzNRSFBnQURIcFova2oga1h1U1RheE9VcUU3bGcveHlSM2pRUGRkM3dGbzVNalpuV1ZaRGN6UG5KeFdJTkZSWHo3VzU0L05mbUJyK1FIclNZSGxIbHV5RU1wWCByc1dYeVI1WEVoK0dsdjVOd21KOHlZWWg4OGVIeHdQZk1KMUJWNVRjNlBDSkpzNGZBUDJDL2kvQUQvWEhiQ2Rjamt0MC9RN2tTcFBPIERJZzFoYUE0MGpYcG1LMENYeG9tTDRjd0hjSHlHNEIvbjh0VlZzbWpWZVZSaGh3SWIvWUQvd0Ird1h6NEFQeTcwUzF4Zmg4M1pEU0cgbTJIMjkrR0JNTU13OUtZVTFYM0FPdGh3OHd3bm1FYmNGSTR1SXp5MGJtOG5IWko1ei9YNzgvSDkvUHlSZ1VqbEE5blNtaDJTVHk1biBSbmdnK0twQmhjSkxsUTNNbHR3L25FOWtoc0FleHA2K0JSNWl5c2JvTUdmc1p6M1lBRDl5RDlWSkZGTnFCcUpmNkVyR05QUHFiTFFGIDh2OEE2VThpNDQvY1RmRkdOTkl1am0wa2NhQ0dWRWpkVUdGeGlXS2JFK2JHNURHd1BHSVVqbkt3SG8rbi9TZmJUWkVvY29IRzV6NHQga21FT1N6aDd2VzVScDM2dWY2dzVKTVpYRG5BRzhLenF0YkpqQmRYN1o3T3h2d0NDZitnbnovVE9SeCtrK2dyZ1NZcms3ZjRJWWEvdCBpL2Ftb3JUUFNPMWkrMHRvSi9NRnRENGVIVDRZTjhUM3dITUpyTm9JanlqV29rLytQMUZqZ2Z3UHI5Rlh5UlFkQlhZQlBCaVQvcWNUIEllbml2U0dTSFY0aklCaWxwUjRPNFEvdUJnT3Z3MnJtRmFUVENLVEY5M3hpT2JkcXVCbi9BTy9ud0h0ZDZxR0FYWU5acW91cGF4ak8gMWFOVmtiaG5Xb3YyYmNGeUhpem1VWkhDWUhwKzRId093SWJWcGFYd1BrM2txTFdYbnZaYUlUajUvWU5nUDlvdXRVa2psbVJwMGtTUiBJM1lSZHUzZVZMRWJiYXZuSTAyZEx3dVBPZEkyREE3U1pwaG5GSU54TytTR0pjaDJaVm1XK1BCL3hXS3UyWURxODgrYWRUTDRxamFsIHBza3QwaWp2bHpTSWtPeGp5blhOakljOWJyZTFMVE1CeDhPZFpkZ2JITUo0RkZjWWpnK0VtOS9RUUhQajZEYnI4QWdhbnFPcTlPZXAgUWJTeWFra3RZQ3VTSldFTzA5cDhlMkEvQTdOaXVWcUQxdW56RVRqZGdWdjJsY0h5dVh6a3hRWHRteVlmcWY4QVA3QjAvU09abzVUUSBtcFJXWjVtb2F5TlRXYzMxbFcrbXV2WEZlbWdVMVQ5UEl3RGhneVBUSXQ0VEpzREY4SWMzUm1qQjZSdDZDT3FPd1l2d0RuNS9ERHF1IEZ1QjZmcXBMZHVPZ2VObVE3djhBemllNE1FeG9GN1dlTU1DZjh4UGhodDRlTVU5U3JrTVRXZDA5M2paRGV3WWUzMzdnQUMxWlh5b00gTVhaQ3hYQ1FZMXlqMjJOL2NLUGdjOVVJOEdnZGV6VHl5WnFZcHJDYndXd1JnTXF4QkJzWGJjQ3VieDVjeWFVT1dGVlYrdUduaE90LyBuOXNkenJnY01XUTlWNjZlMmZqY1BUR0htVnZQbU5UYXZuK1NjNXB1ME56d043MmpuL29KL2dQbjZkQTdNRnRzUE9ESnBnMnlDM1lLIEpqbU00Z2tRN1F0Q3AzS0t5WEJ2RkpHRTh3UXF1cXp5ZWVhekN5VEtGTVNaelpEWnozQUgvZndQUlVEYkNFU3lGV3djMnlQOEE4WXIgZFRrS3NOb2lUR2dDMldNQk1NSWY0YklvSjdCTTRpUXN0SDQwVEY3cHZtOW16bkFUL0FVRS9oMCtHU1JkRGxVZHRPNjQ0RWtseWxxViA4aDc0c0lld2h4VlgyRUxjakJDMUlkVnA5UGh5RXo1L0xRZTJWQVVvY1lzL2R2QXZ3QitQOVJXMmtHSXN5T2lSb2UxRnU4aTh0Tmo1IEZERG1qeUQ1T1JVZG9iV2toaGZJZzVPMkdHT0VkTGxmTjk0eG9XVGZCZVkwcjZyS0MzalRJN2gxSnF6YlVVcTlrTWlIVTd2VUZTMUsga1Bqa2gyQlc5YnpTN2c0WUxjNEZxUStDdGxDWXZjMW5oSnNJam56L0FJRGYrZmRVNm9lT0hjaWg1RHVscWJlQnZpMDdtSzlyMWZsaCB3TW90ZCt6cDh5R3Qzd0h3SHVIKytFL0Y1VjBQazJ5V2k3Z3dBRFlBQUErZjl1eXMzU3U4b3hjMTBuanpKYW1vS1lTWVZkUHArcHhNIHpGTitMVGRWa0szNWc0V1F5TUJpNHRQQS9UeFZiNE0rMExQQndpU2tvNThCNER3R0hUT2pobDkzWks5RnBqSU9mQ2t3SkxUN09UekkgbmhzcUpZMTM4UFpKZ2NPK01pL0RCbms1U25COVBUTlY3NDg3NXNodm4rQUQvdndDNHpLRkNTNEY1Q0dabzAya2FRVm15b3pHT1BPeCBZa25Ya2NGcU5BRmpKZVZHZHNjVkNNMmI3Zkcya2EwdDRkMlI0c2tjQ3VXb24yUTBRS3ZySEtWMzF0dXdwTXE1Z1liQ0E0Vms0T1ZTIDZXaGRTekNDMjRWdk1UMXRnRDJOQXIrZi9VejRyck9BTUlrL2Z0Zy9mei9JRjZybEJiUThmS0FwTEpjR2E0UnU1RlBzbGJpVENJMEYgbktVaGtFK0doaHc4TnhmRGdJZWh2RzJFeGJRODc1emJZd0d3WWdVSHo2Q3dsdXQ3QXNmVDNXTEhsVStTN2NOVngxN1Y2VGswZmJBYSBMY2JERnNaOWNPNmlmZGxiOGdXd2QwL2F2Smk4R2RGQm0wbndEOEFmdUErQTZDWFNzNDlmSE8zMlN5RFRHVlc2QWtHS2ZzNW9ySG5nIHUyRVBlQ0VQNGJoOHdlWXJtK0Y0ODhPRE1zcTVSWTJNNXZadytBQUgvb0w4ZjZWRENwZDhRaWJhWjlpRVpVVkZFcXp4SDhneHlTVlogQkE3YmNlOWN6NzUwamRqNXF2QXliS1Z2bm1TUi9OcUZ0c3JGYWR6RU16Y21udVZVcjVVckpGYnlVU1ExTFppdlZzb0NMSGxmK2NEaCAwK0hDSVRBZHRNRGFEbTRES3ZLY2xSN1IyVHovQU92YUkvajFTZk1JYWY2YnN3OVZRdVpqTXVsRFFMNWtXRlZZZHNEZ1pVU3hnTU93IEE4T0hhakpNWDJTMUo1RFRUQld4ak1ycTZNTXRUQTJjeEFmbDErUVFIMkMxME5rcGRqc0N3dzFsM2xKSlcvRDQ4WXFVd3JzTzE0MmEgK1BqZ1FtTFlleU9OOEQ0bHdJR0hSa1lwd1lZamhFa0lqOTNkZy9yN0RyeVN0eWg4MWNlRHpsWmVkR1czeXZYOXRrTlVOby8ybTVBYiBJNDJIaHZoaHdJVEs1bnVNOXFaRVpaZlBzM0NjUDMvL0FLSDhPcmdMVHRPSTgwL2lYdmlsanprWU50aE54WThra3hZcEl0K0RhRGl3IG5yVHh3c1VTUkpNOEdXV3ljTnN0a01PUGNBT1R4WTY5YWRKbi9GYzA4YWRFK3dVOURmZGNORytrL2JqUTdOTmNxTmU2Tno2WURaaTQgZFpIZkZVRERxcmpHMGlDSHJZVmNEWmN0Z2o3bG56aFU3Tnp2VjZjUFg2TW5LenFtMWhIUXRmRlJpZk9ZNlhRcDRnREJ6Wnl0NkxUYiBsQk9peVRPZE1QOEFxTDFiS1ZYV1NwT1ZiTi9vSytoelgycFFMSEZMMFNXRW1xckpUMUJGZURDaFoxbmswbXVMc1UxOEtJV09LYk9sIGJGYkZMbHNpNkJvR2hmSEF2aHNlcXhSRnd2RkZGNWVhQUYrM3BxNmVERmk2b05XOXRWaHF1VzZrb2p1RnA1bFY4QnpkT0ZhUTVOY3EgWk0vRElQY1NxNFloRFB1SVNwclJ1ZzNDeFozeEN0OFh2ZU9LUHZ3RURoaGlmQTljZFJsTEV6VXZUM1V1OFhIUU5TOS9xeTFBWjFZTSBFcGJvY1hYcmttaDE5UGNMaFE3VXJjZVh1TGI4WUxKdWU2STIrSklRM2h2NzlzRy9ud0hUc2g2ZzZ6dHBMczZ0RzNPVzZyUTJxMmxQIFVReVpPMHVEUlRlbnNXaHc4R1Q0ZGJwOHdnSHNhdEdEZzRqazJCUW1Ud051MytkUmNCQWIvajBreWhCd1YzQlZkd09udGJHaHM1Yncgc2gyVkU5M01SRDFPQ252dWc0UTAreUVOd3VBeEJnTC9BQlV3TXN5K01WbDVCMG03VmQyREFId0ZSQUQvQU9YVGVQVEpJaWlPWTBqUCBGcHRRYzlRKzFEcG8yRWlzRExMN1ZJemxPR1pDK1NTSzdyeHRJWFI1Y29rbDFjY2t1MmM4OFNxUXlRUm1zV3NLcStSWjZnVXVrejVTIHM3NFV0K2Z6Q2ErU2JEVDJSYkhzTU96M0t3bkttK1lYQWh2bDJJYjR3VEp3RWVCVmJJWmlkb1BoTW1jTmhOODgvVUlBL1VUOC9kV0Qgc3RERUxsZEI4MVppWVdTTVQ1VmZVL0NBdStvNkhFMUFxVE9ycUVCOGhXUGluVElHTlBOdFlQYnNJd1phY3RGR0tXb0VDMHFiWUFRRCBCZXR6SC9sUUZYcXZJV0pmdG1hajNITmRvMWJ2Y3hqWUxYSkoyTnNoMDZXMk9TdFZhL2hxRXJkYmlWdVJaVWlDd0ljR1lzck5ZRlJ0IG1BMHJWRWtuRDRBK2Z4Zmo5dTlLeG8xRTNJdVZ0VEl1VU5vcUhiVlByZGU2Unh0ZW82bk1ybTdxOVExZGJUdzhPSHFFRHpMQS9vOTggbldwKzZJM0IvTmd6K3dIMERZTWRnWk54SHA1UlBDaWFqVW5FTS9lMlFRR0Zrb2JNakVEYm15ZkNtOU5yNHFQMDVYU1NKODlOQ3JrbiB0ajlJVnVMSnp1eHJsY3NXS1pBcDZncnB0RkhnUFgwZWJqZWRZMUtIemJJK1dQTU9EQTc3OWFBbkdLdHI1Z09IcFBoL3crSWp3Snh3IFdiTWFOelp2ODdVL2Y5Zy9menluN2N6S0hhS1l2MkFlU2JDbE95UzJLK29TWU9iTFV0b0N2VnpFVy95b0gxSWZNWDk4VXJBZ1R2czMgS0ZrWWM3b2hOZ3dma0hFL2p6N3JzT0hFT3BSWktoMjFQb0hKbFRKS1FSMG9yY2U3b2RqRldGRHNhdDk0VDZUc2l0M0JQaFZ5Mmp4NyBVWlprWm9LRXhsVnV3UzdQdndBQWY1OWowcTRZZExzWndHc2JIcDdkZ0s1VDliMWxWK2RZZGdTN2dBaTZuMzZZdkorOGFrSzNocCtBIFNBUGJiVU1NeFBpNHNtRE5oT2NQM0FRR0lBQmowb0o5UllWWmlpdXlXa1g4MTAybWVDZk0xSEpJaGZMYmE5b0xYTmdtTzJVVlhoTWsgaUs2c3pTaU9PK0hTV0tXQ1BjY3hzNk1xdU5yTU1TMlFCRzdRekhTdENnMERjbDJTWmpRa215eXNOQXREWXRxMVNpWHlWRDJkUHF0dyBwUHc5eGU2a0RjQ2UxOEdKbkFnVGZNZC9QZ04vQWIrTnVnY1JZeEF4UVZndFNrN0xqZ0VMRUtmbVJ4SmhYYUY1b2xCMkJiRG9kcVE0IGJBSHNaOGNPM05iakJsWUZCZ3RIU2Q4T0g4YmQvZno3OTBiS0NXd1ZwaE1ZMk9oMGhJc1o4RzJhOE5VT3Y3NW11UlFTcnZzUHRXdEwgZDJJYkl2ekVkRCtlY1QrNW5QR1luL0VPN2NIL0FIL1lOLzJCZ25HRE5kOVBiNUxwYW1WdDN6Ym11TklyOTJ5VStKRHVTMEZPcndBZiBtQmd4VDlxSnpnSG5jZnN0VVR5YU5hRFFzb3dOSjdKZ3dCOC93RS81OStlSHdsV0pCamhPWVMxM25lTk1SUXFxUEZuejU2R09OV2thIHlqWkprTUd5eHd3NFBBOTJYQi9SNDU0RUkrWlY2UlM5WVpSNnlKSmx0QWhDMm5lR0gwL2xtUm9WNGo1RlR5RU9xME90M0F4WUMzTzcgSDJaeHNuWml2YUZHMi93bmV6aDhBd2JBKy9mZ0RVVDQ4eWdyd1c3dUtJZHRXMDBPQnRlanpBOVh0WWUybklURlRRN0JaRVArVGZHQyBKQlE3Z0FndzZ5TWZNTExHV29FdEUyOEFBR0FBQmo3bno0cER6Tks4V3EwK0FBcGkvcVpUWGFybDRPeU9GZnhJZGpnVlBYMG1wN0JaIEJpcTVrTXdRRDA3QXI4Q0RjTzVqUTBNek5nYjJURFlFRUFnbjkvWUQ2K1h4ZG9MaWZaQ1E0a2x0VlBXY3BUS2VmQnFlSk1Ia09KRmwgekUreUszZkVPWVlZQTV3OTg4NU1HRk4wV1NadzRFcTVIUVFHTDh2cjUvZjhjN1p6TEs1VEYyVEJuV0xaa09RREVvK1QxaEdzamtVYyBzQU9Mc1Z0Um9ZVURvcUtnampWSGlsdHhpVlVtTnpqbWJvdDR4TkJ1YWRtb3k2NkRkNzR1ektVZzlvMlJwbzFYTnRPSUQ0QmVKZjhBIEQ0aHBHb0sybHNnSFE5Wmx3ZTlmUS9yL0FQT0RMeXhmRWJmUE5vNzhmUGdFSHdHQjlHeURqWTBhdkxJdmg4bzBicFhWME5TWHJnTTEgNnJsb2lHcjRIazJpSy9EUTdIcDlrWEU5YkI4ZlBQQWQ1S2ZlZk5wUE9WOStBZ1QrUGdNT09HMFpsUzEzRHQrMVE2aUJpb2IrSkh6RiBzUEVaTEdLY29LUGc5a3VCQ3ArN0VOZ01IRkpmYlRhZnRpdUxKakRsWEJPNmdEait3YisvUDNUK2M1aWZGMHYxNVYvYkcwWVptc2FjIGJMWVc2M0lYSFc5b0lmOEFEa2V0UlBZME83RnN1bjhrcmlsaUFFRVlyTm1mQmJNTXFzMms0ZjBDZ245L0FBT2lqMjQyaWl3bWszcEkgd3paYmxTQ1NLUjVLb1ZtWWxHTi92STFSWXl0S0xhUkJod21acWtOQlVCNXZDalo0OGpnZktsQmk0OWxnNjNxcktNYmJiNEVhdkw0RiBWUjNldCtHaVl0alE4TjRmSWFleUw3S0RyVHRvMUlkWjFtVUdkekFleUpPLzRBRDRBL2lBQUgreFhrTDZaSVpET25oRHE2d2wxVlczIGNnU3IyMmZQQVloUzBKbGdCNjN1RFJuUTRjZXRnNmxIVXRCclpaR1doY296Kzl2Ry93RHMvSDBFQjBZT0NPNE93TWJQcTV3WkUreWwgc2E3M2cxWFl2dTZlTFE3WmZTajVYOWIyUjJmRDNBUCtEUDhBbnZCaFpLTkN1VEpvN3ZhSVFIc0Irb2NINC8xSTFQRFhQNFNJYlJhQyBFMlZXMkxaSnJIdmMxT1ZFU3VtaXFJd0ZQZ0dHVytLSGU0Wjlhc1pzbnpqbkdHYTQ2Y2VTbjYrK09HSy9nQXdmbUQxTVlNaVBQTE8wIDJjakdPS09ISFZxNzAyekdOeHFrbWszSFVmZHlPTUxZUXAzWW9vRHQ1d3g3enp5Z3hpQVdaTFlwMitWK0RmNnJsZkxkdVZHR2pqU20gVmFpbGt0R0lSc0gyRXFoM2VHZVY2UnhWNGZ6QTRkd01NZy9ZN0xIMlc4QjJabVZ5aU16YjJiQ1lIMy9ZRDRCK3h4NmNFeTFDanVoLyA0U3ZUNmt5V2dIWlBqM2xkaStqNFdOVit3aStQaDVpMjRRekJERUdoc0RiQkRvd3hERnN5eUQyUjIvWU5nUDhBZ09odFRydGJhTEVhIGpUY3lXUXFsTHIwM3hMUVNkbllWc1dVcHlMYUNHUW1WVytHSEJ3NGVqVDZQUEk1aEdScmtWMlpaZUxSQ2Y3Ky9ZRUZnNjR4WlZrYUYgZkpkME5rTjB5MFdwR2xyNGVwYUhZWWI0aE5oU2tiZ0lCMlFQRERtTEJaTUlEaDg1YldkcjdtZWJOVmNjUVQrUDM3cFp3NzR3cU00KyBuelJaTGtpTTJZWGNYRHQvallyM1U5TjRybGlic2FwT1VkSW1lUkJJUmNiNFlFdkMxaTVFeW9OWHA1ZUd6b0kySFVaQXlyNU9WbWdTIFdkWUtUeXlRTnlRLytvM3hXaGJJVGZtV1F5dzAvQUg0RkhaR2FzMmo3T0NDYkorbjBIei9BTG5rMWJzUm9xTmJnUG1kVXFKV2llRkUgeUtyV3g4UmJsSnZlNHBNVDNBeE0wOXNqZVFaSGhEWUo3eFZheXpQbU81Z3duM2crQThCOWc2MG1DaEIzdEFQWE1XdDVPbTk4UFZkRSBhSWVkWUJhWWVLRm1pVk1JTWo0K3pUSzB2aHprQlBiWnpJVEppME42V2ZDQlBaKzU4ZzRiQUE2bnJFdWdXWnNHdk1xb05QZFhhZXpLIDNVckMwV3JYenhZWEtRSmE1S2JjR0VQRGNGdGtaQ0RoQjdYVzBjNHlUYUJiMFRSemJ0c2ZBWDcrdnQvZm93WU1TUm1rRkNKTm5jeGogSUJXSld6RnlkcHdXdlU1NVhEa1lGQkdBWlUrcGRvSjNrYkZOdE1mV21halVFZVIzWTY3OGs3MXg1VXJRUVczeVpiVXRqdXdhZW5vYSBURXRod3ZpUTJPRGtVYTkrUTE5Ym1MYkpWY01jeVFaOWdLWDBibENHekRLcnV3SUVCbi9BWVlJSi93QnlTSFNlbk5jc1Yyc0VGcVdKIElkbDZleVREZEhiRytGNE9VQXRrcXVhM1g0WmhrbWJPbmgvbjg4Z3NoTVloN25VRHc3SlBuL3YzZ1AwYzFsdW5mMjNMQzFTbmdMYSsgejc0M1dyOVJRMm4xT3lGY0M3Z1lxMlFxdUdITUxjeGdEcXZIMUZWV3htNkN4ak52ZTk4K0FQejhBNENmd1BvY2ZVK1lyaDFWcG42ZSB5VEpBdHBBN1QwUFlWUHk4YTVQQ1pVVjhUekVQQ0dabWN3NEdRN1ZUTE1XU2hTb0ZrNStVUWRSSCtBbnovSU1PbWpjalhjQ3ZISUVZIHhvNkVUckhHVXhqRUY5Mk9SQmJjWDRHUFFveXlQUzJOdEVEczAyNmpTYzVTTytDYk9kREZjWHVqM2R2TnV0UkV5R0xzeDJjcjR0cFMgenUxY250UE1ROU43WnVpYWtJYlJEcjh4Vy9aK3lJZGZ2blBHQ2YzSVpobkYyYXMzaDI3WFdvZnd0MEFBUVB2d0N0K25Oa3NEU3JiayBPQXgzTkpHNVZBalJPcEJ3bG9FdUhRL2VPSUxERDFzUGFnZGt1QWV5VURaZHdBVWQ4R0RDaUh4bi9STUcvYkQ5Z3czL0FLNDZ2VDZiIFNBVi9IcVZ1Q2lxVGlYQTdNTmZXRWgxZUptSzdSVThWWG1VOCtJUWV5RnU3RjlrdFRqODg1L1FhdWpld1FJYlIvd0F1OCszOStRVUcgWGRPMzlsNUNxcHo5SzZTWmdWdmFGcm1Mc3VhbjdqTDJnME1JR0l0NG1FTmxXZzVnY3lCRDlJUHM1YldYam5pTXRmZGtsSFBjQlByNSA5K3hBQUtsaVNWRlNSMEtEeUVPZDJFRFdlM0c0MmtRVlo3eTMyVTF3aG95SklVUXVLSkx5Rk51TVk1dUJnMmRXTEhiL0FLbTY2anJnIFpCNmxZQjRDK1cwMnczeHdOaVUvK0paSHRpMUhKWHNJcGJWcU1MNVQ3NHR6REE1a3F2dGRBVldWNVpxdlEwWlp3M3RKQjdBZlBuMzcgbjNUT1YzaFBESnhMVUVocXVrdHFLRE5QQ1JYN3NOUjJIYTdhcEVDTFFpSDhRbThNakpSNGV1SHhQc3l1UTZ5elBpR3NqTFVkdFBGbyB2SDZBUDkvSHc4b1lyT3FsOE8rUmM2bkJ1VTFJRVFoZVdjajFPeU5BR25MYUtHSENaRFRueUcrRUc5SFF4OWFQQ0c4clA4Umxack9EIHNrbTNqWUg3Z0ovK29Ba2ZEYktwekhaU1hIeVFCcm5jbmNmTkpVZkxtV05LWVpUNEhUN3NENnRlTjJvQWhuQUkreTRMSU1yTXBWeXkgakk5WE8xb280QUFBUDcvKy93QUpjcWlvUFlpcVQrYXhBUDY4SGpuaStlbElGQ3U3aTBYSEkzN2JQSEh6ZFYvMitlbnd2aHc5UVZXTiAvaHkrUFlXVm5ObHhxMlRuRDJ4d1Z3UmFwUUtlbm1hZmNFTndzaGdNQTU1QnRSL3ZOWHE5WmpOa1NjRG5nRjlCUC9RYWpyZTBDN1FiIGZoV1hLQUVzWjRlTjNBUTY5WUMwd29BWGlqa0hUL3NZZUh5QmtnejYvZkFRY1o5b1JzTjhOLzhBVERFQWYyQUE4ZE9hblhhWVVNVjggcEU3SVNkU0x0WkREVDRGd3NqNXR0U2xNREY0L3M2ZlErbnRiSU1rNEN3UGxjdmlOanFMRnZKTTVkbk5qaDgvVVI4K0F3UG4ra0V1TyBpZkZIdFFFQzdTbHV5MXR0NE83Vks0ZDRLUkExUGNpdStMNmY4eTFJYklPc2dHZlR3S29IM01XTHN6WXpmZTFIdncrZ2dBSEFRQ0MvIFJ4V1RBU0IyeGFOSFRET1B3cmhzbXErYkZHdUJadmkxWDJFU2JlbWE4V3h6eHJDK0xXN3NmSTRIemQ5RWlXVXNCSUtPeXRYT2Q4T0IgcUtxNllyM25YZ2QzODl0YlJ0Nkd5QjluY1BodFI2d0orekxMeStLNHoyNXNrN0FBQVlzR1BnRDdDcWNvbExpdXF5dFV1bS92d0JtViBLMlZmUTlTb0hENHRYMkZZd3N3d09ITDN4a2NDSGdiQlVnZTUvUTNuK2lkajVCK3V3ZFFMcGJEZ3g2aEVOanlpUnNNWlpBbmVCa0dCIDVsUDdEV1ZjaTF0ZlcrTnA5a0J1U0hMYXI3czZ0dk5tWTdtTUJ1MnluSDRBdm9QUHQvQTlaSVQxZGozZ1VVUERPVy9KWVhsUHNLcjAgZmkvYzBvaHVMQUhoekE1Z3dRaDJNcEQrS0IxbDU1UXpEUENiNXNIdHNHLzlER0dlT0V6THN1NmFmVWxQZmpsbDJaVWwxL2l4SHoyOCBkTm0yMW1tV0Y5NnAzaGpPT0c0WWdnTGU1c2J6SEhkWDVxeUUvcHZLV0pZS210MUtlYXRnWEE0U1d2bm9jampjWFRucDdhVTF3cjlEIFE3Z3NqZUNCaUNQcjg4cW1DYk1VS1lveHcyRWR1QW45L0FBTi9BQUhaSEZqdU5qU21WWjFnY3RBcVVRZlpDM1lBbW54Y3BzaXlvWSsgSFcrR251WlZmSkdvOVI2a3EyUjNmdEdyL0JoRWwydzhBZ2dOL1BnRDZadG1SWGJRWUR6NHRoU1Z0alNWS0ludUNUSUxHRmNYWHU2NyBmQ2h3NXNQbUJnNDJwKytjWisrUE94aEFsbzhCMkRCQngvZjdVT1B5RVBSMmVWek9DQlFKa09wQ2RUR2tWVmNGNklldENXTEtRMkFNIHR3NjMrR3Z2aHl5eDdiUGhzM0tGY21zZ3dnVDZDQVAvQUwvaGgweWFDZHRwNGRMQ3NNOHpRa3F0U2Zadk1rdjJidHgyTVRXQzhrSHAgVWNzY1NNak81bWlRdktVYkRLaWhVRWQ5ZUdvMmVTZURmUjVvcnIrOUw0WUxDelRJY2JXS2ExRWtob3JGVXoyRlBQUmJDVjlRTU1nWiA4d1lzZ2hEZUcyd0h1Y3RyRE5RN1M4b3lQVjNnd0FESFlENzZBQWRKOXdVNDdPUU1acDZqUWlIY0dUd2pibHUrTjRjcFVTTFNLMzhPIEp5UmtNSjdKWFBNVU9Bbm8xWjRpM25ZMGszU1p3QWduMEhmL0FMOGcxWFQ2ekYxbm1LdmNHR2JUNHRoalY2djJUT3BjdC84QWVhMCsgbEZ0ZlpUQ2ZEVzJVZ1lxczhRK2RNc3dZaHZqeU1lUHV3TkJBWWdBSGdlbjlJdWcya01mY3ROR29Cakt6Z2piWCtOVjJCYkRJNUpvbCB5VjdJSUo4TmJtVW5ESHJjNVNxK2ZPaDFBekNpak96SEFtTjJJL0FlZmJCdjREb1lqcVltbGRWdEpuVjlPOEJ6a1NBeHhST0ExTGdaIHhFaEJvMFZxalZrM3dkVmhLdkEvT1FkZkZsQ09iRitEK0tzZm5yekExaDNycTNhcmt6cGoyS1ZxZk54VmtEa1lWN3BGVTZPaTFlQ2ogVHZUS1BlcjFGVktYWU1vclhsaEU1NW1jVmMwbzNqRkx3WjAzSktUQnczRXg2SUVmT3ZhRlYxNmhrdVU1Wm9namF0ZVpEbTR6bm5NciBhaHI2cnlwNndyLzBteFFhT05XbDVJdkpLWjdCSGVqWWh3a3puU3BrK0tIS1poZmNsMFFJQ3lZY0RKenJVbzB5S2lEVGYybFNJaWpPIGFYT2xWUjNaRmprYU4yeE5ueWE2WHZhbnkycjB6dHdXZFhRS3g0SklDeEtvQnJnQUFVVHgwajJGZlhxdHJ1bnJmVWdReUpZelprYW8gTStBMWV2SnpQU1pUQ0ZNK3VuM1pmS0FpVVBOaGtHR2FabU9CcGJZZTU4cXdvbnBybk95cXZXb3EzWHVYNmxyMTNzMHc2ZXExMVJmOCBVelVKcC90d0dJa0k2Z3c2alVLUkpSRTJ1YWpPT21Rc1ZkVUI0T3d1dWJWS1VtaHlaM0VpNFRzVDhZZUZFcXJ0RmdDNEwyc00wUExtIDVNL09zNjVlc2R4SEk0ZGc2cENGY01Rd0Z2d0d1d1AwRFhReEFDUmFBRjZxelhGbjhuOS92cnp5dmhuS2FYNnQwdjJUU1BwR0tWaVggRi93dmdGODJFNXpnb2h5TG4yM1ZDenVLeGNJTE55WG1FeUNNaENNQUZSWEZoRTdJRjVZeFNqZ0IvcldjQmNqNVdkSnQvZDJrK2tqOSA2NFd2Z3FSZzdBME5MVWNQQ2hVVVZtS2NwZzlUM2xCNWg0ZXVHUmhlQ3NsQ1orUENzTWpuS2VBTExrT28rSGo2Y25MVk12MUt1Wm5XIGRhb2lmL1V5bG5COUxxUTYzMnVMZzRaZkREazhFRWNuclk2STM5alNzeXF6UnphWGJZcUMwZVdlV0JJdGNxR1dOWFF2d09xZlp5b2ggdFdrdDJhOGE5VFYwa25nNHJPbllxWXpQQjVpZVpieGdVa1g5YW1WeVp1WXhMWWYxbEFvZ3A2RklNYWhKMlpPR3c4eVl2eS9Sa2VuTCB3R3EwZ3Q5di93REVBdFdnc3k0TGxyR3MvVHA1cTVybkFhV3NBcFdjVXk5K2h5VzNkYXNBcVBCK2pBTG5OOWZPNXoxdFZka0k0bUxHIFVKNG9BT0Z3Y3RkQ3dRbVhuV2RHcE8yT1R4SEt3NThNdUdMRC9NdG5FK1JabzlZU0FQQUE0WHdLK0IxZmdPalptUW0vOFdETGVYRnUgdXhoMFh5Nzh0ZWhuUzhNMWRzZzh1dnNRczVJelVkbWpDNjU2VWlkalpROWVBbG5VZmxxTVFabE1vVVFiVElTZkpHUU1JOVlkTUYvdCBobW82amVzOE10UXp1b0ZtTEtiemlJNVFJaVFVa1N4WE9sWmxmcHVRUGFJL3FVYTdMNUhyempKWkFFWnVTbjV4SFB6QmtRTENUc2ZRIHJlak9zNlc3dTArcHlabXFkNnlZbXJxNnNtdkEvd0NuV3VOVldOTVZDM2Q0Z0MrVTgxNThuL3FldnhCUWhPYlFGbTUvcG5ISW9zQ2UgUUprSlpoRXZWQ1h2UTgxcFpOZTFTQnR1UEdqWldYTkQyeVJWZlZuNVRZNnJ4QU5PYnNaeEVjd1pjNWNJVEFXY3dVaXRGbHV0MjFNbyBuNmpYd21UVHJaUlgxd01UeFVsa0NDQkJVRnFvN01GU0Q4a3dSOWNOV2dsMnFZdEJERTRzQWlGV3FYTm5DaU9LMVgyV201MW5UZkVVIGpqM0xoaTMzTFk1bytSZEM2UFB6MVUvOGgvMi8vRHJqMDhWMkd1YlQvZFRveXlpQWowcTRUVDFBSEp5bDZCSUpDem8xeUtMdTludlEgUldQUUtrUjV2cUErbWNUVUZQTXpNN0QxalZXZmg2NS9xTE5ZaGRhUXlUc1F6bDFwcGZUcmNFQWxzb1pkMWNBM3lGdzZGaTU2WURMRyBDVlRKaFQwZ3dvN2E4NzRCQVZZWHI5YytBY0lHNDgvT1VGQ1BPOU1rVGtIeGpEbldkVTVQMCtxNVA4eC84Z2YrT2xwN2wvMi84SjE2IGRyUzdBeGJMS0ZCYzBpcCtpQ25hK215Tm1ySk9iQ2plZzVXaXRXVGdpZjhBTXV5czZjbit0ZFdIZTRYWjVGb1hxWE1hOXlISFBFc0cgQ3BqUEJDczJOVGZQaTQxVC93QUIvU2pyTlg1NXdoYUx3NDJ3V3oxcGhZMkFuVkt2NjJqSXRMSk9SRVd2L1FUaWpsREpuNWRjcnVUbiBTZytma0Y4WUdZYkQ3bnNqQVhHeTg2enBFQUJranNYNnFIbjhpNlArby9QVnQ3SlAzR3dQN0Jxd2YwZmtkVmNxbDZNTy9xeFJobnA5IEZhQUlGTmFWTEJYY0sxSU1BY29xdEZ5VWJXMU9YSjZ3eHMwYVlTOGhjdEN2SFltdnNTRWZtRzYvRlJvSWJCS1ZsVDBqOFBUbTJjcFUgUE0xRkJLSnNDNW5HeUhNMW4xL1gxbHp2VGpaRHN1K2tteVdSRE1PTGo2eVJWU09BR2VabHptbFppSFE4ek5QNG0wc2pLbFp5S1hXZiA4QVZnTXpyT3RPcEFTS0IxQVZ0cFV5WGhzSFlaSllvNHRReVc2YWhZTkRwT21KTW1wc2srdDhtL09OK2Z6ODlVeXRITEpycjdiR255IE95TWVmV2tiSVI1Y2VENlNPQVE1a3l5OVF1VjdaRW5MYVZQSVhXSEQxaEhwUkFZamZSaVF4eUpJVWRGRnNHVWM5TWFKblI3bzZtOVkgbHgzalN3K3pwZnFVYTJmN1hYcmxyVjdjNnJWWUlCeE1xYW5wU3dzVENENlhRMTYyVndnY2lLNmJrY1N6K2tlZWl4aUt5WmR3Y2VQQiBqc1hwOVVET3M2VklCOVhFYTVGMGZrZnhlRDhkUGo1ME9xdm10cHgrblVQaXcvRExaeGJ5TE5FZEpqL2h4TWJycTEwbzNFUmViRXNaIElZdE90Ylc0SXJacnFCNlpVSmlqeFN4Q2hjc2prR1prY2pQamxoUllmWXJDTmFsUE5pWlNSWUhweXd4aXhsbHVad2cwOUhiR2RYOHEgaWh1dFluWHo4N3hpMmthMXJBeXEvSUcrSE1ucGFjbVkxYVpzai9tc2NNYVQ1aTJmS3dPL1RsbWcyb1FGWFhGZXpCcWZnQlloMlN0USA4cjE1MW5TdFAzNlBVNTkvci9mM2VidnpmbWhmNXJwdW9Kam5VeGt4azNlSGI0MjY5dGZrOWI4MmRiYkRZby9PWjlRbHVORXhxcVNxIHZRd3pqMlhWODZTZVBSUitxbDVIdVROaDIweTQ3a3p3U3h0cmgrck1kWTdFR0xoV3NpTVl3cHJLRXFIcVdyR2FTYWFWdFJHcWl3NjUgc0xQbHhoS3lXMDFlZ1VYUnhLWlh6UEZGYW1WUmp6R1pXZ0drOVVFWm9GSXI5Y1RvTmZWQ2pyR1VEVTBpdmlyS3M3T1Vqc0JMTnpzNiB6cVJBQllnQUFPN3h4OHAwcHY4QWluUHljYlB5ZWVrSk9xWlVPaW1DblN2cG15MU92SUxxOWpmMWdaR2NYbXZnRXJxQW5Band1S1B5IEZUUFVvTmhMZU1yMUx3MWJGUTNDS2FKWmxuYzhNd2xrd3ZRRlpVS3ZqTkpHbDJaTmFuTm1MM0RvaDEzMjh3SDJuUFZ5NXdNVjBhazcgSVNxZFgxY2o2bFhKekJ3T09HT1pYcUlscG1CT3dSODBMQmtwRHduYm0xNWJKbldkYUdKeVhrOFN5a2Zvc1lzaVB3VFFzL05DK2x4KyA1MCt4a2dESjlqQmR6RU12Z2hiT0lJSUZtdko2TTEydmptbTNVUFhVU21ybXVsSncxRmpvSHB0aVNJYng4R2VhbjBlQVNUSzBlRHpvIFFDTEtUR05pOWZxTWpiQU9KdWFCSXVZWnNheGhYUDhBVkhNNTJIby9jS3AxNGRxSHVOZTlKQTlOT2s5SnovWnRpMlVVbXhDVmhXNjEgVzFvZHpkVWJzUWZ5VXNmbUE4b25PdUJlOVJxQzFJcThrdkFhQVhsaVJUVEVpaDA3Qlh6ck9zc1lCMUljZ0YzZ2lMdVIzTVZ5eExONSBZcmsySkpOV2FxejA0RS9UNkhrOEdRRDlCdG5JRDhCcUYxNW9YNDZTT3FLMFBTUVM3L1BqSzNxWlM5RklhWGRQTjhWOElWa2lOQmlEIG42UWV1cFRtNFN5OHlXUmNKeXFYaUFzMHl5cG1jejRMRGU1TUxHN3R3dzYyVG81aUZFVXNzRWErMFE2VjlZQ1E3TmE1YzAzVURicTMga3lvK1Vva0ZnZU5rYUl5MXpUc3JJV0Rpb1ZIRU1raExubTYrbURUK0JrTDY2d1BFRnZMRjVVN0lFbXhtZFoxdXNuVDZaaVNXYlBKaSBiWnFhS3JKNU5XYXM4V2Z6MWtjQXpvU0JadS8zN2ZQNTZZRlorZ1pjRkhXdGNqR0sydGxZM0lMUnpTUFYyRjFEaEdXbjdJMHpWaGJMIGJYWlQwNHRFbzNrcnBVazBUMVdkNkJKd1pPS0k4WWNETlRpa2lMaVN6RlpZelcwcmlUUjl2aldaZ3oySTVJczJsbzRWa01rSGxHVzEgOFpaUnBMQW1GbExlNURLQkhtRjhMRGllb1lMa1JKcUg2eWVYbkZpYVdSSUVTc2lmbldkWms5Mm0vVVNnZm9BcFFINEEvSFUxanV1bCAxR0xNdHlNVGl4Rm0xNU5FV2YyZWVvVzRkWjF6aEUrNmErRit0VUhneXRFNmZYdzlJR0FObkxIQ1NBc05xZU1EeUNBYWFQOEFVS1VpIEkyeXllY1dWMWpMQWlQa0NSdVFJamlCUk56R05kMWFKVUlsM1VscGpsSHpMVXVFclcweTFOZnRqejFKbUw1R1c0dDVEWGtDamt4Wm8gQ3hTV1JUa0xSR1NrcWhPUkc5Qy9sR3N1YUVpNVVNN0ZHNWtvZkl6ck9zV3BKVFZSUm9Ta2F6UjRvcEtvdGl6U2lsRm5rME9ldWdpcSB3a3lVTlVNbFpBR3JWTHE3OC9QVm9ORXYvRGcwOGFuS1U3a3YzcFl4eDMwT1RNQjlPVXV3YTN6TXJOaHhjeUlVOUdjUUt0dGR0aldiIG00U2pFdklqU0RyR1R4RUE4Z09wZ2ZTSlVsMWVCQzg2enJPdTNITEtGVUNTU3VQdmI4cCsrdVBKSEdYY2xFSkxNU1Nxa2szNUpyOUQgL3AxLy85az0gIgogICAgICAgeT0iMCIKICAgICAgIHg9IjAiCiAgICAgICBpZD0iaW1hZ2U1NjU4IgogICAgICAgaGVpZ2h0PSIyNjAiCiAgICAgICB3aWR0aD0iMjYwIiAvPjwvcGF0dGVybj48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQzODIxIj48c3RvcAogICAgICAgaWQ9InN0b3AzODIzIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY1NjU2NTtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4YjhiOGI7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjAzMDU2NzQzIgogICAgICAgaWQ9InN0b3AzODI1IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MjciCiAgICAgICBvZmZzZXQ9IjAuMDYwMzc1MDMiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWU5ZTllO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M3YzdjNztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMDk4MjUxNDQiCiAgICAgICBpZD0ic3RvcDM4MjkiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlYWVhZWE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICBvZmZzZXQ9IjAuMjIzMzk4OTIiCiAgICAgICBpZD0ic3RvcDM4MzEiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzgzOSIKICAgICAgIG9mZnNldD0iMC4zODI1NDUwNSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MzMiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTJlMmUyO3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzk5Ij48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM4MDEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzODAzIiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM3ODMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjlmOWY5O3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3AzNzg1IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTU5NTk1O3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzg3IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc3MyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2NTY1NjU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3AzNzc1IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3OTMiCiAgICAgICBvZmZzZXQ9IjAuMDMwNTY3NDMiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOGI4YjhiO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzllOWU5ZTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMDYwMzc1MDMiCiAgICAgICBpZD0ic3RvcDM3OTUiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzc5MSIKICAgICAgIG9mZnNldD0iMC4wOTgyNTE0NCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjN2M3Yzc7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3NzciCiAgICAgICBvZmZzZXQ9IjAuMjU5OTc3NTgiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2U5ZTllOTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDM3NzkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzQwIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM3NDIiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzQ1IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3BhdHRlcm42NDkzIgogICAgIGlkPSJwYXR0ZXJuMjk2NCIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTg3OTI0NiwtNDcuMzY5MjM4LC0zNi41MDQ5MTIpIiAvPjxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDY0IDogMSIKICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgaW5rc2NhcGU6dnBfej0iMTI4IDogNjQgOiAxIgogICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI2NCA6IDQyLjY2NjY2NyA6IDEiCiAgICAgaWQ9InBlcnNwZWN0aXZlMTgwIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzQyIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2I4ZjRmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM3NDQiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiOGY0ZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzQ2IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3BhdHRlcm42NDkzIgogICAgIGlkPSJwYXR0ZXJuNDQ4OSIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTg3OTI0NiwxMTQuNzU3MDksLTM2LjUwNDkxMikiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwNzUiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNzA3NyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDcwNzkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAwNyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A3MDA5IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNzAxMSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5MTMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWFkOWUyO3N0b3Atb3BhY2l0eTowLjMxOTk5OTk5OyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNjkxNSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzlhZDllMjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDY5MTciIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjgyOSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxYjU4NjA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2ODMxIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMWI1ODYwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjgzMyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3NjIiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjk2NDZiO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNjc2NCIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzI5NjQ2YjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDY3NjYiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc0NSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2NzQ3IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjc0OSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NzMxIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDY3MzMiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A2NzM1IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjUxMSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDMyMzk7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2NTEzIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjUxNSIgLz48L2xpbmVhckdyYWRpZW50PjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNzYW5kX2JpdG1hcCIKICAgICBpZD0icGF0dGVybjY0OTMiCiAgICAgcGF0dGVyblRyYW5zZm9ybT0ibWF0cml4KDAuMTE5NzMwMTEsMCwwLDAuMTE4NzkyNDYsMTE0Ljc1NzA5LC0zNi41MDQ5MTIpIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NDYzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDY0NjUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A2NDY3IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3NhbmRfYml0bWFwIgogICAgIGlkPSJwYXR0ZXJuNjQwNiIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJzY2FsZSgwLjEzOTIyMTMxLDAuMTM5MjIxMzEpIiAvPjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6c3RvY2tpZD0iU2FuZCAoYml0bWFwKSIKICAgICBpZD0ic2FuZF9iaXRtYXAiCiAgICAgaGVpZ2h0PSIyNTYiCiAgICAgd2lkdGg9IjI1NiIKICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIHBhdHRlcm5UcmFuc2Zvcm09Im1hdHJpeCgwLjExOTczMDExLDAsMCwwLjExOTczMDExLDExNC45MzgzNSwtMzUuMTgxOTU2KSI+PCEtLSBTZWFtbGVzcyB0ZXh0dXJlIHByb3ZpZGVkIGJ5IEZyZWVTZWFtbGVzc1RleHR1cmVzLmNvbSAtLT48IS0tIExpY2Vuc2U6IGNyZWF0aXZlIGNvbW1vbnMgYXR0cmlidXRpb24gLS0+PGltYWdlCiAgICAgICB4bGluazpocmVmPSJkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRU2taSlJnQUJBUUlBSXdBakFBRC8yd0JEQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIgQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC8yd0JEQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQiBBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC93QUFSQ0FFRUFRUURBU0lBIEFoRUJBeEVCLzhRQUhRQUFBZ0lEQVFFQkFBQUFBQUFBQUFBQUJnY0ZDQUFEQkFrQkF2L0VBRUlRQUFJQ0FBVURCQUVDQkFRRkF3RUkgQXdVR0JBY0JBd2dWRmdBWEpRSVJGQ1luSVRVWUpEWkZFekUzUmdrU1FWVldLRkYxWlRRNFIxZGhabWQyaFlhVi84UUFHUUVBQWdNQiBBQUFBQUFBQUFBQUFBQUFBQWdNQUFRUUYvOFFBT3hFQUFnSUJBd01EQkFFQkJnVURCUUVBQVFJREVSSUVFeUVBSWpFak1rRVVRbEZoIE0wTUZKRkppY1lFMFU1R2hzUlZqY25PQ3d0SGg4UC9hQUF3REFRQUNFUU1SQUQ4QXIyeUM2bnJSTHJlMzYrenY4RmpmSkxZbjBiWkIgZ1F0QzJoM3U0b0hwK3lLclcwTmJEMkJNc2JiM3c2NEUwWVcrWGtNZUFodXJqZ0FCZ0FxS2c4RCt3UGlTcnBIOGREakF1N1Q1YU5qMCAyU3NDN2FYYTRkSVZQVDljMk1KUFJhM3daQkV5MUlWSlFBeXEyc0VFQ25zOWxzK0tOOUpkcXYyQmdmbDlnQWZvd1ZGSGc2L2dXbzFVIGpQMDNrcWY0VFc3Q1lWYk9jUG11U3hMS0svSDYyK0hXNmZMSGgxUkRINzRoMloza0YrN3h2bFhJL2FJQUE1OGY4K0h3cmNwOWN2aXYgZTVlVlZ0SnU2U1NpTUNTN0k5ZXNuOEw2UVVLR0dEN2duc2o1K09EMm45dE9MZFFFMWRYWnF6T093U3JqbHVnRDUvbndEejR5UnlZVCBHV1oyZEl6SWtrZnBTTkF0YklWaVh3dTNzMHc4Y2ZtUkxHN3dQR21DUE5HUzJXVzQ1SGUvZ1kzMjBMTmZucDVKNDkwZ1plVG0xTERDIFVQWUtHa3k5TjkyV1FZNEhiVFE3MjFxZ01PQzF6Q0dudUJDWjhDajlRL0ErQ29hSHRuNHU0T0FQZUFBTUcvNHZpN05NOUg1Vm9KK28gZTMwcnNQbFdvMnNKQXhoSWlCMmhONTVGTUVJYjVDaHJZY2M0UVZLd0lGcUo3TjRzWndmbTFvby9nUEFZOEI2V05UMllEcjY1REptdiBiYUpaemtIcTdzK0JzSWVwaHloL3MzYUhkQndjRU9HSHRSZ21IT0h3SjNCaWROdEF3WWo5cmtrRjUvMysvZFNOWjBXMFhKSUQxTFgxIFYwbStTbnVnWWtnQWgxT3dtSElVWGxSZjV3enFFdFN5RU1laHF0RDNCV2p3eUxQWnRYWmhqdzdCTFIvNkgrZm5qL1VuY1I0enh6T3IgeW82YWhERDJMQWNOd3BJenRITlhHUWZUbkh0cXNqMUlpenJMcHA0RktSUEM4V2RISGg4d0NvU1ZNcVVreHlKZGR3YWhTVWpxOWZ6NiBmbUQ3ZnJHTlRLMjdSck5rYU03bHJlc254eVE3QmZBTU1nWW1DRTlrVUIyK1ZLUGZJS2VqUEt1cjhtNFQrLzcrQStnNGIvMkhFZHd6IGJNdkp6eHVDL2tPbGdOWEpBOGxXVmZ0bjhOSlJoc2FLWUgyVFc5MW1BOHhoL2tCNmxZMHpjMWRvSm93TTFWeHNIeDhBZ24rQThCNlkgVDQ0YWpIeXY2M3pXalBzaDhVZ0xJSlRsVWJJcktiVjFYc0xTQlF4ME5EVzRiNU1yOXdnOC9ubkVObVJpZ3A1UnZ6WWs3QitYZC84QSBQci9aVWN6TFY2ZmFyUWdWTFYzenpEL1lWSHVBSDVhZUJLQ1lvRndYak44Si93QU90eURoN2tGS0N0b3lOeWl6Qm05aFFscVZEYnFDIGZmaitEOWlmWVJLcXhzeGYxSkZUQ05Na2p2NzB5WXlMSVB0YVNTV3VjUU9jbzZ3SDA0VXgya2Rta1pzcEpLd0FWOFFrUXg1b3h4SmQgbkxMaXVPcDdRVTNkWHNJQzJ2aEs3TEdzSTNkenhwcFBXd3doN3VLVU5iVVdZUVhMSVpIRDhmOEFCMjFmYlZYalRNMEN4aU1EZG5jMCBEQVAxQjFGd0hZSDdBcXJNNXFGVGF6RzJEbTF1dG1GeHhOM2RIdFMyay91UjI1N04xS0grR0hyZER3UStTSEswN2xuTGd3V1NsTnN3IHhIcE1JN2JBQTUvaXZuejZDZ2l0NFBCQ3djd3piNEhGYnM1b1c1SzlkRHNCYUZPcTN5TFh0YzAyeVZldDFXdDJvSDQrSGFtMWdBZzMgQlpyTjgzVFk3UmR1RG9QUHNQMy9BS2did0hzbGcybzFXcUd1WkFXNHRxTnBhcDJxWkhiQStuT1ZMVnp3ZXZ3N0lIMUlCNlRIR0VkRCByODlCaGkzbG9GRTJiOTd3NTk3ZjU0QUJra1pwU3haMzNha0pMNXhvN1VIaWplaG5oeGsyS1hhMG9IVWlYRU1tU0pnNVMwanJPc2VTIE16Vlg0czBDZWVvRWRsMVBLck13QnluQnRHcTVLTnA3SURjbjRueFFQZmdXeUVFK0crTGEydGtEQnprRUJIcmYyYWI0R2swYzI3YzQgMkIrUVFIbjBIcmRZR1hEcSs0SmtDeGs4Mkg3d1ZMWUt1U2lPRHVZVjFldkh4b29kZ1pFTVB6eDlIbUFmN0h0Z3hERnN6TndubTE0ZiBydjhBd0ZCd0FkaXU2QjN3eFVzQW8xdjgyeG54a2QyZ09uajY5UTFlTExQU2x0Z3JkUDhBaDJveUQyU3VRSkh2Z1lXVmtYeG5mQWp0IFNaejkvd0Q3QmhQdGdlNkZ3cGRpYlZXY05WUXlTMnJ5UERjVmRzaGxKYkRYSjVic0N0ekV3Tk1EMS9nODQyZmJVRXd6b3l1MExOUUggT0V1eHpnT3dBUDM5Z2FpdVZSdk9icWxWaHFJcm9YOTJHWDQ1eUk4aXVwdUpLMGpPTWNjNkYzZTJJNytCN3NnUDE0NXZoZzB2VjlkMiBXTHRvVzBXVEdWSzV5YWRiSEN0M1l3dk1tbnlwYkM3U3A2L2FsMnA0ZER0U3YxdUNlWUVOR3VBbjcvWnZkSVNRWi84QXI0K0FBUHkvIFdsUGVFL3RXa3RyNUR3bzFYczV0bGgwbXlMWXFka0tValllMXcxOE95UGxEaHc0OWJuTnFmUGd6TVZrb0xaaWY5YmRvZ0Ivd0dMOTcgMkVUMnRrcjZsaVdVR3VBbEVyU3dna3RndFNxM0JlTU5DdXZGTGtXOEE4eUd5UTF0UFpFY0M0OXVkc1JpbG9qTmpDSk8rY0JRZmYzNiBYaW5EcXNXWWNFMFhxRWJabFhqZTA4aHF1YVNXTU5FclRnaDFmTUlRL2VZdC93QTRqdHJBQkJ6TnN3NEtUOXRrZU1HQStBKy9lM1NyIGZabFdSOE4yWjJRS001SGpHR0x4cGE1WFp5R1F4QVhrM3dKS3JUUnJkZTRrNG92dHJONk9GMGE3VFpEZmpxeGNOMGNCZVk0Yk5WWkogUE1tRzIyVmRQeVI5aFRBS2F3bGJHaGp6Q0c0Qi9yN0pCbjE5V2pVWXQrMzFkWDdRZGt6WnZZTi80RGJvRGdJQ3FJTnN0QkkwN1Y3UiBZYXVDY082VXB0dGd3MU5UeFpyNUxRMGpmb1pDRytUSWVtUGg4UHNzbmdaM0JzV2hvNXp2ZkNkLzJEZjkvUG9QUjVVYXZYNEdQazJYIGFGNU95SGR3ZGxFMSt5RFdCZWNLdjVZZW9lR3dHRnN3WW1NbXpnNTlYNzRINHdMYUJqTnZkWGVBMkFBZjhCaDFEdmtpV2tQaEpOZ1YgS2JzS2tZY25sRmUyRTRjYnE4V1dGL0RZRnR3ZkZ1R3RqekVGdHNERUd5b3d4OGZCaFB1a0UyTkIvZndBRHdCUWlOWnNDSGxkS2RsUiBMMmE4VEdtT1dGbWs0eXM5dzRKR1RjQzl2WWtuR2ZuTk9ESW1QR04ydk5uL0FFUFEydHNsZnhZZXluclU3TTF5SHB5bkhpSG5WK0ptIEFYeEljbktxMCtoMzJZdGgyUzBERFVlci9VUFZiSjlvVnlaTTRrMWNFT0lQMEZCNllUUXYyQU10UWJXbXFCMlczeTdxWkdsbUIyaGogOVhiS0FWMkZvbElmZXo1a053VHg0WjRQZDZmaGpIbXIvd0JOOENlZjdSSDkvQWJBQUc2UHBORHFXSFh6R3IyUnYybFdwWkxaSGh1MSBncE5iMjBtME5ZMWpKNUF3dGgzRGtpZkRPSFNMYk8yeXN5cXYyenRSSlNUWnpFL3YrSDBFK0FVdVdocGFRaG1FZG9UN2tKS1NRdDZoIGNFTlBZSmFIWXliWHQybERDZVlRdzlWdzA5Z1cycnRmOXd4SnZuR1daNENCRFp6OFJmZmw5Kzl4Wlp2UUdTTjZLUmJrTWUzL0FEVncga3ViWnhqRDFZc0Z6SlFaS09paVpNcFcybkdiNTA4MjU1K0I2YVZWY25uSy9pdVFPL0ptWFhMQk1xV0sxTzB5bTN4dHIxZjQzSitHTCB0cEkzN2o3Sml5R096NUF4T244UmVEQXdudGl5OG5NY2VEOEFQNy8rL2dQV0xVaFlGNldxaG41OXlFaHVtKzZYd0lXUnpGaFZSVThQIGE3RHBGOHF1c0E5YnZrTytHUmczemo3WTFKOUc0V2dMck1tOEd3aVNidDBCc0hYbnZsbzRzV0xHdmx0S3BKUFNHUmtZYTMzNUlVMC8gZEt5RnZoampiaE0wOWh6S2NIQm5tQUNEM1BhM3dtc28vbTNqZitBb0ovZ0w4ZmVVeEh2VFR3THV5VlBoL01ya2FwUzdBK0d3TUsyQiAwK3l4YlFINWdaVzVnZnZBSHJxZlo3NVI0Y216ZnJXZTl1M0IrQWdINyt3ZE5ZUk5PdVdhektpT0dLZW1tZENvM3k5UzhPNDRwanh3IGN1R0NONDlNeGtDSFR0TXF1UTl5Sytuck5Xang5R1JUS3UxSms5VzNiMGpVTmx1TklxOGJYMm9JbGFJRXl0cVZoSTllMnBSOW1tS3YgUEtjcG80L01NQjVrT2FRbWM4MzRKK3ZBL0JwTjJCSGdBZmZRQjkrUU9wNG9VajBZTXNnOVRaaTR6R2FodTloTUNIbkdPejU1bzJINSBqQk1NR1h4RG1ZTWlxK2JCT1Qzbmk3UitLclIyUTZBUG9QOEFwRnNCODhGNm1MMDA3dEZKMnJYMW5VQmFyYlpDMmtNSENDQzhIc1pYIGx5aGNOd3F0RGh2aWN0cjZmT1E3UUFvNzV4bHBRNnovQU43WTcvc0Ivd0R6NjB0dG1CM0pIMWdkeTlNYllxM1M3Sks5SDArTlNmdzggWEtwR1VoMlF3VEh4OG9lcTA5Z2h6dUg4SC9HYUhhS01NT094c0pzSURZQUZSUHAvcENoaGNMd3UybWtxWnB6L0FIbEdNbGRzWnFMMiBWYkhuSU1PRng1RXN4M0hTVkkzVnlpbFBSQXh4czEzNTNZSUhHTmZkbjJteVgzTXN1WUJ0cXdkUzF0WktrNFZkV1Vka0d1RVNxNVY4IFdFZWlHTlFPem1FT3F6RmZyWUxWTGNBRjVzZ21UZkZjWTlQQVJKcE40MyszZlA4QUFVRUFFeDNCUEEydzRadGpHS1V0VU10K1l6djQgZDdONHVlaUs4cmJ3NzRIcmV5RS9TK0hWVzJyMUt1ZHM0R0xyTW1EcTdUeFNmUHdMOWg3YysyQ0hUeDVTa1ppZTI1cTJwTXVuaXQ1SyA2UVczWmdpTGNVRHdNcFc3QTRCNjNUM3hEWUpxcVBjTExvOWJXUm5LTnMzczM5Kzd1cjl1SDZpNmdTQzNOcmx3eWEwcUFQdkFGbFViIENIdDVLU2tUSXRqQ1JjV3lPWUxiSTRWdXQyQW44RHg1d1lSa2EwR2dtTXRUdGQvVUFEOHVvSURwaklzYjRSajIxaEgrYkNrOTM2b2YgQjgvQTZFbGxmZGtYRUd0eGlhZGF4eHpqbzQvSVh1TjBSNUhNamlWb2VWVWJxclcwY09BbGRFc2ppMVRFMTVUWTJpcGJ0c2EyckhBTyBMNGlSTGc0ZW5VOXQ5YUhUQXUzaWlINlZnSmk3SldMOTNlMzg2dm9UQmg5ck9zd2k1bUt1bEI4WkNRRjN5YWxzSkhKWFhjRHVoeVVNIHRiYWJ6QmJyZGJXN0hEcDVnR3BKOURRYklSbG0wR2pjM2gyNXZoK0luNEFBNUF3UHgybjEyTE1vbHpHRDJvTlNaTTJKRnIyb0QrbDUgZlliNFBYR3cyUEVRMC9qV3B1bjZUeHRIbGFsaVFndzFwbkZsQmVCM3dZSzN2ZENmVUxZQUFBMzFVVE5OOWwxM1E0WVZUSnZTdkFyRiBKWG1ocVpMQXN5SXJuclkxQlJhM3A4UEQrdVE4Ykk4ZWRCUXlheHVoUGZEbG91eHo5VUg5VDU4K3ZlemtRRU9vZTJqQ0x1YmNoeDNYIFBjdDd0cHdjY2NQTFgwMTRkdEN5dFNUSFQxQTRJdlR2bnNic2QrRnFURHVONU1PQ09VcFJaMDVXbGdXUTdWZXlhcXRPdWExRGwrT3kgTGJnVkRpM040UFU1TVRvUWVaYXVLR1BaSitreHc5c0NYZVFtajRQQm8yRWVHQUFmd3c1QmowNWN1dDY3Rldoa21SYkkydTArNGFsYiBKRjJPeS9GaHZsdE1KNjBGdXY1bDhHSENiRCtZcXZsb3FUVXlEZFFvdFdxQVlqMmliQ0hPQW9MOXNDL3o2b3E2dUNPVTR1dGxITnFVIG9lVWt4aTI1R0svRUxkakp0Z2kxZUg3dm41VURqMXVDZUh3RG5hQjU3b0RCbUx0U1lUOS9QN0J4OC8wNEVkMElWQkRNTGNYRkpzSXAgVDVQdlFOcjNVQVdmR2dYOHFLWVQ5bnRTdG9hZ3crL0lFTlYyeXMzd3F6REhqZTByOFJZSC93RFBmeWtUQnZxSW9jM2FFUnV6U3hLNyBTSmpzeXU4cng1NFpTWW9xOFpHMkZpMXhGbVJGZHFUVHVwV1QvbHhzZlZqcStkN0ZPK3hqdCsxaTNRZmVGZ1I3THA5MmNsZEpwT3NXIGhWVWtnaFhxZXdMeTNVcUdrV05YS0hhRDdNaHVGd1BqQnZrQnZ0cXVmdkt2cGZaeVlQdWliN3V2ejk5K0FlMkViSHE5MDB0T0ZiMDIgbTJFTmZOWkZlc3ZkQUMrYWNHeGJ1MmtYZXI3UW9jamczaUU5Ym1WaHlxZllDbWNNRXhoUkRaa1k0bEc5TzV4ZzgrQXhBYit2czVzSCBqNnpNTXNxb0xDTnBHYkRHbGsremxXUXB2a1dYRTVRdHVDZTRNaTJ5V29QN2N0dGZ2dXpzeE1XaGpOOHd4Q0hBQ0R6NUE5ei9BRUVyIGRMbEtXc1RtOVZMZEFoODFicHhJUjdPUTFlV1lpeFd6YTJSZmg0Mm1IWmEySHJnSnRId0hoa1dVWW9MUm1aNE5wT3g4KzM4K0FRZC8gNklQSTZSa04yY1lzNDljNVN3Um5lVytNZHkwNTVBWWNYWW9wR1NwWmJtVzl3ZzVSdFlYSEY2R1ZVMlhhS05kZGpoTVQ4cVE3UU1yTyBqVzA3UGpKL0Q4MVlVT3d1RW9XMkFYeGJyOWNNVVBEMlp3WkFjOVFQUEJnbU1hR2p1K2ovQUl1MkFCOS9QLzVrbGdMWThwSHBPeHRPIFZ6V1Jka1V4VXJZdjhrWUs5Y08xNlFVK1lSdzdWdzBPNEdCa0JnYmdyU0J0Z3pqSG5Fbi9BSDhmUWZQK2ZGY3l5SFFvQ1czZk5HalkgZExCNktVMGQyUTR6RXRnVU5oUGNrVDA5a0RtR1NZUWh3VU9CZE5PcmF5TUYrVEJtemZCejc4LzdBZ2dIN3FOdHlHS0RWZ0hiUmZDWiBrb3hKMi90NjhXRTRKcDZzckdGYmZNRExkd09ESnh2Z2JBK0t2QmhsWGxIamcvTmdpT2cvMkFBZzRkQ2dZYk9ZeGRjbHd1d2tZTVpqIFM2RjQ5MW1oZCtCWFJsbFpKb2tqZWRKTURuR1pRN1NjNXVzTWNzZVdmYnd6bkRFQUd5ZW1kV2RnWFpmcUZaeVlMSkVnS2FaTnFhL2EgajVTOUk5MmsxZHFYVDZoN090NmtERDRudjZITzdQbndkMk0zZENoMFpaQjJqVnh0SDJEZ1ArcndEcGJzbGdRMDFIaDkwTTZTTlF3NSB1WEdKTzFmMmE0eXJHMUhpNjUxVUo5a1RMSU1VUHcreVVkRDVhRFcxbG1LVTJ6TTI5aE9EbjE4QmJwOStYejlSZE03dkFVc0dvNzRkIHdOOEV0SlpROVRqQ3dXY3lWZjVRbzd2bFh3MTliTVVQTVQwUGtnTkRZTGFDR09UcTZ2V2ZoRGZCN2RQbjkvOEFQSCtnL1QyMlFuZEggem1QS3JIVHdOaW1JMTNVdVREdjY4eUFTbDg2YzdrN1gyUWgzd252aGdoTWd3TEFuSTRlOGxsWHRBbmI3eGFQTm5qWU9QKzN1QTZXRiBpWXhTTzJ5aVRSaDRZSmJqMDhuT1NCY1Z2NDU0TFVUWFZxcnMwcTNESmhDL3Y1TDVCUDhBaHgvVncva241WGJpVjVlN0hBMjIwMWFIIEtQMUIxM2k5aEVWdXNBUHVrZklIT1hvYjlMZFQ4Z2ptMWhhZXZWT3lBbHMraDN0QTJGeHozRE95azlwZFRlVExKbytXc3hsNWZWRWcgZXJMQW5Pdko2eWIwcWZTKzJ6cXVaTkVlc1BIMEQ4bUpraENGSzNSSlRVY3RBV0kvb3JrckxqTFBycHB1aEJKY1J4UjJrTDZ4SWt0OCBNUkRGUVJFakp4TVFDa3FWblRjUDdadjBkVVRGZnBuYjhwYVluK1Q1RkgvL0FIQ0Ivd0NudFROcEE3TUF6UHZBWkUwUzFiVFZaNXF6IFhINDZ2L0lPWEpZMm4vSnN1N3VOekpka0pMdkFKQjJDMkRGUzZsc2JHUExZOFBNRDd3NGNrcm4rUW5MWk84dnhtTSs3TzZNZnh0M0Qgd0FBQWZoMDhYWGVuTzQycERNcDVLSFY3R011T1J0c2hUbUN4YVFydmllNEIrWVhZSFcxN2xWU0VLbGVIQ29GbDhWeWFNZDRUN29QMyA1QisvQU9nblRtNjUrcERCbEdRYU5DRjdmYWdrdEhTYXhxK3ZvY3BXdUp5aWw3QU1mcXRzbGdmMCtwVlh4bjMzTm12QkoyVGdOdTR2IDJHQ0R3RUF6ck1YMXRqT0VsSnUwNjNHdDVxcWJZYXYxRlRMQVhvY29weWl1YTM0M0RNUHQyQnlGMkk4QzBMYTNnWnhmYkNYaEVtcXogNThCYnZBTGRRVUVCVWN1dzJBYkpCU3RKN2R0RkkyMHh0c3F0KzdKUWZ4ZlBUWkFzclpPVXpQdVp6RkhseW9GQ0tGTHJtOGkxWFFxeiAwcFE3Um1UeDVLeXpOWXhodHE1Q1M3N3huU0tubU9VVmhxOHFoam9hSE1ocC9NRnFjaDNCV24rcjdSeVlud25IRUhzQUErd1luL0FCIE5nRU5WR2tHeERGUUpyaFVxZW1rbEt3cXZhajJuOHNuZ2VicTl5NEw0ZTFIQVBaRVBFUGcyL0Fhbnp4WXQ1V2Z3bTdnd0gzNEIrcDcgcDJWbkQweHVTbVNzYlc1Y0J2T0RWN1Z6dTBMY3loeTNQSEt3anRTcDQra21SRGZIekFneWNEK2YycldTZW5PcnlmQmtpMGNUbjBGKyA4K2ZBZExGNHFjTzVVdWhob3RoTWpWRm1HNGlRSFExK3B3MUlnWmFIWTFQVmZEY0RPbTh4dUMyMWdTQUd4MlFaV1pSWEovaE0yN0F6IC9nTVBiRGY0VEZxSkhWODhGeGJGMHlnZVFjUnVEYjZiVWJWUGExSmdIOHJsM0xJbGpRSXBUMUVRdUE5eUtqY05ISW1Jd3k0SWJKcnggYmp0NmN3Y1dqejh0YjB5TWVvcFNaREpJYXA1OXpYSzQ3eEYwKzFrQlE2clg2M3F0YXQ4eFpEQk1PY3dVb0tHOGpOclJtWkhDYko1LyBIM1BuMTgvMGJLY05rWEt6dHJ1Tm5NbERxK1RHczE0R2dLZmlCejBWM2xGSERtRlYwbXl6SzNYL0FPUVg2V25NaE5HRkZMZlpuaDJOIDhIOEJ3RStoWW9PS1RyZG9GbWN2U2pYSnFod2xuWlZiM0hiS2REcVpmK0dCbFh5THRCOElMYjV5U2FIWHcrL09FQTRoOFp1Ulhac1QgbmhBUURnR1AvdEFrQ0hLR1JXcThvU1FMZ1BYQkpzMUhNS3lPWHVBREtwd29yOGdtTFllWlZmTUE5VjJYYUNpcTdZeks0dmN6bkNQNyAvd0RRZnNIVUt5b3hrVXVlV0xxOGVBWnhMSkU3anVmM2JTbkd1emdXM25wamQ0UldaR2RhQmRHeXRHaWdralFyUXJiM1dVTmtjL05MIDQ2TUkvcjAyTGhTWUdhS3h0RzdBUzBnMkVqa2dLZkRtb2xvTVZpbEZ0LzJnUE0vbzZkQXJDZmd5SXdzcGo5NDg1anYvQUIvMlBJT3cgTEVmTXJoSXZ0Vmk2bFdXS0EwdE8wV0xYMTF1T20rSHY4cUlCNEdQTUp6SW5vVXZGanRUR3JwOEpQdzNSOGVScndiM3M1ejczd2Z2WiBCUUdjam5IaGpSd0x1K0RZMXpKcUdTTGN3QXNFUU9teFplL0IwQ1dZY0REZzRPQWI4Z0hvRU1Zc3E2SFVETWJkcXVkdnY0RFlBS0NmIDMrU1g4dWw0dE5ubHhEckZrZkxXTWFrSWpRWWFiZjhBbVcwQlUwTkRNTUVOd3JlWVlUK0hOVzN6d2tQYk9Mdkl3RzdXaWIzL0FIOCsgQXFMWU5nWklHeVhNWXVYUkdTN01NNG9BNVVNdHV5YXBjc2h5dGNyV080MElNS290eXExYlc1dFlFclZ0L2lIY0Nhc0dqWXBBNmR3OCBOTnRUTzA4VlVrNlM3Q3luWWF2SzRHNEx3MmM5cHpYbWo1aEFPNFdSTUQyUlg4eWNwT0NHRDdadk8xckx6OTJOZ3dQNy92OEFpQTY3IEk0ZXhDaW5Yd0hOcmZIT256TFJ0aEgvaVE1RVlybTVidXVRQ3lMNjJIRG1KZ2NlaHRYRC9BSnlHc3ZOWHRBc1lEQ0pKc0dBMzgveUQgZitpU3lFZXY2clI4NWpGOGJWUUlFWVdJSG9jZGVoTkI0U0IyY2dZNUpEWlA5aHNHTUdZc2pGY29USjdJRWRnZVBnTmcrZzlidFJHWSBsVUVZZkdpeTd5U1VudmtiRW1NNDlWN0N5UGxTbHNQaDA4dHVDMmhtRnRQd1IrNEZsZzJURm1LRkdaR0JoRWszK3JCL1FQMzZDV0pnIEtDTmpVc1N4TFVrMjBGeVZZbEx5TjdsNVJYd3NXT1JaUm9WakF0MmNvNk9yN1Q0WjRVUVpZbjgwYkFDMkJ5VFFwbk1qd3IxZTJaeWwgY2poMmxyU3QrM29ld25DdDlQY09WYlM5WE1XdCtCc2hlWk5oN3hCbjJnQmVJYXlzdmdzbU5lRFpzSThjK2ZnSEg2aSsvTm9nbDEvbCBQaDVYU0xzSlZsV28wYXcyaFlUSlo5T1dtNGk5UGJSRlpPTjFBdDJvWWhqMXRWN3dYUzd3MW5sTzJNNk9rcEp2ZitQbnZ2d0RCK1JsIDZhaFVPZVFTUXhySmJYeFN5YlJpa0ZYT01LWVo4c2E0d0o2NENGanJaZ3h4QlAyTnV2QTlYTXhHV1ZmNk1jNFRWM2QwQUFQNytlQWQgUnhCc1I4NTh1Q3ZtaTVrQ3lLTW1EWWtmT3RTcDZjTVZLZVlYSUF0dUxKMkhobUUvaDdVMnA3YnMvSm54WHN6OTd1eWo5L2Z3SHNBdyBQdnl3OGpHS2FVcHBuTHJKc3lHS1dPU01VRUxia0xaWmMwQUZ4OEhQSVl0WXhJMG1KM1lvOFZhY0Ria1NRM2tpRzN4QXNXZWMrM2hhIDVEMU9yMTl5c3lzb0NraHhyenNGMkJ5MkI4b0hVQllVMFhLcklBbXJaOFBjRmJ1REluanc2UHVHeG9ZeDU1UnhnNGJDZWY4QUFBTi8gMkRwblZtOHI2Ymwyb2hubXEyblpvR3hyQ0hCMm02RjZZTEZyd0dKL3FRdGg2VCt5QXdOd2ZUK00yZ1U0TndtMGZmZjhGOEJ5QS9qMCBCdENHK050ZjM5bXVTcU5yRWVxMjFZWThaTUVTMW9vZUxYS0xEajYzTUdFOThXMDlrL2lIVDYwdFNId1pEd0dMUE52WjQ0RC9BTk5nIDZZVlR2bVloc0E1SVY3SVNTVmw2YjF0aFlLOXBOZkVvWXNwL0ZBNWNmcE1PeU1vZXlLZlQxVjhyOVNhZzdOenhYR1cvK0U5UER4eUIgQWZ0L29Uckt5VFNOTWhsM1VFaXh5ZlVORkJxMGtobWhrWlMwRUtScDdRdGlJV1d1dTBEcTRwWTBrMHlnN0dvTzQwZVF5ajJ6aFR2SiB4aG44REJ2QnM4WDFYdHM0WDhnd3VIc215RTl5bVJaYS93RGtDSXl4VmRoaW9ZZjhWT0h6QzdoREJ2bjlTa3lmRnlmT0hiemorQUFBIEFCL0ZCUDRScGdIWWdaVEQxb3VYOGJQWlI2NHhQNFlEMTZ0eFQ2UmFCU0d2NDR1Q2ZEbUVGdTFGSzhQbkJ4Z3hEd1dkOFNUWnM0QUEgZm9mZnQveGFqQW51R1V0c29zRE1rMWptZ1NWWk9EaGFsa084ekdtNm5QUlE2K3lVL0R1RFo4UGcxTDV4OEoxblRiUVUyUFpUWngrUSBmOXY3L3dCWXZtS3ZjbURPZ1Q2VE5oOWhDZTFZbnpERE1zWThXQWxBL0EyOURoNmtJWStaOC9ZWVZiL3RZeW9PYmYyRFlNY1AzL29BIE1JbkpkM3ZDc3plTkVlUDliNS8wSDQ2emdCSlFZRWVUeGhtdTF1VVZ1dVhxcUYrZVc2VzZ1RHNqTktKNTY3citzaTFCbG5mRVQzd0MgcnNNMVhmQkl0OE1MOHhibU9ESVlIeklNRGZtb1B3YTVHam5KdzJFZGpuN0J6NEF2OUcxOER5bFFaazJ1ZFNWU3YxWTZoMVVKYkZvTSBtVHFRZHc3a2V0Z0M1UXVIcm5hdTRGdGZNSTU0Z0JPZTM1UVJrWTQ3T3dSNDRDZkFmUWVmZEo5YmVGZTZZL3hiQnRSMnVDTFc2MkpYIGpLM1c5T09EUlVyWXJ0REpYK0szVDljTWlmVHpoY1ZENHRxUGh1ZG90Q016NzJiNE9mUVdBLzRCQlA4QVZ0Sy9XODNXUllpU3VXckQgazJkekJrcjF3N1ZwOXNQcFJvRTFmRU1zRzhMYkphajVZTXo4Z05xUDdMT2t0OGVpWVBlemV3b1BJRUYrUGdINC9ubGJaMU1JdEk2aCBUM3ZpSU9mQXBUdVovcmJ4S0EyeFlVK05kelRCa2t6bWtsN2dxNWJlbk5mOFFjaHM3WE8zNzk0TTliVzNUcVJEdEhNREs2ZnhLd2hwIGlWTWswakhNT0RoV1h4WHpUMFVsbUU5a01mUkZ0Z3RRNEFyL0FBT0xhei9ReE01YUp6L3J3SGZ6L1JXUHNSTGdDME9la0dGTE4rR1MgRXgwbkpYMVNaS1YrZWNrc0JiTUdKbkpCOHp0S1F4blkvd0JMNCt3UkpDYytYOS8vQUg4L2kydFJGVHpJcFJQdVFNa3lRS2JxUVFMWSB0Q2pUMW9PNkhLaTZqNnZWdy9NQTVoYk1KN0FodFNIY0UrajVpTU05bVptQm0vQjcrZ2dINEJ6N2dOUzhzd3dXTXloOWhEeG1xQTRFIGhLK3Rza2dzWWx0RlRpMzJIWDRjd0hjTm5YMlE1Wlk5UzdrWVZBMFdnTVdjUE9IQUd3Y0JQZ09mSDlhakNJWEtqSWVXZHp0bE1hb1YgM1psclB5dFVQTm1rTXVVaDdOdTNqVHpsZVpJeThMNHJ4OC9rZGRoaVJsaHFQbUZBMWtCRWwzcC9WRnA3cThQZVZncjBPK0lxblE1VCBjSEJEWkZ2U1hOVDJUWVdBQzg3WWl2bG9qQm14OWt6Z0dvZ0hkMUJmdjF1QXZqNWlraDNOYUN1aDBtbmdkYVMzRTBqMzlXTnIvTWxSIFMxM0s3Z3dXUkRaTkdhZWgvTVZlMENsQnNnbVRWME96TUVjM3NsSG53RnU3QS9BTU1YNnRMWXBsSHgwVzdNZlVOU2FzNm41S21ydzEgdEhweERxK3huZW00dTRXUUg1Z3R3cXYyT0JWNEVIZ01XU2o0ekxQTnYzOC9zQUErQXczODhyUExtR1dET01ncGtreFplVEdzSzJBTyBsWkdZV1N4dFFTOVVya0hzQndNSitvUzFGdGg3cVQzQ2gxWC9BRmtLTFg1c3dkamlDQVAwRy9QeDQrZjZ6UHpnVThRc3VFWC9BTGlrIEdXUFAvTDJVMlBPUTdRZkxBaFh0enpmaGl1T09NYlVJM0pzM3VVNUswTWNDYk9WQ3VrMG93YWZqOU0yL1ZUSTJubkVtYmlTS09mR0MgV0hxWW8yN0ZNWVBtVThuMnBqWDRleHEwd1VtcGJKNFhJcnN3d0hWeHZmRDRCL2ZnQURZT25tbG5BNTU0dDg4QlpLdWZMTHNsbGlMOSBrVjZRK1lLY3BjV1ZaRkg4RE1HRnRiVDJTblNEQUJlTzcrNlBtbm9ud243d0FQbno2Q2dnUFkra3pqWWx0cklOQXVkZWpiZ3hjSkx1IDhXcFc3UkVjSHlMTGFLdkRzQmlZWWhzakppeVBGOFdCZE1Ga3AvZ2RvVm5aanh2ZjlmZlFhaUFjQkFNNkhIZGJXMUdVbmVkeU8xa1cgUkttVnVrQjJUSnI5aHJlME5YMVpTcXZRMkFQTWNMZ3F1WUFwUFlXRGZGc21VUW54bS9lNnVlUDA3dW5rQUFmd2ttNHJac3FTSUljYyA1RkRTYmtaQmpSbXNaYnR2Um9GTUR3K1hiSS9iZ081MG1Eckd2TWtzRTlYS2kvTzN0Y3BmT1k3bCtXMURwYzRHcCtZQmdRMUpiMkYvIFlUQmgyVitTQVNrczhWRGo1akpNcCtHSElCemlIOER0dFppemZEUVRzekNyclJPZTN1L1ZFZlBnTi9XSXRmTU5wWEJjaWdYWjh1UUMgY2lNRmJwSWZIK0lKcExJY1hUZW4zQlE2MkhUM3hmaG5KL0xVZmM5cmFMTWVYaEoyTUhVWGQzbngvWUFQWHlZOFVmWlpCSkZybW1OcyB5VzFrcmRncmU0S0gwMzYwYklsWEpxRUtXTW4xOUQyaVpNc2hQVG9MNVlQenBqTXMyZ2gwYjduQWRYZUFmai9hTGdMOTF2QU1tWlBZIEtyUEZPZnJjQzhtM1o0ZkgyeUhWOWpjeGZIeHhNY3dtWENISUljNUNzQ0J6RGJDZ3UzMW1xMGpmQVo5K1B2ejhBMkJCNkZKdTBzWFQgQm5aMkx0dDRXRllnREZzcWpXUjc3ZUl3dGQxaWJIN2Mvd0R3anlxKzFiN3hXVWpSeGovNWsvYlJnY3k4SHhjc1RPemMxUFd3TUJEciBkM2p3NzRIOHdmUGlXaHEwNGZjTlY4OGZBNit5SThCd24xeTRNeU1yL2pQNlRhUDRpOXNINzN0M284SVNGTlNzQ3Q1Nmt5VnZaelFlIENXRnAvV3pGb1VqY0VVcDJiY3R3cC9UR1lRNW5lQ0hBNGY4QUFjRm16T0w4bVIwbEpDZnI5K3YxQlFRQ0NzY3QwZUsrcGJCY0RYWWIgcDlJeWF1ZDYvY003aEVJb0J4aXhiVXdtWEJ5VFp4NWhxVWJndHExUTlRTExRK0xQT0VrSTcrZlAvUWVBOVdQUjYzYmF2VDJXVWlaTiBqeTFhR2dpS1AvNGxkWkYyMFFuT2RmUklyZU9UNXRWaUxzZmNMVFZiS1FIeHJNV2NMVnhWWm93VjIyTUZnQmZxajUrLzg4d1lBSXR4IG85bU5wWm9sQ1Z0Q2ZHS09QZVZ1NjVKdHUwZ3JqdVhkUEJJckx1UHAweG1uMjQyalVrNTRSaVZwVVVpaDQzV1c3Tmxib2VBaUxkZk0geXBNdDhhRDJTTk1UdzZUeWdsVzhnVE1GdVZoSHZoNEdJZW9Sa2NJZFhod2MrajMyNHRyN3lLNk5aaHptenM4YkFlUDFHL2RkbE41ZyArd2FmczVvelh5MFNTaUI3SXNGa0lkZmljQ2xTNmNLNWFadnpLZkR6RTlreDRPK041NUhoTEpQbml5OHZHeUpJUGZ6L0FQWUFIUlZlIEMvRE12bEF5OHJPcVVPMElZMFRSOE1QYkV1N0doRHNJV0JaSEFQZGtPR3RzaS9EdFRTMFBnVGtPekxmdmhEMnpaS3U0T2ZBUHo4ZlAgL1FjVnVMUzdRVnpEc3JxK2NrNU5JMkVhTEk4d2JIczFES0liRkZya3l2OEFiZERaRUlQWUFlanp3ODlPcmZhNkhGNGZTZ21MeWZ3USBkLzMvQU9nbElRVlhFWlBHNmJnYWZma2lKOXM3eVlKbHQwY1V3WE12ZWE0OXhSYmFTVk1IRU1pTmptdVAxR0pXNFBKd3p5VzM3d3REIHRhN0U4WXlFdXZueXZBNlF0NmI3UHFBYlNhUVlyMGJZQmJnWUZzS1d6ZzQ4d21CM0NuMCtaQmdEMUpIbUxJeDhGMll6YklFNFBzQi8gd0hRZGNPb1NyMWVwODV5TXRWdEdNbkpVbDZ0eVdtOW9wemRCYlpGS3NnL1owOWtUdzYvMjRvY2dwS3EyVHN3VzBWbXNuRWcyRTU4QSBRZnZ4OSs2TnlsbVNPY0xabm5nUU83MTRTNC9UTFV2eFBpZ1Y5WEZoMCtZK1F3OHdQUE1RVkp3UXprTkc0R0xHSTJDVGFKczZBWDM1IEJQN0J6N3FYc3dXci9TV05jVDFLRzVaMVMxa2oyY3E0UktyVGFsWVhLTDNRbUIvaHAvenc0T2ZSNzREVDFuRGRIa1lEd2R0OC9WQ1AgUHdId0F4S3ptS09wbGFTeUJEemxKY2U0N0RqSEx0b2MvUFA0U3o5dWF0Q0VTczJtRjFrUVZ4SCt4eTU4Z2Y2RzR0Q0hkVnRsVm1CcyBZL04weTRNanZsWlp0bmdhcGJSMXlvTnJDMlRMaVJCQjJQUEY2ZVNVcXN5V1JPSkM1QjJlZWdlcktLRVdrdXk0R2NqS25SL1g2ZXM2IDhrSjFyTnR1UnhqT00wOFI4NGxGeUNnVmxtMUhEQnE2bFBKdzJZL0pEWitRR2JuSE5uNVdHU2p6bEdBSmx3WHUyaEJSV2hMeFNCWVAgcXdtWnFhblowbXBVN1k5V0ZSVFNydEE0cUN0QzkzbWdLdjU1TmVBZFptWThrZ2srU1l0THlmei9BTU4xWk1lTFc0RkJ1RTlEY0l5UyBHZkxJRXRHZHBYcGV3bnh5cEdJQnBJeGFDZTRUTFZmQTQ4UHFhUTYvclFIWkZaRXhmNU1CaEhhazNoQmZrRGZ3UGdFSEk5YjNRVVMyIHFLN21MQVd5aWVSUjNnYlc2ZmJCanMzY2NxVXRrQTh4a3RTdHc5b1RBZFp1RUdDSFJrV3J5ZEdzd1A4QWZRSG53SEFRSFJmTXkwTXkgdnVCNkxrM1lrNVc5bHRQRm5UQjh1SEZzWklsS3o0d2h3NmZjRU5rY0szVlo0K0JCTURHYitITm1aZ2VualpFZmZ6K1BJRC9zZmlPNyBGc0s2T1NlTEJtWDlxRVkrZjJGOXFUeEtFQkE2bXJHbEdPWXpLcnNpR1lUNGZlbXY5UEVIQW5iL0FMVm4vbWsvaUkvUWFDQVFlN3ZSIFhFMlpHQmVFcVpYZDhNNDQ3dlNnWXNPMi93Q1d6NUhwOUFReUJUbHRJM2NFckwxTzNjY214Nyt6dHJnQThtK2ttNFE2M2JZNWkycSsgempkcVNpU2tKejdJVGg3RE1GdmxaT1FGOFh6RElJWkpnZXJ3NnJaYS9QcDF4V1JoUm9KN0Z6WjIzL1lPZkg5L0FkV1Z6R0I4eVdDayB6UzVTZW04bFh6c2syd1lvM1J6Vit6aTZ2YkNpYitOb2RrYWtKZ2Rld2dnYkF1bjVneG1ReGZKZ2ZoUDMvRmZQN0FBNlgyWlQ3bzVPIGhLMmhhZUVtVWpra29oZ0MxVnZFTUZKVERYSjR3UVpZZU5rUTRaRFpBS2VwSTZlVHJQVG0rREVaSFNjVWs0QXhQdng4L2lBeDZHbzYgWEFERDY5UGNxZjYzelVLeUNvOXF6azlUbUZMYVNHaVVuL01NY2JRMFBlSVBiODk4eXMvb2JNVEI0ZlIyRC9Meit3YUdFVHFWWTNkYyAzS3REaS80cFk3dXg3cnFqVmMydEpIVmcyTGl2aFdpNXV2TzdCTDR2aWdQRFhmRkZZZUdEM0JQUThwcXZWSnJSMnNoaERtTEREcjBNIHFCN2NjYmNJZHd1QzNxRVpHQU9xd0xRVXAzQm5rb3JyT0hDZk5uOS81OC9IK3JVT2dla3pMcmYwQnR1MWJzNEt5RGF5WDZydUN3Vk8gSDhvVExWNjMreVdReVhXbjh3T05xL0FhakNOVUNzTFdWbDQxRCtjcUx6L2FJQjRDb21wUnN1d3lEb2VoeW1jdGdVM1RHN2ZJcjNUcSBvSkFlcnhiWlhNcUdQaVRIQXhNY0NFMTR4WDdNVlpqTldZc1d6YjRFNXRoOSt4d3gyRHJrcjlncThEWDlldmdzYlc5d1cwSE50a2RKIEdPRmV6R2lteE1VWDNRTU1sRDNBaHNqaFZiVSs0ODRNVm1qZDBPY3ZBVEdrK0FvUDlnQUFENjVBOXh5bVRDWjNSSVZ4eVBFc01qRW0geDhScXBGZUd2N2FKUUxieWdoTUkweloza3dxcUlBWEZyeXNnbXhRSGc1Y0hZYzRwcS84QWd1VmhJYklIdTdPUUt5RHd5YSs3N0RmQyA5cUNsT0MrSHArWk1obUNLMjFRTFFRemhoR0p2bUx6d1oxOXJVZnRnUDlvc01ENzg4MkIwZlR6Ulh1WFFVeU5wamJVbXR4Sy9RSUdqIDZ5aE9SUjN2aXBjUGhXbytQa05ESWZBM0NwVWRiWnFnRnE3TXRQQnU3S3VPUHdCL1lQOEF2MUo1aHhiTXgxVlNya0M3MTZtMlF5Yk8gWXF0WFhvY3F4bmNDNUIyQ3lMSWhoNnJEcHlIVmRsMGZ5cFByUGE2djhHN0JFa0dlOCtmUWQvdzZzSURxcXQ3NHdtVnpwVnY1MlE3USBKUmxPT25ybHNWT3lJUUNYVW90azVKTTFPVnZNM0R0eWhzQ2pjUmdtaks1UlpadnhjNzFYanNBQSsvYys2R01DYVJqSmdJUWgzRmtlIGtNQzBCQ1VydjhtbnlYRW4yTmxRRm5hTTRBKzJyUDU0VStQanhYbjU2clNQck14ZE9aV05MQVdyVE5WWUErRVlYak92OGdrUGlhS3MgSkR0cHdYM3lIRFc3Z1pDSEZYeGZVcDFWazFsbmFMTUdBK0VoTFU0Q2ZBTDUvd0FCZ1ZVZURIMVV3Wk5RVmZiUzNiY3BEMDhWbGJGNSBURStuRStVTFhnTFRNSHNpZk14RHNoRU9jUEQxTDZ5OHZndFpKMnA0WEhFK2dnRDZDQXhYd0hHMkVOU2VXR3psZEl5WDlrVnh2Y0Z3IFk3ckg2aEszZkUzbEc4V0RERHVDMmh3MTlQQnR0WVBtOGJaY20yRWtlN0RmT2NmQUFOZ0FBTVRCUWZMUnpudDFNeGROVkEyQ0JzNlAgOXFNNTd1aExEUXB5c0ZCZnF4UHRPeU1FVEFSZzIxZnA1ZUdONWVNVmNXc294eDJOWTRuenpCZ3dIOE1jR1RMS3F1SGhmQmF5ZEdpTyBObXhheVNSWGRFREVud2JyaTYzTXA4UXdkelFWZmI4aStTVzQ1SE5jMzFHM0xUWGFyUit0NXJTMUxkblNqMm9pNHlBM09wZHNUMmdXIFdSQmhnZVk0ZXQxWE1ZSWM2dENOYVdxeVBQRjBOWnhxdXJ2eXB2NER6NS9IZjVHbEhpUGJXV24xKzkweU5zN1NOUnR4MDViQjVJUjYgOU1hZ2RUNlJwOVRVK3dPQm9iNU1EL0VlSituK2xuakRnM3ZVQkxFSUR3OTBHK3o0RGtEQmcvamF1eVdJcFREMWZLU2V5V1FCTVhxcCBwOVMwYmFEWStLNmJxYUtORnFMNkc0R2RQYjRoTDZlajFvUW4zZ3VXWVR0Qjhlck1Sd25uTzBXd1lBTmcyQzBXb040UjdVdDJkRnF2IFIyemFXRmRjSFJBOWhCbGk0Mjl5aWVpMmF1TGpwY3pDMGsrblUzQ2VwdjZrcllQSzIwaTBoNk9uTHNDbmtMMnhQcjMvQUMrazlIVFAgR0dZN2JydXZwMmhHellJbjB5VEdZRmlsVVhFVWlTd3lXVmxSeXFNS1NVeEs3UU5qY0t3U2l2Zkg1QS95K29JMytmNDhmbklVb3NnVyByZ1ZPNEFOR1Z2SjB1MXlTYlZPd0RGU3A1YVpZdFhxWjYwSmFlK0xjd09aMjh4T29kd2dWd3QvYU9UYzQyUjJSOEQ2Q0FBOEIyQkJkIGt4MHNRV0RHM2RsV29rNVdveWpSdEkxZlV1blV4RFF3Tm5saGRvTXRmcDYzTVc1aWduekVkOElXWFRySU1abWkrQ1l5cTBrSmFQZ1AgUDlvdC93Q21PMlBrQjgwZURhdmZLZlVxTnQ1Mk5STFF5YlVYMnh2bEsxeGk0dnNuMGxqTU1XVGFBWUhROW92YnduczR0V3BwNXgzdCBKMlFDdjRua0hIOVQ4YVQwQVc1cENpS3pqYktTeXVDeFpkY2NucHF5S2dhMXhudHFJMDFnOURydFc1akhjTTJlNGJnZkF3SnBObFp4IHJ1c3ZOSTJpbEFzY0FHS0RZSHA5UjQ4bFk4bFdNaDQ5U0NKWnBIRVJ6SzF1YmF4elNYSFBhNHV6TFcyUUVhMngwSzM4b1pFbVNSQWogS3NuOFU2QUFFbkEzdFpHdUJsYmUzSGxRRU5URTljcnh2cS9OcmFrNFFHWTdjdlNiQ2psNGg0b3ZXMVE0ZGVaR1R0WTMwbXZzbHhjUCAxRDhiM01vVUpqQVJzSnFIdFRZUFBnT1FiRE8xZVBJRTdIU1JnZWpRdWRQdmU3RlBHenRNYlJjYmlocHBiZmpBK1p3TU9ZREQ0Z1N0IFNCQ0NZK2hsTUJadzJFNE8vQUQ0QUJ3SG53QnQvd0F2UE9KK1ZxV2Fyc3BOM0RyWW13RStaVSswVmU1YWo2SEtQbzh4TWh3b2FmenogWVNDaWM1eVRWMmpqUENUYnQ0QUFmQUh6L3NBRDFzKzc1em1aY2FyVzFHSlo5TkdsUEJFTUFHQ1pZempZYlBTVDRRdzQxWk1Jelg2ZSBxSWRuMXFqR0dZVzAzSXRERG1GcEcwYysvWW9KOCt3Yys2cE5FMGNXcGJUcWcxRXYxR29pazFNMHNpUVR2dFpTbHBYZlpnV2w5T1BDIEdQN0kxeU5xWFZrYXJTalZUVGJVVHh4dnRMUU9sQTdsYWo5dHFBZVNRVHdLNjdIQ0hxRVVxVHZKN1VvZEoxTFdqczIyRm9uZHRPb2QgZ1F6MFMyTUJiaDNnbVdwaFpNd2dIZU1XRUNEaDRvejRUclBFR0Zkalg1ZXFNQUE1QmhpQXJhRXVmVkhURmYyL2pVMU1xU0hGMUFxYiBhZ054SWNxUkUxeWh4aGIwU3Q0eE1xd1BNWUZ0cWd1RmFOQWhuM1MwTWVjNGNKT0lPSUREa0NBZ1luN2JPQ2VwMlcrR01MTG8xU0w2IGxvZG8zSklzNWJqNmNBOVMyTXdwcjdNN3dPQzNaRU9aL3FXUGdRWHdveksvR1JsVjZoK3laeEJmdkFuOGQvNlNkVDZzTXpLdml0ME4gU1E3SW1WZmFoR0pHeWFyVjJGd1Y3bGJBSUdHUEQyUXRzaUV0cDVqdExhQUgvYTdSVUJQaExzaytBOXovQUQ0K2Z4YXNFajZhV1BXRiBOWkxMTThnalNNNmZDTnNjWVN3ZWJJcnpUa0xkOHFQbUY0dnFjOUk0aVQ2WklGWXlmVWd5S2UrYXNZc011Mms3dVJlWFhIWDFWMG5aIGRWcDlOdm1udVNraTRkNmlYQ3d0VkE5czd4dEZUcTR0UGNIQ1p2RkpwNitZZUR3K2VjY0JuS09UYjRFcEwyUDcrZkFjQjMvb2tPRHogSVpMVzVUdldNa2E1TlNBa1YvVXJzcnNLRUxxL2ZrTjhJVkJkbUZrSWZIMlRsdndHcFBXZUxQZ3daaWt1M244Zit3WWRXRU1ORjh0RyBXZXVtdVVNSlNjQ3E3anFkb21CNUZEYldCc0xWQUJNTCtFUXhEVDJUK1JmSEMyZ2ZCaGd0WFJsbmUvOEFmd0FBZ3IrR0IvR3FOc1BrIGh0T01qUllNdzJldTRQSmQ3WXVET1lGTXhzSlp4VjdVSVRIQ1paQzI0RDVqeFdsUDdHeWNHN043bWo4SU40L1gvd0N2ejc3MFZOSUMgVXpUVDhOdytFaXlOV2J5UjRtdHdCY1JrYXhheWZpaklCNm1mZkppQ2NmQ1JSd3h4b1JaOXVMRzc1REVWMjJaanVBUHpRNTVTU0s5cSBVUG1wNUt2U0ZiclptV1lhSEs0NG9HR1FEc2o1dkNHUFQwZlZMWUNIT21jbEZ0SlRZM1oyU1FnQkJ3UWQvd0RQZ09OWXNCc2dXd2huIGtPd3RoVWdNbXB6THRuQm1Ec2pLcHg4YU1TQ2ZEUkxndXladzlXQTQ3NHlNM2VRVndYaEtTazJwMmk1OTREWUVFd1pEaHl4bDgrN3EgNEVJaHZoaHRpV1E0RFpERUhpZ2ZsRkdSZlQzQ1pNb2Q4WU44YmF2Z1FhM0dET0w5ekFadEpkanFEZ2ZQN0I0RHBidURBcjVNd1BhRSByTzdNTGpJeU80ZFBNVmZMRHZpdlEyb3VwWHo1Z2RiK0ZlOW9QbnVRZkRpZU0vb1pHcXQyZGplTDhCL1huMndQeVdDdkUwWU41b1VRIDF5SjJ3MlNCZjZmNUhQRjlNVVNCa21rZ2ZBNmxZM0tIT2tVVXl0UVhpVzFJUDI0ZUc2bUVjaFQ2U1lXNldNcXEzblJja2JjWWVIWVMgKzdwNHVWTWxjRFlJYTJHbHpHUmdaSzVVazlEdFRBWU1LRkt6cUFIK0xqZ0RIZnZBQUYvb2tydVErSWN4cWJhTVNTVkJabzF0WWFYeSBGdU9rSjR0b3JJOVhMSjk4L2g3WkRDK24zRWV0RkRlR1N6S3phYms0eWNxNElFT0h3RnVnY2FpN1ExRjBWWlkvVVFaeGRnTzVWS3F0IEZidS9jR1pucjZSOFcwV3dDTE1NQzNaQzNaRU80Q0V6ZnRIOVN6akZtRTFmVG04b3lPYlNUZkFlN3RSZmZnSFBsanZpMkJWeHVWQVogTElzS3hxckNMMmtlMUVPdjBsd0tGTlFtMWgyQzROUGVvU2s2NFczQmtPSHEvcGFkVzZ6MzQ0TlpuTmpZUHovQVVId0hQNDJaVmthUCBjY3V5SUxBNVRHemVMZWNoeFg3czN3c0xIR3dsOWxvajl2RWdMcWUxSkw3SytUZzJYSGl1VENwRGxYaG5BQ201dFAzWkR1bEo1RGNBIGVHd0x5MmV0RjNya1d5TDhPdDZncE8xRSt3WWNHMjdRYlZWOFppZlBGbW9BZk51Y0g4RUVCYnArb2tKQzZGYnN5dXpaQ1ovaW5wSUUgRGFrbjVEWFRQSGxzQytNTFFyOXIwT0doMXUrQnlGa284L1ZoVXYxbTN4WlNzM2tHRVNlY1c3L3Y1QjJFK242L3NUYXF5VDVUdnVUcyBCbUpCWmZxeGJrV3d5QzVTKzVTZ3cvQ24zeDhER0NFeFZ0b2hROWpibjcxZnVhUFZ3VDkvUWJkQUgvQUg1Nm9paUdGSHNoNnBhM1FMIGFxOVZreEhCUERzRm04OGZJYjRVV3g4eXlJYTJ5VU80YzRBdURiTzNONXEvblR6M1JxNUlSOWdmZ0h2aS9kT2ozR0tzMzlSRVNRanYgaWwyaVFvaWs3ZlRUTnFURTRaKzVzdUI3RXBZeWlweGpISTJFaWUwZHk0bnpmL1k5ZGxtTkdvQVduMjFlYVJoVzREVFNTMDhXRUhkcSBsc2wzWkdnQzJLNzVhakF5Y0RXM3g4cCtZY2ZMQitEVDZNemNDSmtnYnNrOEhZRDlSSC9Qdit3R3R6cmRYbjNET3hBeTZDMVE2YnJVIEpNUTdjckFtTWpUYlNuRlBJYWdZTUdiVXVGT3I4UnFaQTRLYlVZV1hwbjV5dGRyL0FHeFA4Q1BZUDZEaWVmcDg3bDF2blhJQlc0c08geUZXdExDU1hmbmt3aDhOb3Rvc0JGekY5RFpKbEptSEJmV3dlNEFXcGs3djFmM2ZSa2MzYUtTYisvSVBQdC8zK3ROazZqSzd6YVRNViB5K1ZYZXJKcUhkbTJKSWRyK1gzZmRFMXNvZVV0dUZwcDRkYnhtVitIK2VRUTNmNk4vb2FjdEdycXU3dW9JQS9zQ0Q1OHBBanlLQ0h3IFQzQ05OMUpNc0tYY3RNWGpvNXBpMUYxTjg5UkpIVU9NMEZ5WVlUTmg3TWVaWWFheWM3VVo5cERHemx4WkNFbnRwNjBhSHI0WFUxYnggSjljU29nZXNheHNsaHRRbXI2ZytlWWR0a011eHc4R0JiQmdUNTVybURHZDhLVkNqWXBXb2ZGSUF2ejlpL1lBRDJCN2ptRDBkWGZHbyBYUEpWS0hiVUtycFkrc0xJamlYQk5RMkZYNGV3SjVpaDRmRC9BTHozUTJOa3Q4WVVLMlpzWnMzc2JCejQrZlA3L3dCYmJHU0czVG9jIHlobEJ0RkthazYwUFZNQWZ3SXhCVTdIbEoweTk3czArNHlxR3Z2Q3JJSkwxWVQ3ZWgxVXRZZXVtU251QzlWV21mVStud1hwOUhyNUIgNmNPMHJJc2pLaVcxTG9LMUFsa2FiM2E5VjVncVRPZUJWRWV6RGJRdWsyQ2ttU3lObW1KL3dJQkdBcXdubXpNSDNGWUJoTHM0UGlmZiBrSGY4VDc4ZlNTOERZUnBKbk1pQkJKSUZnWFM2ZThHUlZRUnhTTnZIQ05JMTNhTnVvakE2bUNUSzVtRG5hY2xqTEZFa2drbnhNY2JQIEVpYnBmYWVtWlJoWEM5NTZOc3lITWQ5TjU0QTJ3cTNwblVPcTJUTFh5VmtFRWVaWXhTSktjdHZEaHpCaVdZMmRIUFYvWmU4c3l6VFkgdjIzc0lFT2NmMkUvejVCUDlWdnNTdTVITkZXZUdyRmtocTU0YkV2QUM3RDZjdmxvVEY0RHB6bVZlWWNMaHV4UFF5QWNIdUh3Wm5iTiBvdVR6bkNhdU9WRWZBTDZEdjUvb3FTeGFXK0QzWGlXcWh0ckVvSFFMWlY2ZjQra0o1KzBMTmluNjNUNGI1U1ppcXc5Z09DcnVENVZiIElUeEYyZzhzMnlBemV3ZnFBOEJzRXcyWmxmcmxzS3RjcmcwbFdGcXc2VExKOWJvV25kZWZJclJxRVZ6eUd3NG9mZUNaYWpCODVENGwgYW1HS3p0ZTVnK2JHMGRCMkFBZjJCQjJBa1ZvR2ZDWEpGZlV1cWJtNWo2MjRSZExWN3dBTkgyWFhOQTVHK29kcFpJa2pkdHV4SDJ4biBDS0tNWXB6ai9IWjdqN2lQaXowcEdsUTVjWURCNXBWbGcxV3F6RFRRTW1WalExM1V3d0o2Q1dCTTVjUmtMdWJuNm1aNG0wNC9veTF1IEl1ejByMXlaQnBhUFZKUHJkd1VpTVFBeVFsMEZuUlBuMFhUZW9MT21uNW83WnppSWNiS21ZVisxYWRXYllzWmJLSWplZmlaSUJ0OVQgbUVtWmRlRVJnYVVKeU1pdDFEMFFsQVFOK0FjaFJmV1daRFU2Wm5TenFrUWxEcnRzcWNUSHNoc0t4R09XNHRoYXE2RmkrQlpveHA0RyBwbTBoWmpSWTduazhXYTJ6VjBUVm1ySXZteE1XU24yZzd1QkpEcjdVVUVzOWtBcVNRUHNoSlg2eUQxelhPc1ZucVZQSVE5UXR3V295IE9GZ0dMR0EzQTI0YllzdEJTczhkazFlOXF3R08vd0NKOEFBZitra3RyZG1OQXZPc3FvSFpiRDFmd0JodGlZZUhYSFpDdXJpUmF1aGsgRU5rbVlzaUc0TW50cUFiYVBjT01peGFNamQwZnZCOUJQKzNQVC9WelpoQTVkM1ljZlhKZ2t0bnM1MnJFT3hrbml3VEF0b0xSSEtHdiB3NkhmRnR3cXB3UXpsU2tMYXdUeWJ6Vi9Kbm5oS1NiQi9YOGJkeCtnMUZTZGtyY21CZUhZRFY1SWxrd0tmVzNkUG1hYVpDOEh0QnlpIE5BdVk0R05RaGl0MlJrWDN3RzJqK1ZKKzU3V0xLQTNid2I4Zy9xQSsvSDdqNVZsU0pGaGhlSm9pNDNNcnNNVTltM0l0REdUdnF6Mm4gb1pFYUFzSk40VE9qcEljWllQSVhFK3JHTThlZUY4WFJJNEhUNG82bzFNOGwxN2NsTjJRdHJjcFZzaFRxK3dqRmJpZCt0Q215bHRRNiAvTVRIdmpiNFBoM0ZnUFEzajNyUGEveXBzbUp5M2VRQU9BKzNVQ3QwSFpGZzFmYldWQWhqYzVTbS9MMVVXMVd4QmhEcThsZXJsWGNMIEFXNGU4V1J1QWRIdHNoUzBHWThreGR5N24rb1JIQUFENEQ5L1lBQ2xmRnVwODE0RHVkUzJSVytvU3djNGF2TU15azZuc0psRnlrZEQgUFVOOHhQdmlueTdnbm9menlDRzhZbEJsb1ZlalBOcWZkbmcvNEFBZjU5MTJPbHMzNVVGZ09HVVV5WFpxMHFuamJaVTdWcHF5TFlmSiBVVmVWMmxrVDNBUDh4a3dxNkg4QlA3NFErNzVRb1Q5M1ozcTU0QVZFZjJEbno5MVpTZkhIMDlSZXFSNmtUc2pnQlBZRXlPNjZmWXVVIGVkbmxjZVZzOExNcWw1WWM0V2lEaVhLUjUycnVSOFZFZTVYY3RON1IzR3V1MnI0ZXBTb0xFaDZqTEw0M3F1MDhMY1pUajJFTnNDd2wgc3BGdGhEY3FmSHVFTXhERWJodmtCZytEdGpNTGFDYXppa20rRGdQUG45LzJBQVVnMHBnWEUvT3RWTU1WY2s3OUg3WG5sc2V3aHlndCBzS1dNbmp6RnFCMXZqWkF4TzRmaXE3bVRxOG9UUmptTzluQUZRbndIMEg5ZXhQWk10RHI4UGx5WWRidFNiVDZrSllKaEpmc0t0NVZqIDA1Y25KR0NITUQyckRXMThQdjRBL080eXMyZ0xSdk4xY2I5OE9BK2Y4L0EwbVBwT3hoL3lxdmFyYWZKNTVTZDNBd25JN1k0VnpLNHUgTHRRK2gva2hraHA4T0MrRVR5cjcyWitUS2czcEo3cUlPd0FENTgrd1lIMkZWYU9RQ1BhUVBnMGF0Y2JZbGNTaTBOdXNpU0xhN0JzViAxY2JaT3JOSThycC9Hem4rT3lwYWg4NVVBZVJXTmM5Y1p4WFR4WlN0c3BObWNEZk01U2QxOEM0ZkwrTEVpQUQ2MndRN0lXNGMweGh6IG1Bbm9jRXh5YnRlelluSGRKU2Y2QlFYN3dBRHFlZkVjZ0xJRWx5ZllLVFlWZzFYVXRleDZUT2g0ajRlVjlRaXVMNUE0OTdFOVBaQ0QgaE9VckFQUEZrRXlSUW9zczFWN0liZUFBQUFmQUFQQUh5UU9ReTdHSDE2a0pvZGJ1Q2ZxUUpPN0JVcGkwSGV0NjVsYm9tc2hCalc2ciBNWHhNWDJSSVBENTljb2F3VHhhUGFxN1I3MlBIN0JzQi9ZT2cvTVUyUUN5V2RsS1JpU3RxVFVnTHl2TUpjM1QweHlMU2dNd2V0cmNPIHlRL2VCdzVhNFBpUE1XZVVDMFVwd253WUFBQVA3K0E2RXNaRlZFZEhjV3lCMk1lY2JWaTRPTGVhTml1Mmh6ejBjWVZLeHpGUEdYd2YgSDFJd2M0ejJtOGNnUTNIdUp4NTZaQy9nRGFPZVBtOEJFOFhXOUZMdDhPMjhPNkdlaXl5am1ZSHd6RmtRekVQNGM3ajlsMXl0OFoydiBqTzloUFBvTy9ud0Q5ajBIZzdjS2RyNjlpMjBOU2JDRjB5RVloK1NISUwxd1Z5ME1JR01IeE1WdjNVNWk0Qi94ZUI1SU1aeWd2akx3IGJ4Mk5CQWVmNkc3WXI5TGdLaEp0MDBzakl5SGdLU2tLN0kxV0FKVzN3OVdSU1ZaREFIcmNPWUR2bGdXb3FueDg4R252SXRYS0RPY2IgSnNaLzJQOEFuOWc2dEVRdHlzN1ZVeVVCb1Q3c3JIV2xNZjVjZUhmekJjWWUwTjJxK1VZSUo4TkRodmpnUE1WeStlNnJEMno3TldZSiBLU1RmUG41QmZ2N0IxbWVPSTdVMHQ2blptalFTUTkzMHQ2VTZZcElQbU5NUTdUV1BPT0E5M1dqYzFNTWV3Z2ppV2YxMGgxRVVTN2lQIFdMTEtrYVNHZ0RsdXRMV1M0WWd0a2pWZEh6V09uNGFHbWdXVFZGcUREMmpFNHJZVjRXRmlLb2lKUThXWVBaSnRKbUszZlBoMGVCSHQgMVZvYU16Rkt2WmhuZEVKYU9IMzQrL2VBQWRROVpuRjlqZUh4b3REbG9GM3dyWXM0YWI3Q1QxNE9MeDdvSzhOZkRvYmhzOHpaNThENCBFQ0g5REYxbXpHKzF3Ukg0L3dBQmZUL24rZ092N2N2eXZuRFVWbTE4cVZjK1ZmWnlURVQ3T3F6dDZZYUlwYXVTa3hmcmZrbFYvRGNHIFNkM2hyVFp4bkEwTlpKdkFRSWtQR1AxL3dDRHNFd3BNRG9wWm1UTHRBa0VkcTVxdGtYaDlQM1l3TmxrSzhwSUZvYTM4T3E2ZmNERXggZm1RVHkrUFZmZDVReGZHVHB1MFRmZ1BvUFdwb25ENmhaVkNzWFNNU1hlYm1LS1dPTlZvQ09NYnBWRnliQ2liT1ZETHYyMExZd3RzbyBFL2lvbjJteWNqWGlxNXFqMXgzQlFkbTJOWDkyR2FnVHdqSUJHMXVKNzVXRklFMXUwSnJaVjU1UTVKRXNpWnZDL3dCeGdOb1R6dTVMIE5vWEpVQ3o0UUljMzdmei9BUGwwcFZQaStWWkJKalNFTTVEbm9jWVRIU1NROTNjSEtWV1N1VWlXQVlEcmZjaXlGOHVjc3VuMUxaOFIgbE5GQ2ZCelp0SkI3QjUvZi9BWExxT3pCN2t2aDgxamhqVU92czZ5Qk5mbjNBZTJkK0FObXVVWGtEZ1ltYk95RHc3VlArZWNEN1p1ZyB4NTdYSEhaNDU5OWZQbjhPaEM5S3lmSW9PdlorYUhqS3RqSGlVci9HZGg4TVBLS01QMDhoRFpQbUdQcmNGdEh6MVZ3R2JvcnJETWNDIEpQN0F2LzJEZjdralppRWJ0dzhIemxrQjhjVldQNVBucFFrUlZEWlhsOEhpcXIvVzd2OEFYUUhWN0pianZrZmpsMkpaTjNhVmh0c0cgS3htV3hMaHRGdGZGVGVIOXlLVHF1RVljRE93ODdnc2pNOGs2djJ3NXdsSkI0UHlEdjUvcGtNRndXWWtBOG0wS3FjSXcxakxvQ1FQZiBJY2VzcklzWlgzVzJrOGduL0RjR09Zd1RKd0Z3QTJOeVlaOUc4Sit2Ny93SSsvY0JGUTZtajVTL2t3TW1zZVNYZERXM2NQbjV4Q3dvIGJsWE5ncTdTeUQ0WWV5T0g3aDNVNWhzYmdUNHVMV1NleWVjLzM5N245Z2pheTA5NWx0V3huVkpLSlNWVXFoYnNIZGx0WGlURllXVzQgdXlYQnlReGh2RmdHQWJhd1ZLcWg5c2FWZEdKL1NRZ1Bmd0dHL3dENjRUQlJSZDhVSGJuVjRSaWhHbFdMeHR1YkZqaXVPU2NYa0dDUyBQSlJWV1M3azQzSEJ5N2MremlqV0k1K1JEanRVQ3ZLek1rWG0xV2s1T2FZQ1Y3WUtxMVI1Y3dDVUxsSExoNGVaekV3NEowUDZlQmExIHNadXZPZUQvQUVrSGkvZnYrd1AzVGExY0k5OEMzQ21WZG9kcXVwbTJxOXE0c0hmQnRIcnpJZUtKRVhrbmVBTytHSWNQNGM1U1lBSU0gT01laFRRTWVYZzJiOC80RkIyQUFBNkNEaERNcVZQbUJVMzQxaFJiQ0lpcUhha2xIcEdHVUEyRlhNVlBjTElaSm1ENVpIellLSFg2ayBjTUk2eStVM1VBeXF3dXliQnY0QS93RG9mNm5WWlNwVlNRRkdXcDFBeExoUFBTNGRnTjF0V2UxT05uNDJEWndzTFBNVld4MWJqakJpIDJLRFVWSUtISFdjMERTV0FCMndzL0gwK2tCNmZldjhBRmg5YTRwRkNLN2IyenhSMDV4bGZoYnhrNTJxc2ZhK1YvYmp5ejZmdWVBK2kgNWNtUVM5dUVuYVdqVVdjOEtGdDIrNGR2NUY2djlmS0VOUE11N3RnTjIyVHNBRzFCOHR3ZkZkM1Y5NFgxdTRKaGl0M0RrZ0toMkNwViBWRDNOOHRCWlJuZzJiQ0hINEFBMkRZQUNEMDRNc3U0QVJkMmNjbUpNeXZocnNwME83L2pJUEtpeENpYkRZRnN1dDF1NEIrWU5SNWZiIFZYN01MdEJHR0hBbnZzQjkrOS83QkF1RG9ycVZ3UTVWZkdFcXlFZ1BKNHVodUcwOXI1VVN4eGRiaitOdmkyWWh1RVBjUDBaQ2F5VXQgREhmUHUxcS9sNDhmUWNkLzZPMkJIcmRYcnNPWkZ2a2F2YjlmRnRTdGhWV3pFTU8wQVY1TnJuNmZpbm9jeGsrWjgrd0o3d3VFeVpRWCBjRHlqVmNraEFiOEEvb0UvZ2Y2aWxaSW9SSG1mcUVXU0V1bUdhV3RNQmt4NS9IeHgrUjBiTGlTaGFNdkZVVEtqWjF0Z0FNVFFyT3pRIG8xUjVQU0ltQ3g4Q0hUTEhYeTB0ekpXZEdsdURJTllLOVpIeVMySVlGUElJZW9TYkRtMnBpeUEvME9CeWJ5cnRISnZ4ZHdqNkNnbncgRy80ZE9EMTVZZGREM01oaTY5cVc3SldvUlMwdFBESk1JM0hXOFd4b21CUXd3TWt5WXRodzYrNE5VQndiVWNPTXJOcEtNeXk4RzZ1MiBOQmZyZEFQd0ErQTM5RzhzS1pzaHFUckh6cE5ZcVJpTExIbUxDZUZNdzBQaThVNGU0bU1QNXlHUVpKd0Z3UFg4SEpvM0tDYk5zbXlQIEFEZnovdHYvQUI5d1BDdnN6Wlc5aks3c2svNHBKU1NMWWFwaGlXeUljVVRkelJEL0FLYmNLM1c4WEN1Yk1ZQU9MSVRyTm9mR1paT08gd1R3Q0NmUDdBZjM4Qkg5TXI4M2ZjdmJJdFY3SDV4djU3VGREOGRMZFkzTFNlKzhVd0F1Ujg2R3lpL081ajNOZlpoN1d2aFZwZGJyOCBVdzdGS2xhclJaTEJ2TDhINW8yUFlWYnRFcXdoZkpLdnZpN0VPMUE0ZjNnenlHSU53Um1mRXJVQ3lqN0ppREFJUG4yRGZ3Qjl6V0JjIEJHbjZyVllFcXduYXNVak9DZnhBVnUrQjJFeEZUZUwzSXRrR1JQMUlHREZiL0R0VHVBMi9EV1ZuZEJndzU0UTV3SHdEOGZQb0hTQkkgTDc0a0EvZ0hsQmJNUUZ1TWtibVNWN1loeW9nbHlQV29RWEVPSGRsa1dRbmg1Mm1uZnB6SVQ4cDV3SUVTZVBnTi93RGJ6L1EyanNsRiB3SkZoQ3pNd0lSeW9ZMWVEaDJxcml6SmNvR0pGRjJSWDYzYWdlaCtZRDJTcTN4ZndPTW5PV2o3TnNuQ2ZQbnovQUNBK0FQZ0NtVm5rIExxcm5jcmVWRnl6eEl3dmxRdU52WEJ1L2l1aTdRZ1ZuUTdTSkhwNG5iYkcycDlva2IweGp4WmRrc053RHpUbXN5WXZxNGV5TEJNMUsga2h3Tm5KTlpFRlVEU0FpWUxxVVMrUkVNaXljd0R6RnRnRDJNQm8reTRQNWZGcTVQOG80V2p6N2Yvd0IvNEQwemlPWTZLVmtXZGFHViB4dVlCWlBsbUE5U3RGT0xhdlVvb1hiUzM4TlBRNGRiaG1EdU1CVDN4SFErTS9XV2M0RUNKSU5nUG53Ry9IMkJCNnArRHV3T2VxZkVOIHp4Sm1PUzNWMFN0OG13aUJkYlExZDNsaTRiZ0htTWhpYStFTUlNK3J1S3JhTndNb3o3R2toUDZBQUgwSHBrVklqNVFZV2VsSnFUVXQgaFZCcDJRWmZjR3g2M0xPRkl0QW5HMmc3ak5ROExIN3FEb2JWMi9QUERnc28xWDdac1p2aENNQVBvT3dQeC84QVFaRWNiY1JPNjQybyB0UWtnM1pIditObzB0YUFwOGhac0ZPUlhVamtpNWVOblNxK2xuRFlKRmRibTRRRzkzWmp5S3hKODlHMWZwYnBsWlMycEpxcTdPeDc1IE5aVitZTVNDd2RvcStKWE5OdytZVFlkd1RMSUlUUWJhbmdRVnFFMFpEUTJaR0J1eHZmTmdBYitmZndBQkJaQ3VuNmY1K29nOEJ0V3AgSzNtVjgxTWt2c09ucDRtR2U3ZTNKYUtlUXJlSFc1amdkZ1RJTS9CdU5zaXk4dEhrOWxDSERuYUxmd0FDb3RnUDB6VDE5c1k2RHptZyBEWnEzVmVxVVBxclhrZXpuRDRqSW0yMDdwcXVucjdoVzdJdHNrTndXL3dEMHZ0a0FOdWI0cjlzd2VJVFVQd0YvMzhBQVFmQU9hT25vIFcxMG5PZDJxU0hiZFJSSmhJSHBpdTJWV0xhQ3lhQmZDQWRic2l0NWsxd1EycUFRYlFiSXpEUHkvL3FpYkIvOEFmeitHd1RjbmN5SGQgMng2bW1FakdXQ1NYVWRneGFLV0JhakhtT1JYZk1GN1ZNUmtRZ1V4RXRBOHRwcDVtZDRmUWgwK3IyRjBybWJNK3BOSk9Va2l3QWoyMSBPY2hjQlVtUXNqTXBGd21MazhDU1czZUV5V0ZXOFA1Qzh0Z1NpUmFPTU5mVzVpMzh5R1FoZ3lEQldudzlzVjN4NVdYZ0pWenNjMy9IIGY5L0FkTzFwWkY5M0YxaTd2Z0VKTVAxNmt4S1B6b2Era2JwS3RpVWhtSEF3SHNkOFQ5d0QxejU3NWFNcytUSi8xdDU4QUFmdGdBQU8gaHBnbUN5ajRuL0FtSU14ZGEwbVhaQ3FrWFF2UTkwc0lXbThnMmU0UG1YeHZDcTJzRnRISEJtS2Urbm9tY0NHM1lIandIMzdCOU5vTyArV3BVdXB3UGZwbW53Wm11WWVwQjNrT0FFZTJmRjArcndHdXFyWCtlY3dtY2d0UnF0cGZVZ2I1V2ZGMWYrdHU2TlY4L1FRSGdENkVBIGpLaktIa1YzZFVlTjJXYVdIY2psMnd5bmFaYTlnb3NYcmtDdWJFUEhHa2NVWlNCQzZzZ2N4TlVjVkZZeHV3eVhqbWJaY0Q0QlU4VU4gbENENEx0QnA3UDRPOU11OWUwNXdjYTRVdlRyNVVwNTNwd290RUh4UFQ3VWgxdTRQa0VDUWZBZTJXKytYdzgvL0FBQURZUG9QUUhYYiBSWkdxV28wTTdBYWpic3g1TmtMeS9EMVJNRmhNZ0d4dFBZcUxNK1lHcmZ2WXlWKzRUaDlmei9tVyt6Q3lxTXpJNXp2WnYvNWRQMEh2ICt3Y2VYWGRxV2hRNWU2VmVHN2FWNkRITnJEVEFDNjhiQ1dvdEVOc1Vvb1lKN2l0c2tQYjVtbzFEcjg4MWR5MWhvS2RzL3dCa3h3dzMgL3dBQWZBZE1oenJCSEMzSXlPUXVnV1N2YXZXNDJtVVBrVkxhRzhBQlZaSHNFTWNZRHpJY3lZUG00cVRBZW5PSlA4RGs4VWVyVWwyTyBQMndQeDhBL1l2eCtLTkszcE5LaDFKelVTNmFmY3JDYlR4ejZhZGR0OVN1b1g2aU5wRXkxRzFRRitwZlViNmtDU1ZWY1JMak1BNENHIE9TWG1Oa0E5TjR4aTJMeHhRN25OcmFqcVB2a0pkTTk2eUlOYi93REVLZHF5ejFWU1QwdXpIQ2dXajFhZFJlb3UzMU1CREMyQnFCc2QgUmNiTmxTMnUzR1FwRjlDVTRXbUp6YzRGWTBldnd6RkNubTgrUkxZQzJkWGxVTlRHbU1jdGcvVmJkbnhLM1ppQU5lblFJdHBNVkdHMiBCeVZNRjRWQlZyTkg1TGhxQ3BraXRydGhCNFVkbERxa0tDN2hRV1hOell3bDQ5VVhIMHBxYm5TUFJYaElMVVVGTzRCWUZmR1A2UDhBIDEvWFRmbzlUZmVKeTMzZjNiVmVlUC9hL2ZqL1FmUEhsWVBSNzhWME93cFF2S0pIczB3RWxQQjZnVWQzbUFWZXNpbElHQ0JnUERtR1AgdmlPQkgxcGFqaCtMaWlPTTV2OEEyQUFmQVliQS9BTHBMYXZjbWJXYmdWTTFqR0cyRFNhalU3d0JzaW42Y3RTVnBmVTVTSDIvbUxSaSArRnUxUE9RT1c2YytNdk55RlZsNi9UOS85andBL3Y4QTBzVnNmTXNHWWh4UTFHb0Z6R2UyN0RUOVlvY2hoY1hQaENhcnNmYmRiVzRjIHhESDFXajJXd0tRUC9TOURacXpSelpzSWN0M3dCOCsvQUg1K2g2clg2elhMUU1NYVE0UnFIN01FbFBsVFNIZDRmWkhhK1NkazN4OHMgaXQyT2VoOXkwNUQ0ZVRHZHI5c09KUENUbkFiZFBnQUNDZlA5TmxFYnBKdDRHc0YxTExGS2tjeU5kUlRQRWsrRWIwYkRBNWtHaU1UMCBwSnBFa2hMU3lPN1pZRXZDWFhFUmxzSTVaSXR5K0MyTERFaGI4aThzZlJ1Q3VEVnBuMi9LZHF2MGkyQ2RzaVhaR3B1eUtmc0pQMkZlIHFhNDZnN2p6TlFsYnA1a2RNZ2djSUJ2azR6REhCbXhka28zdng4OGY4Q2Z4UHF1MVdEVmdaUXlWYWJ3cEhxdm1WdFRyQW41ekJMNGEgK0NiUXJsdy8xVW1PQWRmNHJQSWJHeU0yQlJYSnN5T2J3U2RnNThBL1lEL1ZpcUQxQVExSkhyZXRLMHNsYnJkeTB1cmVvU1FCSkk5cyBMWUVyZk5YM0xaQ2UrUTZyRDF1SHI4UEFiU0h3VEZtRStMakZubXh2K3ZrSDlELzJCMlZjbnVDYmxuUTFqR0pPVG1VUEdyMGdZcjIyIEw1NWtMckpYS045NEovRzNCRDI5YmF2NGdKOWN3eVl5cnlqdzg5MFFuT1Q0RGdMOEFBSVBWYU02dVJRbW8weVJhbEhtZ2dqaWVKdFcgSTlQdmtUcmc4MGcrcGpqaWtLU3lQczVpUE15eHpScmN3aDA4alNhWnBuMCtBTFRCSldnamsxY2NNTWtlN0xIRllna25kY2xVN3V6WiBXTElWV09SZmxpUUNGZXVUYU5wUE9yNjJodGhHR05QWHl5SEZLTzlvVkpESHA2M0QyZXR0NFZqdy9UeHU2TXNLNHQ1V1FhUzdKTlZvIE8vbjkvd0NmSHovd1lTVHRQNys3V0JwTXRUVE9ZT3V0Y0h3SUZiQ21GMjlpbE9PY2k0bDBUYWJmY01SaUFGNmViajUrdXBaTW5XTE4gaVVPMmY2N1BPQVY2d1YvMVY4Q1lUdU1kbVF3OWpWZmJZc29CRzUwcHdXNGkrbjVMakVtQWNWTzVEeGhnRG1LMitZdDFmTmVNV0NlRCBaR2ZkQmZKa2RKU2RQRHdmZnZkK1AxRndIcmN5Q3FyeWtlamRQSFovc3lwS3FrdzN4cW92aFBzMWJ0RGFkaGgyaHA3b2RQWkszWkhDIEdqd0dCdDQwVFJyazV4V2ZtM2JDb2o1L3dIVlRPUkpwOU9yT2ZxdjdycUVRUkhZalNGNVJxSFZwNDVKSTF3SVlSeFBqbGJzdmFIdU0gNHdTU0dKUFNqT3Boa1VZNTdwR2FGZTZzY0Zwck4yVGlPaFd5R2lvNTlrTzFqVHh0Snc2NXRTTFp0SG1YQ3AxNURUVU5oQTJnaHNHOCBQbEp6R1FlWW5OdkE5NEpzeUc5c3d6bXdNMkVBSU8vZ09QN0JoYUZUb3hQdHE2R09vVjNnTnYyaFc5eHRjaGJHSUJaT1E1ZDJwdFRWIFduVE1McnF4OFc0R0lKdHJDZmlIWnNId1hnTjJOS3UxSHFKQndBQVAwUDRWa0Z1ajRHRGgwaFNoeW1wWE1KTk9PR29UVDI4SkMyS3EgL25oNmsyQmtUN1REMm1oMC9EZUtsSHo3VTNONXEvYzk4cTYwUWh3Qno3SHREN0graHNHOEE2enIrN0dPczZsdEdIUHNoSmw5bnp5dSBKaDRsS25GeGR3aG1KaUZaRzRMZkJMUTRPR1dLelYyampLUCt0Vlc3Ym9CZjJCK2ZrRERRWTNabGNuTjIyb21hcXVzZ0dxeitUeGZuIDU1NkVTb0ZYY080amNoQ01jWkZ4d2NudXZISW1xNXNteDFhNTBUN05GbzluVkNHenBOcHJpSHFackpvckN5R0NXbnVUa2tmTHJkZnggc2hQRHVBZjRieDJQZks1TUU4VmZFWjV0SlNkZ0FBRDZDd0lKOEFBVEsycm1Nb2dxbWJ1VzdhUEM4NDJXa05RMGhFTVdOdTFjeWpBOSBERHNpSFpESXZtUG43OThQRm41NHNqTjdCbTkvNUFmL0FMQjFEcll1UkFWMlE4QmF0U0FlbThwU3BGcGNEdzh0RHE4V2oyTksvRzlxIFh3bm1FOGc0SS9iL0FMalM3eVdlVHJPeGhEZUNPL2VmUG9PSHYwNVE1Qll2aTFkUWVtRFRscHd0QjhhMG1wRjlQMHNNZmUwT0JxYXYgV0FDbitteUdNUkNSSmpDK0kxMFU5YkxTR1c3ZUdWYzhrY1VuRUtjZmNWLzFMNS8wZ1QzcVhDbEtrYytidU1mVVJMeXpsaGo1WElZMSB1QSs0NVV3NDg5TGJFNU9zbTE1NG1reUJ4aWtrN1RpdGZ4WXR3YnpCK0tNUXB0aFFDcDhjNVVOY0pSNElKSVVtSElKQ2VybExDbEFVIDRmRG1NaWZhZ2VmMjViV0NBOE9DS3NpMmxtMlBZd213Yysvei9VUGpYQlY0YW0wOE5mR1RKRHp5UTJJUGFsVXdKaHBwNXRzWUM0RUkga05iNGU0TDZlcTlyNjArWU1xRGl5TThuTFJDZXo4ZlFUNEErQTk4RnV0MCs4WHdESlBndW54c09CWkZrTDBnUHB2VDJHWStXaEVQTiBGVkwvQU15WWh6QTQvRnF4SDhIVzNsbTJ0Wi9aRFp6ZjM1K2ZnQ0MvSHo5cTlPV25tOHRUemZXMm40VllzelQrTXJmSk9oUU5tSFVnIEpYRk9NRVJGVWp6YSs1bUtlNXFNbG9zelZjMCttNHNYNjFDYXhacU9IeDlIb1luNDNYNFBNWVBTYkJQMVlWOFdhZVRSL1RPS25nOU4gRUsxNkVwc2s3ZkczSjkyVDJncm1RQ1lNRjJZSnR4STVGTXF5OFJzVGpKSHRTeDVSeVUyTE5lV0JvQUE1Q1VOa3NUVDZZN3FXV05keSBURzFKTVRFQ0JjR0VPZUF1NHUwSVk2SFE2MWpNWkYvOGxWZWVWVnNZc29iUU1KNFlCRFlSQi83QWY2WVZzY3NnQ3c3YlZUS043U25uIGFXbmtVa2hMTUlqbFRoNlZEVDRiSXQxWFQxcU9FTUdlNEcxVnU4MUErRE9NbzRRMmtuS2lQNGMrUDlJMlpWYnc1SisvQVppQmZ3dXQgd2xUZkR5U0Z4NFhjVmJLYmZURmdMZGJtT0hsNi9tVnoydlBkbnhqeXIxZXpFMGM0azdHZzdBZjJEd0FBdzAvNWNPZTRid3JyYVMrVyBFZWYyemg3NFByS1lMbFJMR2NrOGVHTU1oamtoQU0xUGpBQmFzU2ZGeGFNall1M051ZklPR0w4QWZrRS8xSGRGSzkwSW1qdmVpTXQ3IGVXR0RLK0E3K0d3Zkh0b25FNWNDeU8xeU5HN0pLN09oZGRzY2xNZ0JiWFhiWnNjRThkS3NQekQvQUJNbUJ5cVREQW5tMXNZUGh1Q1EgWWFBS256TGorQzM4eFBaSENaOEFnZWF3NnlzN1d0YkdFNXY3K0FmdjBQZ0UvcWtrTmtDamc1bG9aSklFOGtoVk5YcjV3VjlQYWVMciBsc2FDbTMwL01wK2JhaGo0WndEZUhhdm5GdmxHaTN2Tm0rRG43ZHFMei82TDl4Z0J4VG5wWUhsdWNwUTdHRHUwUm9hZyswekx1ckMyIEJjcVk0SjlxR0VOYmgvRHNhZVFuMk10L2xEYzJiZTZ1d09iL0FMQUE5bURERlNzbGlOQ2xwak1hWklGZXBKaXZod05USVRBTmdDVEYgak9UQzVSUzlmd3VCekRFeGdEdFFCZmZIaGpKL2ZGbEcra20vMkFCMHJIRjEyL1UycHpFL0dOUjloYVg3cnhvZG56bDdoWEpKL0crNCB5UlpvU21iVms2RmNZeFErL0k5MzIxNEpORFJsa0xJZ05ESUJnYmxxRFBROVNEWXdYTloxUC9EYUlvbFgrWjJUbU1pSERXK0I3OFBiIFVlWVRHRkJZeFpCaEt1L0VSL1lBSDBFK0FtWmdOMElNaDdOVFRxUzFXTlZhU3AyZ3E5Mld4OFBBWWxYb1laZ1pMVURzaGlIWURKaWUgcTdGcXVCbTJ2eGh6elp3K0F3NTkwamFUZUY5anNBWlgwQXd5TzFnNXhKZGpoOEIvRHhaUXNVMmRmcmlXNFErTi93RDRmdHlxSFdmcSA0eXMrYmJKanNIMzd6L1R5WkIxODBpMEhoY1U4N1BrOURqVmxIVlQrMHc3azRRZTA1c2kvMlRNVld0dzJEaXA3dExCaDdudFl3WnNqIHNjLzdCdjhBaUJBRnVxMHJLR1FUU2FZeURUTytNK0RZRkdDVWJ5eGF4ZmJRNU45UUJqR3NqREZJN1dRM2xqSmFoaytMeG9kM3psNEYgY2tnOGdyMitQVmE1c3RrakRhZ1BNanZZR2RnanFZZG9jckNQQzRZOWJxdHdXdzdnUFpBZTN6MnB3dDhZTDR5TUJtL3lwOStRZlA0NyBCcGJHRkRpcWRZZ2FId2s1MmNOcmQzN3FMY2VXNE5BR0pkd3RRMmUxQTYySHNuZURuRDdheG1NeXlML1k5a04vNWY4QVlPbW9odEJRIHlMMU9OdGxyWTJ6cXFWVW51aGZCSWcyR0VNcFlSUXBpd3ZpMllyY09ua0lYYlJnUXpreDV0L2dlUHVFZGdnTS83N0EvSHovU012dkkgaDB3N3pWZGljTk9EVTJnVnlrbi9BTGVMRjJ6YmlxKzE4WkxrQVdqTXhEc2VMUERIUU52cVU4TVVlbnVzVVhBRzZwV0hzd3I1KzNxLyBZTUdDbzJKUW1RaDBHTHlCTk03WHZTVkdaWkFsRGNzWVd0cnQvd0NKcysyU2doWTVGR1VMYmZxZUszY3Z0NXNESDhpNytLNSt2QWRIIFkwdUdMcnJKYlZWWHIycFVqbFRVUExCK0xxYlJLY0NCZ3d5T0V3eHdNMkJxNzU3NGpJM2t4bTluS3UvRVIvOEFZQUhzd3JRbU9FRE0gU1dqS1RnbG5adHRNakNPZkVsby9taWpES1RXWGVMSWhvZUxqWUV5REFxL2lyNGpJejRyakdZNWRnUTJEUVQ2RDlCdzM4K2g2L2JQOCBKMEFsTEdNc2pLdUo4WnNrQWJJSGlHUVhxQ0xmRURXQk1ROVBiaE1UMkNIQVErN1U1YldXZmxETjlKU1haSDJCKzRDZmZuL3FZQnNFIGxESjNNMFdEVzdhN0JYd0hiTlQ1MWhYUThWV0xBaVhJWHQ4TlBmS3J1Q2tpRXlEZFZ3S1FNTzlMUEYxbDVPYzJDSGY3L2lBd0FIMXkgUU9CbnU3MU83MXV5bkhjQ2NYSEpGUjRGRmcyVkdndk5pcnhpa2N2Rms2TUM2VmxnTEtFWmQ4WnpHNHRpd0J6MFMySzJNa3JtMG9NUyBOaDZiYXVQTkdUVllkcytVNVN4WXRiSDJPSHJka3F1WVFjYWQxU3A4OUhaRmtaenkzL09HemdNK2c0b1BkMEJ2NTh2UnlMUVVoemJhIGloMXZPZHp4SmhQc2o1VTdZbjFmRmwxeWU1QVl1d3hmRldMWTliVmRQQzhoL01yUEhuZ3daOUpDVlcvdno4ZlFYNC92L1MzcHE2SkMgNDZaTS9GSlc3UERPRmtmSEpjR0V3cFZYeXdOY3pGNE95VEE4eitsVU93TGErczdYYUJNWWoyalYzbi8zL0MzY2VwY2VVSVdyM0NsSiB0R2hDVFJuRzJGUHJHdlhoVFpQcjFvM0pkaS9kZ2RERHdxckloMVhVc1BnQXpIYUFwemxtUm5jSWt2Si82Q2dnQUIva0NKNThNdEtrIGJyMlJ1WmlPeDg4aUJHZnV4eE9SNDl3NDZjc0daTXJ5SStKbXBVTjF0YlYyZU9HekJBcmpFK2I0N1pEUldjOXNyd05iWEcycktyZHQgWHc0RjJrVU5ES2R2bkxVWXRzSHpIQzFBOUpqdzlqWHovSXcxbEdLY0dXZUVtN1JlUG9KL1lFSHp3RklWTXR0c0NuN0d5aHEySFRaaiB0TDB6cE56TkdwcFBUVG9rOUxReU5xTGFIOFFQOHpDZlI2bFZjTVlzb2UyRE9FbS9BZSsvdjJPSFRza1dSUStVOHFnRnN5ZFI5QXRxIDVVenVZWlE5NHpJZUZTbGRTb3Q3QVRMSXBNdXRWdXV6TU5QT21CU0NUR1Y0Rms5dFJnZkNNUUlIWWZvSEgvVUNXRFNkWHhiQVpCZDAgMzhwSjlqS3RiaWU1SEIxNWJhTGFyMERwZmNCOWtNcTIrR0hCZjJOU3IrQlhJZmsxWDlvR1k0YnV4Sk9BRUYrMy9FK0FQbjdEeGxYViBCdFBnWkpWbDA4eE80TWJaWGNSeHRuZE1Jbmt3eFVNUmtwSkdKbGtFckQ2b04vRkpGcUlvOGNNVlRJUm5Va2hJNVprR1JUTGRZajJGIFRwbVUrbDJXWXptalQ0K2MydFd3bTBUWCtjeVdSRW1pMmhlbEM4U0VOT2ZJYTJuK0RuV2hBVldRbTh2Z3NaNFQrZ1FHL3dEbndBQSsgTm9jaVlodG0xMmhNazFLMjNOVXBaZlFwZy9aNVgyaTJuMjBHVEV4Y0Q1Vy9EMnBTUUcxVk1jRzd5ckpONFNkUEg3L3dEWUQvQUZkbiBVb2o2RzhyaXBuVDZTb0V4bWtwUWtlWVQwZVd0OERVME55cXRnbUIzQnc1SVBaSnlHUVBZUTBiRVdpZXlPN1dqNzgrUHI0QS83bnVrIGpZbGVTSUdYRGFDYWZZOVZxNWluS2NlS1pUN2YrR2Z1NnpVMFZYQy9XeGx2VHpMSXdHTmhYeDZyenJERVd6UEp6NlM4QVY4Q0FRVDYgQ0FQNE1hU09Tb2JkTno3blNnS3J3TXU3M2M4aWhSNXZoV0xRc1dFZWVGY1NuT3dhRnFjVnc4Yys2KzN4Vm1pRnFCb2JrK096a2V2NiBTdGhueEp4RG1LcnVDd3RoaXFaNURjQjRaRHBOUFpERmdXbzhUMC9Zd3d3blRkb0xQQndnVGc0QUIvdjdmK3JhRUszaDBPcG9kYVQxIHR1QTVxZVM0TzMyUkg0MEJpdGtwOGhrSmhpWVlaSmhCa3NZRHFRNFAvVkN1ekkxVm05N3F0KzRDZjM5QlFUM1U5VzZtWXNCc0pMaWEgTnJjOWRMakdsMStodzdBWHBrWEZlUE9SaTRBNzVTY3kxUFpreFF5SGJrUFdlMWxDWXZteHRKMUdJSURud0RnSUJCNmFqeHZESGNqNSBiVURKMkcxVEVhMkpDVERzQnNjSE5OWG90Y3pXQVB5V3RyZ2ZNVTg1QVh4NXdQMno3eWR6RWNKc2lQVVhnRDZDZnc2WWRSbE1rQVhGIEl4a3pBUXJJWkNVMm5SNG9ZOE51M3lWbGt6eUZGS09WR0dSRWFabUR2TE1yTEFWN0hlVCtSM0dSSjhKUXJ6ZlBQU3h5eWxtWEpwdmEgZE54NGJHenFOVkgrWUhRN2dUeTNadE5kM3hvTVdoZGxxTGZ3ek53Y0hiWERZN0lGMllydmhOR0J1M3VjNENoSUlEeisvaExLOFYvbyBvUXFnbnpzNnh6TlRaTkJYeFgrVGN4bW5RNHFWcWFPb2FJUVcyV2g5U0ZKeTM5bDJENEZwcmVLT2hYdVRlVGdRNWlEZmoxUk1HSEFUIDdBZjA1K24rcDdIZEt4Yllsa0tSS0E0RXVVQVQxYmxtU01ocEo1TndjSWNPeUxJM2hQWTFVQ3dBSzVXOXp2Z1dzNzVkZ1FKc0h2aUEgQUlPQURyc0lLNlhMSUVqTVhPQ2NrUTBsc1Y2OStPV2gyaFRiWjNHY0I2SERaS0hjRTZ2NnJuY1BmT04rd3Q4c3dtOFdqc2dQdEYvLyBBSDVJZ2lJWmNOTVVMaVFJdW53eGthV0NXUmlkdzVaN0tLQlF3b25ueDBZMVU4VThVdW5rMUlkWXpFV2ZVWjRPSXBJWlFQU0g5T2QxIHUvdUIrT3E1Wk9qOS9zWEk5REF3V2VpVnhQOEFUbXpoK1pXdnFlYnVGd3E1a3hpVTNNTW80VEpxRnl6VTdNWFYxaWtHWUlEMXg4ek4gejhnVjZJc0RMejVRMkdPbDUrZFdTOVFRWllRQk1JRkVqVEdlSExTejZhOVRobG1xVDFkcGhHUmErT0hGSlVSUkRsV0ttaUFjRndHTCBGWmVhT2d6NjFycy9ueUowNCtUQ3NHQnlQWWJ0blI1YWUrNTRTYjVPd0JadGJOWm45L0orZjMxWWVjZ0g2bWZ3RDcvOVAxK2ovd0JUIDFCV0ptQStCekZkOEdwT2Mya3JJRWtZYklqeTNBVW1xVVdVeWQ0TGdoMXV0aGwvNEw0UEExek5abmtwN2pFZTdBZ1JIUGdBR0tEaGYgdXdvT2l6MERMUGxDOUxCMGwrMUNKSjhHd0VJbHFaOVo0akNiWFhSUndYekZLUGdZUVpIUXJpZ3Y5MEk0ZkgyZmNYZkRGSnE0NGZ4eCB3UEFXRGovVFBUOHhIemJnSkpxNWtraytteHRrTzdod095RjR4VjZZSnJteGc3RGFrS3EwTzFZYkJaQno4bG5EQlBnWXRaV1RsbzdJIGpnZUFnRC83QUE0MTlMTHRGd0VzcDh5VzNVTFlJY2twNlpwZ0d2Mnh3VjR0c0pzdmg4T3lFOVBoSjdCVDd3aDJoUHAxT3JQVDBVS0wgS3p3bTBhVEJXNmY3UklPLzgvZmlWbFNLVmdzSmNoUTdUSDMrYXhGY1Z6Zkp1eCtPZ0ROSXl4TnVORC95MFhLdkhsc2w4MXh4K2E4RCByUzZRMXNwbHBLNDcyb3RubHkxSCtzdFAvd0FPbnhLZmNsb083NCtjZmhoNGFkcURjTm5SNld1RDRDM1dZeG9GNmhSbStZSklOK3QyIG9qOXVyNERZRDZydkJIMVVVakQ0dStKSnNEWXcyU3dqcjQxRldCRTVsRnRqVitlVC9tTGRWekhBT1FtVnpBbnR2TUNhTVRhQmxtQTMgWjJDZmwzZ0lEOFJJS0NWT21tQ2FqMG5rcVQ0aHlYeWtXb2t2V3ZRS0dRczJHZXJtdmJGQW1DRXlIdzhQdUMzQmZHQ3BVY3oyenRCbyBlZGlOaE44QUlEOGY0Q0FBZFdXa0VLenpVc0RVRFJRK29jREFXNzFVMkJQMUlLN0Q4VnlkaWd1SDhPN0hEVUpUOHl3SmlyQnZBOVFPIEpOWktmbzhiMkVPVkYraUNBL1RwQmtNVlNzbjFLSk50eUNCczVJWStBMHJwUTVqb2J5WkRiTEwzTmx3Y2FidHhCMDB6dENIVXl0MlMgVGlyMHVmRlB5TURpZHkyT0s0MGE5bUIxVHRyUmFtVXVjL1cyME9wVTJZejdVc2lKTWxQbFpYZEtaSy9UOVNFd3d0bUdGYnNhMmg0KyBkNHhYUXliTjdkcmdiOGZBSC9BWTcvTzJKU2RpSHJWcmU1SzAwNnNreTZSc2EyZE94K2pjaXZUSDhQdUF0WERyOVBoME9xekdLZXlQIEYwaitEOG1SbndwWml5RWRnbDJkb2o3OS9RTy9uNit6SHlabFdYTnJwY3JlMjVzb0NFVTJpNnlSQ0lZeGFDd3I0WkNHaG1GdmdhKzQgTlErdjU5Vm1IbG1aMEo0WmtjSWxHd21Pd2I5N2JBZnN6VkRWZlZNSDZNSm9GbVhYVU5YVnVneVRTZWtHY0E4c3BUakJxVUVrRFpaKyBxcERtcC8yMUFzbjFyVHg2aFBxRjc1ajZVdDN3WUYvRkFZTUQyL21BMm5VRlM4K1B6SVlsY2l4N25qaFRMd2VXVTE4Vlp0bHJKNlJFIGNidldBUVNuS2lvYTl5YVNzUlZZMTVOM3hXOGhXQ253aW4zdDRJMDdTZEdZTmxlYUwzYWRYOWhCV2kyZE9NWjlEd0cvRnZlMXN4QWggMGllQVZrYkxrdWV0QlQwK2wxU1VsSmZlZTRzSUEvNmw5ZVRPb3RndkRUN3FMZks2dTV2Q0Z5bW5WMnJIVC9XV1FrTU1zWEdFSnBXcSB5Q0c0V21aaDRBUFViOTdMQnNuY3ZGb1pTbnQzU2VEeUNmZnNldnNnZXZoa09zWlM1eVRsQklHdzFmcWpTYkEvSEthdk9YRytlVnV5IEdJYjVZRXlkWmRvV1lqcll5MzhGY1lzbk1RbDJIUEFIOStQMUZVWFVrSFU2N0tadWNMc3RrdEd0ODBkSnRoZlR5VnNKTXlLaHBGSTEgelNaQXhEUTF2alE4eFBRMkRuSzJ6Rk9CNHJPQVJKNE9mUHYzOWZiL0FOR055VTgreEhaR2YvRFFqbzE4NVdlTEZVVFp2ak9FeDltQSAvT2NlNTRxcXRoWGczNXNuOVVXL3FzdERNaW5KbVU3NXh0VjVVdDFsSFQ4aFBTRS9ZWmFiRk1PRU5EbVZYRFcyQmIrZXZ6L2hqQ2RvIGFkRVpaN1hPMW83K0FQOEFnTWZzQ0NXNkxUeGJRU241VmhTU1duaGtaQk1mSnRTT1d2aXBXaGVBMjBuajVpM0RUMEl3NExiVVFUNTggNE5qNHJqSnc0RXhCZnIrSXZBWXVZWFpDbWF6RlhLQTFpeWFiMmdsSmlEenhnUExtUHFiWHFhNU9MaE1UK0lNamdRaHRTR3Y5MUlheiB0ZUF3bWNDYjI4QUQ2RHNHL3dDd2RiVW94TUF1QmdvVXlVbXlCZG0xS2tWL3FpcDlQc0picTlEZHlpRzRFSmhpcTJTSE1YekhaV3dGIEpxRHN5emppakkyOUczYno2RHNEOC9jKzZIVHl1SVpWQ1BHa2NtMnFNTGQ2OHZDb29TSWVNWEdQSHgwVWtjVXJ4SzhrYlBOdDdZZzkgS09QTWR5enlETUpJdUtkbUpvazgvaWV0UkRZQU5IdFZ2Z1NUL01NNmV4dW1WZnBPMVBpUTlPWldJaDEwdUVKdGIzQStCMDlnRDJOVyBuL3BZaWNacThuV2F6N1dnRS9yNEFmdzMvZjZPSTlCcWFSWUZXVDIyMURaL1RtZWJaYmZrcXRUTmkyMFNuZERsSVpBT3lmTWgyUVFEIDF6QTFBVHpuOVVOQ05zYnQydUJ2MkRCMmkyRFlPbnhsM3JDVjQ3VUdQSWRiMHl4MTY3TmkvVWtNZ1dXN0hGcWNvcGFsb1dvaFRERXcgeXZwOXhkanozdzJaR2ZGZG1KMnB6YTY2clFkL0FBS2lQN0IxUEdFeUdlcnRQaWxLcnE2eUV4akNTNm5xV1lubHBpdWV1TTlLTWN3cyBoa0RoMC82UEFjT1ZPQ3lzdEdJeEczdjlVSHdEOXdIQStBa3hES0l3N3d6UHpBenJFdE9vVTVnU3p4WllaaXdEOGdraml5UUtraG5YIENlc1E4YXVURzBiQVpwSU1UZWRBcWZ0b21qZkc0V0RSNjVwOWtVMGhxVTJUS0F2N0V3VWFCSWV6azBTNjVWOENLRytCMlF6TUhob00gOVBubzFQa3liUXIxbXN2SHNFOC92L0FUNitmUDd5Z2Q4S0pZWnRDdmhLMUZkUGYxN0d3ZzVENWhROHB2bHR3eDdLK1dRWSt2c2xkSCBpQjZ4b2FON1BkWnMzQ2JzTjcrL2NCQUFBQi8zRkdRaFlEUmhuTWFRZUNLbWFoc2tzZk5mRS91UjhWSWZQMmVGWkc4VENENXNJK2VqIHVEeXpDMWNZVE9iSnNlTDkrL2dBR3dNRlBLRkUyR0JYQ2dkVEQxcFlUYXBMOHh3WDJ4YlRhYmQvaWgrWVVuak1od3lDM1ZaNGhBdFIgazNQQm9lV1k1Z2s3MmY4QW9KL2Y5Z0FDVWRHRWptOG5SQUtxc3ZKdXo0cnhRK2VlT2crb1IreEdlTEx5eVA1cXF2dEg3ci9VL25xTiBtQWt0SW9QdmRMdUFrN3VWWXNpOFFsb2F2ekNVK1ZrcnE2Znh0RHhmSWZJT0t6M0N5emhoWkdmV1ZoNE9CTjhBQU83cDhCN0hzUlpzIEhsTEd5MDhBZW1Ob0VXWU5xaEJ3dzRrSEFua2hvNDJRbU9GSjRwNjJSNHFwTDU3RXdUWm1nb00zdzMrd01DQ2YzOEJzSFVPVVFqSGEgTThCTTE2U2NKVXhTaUdQaGg1WWVMRmxucTVYUGgyb0haSEJ3SHVGallzRDRkcDhZVEZ0RzVvLzVSQm4wSGdQbjM0QUFubGVRdHRFTiBQRmk1amIzVkQ4ZU1WdTRYUnp3OWhMalNwZzh4aXR6RnRiWCsxZDhXQlBCdUhHU201dktPRU4rMlAzN2Z6K0hUU3pSdmJPNnZHN0xQIEpFMUk5WTRGV3EzKzhVUU1iK2JBQW51dzA3SUE3SWp4b3paU0RJOGlTV2h1QVV0ZW1sR3pYZHdCVEt5VzU2L2syckFXeG9lVk10R3YgZE84TnFJc0xJTHRCZXNhdVU4ZTRNaWVoaDBNZkRnNHA3YlhMZ2prMWNvTTJPMGYrcUJpdi93QmdZUlRNcXVVWXlhSHNZWXQxdmR6VSBOWVpCZ2tuOHdRMDBUdzFQSU1sYm1JY0xtQmhWZ1dpMmcyUVl6RkJaTkczdXJyc0Jua0UrQUFmdjNVbTZabVlMc0I4UTNldlVtdDNLIFo0ZVlTRHIxVnVRSGZnTElQaGhtU245NFg4YTVuc0tHajJRakRHai9BRnhkN1I5d0I5K2ZrTG53QUIwNXJZci9BR2FxclUyR3QxSzcgS2YyMFRRNnJNc2lXbm9aNFNCbEdGOUREbUpoaUd2bUs1b2R3clE0SFdieEYxY01aZ2JzN0pPd0g5LzhBUDdCMEJrenBOM3ozSzdMbCBJSkZ4d2QzSkdlRnRTMG9za1gwYWxZQVhDM1ZXTHErUVBOSC9BRjhlU2VxYzZxQTdoWXd4eGxEME5sSlZlMVJxY2p1dzJQWHJJaDRiICtCTUQwL3VwczVoUGNEbW5pMFBEL2FLSEtNeHdIaWsvZnNkL1BZYkFmYzFYZzQ5bHE5TXJnYWdhdWw1U1RUbDNEOU5Oa2FmMU5rY24gSnN0Q1VYcjdnWWV5RnRrVHc5cWRqNEVHdDJZWitNMFo0TkpKdDRBYys0K0E1K2Y2V0l0WGoxeURzNkFHWkxrR3ZqSWdPOGZKRHVCYiBodFN1N1JYTU1leVRGdHdXMFBqWU1Ed05xaGpIcFg1eXN2QVEyYmVNQUhnTi93Q2ZZM0d0U1lZQTFYVE4rMDNxV0pVbnFNY09iajNDIHNxM3hReGZFeGRqTGJBaHVIRzRka01BY0dwTUg4NHpjWHhlYk0rN1hhYytnK2Z4d1BnSHlhaFZWVkVaU1daSkVpMUJla2IrUE12MisgbmprdUl5YkxKdVZLOHJHbnpQMUFrUm5SNDVHMHluS2VOMEJFYkZMRjNiZ0RqNS9WMVgxR1dJeWMwemx5ZlE5YnZiNDFPM2Vod3poMSBoWEFMY3JDcTlwVzYvdFJQMHh1RlYxV1FEOXRMUStDWUpvck9VV2Q4TjRjNEFIL2J1NWdBMzg4clBXSnJOMWhwOUo2Y3dOZXFWUDFCIFVxbGZFL0pyMHgyZlErUEp0amNoVzA5a1c3SXRSZ21RWHh3b2RINXlzb2I1d1lJN0czYmZ6NzhBUG4vUDlLUlFYcm5EdWF0cUcwclYgaVNyRm4wcFAxVUx3RmpJTDM0YlNHaXg0YkFIbW9jT3Q3SStGQnhIdmpVWUdQTzZmN0ovcjQvNS83OTB0eEVnUEd0Y1JhRjUxWEtUcSBnWkRlTWl3dE5RWjNmRVJYdGNERmNPZWJ5SGhpRzlsZ0hvRmwyTUhzMVphT0RyQjNBMmxiL2lCOS9QbitxMmtaZ0FzNWRFamRYL2wyIFoyTkVVY2JNVmZrQjdIQzQ4MmpUR1FSZ1JoSlhlU3lteWtxTmhnMGIyKzVWTmx3b1FrY25LaGNkeFpGZTdtU3pyVnNZbGJWelZmY3ogc3ZWOGh1R21lV3licFlWeVZmdDh3T0htcmNOd212R0pBRFZZY216SzVRWXovd0JiQS8zL0FOejREcXV6UmVHcVRKbUpLNG0yY0VhcSArbWFtdStEVHM0bFBGdmxPWElobUY4UDhQOGtNQ2Z2MXdRRGswWThpOEJndzVzaHM1K2gvK3dkTUZiWHF2M0RKc1l5bnV6NHVCNytsIC93Q0REVjJHWlhOT0NkTkI2YjNVV3c5YnVBZmVPV2prTlZoMW4ydit6YjJFOSswWCtaL3JqRVNRYVJmRFZhdWtIVWhoa3orVzNJdmggejFmcWFlQ3NhSlhLYUhYNWkzTXVBUUhUMW80cEw1NnVYQW1NRjJoaWk3STdjSCt3QU4vQWMrNlNJNW9zL1QrbzJCSE5wb1pteDA4TyB4RkhHaXExTnMrQ3pIRjg3QXBjTFkzZitKeE1ZdHlGbzlSUEhKdXlTU2RucXluRkxza2xVKzN1N2pmV0ExZGZGbkdyVUZmQmlwYmE3IFltN0NIMlBSdW9DN25CRDdzSnI1WkE1OE1mTW1NcEI3Z3oyQURZMXdNenlVS28zQi93QVhJNThBZlFXQS93Q2ZRWUd3RVBMU05QZFAgd0pka0VnNEZrSldFMEpMSUhYMXE1UHZpdTRFUHdtWVpEREFZdFRzOVdrNlk4bzFvV2dUOWdtS1NkUWZ2eDhCMGVVWFY5Nk1hM0RTYSAwb0YvWkdOSk4wN0hySE9rV0ZNVnp5bnYweHhUNWdlR1lZN1JEZzl1QXozQVl6VTIwY21CNzI3SE9BNytBUG4rUVB5ZnF0REtWVkgxIE9KcmRrMjFXQ1Fxdjh0WDFJSjhkM2g4TkxXMHIyUXdMWWR3ZTRjeHhaTEdBMS9zWmhuWlNndGFLSEhZSnpoL2Z2UDdBQVA4QVJHRjMgRXJJOVl6VFdLODdrTFJqbkljamNKSEJ1cTR1eFFtalZSR3lsa2toV0tPWmhGR2cycFlaV1p6RkV1TjRLb0J6OGtoaGlWTCs3OElidiBZRmthcFUzVEhWMWtKRTBaZHhCVlZwRjNURmRYaDRIbkJndFN0NGEyeWNmdzRrMzdHaGt5YUdoc3hQOEFaRGo4L0FBSEFWOEFnZ0JXIG43UXVTMWN4VnpiVnM1dGNBTmJqWGRQcXRrWUcxYmlnZGhpcmErNFZYTVQ3VVpMQmZPZWRwVG0yUExRaGpGazQ2cEtTY0FIL0FHQWIgQWZ4NjNNZzlQcUNsN09NdTloU2FmNVVwUTYzckU5SVhsc1dtbHZpaDZmbUI0WWVhbi9EZzBzNEFRZDhEV2IrS0JtV1hrSmRpUzhiKyB2djMvQUU2MnhteVNMcjhPcjNTbjNIVzdRQXVTc2d3Ry9pQzlzS0drY3lxdGdtUTNDeUErSTliZVAyTVB6a1hhSDBjMjdWY2NQbndBIERmei9BSisyZUxGbVVKTGc1UWhsSEZGT1FiTlpXYkZmQTV2d01abFZYaUN3NllqRzVHTlNUQWtkcGFodVNBM3RweGVUaXgxSlZBS2ogNmxxUVBKRVc1dEpoNkJEZjZkcENIV0xna3JjclUrN0lseVhBUHVCa0wxeFQ1aUFoS29LOFFUeGl6NG9Wb0U4QW5wZHFUQSs3QUFRTSBWL0EvaXNzd1BRZHkwbmt3RWl2YklHMC9DMWFKRHhuRFI4c09oeW14OFEwL2g4eUc0TW5Iakp3Q3dYeFhKamdxSHB5V2RRdXlCSGFxIDM0L3Y0QkFQb093TTJUbUsrTEFIK2VoNmVMYVEwTTViQSt0NWxieXJzVGJRczA5S0QyQVlwKzFGdUdIL0FKNXQrZUNjQmlOVjlOckwgTjkyNE9BUDcrZy9md0hYMHhWOWJyRjRBWXFSa3FVUE5KRFVpd0NVTnBsbUpRRmhsQzdzNWd0OGtpZG4zQ25ZRndUL21FeGhSWDhHYiA4SDlCUG56L0FMb09PUmc4Y3BaRE5Eak1Kb3lveGo1ckpVZityNEFZNHFFc2NITGpTSktBT1dPVU8xN0loNHg3cmlpaXVyOE5sNHNFIGMyamJjaFd6UFo3bUExVW5vREpwdWZMYVUrQjFMYU5aTWlFVExDOVB0cWZEM2d3R0RmTU9JWkRmVThtczNJTEdJeU9FQ2RxOWdmc08gZkFFSHF5MGUrZmxYQllVcXdLeEdvZFgyUXlTM0RKMDlvOXNHSzVGMWtoeTF0Z0RtS3JXM3lIVjYyY2ZLdlBXTlc2TTgreXdpbzV2bSAzUHRnQVA1LzM2WkRaWCtaWXkzZkd1dkt6MlJjWEE3SXAxL2MxL2NlbVJiR3JLeG1neHlSa3VDdDYzUTJCd09UMS9CSHVDb0JuRjNwIFpPRy9CNFArSFBqKy9nQUNsQ01pRzBXSk1nRkdwL3ZKU3JGL2R5SEF6QWxEbGQ3cWJBb2U4WUdJY3dPUE1Ub0MrK0hHUVo3b2UyZjEgc0U0Q2Zmc1FEOXYvQUZkQmpLc0xiVHVtQVNNYlRtL21WTGFxcnQ1TjIzSUE2R1BkaituelhjU0dhTXROS2R5QmN2OEFETXczRGVKeSB6YVEyQmpqemU1ZjVKa1pCS0ZPaGhTQk9PY01UaTJGWlVSWmRqVitQS05VM01kNW94U01JeGxPeUlRaUpuTS9xdzlBMWtCRFd2T2tlIHVRZEtCVktPYmdKS3puUUlRdEdzcTdhSHRYWHJHdldsRXJGNVpXcERya0ZwdEpONE1DcTJMT3hzYVBrQVRYcHZzVEl6RnowazJ3cGwgSytSTjlFdlB5Rm5KRVlaV2ZHZytxR0pHNTAybFBrV2ZrOGNuOCtPazdqRGdjQWNBV1RRLzFzZitPcTBISHlaZkQ2a3U2R3R4YVRRKyA2SWxmSlhseUZ3cEdwZDBpVENBZXE2M2hoMXV3TzR3RmZwWnFjRmtZcnRBeXpEaVR6WUdnL3dCQW9Pd2RXMDlmZFJYTVEyaUtZMHVQIGx0YVk0MVpWK050cXYyR0dtbEdGeWlyYSt5SWEyR0RwOWdUQWZuc0szWmxscGZLZy92Z0krQmZ2UGdENS9vUGg1amhhQ0dTRE51VFUgdGVvWTFiRTF1aHpGK3NuQnlxOFRFRjRrRnJBeEREMlJ2Q3FlSGVZV0NhdTBJeU1EQ0pQT1BQN0FBQWRjWmhPZUJiUW41cmtxMXZhaSA0TlVsNm4rMWFmRWNFT0s3czc0dDlrM0FPSFpPUGh6azhnK1RlTTkrRmNac2RYT3J0djhBd0h3SFRKeXNtNFpBa3ZveTdrQjNkeDRKIE1NZHZhbWlzeWxEbmtEaGd0WGthS0tRd1h3NjZoSnBKQklnMHpRTElCcWROSURwZFRwTlQvZUY3SkJxVW1qdXlyUkdsWlZ2SGo1VmcgNWkzcHBsVjQvaDU5ekxkc1hSVzdzNzJFbjAyVVlidWxUQjliNmtOUFljT0dxLzJVckFiZG5yTVlVRnN4UHdsb28rLy9BT1Q4ZjZQSiA5cUwrVEltTkZ0RGJSWkxmeVpQeU9ZUEJhWUtUVWg4QXpIQkRRNjN2Z1BNeER3VkpnZ0k4UHltMk14dzNpYlIwSHNHQVFVRUFlUG4zIHhZR1pTOTNYbzYwaG11TlMxdTd6TlRObW85ZTF2WDY2SGZMYTA5bnE1bUovSkEvdzRaQ1ozNGNMYStZelVhcmxCaE5IKzc4QlBnRDUgOCtBUVFBRGprV1E2UUt6dUFlK1ZqYU5oU2lTVFlSaVpXNC9nWlFXV2ZGZmg2R3lJVGhqWkJBdzFWTGpXbkc5cjdOckpONE4xY2JDVyA2QXcyQitQbjM3cFlDdEdvQ1B2WnFsc3VHMW5RcXJiZFI4ZTlQVHNxdmQwVG8yUkxPaUl5TTdSUnZOTEgyWVVZMWxsYllrR2ZhNjVlIGVWUEZHNlBXZW9DMVhoSlVoYXJHVyszb040cSt2WHhvczJHcnZrczlLcXY1amd5SWI1VzdCN2diUVJFZW4zbXpLYnE5NUdWVzdCQW0gL29MOXYvc2ZmdXFyVVdueUVnZ0dYTGFXKzZsYUdKTFp0d2NmTGNDbDNDVTE4aDFlSE1MZnRESHA4N2tDSGFuQmtZV1VKdlBDVGJ2OSBCZmdCOC84QXJpeUZPaDY3UGoyK0swSHFjaG9iNHRsbURUcTFFS2NNSGdJbHlBaHg1aVpUOE1QTVQxdXhsS3JtMnE0WlB1ZzBQUE9FIG1yc0FZQitQbndHQ0RzSFVPTFpMd1EyVE9uNmFRNUxKWTZyZjk0aDIwcnU4S3hrMVRpbEppL01XNGVBZGJ0QmJCNHI4ODVNbzBXMFYgZlptK0JBZXg4L0FBSDdZVDREcTBYUGNFT3krNFUyMmhhVU9jYnVua2xud0ZNdmdjODVlQlZQYXRHMk1pd3g1S3l5TkZKRWpuRE5XVyBLQ0RQR2hSWWk3N1FDVFlySWFBZVUwWk1xeXc5dFdkYitTTjI4bHZEdTR5b3N1TEtwOGhhaTJ5TWpKdytaQisrS3EzY0NOMmJaaVlOIDNOcEp6SGdCL3dERWZuelpiSDVkZkIwOWtsVmpHQWhza2FYREdMQ1lCTEllUTZ5UFJRKzhjd2h6TUdCd2d6MC9CVm1qYk14ZkJqTjUgdEpCLzE5L3Q4K0g2bjE5ZnVrTzdPN0dxeWE5UEV0cGNFTzVwQ09ZUFcwdk9UUkRZZVNKOHhrUXg4d0g5dGFtUW16RkVObHJNR2t1MSBYY0JQZ05nUG4yRFlEVkdoV2ZLY0tsUEFYeDJMMkRsRzFRQUh5Wi9BaWNwaGphWDA5d3hyaXJGdTFHUmdNZkFZSU9JY29VckJYdDhtIEROdTJPTEJVVy9zQUJnQWJBYXVyUXhpQ040OHNzQktNSGhyQzgwNXZPN0hjS3h2bStBSzR5TTduY3d4ckdEZFE1VmVEN2krUG50L0ggWEphRFFVRnVqaFJrcXEyUzFFMnZVQ25MWVQycU1KVzNMVVlrYnB1RDU4d3d5UTE4d2pudE41NkRqdGl1aDRrem4wbkFCaS9BT2ZlQSBRdE5kNEw2a3lWaTVXMGt5U1VVeEppVmU3RWc5aFEwSTl3T0xNdkQ2ZXlPQWV2MlNjQklZQTFzWnVtRm1EQW4rbFovZ1A3L2llQUZUIFd2dEdiRFBWVWtPcnZuRHlSSjMvQU1hRzRXRk1mRmRJY3ZoajVpRUhUNnJNRDNBSEE0a3EyVFpuc3IrYzN1a3ptd2Z2K3dZdnlycmUgMUh3QUR5UXdzYUVzNUltTGN2ZUxVUjNka2NvclkrTkVNZkRNM0FoNExiZ0hPVHlBSlZNY0c0dVRKZlNmUG9PSUUrL2IrZjZrWktoVSBCeGRFVGRYejRKYWVmLzc1R1p5bGNaNDVIM0VXVmNpd1Y5bHY0ZzY0VlZaL0xXZmFENG9VT2I0T3g5YnE5cTFQVmVuTzZjbEFHaWs5IHRYbUFsYmF1dmI4ME1LYStROTRyZDg1Z0hUcGs1VFFLMEJjWlp0ckdMSU1KYUx0dit3SHdQdXdJS0NMVEdSUG5xNTZBWkpESGJLSksgVENyMHkxSTkzR0pRQVNMRjJvNEdPNmxKaCtRQndkTE9ENEQ0eVRGcTI1NC9kZ2UvL3dCUUh6NEVCeDJnMmRndVNYVFJtcnBKeWEwViBRbGVxOE96aDZSTUdTaElGb21MNWh3WmFmUTVnL3dBOHdJVHZ1ZTZDL1k1NFFIdjRBQnY0QS8wN0xNaDBQWHcvNERScW8wOFRMYWZVIENKYUxJQnlKWWROc1pURjJoZ1FtQnc5a2J4YUVOSGJXQlNncDZ3emJvc29xTzdCY04vN3VnT1B2d0hwSzZtTkdoUjVVejFyNmlYVHEgOFdSbGszUkxQZ3BkSklZMDNvZ2lTUjhja013TEJYZlRBN3NyQjBUVEpESEtVYXRxTVpiS25nNWNDUWc5dmo5OUQ3d3MxY1YwZTFuZiA2bGtaRDVxTlg3emtaTGpYQmwwaksxaVJNS294SnQrRUpOcnFHdWh4eEgxSHRqR3JRMGo2UjJQcXM0MGQ5R0lNOTZNTTAyd2VvWGNCIGdPa1lkTTJXWmNGRThMdXhicjFYcG12YWYxQ0dhdmlscTUxQlRDREtoekxzc2dQUjVqbHR3VksxQjhFWW9yL283aE5pQVB3QS93RFggeit3S2ZVb3duYkJ0NEZyZk82aEJrdzluam9mcUVZOGNsQVMyNjJLeGdVSU15UW9pR090U0c5cndML21SL3dEbVppUzFoNmZVRk5yMiBLSGd3WXJ4MC9oYjF3MDMxSXVTRWxOcnBxZjZyZklZMlpkRi9aT3NpdllZR3BZbG50QWRmbVh1NHA3SXRqb1NyV2RvS2J1dHJBekY4IEdjNUNHdWNnQUIvRStBUWZjQXlCWkkyOVNlYVpKWnA1QURIdVNCSkpkMUlua3pYTGJNaFVOaU1ySnhYcGJ0SE5KTktVaGlXTGFpa0Mga2g1SGpqamlhVkVydnpFWUxMa051NnlmS3dlcS9EN0xVeVd3MmN5TlRHcTFjdlZ2OHh3cjFiYUlyRFkvSlBtTGU4ZGt4OXFRZjRzUCA0akh6QlpGdER3OG5PYk96eWc4ZjkzNzIyQ3NaU3E3NFJ3NkdrMXpWYTJlYmM2Tkwvd0FGa1IwaEQrVkVzYXVRNDlQV3pESVlEajZyIGc4Z0F0VElUR05IMWxINXNiNThBUVFEOWJ2bjhZMjhFY2RjbGQxN2FHYUJOMWlUVzdBczJweVNmVTY4SUF5cTlLRkhCZnZoUFQzQmIgbUQ2M0JUeUI2Y3libXJ0Q3o1dXJnbXdQMkhnSDRBQUFXS1N4K29TOHltZFhPYm5iOUZzaGJMRHp5VGZDblpFcW0xNENydURoZkRoMyA0TU9CRGxTR1FBMnBEWnZGOG1SM1ozU2Z2MlA3QWY2R0xFSXFLNmVwa3JpUnR1U0tTR1Y0M1JvNmEvYUNEa1BjUlhiWmt1Vzl1UEZNIHJ5SkhKeEhVYlJ1ZXhranlxTzZheGJYUy9qbFZoNUF0M09KTmxxUzN4c3p4SjNJT3lUeUV4S3R1WFl4VDhKMXUrSWQ4VE1GdWVocDYgSGVDMnNzMVgwM3VmM2J6L0FQMWZ2Y0FCcmRGMlJjRWcrTHlzNDJCemJJdU92UTZIY3dlWERxV3VXRThlVDJCUE1WWFpESVlJY1Y3ZyBjcVR5YXoyditqMmliK2d2MzcrQTREMDFNelRuRFhLYlk1VjBudUsyMVlSdGhxKzJxTnJlTE1GeFN6NHJ3MkNaVzlrT0V5SFlFTkhQIGZBaExhempWKzJMTHdFQ0pMeHYvQU4rUG9Pd2RKOXRhTlVERzhXcGxSYzZyU1FHMUJsT1orVFRLTzJZdVNicWFGNmpGc2ZwdlQyUlAgRDN3UE1BNjB1RjhWVS9iTGtmV1paQjNZa2hEbXdBRDZDd0h3QUErY1NvakdQY2hsbUdtWkpJU1lwRVRaQzdyT1hsamlsd0RvUnRTUCA3amxoYTVnclpORHVwS3FJNGpCMDdka2NiWTdhaVBIakhGckpidnZ3dGN5UXFyTlFGZEk0ZWVGemlJZElzMExac2RjdkxQaUI0cXZaIGgvRk9mMXg4RFRVT3lHRndPZmx0cHhKTFQ0cmVjOTdycXhBWUFGdWdBRDlzR01sbGcxK1VVb2NNNzJGUlZlbExJdHAzcll4YlZMdTkgYnlqeW5iVlg4Z1k4R1JrVDF2R2FjbjEveXB3SnN5eDNmUm5mRDZPZzdBZjgrZ2RQZlUrTzlDdGJaY1ZCckozcFdOVERHcGNyMCtMRCB1R3ZoRTArQVVJT090UVBpaUdHOC9MVkorTEJZejR6NHE5WHJDeGhoZzdwSEFNTUR5K2Y0K0FUVWhUVzNHMkFQdGtuRW1nckNRSGRvIFpMT1lGNE9VaXhITGpmekZzdXlHR1JmbUhGTGliVnhuZEJsbUUzai9BRlVBSVA4QVFQMkJndU5wM2pjTkg5TzhxU0pISmx1NDV4dkUgeDIyVlkzcmNEVklqZUtHTms5TmsyQTZpSjkxQmp1S1Z4dkdXR1ZlY21yK0poNFB1SitLSW9odzdGcVY0YW9EbWVKWE5wTGgyMDdtSyBycXUyQzNBNjR0ZzhCaHVESk1UM3lHeWR5SUZhRUh3NGhMTDFWNkd6YkZ2ZTlnQUFEWU9mZGI3SW1IYTV6TTdOdERPK1pBbWNUdmdsIFoxYnRrT0x0RFI4d2ZENGVZNWh4c0hCNEhPZkNieUx0QVo3YjJiT24wRS81L0hFLzB3bzdJNlp3czlYeG00SC9BT2VrMmt1MkErRHIgSmlMYjRtcnpSS1R5SWRrY0ljT1ludUU1U3VBRE9oOFpGNG8yK2NLcTc5ZzMvd0EvMHBaR09VR3R5RytNY3lOdWkyYlUyQmJ6aUNSMyBHVGU0MjhFV1JEUTdJRFF4L25xUElRZWMvYUZuRTRFU0xSUjZpZmdHL3dEbndIUWtxSlpwTWFjUXg1NHZMdHR0QTFoQzhqeFEzdUc5IHBWeW9aNVlyaVVIcUdPSWRxUE1jUjdzTjNBSDhaVmlQeFp2eDAyb2N4NUZyZDJJYmJYb1FsWHlUYUtROE95ZVBoM0J4ZUp6MURUK0Igc256Slk4d3F3R0U5Qk1FMGFoN2svcmJ1bGhzQjhBZjl1UDhBUzk1QkNjampJcFVpQms1T1VrdXk5VjU3SnFCaExpMmhJVFl2TUU4dyBZaE9DSnc4RzJqM3lkTS9hMlptKzdiSnNHS0NmUHYzZ0pKSE9hakcyM0xKZHpOblNaa1hWMFMzQndEMXZkeWZZd3RzeGFMczJkUHJkIDhocDZmTmVLV1lFTnFjTnpxOVhlZGo3cEJFYytnNytBNER3THJUTWRKcmF0OXFvdFBOdUYzRXRTRERYK2NTWDdZdFZOdTZza1BubGYgNGg5TWJKU1puNGUvWU50cUdMTWVhdmZPNWp3YjdwSTUvb1VmS0o5eHQyWTRtTVFUVm81bzd4ekVlQkJxUlpZNkxFZGwzM1VzWmFuaiBiSjRNcjljeDFKRFFqN2xPZkVadXBYKzNzN1d2aUhhRisyS0gxQVY2eG1SdUo1cERqVlBjbmFPSmZFMEJMdTVOWkY5ODdxV3BXOTE4IGJzYnZCUFZRNk1UYUZjWUxCOEpkdWZXNzkrMkFCajBuNFp5M0NqSm5HYXFNVnVZUFRKTXNQWkFGSDRlVXRwaGkvRDQyNFRIQ1lISHogSjFscjZpMUIrYzkwT0RQQnZoSncrL2IvQUZGdi9JQUY2cEFlek5PZHNETHViWmkzcDdxOThrdHFPN1p3ZUl0dERRdlNsZXEyQnc3ViB6S3JNRC9nejlTR0FOUVdVWm9hQm4rOWppQ0FmajU5K2Z0ZzZTYkptVVdwTDlWb2NWVmpXMXFnbVhHSnNpMnM2UmNZZXBhNTFDYVgzIHdQYUV4UGhvWmQ4WUE3eDNRUFlMYXlNVjl6R0hOamRrZCtBZm9BZnRndDBOSkpCTWphalRTelRRdmdvZUdUUDFJempNakRFVnR5Qm8gd3dKenhMVXRZOVRVclBHME1Nc0NacnVoZzBQcnNYbDMxWTkvcnUwY3FOSTl4MWt2YWI2RmJFRjBtMjJwVDZsUTlla2h0bG5rQ3NwQSAydlUrVmdVYUJKUXBWYWUrc2poU2FIRDU1OEJBYloxa0V4aXR1YXljN28xZGdmNEN2bi9ZL3Y2cmtaY05EUXh1VTBUSC9IS3lVQmVxIGNhMUVIY08wT1NuVXZKRTl4aVVtWW1NcENZcWdhL1JQSms2djRNakE3UlNUYngvWDREejlSQUhZVTJPcXV6TlpwcnR2enVIZHFuc0QgV0F0bUVneFhOb1VnMEhxckhoN0lwNHhjSElJZGpjZUF6bndtTUYxZXNqRGp0ellIaS9lQXFNQnNIVWJJK1BiUytCcEtCTUNYQXVOUyBsTXRBYkRyOUhtYWZaUllYVjZlNExiSUdtc2tJZ3lIQU5nTm9NUFdiUGNsWDhtQnBOWEJQdndBQWY1OGY2MWJucHdSdTI4OFdlRXpDIHBCbnQ1WjhuUDJyajdjYVBtK0VxT2RUaHdIZEZNWC9NMjdvNTJNYXpQR0o4K2I1Nm5oZHFQakhVZGUxS25WWHBMMDY2b0E1dStiWVAgWHdyM0dubnJHbWFRRmRrY0REaFc3Sk1oa0llTGJxQXJPZDk1M1FZemMyQ0pOVjRuMEVCc0I4LzdLVzBMWXNTK1hBT1V6VnNiWjJiRCBXNGl1U3M3VHZVOHlMS1hrSVgvSnpHUXduOXI2ZWFrTWhBT1lyTnZ0RFN6STFWcFBhNDRBQUgzNy93QStjRWV1NUZMV3haMFdVZUpjIGp5Sk5lMkRlVlB0QWxrdTZLcGxLSHRRZXlkaDJRTjhBeEIyK0JCNE4rWk9UZmRxVE9mdi9BR2lBUCtIUkhUOTBVLzNzMVF3RmNhL3EgdXBza3QxbFQ0ZnQvWVRKS1YyelNxMEdSME8wdzRlRzRKNjNPYlY5OGVESGl5ak1pcEJ1a3dmbjM2M2QvQWZma1NZYVlUU052T2dlRiBJMWovQUpGenlMQnBlYmpXaHN4NERiSmZ1YkxnNHkrcElqaWlVT0VsbG1jak5CSEZHWkMwY1hidDFnUXd6WU1HVTJNS2VDMUFWSGVqIFJwN0FVdmI4TWs0Yk1ORVdCRGQ2dkU0L0ZZVU9yekRpWW1VT1lEaDdBWks1clN3SUNyYWl6eGUwRm9ZOGQ3ZURvUFByZDhBZjM5MXcgRzNVM2dkdmlvSDNQV3JUS2FJd3VuQXZhZDJXRFh5MXA4UEpLeGJTMG5zd2VXWHArYW9OL2JVaHQ3MjlWbytQbUhkUTNhS1FidDdIZyBPTy9lZnBSVjlEMVBZME5rcm1LaDZrS3JxODhTU0svM0lmWVZjUlFObTdDdHB4aUY0ZFByOWJCY3dQMk5NL0Y1WGEzZzMvUVBuOEQ1IDhBL2dMT0I2anVPQlJkY2FrUXVjU1pmbUtkaEJoeDd1YVlwSFVaY1ZOZ1hCZXF5Wk1NTWt4d3RSSHVoZ250SmtZTXdGMll6QWpZVzcgTVY5L0FBTmdRZmZwYlJLWlFwZUZKb3RWSktqU0xxcFl4SHJzRkdFazdDSnBCRkRLa3NjRHZ0N2lOSXdHQ3RvM25rakxSN3hTYUhUYSBlWkl2cFZBZlJ4TEdIUDBtTVlnU1FwcUROdFI0UXh6TmcrQjZwOFphQStvWXFSZlZYL2gvTjE4QmNpZE5YWWJqWHhYT3FSTERSeGt2IE9rUXE3VzFBMnAzUVF5eEZjRFo4Sk9na2ZRK1RRMDJNSnl1TERnNm5sQXgyUm5UY3lDZXF0M0ZnOHl1S3lxbk5UbFVQRVJ3Y1pNVmQgVTNFNE1CWnh6WWtMMHJrOVpiUUs2V0RGSVhyak1RNldFQkJSa09LYXl3Y1FYQ3l4R0dUNmM2NkJmVk1iV0xKU2JVNUFXRGpSckUxZiBISDdQNUhYRWxZTExJc2cwbTRzanErV2tETm1yWXRiYjRzM2RtaGZjYUhGYmJZWkFia0xNV05QUTZsY0xHenFCcWUrS1RBbzd1NEs4IFZzWjRyNDRXblpCaGxjSWJoTWF1NkZsMVg5WndmQ2JNRFNkVVR0VmVDQ2VBSDdkeFFldHhDbjE0OEhtQVJkcGtxWjFCUTF1d3NFbXMgREh2cU1QTU1wbld4NWd3eHczRG1HQVE4NElodHdXVmxXdERBbThCTFIvN0FmWUtpQVAzVm5GWnNrU3FuTVpWZkRLdXVEdWRwdmVDSCArQ1lMT0ZjdVRCU05jM1lud3cvSk5ucThQQkFFTGFhclVXWGtvVXZJWmdiMlQ3OGZmZ0I4L3dBZ3dRK015cXp6SUJWMWREalpMYzdQICtJOVA0T1dEbEh5Mk4wNGZNV3c2MnQ3Z0grQnB2dmpFenRqUVVSdWNjMi9RQno3L0FIQjFoMGsyN0dqcDI3WG9rRm9ueXdBSWE0cFggeHUvQjhmQmJuSHNhclQ3VE1GVnpESTdQRVZNc1FGNFpEMVlWenExNUhqbXh5T3E5MkF2dWlrTDB4dG9ZYUV5YmtxV05mSy9hdHdWdSBKZkVOb2Q3R1RvZmV6Rjg3cVF4NWdIM0FRMm9QeVlvTEdFK2JmNS9Yd0FBK0FQbnlTM0xJWkpSQU9MZk5QWnZUMitYeHg2MEpsa1dCIExaSlN1V3B0eVd5SEE3dGhoMDl4Y085Sy9BbldRc011b3p1Wlp0cVhaL1h4OCtmOEFmNnhrTVRLcU9OVmFnU2JJdDdDUytPWW1KOWggTWhSOEVPVmM0c0ZicmFHWW1NakFIK0FRZ1FjTzJaVGRDUnczdllNL3o0K2ZBYkJzRnFGL0xxU2ZEMkdWcWNKV2RGSlNXRytDUUc4RSBqQURZeTg1U2cvR3pDZk1NTWhDWitMOEhoazhvVTVNY3E0MjdZZ05nMzgvN2JCcll5eDZxQTl3U09HU0FzKzdMaEg2ZTJBaVF5UmtyIDMySlVOMk1NZTY4eW1OSVpIampoNzMzSHVMRkJJOVpNNzVISEtoaU1UNFBTWlFubU8wUTY5WEJkTTFLbnBvRUlKUjdJeXJZdm5tU0ggTGxBWmcrR24yUWh2bGtNQ0djVWg2a3EzWXpkcjdrWmxvNEU4NGdvSjkrdDNZQUd3R3BReGx1OXVQaTVQR2trK1ZNVzJ3d3F1eGhJZiBDbFNzSXM4eU1CaERyZWsyU254NGVhaDhTUjRaUGdiNXhrNTRUZndHd2JCNS9xVDR1dEhrL0piV013Z1dFN240MWUxKzRXRjI5MnZrIElGTlcyQ0dZMDl1SDE4UEJQTUU4SGhwNlp1QnJQNzNpODcrL2ZmOEFwU3JjeENYRU13dVQ5eUFTb2FRSlQyUThIWGx3OGg5MER6NHYgek9SeklmSDRiVkFzQThEMnhaL0daT3EvL0lQdjNIL1A0eXlSeU1JaGduYUJIQkVGalFnODFHc2dqUzdIc1JNdnV1Z1Yxckk5QlpCayA3STZHVmpjajVHTTI3c0RJK05jQ1NScUpPT050a2VJZVpZREhXNTRnK3JlRFZWOHhrVTZmSlhBdnk0ZElnYWNQQVppZkRaTGdoMXVuIHI0ZEh4MDNvYzR3c3N6UmFDejVzSjdZYkI0Qis2a215c25nODhFLytIaFE5d1U1WnpRSGJSSWRKaHRNUXdVb2V3aFlEVGZZRndUTEkgTU1rdGdobzhCZjAwN1B3Wm9WLzdKYVA1ZFFVSGY4ZUFnQW1PMEVISndkbng4ZkhkVnRBa3lXRUhTWHp0bHoycFZOWGlod0MzdkFkayBEL01ya0N3TnRjclF4WjRHVHJNSFYzQ2FyQUlPUEh6NEFCc0FHSHJ1MkZldjdhcFpEZG45VlNMT3FXSW4wUE0xRUZsdHlPcjBVV1lIIDF1SHNpazJRUGFBZmdaQ2ZPRDlqV2kwTnNCaE1NY05nUGdBQy92OEFoMXFuaTJJNFhFYVoxRzBlbWRjOXVTU2dwTXRqMUlNUzgwZUEgeGlEeVpIYnhiTkU2czdCamVVSWxFM0pNbitYRDR4djNaTmVWVUtycTBRaU9ZbjJRZVhOaGRqRDVwZHRHdlU0OE5qMkVuMjFkenhmRSBwUEliT1paTFVodUV5Y2VUejFxSjZ5VGFLdnFEZkRZUktPQUQ1LzhBb0UvajBtVmRzVDR6SllSUmN5V1RDdER3U3ZYQnFoeUpjS1VMIGlTbWdPb1RMSURwNWlZdnJVSDZHOGJtTUtORlprOThOMWQ5K1A3K0E1OGZBR0RCVllQVFNsMVV1WHhNTm5tUkpmNGxYa3IrcSt3a0kgQ3JMelJWNjNhSGVBUFc2ZStPQ2NjQTJoODViWmlmRjNuWStiWFp6N1lQZEM0Q2Y2a2N1eU8wdHVaSXRjVUhiNVdjTmJJNGNPcnNOUCB1VW9zbWk3Z1h6Qmh3VzJWREh6RlhjSHc0bjBiNHVvR1o1ODJEeC9vSCsvcWpoWTU5enlLbUZMcDJ1cXZZTG11Tm4xTWVEbm1mYmp6IFJiY3BIVkh5N1VMcmtkdzFpaThpdHlqWjVySGdFOVFXYTZBNHRaNTFJcEMycEdMQno0enVIQXBGZ0ZvYjRtdTU1WHRSd3RTdDJTazMgd3hYL0FJQmduMXpnekxLSHFNV1JoenphT2dnTi9BYi9BTC8wRXBiUlNkYzBHWXNFbytVUzRacGhibGtOT3FUYUNSWkcvQ0hKRGNIRyBIRCtIZkFlcitLMld3VXQ4d25lWlJEOEh2WnZ0SHNGdStBUDcrMUREQUxwdk1wbUx6eTJyT3NhbWJhN1BvZFY4aFQ4YTVLMXphSGNEIHVwRFpQeCtIc2JGT2djYjNNV0xKN0hzaHdIeUFCL1gzZ0ZMSHQydjBqVCtTcVYzRHJjdDhWWXpESXM0ODhNSWNvQllTajQ0V0E0SWYgNHJaUGh2RmFXQXBWV2gxbXNpM3piTmtkc01UNkR2NS9ud0RyUkd6MmR3dWlEVXh1WFI4YURocUJYSHVQYnh5T2lmbkVEbDluWWlYOCB4cVZ4R1grVG40NUxFOW9IUUhNajZrS3FxdjVXYkRRTTh5eWFoMGp2TVM4TUJxWCtIU1VucDlQcmZkUU80TDdJam9aL3VveUUzbm5oIE5tZVhiWkhqbjRCQjREaDFhS1k2TWk1TlpEM0pGSmtZM0FiWVNQcUVNTkZlc2dCTitYWXdjaXlJZHFWV2g3Z0huQVNFQ0RXNk04MWYgY25HUWJzYjMzMzM5QkFlNS9wZXZpMndMcmhNRE1kNXFWbkM2ZnJjc3I1ejdIZHk5b0NtRURGMjh3dG9iSW56UjRmbmxmOFZtRThFTSBYWm50YVBDZm9PLzdBaFluK3JXa2hGRUtKTk8wMVQ3cTA0b3JhWXAxMWY4QUp6WDZweTF5UHBWbmZSSTROanBaWmUxdnE5THh4MWVnIFRWcXpxZGZHWmEzMUpCK2xnd09vREY2Z0I3MDQ1NUdpbGFNT3lRSktnZGhwWHB5VFZMdVYyWTJTRGkxMmVCWExJWW5IZkN2ckkrMlogYjVkMWkwNlJxRStOd1J1ZmNjZkhkNTY4OHBGYnZGZ3lCc1U4Tk5sN0JEa3BaQmtzNVh4RGxDakRGRnpQaHA4eDhRNWc5Y3RSU1lKNCBPRXpmZmYzdjM4QitnRFlOZ2ZDK2pRejFiNXpJcjVQRzFkMkNLWkE4ZVg3WVpMdXBHWDhXeU8yeWU0V1FZTUQ1a0JTY1lBUDZ5VUdFIHlmTmdpVDU4OTREZnovU2xIdmtlMVFlVVVybVpaQmhJVzF0SWFDUmpqMzNLaG55Vk1zQ0hhZFZtR1RoL3dYeGYvbkZoR1YwTlpKOXIgc1hjNXYvNGoyRFlFRjhWMnZ6TEhTN2diWEtaR1pBMWV0dGV5TlhUdlM1WU9BdEJVaTIwWVh6RkR2aWVocDQvNXo0UWZPQnN5eTBVMyArOTcyOFB6OC9BSDd3SFRaRnhzMzd5UFNuZ3Q1c2NXVzVkMGZ4U2JiK3czVmR0Mk04TXpERXFNdHp6dFQxamlRZTQ3WnU3NDhWUjgvIEE0NEw0OE5NQWxHaXdwRElocERzMks3dG5ML3pLNVBGZ05jOHZEek1aaTNEWDdnQjFLT2ZEbkIxbERmS3pLY0pTUWh4QjJBLzkrZnUgb3hncmV3VkxNSjFlbXJZd3hrM01OU0pGdEFWZEltaTBPNDBPTHVIQTN4a2NMVVgrVmNlZk9ZRExNNEdNV2FyU1FnU3F3REFBUWZvSSBEcHk2cFpBdGpxdXR3TmN6Qng3QmJwd1NQbVozYjF3akhXeERzWncrWXlHSHUxSWErWWVBQkNmQlpPYzFlTFpoaHhKcTdZd0d3ZjhBIFdvajZtMC81WmllVXRxMUNsVnlWVnQwNnFJbVFCSkdHd01obm9ndTBBN2dIb1p3M2l0eUV4cVBXaGRNN2sxNUsrMkl4eEpOdXdNK0EgQUFFRkFmdmZyUE5PelFLNFI1c3NrUUlaVndySFpoTzNMSGVWdjN0ZnROSjhGMEtwdU1tU1IrMVdMdHk4YlZtZ0ZmTkFrMmFJdWpkZCBEWnlzME5Oek01Y0FvY2JObmdmTVcwNE9EQ1l1NHBNdVJEWkNHOFBuMXZFdzFBVjhEOHpjK1VFdk4vZVBQZjVQM0lEQTRjRDROaEtLIFptS0w0dURSckNyalVPeUN4Z1dzTUtIS0RwNkhEWktUTVFzQTRPeS9nS3ZCaGdzb1QyUGU2dUJud0IvK24zN3BoUjQ5cXR0RDBDR3EgQmtvcUhaYTNHYk5QNEdqWTRsUGFMYXNJRFl3ZHdtV3B5UVB5RFk3TFgvZFA1TlY3NHpERWZaTjgrZzcvQU9md1BxUWZtcHlraHk3byBXTGdIQU1xbWtpa3JaenBwaDJVS2x1MWRlM0tHbllWeE1xQ0orOXRrQ0JCcXduV1lzbU5ldGw5U1FjWUVIQUJqdndFLzFvZDQyVUNRIHZVbTlFSWxmRFBFeFd4Y3F3R05paGlmSjU2RldPZUNzblpzVFdrUWp1dzlLUmsxKzNocjQvSDVmNnVweUo5Z1ROUHJIWG8yR3J2aHEgdlVja1l2aUpNQTBrSjRiREkreTNNdE5ic0J3VllDZTJndzdOeGRvV2F6T2NKTm80RDI4QStuOWdxdmRHWlhkeU9GdFp0YVRHU2h3MSB0S1VPT1RyMnYyMHdMRnl5aWJNSDJRdDF1K0dKakI4R3kvZ05Vemt5RUxaa2J1aWJDRy94RjFZb1doNklJdFJ6RHp2YWxmNStyUWxmICtueWhsQWJTOFgrSXZTL2h1Z1pQWk85cmV5U3lEaC9FdDhDRERaV2E1R2haWjhPRTJod0lBZnFJQWZ3WHp4OVAyQlU4Zk55eVI1V00gMlFTbnpLSzdnTW1TMENROVh1VlpGS2xSSEF3bjkxRnNPUTRxK1ZlcFZYeG0zL3N5eThhaC93RHFBUG4vQU8vMUU2RnkwSmZIT05vVyBkTU1jTERGQmsyYVBrTUpMWDJrWS9nWkkxNFYxUXZnNk5ORkpjaHpDY3EySHBnWThqdXpKNXJFVzVnN1JiaXZSOVlvWjZ3clJ6azZwIEcySVFReHBBU24yTWVySURGMjh4RHRSYlpPUHVGcVBsZmI0NE0yMXE3TlpscWNKZHZjQndIdENBMzhCVjF4VDdFTXNtU201dGtNanQgbERZeTlWOWIyUTRNTmtORGwydktQbmNoRG1HT2VEcG1DSXZvWndPVC93Qjg3M3ZoemY4QVlFRUJzQy8wd2lqQVVvY1daWFo0QmJociBic0VyMnYzeXQ1RXN3K0FXRm8rR3dNYUhjRXhrUXlDR0RmVStmT2NDZG1JYXVUR2JJYlNBYUNCZnFFd1BnT2VnTEZWWFlHWlFWYmg5IFVzb3dTUFpvMVNzMnY0YnNIbGgvNXZVRGJTZVBtUStIOGJJT0FNOVh6YWppRmxaVnlqTXplRU52SFBnSEFRQ0NmdzZRWmpRTWtUZDcgb2ttWXgzUzN0WWNHc083am04aFJGRHAyeXdZcXM1V3UxbWpla1NRZThPMzlPV094c3lVM0xTZHZIVk0zQmdzaHR0QXcrTkVNYWVhQiByYTJFTE9WYlFsc2t0TllISm80K3QxdTl1RU9xOW5OcVh3RFljWXpiV01XUWFUK20vbjlnL1lPbzE0cnBMY2pBMzU2clhGYm1UMG51IHhuR0NNdm5oNnpYS0tZVC9BS2VoNmtNV0N0MGFBNEFkNFdXWlg3bUV3WnZaQVhQdmJmMzczUHVEVm82QTFLeEU4elZXZHE5UEJyQ1Uga2d6cHYxT3ZDOHRwcDdtU0c0cDhPMUZ1WVlXeUVOSW4xL1ByakJHd1EzM0g4bytjMkIrNTlnQVFYNUJXSU1nVjA4T0IrVVVHalZyaCBNbGhqektmTU5oZUxWeVJhRFF0MmhEUTN4UFc0WkF4enlCVXNGdzJ6dGV6RTlrdEZKZU9mQU1FSHdHd2FrQUVDSkFtM0NiSVNHQ1hmIGtrSlVUTzBNcXhad1RSRm8xVlpEbmt6RXJnQTZtU1paaTh3M25pbUVKYjJGeWFLTlhmampJa2NtTm04S3lGNUIyVjNYZE4xVllsd1ggVEZmR1BKdk04M1RIbTFHVjRFdUY4VktKRm9ZY2Z3TmttVEREQVl4YmNMYTNkNUdLOXlMVE1jd1NBbS8wR2ZBYytma0orNlRNeXpIeiBOcGRrTWdjbEFyZTJ0T3BzVElzSUM0SkNIVXA2d254b21WL01UMlRHeUp0NFBtL1lvYlh5WkZ4S1Ztc280UUpWMktEdjc4QVB2M1ZqIHdXbkRWSFJGWjQ2bHE5QktLdFZXcVpUdmxXWE02cHFucmV1YlF1S2lHbGF3ZldRdmFxR1hzQnc3WjFBZVZLc1dHZ296ckxNOEhFa0YgajZmMHc1RGdBWUt2U09jVU80V0ZYMWc4YlQxdzgvcVlDMDRka1dFaHlpa3ROY2pDL3dCaCs1REhXN0JhaU85MDhwSTdLems3a3VSRyBHQTk3U1FmSDc4QUgvWUIwbEZEUm5IQ2VHS29HV014UnhuU1JjU0JVaWhYYnhrTHB5MG1XSVlZV1ZJc1ptS0syY00zTlpJT1ozeHVoIFl2ZHg1SDJGQjdyNHNVcG9lcEFXREd1NzViVlhOUXRwVXJOdEFid2RJVzJpeHBZdXI4VjhQM1UyZERyOWs5OEo3d3lXYldiNFVKa3ogZ1RFMy93RHVEZjhBcVNnVWVRdHE1RSt2cTV1Q3lCdWFlb3FYZkJMN0R3TUE3cTdrSDVneUp3ZVpNSUIxV2U0d0FiSjcxZXJrK0RoUCA3L2J1L2dBRDhBQVFNeXM0ZVZiR3pRQnFBSGJZZFdxWS9USGJRYUl5SzhXd3BRc1B4c3hDcmVHSHNCYkIzU24zd2NtZGpXaTVGbFpSIHdsbzdIM2RZT0FvTnVuei9BRTdHU1BYYmJZRmtIb3FTdGphK2NCcnZmQVlOVUNtNEZFUFRnZUZ3eDhQZUpoZ09QVDY1N2dJbGpUTnogVjN6Rm1Sd2lTRTJBL2dBUDdBZng2a1phTklDVnl5VUYxZ2h4ak1kcHN4aE16aHQyL2RiYm1YdFRIbHJrSTdLNjBocGxESEoyY2ticyBqdlM1WjBsTGlNQUc1TjhWTEhwOElxbjF2K1dvMW5WcG5WYzcyQlc0ZWoxTmJLUGtRQ0JjR0JQY0pscWNrcjlieDA4YjY4TGJ3ekZDIGd4NU9KS1NrZzkvcUkvaDJpUWovQUZ1VjFObnE5WEpTcStzaGJXMmlZU3U2UXE2a0szZHpCUldsaTJnUFg4eVo0Y3dRbCtQQTZqSWEgenVqUWpNeHp6YU8vSDM3QUJ6LzdBYlI4dTJLcWtFcWJIL0dzNFdTTmlUR2M3T0ZldUJROHBsRHppNFZ1WStaZGdkUDVWMnYyUEFadyBQY3lRTkpkd25QajRERDc4ZlFlb0daZksvbW5GVVd4a3UyS0dodjZsSEExV2p5dzc0cjZaU2lIYWg5d01NbGJ2aTI0T0dxaXRHRTgxIEdCbW9Vb0xXU2U5NzJEQUlBQUJidUlEcW1rcFdiWlNTM01xaCtiamNKaGdhL2trd2JGUHV4dklWMFVVS3M2bmZtUjE5alozeUFDT0sgSGlSSTVQUE9HUEY1Q3EyclJ2dGR0YUt3Y2tlNmFRcFlhN1V3cVBFNkdxNm55bEorbDlKdVoxc1o4YkNZNFI5ME1UTEhjNXd3cU1XRyB1M3NNMkw2bm93cVNaSkNKZ2FobEpNbk92UnhacUtyTHJSRUIyTzJQVXNxQm1yczJBbXptVmV6b2JTWVNNaHRaNVFCblpoR0ZYZ0RnIGt3NSttYkljc3pCMGpTM2c3RlB4RzVvS0VDVEZtU1BWblhPVCsyWTRsV1BadkFCTCtwMG91Z0JkYnhxL05XZjlmTmFKUDdNaWFSMlEgMHJNV1ViT3FOQWtFRG5UL0FLSFN3bUtka2FmYllNVmZTenRKckt3UU1rc1F5V1NtTHVET1FFc215bHNlNGR0MlJ3VzJCYjM3Q2ZCLyAydVRHQTZUL0FNOFFDRGpzQUVCMVZFaFg0ZHlVNnhzczhOcTY0TTNPcFNKYUZoVml3TmdldWJRbVcwQnVDdjhBVDN5Ump3RHIweXVZIERoQW5RbGtZcnE3TXpWWDlKT2UyL24rbVF3SFY4T0x5UXk1VCtuZ3dMMDZ1N1lyc2xoSzloV1JjaWJxRUFubVFnWGh6UTRmNmZCUTYgdUFuTVdZbXI3WjRQRUxzSFBuN2Z3Ry85WFkwNzZVM3dycC90Vy9mNHFHVFM3ZWFxZ2M0dFJic0JlbUpxdTJhVlNpR1BtTGJnSDl2aCA4OG84OEQ4WWg3bVRPVmRWL0J3Q0NmWCtmQVBBZENXWDZZUE9naGhsYVlRYnM4VzNHOG45TUZzMnh2dStEWDc2WEdBeklqbDVGS0k4IFkwNzJZOGozQnpqemVLNG5qdzNIeDFWR3N3NmUwUjJSM3FxcGRuWElkZ2N3V3pGVHNKZjZSYlZTQitlQjN5R3QxV1FtY1RyOThnOEcgZVVOOFpsa0drbWtud0hQdUEvcjFQSjdBMGFtMThiUTRHcTdJc0pvVzMrelE3SnFRSHU1aXg2NWJJdDhHTFF1SDdnSG1iUEJnWWQxTCBIR1BPMTBiWm05dTMwSGYrUWZyMGdhWG1SNVVmT0ZxNEc0MXQzaHlhOWVHcmk5WkljcmRtaE5YQjVpNEdYaDYyd3ZnT2Z2MVZvWk1ZIGhxeXdNK2s3SHY1OEJ2NERwa1NHQmd5aGNPVW0zQXlhZGNybXBZeG5XRXZpUTljeG14TktUSytXdzdndHc0ZncycHRYenpVSEdjWFYgMlpHT2JKdnUvZ1Q0RCt3VnFGK3BaWkwvQUx6QzZuU3FadGhHalU4d3l5NFNkbnR5R0hmeDdjZVU2ZVZFS0IzY2FkZ2Q4eHhic2d4eCBDWXhacG5kdGZldGZ1K3JPV1Jia2pUbXB1Qm5WQUhHa29yNFNseUQxcVdSZ1lxV3hxeXRDTjlQRHJiSkRoOERCSHAvQjJSNVpsY1gyIHpPTzJ5TzRBKy9BUDBBZE5RSlZDMmVIOXRBeTFSUzJlc0piczI4QTU2d0w1bTBPaHk5UG9GY1g0YTJocDh2YnBpT0JZYTBuV29qTTEgWU5LeXM4SnRHcm5nQXdZOEJYejcrQkFWMWFGcXlOZGFIWVNicVd5VnRrUTBPN0Vob3VCMk1DZUd0RVMwTEdyZXY2M1FrN2g5YnI3NSBZejR3UUFZZjlSZFFmU01MUjMvbjN1QUFiLzBtVlBsQXZXV3QyTTdqUWxrSGhzbFRwK3BTV3BCSU1WS2VscHFhSG4xV25wNWluNjNvIDhQMjArcWgvS0lmbkRleDcvd0NmUHZ4OEJzQndMR2lQSkc2Q1dGTXA0MmpFeGo4QkFJczAzczZlemxIZ1I0ZlB0ZklpRXhLaVNycEogWENSQmpzeU43Y2k2VStPTmpFWkVuSThpdVNvZ3laWXNPQmFFaDJDUThvd3QxazBEYklIaVpZRm9VL2xNbGdCekZKM3lINWg5U0hxUSBPWnliN01UT1dqdmZBVjlCZm43d0I5K2g0WkRNbFVQWVMycmdYOGE1SGpmeUxJcVdqcGEycjFldklaU0hWOE9IOE5QdUJnbUk5dC94IER6cklacmc0dlVDTnZhU2J4UGdENkNBNEQxWldldFBoMUpzMW9VMFJjcjd1RVIxTlQ3NVhaSW5DSm91WHlnQjhJYWhFTVFvV290RHAgY0ZTVUNGT3JiTldoWGtwSUZkYVRhWHY3SUFBQXdJSFZSUk9zSjhwTy93Q0pxQXBMU0tPemN5UmNTU09xc2FxdDFxMmRNb1VXbk1aRyBXWlQ1VVY2SmVtdkxZWWI0VlRCUkd3OVRJVVJqZ000ajhnUU1WOS9YejJQVGxQY3gyTjhyS3R5NEJzOXIvTGZaZWY4QWliOGVPdVpWIE1rYnVOUFNMSVl6TGpoR1NOeVFOaDZzWXBjR3hUS3p3SzVncm9zUlREVWVxb1ptc1Z1c1R5ZU1zS3RtU0haRm1yWXUycllUWEo4ci8gQUllR2NFOWtIaDY1clMwYWxSdU04WEtQQXdIM1JDVlgrLzhBL2dOdXFUaDJKWmRoMC9tMXpMdEVDK1ZXRUUwK3RtR0NXeUFWZVh3MiBGWUFkUGNIeGJ0VGtpT3BWL3dBcVF5Wk5YcHNhVC8wVEIyNmdnRDc5OUIyRE1yVVpxRHNWQ3M3VWhxTGRsSlZBNmtHMjdsZE9BUml5IEdVUFdhSzFCVEsvaDloaTlicDdoamFrRGdkY29ReFpxOG04azlqL2Y5L1h6L2dEL0FGdWVLN2FLZ3RDR2tObnlheGNsVWxwN3FkcWYgTGdZWEJ5cHVJZUZ3MkF4RFE3VWNPWTluSUZQcVNxNFZCWnVuTldabGc1YUtTN25ENER1NkE0K2ZBUDJSMjNJSklwU2pUQkRHNkk0bCBoYU5zZnFvNURTYjBhQllnNjBtV1E1V3Vka0llS1ZkUkdIVkZhTm9weXUyOGVvVzlyYU5zVWtKTFUvT05EdGErMnBaQjhlSzV2QzVrIGd5TnIreUF5VEdZVit3anpBSk1haklyREtLTWhCUDFJZnMzelBnRVBuQjdNUmtNbzgxbURDR3phUHY4QXdEd0hWdExRNVJGeTRkalYgZldNbk90b21nQ1k5UHBLZTJCNVVWaEEzSXRqN1U0MllNVEI1aFYyNDhEbWV5d0xSaG1QZXo5T2ZBQUhBZGc2OC9xSWFRK21CMHRSWSBUci9yZEtuNnFHeHIwL1dwVzRDWk5GcHJDVFRIdGdlOExJbUI0WkF5MUFWL0RBTmdpcTc0TVdmdXFROGI5N0g5L3dDcnh5TlhpblNKIGhWSzJnWWtwODlrQ0thL01pYVo2bk1TbGVwNHNXR1BobUErRU13d1lOUS9sdncrTVZkdG43SWI1OStJdC93QWJkUGdEa2x4TVNMbkUgOFRpUm80M3hqYU0xdE1xWW5ETWg3NWJ3T29KRmtqa2FSa2tSa3dqU2FQS2VJdDd0MWk0eXlwY2JBOXA1Nlh0ZnNFY01ubUFEbG5EYyBrOUNVbXhIZkJyeEVEbm90VG5wUzNWOVY3eGFpZXlEME5xN1h3RWJiRm1tMWRaNE83SkxzYlA4QXR2OEFpZ3YzUmhYOU5haUtxdml0IDN6SmhtNGJ4c2xPQjZmZkdoZWg2Z2lrUVdVbU1CaGJXM3g3N3dRNEo0ZkFOekJuRjN6L2UzZ1VFK0FBQVAzOEpoM1E0WExVN0pGc2EgWUVHMW9CM1pITURXQXNZcmx6dm5tY3hmNWhEdUI4bUQvd0FsajBPMUZ0WXdReWl5VDN2bXh3L3Y0REFCKy8yVnFkMFU2dmNLM2lrTSBpTlNlbTU4RzNHdlhrcTdTSEZpMkhhN0kvbkdRTzRmck9uMS8zSFQrTWkvS2QwVWtKdjhBOStmdC9BQUFCSStHbWxLd2I2TG5QU3B1IElrWUtpUVJTMk54ejJrSmdtWkhsYTZZWTR0VHFZaUh3cmJRT3krcExJaHRFZUxJYldWdFJ6azhIampxT0lSN2dpMXZEZDJNOHRKOHUgem1TNDE5cXM2UkVXbkt1ZFV0OERMZy9pZFRrOWIwM3pNVnQ0YmVld1dRblVEUlE2eWpjSjRUaGlmeHQxK0FIMzQrQTgvV1JnMUFOdCBnRXRVQVpKU1lZR3lIWjRvY2tlVDFOUFRhbHIwODBRN1FNSWFHdHJjd2h4VTlZQUVGZzg5bTJobUduVGxYRy9QZ0QvN0R2NzR1QmZUICs2bHFNZEJjK3VhdEdRMjJSNjNyMTNMU3owcjVWOFRGK1p2QzJudmcrWUR4WUxMbklZemEyaFplWGkwamlTajhCdDFCd0FQMndBSTEgNHFyVnBRVXV5YVdUWENyb1l1d28xZTJnN2FlNURZdE5GWHJ6Ull5SVBEOTFJWWQ4SEdGV0E0UVBoOFpmQ2hObSs3T3p4c0cvdngvbyA1RmpidU56dks3eVNCdTJSNHdVeWFTVHVMYk5qRVlDOXc4am5yRkp1S3BTSm5LUlFpRUt6WlZtRjlRbWhoR29YdmFqajIrZXJMTDliIHgyM1R2VXJtK0dEWjYxYkNKeXpBMnQ2M2lNa3BYWGdNcUhpeUdMSVpJYmg4eUNoL1AzZ255aG8yejNOaERmUGovd0MvbjBFQnBWZzggeWpid2FWY1c3SU5lSnVNbFRUeDJyT21JcUUwUmNGY0Nuc0VSOGIxQmtERHpONFQxKzJ2aDFtemJYaGpqU1ZYTzNQdkEvd0JBdndGSiAxblpIWkhUSloxSkMwTW1OaWhqVmUyQnpZZXB6VmR5TFJhdjlyZ1E2SG1XUk1YNGNDQVJubzh4bEpJZTZEUGQyTisrRy9uL2ZnUFduIFVvVUIxODhPeGtXbnFWU3JpcTJwQytIMFpoN2p0U25Ma1hnTGxESU1qSjNVbUo3Qjg3aDdhOEdDWk1weVptUi9OdkFEZ0cvN0I1OU8gb1Z4R3l4U0NSODJVWkxoSDJZQWw1TGJETExnWW02SnY0NmVGVjFqS3grdGdoZVhMaGtsQzVSNDQ4WGlPN0krQ2E2aDA5ODA2SkJSYiBhSjdJN0hvc04yRXVEVVlEaVppSFk2UlVzV2F2MXVITVZ1WWhzQ0cxVDdBd1ZWc1h4Y1h6blpPRStBMkIrNENlQUhsanFJSUovd0F5IHZiUVRhM0NMZFZEVzF0c2hQenBHenlybEUwMlUxQ01HOGN3M2dndHZEYmFDbHlRWCtMNmdHYklrMWR4L1lOLzM4K2ZBTWhEcSt3SmUgVzdhZkF3Zm5ZWkRaSWcvSnJmaEV6ZEphdXJzaEdIRHJmN0o5SFEwOEZ5UjVaeWo0ODI4ajkwYXQzOEJ2K0I4K0FBSUpzcHg5T2N2diB3eGtGV3lERGtlb3FJajAvVlpoM21OQ0pYcjVZeTJQK0c0aDVnZGc3cWdWL2UvSnEvT2NMVVNVbXJjRC9BTC9sMzhRbnlaeXdScGc2IHVkaUV4b200RXlramp5TFpKNTNjZ3VQMkVYellFd3N5Z0t5WUk3YWdPNXh6eDI3UUNtcnh5MW1yOXQ4ZFZLL3hOTUdrSFZublk2YWcgSVRWUFdEczJzTGdoZ1hndC9NdGd5S2hqNWlHSDFIMG0rVituUW9EQWV1SmJaeGd2SGF3V09QOEE3QU1mMFAzWXNsZ3RTdEpHbytCYSB0WTFkWVdVdFkwNHZtSHV0MkZPaTZmZEtOU2xJUUF2RFFxSE1PS2ROUjIxUHdoTWlOcDd1VEhBbzhIUGQzZmZjQXdZZStEQWxDT25OIGJnWlJLMWNwVlFFNXpQWUNXQWw3OGthQUphVitQeEV6WjF2SDVsamNmZ1BHRm1NL2pDWUkzOTRBSHo0RGZ3Q0Q3R3hpUkhEVlBWZDMgSHJhVzBPciswdU5YaHpBWjNjT0J5L2lPRmdURnN4ZGlmVzY5RGdxUTlEbko3TldhdXJFL3V4dEp3QWJCNS9mei9WbVJYa2pLbjJaQiAyRnBJc2hDaGtRZ0NPUEd3U1k0bHpzWkR0RmFJRVdPQmhibDQ5Nko0cERGTEdUSkdZbFpsa2lhd015UW9LM2lWSk4yR2NjbVpoNHhpIGg1dWNTSk5GaHBMWlpFTkRhSWhpMExhbHRLdUgrSERoek40WUpqVStWZTIwRERHTTR0OHN6WXdsWGhEbi93QkFBYkJXK0hYY3dOV2EgVFl3RXg4UE9tU1ZNd0JtV2dKUTRpYnVrVmsrSUg5MCtHdncxVnRYeUU3azFaaXloUlo4MzdjQmZqL3VBNEFmN0FaUmJBcTZvWkRIaiBaSXlTcmRUTWQyakhEMFA1WUU4dDJBWXNsUFQzQlBBVFB3ZWVhbVJuWnNSWk5tODJFZUFBRFlOL3dQN0JpMzdORlozOFVzdDJONXdZIGtOWGxmSXprZVd5UGtvUytORU1nWStHeUdKamd0ZzhQZ1Z6Q0oyK2hxL25VbndlL29JRDNBZWZPRGNGZW4vSnl0dC9UK3h6eDk5bmogNHg4bStzN2NzeHp5N0dlc2FySEFWNVBuUC9iRWlqZDlXV3FCTXRqVXpucmRmV1k5aGM0bzFWTnFaUnMycGRRN0FvTENkcDd4bVRjRyA1a3RTcThGbE9FWTFMYjRFSFQ0dDV4eHhyTzFNREtSeUQxZXJGQTlMN2lmd3E0Ullic3QyeTZWMDlhWUw0dFBLa3R6OUZ0bXBWWFBLIFJLOFdWUFY2ZFRxL2NUSmNMNldKZXhzZ0dncVZwcldGbUlTcmVBckgxWWhRWjYzRjlmeFF2YkIrSzB1djZmRlVmL2l3TElaTE90QVAgR1V6RmhOVGhYdGtPVXBkalNwakJWZGtNaGlZdHVDRnkwaDlQNU1VVjFsbUJtd3VuaTFEK0d3VzZmOCtBVDlpSWNlMzZYczk4dEMybCBzTUdUN3NxZGZHb2E5SzVsZHpZMElaanR1K1dSRDRkczV3OFFxWG1IN1VNR2ViT2Yvd0N2djNWMXBpNENxbjB6OGFXT1JMZU56VnE0IHNZN3ZITm4ySGdqanFzV0NLV1lGbzNXV1NTQ1cwa2pRVXpCc2U3Q3hRb2U2dU9sTFI5Z1NIZHdHeE5hV3E3YmM2cFJ0OHlNNWJIcWMgeXhqeFpvdm15V0NIY0ZiektIY0xBV3dmNXBlQTR3WVU3UG8reUd3aHdCNERyMGFXM25tNDhPeG9SamhPb3g4dXdTUVNkUGJ3d3ZuZCBCZXJsRVpGOXdEbUE5MkxaR1k4UUdCdGFzQm1ucTBLdnFBbmk3Y0p0WHord1lWRjc5VkZTMGV3S1F6S3gxYzk1Z2xoV0NIc2lJUFNYIFpmWVZ1eHBRbVZGTUVJaTN5TmJtRUhFSnQ4QTRoOXpOMEdMTHdFKzhiK0EzL3A4QzdReTJNbTRIMDFWVXBnYnVSRXZESmFqRXVaS3MgYVhZMTNPQThPeUo4eTFHUWdZK3Y4NGNkc2ZPRFBQaERhUDhBWUQ0QmdBYyt3UklZcEpHZUowV0ZxVGhzNDFBcmVoZVNoaGR4NHZpYiBwdTBZOHRqV1ZVSWRYejJaV3hmZGo5TmpIdHVESEttV2ROd3c3YUFCN3lldEdZdmc4MURXMDIxVlp0QTV1VFg3Q09McEpndDRGVEtOIEQ1czZmRHA5YlR5SDhoVjg4SHVZd1h5ZFpCbS85djRJSDcvMXlDN29NVWlqdFhJdzhrOHBIcTNxZDREclRSRS9GOXhwa1d5R0F6RFcgN0lXOXdEbkxNVCtLbU9jQ3lneFo0U2IvQUgvd0dIMEVBemlGYnlJQytITTJYREc2YjBqaEphdHpEdGVHSEErSmxObklyZGJ2a3REbSByOHkxQjYrZWFnNHp0ZTBERVo0Q0d6Yng1KzNUL1VQVGVuOWJjbmpPZ1JYQkp0UzdtdGtzSWhiVlkxL0w1UWVySUNyNGo2M0RzaUdoIHNwQndzWnR0Q0JZeGp1WUxRLzZKMlQzZi9Qcit3QUFDOXRBbWN4d3ZpTVZlVG1pRVBJckw4ODhmQnZvUnVLekZWU1pGUWlVeUpqSkIgRzJGeU5IYlY3ZUZ5NzZKeVd1aWxUT2FaMmk2Q1Z5TytTLzFXTGgxTExIWkxVSExCOVFVVmVBMUxNQWM4bU1qaENUcXJhanllQitZVSBHY1g4R2srRFBZbjE4L3NDRDBvRmNmRE1sQTZhNTJSS1pLbHpySWQ4WHlHNFdGRHJsb2xvYVlZN3FYQlc0ZGsxSWZEQnR1UGJreHlaIG9WeGd6aE95YkFmQWVmOEFQOURZOUxjTTV3YW0xU0cyUlhyNW5NbHgxT3RubDlkVHlnc1NCS0dQaC9ERHpGQ3IwODUvSU5Sa1l6RkUgTW16SEVrSWJPSDlnUGdEL0FJREJWMXVZT1dNNFRBenZuYWJ4b0d2VnQza05XbGZVUnZENVNLUTBOQ2RhS0dIREIxdVk0US9uci9CdyAvZkpZdVJHWm5qelp3Q0E4QWYzL0FHQnlSTkR1bDVNMFNGSThxeDI1UHNsckkzVnQyMlBQdUhucUF4a1Jzc1hZenE2dG1MYmJ4c1VGIEZlOEc3UFBOZkhWakhCT1RhQ2NtcXJqNlVsTWNnQ1d5NU1LUW5YQlNkaUNZQWsyS0dtaG9uMXRUWVFIWXpac09QUHc5V2ZIV0FhMGsgai9SblpVRlRXd2dtUGt3Y3JPdWRhdVdoNjdpRXF5Wk5FdW1tL015dDJac1ZCbHdBdFk5NGlGZDhIK2hsS0dzNDRtREFPU3JoUjZSbiBHVEpmTFRvVUdLVHpZYTNsRFl4aGhPTUdVV241dWRBOGdEc0cwK1JEa0Z2cDZzZ3FMcmNOWGZpei93Q2IxSkV6S3JDYUZRUUNCbVRRIE9QRjhYV1g0SGpxc2Q2dEVNcFE4T2V4Z2JSQXdMSFNWTWhhanRWK28rSEdQTzc1SzIreUErTEpWYjUvUFQ3QUFuRTlHZVNndit5ZWYgZmtBQUFBSHdEOTFhalViWUY2Wm9mdVhFYWttNElHbS9TcnA3cCtxMDh4RVR3QjdDTVVXN1JUNGJJSHNoYklPRUk4UDVWTVdTZkZ4bSB4dTkyY0hRZjArZzcvakR2RDVEcERUL2Z5NWZDUzdOV295dmh0T0dLWlBCMU9IRlRaYWJ6QWdubUlka0dHVHpsYUVGS3VlQ3ZJdDhaIGxoSC9BQmNENENBNTlVU0MvSDM1L2FpS1BiRjJ4RTljaXZsSm5vR2RUZ2tPazUwQjM3dFZ6WVNhMGNmbUlhZlZaZGxINFRqMWdQdUogaFpSbGZFbVQ5a2tJRFBzQURIdEZzQUJCQm0wbTdCQVdRVFRJOGlSVHhSSkk4Y1V1a2ptbWhFUWozSUl4cUVaNVNmSlFLb3NucENDViBvcFpUSXlWZ0hWR29vN1dZa3V1NFNVNEJvWTQrR3k0U2FBUUY2a2E3c0k4blF3bFB6eHRYRnUzdW5zT0pjTHVGeThBTnc0VytucmZ6IERCQmIzNnY1NFA2enp3bVQvd0E3VUFBTzBXd0FQUHc3akRqNXJyTWZMR1E0eWZTTXdieGREbzFYckxpNVNzcFVvT1AraDF1K0J5S0cgamdWLzRMZ3pZb2F2emxHM3MzZ2Y1QWYvQUdEWVlkTFg2M1NKQUZEZDNhTlNlVjJjdGVPQnUwTzczWUJLTU5vUGo1WDdJSGh3K3lmSiBBZExFSUZWODVSbWdxekxKeXJnanM4WWIrQlA3L3dCYVZzNWFGMHc4NWN5aHBKcXlwcUJadHdEY2lRMkdDaUd3MXpHVzZ2NUx3T0duIC9WVDFmMW84VEdibEZvRTlqTmhQUDdBQXFML2YycUpvbFdaUStxazIzUUswam1ONUl4SERISElXcHNzOXBteHIwell5ZTc2SmxsYU8gQXM2RExPbGlPVWEwWS9hbExnVGZQSnlGRGl1cGpUMnZzbGNrUStyN1RkY0ZTUGx2MWozQ3JlWlc1aFRaSHZWQlh0RGdIelo0YkkrTCBjd2haQnhTWUcydVlmR2Zvcnp2YVJWencvY0JQL1h6L0FMTDFnZkxRTXNDZStOREkvZ2JhdUIyczFmUEVzZVlXMExVeno0eWozQ3EyIFNxM0MxSEF3MWRuNTZvdGpDZlBIa1p2ZXlQR3dmMkRrSFdSR3RrMGUyb2xhb0sweEM1TGJXTmthZkhjN3B2c0N3YlRUcFRZK05HbTkgd0RXUStJbUlnZStOVFlQc3EwekQwOHZnd1lTeDRUVjV2ajc5aHg5K3h4d21GTXdidk9PSHNGblQ2dXlURmhTYllNV3IrVFRENVY3WSA1TkRKWUQzOHg4cC9qOXFOV25qVC9QNTRNR0lhdU04SjRNKy9MNS8zNTkwSWtrajFVcXZwcEJEaERXc1ZzODZ6dUo0c1JVa0ZqS2JjIDlmY3ZiaTIrOURSb1VLN3lMTWpzRmpmdDNJKzBKSUdzMWxSdGNUWEhjYjZrdTc1RGo1NVhsR0xSdHFoNjlaR3V5SzlpZlc1U0pYMW8gSGxzZUk3cUtCaFAyZDRBTUNIQlhCdkEyZmF3ZFhCTWNYN2dMOEFQNDcrZjRoWWJWZlVDbzMwU0JvYkJ3clc2eU5PNmh3OUtOTU9FMCBQb2k0eXloUDRoWkMweUo1OFBZL3o4V3RaWlNaVkNHZjZYNG04UGZBQmpoZ3dIMnJXK2xlN0RJRE9sVUVlSkI2MHArNDZucWQyczZ2IDVhZWVLTHlHNU1nOURRN1VxdHdjQ0VNSFBYNjB0UlBKckxRTFdTWVBZMGtIdjc4ZzcrZlA0QUNRNWFsYjNjNlBtd3NqdGY4QXFDeVggYXdrOTJQWEF2R0ZoOFVxbHFXR3dNaTNaQ2V5SjVDYXF0dkxZSzMzZlYxY1pqL1l6L3dEL0FCQy9BRGsyNDJhU0cxaGtkbUVnNTljNCBmVGl2eVBVNXZuampxc1hrZ0djcm5CRWpLZzFISWgva1dST2NzdTBxY2hoVGNObDIxWFc0NldoMUhjQ1E1Wkp0dzFBcDhaVHo2cnRvIGd3dmxqUGk5VjljdUpDeUxJcmRQUXNYQ1pCZ09OdFU3TVp1VWJvVCs3VmNEL1lOZzgvMWFpdjhBZzU1Y1ZVTlhBMzZxbEhadFlZOVYgcXRzVjZYY2hjdVVlRHNEZzRwL3pYREFPcTdlZU5tR1ltaHE5WjdHYlNmMDl0LzRDL24rbHVwa0NBRzNFa1hLVkF1L05TMnBvL2JHdiA1YklVVjE0OUxocjRlcTF1RVlaTjRhcmFYM3hIWkJneERWaGpOL1d4emY4QWovNmZxZUNsdkxYQTRlcW5Ka2xXRUJWZjVnUFRKaGhNIEs0dVc1VnpaSkJEMmQ4Y0Z0Z1QycUFRVW5oa1ptWkRhRmw1ZDdScE4yTi92K0FEQUJ2d3N6eXF6WVAyTzBxaDF4d2tmQXBnYlBweFUgY0kvZ3NUbHowMk1xMGNZU05DNFJRVjA0enRJL2ZJNTdjY2NseFdqbGJkd3JsSm5LblE3dVUwOWpQS280UGxMWnV6YW5hdTVEWWhpMyBOaGxWTE1JT0RJeUljTjhzQ0h2emczSS9PU2l1TUorRVNIWkhRVUhmKzBXd2JBNXN1djVESFY5bmFYejFieHBpR24zWllWOHc3VWoxIGxEY2oxVDEwZXJiOERyVEl0OGdRN0dCSjVBNVcvSmloUlozenpaejlQMkErZndyb1lCMDJya1h3OEdBdTd0bEFUbE9POE81a2RUREoga3FYWEt2RFg1bHdjRFEvcmFxZVlFUGttMlBuQm1iWkFuc0FBQUFIN0EvSDVtMUxJWU5QcllrMi9WV1NORHU5ZXJlejVPY2pxYkhGaSAzZXJ4WHplRENITStHUDRPK0w0RTNNSjdwaVNKZzNZSlYzL2Yvd0JnQVNSNUpHamQ1SFpJcmtoWkd3dU5DaUdKZ1EzOUtTUkE5OGJsIGxlQ3BHT1BZM0l5ZHQvVWdsRlpaSTJJWVhZckxqNE5BZlBUQzhJZUtzZ0dkWkJzYTI2aWlVekVPU015NWtYVG5FZTNLRVErWHM2MnkgSjYzeEpmclFIZ1RyUEh0QXpJNXZlKzBSOUJBSC93QmdRZmtPeE13TTZBVE1xenVFeFE3SkVrSGc5ZmxyVWZFM0VDZTdQcDhOOCtHaCByOHlkV21Da3F6TUhrbytJM0IvTjBlZjhBK3Z4L29yWDA5bmloK0cxK05kcnlJTlQvTURJYVNZNUdMVjE2eGxjUGFFeE9XNGI1N3JkIDRBYkJuZzF2NkdoMitNQm16YVNqbi9QL0FMQjFKV1E0VTNGcWRiUFpUc01QWFNZdEdJUVBVYXZyMHhOUTY5cTlEaC9NTUdJWmlHbnogWGlsbkE4MUovR2VVTExNYzJOSk9IMEczUUgzNWd3NldaZHpVTEs4alN3eTNDRlNPNzNNYlpqbnhqWGFLN3JQSXJsZ0NCSGpSTWNjNyBkVGxISVl6RjdHcGJ2UHU0N2VQT1hDcmFhalRMcFI3NFRNck9kdS9HVGFQc2t2aVFwc2lkVXJGVjR0a1R0bjFVVEVNd253NTA4ZUIyIGRHR0luR1VidWlETjcvdjUvaitPL3Z4aE1ETkZhQjJyU1hjamhKcVVva3NqQ1l1Yk9JcWJJVXRHWGJRdW4wL2dZY08rR0dEdHpQcTkgOFZiSmVXWllWL1lIai81OTdBSDVCNkpMSVI3QUFwaWVabmg3MUQvVzJ4Z2NBN0JMaG5vcW0wSy84NFlXdzZmRDhIUDRIWXpJellvZSBMTVRlRFFUL0FOajYrd2IvQU5Pd3BSWitlUXRydmRNTjFLZXA5QVh0VUMySElYRzRNOFZzVFFNTWZEY0E5Vm1XUnd3YW9Gd2R4b1pSIFp0Q3J5YXpzbUhnQUMvOEE5ZzZ2ZFFTUnRPaVNZekdlT1YxeStua3RRQWk4ZW1PTUVzWTBlVGZGN0RDdHJCT3hJNU1Zd0JJZ1BkbjMgY3U5MnovNWJvMTE1K2xMUU1ZTGIyZUtiYXQyT3lJQW41bWRYOVpHTFFxOHRZM2RSZURwNGVGTW1KN0lDMDhWZTJ6cGhNWXJsUDN6RSBKOUMvWU5nUDllalRRaDFFRnNDbVF6SGNCTFZSVjQycnJONUlOc2lzb2RqV2d2SG5LNEI3SW4xVkRjRnR2WkFRRmdnVG5EK2w3TUpnIDZ1MlNxL1lBQTU2ZlA5SXhrTDNGbGFOYitTa2l6RWdQcC9Mc2NXeDdCc3BYckhDcjJtMTd0VHc5UE9NUml3eGZHQU8xS1UrcHArRkYgOHBLSXd3SGhqL3k0WTFGdi9QY01jSytCMDlYNHVTeWp3R05EaWpZeW00UXd3ZGVodEVWZXNhWFNhZVlXakJlSHVESk9QcDU1cVc3TSBlZXpkWmt3Zm13ZUZ1Z05nUWYyQVpXYWJibEVtM2c4cVJTZ2VvYTJzaWtpbFpJdnR5Q09NdmtuRmFBSlVsSXY4aUk1TitMdWg0NXI0IDZQTWN1cXhjZ2JsWGRERzJRbXJadXdsOE83RDdDTUZBTHZTSlJQSWZObUJtU3lGOE8xUGxYdm1IK2poUW45Sk43SHYvQU8vOEI2ZkIgaTNGczhoMTdLLzAyeWlUSXcyQmNHb3BnaVF6MTMyYWh0RTFmY05QZFZza3hEc0QyM0d5K05vek56d21UOTZ1ZGtmNi80QSsvQUFDbCB4QjZiN1ZWM1ozVjJwQTB1MnBDSmNnbVY3WDZvK1JXaGV0RDRmdzZyVDZyVC9zaHdFUWJiRzNQdWg5bU9KSVRuQUQ3QnYvN0JBcCtqIGN3R0lXRWtacGgycCt5NjNDTmp3SFEyaFQzUkRzMlVyQjE4eE1RM3d3bnVESnZ6Z3BVZHlaNWFPTXMzbTlqZmtIMlFkZzJBQUxEY24gM1RLaW9heUVod2VMMjFhYys3bjdoV0pQVEhXUkl5UWFSMGphRitlL1RuaU1WWXJIdTVzM2ZBRldRTzRMSXN4dU1OV2EwNTJtOWsxRCB1MXRSQTdWY3hCZXVCRWxLYjVwOURNS2ZjSEpPSCtDcVcwRzBHWVJtWjdxLzlmeWlEN3UrZjMvNkRJMS9wRGJLUkY4U1VuYXBiYXRWIHdaTE5EdzBOUEVvWlFvV0FpNmZJOGsreVRONVZKNUE5ak0raDhaWnZ1eHM1L1Q0QitBQUQvVWRNMUVPQ1JZRXl2bWpKTjMrRytTa1Ygdlo4eGZZVU5EaXU2dlhLR1BEcmtPWW4vQUFIQTRlc0VDMVROelZ5ak52bnYvd0NmSDhEL0FFN0Jkb0lCUkhTYTVLTGRYQWRTMVBrcCBiQU5jVEFreFhQOEFFelRkb01qQXlXUlc1Z1J5RFl3T29ENE9CU3pGZlVZODRIQWlTaysyL3dENy93Q2ZCSjJqTVNyQThNVDdWeU04IFN3Sm5kZXRLOFc1V0p1bEZEeUJZNmpSeHlzWmhNam9qc2lpUzRuN2NieVM1TWZJb1dmSG5wYjFCcDBzUVU0WHhtbEFKc2F4bUttTFcgdU5tRjBka3B1dVdHdWFsVU9lUTNCa1FqQTlibnFSODhqaUJnekVxTUdXcGFITlFldzRzSHRnd01IVENIc0FmS1gzRGdWR3NsVmNQYiBhbnVCYnVhT0pmRmZSRzJSWlZQcDlWbUlscUtENG9URGxMM2haY0gzck1vK2NHT0JFazJEUVBmbndBOC92ejhxMGRvZEUyUWVQYWFiIGFzaFB2aDJiUkpqSnVhT3ZQZFhvY3RFYUU5Z3VCdzB4UTBOOElNbGl3UDRlR3BiMnhDYU9UV3BqZHFTRCtnZ0QvVWs2WmEzWUlmVHIgVUM0azIwNFpwSnNpQjNEbEFrT20xeWtJZHltS3ZtTGQyVW5UOHp1cHNJKzJxQk1kc3hkTmpLZ3RUaFBCL3dCZ1Avc0Q4K1dPVjlTdyBlazAwcm1WWmRMSk5GSVhNTUVVdjFCbDA4ZS9ISnRSc0VYSEh1QmJrRWhFNlF3U0NFb0pvNFVoWnAzM0kxM3RVUUpOTytLWEl1K1NXIHJ0eEE1M093MVEwOU1uaHgyYnB6aExkaFpSZXJ5MW9QbVRXLzhRYk8wVU9MUG9ZK3E1bWpSam1Ca0N5T3l6ZVFCNGpGaG9WN2daVWEgcjlsd1lOL1Ard0RERUJXU3N6S1cyMjVuQzJpbVdUT3RzUGdXYUtmUFYvTFcyaXhuWjhLUXlBY09ubUE1aTBKaXFCSUh1U0RGbDhmTyBNbkVsSjJQWUQzLzBDN0ZmdkVPdENBRVhwdXpuWmJUWWFTN3RGcWFiM2lJNGRwUk9xQkREajBPeUZ0RGh2bG9WWFhMNXNQMFpsMDUrIE1PY0pOZ3orSG45ZytnMDVxZXZvL1lzUG05c2FCRHowbGI1Uk1jSEN6UTh0WGJKUjZZUWZERndJVmtUTjRPZHdMTDJjbWpDMWRtSisgRWR2b0ovREh0RjUrUXlLNjdpczZoNjdwSThIZWlQZEhrMkZYeDNOWUo5dFYxVXhWVFNMU1JWaUFja2JQRDJ5VU1zYUFQYnh4MXVNSSA4ZktTekJUTnZoSnJjQ0JqYWhFY08xR0piNStRcnVwdXQxK1lIcmQ4aG1lSC9Bc0E4cXNuWTFvRjJZTUI0bXpad0FBOStmSDkvUG0yIFpXNkhkeStUY3NVK25NbXpBNjN4ZTdPOEhld1hZMVR1UXNPd1RLZm9kYmNJYS9hbGM2aDhMcEJwN3l6b2ZKaGlPN0cvZGZBWXZ5Qy8gQU4vUHVZSHdQS2oyMUFybGxTVS9EVkZXNm1qV3A4ZW5JY3Q4VTNLdVRDZmNGVlBnZXEyUWdHZUR4RDUwTW55aG9lVVlIU1lUNkNBUCAyNi9lQVA4QVVDMlZQSmJWdXR4N1FCc2lwWExqWmE2RlVQOEFMMkpvZDZsRjJRUWhvYjRZL01ENU9zdFBRNTI1dlBLR1czK0U5cnQvIDdSQUY4Ky9iQWZNekpsRzBBUkhqZFNyaGZVZVExaEhJd2J1ejdnclVNQ0NNV3lOUUt5cTBNd3QwcmovQ1NMODBidjhBMjhmTmpwUHIgYXZIbEw2cWtaVTFrVDdMTUtTOHIyRUJ0aFRjTDVLQ2JIbExmSkVQVEduek9YdzdHNCsycXBpczJhbXI0d3N3R0U5bmpZQUg3QUEzKyA0RWM1cDZQTDVKWG4xN2JTcTd1RGJMWUpqVTBKRnFJYlJwbFF5ajR3Vlc0T0RKdkE5UGVNYlFxYXh1TTJZK0ZHWm04M3Ztd2IrQS9yIDdxb3NOOGRIZFRKV0RkT0VhMUVPeldTc21peUNXNzFYRlBYSVVQVEU4TytQa3g4WEhDNEVnRGdlQnA1UDJLREJpT0VDV2phaUNBMkEgQS9BQUhWaE11MkZPeGltZFpkUVRXMVBEYmxadDhCMlMyR0grSmFMWVJTeG56K0c5d0R6RSsxQ0g1YVlKK21UdEFzdm1EeThuT0UzWiBwemZnQjhBQVBud0Q4ZlVzZHVqQnFTSzhJbVNKNDJ5eHZjUjBNWnJBWTdVY1BrNVo5dU5Sc1BWczRibUNsbDRrRVlzT2lQOEFibmFsIGpSOW80TmRCNUJmbXBEQWViVDJjN09FNnE5cFJocnRJRTRQa1VTcmk0YmdIZkRGd1VuTStIWEorZStJOHpja1BqT0dPeUJFZkUrZzggK2ZnQUIrNjNHREF1dm84T2xpaTNHYWpORDF1N3lHck9ZTm1sSGhOOEM4TFA0MitXUzRJYmcrSExMWDU0TjhHY0R0RVl6bkFuZytBbiAxOUI0Qy9QM1NIVHlFaDN1QlAwdDl6bEprc3h3QzhIUEdLdmJPNklGM0dBS2ZJZHlERkRYeERJVnZRSjRlQlZSSDVRVjdNZUtyN1hPIDJ3ZTNQK2ZXNzAvcTd1eEw0dm42ZnJCRDM4ZVBCNjNYbGVwYk90amVKVVhUZytIc2JRWk5RbGJza3lrN2d3T0hrKytPTnJOWnE5eVAgTHp2WVFJY3dmcmQyQUFnK2Zjc2pSOENWOHpXY2FrUnlSMVdPNHRQN3VjZWZJWS82VUltREZDeU1pdXlKTkcyY2NtT0FKVTB2aXhZNSBxL1BTeUhNaFlxdUp6QkIwMUViU090Q2V1c3oyNEQ3eXpNbWFRZERnL0xuenN4bkJNNlM0R2xodWxDODBPU1loT2JuQkJjd2hQekdWIFhCK2xUUGd6QmpPb3R2cyswS0tJeGE5czZxWEd4Mm9ZTGg0WU1DdFk5YVUvNnN0Y2pZNW9sTEhIZ2RvdFMwNWx5a1pQRmc4MFlYbksgYTdBR3AwbFZTUVBwWndTZ09mRzNPbGhZS0hvNjF2SE1lZzByb2ZaeWo0cmtwb1UxQ3dicm9OeVk4bWxKb2tjbWp3YXVoZGZCcjRIUiA2WUJsVzBvQmxNWUZKcmRvczV0MHlvOHl5T0VPQjU5MDRZdEh2TVd6RmtCNzRJTGRqUGxQMFBZeklzckt1MGR6SGlyZ2dSSFB2d0EvIHNDQ2cwSDF2UjZycU5TSHZlVmF0d1ZkTVYzWTNFcmUxTENhRWkxSzV0cEljbk53WURGVnpLZnF0RHErWkJ1bnpuSjdmcHRvMDlMSUkgSUVTUVo5QmZqNERnTlJleTJGMzVtWlRBTkZ1V205U3RRRFhzZFRyZk9RN1FiTGdyQTlzS2FIY0lka1dRK1BreHdoNzh3QVdvd2pNMSBvRkdiZkRkWEpLT0FxTFlVRkNBSHdIWFlMekw4bnd6Q3ZQemdnMURtQkdHNkJyVXdOaGkwTGtTQllxYW5wL0c2M3RRd244cWJWOXRhIFdRV3MzSnB6Umlid2I1c2o5M2ZvUFBqK0ora2ttVkFrVVUybjdJNVloTEhoSERJZTFOaENUMlJScWtlR1E5b2JMdW9Qa2xqZGl6dW0gb0x1enlCSHJ6amlEd2FxbUFQenlhNDUyenlBdUxoa0xqSWRIUGRPRWlKYVN0MmFJVTIvQ201VXBObWZEZkxycFNZM3ArT0I2cjBOViBUeVpOOUtNMkx5NnBMc0RQK3lFQS9yN3FmdkJidVE5WWlmS2FLTkNVRG01eWtwMXUxRWlFUmFBdENRTHRxazErSDIzY0E2R3ZiNHBPIEU5SFhHWjVhS3ZGckowMjdVbWNQbno0QUJ2NEVBQVROeXhOUUZTdGtKY2R6MnF1WmFBMlNwby9HdzZQTUF4WllGeW1FR1V3dDhQRDcgeThLUThDRGhsR1pES2NaLy93QUI5KzgrYldwWGF2RnMyNXJRQW5wTmJtVWthNzVHZFJvL1RndHhTZ2lwZG5ZSEF4NGVHbnJlRGEzZyBUamgyelYyZ1piNXpoSVRZSDIzZVBvUGdPanZVVHg0elFwR3NrSXRWNXZjeDhoZ1kyd0NnOThiZVNSanprQ1lxQzhUdjJZaVNPUTI2IHljQmtaYTdNYUZHem5maGNlN3NoMkJJMU4zb00wNTNUa29GZWxBNmtwdEUwQ254SWFzVXNLTFY4d2V5UTNBT3RtUG1WeWgyQlBWb1kgemxEUnlaSWR0a0JuL3dENEErWUw3SXB0RmZnWjVTd2xJUTBPRm9zTWREdmdnVzJ0b0twbFhyZkFwbFB2dEpoeUh3UURnZXNiYytMdCBDTThuRGZhN2dSOC9VV3dIOWc2Y0ZpVSt5dmtkODFhUmU1RGhxTXNpdGxNaG5PR2crWStPVmNwQ0hhRU1ldHcwL1VKY0lkZ01JNkduIGdLcmhjWkYwNVVDTWN0R3JrbDRBSDhINCtBUDcvZ2g2bm92VGZsYVQyU2U1TlZYSko2RzIzSFU4TVAybmNYS1ZiR3dyYSs0R0ROVlcgcE1IUXUwdmFSSEQ4WmFCWk1uYW51RXh4QVAyd2U0QUIwbEhpaVNNYU9aSXRPN3JER3JRN3RUbmd4Z21TUHh4YmVEWTdSUnRyeFR0TCBLMnBoM3BuUTZ4aHV6UmJlbmJHc3RwMXVRVVJKR2J3NHBpR0o2aGhZOWJ5clloeFEyY3BhaElBZC93RERvVmdPNzRNaXNLdlVyZ1BoIHcxdXlGdFBjSVlQOUp5M3RuRjdNUm5qdWpTZS8vUWVmYkNmQVJEcEpmRnpWSWVYTlJsZStaWkxRczV3SkRhM0xZeWsydkFNV0d3VEQgUGF1SDVscTdmSWZ3eVl3b3NlY044Sk9mNUlPd2ROU1pYK245U0lMZVZaYTQyekRJRlMrUVNzNlBiQmc4TDFDWUpzTmhmRTk4TWZNcyBDV3FvYWVlbkIwWVlVM01ZOEpJVERmOEFZUDhBTUIxWHNmVmRQckY4Y2NzdkpOMlFoekxzaVNWdXdoOHRrVm5LWFhMNU5YNWpneVZzIHQzWlY2MmpnWENCQjNOR0tER1pHQjc1c2ZnTmczOEI3TUVTbHAyRW52aFp5Z2ptS1E3ZVBySWtTUyt6UGxXS1prOE1NVDB1MmRJSTAgWHNobWp4RzVFS3lJditSNDd2QWUyK2ZOV0xZUU5ncSsxYS9hdTFUVWNHMTh5dHJESDA2NXkrcDJSdWp2eGRrVDRlQ2VoMnFIWHc2ciBoWUZEZ3pGWk16UnpqWk5rNFJ6NEFmQWJCaUI2c2hWNXlPa1ByNVdtVWVTUnR3WHhxSG9mVWhTVjVMNWFxMWZhVHdzTzRCekV6amQyIE9CaWQ5dFZjRm5pNHV6Tmp4Tjg0MzkrOW43RkI3dkNxTzJMRjhXeHAxVGF2MHgxTHlSUGsyeFU1SWt3TmxiL0Yxak9XRDRRbVZ2RE0gQnc1QVBYQ2xjQ0dENU1zbExRUm1ibXU5blQ0QkJmZ0NEc0IvcFA2MUZPMUZkb2ZNMHp4TE9GMWliS3NCaW40NlFubEUxVHErS1pjTiA0VC81d2dZL240RmpUQm4xZmszaEFoeCtBSHo0RFlQUDVkUWtXc25oMEw2ZmNUVDdPc2VtR21rRTZTeFM2YURhK3BpRTRsMnBvOVVtIFoyNG5NRDRUU1NSdzZ0TTMwa0Uyb2ptaER5NWFSb1NZbUx3Tlc5TXJ5d3krbXRKZ1FpN2hacks0anF5RU5QdkM2U29JV0J6bjlWVjcgc2QyeHdRMXNoMkhUYTVzSjhLTGRYMm85aDRhMjRMNmYvd0NuODlPVDJZWVVReGF5RENZbS92M3Q1OSt4NnFLdjFmWW0xamNvWFh2SiBkSTJjRVUzQzJvYnhFc2dXNVJCWjU4SHpBNWhiTUdHQjgyR3IyMUgremJvak0yK2U3d2ZBYy84QTJEcUJydS9aYjRZUEhvdHdMZGtTIHF4Q0wxSDV4NTRTRnV4bkxzMTIzWVhCYlc2M21iZ3Q3Q3ZnWGhrSmpCZnVUODMrd2Z2Mi84OUpMQTFVQTVNeUhWVmVvYnM0V1Vxa3UgNENlQmFQWVhWOWhBU2hnZXQ0MlJ3OURIMXU4WUVHMkR1Yk1yaTdNckw2VHNYOWdRZkFkT2lidWMxamVLcVNkVThhb3Q0Q1YvN3pVbiBKeWt4VGRvVW5aMGttRUtvdDlsTFpsYmJlUlpIeExtR09LR0M0MnhBRVpZN1ZFQm16Tlp2aW1HWkVOaitacWltR1JzblRoWkdjWGVDIHhqUytWdTZrU2djZW5zaGlrM3pjRnUxZkF0UWNtc2k3UFdCZlpPazZ1QjcvQUw5aWZmdC82c2hWOGd4WUpXeUF6RzRMZWNrQWtCM2UgQTk1RDVkYnVYSGoyenIvQTZmZkxJVDJEZk9ZTnV6dkxQeWhaMlB1anFIUjM3dEZzRy9zSElOMGZQT0huUlBwdTM3K0pJY1d5UWpBdyBKSzJRaWNveHFoOHNhWlh4ZUhUOFJ3bDE4SHJtdGRKOXROVDNnek5BdGFKbk9FaEViNkNBQUh6Ni93QkJNTmtwZDNzUXdMU0szcmVaIGFwOWtpTkZoVEsvbDg4cEdzZ0t1aHA3SUdmQTc0SFQ0ZHFRSy9iWndhekdaOFYzbmZBbFhKUno4UkFUNEFBZzlSdHRXREJvMWxqalIgSnQyR0lWUjdETHRMSHMzM1loaE5tUVIyNG5JVVZxTENGTmw1SUdnQ1VoM0JFa29qTjNlZThBRzR4S1pVYzZXQk9PandwSTU3RmNjTCBqbVdXZVNlTDJvbjJRVzNXSzdpN2taQjhOeDRmTTIvQ0NCSHZpT3RyQlBpNnlNNXM3WWd6NER1NmYzOCtBd21KaTJLYmRoRnBGa2FrIEpqR3RraXc5UFQxZEltVmZkenZhQjc2M2c0TW5KQ0h6bTBlMmcyVERheGF6Wm14bXpid0EzL3o2RDU5eTJwRFc0RWRFc1VvWXFYVGUgaHV0MXU5WHBLcTAzeGpZejNRMkFLYVJXcGlmZkZjT0pENENuV0VCcXJkbldWaTQyWW1jQzRiNEFRV0FBZ0FHQkFma0tvQWV4Q0I1VCBELzRRZGJ4VXM1YlV5RXl0OXFaR2dYVTU1WFR5SHpMVTA5L2NPVk5wQ3BZSzJNdC9hOXpCNzQ3YytRa0Uvc0RBZlFjZGNUR0pKVEVkIE9YTXo3dXFrY1lSZ1k0cTYxN0pMYkpMN3lvN2x4NlUrYk9HbGpkMEgwODZiWGZJWXpNa1VwRWRpOXJkUmljdVNRT1BQVHN6Szd1eTcgbXlrM0tCY3kzeEtnVWt0SXNrOFkyY0RZMWhTbWg5SDF1aHVCaHdoV0RNVlorb0NlOHNuQmtPMENleHBLVGFJUFlINCtBQWJCeURKZyArczRENWFpdUJRM1pWdEJETjFPUWgwL0l0aWsvNXM2TERWL0RjSENaTWNMQTV4eUFDRHRUYzZhNE1pbkRic0U1OS8xQUgrcGkwSENHIFV2UVBZS3VuWFpjMVZVL0dpTUFFTzhObFZ0RmNGcXZGMlFRVDNER3gzQ1p5KzRxSHErNlVkUFp2OVRNVWMzOTQ1OXdIMzJEcEE1dHkgTGE1cVl5YlFWeG8zTzRSSmQyQlZBMC9aMHc4ZVhvdDNXUXdKOHlxMlN5SWhHWmFrQlBnVG1UazNlVVozVXE2MGF1T2NCUDdCejdmKyBscXF4S2dSRXdSQTZpTmJkOStXU1VoWkxHL3QyRkp3anhzR2puUzA3YmhOanZrckovTjRrVnh4K1Q4OVJzZGJTN2ZtUTN5dmFmc2lZIGVBeVd3d3lNa2l3bHROQWxZcXUrRUliNWdIaHpFK0g3Nzg4VEhsbUZxN05zZnQvc0VBQVAvUWVyRXJVejhicmxJNXRCSUxJWWNWSlQgUjZ4djZ2OEFVSmdtbmxJb2htRys0QkRJeHJiZS93Q0VFRFo5dEtxMWlqbEVQSDNTUWdWSVlFSGtEOGU1NmdMNlVlT1lKRmYweXVBWCBlL1FGWDIxYUltd0p1U1BFOHlRM2REVjFzZk1UNGEydHZoQVBjVUN2NTlqUGl5TTVSdWJ4Vnh1clhoQisrbno5UlAzUjRVck4wdFVnIGVpc2VjeWFlN0dzaFNiRjhrU01MMHl1UUlqVVpGdFFlK01nZmtsYnI3STFBU0FIQU9NWnlndEdXZDdTWGJEZjM3REFCK3dnanFGSVMgSjBUTmlydExudjhBQzI3cnRydDU4YjJtdC9FZnFuclFkd1YzSVB0YkNQSEdSYXlBN2ozeDJOdVQ3Y2oybStqWVdMdlROekVPMnNySiBmeHBRT2dTdWVUQjZRbmxGZFRmTUJCQ1lubUE3aUhJQjY1N2YxTll6aHdaOFYza1orcHZZS2lmL0FLRHNIWEcwRktUZDloRmxMRHNpIG1hMHJlbkxDc2hrUE5EdkN0cmFUelFZN3FJYmhwTFpkSlkvK3d6cGpNeXE5WDIrekF3WnMyRHg3dW9QZ0QrL3Brd1FhNjBNYWFZR3QgeW4zOHhTMlRKczFnSk9EUlp0d1dOOFRkSHdlbjkxRS9qYkJXL0xXSG5BZFpXVVBEakdHeWQ4TWUvbS84K0FjQllWWnBmbytaTXNHZyBvZW9lbjY1enJzeGtMYXE4S2I1S2FGNDg1UXlIdzYzN3FJZFhtS2RBc0g4bWpYaytDM25ZM1kyazJvZUFIK2ZId0d3SHlaNU84a1k1IFkrampFKzVWZjFIaGxpR1B4dE05NWQ5VXRyUlk3Sjg3VHMrNy93QXZaeDR4K2QzUHprTUFsOTJYYmdPSHFrdW10NysxU2J3azJRazEgaVNySWhlVDRYK0hYS3RacjI0c3A4eGl5T0NlaGtaazdjQUx4dFpOOGFPVEk0Uko4QS9JUDRpUDRzSFMzaDJRSE1yOE5JRjdJN2JhRSByS1FZSkVMTlJBTVZJb2R5US9oekxVTWFoR1JnNHJBSGdiR0RqRVlvcjNsV1d5Ykk4YkEvSDhIN1lENS9xczI0Yk8wcm9LbEMweGVuIFVNQ0Y2akpkVUxXclpLdUd1MDR0VHJSWktjd3VieXlQeXdZeFQ5akhlckVENjYzSUxBMzBqTVBVN0l2cjlmcFBIOGEvUWdPR0xXSUogZXBEK0E4a0xUVlIyUS84QWg5a2lWc1I2WmNGZmg3NCtWbEZmTElYNGVwRGVFT3QyRndhcnBvK0JlRVBrd3NYdG1IQ1FtLzI3OSt3WCAwQkI2aXpUQ1dVTkFnUnBrMkdSNVJsQkplMlhXVjVya1VLY25VcnVXQVFNUjBtUkl5eUpFMlR4YlRUTFZkNm4zM1pyZE44YzRCUExYIHc1c3RMS1dXdGpXMWpUOS96V1J0WVI1S3dvOFJEY3F2bHE2dWhyOWJoOVNDR1pRK0g5eTA5OHY3YzJaOHJDb0ViQUhzbXdJUDlBZ1AgWS9TMFBJRnJaaHFiVmV3bTJuendHMm5jZW44ZkVtQmZIbkk4K2p6QzJZbVRFTzhHU0RQSG5qaGdtekZCYk1zZzdSd0NIUDcrQSsvQSBHMHZtWGl1Vk1EYUduTnc3bldXTk4wai9BSUtTUGlDRU1vdkZIeW4rTnpEQWR4cmR4RE5UYmVFKzRrTkdKNHE3TVQvS0p2OEFFV3diIDl6NUJmZDNlU283R3FjT0x1bXNmbU9XU05YdDQ1UVdmR2hEWG53V2g4RG1jd21CMS9HeGdMZWUxRnVIZDlvVitjOEpkalNPZm9NK2YgMkRZRDRCYU1Rc2dZdTZGOXVKMGpzNFJFVXJMbHdSbnh6emRmSFRwUkhKTEVWazJuVkFqcHRSVUtxaVRFa04zYmU0TlZjRVdiQ1dqTCBSenl2VDlyVjh5cElKY2hrbE90NFpoUFhwams1THprTGZPTnVFelVJaHc5bjRrdjFwT01NL1BMa1psbDQzdll2YW90aDJCQlBuMm9jIHVCZ1RlN1ZTZ2FaU1hhS2swbXcvNHlUWURDWUZ5b2hTa1dSZzB4ekhGRDFDSitLZXF0cWdCMmZFWHRieU1CMG1iN1ZnQUdJRDh1b0ogL3FIQnA3WUdtVkxiVlhvZFN3MXk4aVR2SHNpak5ON0MreFJkWldoVjgwaFc0Y3dZbUxkZjJvamdhL1E0SWZjeGREakdjNGIzemdQLyBBTUFmVlVTM0tBUjVhVW0yVW5LTHRZV2NrUkVld1FGYjRtSkwzcFFzZm1DL1ZaZDhyaXVKWTZKWE5sSjlsMVloakdWWDA2V1d5bmFUIFNIYllBRnVZQVFCOC9VUUFvNHFNWWtkSkt0VXdraWUzYkVxakNPUjZ5SU5FMVdKb056VnpTUnRhT0JCbE1DVFVzdHh2UmtlbzRtL2kgS3JRSkdlNXdSaWJCRmN4bUhrczlQWEtUako1UlY1RFg2VG5PRERNZkdoaEt4VU1nR2ZJWWhiTUw0ZFZiV0NlRG1jWks3bmdEcTdlMCBmZ0lBKy9Id0hUNEhNR251MEdoRHFXQmN4dWpSY083T1AxdllOc0ZrOThUYVIwbGxGc2d0OGtoMnBDM2lmVXQ0QWRXL2N4NVE5czJPIHJrazJjNEMvVzdzREFBMkIvV295UXpOWHpMNEtJZEZhbkxCdWFOTXZoVnRPajJFUDhYU0lVNEh3TkRwOThwT0c0R0s1ck93SjlqWUQgSGtvMEM3TU9BKzZPTDlpaGUvZ04vckhkQXRnVjJ5cXlhR0hXMG13YmdOcWFmUnVTM3J5ZVV0QjNjajM0cmNPU01pMndMYXEyMS9kTCBVeW9yT0wrakJBZ1JKQmdINm91QXZ3RHdDbG1pbWt0RHFDOGU3TXN6eDcxNUdNbE4zSk53ZG81eFhHeHdiNFpoTHBsV1U3TWtJMllaIFVidWtIQkNzNC9wWDNVTzdPaUFSWGRQRVpsSVdXK0htaDhtWVVEZDFNcVRZUUE2cnEvdGp0eWV0ZE5WNFpCYkRzamduclpEbkg4VUYgdEhKdlkxRHE5WkdmNld2QjhBZ3I0QUFBMy9vOGJERm1WNlByR3hvcGhBY0h4UDB1cVpqSkRoOFZ0b1RaWit1bkJnMDloNnJ2aXR3OSBnVnMxQWJnQTF6Wkh1MFBqTXpITzZKdllBQUFCNS9nT0NxdFJYc1J5Wkdxd1dPcTRxUmxCd2hhTm5IekZtOTdwU21Mcmw4N1B6QTdJIEhmTGdXN1VzdXYyMjFKbUxNTDJ3bWMrN3ZISU9RWW9MOGY2Q25XUk1VbzRldm1pbWEzN3F3K1EyQUhQVitXZk1UekNydVJpdjlOK04gYnc2M01MOWNVRC85dkRzNVA2eXl2R0xzY2VFRkJBZmZ2QWRHWTJFa1kxS3BxRWpoT25xVk1KSDA3WTNHMDBEUXl1YVVjek5OamR4aSBQSjgxYnpMa1lodDVQSEppRDJMSkZsZ3lKUXhyTnJGbStPUlhNdlpkVzVOcUhoelcvb3VoMkV3eUZGT3d6aEdwc1ZZa0N4bGpLbXJZIDQ1aWl3NTEzTFpSNVpVeXVaUmlWWHFxeWVoMWYxSWhCVi9WbEloOEtuUlF0ZkpPZEtkL3RTOW1FbUtESmVRK0lRaXQxMFZXV2ZBSHAgRnNFMlV3WFZNTTdMTHNGbE1jZ08zRmo5Z3pKMHZPaUZNbzRVaWtVZ1FQQlZibGdGa1loRGw4Ym5WeHBxQ2lGQi9hTUtGVndoaWdLeCB4TFNZeG91WnBFRktPZkgrL1Z2SnVPem5YUUF1eFk4M3lTQ2ZERDkvSDUvUFZqZFB1cSswTk90bHF0NUxrMUJzMW9tRGRSMGRxcmgzIGJiSU9qSWF1S2lZR1dURzRJa0tuL3dDZkhhaHdqSXkyWldIcFJ4bVBweHdCNCtrRmhqaHlCZnQ2ZkJ2R2t5czFoS3JtMzlLVWMrck4gWnErTEhUblJZc0tWUTlzaUQyQWZIZ2xXRjFzdVFEZXF5MENtRGtTeThNYWFXdlU4T3U5ZW1vUUM5VUIzSC9tQXNNUnB2bVpjOXgwMCBybXBiY2oxU2dZeGF2MlVQaXZRNjVmS25pckg1NHJkd1F3NWpqWnYrRit0TjRHRE9VRXlZUDhKbzc5L1FOQjFGNERqb3VSWkZ5ajlRIFo2ZXQyM2FqUjNJTFkyMU1JcjNLSlc2YWZWdTBIQ3lMSXRSOC9KRmMxb243NHlNMVovaUFuelkya25GOCtBQWMvUDhBVFdNVWNoakUgc3dlTjlLemdMdFh1N3VKYnVmY2tPSnprN2N1M3RIUUFNeVFsc0JuOVJXRDUxc2JBTjlxMWx1QWo4Vjgzd1ZSOHc0aDBmcExZNHFmVyA1NHpZWHhCNlRlVlgzeXRQbGpGbWdDeWR5TjRaRUl4OXFBM2hTMkljbldiNFVlYk1CaE9FdkhhSStmWUg1KzZEN29JT0RISFc3RzFmIERTUTIzM3kya2kwSWQ4RDY5bG5nTlpDM3h3WDF0bGZIQlBaSENaYWg2bjN5ai84QVM4WFVBd0hhSU0zVllCQ2Y4RDRESHoralRZSnMgdWRaaExPMHk2Y0ZGWnpTU0RZRE9uVUVrTVNFS3NiK0hWZ1JIK3FiZXA3NGQyN3gzTUkxUER1MFhaZUZ4dk8rZStJUmZyOUFYMzlDeCBQYkMyOHZMcGQzUTFWaW5rcTNhZ09UVjFzYVg2OVZaRlQ5a2E2YkUwQXR1RXl0M3dPbjRMNkcxSWRvVXM4VEJsbVBsb2VjM3QyNER5IERzR2YyRFlBQ3lSTkVzN09IQ0dOWWdzVnhva3NzcXh4YWRKNTRua1RleG1XVUhDb3lwT2JBTTI0cEVtS0IzUVRIR1Zsemplb29JejkgVTJRdXRvR1Bqakp4OXRuU1lSN2NyU2h3K24yb0hXVGVXZ0J3ZjRoRUM0VnVwektiK1dMaXZoQndzaHdUekNlUVc4S2x2RC9jeXYzeSBabmplMGdHZzhCUVVIcEQ2ZndaanVZeUxsRGdiYWUyaXZRZ202Smk1R3IzaHNvVEVQTVpDeU82a05rN2dHTVcwZVA1SVR3ZkxRV2VEIGhMc1NkZ0FBUDdCdjZ3VjdZT2FlS25zbXBaV1RXOTQ2ZURvMFM4V0VIL0tnRzJoSlN1VVBnZGJoN3MrWnN6VUJjRkpxMng1NHZXZSsgQk43QmdBQiszZGczL24xaGJVZk5VR2FER3ZuTnF1V3pPSHl4N3RaQWV3ZzZiWElta2RuSHczRFN1SE1VK3dlZkhub01NWVRGcTVONSBCZHIzWTQvYkIrcjkxTk45VEltcUw2V05OTXJ2bE1oOUNmYng5VjVjZlNrZXpsRGpKdEVEMUpNKzBKaEV1eTZ6WE1tQWRjUDRaSmZjIGw1ZCtPQTU3UzErQjhyRytRYTNiOGRQbm9kUHFXa3RESlZJcDJRZWZHQXM0TkVWc2xGS3JZTElxdXlBN0tua01MVWdPRjhUbVFYd04gV1ovNzI4Zi9BSnVuMzdZSEIzUGNMNFg4bk5zYXQwQURQTVNZZ2RKaGgyd3hFZkJNcDhXNi9jT0h3dzRjY3lUaittK2VxcDQwWlY2dSBUSnZIQ2VEK2ZmZ0hnT2tiWDlzVzRMcHVqYU0wKzFXYlQwZlVVMnU1RFdNTnFjc250RmM3V0JwL3R1SFk2VFpDN0IzVVVrRCtISjgzIE81UGNuNFFKdjc4ZzhmMkEvd0JNM05JdzF4UEl3QU4vYVhjOERYRmIwbFB5TndsQ01UMWU3OHlNSDBLck9SNFJMRnRrZFBzYXgyZG0gczlZeEtZR2phVURRSDE5UGdNY1YvRG9JR2RZb1k0RTFNU1I3a01NMHMwcnUrek0wVFNTUE8wc2tqdmdyTXpTOFdCWDNHNVFyeVNTaCBvUzdKRTc3QXhUdXlBQVN6aFZIbXpsK0JYUUkrSE5QOXFrYVM3UVVPN01nYkpDYWUzaTdNbVFrUXdKNXNLQVpoRGtrTU8rUGpBdDdDIHdnZjZaVnhpeVQyVDIyQ29rQStnOEI2dkkwSzYvbXNCNi9Rc3orRjREbmNoMjNKMUlkcWluSVdob21WK2htUTlicmUvdUU0Q25ubmggazNOOEtMT1BDUWh6OHZIajdCc0Q4Z2RVVlYyVmZzS1pEWEQwTkF6ckJHM1pMdEJxcXVSenc5eUZYaXpHOVA0M0RtUStOOEQ0R2p3eCBneFhGc3pNRENHLzkvTDU5KzkzNSs3QjdZWXpYQlZkekszR2RzMkd0eEZjYXRzRnNHS2xPaWJHaXNqQVltUXc5a1RONGdudm84eG00IEhWN01UNFVrbS8zOEFmUCtBd0xUUXl5bUhQVU9VamhiS1QrMGh1UjNIalJrT1NaWjM1Tlk0bnpsd3lhYU5tbElnU045UnVZeDZVL1QgeGpJclpxcE9WNHJ4Wko4ZFREeFE5VVY4dnJhNVM2VGV0a1htQXEyelZmVlFOcjhTdGdaU1JjZ3VIWDVpbjRhSE1ocDVnNDIxK2VlSCAwWVRmRmNZOG5PYkpQYUkvc0I5KzRFdjlQTFU1TXF2dlExTG9HNWtGa1Z6QXk3bGUrTlNGUHJ4Y0RLS3l5a3dlNHJmZUI4VHlESThXIFg5cXA0WU1GcTZ3cythcTdmejU5K0FIMzdwRHJGTGc4YjdWV2lwUnEzWDFxVlcycVovQXhrTmpJQjFRRmpyNXlDSXVQbkpKbThJL2IgNkFFRU15eVZhQmd6NlNrN0FBeFFUK0lEZ1BSN1g5UjEvcDlyT3dqVmZPQTE4c0YyN3h2R2ZYdW9HSmFrcjRsb1dOTUlKNWluNnIyZSByMFA4NFQ1MEtzeWRvQy9hMUFqdGp3RStnZmlKK2ZqNEFqTnU2cVNSWmtaRlE1TmVjNnp6MDBrRS9qbUdOZFBLa245VGZjWUp0WElzIHQvZG80blYxemNTTkdGeDA3SWhBUm9EWjh5R2VOeFhhWWtibkxGZUtHd1NJQmlaQVVxeFFHcDN5WXNPdHpHZGcyUTdRVEs5cVhVWlYgYS9EcE5ERHNySXdPRFcyOERhakJOR1EyZ1lUM3ZIWXVBNy9qL2tBTmN1MkxZc1pnWk1NcW9LQnIxeXNKa2wxK3lUYS9ySXdMbFdiWSAwV2sxOWJjTk42MjRQaS9zWUZQbnFxR3MyWUxLREJtOTFjYmVBQjlCQUh6L0FJQmdFREJTUFBRcTl1bXBhcnJjdUI1dDJQemhyQXZYIFlobisvQUdhNFE3SU1PQmg4WUpsamJlMm84eFp2Sm9xK3MzbmhDU2IrZ24vQUdQb0w4ZjYzV0JJY0dPMkdyTjFEbUl5U3htRnNUZ3EgaHc5VGg0dFlXRktzYVl3QjF2dVF5cDdnNFlrQ0ZsaEE2eVRWN1Fzd1ozUjJUZjhBNzl3RkJBUDNTM0NMZ2ttWjMwVjRFU1dVYnY4QSB6QyttZ2RKWm80c2tEU0tIMnN4YWpjRmlob05pOU9zeXhTSlh0czJyWGZOMGVLSHp6ejFwUXlDVzBWbmNGWGk5SzlPSHE1TVdqcDdNIDNDZWpzUmhwdTVlVFpUZ25za3laVDdKY0ZmMVpYSkMwRHlxaEUxbFhLUEx6c251Y0FBUHYyRy83L01YSnl6VGNsWjBCdHFzYllRdUUgTnMycDZPaDJlV3VDa2JhVS9pMlFudmkzY0hBdzQrdDNoOFh6MU8zQXNyTzFzMng3SGFYNm9Qbi9BTi9XMitXUUJCOFJudUZ4cEtSVyA0MFF2bUQ1RDVoUThKQXhXUndoVldZaFF6SEpIaWV3QVozSjBiaS9nemVPK2VmOEFBYitmNk1UQzJ5YTNMUU1WSktEdjkyWDdjM2NLIDBiQ3NJZVdXMDBvdzdDdGZNUTNCd2NLM1lKbE9uaDlMZU03WDhHWnRsNFRod0hmMEUrZlBnT2pjdnVCSFY0NFY4RjVkM0RMR3lCZ2cgNTR2a1dRUDJlZ1pyV1I0M3kxTFkxa0xqZjg1cFl5SXVsN2g1STU4OUx5b05iZXFkSnJDNU5IRkkwbU9vMFBjbU5KViswdXhpTGlUdyBzMW9CN2hNZmJJbTJQZGJpdHphMkhhbHE0aDREQ2FFVTV6VndNTHoxZ3FJOEF4UDRZbnJwdW1XeTJDMEdFaXdXU1NlbjZVVW0rZFFGIC9MZFB1NjFGS2FiMDIwQzVBeGFnZFBmVTlnN1ZuaytBRU1EQ2F1aHJLenZadEozOUIvcjQvdjhBMVV1L0pHb3kxQ0NyWmI0R0dnV2kgdmdsVHg4N1VVai9NUXhkaEFrNWIrSlc2RytURU54VzFXQjhDcStkY25GNERON0I3SHY4QXNBRDI2MHo1RkY1WEQ1NmtrdXRlcS9iWiBJVjFVRFc3WTRucFM5cU1RMlQ1a3pVaGRsd2Z6aHpBaFpad3hXWk5vNHlqZmRrallBQURmdjM4K3RGU05ZNUVPM3VXenMvZG5KMkZuIG1tNHE4aGd1QnFtTm5wc1RiN09zdktMTXNHMmFTUUlEY1FkUU8zYmtWSEZrNWhTdmJXWFRncU8ySTljcmNPS0JKS0tlVXJ4U3B5T04gckd5WWpoekt2YmFsTGV6ekUvVGZNdFJoY0hnRG8vOEFuZHpTWlBjM25zbC9YM2dFSHdDRDFNV1FIamxCZVNydTdVdDM5QWZCcnVZciAxMkh5K2VXZ2pnVmRrWDF2amFmTU1rTUxHbjdET2NTZmkzbG1SN1J4dzJEdEVBdDFCQWVBU1YwV0JEbnFZZXVVMm52OEZvVzM0c1FoIDJjWVNFTThVZDdHcHQ5NGZEbWFlN1RoOEVOd0tQbnpwYk55ZkY1WmZ1d1JIQWIrQVgrUVk3K2J4OVRibzVMN2drQnF4MDM1d2FuOVMgRm15RnVnVWVobHVXVWlXTTBKN2hEY0Z1SFQ4T3dIeXVYelRmc2NQeGJRVTkwcXJyc2VFRS9qL3NFQWcxaHR5SVN1YWM1TmVJU2l0YyBjNVpXZmtWajgzeEhjU3FWZDhhS2ttaXhFZTNETEk5Q3J3elVWWXlKdXhkQWtwK0hkakdqMkVCdjNVSXlmNFFHU1dxNVVKSzVaUHVUIHNpTHVTazJDK1BEMG50eTNPYlIvbUNiTStJZmc5a045b3ZzQURnSURZRVBSYlJjanZWOWZhWkZmVmMycDFRSk1ac2NBTDVIWHEzdVMgcFd3WFk0ZGdXNGJocWNlekMrWWdxWEVvS2U4N1h6a21EQ1Zja28rd0FENER3RDkwYXBjeXdMQVg3YWpaVkQ2a0FOeWFld2xET0RnNCBMOTNVT3JnVWpSdlhLZlg1aGt4WkE3Z1FYUDhBMUlhZDVzeFpadTZDeXNITFJOLzcrUDhBOS9ZR1RWYkFQWXptclRzanF1ZHFscXBWIDFJS2JBbm1LWHRpWW15bDNtVmIyaStNbHFVL1Q0ZmpZT3lxL24wZXR2S3krZjNzMysvZ0QvZ01jZXJmNmVXMWFDSCs3Nm1IVmFlRlYgcU9MVmlWSXV3V2EyTjBNM25jc0RzcXl4RmVORnA1Wk4ySXhUTVpPL1VRSEhGbmNxZmRiRURFNGkrV0I2cG1EdjFIREQ5UldhWnRSMiBmRWV2S3VZWGkybXBYWGx1cjNKM2kyTStMK25zeDJyRDdldHdYeFBiWnpnelBQRjBaWkIvaTd6NzlidlBrRUIxYmxCZGE1REl0S1BHIFJMdG1SUlZNTWFtajI5cVBnelh6MHVFVitjb1RqRGU3M3hVWVQ4L0sxejRRUWt5c3JNdm4xQy9TRk9BelNSc09CM0hGQkFMNTlOQWogQU9CVVlldEdPcFpOblNzNlVXVDNiNUREaUJUZFFnSDRqQVpXNWkydGh4NjFPNWdoYndzclBhOTUzeXJuWkpCZ0xkUVQvUHVtK2pMRiBxQmhkQkZOUVJLUFZhYWRRVWlmWHQ1R1JEaTBIbmZUNkJiOEZEVGU0UzZVcXdjNFlVdlBVcTRpTXhORFdNRmxJQm16aVBpdnYvSDhYIDBEaGdlb1ZzWE1hdWV6VU1adHVKdHNzSVFEcDRuU2FXZVFZbTVJbFRac1podHhjVjZmdGNQbVVwdEdsa3lScDZNb2s5U1ZaWW9samYgQ21qbFlCdkt0Mk1EWHk2TDh6SjRmVTdLZ0VpVmtIblprWWEvdFN2YkFVekV1VTduZ044TUdFUFdBaG9jTmdwODVBY0lIRytESzZ1VCBXdDdTYXVlUCsvbjM1Z1B6MUJyVU5qaHArb2ROU2FjSklZaGtyMUgxRko3TzJPQUY4TFJRTmJqclVaR1JrcmRrcjZZMVZMVjk4Yk9VIEp2bFhWb3pIUE5uUG9QZ04vUG4zOGp2bE4yTUxQb1pTNERidHEwRDNKTER1R1RjRXN6S1Y5UXA1b3RTOExJVDVnZmVGOXduZitvZWsgSml6d09yeG5hdXJ1Nkp6WUY5QjgrL2RBYlFydzFMVW9ZVFcxUEpBWlVOdHJLdjFVYTBTNjNQU3BjbzlXeENKTmh1RVBqNjNnaHVFQiBWbURDZ3NXczJZRDhJRDgvL2tBZnNJcktyVFRPZTg1ek1mOEFGUlh0L1ZXZWJQbnh4MUE3U09xRUlVT3pCRXJwbnRScmxRQnRjdlBQIEMvSDQ2RlNGcVhaUHJQT1NNMENiZksxRGtvZ2RKU2EvcHlaVjRIVDNLc2FZQXRTeU8xYTI0RDBOVlBEM3c0K2NacHhYSjJaemJ3Zi8gQUlGc0hVOHQ1YlJBWUlaNjBBTnBURnltVW0rYTNtcE5QcVlmdmN2U3JrcmNlaGgwTmt1Q3lDSGF1dEtQUEhIRGpOTmxQdkRzRDRQeSBBQlVTRDNkUCsvWmx0bFBxUnpIVVpYdzJUL09ic3JtRnJVUldXMTFNN3E2dVpJSWRrQjRZZVl3YkcyMkJzZFZyTm1iV1RLQTNiem1IIG45Z3h4MkRzZFpDbmZDRytDczBDN0VoNDJMVXhoMlZSOHVXZVRTd0FYYWhBdytKN2pERHVDM0JnTDhER1lzOW0xZmpKdzNnYkIvZmogNkR6NEIwS2hReU1vbWlsK2RRRHQ2aHZhUXpTZDJjbkpEdmlNdU8wZFg3TTJsbFNSeGpsRzVFMkJ1eFRXbFoxeWFOMFBGYy9CNjNhRiBqS2RlbVo2VG9WcVdwVnJBVHBIcVVQVjRrUDhBS3RpMEs1Mit5Tzlsa1ZzbnVFejRHd2ZNclM4bW5jMmJaQW14Z0VIL0FDWU4vd0FZIDRlSHJOWE1hZTZDdjBhYkdwcjQvcWRvTWQ1V3dwdm1JeW5BUE1PU1F3NkdIMjlrZDU0NThwMVBKb3hRV0xKby9DVGQ0VkNmQWZRUUggVWJEYmNWd1lCelZKRFNkMEF4cFpBOFljQzFrU3VXYWZUeGhQTGgxdUdIaHAvRllDZUIrWTg3V0xKay91MitJT3dmMzgvd0JOcXpGTiA0Y29kZXo4MTJKV2N4dTBhWFg4T1pJbGgwMjJxOXE5RFcwOThxdUdZbVZ1dm1HbzhuZ1dyYzNsWEtjWjVzYkNiQS84QWQzM1FYOEFmIGpOUERKRXJGRjB5UlNNWlM5YXVKNG9qRkVWT0orb2piNmhqTkhjWDhhQXNjclV3c2MyWXZibVhCV1kreWVOd00wZCtObXNSUnhseXMgOERIbmZYME8yTDN1bTV6ekhNVXJtaW9ZUmhlTlFsbks4UXhVclE3MDJtdUhiY1Bxb01VT25rRU94dStGMDA3eG16SHdXc1BJVC9TdiB3QURBL3NIUVFIekt6c3NYY0VxdE1rMkJyUndKV0VIenJPRHFiSXJsUGxWS3lyKzhVUGRreDhUNWpWVWllMndhRy9pRktOQk5aT0pKIHU3TFU3Ukg3ZFBuNkQzL29QcWVqM3lMYkI1U2w1eEsyanlTMjNHUVpIeXQxNWs1NVhvc3BESDdQL0p3MkNHYzg5QVd4ak51Z3NZY0MgYjBEUDdCaHNEOTU5a0Q0YmJYTXlZNVZWZVZ0SithZXB4aE1XRmsyUkREdVlDWmNqNVpBKytQaHNpMnlPREc4VzJuM1QyVFdjYlExRyBJM0J6Zis0SDVmOEE4cWk2amxvMWpabmNaSUVBZHMvNHlPZkMxZWZJNTQrZWhqYTgvVHp0REczZGpoSVN1YStEZUhIUEYzZkZVUVN0IFZiSnRjQk9hblBXZnA1cGc1Nm1ocmk1NlhiVDg1Wjd0bjRaaDZjVjlicE56cG1tcGtnWm8reHBKU1EraFBXdVpndGYyZGloWVF4dWIgSndtR1MrZGFhelRiVHNHdWtvZWN1ZXFLL2wxc0N5a09LdVhveDU5Qno0QWJPbHkzOENOckpYemxyT05IcVVXd3IzQlQ2MGFEM3BoWiBtekxuclZsa09CUUZaUEJqczYzalN4VUxLRTBMTW45bjdraFBIdmY2cGMyNUZ0aUxQTkRySDlSSU9NSWVPUDhBaVFQRkR4dGZ2L3grIDZJMlNtNGNDbTdVdVNqUGpkcW5EVnBacVBXNEZnWVpsb1ZMRVRWZFBJT0Zic2pKY0VOd2ZBWjdpVTRNOHJIakZubS8rL2o0RFlEL2QgM3JqcC9WbzhBVjl3bFZVNEVyYWJhOVVteXQzQjhWMU5QRkxIOEZ0b0I2ZjRITVcyUlBxL0djQnNBQ2JXaWRacTVSbUdQR3lHem5QaiArd0FOL1FUL0FHSWFsVjhWc3RSU3FET05oeWlTRExNRmVzbGtMMHlyM3lXcnRIYi9BSjRZZkRDZXZtRlZTNEhWYWV6REJUUXNvendFIGRUYU9BcUszVi9CK2ZnRlJMKzVMWUVOWHl3d3V6S3JTYUJLM05XOHRIeWp6UjNJS05FczlwOWZFK3Ezd3doclgyUTRCMUlRR3Brd2UgWHloeWF5OFVtRXEzMysvZmlMcm5hdlN4NnZSckZLSnAwaW1pazFLeDhSNnFOYkt3enB6MmJnU1plNDFQREc5SENqcmoxRHhTdkpGNiBjMGtNa0tURG1TRGN3QmtpTkNwQmlDcmZIL2ZwZTJCYkRRK05DRytUNmxHcE9WVExiMm5tRXFuaWNEVjJGTmxiZVljSzMxQ09ESGNFIE9kYlZQMjFpeWY4QXFnRkUyYjdzYndZUEFJUHNmZmorNnZMRUlYY0x0bUF4dTIvSHNsL0xWd2t3NlBpR01lN0Q0TWhwOHhicXZaL0QgemtQZ2NFd3NyQ0cwTEpNR2svUndBRG4yQi96L0FFNEtyRjNna1ZaRE0zbVlDWjFCYW5EWmE2RU14Vjh1SFVvR3pTalE0RDRlTXpuayB6K2VVdUJ3TFV0OUdLSy9zamhOazhBL0lMOGcvWU9veGdJQTFlUFh0aklleUUzeWE3Y3dKVEU5U0RnVU93aGI0bjRNakpNNDRISW1BIGFqYjRGcU1FeGUxazFrSFYreUF3Qi9FQi9rZjZJTGNTaU1JK29FSnFTSjg0NU5ranRqT0s1TzJmWWxjMGVlT2FBeGRwWnc3YWJlWGUgQlRDUWIzS2JhWk51VnR0bjNKVnIrZXZ0cWFhbE5JYUljQkNQTnR6Wm9ING1uOGE3U0tuWkVNWGJCNFd0c0JneFZiSXliaE5WUjl3QSBYbVl6TEw0cms5OGRqWVJIMy9ZRDREZitxdTVqSWhKc09aUGloeVNURitORU1jMkhwQ0hGZklqUUFtRUZ1WjNVcXZjT0RuNi81d2g4IEY1UXpMSU1JN3BPLy93QkE4QjgrYXE5Z090b1ZmY0FlK0h4L2hvVHRaSEtOTk15UmQzeXFIaVhJNVBpZVlRN1VmR1FQQURnd0RoUGEgdjZvS0V4bTlwQnZmL3dCZ3dQOEFuKzJSV1lldVZ1SGxXcXlFcTk3WXFWM01BRXhqRWZIMFhmTzFtR0JiWkUrSEQ3Znd6azRlZVZiSSBaaWZQQ2JOaitMdTdyOGc0Z1BjL3NEaktNVlNVcDJXeVFaNVl4dmlGYWVQRWZ5WTlneTRDUHliNkRhVkhrTUlkRU8zVE9sZjNpS1dPIFphRm5MYmlFWlBJdjZqNHc3MkZZbHFORlMyRExTQ2o1VXFHZXpsSXZIMU9BVmV6WmtXeGhQY2FZbnNscVZYTVF6QSsxQVlGd3FVNUwgL0YvYUJuUndnVGc3OEFRdm9KOCtBeEQ3b3VTR3VhdU9iaHJtWkQ2UXlHN0NNTWpWWUhQS2JxKytkUG95RzNwN0l5T0ZWcmpBdG5HMyBnZUV4bUdYSXIxbVQ3MnV3UjRQSCtBbi9BRDRBQVcxZHF5MG1WUFZWczFuWUNOSzFNWG1Hb3hxRWFhcTR6WVRFbTFOU1Zua25NOU9mIFFsVnc1NTAyUFBlak1Id2tpeUd1MEt6OUp6MWhEQ1RpQk5BMXZNdzlQcncvYnBXOVB1U3ZYckhFVHlVTUMrV2d3NG1HclVCWnRqMmcgbTJGU0l0bFQwL2VMNER6SEFOT2dPQ0dkcmQ1dDlwZkZtcy9DaE5nOCt3YkI0QlVUTEpiUnh1bVgwOE1jeFgwMm91R2FQeHVWWUxDeCBWcnliNE9WWFd3V1NaQ2QxMFJxQjNLcFNhTlk0R21vM2ZoYXM3dFA3QUNwdW0zeUFVQTA0Tk02aEhaZVIwa3cwWWJYYlMrbTNjWVlEIEZxMlJ3OWtZREZjejJDQXFwNHdYOUdadGtTYlJ4QWVBOCtBdzZqYllPQXhkMk5WUzAzblhZK01iVS93eDQzSmtWa1lxVURxRXBHeHEgM1lJYmdudmlkQzQyRHFWdzdqRjJaWjl1MmUrZjM4QWVYL1BnRUdTVDArT1owWjFqWHdaRGYzeVVram9qd2V6ZzZuVzlYeFY2VTBPTSA5UE1RN3NocmJBKzc5YUdIRCt4cUcrY21TRFlSSnF0QmZqNkNBUGdFSStmYWt4YnZ5MzFPeUhLMEpsZnUxZzBiU2RJM1JEYXJBaUI2IFFsYWNFMnBUQkMxSmdlR0hUMS9nOEJmdW51cVRXV2hYNU1EdElKandISFlIN1lEK3dGR1pJNDNsa2ZmZHBwTERMakcxRkFNd3AzRFYgOGJjc2Z6bGx4aXVUQ1V3SUluOUlxR0tEY0Ewa1o3MFlkdFZrS1BOMzQ0NXJHanNBdE56TTZCYUJnSTFKc09OTHE4UG5YUjhNbXIwaSBlY2pGWHc3Z21NaUlIWDdKdkI4d2JRY1BiRU1XczJZajJpa3U0TStBUCtmdDNZT3JLZzlPZXNEVHpYa09yMktsRFZaS1dzWmJySXhNIFQ2bVUrVVdOWVVXdUxJSG1FOWttc2xrV0FabjBQWUFBN2NBemJCYnlUQm16ZnNBUVQ1K291UDdBZnF3Uk02dzNaOHpxNjB5MlNOdFIgajByMDVhN2hTY3d6cDhwK0x5S25KZlA0TGU5M0F0MnFuc21ENUFJVTg0dkt4aGc4WWczYkVMeC8yWHo5dkh3SFJKUmRxUTIxWDcwNiB2dFZHOFp0WTA1UTFYamEzanNMNWNrcTdsZXVXUWRkdFZvYTM4TzBBN1VCc0NBMUdNSGtWM001eUVDT3dQOVBBQU1FSG9qTFAydmdqIGJUcVZXc3RRSTE1U09BOFk0MmMybzJjZTBZOGdxd3FtQWQxeW9GbEVYZkh3c3FIY2lscjFBeUFxUlFqTEVISUtncldZdGd3bUxkSTIgcWsxK0duMlJhUlpISnpIRGdkWHlwZXBaWGh1RXd3bm1PNUs4dG5LSDRIQlQxbG1WcWJXV1o0cTQzcUhPYi9VUi9FK3djQjZmR1cwWCBCS0IzOVdsYUFWSVBsSG45ZVlBSzJueExKS0M3dUEvTVQwK3E2ZmgxWHFFM2lFQlQ0SHd5ZHYxZmg5NC9GMkNDQTJBQUFRUGJxU2prIEZjb3ByWm1MblZ0Wk5nMmRIczB4YWxZbVd5dDR0aWlRSlJiY0szV3RQZHdQa3djK0F6M2RxZCtYMWNXakl4enpkVnZ3RDZEdjRCK1EgWmhUZU5RQm0yS3hLYWVEMnBCdzFTcmEySlJ3T2RIVTVrcG9sT1ZjL2NIeERjQTlxZk1CY2ZyVDZ5czhYZWJNOWphVDU4QjRBK2c4KyBCb3hxam1wUjBEeFNiYWFqRUpJa3NjcnlPMjBiU1RiVldmRWJOV1JKbFN2YVF4cVZka1JvNnlWSThSM1ZWOXgvSC9jL25xTmtNRmZwIEZSMC9YTDVXOXRKTnRWTGhjVlB0VUpYK1k1SGw2MEh4UFgrQm1GdVk0RCs4U0gvSXpCZ3hvRnZPeDczNy9RVUhZUFBnSUROT2FsSUYgcVoyYlRiM2FJZUF5TGN0ZmRySVI0a09wUU1STlBReURndHJuR3c3QXQvQVhwODZHemJXMExLTWN0RTNzZXdleDgvc0dJQnoyM2FkbSBQWXZrVmxXcFpEM3JDenZpdE5odUFZVFd3cXVXRk9yckZ3RXd4Q2V5VWtuNGJEUUJERmxHMW8wMmordXluTWNkL2ZnT0lERmdBTGRUIG9Oa3NGbHlRTStZRW9kdHlRZGhSNjlQUEJZeHpKaFBTakE5a1c0ZUd6TUd4bmw5dEJtUmlNTDNObWVNVGJzOGIvd0NBUCtmNmtPbDAgMm1qRzdOcVpOeDVYRGErWU5JTXBtbEtJK0l1T0xkRWNhME51RklVdGl1ZlY2azZtV2JLS0tDREZJbFpJWTl1UG1PS1FFSmtjYU1tTiBXYkF1K2FDcmg0MWV1RDVtelp3MHdMVDZ1RXA2MjFCN1lXeFl1SWhLN0l3Y2xjR1JERGovQUoySkE5QnNnbVQ1UnRtOXBKdDQvTHI4IEF3NThmNlpDVldieFVGaUo3RzVJYWxuVkxrbTdZSVRibXNDRytBYW1MQ3p3ZGdUOTRyZTdGc2VIcm10QjZGNzJZTVYyZ1lNNXM3R3ogaUNBWHdEQnY0QmZQeHJZUE1BVWNiRnJSRFc5UFpsa3RHV0dQVEt2RTAvamNpOWNrVlBjRUp3TWN3WkdBUDg5Zm5xc01uK0crUzhKNSBzOEh3Q0NmZnNBR1BVazJNbHVka2xWOGZDVWt4VlNySnB3T3FqU0M5ektLSlZ1U01BZGtaYWZtclk4d3FnZWVBM0RrNzRyck94cEp1IGsvN0IrbmdHNjZERkpZVWt2UEdFc2swdW0xQzduaG9WaWZ2b2p1Vm0vd0FORVdlbGFUVU04Z2tNTWNUeHh1NkUvd0FIQVRJVGloWTQgR0orTzhVYjZYcU82QTRDbmt4V05QRzNZWlNUZktLM0FOQ25mQjRERTVRK0R6RDVaRmJtRThlbmc5UENmN01tNXRGWFBLeWNTYnMzeCBCeEFiL3NBRG9xS1ZQWDVRNURYQU5uSk4vSTdVRDdiL0FPQ24walZZdDhMQ3l1b1ZmbXpERmtRM0RHbjRLa3dQbEhyWk41b2UrRmw1IEJtOWtPYkErK0ErL2RKK3M0YW44Y0RtMDJrdXdmVmRNc2lWSERaVmdVNkhQVU84RlVNdzR2bUppbjNEdWdZd240SHE0RHJCT3owTm0gUjhVbkh0WGl2b0o1ZjJEOWVxdzlRV1hyUlhkTFduQkkwajVBbXRkSkdIcHRpd2wrQXhKNHNUcUNWWWJldjRYWlk5alduYjUrRmdoTCA4RUpEYUZyRWJjSC9BREpmcU9IZlpnWXNWNzAraGVYaGFUR1FGQldOWmJVT0duVzhRTXU5dG9ramozNVVmR1BMR0JOQ1ZxcnV5SzVTIEdNQmR4M1lWbGhhMEtITEhucVV0Q3QwZVZVOVZ2a0NZeVhCcHBTWXRJaDdtRHE2Uk1xODlMUTJod1g3VXZpaGx0UHNnZXQ0dmcvZzkgVjIrVFYzeFpzdzUzU044KzMvSDlFSG4wa3dDNlB2MjNNa1hSbGhFcTlyVG15bjJ4VzVDUXRwclJ3MitJZGYxVVljS1RUN1U3cWRsViA4RGFpR2pJMk55RTd5UndnVDZDZlA5M1FEOTBYNmp5aStHcUxVaEVpNmU2TDAxSk9xNWJodkFkV2tscGxpMk9rMXlyc1k5UGg2ZkVUIC9sbnJWY1VQaWljUWVSaXVoMCtMTm1ic1NuakhnQysvQWNBQURyN21YWVBsV1pNc3ZXUmsyUllidkRkcTlWN08wMHZGWXA2YSthaEEgSXRiY0dTR0d1QU9IVDF0VlVnQUtkRHFEOERrOThObXdtL2dBQUFBZzdBL0h3YVNYc2VPWFUyVVdQazcybjFNZzRqV2ZUOW5pM0tIZCBPSUw4RzZFZmFFanJnZ1RNa0F5N2NrVHNWRWtjY21MM1haazJJdmdZaXVwM0xzakxhSWMycGMyeUxqVDUra1ViY2FCVDloUERGU2ZEIFJJR21yNGNHT3E0YkpaRlY4d2d0cStoMXkrY1pmY0JheTdoQW51Z3NDRFVYQWRnZnVxMUFyVU9XV2owK0xQSVkyNE1wRGJhY3EvVWogWjFzUThEMm4ySW14ZStDM1ZXTDRZNUJNdFJEc0dmOEFNM044MGw2ZWlmQ2F1N1ZjK1FkL3QwLzlCWTdUcTBGMFBXR2JRZGNWd2JyRyBxaGwxMVJxM0pXYlc5VDkrR2lrYnVUcklYbkdIUkNlK3VCOWJWbnlzQjdVR3hlVUwyR25NTzEyT0tDd1lZNDc5N1J6QThJYmJabGU2IFFhSGhxTEplZW52c000V1JlZExPOHRvVnRSN2x2RGhENWdob2U0SjZPQlgvQU1xTEswVWFHWVljL2g0U2NENkVBQWNCUG45L2dDUlMgb3NtbmNURkpKSW1Qc01jVzJKMmlldlVDaDR5M0MwV1U4M3dTRjNpTW9lNGc4Y2NpbGF1U1c5cFNiNHl3Zm12UHh6UmZGeUphZmJWUCByZGZTcStOaDRnY2s3aDFSd2FCTXdXcjBpcm5uQWVZUXpGRDNZeUo2M080ZnEwQnZoT3pCYlJlU3lEMlEzaHNDL3dBQnFMZitxb3pLIDBzaEloMlF4dHRlbTdDYlZSYmJIQnFBMXZMUXdMa3ZWeUwrbjQ5MUU4T1BaSzVBcjRIQmtlU2YwYjhvbXdod0FmL3NHL2dMZFpsaUYgTXBYTXltTURhTko1UmhUc0plczZYeDd1aEZVd0NiZGpoZkZEMCtuekh3Zjg2QlI0R2N5SXZQUDk3VmQ1L3dBQUJBSHdIU1pRN2NhSSBGZ01vYXhyeUNWdkZoZzZ5Y0FMaVB3N2NsTlI5dEZIeHdaRStZeVdRSFQ1a0dldm9kalN5ZkYrVGNIU1FpVGdBcUlBQVh3SGdNWkFOIFJMSXNRUjVFYkxQS1gxRXlsZVVMQytCMm93SlN1R0xjcVRseUFGVHlRUlp5RE11bUt4Z0p1UmlNZUkzanpYTERuRnNoZG5qanB6R0QgRnFVakhBaG1OUG9FbEsxTGFlSmRrVnVTdEJzREZMR0xKcFJ3cCtyTjRUekFjZk1PQWRRRGFjY0ViaTZ1c2pQNkpSc1gzWU1INUE0QyBmUm9OUHZqVDdhR1NyNVI1a1ZiYWFoa1N5TGd6bkNuQTRFcFhwNnBiVXNFT3R1RlY3UjhKcXVraFMxY0dIbG1hTnpadUU3M3Y0Qis1IDgvSUw5c0NaUXg5b0pGNXc5MGgxTGN5dk1KTU5nSGtudGs0VnloMWtlS0dCL2JlSFcrcEJjWDNCcVEwK2xuaUdNc3hYS0xEemdidzggL2ordm4vZDVWR2wzUkZwZXdyazE2a3JqNzNOYVRZY2dQWVZiQ1REbTVPOFZ5YitTTGEyNFB1M2h6bExMN2JqM2ZHQzZ1L1pIYi9WNyB3Q0Q1OWdoajI1TmFxUnhoSlBwNTViMUplT1o1SWhHUXBhYWVWSkVFQWFWSGlpcmNqb3lVU3JqbExEcHk4dHVkd0NKbDlTQ01HUGJSIHlyUEcxNU5SU1J2YWNndkZtM2NRT2tiOFpsVmlFZHN0cXJld2c2cVlyOFNIQXBxOVl3dmg2ZkRmTm5aQ0g4Z3Z2a0V3ekUxY29NRmcgemY4QVlBQy92Lzc5MXg3UXk1Uml3dDVHa3NtcitBTml2a3cyaXdvWlE4djdvdGozQndUN1VoMXRYNjJqdG8rQWNoczVNWHRoUEh3ZyBRK2c4Qnh3My9vRTFFTnJBaDJZQmxORmhNdGtaUmhrWHJJTHpHaWhuMVhpMnhiUlZQc0NadkZWb2I0dm9sak52d0hpR3pEQ25qTms3IG8xWGlmL0VSOEFCUDlCSkN5R2hOcmY1V3p5U1N2YWJzMTJRZVQyZ1RERmkvdVFjaERyZHdaRnRiODQya045NU1US0ZDYno1dEozLzIgUGdEK3dkQ0kyUmtuZDVpOHFLN0VTVUQrQjdmdDU1K2I2dG1iWk1aQ0FSMVNoS2tHUlc5eVMvVXZIdDdVeDd2T1Y5UnF2Wmo1WHp3ayBUNkhhbllQQVQ0ekZXOXFMYWV3NHkzTGk5ako5ZnpFOURwK0gvcU5aYWVlQm9TME0zVGM5a1NYWUdnZ0VJK0FxUHdCK1lZSmdPdnRXIGx6WEpQcXVNaDV1Y05scjdKTTh4RlBNTVR5SE1LZ01JaTJ2NEhFTzBMYWd3MW16VU5YV1ZrSFZ3UTJjUGdIOCtBQWU1L3EzVjRhYjAgZGpaSFpINXN0MnBsVStFWGg2SFoybDlzbVJTalpLUFZYWDdKd053cCt0eDh3SDNBUGNrR2UzK1dKdjhBOCtQdno5d0RwVjFXaDEvcSBDc2dDWmkxdkdyZElHMXV2Y3cxVVNDeGhYY3E5dVN1VU93SmhneHZFTndROWhwOThlRnNYUnI1dWUrQktTT1BIYUkvd0YrOC8wd3ZBIDJjd2tRNytPODZSWVlZRVlXTTJ5dkpxNVhHdm0rRnFyUitrUlNKV0EvQUlBUHdQd09yS2FWOUF0SjZpUlYxMkt1bDNGZnJYTTFFMmEgRnA2SW9LOXVhbVEvcXJJWjZRV0lQMCttMGFwc1ErQkpTQnBDU1lBNTJCVElBc1pUQVJsdGhFYVR5R1dDM3MrZFVNekxhcDJnVHpZaSBKUXovQUJGYjFIL1NiQmxMZldiYlE3RUxqWndRTEdoK3RsRVVzV1VxOGxTd01hRGxKM29LQzhra1VsWkN6bFpMVDYxdHFqR1VCT3pxIDFGS29NMWtBQW5DclBITlpHdlBQSjhIOGRVWmJKT1BuOS84QTg2TzJVd2h1NHV5S2xaOG1wYzVrUGFoM2VuN2hjYllMbUl1cURUMlYgaXc2dldyc1R6RU1PUWNBZkgzeThIeXpHWXBhRlpqTzZWb3BLUDduKzd2Nzkwd3ROYS9RZDhTR1J0dVN5YmFzN1d2YWtaaHBla2hxdSBwb2NxMEpaNm0wOGZNcmZrakpESUdLNXNzLzJkaGswWW8wUFN5RE5KQVFHZndmaisvd0N3SCtxNjArcm85bGxiYWZBS2VOSlpzTWxkIDBoMnlhL2Q0WlN4cllhSXRrV0JNZkVRUGFnY2hEZ3Zsb0tTUHlabVYxZDV0OUh3dElJOEFINEJ2NTgvZ0FQejJaV2RvT1MvUnBSRHkgWC9Vc0JhcUJZYmdzT3lWYUpMN2pVTmJWWHc5b2hyZUJoRFgwK3hnSGFWVk1iWXJ0Qk1aNXZmQUIvd0ErQStnZ0FXR1VwSERCcTVrQyBQSGcyM3UrSllwVHAyWDZiVWVucWRvTElRWTZNWUpXU3FCTk5Ja3RUYVNBMVdjRGN4bXdLWWdyeklsSGJldXpKdTFzdUppdDA5a2ZBIGRlNmJuR3d0bnFBRGFOc05CSUNyRmxzb1VySkRpbUNFTjhtSjVpRVAyT0JZQUdDSFpoYXZ5WW4ydTJRNXdIWVAzOEFBS2JrdWpUSTcgZ3o5MFpkMXJqZ0doNm9aU1JZU2hwMzB6UFlHVFZDSEZ4Z1ZXbjN1aFh3dDR3d1o2QlpRSk9wK3pNYWJHdkdEcmpnODRIOEdERmd3ZiAwRjlDc3dmYWxqU0s5UXhiS01HdTdoYUltd0Zaa0gyRlc2R2ViSElvaGowNE9ZUTk0c0N0emlIeEtjdGt4ajVWK0JNNEUxRHUyLzdCIHdFL3YvdUg2ZDQ5MEpGZHV5YUtKRFVsY01kdlNGNUo1Q3MxdmdkeGdaVnE4OFpFOWJ0UmFYM3l4dVB0cHhiMnhvYUVaR2VUWU0zdjQgQUNBUGdPQTlGQnBvb2NsaVdHRGN1ZWVHQ2xlSFZ6eVNTNmdnRCtMUEpGKzdQYnNZNDEwRHpNMVJPcnp1T054NUIyb29VUlJxdTJjWSA0b3dxS3VSOEU4WFFYc2pMdWpORmpYS1ZNYlFMUlpDU1dYOFRCQmVEZ1FPb1VDTEQyZ3RtUGhoM0FlWUJxVEFlUmc2MVdZdG80eWQ5IDdSd0FQejkrd0FOZ2YwT2szKzh5cmhiK2xhaDFJd2g2ZXduTUR4Y2V3dm1NcWtlMHJoaHhCbHVCUFd4OVdVZlpkd0hsV3R5Wk5vVjkgUEl3NWhzaHg5QWZRVC9IK2pEVm93V2Zwem1XMEJ5aVNSWHJhSGt1NlBNMDl2Q1FuNmc0dERWZmZIYis3SzNNY2sreUk5YVdBQU9PRCBOVUNIdVl3NGJ0RkpCdng4K2cvdit3VlFPTW12aFNsdFdqeG9jSTFNMXBjRlhhZTA4RGtyOHRQcHM4MlUyZWNHQmtwKzFIeFByY2ZqIHp4Z2JlTjdZMFBlMkk5MkcwbkRqNzhmL0FOdm43bGxtblFDRllYaGJsWkwzWUYwalk3a3F5S0JJc2pVdUJTQ1RieGF4WlhvVEZDckUgTVpnNmJFS3RXM3VUK3BzdmFtV000amM0U1NURXNNaU1oYy9mbVcwVDdNVDdrWEtUSlEyMTlOeTdBaGpXQ2tURlhJZHNPU3ZaQkJrZiBXU3Q4Smc4TjQvZzlrRENiVFY3TjJyTnBHSC8vQUh6OXFFY3BhakpjRmIyV0gxVUxicmFGOGFTMkV4WVZ3WEIvTks0a0Nyd3lNTjhvIGRQVDVqQTRiOHZua2ZreU1WYUJuNVJPV2ljZm40QWZ3QUg4ZlliT05GYnU3Z1NUY3Eya201c3F0eVR2WkRoWkRoeVFEU044NmdtaHcgSU9FT3EwTXcrTUdGeGR3TEw1SldhTTBibXpiSWtuUEFiQnNBQS92NjlySkxJUUpsTWh1ekx0ZnpiRHdiTUZ1dlYvOEFvMnpYeERRKyBOdUZxTGJndGtKbjVRZ1ZXeUxObHRBdEdXVG1POSs1OC93QSs1QjU0WkFzMGJsMFJud0tNenJubG1WQU5XdFk0bml6ZGprVnl5TmRpIFNOMWR6dU9xeFNJMjNWbW1MSlRaZVZvWkQ1K1R3U1RMa0RsSy9aQTlOd3dpZXVFcEttOEdFTlBiSEJYc2EyRmROWkI1ampjUFQybjEgZUczNndCNE9ZVVpoYlFUWnYyVGtIL1lPQTlhZ2FldjIwY0E1cUc3R3lUSkMrVzRCekZrTmt3WEY1NFVjQ0RJbm9rTzFBNCtaNUQyVyA2elp2eVlNd1NRanNELzdDL0FIN29qZkszYk4wdVd5MjFrZjNZTnBpa3NPbGJPcjI4Rjd0SzVMeWE1Y2Zob2E0dHZpR25oMGNDd0tVIEZrWmVMOEdXUW5OamV3UHg5QlFjRC9nSjRHbmxEeW1laXo0ZFhXZFh5SEdpV0FCWkNCYVlVc1lUWE5qUTJBekRtS0VNdzRNaU9ocC8gY1VQV2JOYUhhQkczdTdLVEIvMkRZQUI4K3BWVkkyMUQrbkd6bDI4TnN6cmhRKzNQYXlQTkxtV0hDMEFZeStvdnh0T2o1QVZKd0xwSCAreTc3alRYUTRGZEwwNVI5NEMxdW1kVi9NQW1sMjBiYXRxd2srdDhsWExUQUxrdzg4UStZZmNHU3F4LzN5djdhT0lmMWRESnZKd0lhIDN3Ky9ZYkF2OCt4WDRHanpEWlE5NkxkL1R5UVFsYXJoR2lFREo2TXByWjc1ZktGdlo1aGhPWkpnK0dxb2RnS1ZIMnB4bmxETndmOEEgdjREd0I5ZjJFL1pBNG4wdlFUZ3lKRHU0V2piU2xVcWxMSDJGZkNPa0dCYWFrUGx5TGE4eUo4TjhRb2ErWVZaN0FwSEEvSnRSbjJiZSAzYXJqaURidS93REgwRStBNm9ycU0xR0dJb05EeVUyd2xzOWFCZ0tKc2dDazFla1dQRjdleWdOa09FeHdEbVZzd1AyT3kwOGZoVmF5IHpDL2NuNXNKYWdEd0hBZlkrZk5Xa2xENGluZU14czQ1THlQVzBLNHE4WCtUL3dCT2kyWW9YM2dIMmtydGQ4c0NjUndjUjdxL3dqbnAgMlVtRFh3TEpUNm1HcGtiWkVwVnNpWHAzUTVpT3c3OUsxWUpzcGtId2sva2hnd1BodFlGUDRyREprMWY4dmdnZ1Ezai9BUDBGQXdiViBtQTVobDBTVDFmWEJhRU04N05zUzBHckpIc016NVVRcHc5aFk3SHArSHh0ZzRyL1AxeW5yS3pxTUtibWQ3bzg0QVliQWduMEhZRDZUIFpHUjgxQlNPV3U5cDNaUXpSeHRUc0JxV3FucHpkSzVMSnNWa3RCOEQ4a3JjeXdHTmg0azhNZ3ppNnZqMk9DZjFCdjhBd0YrQWUvU3ggWklkcUdrUFRIcUhUZVNKTEhhWkpoYUUvSmp1N2dMVFJMUlY1aHdEOHdEbUF3OE04QVI2SGNjeG10OHB4amZjVWxKZU5nZmo5dW45LyBQZEhoTHFKWkp3LzlHUlYwYnBFZDUyQ0JFbXpScElycHNXaWRiSmJNTlMwbDJSSTJTczl5dThka2tlUFBZeERWbGxUY2ZiMWRjZmFEIFErQTczeWx4MnRGd1k1Z1JlcWU3TzZHRmtWTDI5MGx4UkRCOVBtTGRrRDdJcm1lbjJYM0k0eXIvQUpNQjJpRWRrYm54OStQOCtmdXYgcVdQb1BLcXU4cnoxWVhOR2hIa09pb2tldDZsZ1MyUjhQTzR0OGNPSHA4TjhocDlnR1BnTUNsdkNNc2xFT3M4S3JkZ2xYUEI5Ky84QSBjLzBnV3c0dE5Ed3R0c3B3ZjdtUE9EYXdtTGdWWEJJUTR2Y0pOQXZuNWdXNWx3QnlDR0NnTDdhOElieVRROXNScXJDaE9jTDc4d1B3IEQ5L1lCc3dEMHYxTHFBenJhS0RaSktyNWpiRU1XY05WM2VHK0hsK0srUGpnbnNkYjJSNC81MjRLZkpGa1lMZmJNOEk3SlA4QVQrSUEgL3NCL3JLME1lcFRFTHR1WnQ1ZHZzZE9GdGRNeWpiMDN4dUZJVHU5bVFBUWRQRTd3czRkN3pRcWdZeFBHOGI0WXlPa2NzdDNSSVZpaCBISkJOOXJ5ZEtMeXp4Z0RtcTluUDdVeDJvU2Q2ZmFnTlRyekpYTmpTMWVMYVkrWXRtSzNtUGxvY3F0cW43TGVJVHlNVjhkUW93NTlKIEI3K0EvUUI0QURtS2EzaHB6b2QzbnV3VG5tY0V3YUdTR0hzMlpZd3RzbEZJWHpBN0loekU5UGgxeUFRSUNyKzZDM244MkJIYThMZFEgVCt3SUlEZndGMGpCUmdZN0FocmthaUJwS3ViQzA4WVdCUTlFVSt3aGhZdlRnaHZoZ2d5ZDdKamhEd01lMm9CRStZVHZMZ1pNbDdndyBuQWZQL3dDV09BSEllQTlYMWVZQW9jTTJTU01HU25CelUrV0RXUmh5QTFQVW90OG5tRnVHdDNaancrdVFOUDhBejJUalBBMW5ZLzhBIHA0QUJ2L0FlajNGRWlpUVBKdHVqcTBhNUkxR2lGZXhkOFdjZUQ4YzhXMGUxVzIxUEpuVU8zTEZqdHl5Ujh4U291MlRoWklhVElHamkgRUROWHM0TGJEeFRHeXg2ckdHaGtwY0U3Q25yL0FNeDhpbGxjcHlCYk04d3NnUEFoL1BZSUFQdG53UGpJd0hpYjJNL3dFLzhBNWIvRyA1bGtUSEsxS1phQ2lUR1BJYVN5S2JUTkphbUN5Y3I2YzNjWEttRVE5MlRHUjgzQndWYTByOThSMFBhMWVyMmFzM2cxaHZuZ1BvTy9nIE9ua1BCMmUwR0hCY3pYWUpuZDFFRDh3QVUvNWdzV3cxS3J6QjhNT3RsdzVqN3hVdjFXazFrWVU0TjdHKzF4enovZ01lUWRWMUZ3NmIgVjZ2czR6bFhsZjJTZXNsa3JMaE5oQjJKa1Y5TDloTEJSa1lBNzZ0bDVpZVBoL0FQNmVjRExNVEZvWk5aTzQ0T3h6Z0g5UDcvQUxBNSBnc2l5cWpvanlwZ3FwUFYyQVNTZHZrZ2tVS0YzNUhTbzMrbmwwMDBnM0VnZk1tOEs1WGdtbTkxZjdWNE45U1IyaS80cGJZenExMFIxIDcyOXFxOG41ZXE4bFFJYXpmbElZbG9URU5nc2R3VDZyWTdJd21BMU5nN2NMZG1QT0hHV2JHcnNFa0hVUUFBQS9WZlBnSWR3VDJ3QysgSisvV1FTaGxFNGxMYUtCc2dnN2gwMCtKVFdpR3dMY01QalpFTWd5Y1MrQXE0N1lVS00zdWs4MzM4QnY0QS92L0FFU1ZOZmxRVjdTOSAyR2JMZkJyaGZ1ZFYxWlZQcDFwOWZTV1FDQmlBWEtIdzk4WkE4d3dQc2hxUTNEVFM4QjFtelVOOFpzUVpzR2J3dzRDdmdRRis4QjY2IDlUR1phajVSOWUyTXIxam9uVHcxd1ZkWjFQM3hSdEQ4a1BIcGNXcjA5ZnRSazFPVEZ1RXdZVHA3Z0E0Mno4bnVUOWZDSE5ndDdud0EgQUFQOUwwY2lpWXE2ZjNtTXZFWjVVaUpiY2kwOG9aWkpab2QzSE1xUW83ZTBrak1VM1VSdWdFcVM3VjdNeFdKY0w4a1IzazFScFoyMSByc3R2T1hBaHVFZXdTQ3F1RkhCdHM2ZmtzZ210OW5rTzRlcjdRaVh5VW1jUHFzdzRJYTJ3SjZycUhIejNnT1RHUG4yWkhOTzNnUDhBIFlMOXY1OSsxUG1MYms0UGxTcTlNa21VeUhqRm5naytQRU45cEZ6WVVPbTZUL25LM2htR1AzVlZKZ1VaeTRNczBZVUdXWThKRm9wUEEgUUw4QVBua0FBd0gwMGZUM0JEaUh0UmliWVVhWnhWLzdQTGQ4Y3NxdE5jcGRvWEloc0RHeVZXWUVXcXdRNTIzbmthMUVZbi9UT3lWYyBFUjBFK2c3QWZBUHo4QWJMaFJtbXNEWGEyZE02aEZ0YjFTdFYrMndrR05LNWhzdXkrRUtob3ROb1pHRTNtQzVudUErMkszT09DT25MIFBBM3ZreDFLZFhaNFh3Q0Z2NitCWDlnTnBZbWRjZFE3emFoMFNUQ3RSdTVEMVNiS2JXZEtBTGU4ZjF5dFVrakJVUm9FaG9ScWlsYWogTllxVDNYamp3YUYyZUIwanFyTUVMUUJ0VlhuczUyZHArUU4zQ2pjbGZzSmtsRkdHVmJUZzRUTHNEdUNmWkZnTWlxQkhIdmhzNnh6dyBZTTgzZGlPQXhQN0FmUG4rdU02TG1WcGxrb3NESmt3eUEwM1p0ZmtzNWdMUTkrcjJ4a01PUWZHVHVwVmEzdkVGOFQrS3cvcTZ1c2pOIDc5LzZCZmovQU9tUFdtWlIrV0dJWjBvVzd5VDBETzJteUR6SnhPWWh5bDV5Y2x0ZkR1QWQ4VHc5Z1RBYUd3d0hqRGd6UTBiWURONzUgKy9nUGYzMkNIa1RCWjYzSzlQTGdCSnIweXFyZ2xISkxiUkVoeFJlMXlrNzRmZFNHK2N3VCtXcjc1TzJ3WjlHL3pOZy9mLzU4MkxCUyBvVUhSc0FxbXo3elcyaDRQdjdxSThZOGdrbm9WaWpEeEdSY05RamlSMnNzVmpRRE5xQUYxa09MNXZwblZRd0ZESlJ2SGk4OGtuSGcrIDB0Q1RWWTlJL2lNbFdGZDI4TUNHSHRTbjlNUWV2ekU3YjBPdVU5NVdia2FLejJNMmt1eU9BK2dyKy84QVVZbHZBaG8wOE9DNW1RMzYgMm1mOFVCbHpPazRHRTdUN01xWVVudjdKQzB4dmtTNEhGd25UeDRFMzdyTk5xd3dsaUZ4eHhBQVFHT0FEQUFBeFZqSTIwM1h5L0RLQSBWVy9pVlhEVktXSE1CeDhTdDR2eTlRVFFudUV4a1F3N0lZWURFRUNuVm8xQmlmS0VQbktPYmRnbS92eUQvcTc3NFh2dzFSNWV1dTB3IDl4d05GRkJBcUhwcXY2bkQ0elROWlRKTllWOEJya00vMlBkaUhha3hqWDhBYUN2M1MwcDZ5anE1UjNyTTNnRXE4SGpqc0I3Rmd4eDYgQXl3aVFGTk5hUitxdW9FR3ovSFh1VFVTUVp5U0Z1K1JIYXNWeVJlQ3hNbExDMzFXNGFqaTVPNEk0RSs2N1gyWlZRSGZrUmExejU1VSB1WUJuKzFkR0tUaGlCY2tsdEwyQXRqV0N2VThvNUNZdG9HRjRQVmFjWVQ3VVg0YndldkNmT21EUGRYSnZPeUpKc0dnOW9uNStBWDUxIFp6Vkpja2Q4bVcxYlFvYTZ2akhVcHZCZnJHR3J4SEN1YTVYcWxxL2J6QWNPeVUrWEh3Mm9Dd1BpckRlWGxES2VjODJjUGdINC9zSDAgRHJTanh3OUdXalRMbG01emFoeGNrSHFFTTFKRFg1YTJoQVphYTBJYStuaDFzT1k3WHpKMXRKNzVPVzd5ck5YVjl6cXZzbTdBMEUrQSB0MUEzL2Y4QXB3UEZOMlFtdkY1QldoYkcxS21Ia0FxcnZsZTEvWVJnOS9Ybkh2aHArRU16OHc0MnNFQlZaSGxtRjhtSitFTm5MZFlEICtHLzdCMUZSV256WnR5SFpDeGlhV3ZUbkkza1U0SHp0eDJmMEJRNmhabzQyVEI0bkUwckZXRll5THQ3Ymp6ZUZ0WTR2SVdSWFNCRjMgQURuM1JVcHFnZzhhdlNiSXQxa1lwazlHWHEzZkQwVFV2WE16NGZiZDhNVW1QTWN1SDJYYWdjWndOWEo0QTk3NXcvY2ZmdnZ3RG9iMCA5MlEwUGw0TGVhQm9HOVhEVWpNZHJDMC81Tk0wdXZUTlBvRjNQT2NNaE11QlBaTFVtT0V3SFMxWDFwcy9mTEZYMU02ZW5qQjI4L3YvIEFJQUNBMkJrTmhSa3JsUHRyWnJnVzRSNlovRExxUXFWMnE5SXJkWFBkN3VYdUQ0NFZ1bjN4Q0lPRUZTWUo2T1lSYk1hRmY4QUtmOEEgZndHTDlqc0hBVDhDbHRENFV0eVpxbHFWd3ZVd3hoMGl3clF0UU9IYkRGalBoWjdpcmJCTW1HR1J3bVhBaDJNUXIvWThlTXRIR2Q4eCBwUUo0QUF2NysvYkIxbk1HNUZHR0xsNUVNS1RaWWZVNHl1bTFOSUEyRzdHSXBVYW53M0hTbTl6TkJWWnl0MjdQTEtZMUFXT0YxaGVXIE5rVzIvd0NXNnNMRjJwc1kwYmNVRm5VUzA1MTNRN1d0clRncnZDVGZMZ2l0U2xxaHZqVUpVRjBLcjZDQXFPWmNJWnBFMFhlS3drTjIgVmhkODZ6Q0FleDgwZk1ZbllUUGhsRHpFMXk4Y0djdG5YbFY2MTFDc3llek5RSFIwcDZnNWtxd3JYeVc5ekZCYXl1eWVOYy9SYXJybSBtMXRtZkRBNXVJRmplUi9qeGprY3BJTGY0all0bjE1KzljZkRNYnZYSWtaMFkwNmdBRFZUQUNnQnh3Qmgvd0Rybi9mOGN3dHFRYWJSIHdnZzhqOEhzc1hYNjgxK2Z4MDdGZTFLVHRCTE1FS3ZQYWg2Wnl0Tjl0TytvQmtEdUduQmIxR1Z6VGoyK1RLZlQ4WENxMEtxKzIrL0UgRU9xMXNvVEZ2bXFzbWNxNEp3aGdBSDBFL3dBKzM5QnNXMld4SXArekxDRjFWYlVtazBoa1VrZ2ZNWksvc083YlFpM0dCaWg2dnA5OCB2aXRneGdoRFZRTmYyV3F6RmttMFZmMnplTFJDQktyZm42b1g3NkRzR0N4SHlNeXFoalUwVHlTVFZhdldBUmVYMlJxVjY5aDZncXZTIExHdEJidEJ3cmRiaDFYTUlNaU8rYWY4QVV0eHRteEYyZ3NzM2E1Sk5uUDMvQUdCQkFZcjdJcWRMMU1UNGFmbzh1NTJRTElkM0M3Q3kgTzR6QjVZT2R0Q25OUmdIQ3Y5NFczMmJpd2ZCZ1YrK0tySXMxbXJ0R25xelA3RnovQUdCQmZ1Zlk5TkVXRGYzaVJHUWFtTjQzUVJEWiA4N1JZUnhSZ3h3OTJVakVtbUZLS05xVjVDanRFK0RycGxVSVlSTHUrcEJGU3NkUFBqSU4zSkk2WGNJSXk3YkNsZkpDdTdpK1pXRFdNIGExTExKRWkxZ1hZbjVEWVlUUU9KUm9tRHZtWTF2VlpnaERCcVJIbFMzNHUwR1pHOXplR0o4K0EzL2Y4QXB3QTh5bDRxZnFvb3pWZVMgYlR4bm0xc0wrbnRKRGlROWNubDRvNVRIQ0dZVzluRHNDM0JVdk9WV0w1UnVZenRkc213ZnYrLzhCd3JxY09RN0dwZXZXaGNkcWxBbiBnUVJocTlrcDk0bHNpdWVweDhQS0RoU2NTdDRjemg2MmNxWGxzRk9aZnhlek14d0ord1B3RFlIN2tEOTFQYmhIRFYzY0VBTlp6L255IG1xcmkxa1ZYWHNoVHVDeGxkM2l4UTQ2SDJmVzNBT1BNUVlFOXRWWEN6Qm41eVJ0a3E1MjQvd0M1OC9oNThBbUhUcVk2M0pzL3FaR1YgOXoyU1F5dEZKRXlsZStOcVJuRnBsd1B0c3ZmVXNvWWxFWGNoVm5oUVkzSEtmU2N2emQwOURIam5ucUJyK2pualVPd3ArbjBYa0lEZyBHWkJyeFpCaTFMb2JQbFJWNVh0QlBIcDVod013N1RUKzZrRG5oempJeXJ4ZmJQOEFyYllOZ2ZqNkQwbVdCVHZTMEV1c1JsbDJwM2dTIEVsYlUyQ3NXUXdXaDJOYUM4MEs4TWhNRGgvdmcvbkRhbjB0aFc5bWJwZ2pFemdQem5BZmZ6L1RyWk5LaTNkMHhEdFhUUW4yUUhGcDkgSjJFNFdva2tDeGdDZWQ1UUdHd1RMc1EwOFBpUTlxelQ2MG5CMFlZcjg1Wi9OdTJCL2dJRHdIbjJISWZKams0QWJCbnV3UmtsRFdSSSByYmhSQ3ZKbGNnV0hTcUxUMThQTTQydG1YQmthbEswT0t6SGtuenpreU9FU2NBZS9uei9BVC9UMGVXVGIxQ01qb0VsZFhkOXFlUEhhIHNEVDArZWZIOVZjY1I3c3VNYkxHZDNNNFRIQ3VCSkJxYUJCL3daYlgvYmMvZGRCK1kwSGJCS1UvUGdhZFBtQlZ2UzdFcDlicjFmU04gcVYwaEVUWVRBK1UvZGt4RFd4L3pyTFQvQUp6NE1zeG9hQm4zYm0yQi93RFlQMUFkYmJJZUtycSswTkxzL1MrNzJRZWZEQ2tXajJwZSBWa1JMSXgwK3FkOFNnNmVZaG1LM1R6SHpGWCtSVlVObVJpbUN5cytFOEJ2L0FENCtlMkRwaG85a0dMQmhvZE4xeW55VnVWVXRrWEhaIEJKdzNZeFNNcUlteXVQc2dnd2hzbklGdDRuOHRPTWhOSDl1VEE5N2RnZXdJT0dBQUF3SDhhNnNtRlh0REFTcXFWWVNTTmFQak83d0ggaU9IdzVRRklhSlJnZ3lPQzNEaHpGOHhZejQ0TnJYdGhRWnRteC9kK2VuK2ZmdjREcUVZa2laTGgwcVJySno3OHZhZkhhQmdiOTNuOSBkTmtYTXFzSnltbmVSNHo0MjYyOGhYT1JOaWphMVYxK0xJcjdSWmp1REEyVzVYTjJmcUM4bHV3bDl3c0p3cjI5MmphYkd0QlBxL3Z4IFc1aERyZGdoemtOUGZKekpXVkd0Rm9MS3pSM050OFgzNUJmZ0g5L1VoeU95R1dnRFZSUkVHdUZxekcxVGFTVlNwNjlEc1lDSmxBUS8gSk9IMlFucDQ5N3NheWwvR25YeXNoZ3Z0bVQzdDJkMGYyUDhBbndBQkJQenkzVmNoeUhwL1BMT2xQamJrb0FsR3ppVFJMMzdFU0JReiBIR3pQZFNHaGtBODQ4dnFXem8zQThSbXgvd0NsZlB0Z1FlZmRLcHdwNEhUYnBuR2Y4WnRHMFBXTk9XdzhKTlBoK2VLOWpLZGpja1grIFNPRlYyUVlJQis1WTg5K3JNTFF4ak5WWnYrZ2VmSUxCKy9uMUxFeGpacmhFaGRwWTBoOEdUc1ZHWnIvb3hyR2c0N3padGZIUlNTcVcgN085QjdYOFplTDdlYXIvVS93RG5xd0RJUWJLZ3pNa1hjaXJaRmVpeWY0ditXcnhEQUVXMldnVkRrT1lXcERtcmkrWVIxSzhLSDVoNSBSb3N6OFhZOXE3ZFFYNzkvMzgrTlI3b2oxQVFNR2NvdzdLcmRaRmJpZTdRMHd3MVhhQXRlVGJHVzErdDF1K0psUHNqQk1PVkxYMCtjIFlHZUs4NGtwTHNjQVArRDhnZ0QvQUVTS2RtTmxRVElZdVZjQkoyMDBuaVFsSEEyRTBYRTRPZFhpZFJqa2hqMXUrSENrMlI4WDBNNVUgcER1b1laeWYzbWpUcVQ0TStBeHhBYyszOCtzY3l0NmpYT1lZWlZQMWRrc2FTdHhHak9zNE9rQnhjWDdRSHNCOFVEQ2VZUXg4T0NlWCAzMUhyZjc1Mnkzd0k3ZmZnQURnSjhBd0lKOTBra1FpRE1YajJrMDlTWjd1OEovcHJuZ2tVQ1JNdC92UklKcTIweWRjbDZvYWFlYWVMIFJRUkpMcVpOU1kxaEcxREd6eFF2SWl5YjBxUnZuZ3dVdExIdDl4RzVkQm5MYlFITTJCcXVzdDMxTHBOa1dyblA0bXdFbUhaQWg4QTIgZ2tBYWJaQjlKb1NGVDRjd1BXd2JiYUYwd25Dek4wcTlaZVhpcmppVC9YMy9BT21sa01BOVh3K2s2UnQvSnE2dUxlaHNrdXQ5NDVEVCA5WHB0eHZrVjhzRDVsa1RXV3Q4V000MmtPSzdZTUY4NUpnemJzYjluNUJQK2Y2R3dIOFBlYXl3N1FvMGJXK0pTc2RQQzlxd0EyMVlDIFFIQUZGUDRvZGY4QTJmWjZmVCs1ZGdYeFkwd3BXU0dyaXlaejMyTS92NEFCMWlQVDRjTnAvd0JKZW9Jelhxa3FhUnRTdGtjZ0QwbmIgRFlZMUxkMkx1RjF2WUg1SXV6VGVocjhNNEI1NVhLZnptcjFlczNvNEVDRy9Qc0d3YitnMUZoa1dXRFlUVnh5N2FUbHBvQWRQdHlUWSA2WVp3dm96THVTMzlNdFJ5R0hjM0RpM3BtM3ZwdFNzcjZReG9ab3NZcGR1ZUtaRndyQmxsaGFTTjgrNndyZG1QazMwMm1Sb3NUUTlEIDFJYUxhV0ExTFliYmRrYW5FZHFzNGV3cDlvY3NLUlpuRzdVRDd4RDRIQlVoejRxaHlheXJVUFpnelpLVE5tejc4Z1c2QThBQTZhalIgWDh4b2VGdXVXbFZYRSt5NkhTYnVzaTFFK3AwaXErNDJudXIzeHdZR1JrVDJSUFd5RGdEYlU5RGd6RVlZaGkrY3ZEdDJ1MzgvOWZQOSBVL01SMlJ0ekR0dEpDM0pBd0s5a3BFY3c3SjViaHNWaVYxZUdQcmVuME5raGgyQXhWZk1JQ05NSmpHbDgvWkRac0cvZTU4K0F3K3ZtIDBQc21ydUNxQlNHUzBxM1NEMVNyeEFFU1gyd3lmdEM3dFZWTkdONGZERGc0VGZCOHdzbzVEck1ZVXE5bVdlRTdJY0FiQitoL3ordmIgVU5JWWxTSHkwZ1JQNUpJWXROR3pua1ZuVmdjNEMxdHJ2cENTTVNTeHVxQytCVWE5MGFjRG5ia1ZIcytjY2FGMkNSYnpCYWxNckdLNyAzQWJyMWNHMXhNcjRsRGo4bEtQbjN6OGJkazNGUG1mTU9UNlA3eEdDV1BLUDEra25OZ0FjK0FmdjY5S0krWkZrR0dqaDlicE5JcmFTIDIwZGttS2ZMVExrcVdaWXdHR3ZodzlrR0VOd0lHSng3bHFyaU1abndwd2JtMVhZNDRnRDZEejRCdjRDeFR3UUthTGRSRkF4U2xoVmQgcWhzR1pUZGhXQUhxdFhYa01vNVJDbGpRMDljc2hFdUN5REk1OE9OeEE4anA0eDUrOGpBWnMyYkIrQXg4QnNCK0hqdmo1ZDBPNWtPdCBLVEduaFY1RGJEMUVOVEtueEVOV2l4SlQ0SEgycDNJbU1uY0Nub05sdUduaXErRE0xWG9ieTgxVWtoT2NIMEczUUhQZ0FESHBaL2tqIGtYdVNUYXhPVXFFN2xnL3h5UjNqUVBkZDN3Rm81TWpabldWWkRjelBuSnhXSU5GUlh6N1c1NC9OZm1CcitRSHJTWUhsSGx1eUVNcFggcnNXWHlSNVhFaCtHbHY1TndtSjh5WVloODhlSHh3UGZNSjFCVjVUYzZQQ0pKczRmQVAyQy9pL0FEL1hIYkNkY2prdDAvUTdrU3BQTyBESWcxaGFBNDBqWHBtSzBDWHhvbUw0Y3dIY0h5RzRCL244dFZWc21qVmVWUmhod0liL1lEL3dCK3dYejRBUHk3MFMxeGZoODNaRFNHIG0ySDI5K0dCTU1NdzlLWVUxWDNBT3Rodzh3d25tRWJjRkk0dUl6eTBibThuSFpKNXovWDc4L0g5L1B5UmdVamxBOW5TbWgyU1R5NW4gUm5nZytLcEJoY0pMbFEzTWx0dy9uRTlraHNBZXhwNitCUjVpeXNib01HZnNaejNZQUQ5eUQ5VkpGRk5xQnFKZjZFckdOUFBxYkxRRiA4djhBNlU4aTQ0L2NUZkZHTk5JdWptMGtjYUNHVkVqZFVHRnhpV0tiRStiRzVER3dQR0lVam5Ld0hvK24vU2ZiVFpFb2NvSEc1ejR0IGttRU9Temg3dlc1UnAzNnVmNnc1Sk1aWERuQUc4S3pxdGJKakJkWDdaN094dndDQ2YrZ256L1RPUngraytncmdTWXJrN2Y0SVlhL3QgaS9hbW9yVFBTTzFpKzB0b0ovTUZ0RDRlSFQ0WU44VDN3SE1Kck5vSWp5aldvay8rUDFGamdmd1ByOUZYeVJRZEJYWUJQQmlUL3FjVCBJZW5pdlNHU0hWNGpJQmlscFI0TzRRL3VCZ092dzJybUZhVFRDS1RGOTN4aU9iZHF1Qm4vQU8vbndIdGQ2cUdBWFlOWnFvdXBheGpPIDFhTlZrYmhuV292MmJjRnlIaXptVVpIQ1lIcCs0SHdPd0liVnBhWHdQazNrcUxXWG52WmFJVGo1L1lOZ1A5b3V0VWtqbG1ScDBrU1IgSTNZUmR1M2VWTEViYmF2bkkwMmRMd3VQT2RJMkRBN1NacGhuRklOeE8rU0dKY2gyWlZtVytQQi94V0t1MllEcTg4K2FkVEw0cWphbCBwc2t0MGlqdmx6U0lrT3hqeW5YTmpJYzlicmUxTFRNQng4T2RaZGdiSE1KNEZGY1lqZytFbTkvUVFIUGo2RGJyOEFnYW5xT3E5T2VwIFFiU3lha2t0WUN1U0pXRU8wOXA4ZTJBL0E3Tml1VnFEMXVuekVUamRnVnYybGNIeXVYemt4UVh0bXlZZnFmOEFQN0IwL1NPWm81VFEgbXBSV1o1bW9heU5UV2MzMWxXK211dlhGZW1nVTFUOVBJd0RoZ3lQVEl0NFRKc0RGOEljM1JtakI2UnQ2Q09xT3dZdndEbjUvRERxdSBGdUI2ZnFwTGR1T2dlTm1RN3Y4QXppZTRNRXhvRjdXZU1NQ2Y4eFBoaHQ0ZU1VOVNya01UV2QwOTNqWkRld1llMzM3Z0FDMVpYeW9NIE1YWkN4WENRWTF5ajIyTi9jS1BnYzlVSThHZ2RlelR5eVpxWXByQ2J3V3dSZ01xeEJCc1hiY0N1Yng1Y3lhVU9XRlZWK3VHbmhPdC8gbjlzZHpyZ2NNV1E5VjY2ZTJmamNQVEdIbVZ2UG1OVGF2bitTYzVwdTBOendONzJqbi9vSi9nUG42ZEE3TUZ0c1BPREpwZzJ5QzNZSyBKam1NNGdrUTdRdENwM0tLeVhCdkZKR0U4d1FxdXF6eWVlYXpDeVRLRk1TWnpaRFp6M0FIL2Z3UFJVRGJDRVN5Rld3YzJ5UDhBOFlyIGRUa0tzTm9pVEdnQzJXTUJNTUlmNGJJb0o3Qk00aVFzdEg0MFRGN3B2bTltem5BVC9BVUUvaDArR1NSZERsVWR0TzY0NEVrbHlscVYgOGg3NHNJZXdoeFZYMkVMY2pCQzFJZFZwOVBoeUV6NS9MUWUyVkFVb2NZcy9kdkF2d0IrUDlSVzJrR0lzeU9pUm9lMUZ1OGk4dE5qNSBGRERtanlENU9SVWRvYldraGhmSWc1TzJHR09FZExsZk45NHhvV1RmQmVZMHI2cktDM2pUSTdoMUpxemJVVXE5a01pSFU3dlVGUzFLIGtQamtoMkJXOWJ6UzdnNFlMYzRGcVErQ3RsQ1l2YzFuaEpzSWpuei9BSURmK2ZkVTZvZU9IY2loNUR1bHFiZUJ2aTA3bUs5cjFmbGggd01vdGQrenA4eUd0M3dId0h1SCsrRS9GNVYwUGsyeVdpN2d3QURZQUFBK2Y5dXlzM1N1OG94YzEwbmp6SmFtb0tZU1lWZFBwK3B4TSB6Rk4rTFRkVmtLMzVnNFdReU1CaTR0UEEvVHhWYjRNKzBMUEJ3aVNrbzU4QjREd0dIVE9qaGw5M1pLOUZwaklPZkNrd0pMVDdPVHpJIG5oc3FKWTEzOFBaSmdjTytNaS9EQm5rNVNuQjlQVE5WNzQ4NzVzaHZuK0FEL3Z3QzR6S0ZDUzRGNUNHWm8wMmthUVZteW96R09QT3ggWWtuWGtjRnFOQUZqSmVWR2RzY1ZDTTJiN2ZHMmthMHQ0ZDJSNHNrY0N1V29uMlEwUUt2ckhLVjMxdHV3cE1xNWdZYkNBNFZrNE9WUyA2V2hkU3pDQzI0VnZNVDF0Z0QyTkFyK2YvVXo0cnJPQU1Jay9mdGcvZnovSUY2cmxCYlE4ZktBcExKY0dhNFJ1NUZQc2xiaVRDSTBGIG5LVWhrRStHaGh3OE54ZkRnSWVodkcyRXhiUTg3NXpiWXdHd1lnVUh6NkN3bHV0N0FzZlQzV0xIbFUrUzdjTlZ4MTdWNlRrMGZiQWEgTGNiREZzWjljTzZpZmRsYjhnV3dkMC9hdkppOEdkRkJtMG53RDhBZnVBK0E2Q1hTczQ5ZkhPMzJTeURUR1ZXNkFrR0tmczVvckhuZyB1MkVQZUNFUDRiaDh3ZVlybStGNDg4T0RNc3E1UlkyTTV2WncrQUFIL29MOGY2VkRDcGQ4UWliYVo5aUVaVVZGRXF6eEg4Z3h5U1ZaIEJBN2JjZTljejc1MGpkajVxdkF5YktWdm5tU1IvTnFGdHNyRmFkekVNemNtbnVWVXI1VXJKRmJ5VVNRMUxaaXZWc29DTEhsZitjRGggMCtIQ0lUQWR0TURhRG00REt2S2NsUjdSMlR6L0FPdmFJL2oxU2ZNSWFmNmJzdzlWUXVaak11bERRTDVrV0ZWWWRzRGdaVVN4Z01PdyBBOE9IYWpKTVgyUzFKNURUVEJXeGpNcnE2TU10VEEyY3hBZmwxK1FRSDJDMTBOa3BkanNDd3cxbDNsSkpXL0Q0OFlxVXdyc08xNDJhICtQamdRbUxZZXlPTjhENGx3SUdIUmtZcHdZWWpoRWtJajkzZGcvcjdEcnlTdHloODFjZUR6bFplZEdXM3l2WDl0a05VTm8vMm01QWIgSTQySGh2aGh3SVRLNW51TTlxWkVaWmZQczNDY1AzLy9BS0g4T3JnTFR0T0k4MC9pWHZpbGp6a1lOdGhOeFk4a2t4WXBJdCtEYURpdyBuclR4d3NVU1JKTThHV1d5Y05zdGtNT1BjQU9UeFk2OWFkSm4vRmMwOGFkRSt3VTlEZmRjTkcray9ialE3Tk5jcU5lNk56NllEWmk0IGRaSGZGVUREcXJqRzBpQ0hyWVZjRFpjdGdqN2xuemhVN056dlY2Y1BYNk1uS3pxbTFoSFF0ZkZSaWZPWTZYUXA0Z0RCelp5dDZMVGIgbEJPaXlUT2RNUDhBcUwxYktWWFdTcE9WYk4vb0sraHpYMnBRTEhGTDBTV0VtcXJKVDFCRmVEQ2haMW5rMG11THNVMThLSVdPS2JPbCBiRmJGTGxzaTZCb0doZkhBdmhzZXF4UkZ3dkZGRjVlYUFGKzNwcTZlREZpNm9OVzl0VmhxdVc2a29qdUZwNWxWOEJ6ZE9GYVE1TmNxIFpNL0RJUGNTcTRZaERQdUlTcHJSdWczQ3haM3hDdDhYdmVPS1B2d0VEaGhpZkE5Y2RSbExFelV2VDNVdThYSFFOUzkvcXkxQVoxWU0gRXBib2NYWHJrbWgxOVBjTGhRN1VyY2VYdUxiOFlMSnVlNkkyK0pJUTNodjc5c0cvbndIVHNoNmc2enRwTHM2dEczT1c2clEycTJsUCBVUXlaTzB1RFJUZW5zV2h3OEdUNGRicDh3Z0hzYXRHRGc0amsyQlFtVHdOdTMrZFJjQkFiL2owa3loQndWM0JWZHdPbnRiR2hzNWJ3IHNoMlZFOTNNUkQxT0NudnVnNFEwK3lFTnd1QXhCZ0wvQUJVd01zeStNVmw1QjBtN1ZkMkRBSHdGUkFEL0FPWFRlUFRKSWlpT1kwalAgRnB0UWM5USsxRHBvMkVpc0RMTDdWSXpsT0daQytTU0s3cnh0SVhSNWNva2wxY2NrdTJjODhTcVF5UVJtc1dzS3ErUlo2Z1V1a3o1UyBzNzRVdCtmekNhK1NiRFQyUmJIc01PejNLd25LbStZWEFodmwySWI0d1RKd0VlQlZiSVppZG9QaE1tY05oTjg4L1VJQS9VVDgvZFdEIHN0REVMbGRCODFaaVlXU01UNVZmVS9DQXUrbzZIRTFBcVRPcnFFQjhoV1BpblRJR05QTnRZUGJzSXdaYWN0RkdLV29FQzBxYllBUUQgQmV0ekgvbFFGWHF2SVdKZnRtYWozSE5kbzFidmN4allMWEpKMk5zaDA2VzJPU3RWYS9ocUVyZGJpVnVSWlVpQ3dJY0dZc3JOWUZSdCBtQTByVkVrbkQ0QStmeGZqOXU5S3hvMUUzSXVWdFRJdVVOb3FIYlZQcmRlNlJ4dGVvNm5Ncm03cTlRMWRiVHc4T0hxRUR6TEEvbzk4IG5XcCs2STNCL05neit3SDBEWU1kZ1pOeEhwNVJQQ2lhalVuRU0vZTJRUUdGa29iTWpFRGJteWZDbTlOcjRxUDA1WFNTSjg5TkNya24gdGo5SVZ1TEp6dXhybGNzV0taQXA2Z3JwdEZIZ1BYMGViamVkWTFLSHpiSStXUE1PREE3NzlhQW5HS3RyNWdPSHBQaC93K0lqd0p4dyBXYk1hTnpadjg3VS9mOWcvZnp5bjdjektIYUtZdjJBZVNiQ2xPeVMySytvU1lPYkxVdG9DdlZ6RVcveW9IMUlmTVg5OFVyQWdUdnMzIEtGa1ljN29oTmd3ZmtIRS9qejdyc09IRU9wUlpLaDIxUG9ISmxUSktRUjBvcmNlN29kakZXRkRzYXQ5NFQ2VHNpdDNCUGhWeTJqeDcgVVpaa1pvS0V4bFZ1d1M3UHZ3QUFmNTlqMHE0WWRMc1p3R3NiSHA3ZGdLNVQ5YjFsVitkWWRnUzdnQWk2bjM2WXZKKzhha0szaHArQSBTQVBiYlVNTXhQaTRzbUROaE9jUDNBUUdJQUJqMG9KOVJZVlppaXV5V2tYODEwMm1lQ2ZNMUhKSWhmTGJhOW9MWE5nbU8yVVZYaE1rIGlLNnN6U2lPTytIU1dLV0NQY2N4czZNcXVOck1NUzJRQkc3UXpIU3RDZzBEY2wyU1pqUWtteXlzTkF0RFl0cTFTaVh5VkQyZFBxdHcgcFB3OXhlNmtEY0NlMThHSm5BZ1RmTWQvUGdOL0FiK051Z2NSWXhBeFFWZ3RTazdMamdFTEVLZm1SeEpoWGFGNW9sQjJCYkRvZHFRNCBiQUhzWjhjTzNOYmpCbFlGQmd0SFNkOE9IOGJkL2Z6NzkwYktDV3dWcGhNWTJPaDBoSXNaOEcyYThOVU92NzVtdVJRU3J2c1B0V3RMIGQySWJJdnpFZEQrZWNUKzVuUEdZbi9FTzdjSC9BSC9ZTi8yQmduR0ROZDlQYjVMcGFtVnQzemJtdU5JcjkyeVUrSkR1UzBGT3J3QWYgbUJneFQ5cUp6Z0huY2ZzdFVUeWFOYURRc293Tko3Smd3Qjgvd0UvNTkrZUh3bFdKQmpoT1lTMTNuZU5NUlFxcVBGbno1NkdPTldrYSB5alpKa01HeXh3dzRQQTkyWEIvUjQ1NEVJK1pWNlJTOVlaUjZ5SkpsdEFoQzJuZUdIMC9sbVJvVjRqNUZUeUVPcTBPdDNBeFlDM083IEgyWnhzblppdmFGRzIvd25lemg4QXdiQSsvZmdEVVQ0OHlncndXN3VLSWR0VzAwT0J0ZWp6QTlYdFllMm5JVEZUUTdCWkVQK1RmR0MgSkJRN2dBZ3c2eU1mTUxMR1dvRXRFMjhBQUdBQUJqN256NHBEek5LOFdxMCtBQXBpL3FaVFhhcmw0T3lPRmZ4SWRqZ1ZQWDBtcDdCWiBCaXE1a013UUQwN0FyOENEY081alEwTXpOZ2IyVERZRUVBZ245L1lENitYeGRvTGlmWkNRNGtsdFZQV2NwVEtlZkJxZUpNSGtPSkZsIHpFK3lLM2ZFT1lZWUE1dzk4ODVNR0ZOMFdTWnc0RXE1SFFRR0w4dnI1L2Y4YzdaekxLNVRGMlRCbldMWmtPUURFbytUMWhHc2prVWMgc0FPTHNWdFJvWVVEb3FLZ2pqVkhpbHR4aVZVbU56am1ib3Q0eE5CdWFkbW95NjZEZDc0dXpLVWc5bzJScG8xWE50T0lENEJlSmY4QSBENGhwR29LMmxzZ0hROVpsd2U5ZlEvci9BUE9ETHl4ZkViZlBObzc4ZlBnRUh3R0I5R3lEalkwYXZMSXZoOG8wYnBYVjBOU1hyZ00xIDZybG9pR3I0SGsyaUsvRFE3SHA5a1hFOWJCOGZQUEFkNUtmZWZOcFBPVjkrQWdUK1BnTU9PRzBabFMxM0R0KzFRNmlCaW9iK0pIekYgc1BFWkxHS2NvS1BnOWt1QkNwKzdFTmdNSEZKZmJUYWZ0aXVMSmpEbFhCTzZnRGord2IrL1AzVCtjNWlmRjB2MTVWL2JHMFlabXNhYyBiTFlXNjNJWEhXOW9JZjhBRGtldFJQWTBPN0ZzdW44a3JpbGlBRUVZck5tZkJiTU1xczJrNGYwQ2duOS9BQU9pajI0Mmlpd21rM3BJIHd6WmJsU0NTS1I1S29WbVlsR04vdkkxUll5dEtMYVJCaHdtWnFrTkJVQjV2Q2paNDhqZ2ZLbEJpNDlsZzYzcXJLTWJiYjRFYXZMNEYgVlIzZXQrR2lZdGpROE40ZklhZXlMN0tEclR0bzFJZFoxbVVHZHpBZXlKTy80QUQ0QS9pQUFIK3hYa0w2WklaRE9uaERxNndsMVZXMyBjZ1NyMjJmUEFZaFMwSmxnQjYzdURSblE0Y2V0ZzZsSFV0QnJaWkdXaGNveis5dkcvd0RzL0gwRUIwWU9DTzRPd01iUHE1d1pFK3lsIHNhNzNnMVhZdnU2ZUxRN1pmU2o1WDliMlIyZkQzQVArRFA4QW52QmhaS05DdVRKbzd2YUlRSHNCK29jSDQvMUkxUERYUDRTSWJSYUMgRTJWVzJMWkpySHZjMU9WRVN1bWlxSXdGUGdHR1crS0hlNFo5YXNac256am5HR2E0NmNlU242KytPR0svZ0F3Zm1EMU1ZTWlQUExPMCAyY2pHT0tPSEhWcTcwMnpHTnhxa21rM0hVZmR5T01MWVFwM1lvb0R0NXd4N3p6eWd4aUFXWkxZcDIrVitEZjZybGZMZHVWR0dqalNtIFZhaWxrdEdJUnNIMkVxaDNlR2VWNlJ4VjRmekE0ZHdNTWcvWTdMSDJXOEIyWm1WeWlNemIyYkNZSDMvWUQ0Qit4eDZjRXkxQ2p1aC8gNFN2VDZreVdnSFpQajNsZGkrajRXTlYrd2krUGg1aTI0UXpCREVHaHNEYkJEb3d4REZzeXlEMlIyL1lOZ1A4QWdPaHRUcnRiYUxFYSBqVGN5V1FxbExyMDN4TFFTZG5ZVnNXVXB5TGFDR1FtVlcrR0hCdzRlalQ2UFBJNWhHUnJrVjJaWmVMUkNmNysvWUVGZzY0eFpWa2FGIGZKZDBOa04weTBXcEdscjRlcGFIWVliNGhOaFNrYmdJQjJRUEREbUxCWk1JRGg4NWJXZHI3bWViTlZjY1FUK1AzN3Badzc0d3FNNCsgbnpSWkxraU0yWVhjWER0L2pZcjNVOU40cmxpYnNhcE9VZEltZVJCSVJjYjRZRXZDMWk1RXlvTlhwNWVHem9JMkhVWkF5cjVPVm1nUyBXZFlLVHl5UU55US8rbzN4V2hiSVRmbVdReXcwL0FINEZIWkdhczJqN09DQ2JKK24wSHovQUxuazFic1JvcU5iZ1BtZFVxSldpZUZFIHlLcld4OFJibEp2ZTRwTVQzQXhNMDlzamVRWkhoRFlKN3hWYXl6UG1PNWd3bjNnK0E4QjlnNjBtQ2hCM3RBUFhNV3Q1T205OFBWZEUgYUllZFlCYVllS0ZtaVZNSU1qNCt6VEswdmh6a0JQYlp6SVRKaTBONldmQ0JQWis1OGc0YkFBNm5yRXVnV1pzR3ZNcW9OUGRYYWV6SyAzVXJDMFdyWHp4WVhLUUphNUtiY0dFUERjRnRrWkNEaEI3WFcwYzR5VGFCYjBUUnpidHNmQVg3K3Z0L2Zvd1lNU1Jta0ZDSk5uY3hqIElCV0pXekZ5ZHB3V3ZVNTVYRGtZRkJHQVpVK3Bkb0oza2JGTnRNZldtYWpVRWVSM1k2NzhrNzF4NVVyUVFXM3laYlV0anV3YWVub2EgVEV0aHd2aVEyT0RrVWE5K1ExOWJtTGJKVmNNY3lRWjlnS1gwYmxDR3pES3J1d0lFQm4vQVlZSUovd0J5U0hTZW5OY3NWMnNFRnFXSiBJZGw2ZXlURGRIYkcrRjRPVUF0a3F1YTNYNFpoa21iT25oL244OGdzaE1ZaDduVUR3N0pQbi92M2dQMGMxbHVuZjIzTEMxU25nTGErIHo3NDNXcjlSUTJuMU95RmNDN2dZcTJRcXVHSE1MY3hnRHF2SDFGVld4bTZDeGpOdmU5OCtBUHo4QTRDZndQb2NmVStZcmgxVnBuNmUgeVRKQXRwQTdUMFBZVlB5OGE1UENaVVY4VHpFUENHWm1jdzRHUTdWVExNV1NoU29GazUrVVFkUkgrQW56L0lNT21qY2pYY0N2SElFWSB4bzZFVHJIR1V4akVGOTJPUkJiY1g0R1BRb3l5UFMyTnRFRHMwMjZqU2M1U08rQ2JPZERGY1h1ajNkdk51dFJFeUdMc3gyY3I0dHBTIHp1MWNudFBNUTlON1p1aWFrSWJSRHI4eFcvWit5SWRmdm5QR0NmM0laaG5GMmFzM2gyN1hXb2Z3dDBBQVFQdndDdCtuTmtzRFNyYmsgT0F4M05KRzVWQWpST3BCd2xvRXVIUS9lT0lMREQxc1BhZ2RrdUFleVVEWmR3QVVkOEdEQ2lIeG4vUk1HL2JEOWd3My9BSzQ2dlQ2YiBTQVYvSHFWdUNpcVRpWEE3TU5mV0VoMWVKbUs3UlU4VlhtVTgrSVFleUZ1N0Y5a3RUajg4NS9RYXVqZXdRSWJSL3dBdTgrMzkrUVVHIFhkTzM5bDVDcXB6OUs2U1pnVnZhRnJtTHN1YW43akwyZzBNSUdJdDRtRU5sV2c1Z2N5QkQ5SVBzNWJXWGpuaU10ZmRrbEhQY0JQcjUgOSt4QUFLbGlTVkZTUjBLRHlFT2QyRURXZTNHNDJrUVZaN3kzMlUxd2hveUpJVVF1S0pMeUZOdU1ZNXVCZzJkV0xIYi9BS202NmpyZyBaQjZsWUI0QytXMDJ3M3h3TmlVLytKWkh0aTFISlhzSXBiVnFNTDVUNzR0ekRBNWtxdnRkQVZXVjVacXZRMFpadzN0SkI3QWZQbjM3IG4zVE9WM2hQREp4TFVFaHF1a3RxS0ROUENSWDdzTlIySGE3YXBFQ0xRaUg4UW04TWpKUjRldUh4UHN5dVE2eXpQaUdzakxVZHRQRm8gdkg2QVA5L0h3OG9Zck9xbDhPK1JjNm5CdVUxSUVRaGVXY2oxT3lOQUduTGFLR0hDWkRUbnlHK0VHOUhReDlhUENHOHJQOFJsWnJPRCBza20zallIN2dKLytvQWtmRGJLcHpIWlNYSHlRQnJuY25jZk5KVWZMbVdOS1laVDRIVDdzRDZ0ZU4yb0FobkFJK3k0TElNck1wVnl5IGpJOVhPMW9vNEFBQVA3Lysvd0FKY3Fpb1BZaXFUK2F4QVA2OEhqbmkrZWxJRkN1N2kwWEhJMzdiUEhIemRWLzIrZW53dmh3OVFWV04gL2h5K1BZV1ZuTmx4cTJUbkQyeHdWd1JhcFFLZW5tYWZjRU53c2hnTUE1NUJ0Ui92TlhxOVpqTmtTY0RuZ0Y5QlAvUWFqcmUwQzdRYiBmaFdYS0FFc1o0ZU4zQVE2OVlDMHdvQVhpamtIVC9zWWVIeUJrZ3o2L2ZBUWNaOW9Sc044Ti84QVRERUFmMkFBOGRPYW5YYVlVTVY4IHBFN0lTZFNMdFpERFQ0RndzajV0dFNsTURGNC9zNmZRK250YklNazRDd1BsY3ZpTmpxTEZ2Sk01ZG5Oamg4L1VSOCtBd1BuK2tFdU8gaWZGSHRRRUM3U2x1eTF0dDRPN1ZLNGQ0S1JBMVBjaXUrTDZmOHkxSWJJT3NnR2ZUd0tvSDNNV0xzell6ZmUxSHZ3K2dnQUhBUUNDLyBSeFdUQVNCMnhhTkhURE9Qd3Joc21xK2JGR3VCWnZpMVgyRVNiZW1hOFd4enhyQytMVzdzZkk0SHpkOUVpV1VzQklLT3l0WE9kOE9CIHFLcTZZcjNuWGdkMzg5dGJSdDZHeUI5bmNQaHRSNndKK3pMTHkrSzR6MjVzazdBQUFZc0dQZ0Q3Q3Fjb2xMaXVxeXRVdW0vdndCbVYgSzJWZlE5U29IRDR0WDJGWXdzd3dPSEwzeGtjQ0hnYkJVZ2U1L1EzbitpZGo1Qit1d2RRTHBiRGd4NmhFTmp5aVJzTVpaQW5lQmtHQiA1bFA3RFdWY2kxdGZXK05wOWtCdVNITGFyN3M2dHZObVk3bU1CdTJ5bkg0QXZvUFB0L0E5WklUMWRqM2dVVVBET1cvSllYbFBzS3IwIGZpL2Mwb2h1TEFIaHpBNWd3UWgyTXBEK0tCMWw1NVF6RFBDYjVzSHRzRy85REdHZU9FekxzdTZhZlVsUGZqbGwyWlVsMS9peEh6MjggZE5tMjFtbVdGOTZwM2hqT09HNFlnZ0xlNXNiekhIZFg1cXlFL3B2S1dKWUttdDFLZWF0Z1hBNFNXdm5vY2pqY1hUbnA3YVUxd3I5RCBRN2dzamVDQmlDUHI4OHFtQ2JNVUtZb3h3MkVkdUFuOS9BQU4vQUFIWkhGanVOalNtVloxZ2N0QXFVUWZaQzNZQW1ueGNwc2l5b1krIEhXK0dudVpWZkpHbzlSNmtxMlIzZnRHci9CaEVsMnc4QWdnTi9QZ0Q2WnRtUlhiUVlEejR0aFNWdGpTVktJbnVDVElMR0ZjWFh1NjcgZkNodzVzUG1CZzQycCsrY1orK1BPeGhBbG84QjJEQkJ4L2Y3VU9QeUVQUjJlVnpPQ0JRSmtPcENkVEdrVlZjRjZJZXRDV0xLUTJBTSB0dzYzK0d2dmh5eXg3YlBoczNLRmNtc2d3Z1Q2Q0FQL0FML2hoMHlhQ2R0cDRkTENzTTh6UWtxdFNmWnZNa3YyYnR4Mk1UV0M4a0hwIFVjc2NTTWpPNW1pUXZLVWJES2loVUVkOWVHbzJlU2VEZlI1b3JyKzlMNFlMQ3pUSWNiV0thMUVraG9yRlV6MkZQUFJiQ1Y5UU1NZ1ogOHdZc2doRGVHMndIdWN0ckROUTdTOG95UFYzZ3dBREhZRDc2QUFkSjl3VTQ3T1FNWnA2alFpSGNHVHdqYmx1K040Y3BVU0xTSzM4TyBKeVJrTUo3SlhQTVVPQW5vMVo0aTNuWTBrM1Nad0FnbjBIZi9BTDhnMVhUNnpGMW5tS3ZjR0diVDR0aGpWNnYyVE9wY3QvOEFlYTArIGxGdGZaVENmRFcyVWdZcXM4UStkTXN3WWh2anlNZVB1d05CQVlnQUhnZW45SXVnMmtNZmN0TkdvQmpLemdqYlgrTlYyQmJESTVKb2wgeVY3SUlKOE5ibVVuREhyYzVTcStmT2gxQXpDaWpPekhBbU4ySS9BZWZiQnY0RG9ZanFZbWxkVnRKblY5TzhCemtTQXh4Uk9BMUxnWiB4RWhCbzBWcWpWazN3ZFZoS3ZBL09RZGZGbENPYkYrRCtLc2ZucnpBMWgzcnEzYXJrenBqMktWcWZOeFZrRGtZVjdwRlU2T2kxZUNqIFR2VEtQZXIxRlZLWFlNb3JYbGhFNTVtY1ZjMG8zakZMd1owM0pLVEJ3M0V4NklFZk92YUZWMTZoa3VVNVpvZ2phdGVaRG00em5uTXIgYWhyNnJ5cDZ3ci8wbXhRYU9OV2w1SXZKS1o3Qkhlallod2t6blNwaytLSEtaaGZjbDBRSUN5WWNESnpyVW8weUtpRFRmMmxTSWlqTyBhWE9sVlIzWkZqa2FOMnhObnlhNlh2YW55MnIwenR3V2RYUUt4NEpJQ3hLb0JyZ0FBVVR4MGoyRmZYcXRydW5yZlVnUXlKWXpaa2FvIE0rQTFldkp6UFNaVENGTSt1bjNaZktBaVVQTmhrR0dhWm1PQnBiWWU1OHF3b25wcm5PeXF2V29xM1h1WDZscjEzczB3NmVxMTFSZjggVXpVSnAvdHdHSWtJNmd3NmpVS1JKUkUydWFqT09tUXNWZFVCNE93dXViVktVbWh5WjNFaTRUc1Q4WWVGRXFydEZnQzRMMnNNMFBMbSA1TS9PczY1ZXNkeEhJNGRnNnBDRmNNUXdGdndHdXdQMERYUXhBQ1JhQUY2cXpYRm44bjkvdnJ6eXZobkthWDZ0MHYyVFNQcEdLVmlYIEYvd3ZnRjgyRTV6Z29oeUxuMjNWQ3p1S3hjSUxOeVhtRXlDTWhDTUFGUlhGaEU3SUY1WXhTamdCL3JXY0JjajVXZEp0L2QyaytrajkgNjRXdmdxUmc3QTBOTFVjUENoVVVWbUtjcGc5VDNsQjVoNGV1R1JoZUNzbENaK1BDc01qbktlQUxMa09vK0hqNmNuTFZNdjFLdVpuVyBkYW9pZi9VeWxuQjlMcVE2MzJ1TGc0WmZERGs4RUVjbnJZNkkzOWpTc3lxelJ6YVhiWXFDMGVXZVdCSXRjcUdXTlhRdndPcWZaeW9oIHRXa3QyYThhOVRWMGtuZzRyT25ZcVl6UEI1aWVaYnhnVWtYOWFtVnladVl4TFlmMWxBb2dwNkZJTWFoSjJaT0d3OHlZdnkvUmtlbkwgd0dxMGd0OXYvd0RFQXRXZ3N5NExsckdzL1RwNXE1cm5BYVdzQXBXY1V5OStoeVczZGFzQXFQQitqQUxuTjlmTzV6MXRWZGtJNG1MRyBVSjRvQU9Gd2N0ZEN3UW1YbldkR3BPMk9UeEhLdzU4TXVHTEQvTXRuRStSWm85WVNBUEFBNFh3SytCMWZnT2pabVFtLzhXRExlWEZ1IHV4aDBYeTc4dGVoblM4TTFkc2c4dXZzUXM1SXpVZG1qQzY1NlVpZGpaUTllQWxuVWZscU1RWmxNb1VRYlRJU2ZKR1FNSTlZZE1GL3QgaG1vNmplczhNdFF6dW9GbUxLYnppSTVRSWlRVWtTeFhPbFpsZnB1UVBhSS9xVWE3TDVIcnpqSlpBRVp1U241eEhQekJrUUxDVHNmUSByZWpPczZXN3UwK3B5Wm1xZDZ5WW1ycTZzbXZBL3dDbld1TlZXTk1WQzNkNGdDK1U4MTU4bi9xZXZ4QlFoT2JRRm01L3BuSElvc0NlIFFKa0paaEV2VkNYdlE4MXBaTmUxU0J0dVBHalpXWE5EMnlSVmZWbjVUWTZyeEFOT2JzWnhFY3daYzVjSVRBV2N3VWl0Rmx1dDIxTW8gbjZqWHdtVFRyWlJYMXdNVHhVbGtDQ0JCVUZxbzdNRlNEOGt3UjljTldnbDJxWXRCREU0c0FpRldxWE5uQ2lPSzFYMldtNTFuVGZFVSBqajNMaGkzM0xZNW8rUmRDNlBQejFVLzhoLzIvL0RyajA4VjJHdWJUL2RUb3l5aUFqMHE0VFQxQUhKeWw2QklKQ3pvMXlLTHU5bnZRIFJXUFFLa1I1dnFBK21jVFVGUE16TTdEMWpWV2ZoNjUvcUxOWWhkYVF5VHNRemwxcHBmVHJjRUFsc29aZDFjQTN5Rnc2Rmk1NllETEcgQ1ZUSmhUMGd3bzdhODc0QkFWWVhyOWMrQWNJRzQ4L09VRkNQTzlNa1RrSHhqRG5XZFU1UDArcTVQOHgvOGdmK09scDdsLzIvOEoxNiBkclM3QXhiTEtGQmMwaXAraUNuYStteU5tckpPYkNqZWc1V2l0V1RnaWY4QU11eXM2Y24rdGRXSGU0WFo1Rm9YcVhNYTl5SEhQRXNHIENwalBCQ3MyTlRmUGk0MVQvd0FCL1Nqck5YNTV3aGFMdzQyd1d6MXBoWTJBblZLdjYyakl0TEpPUkVXdi9RVGlqbERKbjVkY3J1VG4gU2crZmtGOFlHWWJEN25zakFYR3k4NnpwRUFCa2pzWDZxSG44aTZQK28vUFZ0N0pQM0d3UDdCcXdmMGZrZFZjcWw2TU8vcXhSaG5wOSBGYUFJRk5hVkxCWGNLMUlNQWNvcXRGeVViVzFPWEo2d3hzMGFZUzhoY3RDdkhZbXZzU0VmbUc2L0ZSb0liQktWbFQwajhQVG0yY3BVIFBNMUZCS0pzQzVuR3lITTFuMS9YMWx6dlRqWkRzdStrbXlXUkRNT0xqNnlSVlNPQUdlWmx6bWxaaUhROHpOUDRtMHNqS2xaeUtYV2YgOEFWZ016ck90T3BBU0tCMUFWdHBVeVhoc0hZWkpZbzR0UXlXNmFoWU5EcE9tSk1tcHNrK3Q4bS9PTitmejg5VXl0SExKcnI3YkdueSBPeU1lZldrYklSNWNlRDZTT0FRNWt5eTlRdVY3WkVuTGFWUElYV0hEMWhIcFJBWWpmUmlReHlKSVVkRkZzR1VjOU1hSm5SN282bTlZIGx4M2pTdyt6cGZxVWEyZjdYWHJsclY3YzZyVllJQnhNcWFucFN3c1RDRDZYUTE2MlZ3Z2NpSzZia2NTeitrZWVpeGlLeVpkd2NlUEIganNYcDlVRE9zNlZJQjlYRWE1RjBma2Z4ZUQ4ZFBqNTBPcXZtdHB4K25VUGl3L0RMWnhieUxORWRKai9oeE1icnExMG8zRVJlYkVzWiBJWXRPdGJXNElyWnJxQjZaVUppanhTeENoY3Nqa0daa2NqUGpsaFJZZllyQ05hbFBOaVpTUllIcHl3eGl4bGx1WndnMDlIYkdkWDhxIGlodXRZblh6ODd4aTJrYTFyQXlxL0lHK0hNbnBhY21ZMWFac2ovbXNjTWFUNWkyZkt3Ty9UbG1nMm9RRlhYRmV6QnFmZ0JZaDJTdFEgOHIxNTFuU3RQMzZQVTU5L3IvZjNlYnZ6Zm1oZjVycHVvSmpuVXhreGszZUhiNDI2OXRmazliODJkYmJEWW8vT1o5UWx1TkV4cXFTcSB2UXd6ajJYVjg2U2VQUlIrcWw1SHVUTmgyMHk0N2t6d1N4dHJoK3JNZFk3RUdMaFdzaU1Zd3ByS0VxSHFXckdhU2FhVnRSR3FpdzY1IHNMUGx4aEt5VzAxZWdVWFJ4S1pYelBGRmFtVlJqekdaV2dHazlVRVpvRklyOWNUb05mVkNqckdVRFUwaXZpcktzN09VanNCTE56czYgenFSQUJZZ0FBTzd4eDhwMHB2OEFpblB5Y2JQeWVla0pPcVpVT2ltQ25TdnBteTFPdklMcTlqZjFnWkdjWG12Z0VycUFuQWp3dUtQeSBGVFBVb05oTGVNcjFMdzFiRlEzQ0thSlpsbmM4TXdsa3d2UUZaVUt2ak5KR2wyWk5hbk5tTDNEb2gxMzI4d0gyblBWeTV3TVYwYWs3IElTcWRYMWNqNmxYSnpCd09PR09aWHFJbHBtQk93UjgwTEJrcER3bmJtMTViSm5XZGFHSnlYazhTeWtmb3NZc2lQd1RRcy9OQytseCsgNTAreGtnREo5akJkekVNdmdoYk9JSUlGbXZKNk0xMnZqbW0zVVBYVVNtcm11bEp3MUZqb0hwdGlTSWJ4OEdlYW4wZUFTVEswZUR6byBRQ0xLVEdOaTlmcU1qYkFPSnVhQkl1WVpzYXhoWFA4QVZITTUySG8vY0twMTRkcUh1TmU5SkE5Tk9rOUp6L1p0aTJVVW14Q1ZoVzYxIFcxb2R6ZFVic1FmeVVzZm1BOG9uT3VCZTlScUMxSXE4a3ZBYUFYbGlSVFRFaWgwN0JYenJPc3NZQjFJY2dGM2dpTHVSM01WeXhMTjUgWXJrMkpKTldhcXowNEUvVDZIazhHUUQ5QnRuSUQ4QnFGMTVvWDQ2U09xSzBQU1FTNy9QakszcVpTOUZJYVhkUE44VjhJVmtpTkJpRCBuNlFldXBUbTRTeTh5V1JjSnlxWGlBczB5eXBtY3o0TERlNU1MRzd0d3c2MlRvNWlGRVVzc0VhKzBRNlY5WUNRN05hNWMwM1VEYnEzIGt5bytVb2tGZ2VOa2FJeTF6VHNySVdEaW9WSEVNa2hMbm02K21EVCtCa0w2NndQRUZ2TEY1VTdJRW14bWRaMXVzblQ2WmlTV2JQSmkgYlpxYUtySjVOV2FzOFdmejFrY0F6b1NCWnUvMzdmUDU2WUZaK2daY0ZIV3RjakdLMnRsWTNJTFJ6U1BWMkYxRGhHV243STB6VmhiTCBiWFpUMDR0RW8za3JwVWswVDFXZDZCSndaT0tJOFljRE5UaWtpTGlTekZaWXpXMHJpVFI5dmpXWmd6Mkk1SXMybG80VmtNa0hsR1cxIDhaWlJwTEFtRmxMZTVES0JIbUY4TERpZW9ZTGtSSnFINnllWG5GaWFXUklFU3NpZm5XZFprOTJtL1VTZ2ZvQXBRSDRBL0hVMWp1dWwgMUdMTXR5TVRpeEZtMTVORVdmMmVlb1c0ZFoxemhFKzZhK0YrdFVIZ3l0RTZmWHc5SUdBTm5MSENTQXNOcWVNRHlDQWFhUDhBVUtVaSBJMnl5ZWNXVjFqTEFpUGtDUnVRSWppQlJOekdOZDFhSlVJbDNVbHBqbEh6TFV1RXJXMHkxTmZ0anoxSm1MNUdXNHQ1RFhrQ2preFpvIEN4U1dSVGtMUkdTa3FoT1JHOUMvbEdzdWFFaTVVTTdGRzVrb2ZJenJPc1dwSlRWUlJvU2thelI0b3BLb3RpelNpbEZuazBPZXVnaXEgd2t5VU5VTWxaQUdyVkxxNzgvUFZvTkV2L0RnMDhhbktVN2t2M3BZeHgzME9UTUI5T1V1d2Ezek1yTmh4Y3lJVTlHY1FLdHRkdGpXYiBtNFNqRXZJalNEckdUeEVBOGdPcGdmU0pVbDFlQkM4NnpyT3UzSExLRlVDU1N1UHZiOHArK3VQSkhHWGNsRUpMTVNTcWtrMzVKcjlEIC9wMS8vOWs9ICIKICAgICAgIHk9IjAiCiAgICAgICB4PSIwIgogICAgICAgaWQ9ImltYWdlOSIKICAgICAgIGhlaWdodD0iMjYwIgogICAgICAgd2lkdGg9IjI2MCIgLz48L3BhdHRlcm4+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDkyNSI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkyNyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhOGE4YTg7c3RvcC1vcGFjaXR5OjEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNGQ0ZDQ7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjEzMTc5NjAzIgogICAgICAgaWQ9InN0b3A0OTI5IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5MzEiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTllOWU5O3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTI1IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ4ODAiCiAgICAgeDE9Ijc2LjMwNjY3OSIKICAgICB5MT0iMTUzLjEzMTEzIgogICAgIHgyPSI3Ni4zMDY2NzkiCiAgICAgeTI9Ijc0LjMyMDUwMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODU5OTk4NDUsMCwwLDAuODUzMjYzNTMsLTE2Mi4zMjQ2NywtMzYuNTA0OTEyKSIgLz48Y2xpcFBhdGgKICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0iY2xpcFBhdGg2NDAyIj48cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4wNTQ0NTU0NTtmaWxsOnVybCgjcGF0dGVybjY0MDYpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAtMTA2Ljk1MDYyLDcyLjY4NzUwMSBjIC0zLjA2MDE5LDAgLTQuODk5NzEsMi4wNTI3NzkgLTUuNSw0LjQzNzUgbCAtMTYsNjMuNTYyNDk5IGMgLTAuNDIyODUsMS42Nzk4NCAwLjUwNTY1LDguMjQ5MiAwLjYxMzc5LDguODMyMTQgMC4zODk1LDIuMDk5NjggMi44MzA5MiwzLjYwNTM2IDUuNTExMjEsMy42MDUzNiBsIDExMi43MTg3NTM4LDAgYyAyLjQ3NzgzMDEsMC4xMTYyNyA0LjgyMjQ4NTUsLTEuNDM5NjcgNS40MjI1NTYzLC0zLjE1NjI1IDAuMjUzODcyNiwtMC43MjYyMyAwLjU1MzYwNTcsLTQuMDUxNTggMC43MjcxNzU4LC04LjM0MTAyIDAuMDEyMjA5LC0wLjMwNDAyIDAuMDQzODM3LC0wLjYxNjY5IC0wLjAyNDc2NywtMC45NDAyMyBMIC0xOS40ODE4NSw3Ny4xMjUwMDEgYyAtMC42MDAyODMsLTIuMzg0NzIxIC0yLjQzOTgwOSwtNC40Mzc1IC01LjQ5OTk5OSwtNC40Mzc1IGwgLTgxLjk2ODc1MSwwIC0zZS01LDAgeiIKICAgICAgIGlkPSJwYXRoNjQwNCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2Njc3Njc2NjYyIgLz48L2NsaXBQYXRoPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NDYzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0NjkiCiAgICAgeDE9IjUxNS4xMjA0OCIKICAgICB5MT0iNDk0LjM0MDI3IgogICAgIHgyPSItNy4zODE2NjI0IgogICAgIHkyPSItMjguMTYxODc1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NTExIgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDY2MzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjUxMTI1ODYsMC4zODk1NzMzMiwtMC4yMjI4NjIwMiwwLjg2NDU0MTExLC0yMy40OTU3NDgsLTYuMjAxMDg5KSIKICAgICBjeD0iNTguMDMxMjUiCiAgICAgY3k9IjI3LjY5OTc2OCIKICAgICBmeD0iNTguMDMxMjUiCiAgICAgZnk9IjI3LjY5OTc2OCIKICAgICByPSI0MS4xODA1NDIiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3MzEiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50NjczNyIKICAgICBjeD0iNjMuNTUxMjI4IgogICAgIGN5PSIxMDIuNzIwOTMiCiAgICAgZng9IjYzLjU1MTIyOCIKICAgICBmeT0iMTAyLjcyMDkzIgogICAgIHI9IjU1LjI0MjcyMiIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDk3MzkyNCwwLDAsMC4wOTkxOTk5OSwtNjkuNzQwNjM2LDkyLjUzMTAxOSkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3NDUiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc1MSIKICAgICB4MT0iODEuMDkzMyIKICAgICB5MT0iODYuODE0OTgiCiAgICAgeDI9IjgxLjA5MzMiCiAgICAgeTI9Ijc1LjQ5OTU4OCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNjIuMTI2MzMsMCkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3NjIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc2OCIKICAgICB4MT0iOTIiCiAgICAgeTE9Ijc2IgogICAgIHgyPSItMi4yMDc5OTk3IgogICAgIHkyPSIyMi4wNzk2ODkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkwNjI1LDAsMCwwLjkwNjI1LC0xNjIuMTI2MzMsMC4zNjI1KSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njc2MiIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2ODA3IgogICAgIHgxPSI1NiIKICAgICB5MT0iMTQwLjI0OTc2IgogICAgIHgyPSI1NiIKICAgICB5Mj0iMTIiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkwNjI1LDAsMCwwLjkwNjI1LC0xNjIuMTI2MzMsMCkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY4MjkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjgzNSIKICAgICB4MT0iODIuNjk1MzEyIgogICAgIHkxPSIzNC44OTA2MjUiCiAgICAgeDI9IjkwLjIwMDE5NSIKICAgICB5Mj0iMzQuODkwNjI1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2Mi4xMjYzMywwKSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTE5IgogICAgIHgxPSI0NSIKICAgICB5MT0iNjQiCiAgICAgeDI9Ijg0IgogICAgIHkyPSI2NCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTYyNjY4MSwwLDAsMS4xOTQ2NDE2LC0xOTAuNDQ3MzcsLTI1LjkzNzcxNikiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkyMSIKICAgICB4MT0iNTYuMzM3OTE0IgogICAgIHkxPSIzOS4zMTQyODUiCiAgICAgeDI9Ijc2LjExMjE4MyIKICAgICB5Mj0iNTEuNjQ1NzY3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTMxIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIKICAgICB4MT0iNzYuMjcwNjA3IgogICAgIHkxPSI1OS4xNTQ4OTIiCiAgICAgeDI9IjYyLjA1NjM1MSIKICAgICB5Mj0iNTIuODg4MDUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkzMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjEzODMyMSwwLDAsMS4zNTY5MzQ2LC0xODYuNDA3NTYsLTMwLjA5MzMzMSkiCiAgICAgeDE9IjU2LjIxNzE3OCIKICAgICB5MT0iNjYuNTEwMDcxIgogICAgIHgyPSIzOC44MTI2MDMiCiAgICAgeTI9IjM5LjQ1MDE4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5MzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjIxMzgzMjEsMCwwLDEuMzU2OTM0NiwtMTg2LjQwNzU2LC0zMC4wOTMzMzEpIgogICAgIHgxPSIzOC41OTQ0NjciCiAgICAgeTE9IjM5LjMxNDI4NyIKICAgICB4Mj0iNzguMzExNzgzIgogICAgIHkyPSIzOS4zMTQyODciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkzNyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjEzODMyMSwwLDAsMS4zNTY5MzQ2LC0xODYuNDA3NTYsLTMwLjA5MzMzMSkiCiAgICAgeDE9IjM4LjU5NDQ2NyIKICAgICB5MT0iMzkuMzE0Mjg3IgogICAgIHgyPSI3OC4zMTE3ODMiCiAgICAgeTI9IjM5LjMxNDI4NyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzAwNyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDMwIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MTM5MjY3NiwwLDAsMC44MTM5MDM3MiwtMTYyLjg4Nzg4LDQuNTM1MDE2MykiCiAgICAgeDE9IjU0LjUzMDc2MiIKICAgICB5MT0iLTMyLjI2NjYwOSIKICAgICB4Mj0iNTQuNTMwNzYyIgogICAgIHkyPSIzOS44NjMxMjkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcwMDciCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA0MCIKICAgICB4MT0iMTAuMjUzMDUiCiAgICAgeTE9IjMuMzcyNDMwMyIKICAgICB4Mj0iOTYuMTY2NTE5IgogICAgIHkyPSI1MC43NDg1ODUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjczNzYyMTEyLDAsMCwwLjczNzYwMDI3LC0xNjMuMDM1NCwzLjk0NDkzNjEpIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MDc1IgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDcwODEiCiAgICAgY3g9IjY0LjUyMzQ5MSIKICAgICBjeT0iMzUuMjA2MTEyIgogICAgIGZ4PSI2NC41MjM0OTEiCiAgICAgZnk9IjM1LjIwNjExMiIKICAgICByPSIzMy40MzQ4MjMiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjc2NDcxOTQ3LDAsMTEuOTgxNzQ2KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTA5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIKICAgICB4MT0iNzYuMjcwNjA3IgogICAgIHkxPSI1OS4xNTQ4OTIiCiAgICAgeDI9IjYyLjA1NjM1MSIKICAgICB5Mj0iNTIuODg4MDUiIC8+PGNsaXBQYXRoCiAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImNsaXBQYXRoNDQ4NSI+PHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMDU0NDU1NDU7ZmlsbDp1cmwoI3BhdHRlcm40NDg5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMjIuNzc5NzI1LDI1LjM3NSBjIC0yLjYzMTc1OCwwIC00LjIyMjk0NywwLjg0Mjk5NiAtNC43Mjk5ODEsMi44ODAxMDcgTCA0LjI4OTc2ODYsODMuNTM4NjA1IGMgLTAuMzU3MTYyNCwxLjQzNDk3MiAwLjQzNDg1MzIsNy4wMzg3MzQgMC41Mjc4NTE3LDcuNTM2MTM2IDAuMzM0OTc0NywxLjc5MTU4NSAyLjQzNDU5NTEsMy4wNzYzMjQgNC43Mzk2Mzc3LDMuMDc2MzI0IGwgOTYuOTM3OTQyLDAgYyAyLjEzMDkzLDAuMDk5MjEgNC4xNDczMywtMS4yMjg0MTcgNC42NjMzOSwtMi42OTMxMTEgMC4yMTgzMywtMC42MTk2NyAwLjQ3NjEsLTMuNDU3MDcxIDAuNjI1MzcsLTcuMTE3MDg4IDAuMDEwNSwtMC4yNTk0MTIgMC4wMzc3LC0wLjUyNjIwNCAtMC4wMjEzLC0wLjgwMjI2MSBMIDk4LjAwMjczOSwyOC4yNTUxMDcgQyA5Ny40OTU3MDcsMjYuMjE3OTk2IDk1LjkwNDUwNywyNS4zNzUgOTMuMjcyNzQ5LDI1LjM3NSBsIC03MC40OTI5OTksMCAtMi41ZS01LDAgeiIKICAgICAgIGlkPSJwYXRoNDQ4NyIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2Njc3Njc2NjYyIgLz48L2NsaXBQYXRoPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ1NTEiCiAgICAgeDE9IjczLjUiCiAgICAgeTE9IjY3Ljc1IgogICAgIHgyPSI5OSIKICAgICB5Mj0iNjcuNzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDU4NSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICB4MT0iNzMuNSIKICAgICB5MT0iNjcuNzUiCiAgICAgeDI9Ijk5IgogICAgIHkyPSI2Ny43NSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NjA2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yOTQxMTc2LDAsMCwxLjI5NDExNzYsLTI1LjM2NzY0NywtMjEuMTc2NDcxKSIKICAgICB4MT0iNzYuOTYzNzIyIgogICAgIHkxPSI2Ny43NSIKICAgICB4Mj0iOTkiCiAgICAgeTI9IjY3Ljc1IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ2MTAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjI5NDExNzYsMCwwLDEuMjk0MTE3NiwtMjUuMzY3NjQ3LC0yMS4xNzY0NzEpIgogICAgIHgxPSI5NC45NDgxNjYiCiAgICAgeTE9IjYwLjU3NjA2OSIKICAgICB4Mj0iODYuNDA5MDEyIgogICAgIHkyPSI2NS41MDYxNDkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDYyMCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjk0MTE3NiwwLDAsMS4yOTQxMTc2LC0yNS4zNjc2NDcsLTIxLjE3NjQ3MSkiCiAgICAgeDE9IjczLjUiCiAgICAgeTE9IjY3Ljc1IgogICAgIHgyPSI5OSIKICAgICB5Mj0iNjcuNzUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NDIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc0OCIKICAgICB4MT0iMTA0LjUyNjUxIgogICAgIHkxPSIzNi44NDg4NTgiCiAgICAgeDI9IjEwNC41OTQxNiIKICAgICB5Mj0iNTMuMDYyNSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc5OSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzODA1IgogICAgIHgxPSI5Ny40MTQyMTQiCiAgICAgeTE9IjQ0IgogICAgIHgyPSIxMjAiCiAgICAgeTI9IjQ0IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjM4MDciPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjU2NTM2MTQ4IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyMzgwOSIgLz48L2ZpbHRlcj48Y2xpcFBhdGgKICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0iY2xpcFBhdGgzODEzIj48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiCiAgICAgICBpZD0icGF0aDM4MTUiCiAgICAgICBkPSJtIDg4LDMyIDcuOTAxMzU4LDAgQyAxMDAsMzIgMTIwLDUwLjE5NzA1MiAxMjAsNTUuOTYzNDk2IEwgMTIwLDcyIDg4LDcyIDg4LDMyIHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzgxNyk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PC9jbGlwUGF0aD48cmFkaWFsR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc3MyIKICAgICBpZD0icmFkaWFsR3JhZGllbnQzODE3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4yODk0MTkzLC0xLjMwNDU2OTRlLTgsMCwxLjkzMjg3OTgsLTk0LjM1NjU1NSwtMzcuMDczNTgxKSIKICAgICBjeD0iOTAuMTM0ODk1IgogICAgIGN5PSIzOS44NzUiCiAgICAgZng9Ijk1LjM3NjM5NiIKICAgICBmeT0iNDMuMzc3MzE2IgogICAgIHI9IjUwLjc1IiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzODIxIgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDM4MTkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2OC40OTIzMzUsMCwtMy4yOTUwNjAyZS03LDU3LjgyNTc3OCwtNjE4OC4wOTE2LC0yMjczLjE3NzkpIgogICAgIGN4PSI5MS44ODIwNTciCiAgICAgY3k9IjM5Ljg3NSIKICAgICBmeD0iOTcuMTIzNTU4IgogICAgIGZ5PSI0My4zNzczMTYiCiAgICAgcj0iNTAuNzUiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM4MjEiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50Mzg0NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDc0Nzg2MiwtMS4xODIyNjZlLTgsMCwxLjc1MTY3MjMsLTg1LjUxMDYyOCwtMzMuNTk3OTMzKSIKICAgICBjeD0iOTMuMTkyNDM2IgogICAgIGN5PSIzNi4yNTM0NiIKICAgICBmeD0iOTguNDMzOTM3IgogICAgIGZ5PSIzOS43NTU3NzUiCiAgICAgcj0iNTAuNzUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3ODMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzg1NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICB4MT0iMTA4IgogICAgIHkxPSI0NCIKICAgICB4Mj0iMTE0IgogICAgIHkyPSIzNiIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iLTEyNi4xOTk1MiIKICAgICB4Mj0iOTEuMjkyODMxIgogICAgIHkxPSItMTEwIgogICAgIHgxPSI5MS4yOTI4MzEiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAxMjQ1OTgsMCwwLDEuMDEyNDU5OSwtMi43NTc5MTYyLDApIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM2ODkiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA0MSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE0NC4wNTcwOCIKICAgICB4Mj0iNDcxLjgwNDM1IgogICAgIHkxPSIxNDEuNDc1MSIKICAgICB4MT0iNDcxLjgwMDM4IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC40MDgyMjIzLDAsMCwwLjM3MzkxNjEsLTMwMi44Nzc0OCwtMTc3LjY4OTQxKSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjgzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NjkuMTA1NjIiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC40NjU0MjcxLC0yLjU2MjUzNGUtMyw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzQ5IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMi40MTk3NjI2ZS0zLC0xLjY3MjM4NTIsMjAxLjMwODc3LDI2My40OTU5NSkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc0NyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTE9IjMxLjk5OTk5OCIKICAgICB4MT0iMTM4LjUwODI0IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC40NTA2OTMzLDAsMCwwLjY3OTk0ODMsNTAuNTc1MjYzLDIzLjI4MTQ5NykiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc0NCIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTMwIgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMTkiCiAgICAgeDI9IjExNiIKICAgICB5MT0iMjAuNTc0NTI0IgogICAgIHgxPSIxMTYiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjgzMzMzMzMsMCwwLDAuODAzMTM3NywxOS4yNSwzMC45NTI5MzQpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3NDEiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE0NC4wNTcwOCIKICAgICB4Mj0iNDcxLjgwNDM1IgogICAgIHkxPSIxNDEuNDc1MSIKICAgICB4MT0iNDcxLjgwMDM4IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4zMjg4NjExLDAsMCw3LjYyNzQ0NThlLTIsLTI2NS45NzE3NiwzNi4wNDE3NTYpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MzgiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjMxLjk5OTk5OCIKICAgICB4Mj0iMTQ5LjYwMjI2IgogICAgIHkxPSIzMS45OTk5OTgiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDkuMDEzODY1ZS0yLDAsMCwwLjgzMzMzMzYsMTAyLjUxNTA1LDEzLjgzMzMyNikiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjczNSIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0ODg0IgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODkyLC0zLjkxOTg1MTVlLTQsNi41MDA4ODA0ZS0zLC0wLjk3MDk3NzcsMTc0LjI4MTE4LDIwMi42NzA4KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzMxIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwyNykiCiAgICAgeTI9IjM2Ljk5OTk5OSIKICAgICB4Mj0iMTIxLjEwMjI2IgogICAgIHkxPSIzNi45OTk5OTkiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzE3IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwNzkiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjE4ODM4LDcuOTk1ODYyOWUtNSwyLjY3NzY4MzFlLTIsMC4xOTgwNjM3LDE3MS41MTA4NiwzMC45MzczMDIpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MTMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE5LjUxNzE4NyIKICAgICB4Mj0iMTE2IgogICAgIHkxPSIyMy4wNzk2ODciCiAgICAgeDE9IjExNiIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LDE5LjI1LC01OS4xMjY3NTMpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MDgiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjQ2LjU5NTI5OSIKICAgICB4Mj0iMTQ2LjkyODEiCiAgICAgeTE9IjMzLjQ0NzI3MyIKICAgICB4MT0iMTQ2LjkyODEiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjY5NTY1MjIsMCwwLDAuNjk1NjUyMiwxNC4zMDc2MDksMzYuMzI2MDg3KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzA1IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NzYiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIzMy43MTg3NSIKICAgICB4Mj0iMTQzLjQwNjI1IgogICAgIHkxPSI0Ni42ODg0NDIiCiAgICAgeDE9IjE0My40MDYyNSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNjk1NjUyMiwwLDAsMC42OTU2NTIyLDE0LjMwNzYwOSwzNi4zMjYwODcpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MDIiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk3NiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGZpbHRlcgogICAgIGhlaWdodD0iMS4wMDU4OTU2IgogICAgIHk9Ii0wLjAwMjk0Nzc3NzQiCiAgICAgd2lkdGg9IjEuNDg4NDM2OSIKICAgICB4PSItMC4yNDQyMTg0NiIKICAgICBpZD0iZmlsdGVyNDg2MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNDg2NCIKICAgICAgIHN0ZERldmlhdGlvbj0iMC4xMTYwMjYxNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48L2ZpbHRlcj48ZmlsdGVyCiAgICAgaGVpZ2h0PSIxLjAwNTk5NjkiCiAgICAgeT0iLTAuMDAyOTk4NDQ0MSIKICAgICB3aWR0aD0iMS4yMDM1MjAxIgogICAgIHg9Ii0wLjEwMTc2MDA3IgogICAgIGlkPSJmaWx0ZXI0ODM4IgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+PGZlR2F1c3NpYW5CbHVyCiAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0ODQwIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjExODAzMzYzIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjwvZmlsdGVyPjxjbGlwUGF0aAogICAgIGlkPSJjbGlwUGF0aDM3NjEiCiAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoCiAgICAgICBpZD0icGF0aDM3NjMiCiAgICAgICBkPSJNIDE3MC43NSwxMTIuMjEyNSBMIDE3MC43NSwyMDcuODY4NzUgTCAzMDQuNDA2MjUsMjA3Ljg2ODc1IEwgMzA0LjQwNjI1LDExMi4yMTI1IEwgMTcwLjc1LDExMi4yMTI1IHogTSAyNTMuOTY4NzUsMTI1LjI3NSBDIDI2My4wOTI0OSwxMjUuMTE3MzkgMjcyLjM5MTA2LDEyNi44MTczNCAyNzkuNTYyNSwxMzAuOSBDIDI4MS4yNTgyMSwxMzEuODY1MzYgMjgyLjgzMDI1LDEzMi45NTkyNyAyODQuMjgxMjUsMTM0LjI0Mzc1IEMgMjkxLjczNjk2LDE0MC44NDM3NCAyOTYuNTM2MywxNTAuMTEyNzIgMjkwLjA5Mzc1LDE1OC4wNTYyNSBDIDI4NS4xMzQ1MiwxNjQuMTcwOSAyNzUuNTQ0NDcsMTYwLjc3ODc4IDI3Ni4zNDM3NSwxNTUuNTg3NSBDIDI3Ni43Mjc4MSwxNTMuMDkzMDQgMjc4LjQwODYzLDE0OS4wNjE1MyAyNzUuNTkzNzUsMTQ3Ljc0Mzc1IEMgMjY4Ljk0MjA4LDE0NC42MzYwMyAyNjEuMjg1MDgsMTQ5Ljc3NDAzIDI1OC41LDE1NC4zMDYyNSBDIDI1Ny43ODI0LDE1NS40NzQ3OSAyNTYuNDM5NTEsMTU3Ljg5NTgzIDI1Ny43NSwxNTkuMTgxMjUgQyAyNTkuNzM2OTEsMTYxLjEzMDE0IDI2Mi4wOTczMSwxNTkuNTIzNjIgMjY0LDE2MS4zMzc1IEMgMjY4LjU1MjI1LDE2NS42NzcyOSAyNjMuMDQxNTksMTc3LjQyMjIxIDI1Ny4xNTYyNSwxODIuMDg3NSBDIDI0OC4zMTU0NywxODkuMDk1NTUgMjM2LjQ0MzU3LDE5My42NTk4NSAyMjQuMDkzNzUsMTkzLjkzMTI1IEMgMjExLjM2OTczLDE5NC4yMTA4OCAxOTguMTI0NywxOTAuMDMzMTcgMTg3LjE1NjI1LDE3OS4xNSBDIDE4Ni40Njc3NywxNzguNDY2ODggMTg1LjQyNTAxLDE3Ny4xNjQ4OSAxODQuNzgxMjUsMTc2LjExODc1IEMgMTc2LjA4OTYzLDE2MS45OTQ1NyAxNzkuNDE4OTgsMTQwLjA3NjM0IDE5Ny41MzEyNSwxNDIuMjQzNzUgQyAyMDMuMzU4OTIsMTQyLjk0MTEyIDIxMy4xNjA2OSwxNTAuNjc1MjIgMjA2LjkzNzUsMTYxLjQzMTI1IEMgMjA1LjE4ODE1LDE2NC40NTQ3OSAyMDYuODEyNDYsMTY2Ljg4MDgyIDIxMC43MTg3NSwxNjcuMzM3NSBDIDIxNC4wOTA5NywxNjcuODMwOTMgMjIwLjEwNTg1LDE2Ni4zMjQzMyAyMjQuNTYyNSwxNjMuMTE4NzUgQyAyMjYuOTc3NDEsMTYxLjM4MTc2IDIyOC44ODQxMywxNTkuMzQ3MDEgMjI5LjM0Mzc1LDE1Ny4wODc1IEMgMjI5Ljk2NTYzLDE1NC4wMzAyNSAyMjguMjM4NjIsMTUwLjg0MzY2IDIyNS41OTM3NSwxNTAuMDU2MjUgQyAyMjQuNjM0MTUsMTQ5Ljc3MDU3IDIyMy4xODg1LDE1MC41MDEgMjIzLjc1LDE1MS41MjUgQyAyMjQuMzE5NjUsMTUyLjU2Mzg1IDIyMi42NDY1NCwxNTMuNzYwNzQgMjIxLjEyNSwxNTMuMTE4NzUgQyAyMTMuNTI5ODIsMTQ5LjkxNDE1IDIxNi43OTE1OSwxNDAuMDE3NzIgMjI0LjM3NSwxMzMuOSBDIDIzMC43ODU1NiwxMjguNzI4NDQgMjQyLjIzODIzLDEyNS40Nzc2NCAyNTMuOTY4NzUsMTI1LjI3NSB6IE0gMTk1LjE4NzUsMTUzLjQzMTI1IEMgMTkzLjc3OTczLDE1My41MjQyMyAxOTIuMjI1MjgsMTU0LjE1NTA2IDE5MS4yNSwxNTUuMTE4NzUgQyAxODcuNjI3NTEsMTU4LjY5ODIxIDE4OC45NDI5NCwxNjUuNDM1ODYgMTkxLjg0Mzc1LDE2OS43NzUgQyAxOTcuNTM0MDksMTc4LjI4Njg2IDIxMy44OTA0MSwxODguMDA4NjYgMjM3LjI4MTI1LDE4MC4xMTg3NSBDIDI0NC4yMTc1MiwxNzcuNzc5MSAyNDkuMjM5MjIsMTcwLjgxODYxIDI0Ni42ODc1LDE2Ny4xMTg3NSBDIDI0NS43Nzc5OSwxNjUuODAwMDEgMjQ0LjE2OTE5LDE2Ni41ODc0OSAyNDEuNjI1LDE2Ni41ODc1IEMgMjM4Ljc0NDg0LDE2Ni41ODc1IDIzNy40MDcyMiwxNjUuNjU5OSAyMzYuMzc1LDE2Ny4wODc1IEMgMjI5Ljg3NTExLDE3Ni4wNzcwNyAyMTguNTA1MDYsMTc4LjcyNDg0IDIwNS42MjUsMTc0LjgzNzUgQyAxOTkuMDM1NDgsMTcyLjg0ODcgMTk1LjIxMDUxLDE2Ni44NzEzMyAxOTUuMjUsMTYxLjkzMTI1IEMgMTk1LjExODk5LDE1OS40NTc1MSAxOTUuODI5LDE1Ny44MzY0MyAxOTcuMDYyNSwxNTcuNjgxMjUgQyAxOTguMTkyMzIsMTU3LjUzOTExIDE5OC40OTg3MSwxNTUuODM2MDcgMTk4LjE4NzUsMTU0Ljg2ODc1IEMgMTk3LjgzNTE0LDE1My43NzM1IDE5Ni41OTUyNywxNTMuMzM4MjcgMTk1LjE4NzUsMTUzLjQzMTI1IHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjM2NjMzNjY2O2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4zMDAwMDAwMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiAvPjwvY2xpcFBhdGg+PGxpbmVhckdyYWRpZW50CiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgeTI9IjQuNzUiCiAgICAgeDI9IjcuOTM3NSIKICAgICB5MT0iMTgiCiAgICAgeDE9IjcuOTM3NSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTY0IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY0MTciCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzNzAiPjxzdG9wCiAgICAgICBpZD0ic3RvcDMzNzIiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGUyOTY1O3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3AzMzc2IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzA5MWU2YTtzdG9wLW9wYWNpdHk6MTsiIC8+PC9saW5lYXJHcmFkaWVudD48cmFkaWFsR3JhZGllbnQKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICByPSIxMzkuNTU4NTkiCiAgICAgY3k9IjExMi4zMDQ3IgogICAgIGN4PSIxMDIiCiAgICAgaWQ9IlhNTElEXzhfIj48c3RvcAogICAgICAgaWQ9InN0b3A0MSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZmVmZWY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ3IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Y5ZjlmOTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMTg4NTEwNDkiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojRkFGQUZBIgogICAgICAgb2Zmc2V0PSIwLjI1NzE4MTQ3IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDUxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIKICAgICAgIG9mZnNldD0iMC4zMDExMTI3NyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MyIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNGQUZBRkEiCiAgICAgICBvZmZzZXQ9IjAuNTMxMyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNFQkVDRUMiCiAgICAgICBvZmZzZXQ9IjAuODQ0OSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1NyIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNFMUUyRTMiCiAgICAgICBvZmZzZXQ9IjEiIC8+PC9yYWRpYWxHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NDE3Ij48c3RvcAogICAgICAgaWQ9InN0b3A2NDE5IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzU1ZGRmZjtzdG9wLW9wYWNpdHk6MSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M3ZWNmNDtzdG9wLW9wYWNpdHk6MSIKICAgICAgIG9mZnNldD0iMC44MzQ5MjI2MSIKICAgICAgIGlkPSJzdG9wNjQyNSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A2NDIxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Q4ZWRmMjtzdG9wLW9wYWNpdHk6MSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MDAiPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MDIiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UzZTNlMztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNTA1ODc4NjkiCiAgICAgICBpZD0ic3RvcDM4MDQiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzgwNiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhMGEwYTA7c3RvcC1vcGFjaXR5OjE7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3NjEiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3AzNzYzIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0ODg0Ij48c3RvcAogICAgICAgaWQ9InN0b3A0ODg2IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzdjN2M3YztzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MzQzNDM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjAzMTI1IgogICAgICAgaWQ9InN0b3A0ODg4IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC4yNSIKICAgICAgIGlkPSJzdG9wNDg5MCIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0ODkyIgogICAgICAgb2Zmc2V0PSIwLjM3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC41IgogICAgICAgaWQ9InN0b3A0ODk0IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ4OTYiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDg5OCIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkZmRmZGY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTA5MDkwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC44NzUiCiAgICAgICBpZD0ic3RvcDQ5MDAiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkwMiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0ZjRmNGY7c3RvcC1vcGFjaXR5OjE7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDkzMCI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3YzdjN2M7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A0OTMyIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5MzQiCiAgICAgICBvZmZzZXQ9IjAuMDMxMjUiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNDM0MzQzO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0OTM2IgogICAgICAgb2Zmc2V0PSIwLjMwMTU1OTg0IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjQzMzkyNTU0IgogICAgICAgaWQ9InN0b3A0OTM4IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5NDAiCiAgICAgICBvZmZzZXQ9IjAuNTM2ODI4NDYiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgaWQ9InN0b3A0OTQyIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGZkZmRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIGlkPSJzdG9wNDk0NCIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0OTQ2IgogICAgICAgb2Zmc2V0PSIwLjg3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5MDkwOTA7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNGY0ZjRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNDk0OCIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj48c3RvcAogICAgICAgaWQ9InN0b3A0OTU0IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDk1NiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDk3NiI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDk3OCIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5ODAiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUwNDEiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj48c3RvcAogICAgICAgaWQ9InN0b3A1MDQzIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RiZGJkYjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTA0NSIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkYmRiZGI7c3RvcC1vcGFjaXR5OjA7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTA1OSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3YzdjN2M7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MDYxIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDUwNjMiCiAgICAgICBvZmZzZXQ9IjAuMDg0Nzg5MDgiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNDM0MzQzO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDY1IgogICAgICAgb2Zmc2V0PSIwLjI1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjM3NSIKICAgICAgIGlkPSJzdG9wNTA2NyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDY5IgogICAgICAgb2Zmc2V0PSIwLjUiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgaWQ9InN0b3A1MDcxIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGZkZmRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIGlkPSJzdG9wNTA3MyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDc1IgogICAgICAgb2Zmc2V0PSIwLjg3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5MDkwOTA7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNGY0ZjRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNTA3NyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUwNzkiPjxzdG9wCiAgICAgICBpZD0ic3RvcDUwODEiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzYwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmNGY0ZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMTg0NTE0NjQiCiAgICAgICBpZD0ic3RvcDUwODciIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTA4OSIKICAgICAgIG9mZnNldD0iMC41MDIxMTg2NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhZDI2MjY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTQzZTNlO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NTEwNTkyOSIKICAgICAgIGlkPSJzdG9wNTA5MSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDgzIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzVlMDAwMDtzdG9wLW9wYWNpdHk6MTsiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MDkzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUwOTUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MDk3IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDA2MSI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDA2NCIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NWRkZmY7c3RvcC1vcGFjaXR5OjEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjN2VjZjQ7c3RvcC1vcGFjaXR5OjEiCiAgICAgICBvZmZzZXQ9IjAuNTQzNzAwNTgiCiAgICAgICBpZD0ic3RvcDQwNjYiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDA2OCIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkOGVkZjI7c3RvcC1vcGFjaXR5OjEiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NzEzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2FmYmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDQ3MTUiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDM1NCIKICAgICAgIG9mZnNldD0iMC4xMjgzNTY1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzIwNTBhYztzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDcxNyIKICAgICAgIG9mZnNldD0iMC40ODEzNTU0OSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MDg1ZDE7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjA0Nzk1O3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC45MTQyNjUxIgogICAgICAgaWQ9InN0b3A0MzU2IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwOTU5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNDcxOSIgLz48L2xpbmVhckdyYWRpZW50PjxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgIGlkPSJwZXJzcGVjdGl2ZTIwMiIKICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNjQgOiA0Mi42NjY2NjcgOiAxIgogICAgIGlua3NjYXBlOnZwX3o9IjEyOCA6IDY0IDogMSIKICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDY0IDogMSIKICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDU5IgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDUwOTkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjA4MzQ5ODQsLTEuMTI2NDAwM2UtNiwxLjM1NTI1MDZlLTYsMi41MDY4MDE4LC0xMjUuMTQ0MDgsLTE1LjE2MjcxMykiCiAgICAgY3g9IjExNS41IgogICAgIGN5PSIxMC4wNzI1MTYiCiAgICAgZng9IjExNS41IgogICAgIGZ5PSIxMC4wNzI1MTYiCiAgICAgcj0iMC41IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTMwIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMDEiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjQ1MDY5MzMsMCwwLDAuNjc5OTQ4MywtNDUuMTk2NjE1LDAuMjIxODgyODIpIgogICAgIHgxPSIxMzguNTA4MjQiCiAgICAgeTE9IjMxLjk5OTk5OCIKICAgICB4Mj0iMTQ5LjYwMjI2IgogICAgIHkyPSIzMS45OTk5OTgiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEwMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LC03Ni41MjE4NzUsNy44OTMzMTk4KSIKICAgICB4MT0iMTE2IgogICAgIHkxPSIyMC41NzQ1MjQiCiAgICAgeDI9IjExNiIKICAgICB5Mj0iMTkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEwNSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzI4ODYxMDksMCwwLDAuMDc2Mjc0NDYsLTE3MC4zNTI0NCwxMi45NDc2NTkpIgogICAgIHgxPSI0NzEuODAwMzgiCiAgICAgeTE9IjE0MS40NzUxIgogICAgIHgyPSI0NzEuODA0MzUiCiAgICAgeTI9IjE0NC4wNTcwOCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDg4NCIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTA3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4xMjI1MzI2NywwLDAsMC44NzU4MTQwOCwyLjA1OTQ1MzYsLTEwLjcxMzEwNSkiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICB5MT0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTI9IjMxLjk5OTk5OCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTA5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODkyLC00LjYyODg4NTVlLTQsMC4wMDY1MDA4OCwtMS4xNDY2MTA5LDc4LjUwOTMwNSwyMDMuNjA5MDcpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExMSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQ2NTQyNzEsLTAuMDAyNTYyNTMsNy4xMzE1Mjc3ZS00LC0xLjY3MjM5NDQsMzU3LjM0OTk0LDI2NC4zNTUwNikiCiAgICAgeDE9IjQ2OS4xMDU2MiIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NjAuMDYzNjMiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTEzIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIyNjIzMywtNi43NTEzNTMxZS00LDAuMDAyNDE5NzYsLTEuNjcyMzg1MiwyMDEuMzA4NzcsMjYzLjQ5NTk1KSIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzU5IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMTUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjQwODIyMjQ5LDAsMCwwLjQ0MTU1MDksLTIwNy4wNTUyMiwtMTc0LjI2NzY1KSIKICAgICB4MT0iNDcxLjMwMzQ3IgogICAgIHkxPSIxNDEuMjUyMDMiCiAgICAgeDI9IjQ3MS4zMDQxNyIKICAgICB5Mj0iMTQxLjcwMDk5IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0NzEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMTciCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtOTUuNzcxODc1LDMuOTQwMzg1OCkiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICB5MT0iMzciCiAgICAgeDI9IjEyMS4xMDIyNiIKICAgICB5Mj0iMzciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExOSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjEyMTg4MzgsNy45OTU4NjI5ZS01LDAuMDI2Nzc2ODMsMC4xOTgwNjM3LDc1LjczODk4NSw3Ljg3NzY4NzgpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEyMSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQ2NTQyNzEsLTAuMDAyNTYyNTMsNy4xMzE1Mjc3ZS00LC0xLjY3MjM5NDQsMzU3LjM0OTk0LDI2NC4zNTUwNikiCiAgICAgeDE9IjQ2OS4xMDU2MiIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NjAuMDYzNjMiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTIzIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIyNjIzMywtNi43NTEzNTMxZS00LDAuMDAyNDE5NzYsLTEuNjcyMzg1MiwyMDEuMzA4NzcsMjYzLjQ5NTk1KSIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTUyIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMjUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjgzMzMzMzMsMCwwLDAuODAzMTM3NywtNzYuNTIxODc1LC0zNi4wNjcxMzkpIgogICAgIHgxPSIxMTYiCiAgICAgeTE9IjIzLjA3OTY4NyIKICAgICB4Mj0iMTE2IgogICAgIHkyPSIxOS41MTcxODciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ3MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEyNyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTA3NTA0NCwwLDAsMC4zMDIwODMzOSwtODUuMTM0NzI5LC0xMTkuMDIwODMpIgogICAgIHgxPSIxMTAuMDA4MjQiCiAgICAgeTE9IjM3IgogICAgIHgyPSIxMjEuMTAyMjYiCiAgICAgeTI9IjM3IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTUzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxNTkiCiAgICAgeDE9IjEwMi41IgogICAgIHkxPSI1MS41IgogICAgIHgyPSIxMDciCiAgICAgeTI9IjQ5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUxNjciCiAgICAgeD0iLTAuMDExOTMyMzkyIgogICAgIHdpZHRoPSIxLjAyMzg2NDgiCiAgICAgeT0iLTAuNDc4NjAwNDMiCiAgICAgaGVpZ2h0PSIxLjk1NzIwMDkiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjU1ODA4NTUiCiAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI1MTY5IiAvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTgzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxODkiCiAgICAgeDE9IjEwMS41IgogICAgIHkxPSI5OC43ODEyNSIKICAgICB4Mj0iMTAxLjUiCiAgICAgeTI9IjEwOC4zMzQ1NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48ZmlsdGVyCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJmaWx0ZXI1MjAzIgogICAgIHg9Ii0wLjA0NzcyOTU2NyIKICAgICB3aWR0aD0iMS4wOTU0NTkxIgogICAgIHk9Ii0xLjkxNDQwMTciCiAgICAgaGVpZ2h0PSI0LjgyODgwMzUiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIyLjIzMjM0MiIKICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjUyMDUiIC8+PC9maWx0ZXI+PGZpbHRlcgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0iZmlsdGVyNTI0MiIKICAgICB4PSItMC4wNzEzOTM3NzkiCiAgICAgd2lkdGg9IjEuMTQyNzg3NiIKICAgICB5PSItNS4xOTYzNDM4IgogICAgIGhlaWdodD0iMTEuMzkyNjg4Ij48ZmVHYXVzc2lhbkJsdXIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHN0ZERldmlhdGlvbj0iMi45ODk0OTI3IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTI0NCIgLz48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTI2NyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MjczIgogICAgIHgxPSItODgiCiAgICAgeTE9IjIwOCIKICAgICB4Mj0iNDgiCiAgICAgeTI9IjU2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUyODMiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjk4MzAwOTcxIgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTI4NSIgLz48L2ZpbHRlcj48ZmlsdGVyCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJmaWx0ZXI1Mjk5IgogICAgIHg9Ii0wLjAzMzcyNTA4OSIKICAgICB3aWR0aD0iMS4wNjc0NTAyIgogICAgIHk9Ii0wLjY0MDc3NjciCiAgICAgaGVpZ2h0PSIyLjI4MTU1MzQiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjEzMzQ5NTE1IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTMwMSIgLz48L2ZpbHRlcj48cmFkaWFsR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTMwMyIKICAgICBpZD0icmFkaWFsR3JhZGllbnQ1MzA5IgogICAgIGN4PSIyMS41NTU2MDkiCiAgICAgY3k9IjExOC43NzU2IgogICAgIGZ4PSIyMS41NTU2MDkiCiAgICAgZnk9IjExOC43NzU2IgogICAgIHI9IjUuMDcwMzg4NCIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjMyNjQ3MywwLjA0OTMwNTk0LC0wLjAxMDEyNDEzLDAuMjUzMTAyOTksLTMuODY3OTYzMiw4Ni44NzQ3MjEpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUzMTEiCiAgICAgeD0iLTAuMDYwODczNzg2IgogICAgIHdpZHRoPSIxLjEyMTc0NzYiCiAgICAgeT0iLTAuNjA4NzM3ODYiCiAgICAgaGVpZ2h0PSIyLjIxNzQ3NTciPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjI1MzY0MDc4IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTMxMyIgLz48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTM0MCIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzQ2IgogICAgIHgxPSI5Ny44NzUiCiAgICAgeTE9IjM4LjA2MjUiCiAgICAgeDI9IjEwMy4zMTI1IgogICAgIHkyPSIzMi42MjUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwNTkiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50NTM2NiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDgzNDk4NCwtMS4xMjY0MDAzZS02LDEuMzU1MjUwNmUtNiwyLjUwNjgwMTgsLTEyNS4xNDQwOCwtMTUuMTYyNzEzKSIKICAgICBjeD0iMTE1LjUiCiAgICAgY3k9IjEwLjA3MjUxNiIKICAgICBmeD0iMTE1LjUiCiAgICAgZnk9IjEwLjA3MjUxNiIKICAgICByPSIwLjUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5MzAiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM2OCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNDUwNjkzMywwLDAsMC42Nzk5NDgzLC00NS4xOTY2MTUsMC4yMjE4ODI4MikiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICB5MT0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTI9IjMxLjk5OTk5OCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzcwIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MzMzMzMzLDAsMCwwLjgwMzEzNzcsLTc2LjUyMTg3NSw3Ljg5MzMxOTgpIgogICAgIHgxPSIxMTYiCiAgICAgeTE9IjIwLjU3NDUyNCIKICAgICB4Mj0iMTE2IgogICAgIHkyPSIxOSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzcyIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4zMjg4NjEwOSwwLDAsMC4wNzYyNzQ0NiwtMTcwLjM1MjQ0LDEyLjk0NzY1OSkiCiAgICAgeDE9IjQ3MS44MDAzOCIKICAgICB5MT0iMTQxLjQ3NTEiCiAgICAgeDI9IjQ3MS44MDQzNSIKICAgICB5Mj0iMTQ0LjA1NzA4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0ODg0IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNzQiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjEyMjUzMjY3LDAsMCwwLjg3NTgxNDA4LDIuMDU5NDUzNiwtMTAuNzEzMTA1KSIKICAgICB4MT0iMTM4LjUwODI0IgogICAgIHkxPSIzMS45OTk5OTgiCiAgICAgeDI9IjE0OS42MDIyNiIKICAgICB5Mj0iMzEuOTk5OTk4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNzYiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjE4OTIsLTQuNjI4ODg1NWUtNCwwLjAwNjUwMDg4LC0xLjE0NjYxMDksNzguNTA5MzA1LDIwMy42MDkwNykiCiAgICAgeDE9IjQ0Ni4yNTcxNCIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzc4IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDY1NDI3MSwtMC4wMDI1NjI1Myw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICB4MT0iNDY5LjEwNTYyIgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzODAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMC4wMDI0MTk3NiwtMS42NzIzODUyLDIwMS4zMDg3NywyNjMuNDk1OTUpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM4MiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNDA4MjIyNDksMCwwLDAuNDQxNTUwOSwtMjA3LjA1NTIyLC0xNzQuMjY3NjUpIgogICAgIHgxPSI0NzEuMzAzNDciCiAgICAgeTE9IjE0MS4yNTIwMyIKICAgICB4Mj0iNDcxLjMwNDE3IgogICAgIHkyPSIxNDEuNzAwOTkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ3MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM4NCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC05NS43NzE4NzUsMy45NDAzODU4KSIKICAgICB4MT0iMTEwLjAwODI0IgogICAgIHkxPSIzNyIKICAgICB4Mj0iMTIxLjEwMjI2IgogICAgIHkyPSIzNyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzg2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODgzOCw3Ljk5NTg2MjllLTUsMC4wMjY3NzY4MywwLjE5ODA2MzcsNzUuNzM4OTg1LDcuODc3Njg3OCkiCiAgICAgeDE9IjQ0Ni4yNTcxNCIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzg4IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDY1NDI3MSwtMC4wMDI1NjI1Myw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICB4MT0iNDY5LjEwNTYyIgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzOTAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMC4wMDI0MTk3NiwtMS42NzIzODUyLDIwMS4zMDg3NywyNjMuNDk1OTUpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM5MiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LC03Ni41MjE4NzUsLTM2LjA2NzEzOSkiCiAgICAgeDE9IjExNiIKICAgICB5MT0iMjMuMDc5Njg3IgogICAgIHgyPSIxMTYiCiAgICAgeTI9IjE5LjUxNzE4NyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDcxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzk0IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC45MDc1MDQ0LDAsMCwwLjMwMjA4MzM5LC04NS4xMzQ3MjksLTExOS4wMjA4MykiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICB5MT0iMzciCiAgICAgeDI9IjEyMS4xMDIyNiIKICAgICB5Mj0iMzciIC8+PC9kZWZzPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODYzIgogICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEwOTgiCiAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgIGd1aWRldG9sZXJhbmNlPSIxMC4wIgogICBncmlkdG9sZXJhbmNlPSIxMC4wIgogICBvYmplY3R0b2xlcmFuY2U9IjEwLjAiCiAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgaWQ9ImJhc2UiCiAgIHdpZHRoPSIxMjhweCIKICAgaGVpZ2h0PSIxMjhweCIKICAgaW5rc2NhcGU6em9vbT0iMi44Mjg0MjciCiAgIGlua3NjYXBlOmN4PSIxNTIuNjY0MTQiCiAgIGlua3NjYXBlOmN5PSIxMjAuNTg0NTQiCiAgIGlua3NjYXBlOndpbmRvdy14PSI1MjAiCiAgIGlua3NjYXBlOndpbmRvdy15PSIyNjAiCiAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9IkxpdmVsbG9fMSIKICAgc2hvd2dyaWQ9InRydWUiCiAgIHNob3dndWlkZXM9InRydWUiCiAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgIGlua3NjYXBlOnNuYXAtbm9kZXM9InRydWUiCiAgIGlua3NjYXBlOnNuYXAtZ2xvYmFsPSJ0cnVlIj48aW5rc2NhcGU6Z3JpZAogICAgIHR5cGU9Inh5Z3JpZCIKICAgICBpZD0iZ3JpZDQwNzYiCiAgICAgc3BhY2luZ3g9IjFweCIKICAgICBzcGFjaW5neT0iMXB4IgogICAgIGVtcHNwYWNpbmc9IjIiCiAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICBlbmFibGVkPSJ0cnVlIiAvPjwvc29kaXBvZGk6bmFtZWR2aWV3PgoKPGcKICAgaWQ9Imc1MjE5IgogICB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjE2NzIwMTU4LDAsODEuNzAyMTIpIgogICBzdHlsZT0iZmlsdGVyOnVybCgjZmlsdGVyNTI0MikiPjxwYXRoCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTUyOTAzNCwwLDAsMC40OTMzNjkxMywwLjcwMDM5NTU1LDQzLjk5MjA3NikiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1MTY3KSIKICAgICBkPSJtIDcuNzgxODU0MiwxMDYuODg3MDMgMTEyLjI0OTUxNTgsMCAwLDIuNzk0NDIgYyAtMzUuMDE1MDE4LC0wLjAxNDMgLTcyLjQ2Mjc5MiwwLjAxNDQgLTExMi4yNDk1MTU4LDAgbCAwLC0yLjc5NDQyIHoiCiAgICAgaWQ9InBhdGg1MTYxIgogICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+PC9nPjxwYXRoCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODk1MjkwMzQsMCwwLDAuMTE1MDkyODMsMC43MDAzOTU1NSw4NS44MzgzNTcpIgogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjUyMDMpIgogICBkPSJtIDcuNzgxODU0MiwxMDYuODg3MDMgMTEyLjI0OTUxNTgsMCAwLDIuNzk0NDIgYyAtMzUuMDE1MDE4LC0wLjAxNDMgLTcyLjQ2Mjc5MiwwLjAxNDQgLTExMi4yNDk1MTU4LDAgbCAwLC0yLjc5NDQyIHoiCiAgIGlkPSJyZWN0Mzg1OSIKICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz48cGF0aAogICBzdHlsZT0iZmlsbDojMDAwMDAwIgogICBkPSIiCiAgIGlkPSJwYXRoMjE5NyIgLz48ZwogICBzdHlsZT0iZGlzcGxheTpub25lIgogICBpZD0iRnJhbWVfY29weSIKICAgZGlzcGxheT0ibm9uZSIKICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzY1LjQ1NzI2LC0zMTQuMTE2NCkiPjxnCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGRpc3BsYXk9ImlubGluZSIKICAgICBpZD0iZzM5NzgiPjxpbWFnZQogICAgICAgc3R5bGU9Im9wYWNpdHk6MC43NSIKICAgICAgIHdpZHRoPSI1NzEiCiAgICAgICBoZWlnaHQ9IjU3MSIKICAgICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBanNBQUFJN0NBWUFBQUFLMWxwYkFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFBIEJHZEJUVUVBQU5iWTFFOVlNZ0FBQUJsMFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1NXMWhaMlZTWldGa2VYSEpaVHdBQUZTNFNVUkIgVkhqYTdKMEpkeHJia21hREZCcHNYOWZyLy84cnE5Njl0cXdKdWwydGZBNkNpRGh4a2dRUzJIc3RsZ2JiRXNJU3VmWEZjRllDQUpmSyA2b0Mvc3lxOHIvZnRVN0U5OE8zb2ZkbjdxMzhPQUJmNlpBa0F5LzQ1N1JXWDF1dlY5NTNqT1dUYmVMMzZ2dXoxWGtGQ2dnQ1FIUUNZIDRXZXlKVFM5MHFKZnJnNzRPNmQ4SHNsRVpodThyL2Z2VlArc0lqb0lFQUN5QThEUFgvSDlWV25KeEdRMTA5dXJRSGlPK1h3U3BTNWIgNXlZenZqMUZrQkFnQUdRSGdKKzNvdGhVWmFZbEpYUGZoa1Nxam8wbklKdEFlbzUxaStTb0lrRUlFQUN5QTNCemN0TXJOQlVScWJ3OSBUUGczM3ArdE9pVHUwRFFuUzNRMndldXR0emVOZjU5OTNEbEVxUFYxQWdDeUEzQVZjcE5KVFVVOHZKZlIrNksvMC9xNFF5SkwwZGM0IGQ1cmp5YzdHZWJscGlJejl1NjIzV3g5MzA1Q3ZRNUlnNUFjQTJRRzRLTG1wSkRVdGdmSGVudk8yYW53ZWU1OUVUbFBPeXNwWG5xeHMgR25LVDNUNktmNVo5emtyQ1ZPa0pxaVpCQUlEc0FCejFaMmFLM05na0paT1l1K1R0MXV1dDkwMFZJWnM0bmVLNXhFdEpOaE9GeGhNWSA3K1ZINGU5VVAwOHJEZHBLZndrTStRRkFkZ0NPbnQ1a1UwODlZaE5KeVYzeGJmdSs2TyszUktpYUhMVktXWWMrdjFUNmRhcUNzdzJTIG1VaHVQaHpScWR3aVFjcWt5S1pQMVg0Z1VoOEFaQWZncE9sTnF4eVZwVFdSdUt3NzMyN2RodVIxZlorcUpiTHFLUG94VTUxdFI1cXogZFlTaktqVHZoZGV6OTMwMFVxSldDcFQxQUdXcEQrSURnT3dBbEFXbmxkNTR2UzZ0cENhU203WHoranI1TzVINHJKUFBXUzFwcllxcCB6cm5MV050Q2FsSXBYVVhpVW5sWmVWOVZocW9DVkNsN0lUNEF5QTVBU1hDeTlDWktiVnBDWTJVbXU5MEhFdVI5ekVxNkU4bE9aV3FyIGQvejhGT2xPYXlJcksyZjFKRHZ2amRkN2Jwa1FlZkx6SVgzOVA0Z1BBTElEZk05M0MwNmxnZmpPU1Z5cUVuUGZlT25kZWlVbmFuUnUgU1UwbU9lY2VQVzlKVHlaQlVmOU9yL0JrdHpmbjliZmd6eXZ5azVYQUVCOEFaQWVndE84bUd3Ry9TOUliTFNDUnhGUmZ6NFNuVmNZYSBnaVRISzFsRmtyTnF5STBuTzZkTWRpTFp5WGJkdEpLZmx2aThTMTdlaWlUSGUvbm12QjNKVUZRaWE4a1A0Z09BN0FBcFRsZDZZeVVpIEswUGROMjRQaWVCNEFsUk5kSHBIeXl1YmthTUVaNmxuWTFVa2FDUDFhYTZldE9lamtPcjAzbG9DOUM3dDhoZmlBNERzQUlKVGtodXYgVCthK0lUY1BTbXdlQXRtcEpEbHJKOG5KZW5HbTl0eGtZaU55bWFlZTl3cFFKRDgyOWJHSmlrMTlvcVRIUzNkZUcyOTc3N01mYjN3NyBLbjhkSWo1SUR5QTdBQXYrWG83S1ZQYUM3NVdtb3VRbUVwd0hJemdQenZ1cW90TktjVm9KVHZYOHEwcGEweU0zNTVDZGl2ejBwa0F0IDhha2tQOVh5bGljMHI4bjdYcE8vK3laeCthdFhmRWg3QU5rQnVPQVVwelUxVlJHYiswQm1vcHY5KzFYQjBaS1RDVTZXMkF6SjR6RkYgYWxZTGUrNm9pRSt2QkUwVm9Pb0lleVk4bWVSa3R6ZnoraFR4cVk2MEl6MkE3QUFzSU1WcFNVNDBDbTdsNXFHUjJsUnU5dDk3cFNwdiBmRHhyTXU0dFIvV0lUWS9RTE9WNVl6dEJoQ3JpSTFKcmVQWUV5QnRyajBwZEZmSFJRdk9pM3ZmaXZPKzFRM3plbmZzWmJYUzJqdzNpIEE4Z093SmxUSEcrQ3lrdHd0SGhrVXZQWWVEdVRISnZtVkp1TWV4cUtSZHI5TmEyVXB2VmNjQ25QRTl2T1A2c21RSkVFVlJxZXMzSlggcGN5VnljNUw4SHBMZk40T1RIeElld0RaQVRoVGltUDdjTElTMWIwak40L095OGZnejNvRTUxN2EvVGZlY1EydDlPYVF4T2FRbi8rbCBQV2RzWi93M1dTbXNwL3pWVS9KcVRYTkZKUzFQZGw2SzR2TTZrL2hVVWpRQVpBZmdRTW1KVXB4V2llckJDRTEyNjVHY2RTUEZhYVUzIDFlVjkxWW1vRmM4RGt5N0VVeHVoZStVbjIrblRrcDRYNStWTFFYeGVBdkhKK254SWV3RFpBVGl4NU5peGFxL1J1RmR3bm9MWE04bUogU2xSVEJHZjhlcVJUY0tvL3cveWN6eU5EVlFtcVRueGw4dU1sUGw0L3oydUg5RlNUbjBoODlIMnNqTEVqUFlEc0FEUWtSMS9jdllWLyBVUitPSnpnUGdkdzhtZGVqVk1jclUxWDI0RlFPMGF6dXNtbjl2UEt6ZkI0SmFnbFFLL21wcEQ1ZTJ1T0pUNWIyL0hLRTUxY2lQOTVZIGUxVG04c1FINlFGa0I2QWdPYmEwVStuRDhYcHdiR3JUSXpwWmloTTFHVThWSEpIYW9qNStacGN2UVpYcHI2cjhaRDArV1Y5UGx2VDggQ2w1NjZVODAyVlhaMzJPRkQra0JaQWVRSENNNVUxS2NMTDNKM281S1Z0RWtWVVZ3S2xOVEpEYTNLVUJWK2NuRXA5cmI0NG1QbGh4OSBlekd2VyttSnlseFIyalBlZDZRSGtCMUFjZ3FTazZVNFh2OU42NVpKanQ2TEUwbE9OYjJwSkRqOFBDSS9MZm5KU2wyWitHUlRYQytCIDhQd0tKR2lPdEFmcEFXUUhrQndqT2ZZVThhalJXTXZMRnlVMFh3TEo4Y3BWM3VLL1ZvclRrOTRnTjlBU29LeloyWk9mU0h5cVRjMWUgV2V2WlNNNnprL3BrNHRPYTVFSjZBTmtCSktjenhYbHl4T1pMUVhRZWpPUzBTbFhaQkZWMkN2aUtuemVZUVg2ODNwZE5VWHk4L2g2diB4R1ZMVzgrQjhEd0g0bVBMWE43aHBFZ1BJRHVBNURpU0U2VTRudUI4Q1VSSEp6OWVQNDVYcWhxU0ZLZXkrNGFmTDVoYmZsb1RYcTF4IDlrcmFrNVcxbm9PWGxUS1hONzZPOUFDeUEwaE9JamhXYnF6d1JDVXJ1d0RRUzNHOGM2aThBelVSSExoRThmSEtYSm4wdkNUQzgxd1EgSHkvdFFYb0EyUUVrSjVDY0w0VmJTM0x1RzVKVFRYRzhueGwraG1DSjRoT1Z1a2JSc0NXdUh1bnh4T2RaNHNabXBBZVFIVUJ5bE9SayBDYzdYSk5XSnlsVzZ1VG5hYXR6YWc0UGd3TFdJajM3NTBVaDdxdEtUM2FaS3owWllUZ2pJRGl4VWNyVHNERE5KemxjbE9WK0ROT2V4IElEbGV3N0VuT1FnT1hLdjRaQk5kRmVsNUZYOXl5d3JPejBCODlML05wQ2M2amtJa1Bud1VBTm1CbzM3ZmVKS2pEK2FjSWpsZmplaDQgaVU0cnlja2FqcU96cUJBY3VHYng4Y2JadmFXRlZueXlzWFV2NWZtcFh2NlV1TXdWTlRObkN3b3BiUUd5QTJkSmMxYlNQdExodmtOeSBXcUtUOWVSay9UaVZVaFUvRTNCTDRoT1Z1VnBUWEZuU1k2WG5wNUVmS3o1MmlxdlMwNFAwQUxJRFo1V2NyRnhsOStOOEtVak9WL0g3IGNuU1NvNWNBZWxOVnBEZ0FOZkZwbGJpODBYV3ZweWNTbmt4NnRQaU1IemVTSHUvc0xZUUhrQjJZN1hza080WGNTczZZdUdTVFZaSGcgZkpXOEwwZFBWOW1tNDJ5cUNzRUIyQmVEcU14bG01bXQrT2dsaGVQTjYrZjVtZHhhemN6UlVSVFJLZXRJRHlBN01GdWFNNHBFZERobiBhM3o4YTNMelJzbXpucHlvSDZkM3N6RUFhVTkrTnBkTmUwWUJlUXVTSHR2UDQ4bk9ENVA0MkMzTnI0bjBVTm9DWkFlT0lqbGVYMDdXIGVEeEtpMDV3dm5WS3pxUHM3OG1KenFteXkvOUljUUFPVDNzaThkSDdlcUtlSGp1cXJzWG1oM25wcFQyNlJQYVdTQStsTFVCMllOTDMgUTFTeThpUkhsNnNla3hUbm0zbXBTMWs5a3BQdHh5SEZBWmcvN2VscFp0Wkp6NHVSSHR2UDh5TVJINis4TlVxVVBuc3JhMkltNVFFdSBCbEJLY3dZbnpSbmx3NXV1c3BMekxSRWRtK1pVSmFmU2o4UDNOY0R4MDU1b1NhRW5QYmFKZVJRYUxUcFIydlBMSkQzUnVIcFcya0o0IGJwdzFEd0dpNDBoT1ZMTFNZK1E2eVhsS1Voejl1azF6ZENLRTVBQXM4N2xoNi95Y2JkVkwvVnp4WVo0djNpU2V5bnlXL1VOOWY4aisgWU1MUHozLy8vUG14UnVtNWs3eWZSNXo3ai9RZ08wQ2FVK3JMOFViSXZ4cTUrZWFrT2Jaa3BSY0NJamtBbHlzOVcrZTU0MFBpWFZ1ZSArRHpKZmtsYjMzNG84Zm4xK2ZGK3laL1MxdkFwUEN2WjdTbXlLYzhLNFVGMmdEUkhUemQ1emNmNnlXZVVsMitCNkZqSnNXbk9GTW1oIDZSamc4cVhudmlFOW52am9oT2VuK2ppL1BqKzJKejJrUElEc2tPYVVTbFpSWDg3WFFITCtrcmczNTlGSmM2WklEb0lEc0R6cFdUa0ogaWljOXJjM3FGZW5SNVMyOWptTDgrR00venlEN1UxdWtQTWdPM0hpYW94dVF2YjZjckZ6MWwvaTlPVkhKS2p2V0Fja0J1THhmbnJicSBaemFUbm1paTAwdDducHpVNXpINHhlbFpmVXpiejBQS0E4Z09hVTQ2U3Y2VVNNNWY0cGV0V2lVcmIrc3hrZ053WFdtUEp6MzZ1ZWREIDRsMWRXWG5yMFhsdThYNlIraVg3ZTdoSWVaQWRJTTNaU1hPczVIeFZjdk9YSXp0WkEzSmxJU0NTQTNEOTBqTSs5MnlTcEtjbFBwN3MgMk9lYVp5VThwRHlBN055ZzZHUTdjN3lTbFUxeS9uSVNIUy9OaVVwV1NBN0FiVXFQeU83SWVyVEhLeXB0ZWRMem1DUTgrcm5uaFpRSCBrSjNybGh5UitHUnltK2JvZlRtUjVGalJpUnFRbzc0Y3UvWFl1NzhBY0YzUFI5NzBWaVErZDVJM01sZWtaL3o3YS9NOFJNcUQ3TUFOIHBUbmV6aHliNXZ3VjNGcHBUclZrSmFRNUFEZWQ4b3dNemk5a3RwY3drcDdXN1o2VUI1Q2Q2M3d5RVlsUEo5ZFBHbDREOHJkTzBiR24ga21kbldGR3lBb0JxRTdQZTkxV1ozbm9RdjV5bGIxN0tNKzdrZVN1a1BBZ1BzZ01MVEhOV0hXbE9KRG5mSlM1YmVXbk8rSG5veXdHQSAzcVRISzJ1dEpralBnOFE5UERibCtmM3h4a1dFV25oV1Jub29heUU3c0VEUmlVYktLMm5POTBCMGRObktubVcxVnBKekovVGxBRUQ5ICtTdnE1OW1ZbHoxN2VsclNvMlhIbHJiR2M3YTAzRkRXUW5iZ3pKSWpFazgyZUVjOTZONmNVV2ErTzZLanR5Ri9iYVE1VVFPeWtPWUEgd0lTVVJ6NmZSMXFUVzVIMFZIcDdXc3ROM3ovdkIyVXRaQWNXbE9ib3VOYzd1Tk5MYzdUY2ZKZjkvcHhSZEZxOU9aU3NBR0J1NmJINyBlWHFscDlxOGJGZGozQVVwajFmV1FuaVFIVGloNkVRajVWRnZqaWM2VWRuSzdzMnA3TXhCY2dCZ3pxVEhQdDlGU2JiOVJTOFNuM3Z4ICszaWlYK0RlVGJLek1mY1o2VUYyNElpaW8zL1l2VFRuVWZ6ZW5PK081R2pSMFUzSVh1VHI5ZWFJMEpjREFQTSszMldsclkyMHo5MWEgTjFLZXFJY24yZ3YyWWRJZFVoNWtCNDRrT1dKK0NQVVB0bTdLaS9ibVpLSmptNUM5TkNjYUp5Zk5BWUJUcFR4YjlmcmczTHo5UExhZiA1NzRoUFZHSi9zTkplQkFlWkFkbVRuTmFaU3ZkaEd6SHlTUFJ5WnFRMThsdk9xUTVBTENFbEtlMWhYbWR5TTU5UTNac3lmN05TQS9DIGcrekFrVVFuMnAxVFRYTnNmMDQyVWs2YUF3Q1huUEpFbTVpajNUdnJKT0VabndmZmtwUkgxUHNBMllGTzBmRU84QnhGWjV5VzBxZVQgUjVMelhmYVhCRVpOeVBUbUFNQVNueHNQVFhuV1NuRHV6ZXRXZEtLUzFwdjYvUFR4SUR0d2dPU0k3RzhSamNwV1VacnpYMUl2VzQwZiBtMGtyQUxpRTU4bWVsQ2VUSGs5MktpVXQyOGZEUGg1a0J5YWtPVkYvanQyZDQwMWEvWmQ2cVJjRlJydHpzcEZ5MGh3QVdPcHpaay9LIFk2WEhreDlQZHJLbVpkdkh3ejRlWkFjbWlJN1huNlBMVm5wdmpoWWRtK2kwZHVkazB3ZWtPUUN3OU9mT0xPWEpraDZiNEZSbEp5dHIgQ2NLRDdFQmJkS0w5T2Q3dW5MOGN5ZkZFeHp2QU14b3BIMGh6QU9BQ24wZWpsTWY3UlZKTGo1V2Z1MFNHaG9iMDBMaU03RUNINk9oRyBaSHUybFMxYldja1pTMWM2MGRGbEsxMmpIc1NmdGhKRUJ3QXU5UGswMnI0Y3BUeGVlY3ZyMjdrTHBNZjdIQ0kwTGlNNzBCU2RWbitPIGwrYm9STWNiSzg4Mklkc2ZVaVFIQUM3NXVkVkxlYWFLajVVZ2IwckwrNFdSeG1Wa2h4OUc5VkpQWEdYN2M3S3lWU1E2M3BKQW1wQUIgNEZhZVkzdWxKNU9jZFVOMnN1ZFVHcGVSblpzWEhmMURGdTNQaWNwVy81TDlIVHJSV0xrVkhkSWNBTGlGNTF2dkpIWDk1ejJUVzczbCBMSHVRS01LRDdOek1ENTdlb1dNYmtXMS96aWc2M3p0RlIyOUQ5bzU4UUhRQTROWit3ZHpLL2c2emJPVkhyL1MwOXBNaFBNak96Znl3IFJhUGwzcUpBcnovblg3SmZ1c29ha1hWL3p1RDhnQ002QUhCTHo4TmVXY3Q3Ymg1ZnYydEl6eUJ4S2N1NzJVa3RoQWZadVNuUjhScVIgbzdMVitMbzNjZVgxNTBUVFZrZ09BTnk2OEZTbXRqTHBHU1FmU1k5U25vMTZpZkFnTzFjdE9ycDBGZTNQc1pLalMxZjY2QWY2Y3dBQSBwZ25QSUgxOVBJUEV1M3BhNmM3NDhXMGZEOEtEN0Z5TjZFUTdkUFRFbFQ3YlNndk8rTG9WblZZak1rc0NBUURpNStkcUg4L0tQS2ZlIEZXU24xYitEOENBN1Z5MDYzZzRkZlZyNWZ4bko4VXBYV25TODA4cnB6d0VBcUQxWFYvcDRyT3pZZG9US1ptWHZ1ZmdENFVGMnJsMTAgbmdMUitaY2pPOTRPbmV4OEs4cFdBQURUaENmcjQxazVNak1VYmw1aTVJSHdJRHNYSnpyWnNzQm90UHhmNGljNjNtaTVGUjM2Y3dBQSA1aEdld1pHTjZnYm15bFJXQnNLRDdGeVU2R1RMQWtmUnlVcFhOdEd4b21NbnJ1alBBUUE0L0RrODZ1TnBUVzZ0R3RMVDg1eU04Q0E3IEZ5VTY5dFJ5S3pyZkplN1JxWW9PL1RrQUFQTStuMGQ5UENMdGRHY2wwMU1kaEFmWnVWalJ5WGJvZkRlQ1k1dVJJOUc1UTNRQUFNNGkgUEt2Q3JiVkZHZUZCZHE1R2RQUldaTzh3VDY4Wk9kdUtQSDY4Nk1SeUpBY0E0SGpDRXozUFZtUW5lcDZ1UEdjalBNak9va1hIanBhUCBvdk5mZ2VoOEQwUW4yNkdENkFBQW5FNTRkT055cTVlbmRlM29BZUZCZGhZdk90OEMwZkVtcnJ5dHlHT2l3Mmc1QU1ENWhFZU05TmkvIDAycGlQdlI1R3VGQmRzNG1PanF5OUpxUjlXR2UzclNWSFMwZmQrallaWUdJRGdEQStaLzN2VWt0NzNuNFdNL0xDQSt5Y3hiUjBSczAgYlRPeUp6ci9SL3pSY204cnNuZHFPYUlEQUhEZWE0QnRYTDZUL1Q2Y1ZmRmpJVHpJemtXSWp0MmpZdy8wdEtLalpTYzcvaUViTFVkMCBBQUNXSlR6REVhUUc0VUYyenZwTkhoMEI0WTJYVzlINVArcDlWblFlUDIrNkVabGxnUUFBbHljOHAzaU9SbmlRbmFOSmppMWZlVWRBIFpLSmp4OHRaRmdnQWNKM0Njd29RSG1UbjdLTFRtcnI2Sm45MjZMQXNFQUFBNGJGc0MrOUhlSkNkV2I2UjlldTZJVGs2NnlxYXZQcVggRVIwdjBXRlpJQURBN1FwUGo2eThJenpJenB5aUUvWG85SWlPYmthT1JJZlJjZ0FBaEtjaVJGc2xQUHJ6SWp6SXppeWk0NDJZYTlINSBMdnZuWEgyWDNXYmtKMFFIQUFEaDZaQ2E2SDIybklYd0lEc0hpWTRlTWMrT2dmQU85R3p0MFVGMEFBQVFub3I0dEhwNEVCNWtwMXQwIDdIWmtMVHBlNmNwclNLNU9YU0U2QUFBSWo1VVg3MlYwRTBkNEFObHBpbzR0WGRrVHpQK1MrQVR6c2FUMURkRUJBRUI0T29XblIzS3kgMGhiU2crdzBSU2NyWFkyaUV6VWoyNmtyZmFnblc1RUJBQkFlU2FURWs1eU5lZW5KanYyNytuNGdPeENLVG1WcFlLdDBOZmJvZUp1UiBFUjBBQUlRbkVwOU1kaUw1MFRDU2p1enNTVTdQMGtDdlQyZDhlMHgwdmdyTnlBQUFYR1A2aFNlU0hYdkxraDVHMHBHZG5XOUMvYnBYIHZ2SkVwN1V3TUJPZEFkRUJBRUI0R25JVENVNGtQZEcwRmhOYU55NDdsYVdCZHNROFNuUnNRN0xlcGFOTFY0Z09BQURDNHdtUHlIN2YgVHEvNFJMMDhOeitodGI3aGJ6cVJ1SHhsUjh3ajBkR3lZMFZuVEhUV1F1a0tBQURxSmExREVoNHY2Ym41Q2ExYlQzYWlFWE5idnZvdSArMGRCZUltT1hScW9TMWNEb2dNQWdQQklMZUdKbXBOLzN6N01yU0k3TnoyaHRiN1JielNiNk9qRmdZK1NOeVRybTdkTFIvZm8zQm5KIEFRQUFpSVJuSzM5NlJrWDZrNTJzcERWeWt4TmE2eHY4QnRPdlIzMDZudWhremNnc0RRUUFnRU9GNTA2OXZ2MjhybFNUblVyS2M3TVQgV3VzYis4YlNrcVBMVjE3cHl2YnA2RFRITGcxRWRBQUFZQTdoR1pTTWlQamxMQzAxV29CYWZUd2pOOWV3dkw2aGJ5Z1J2eUg1WG5iTCBWN29oT1pLZDZMd3J0aU1EQU1BaHdqUEt6cDBqTzl0QWNxS2JMV2xwd2RtbyszRDEwbk5yeVU1MjVwVTl4ZHhPWDQwTEExc0hlN0lkIEdRQUE1aENlU0haMHV0TVNuYWlrcFV0WVYxL09XdC9JTjVHVkhYdVNlV3REc2k1ZDJha3J2VXVIUkFjQUFPWVFIdjNMK2RSa3g1T2UgbTJ4WVh0L0FOMCtQNkhoOU9yWkg1MnNpT2l3TkJBQ0FPWVNuc24vSFMzZmVQMjllRDgvTkhpbXh2dkp2R2lzNlkrbHFyVVNuMWFmRCBkbVFBQURqWGRVdzNMTjlMTzkxNWw3NlVSK1FHR3Badklkbnhqb040VUxJVDllbFVSWWZTRlFBQXpIbmQ4aWEwdklabFBZWFZrcDFOIElqdjY1VldtTytzci9tYXhzdE56a25sRmRMenlGYUlEQUFESEVoNVBkcllTOSs2OHkyNVp5NXZRMGg5cmRhM0NzNzdTYnhKUGRIU3EgTTRxT1BmZnF1N1NQZ2REblhiRWRHUUFBVGlFOGVpUzlsZTU4T0pMVEdrdS82djZkOVJWK2MyalJXY24rNGtBOVp2NlhFaHN0T21NeiBNa3NEQVFCZ0tjTGpUV2hGNmM2NzFOTWR2WFBuS3Z0M3JqWFo2ZDJuWXhNZHZSM1pubUxPNUJVQUFKeERlTElEUTIyemNpUTdudlJFIGg0ZGVUYnF6dnJKdkNDczdla3V5UHZkcVRIWCtTa1RuYXlJNkpEb0FBSEJxNFJGMWZkdCtYcGZzZEZiV3QrT1Z0anpadWJyK25mVVYgZlNONG9yTXVpTTczaHVqUWtBd0FBRXU2MW9uRURjdTZmK2U5Y0l1a1IvZnZYRHpYbHV4azAxZTZJZGxPWDMyWCtDaUlyQ0VaMFFFQSBnRk5kNDZvTnkxNy96dHZuTFJPZHF5MW5yYS9rRzBBUzBSbjdkTEpVcDNMbWxWZStBZ0FBT0pmd1JBM0wwV1RXZXlBK1dlUHlWWlN6IDFsZndIKytKVHRTbjg2MGdPalFrQXdEQUpRaFAxTENza3hvck9HOUdkdDRjNGRGVFhsZFJ6cnFXWk1mS3pyM3NwenFlNkVSblhvMy8gbm9aa0FBQllxdkNJK0EzTEQ3TGJ0L1BoaU02cnRFdGJWMVBPV2wvNGY3Wkl2anp3VVhZUCtiU3k4MDNhUjBIUWtBd0FBRXUrRG9ycyBOeXg3bytqdlNuUmVaVC9sOFVUbktzcFo2d3YvRDY0Y0IySExWL3JsWDBwMGRLcGorM1FFMFFFQWdJVmRCN09HWlU5MnNuVEg5dkRZIHB1V0xMbWRkZXJKVGFVcitKdnROeWJwMDlTVVJIZHVuQXdBQXNGVGhzZGRETFR4ZXN2TnEzcmF5Y3pYbHJQV0YvdWVLeEUzSmR2cksgcGpyMktBZ1dCd0lBd0RVSVQ3Unc4Rkg4ZE9mVkVSK2I4RnhGT1d0OWdmK3BudWlNaVU2VzZtamhHVVhuaXhLZFVYYVl2QUlBZ0VzViBIakhDRTZVN1ZkbTVpbkxXcFNZN3ZlVXJLenJSUGgxRUJ3QUFMbGw2dE94bzRmRjZkMTRENGJtNmN0YjZBdjhUSytXcmI3TGZxOVBxIDB4bUVQaDBBQUxoYzBmRWFsa2ZoZWZpVWxpZnhlM2RzRDg5VmxiUFdGL1NmNklsT3BYeGxSVWZ2MDlGajVuZENxZ01BQUpjdlBQcDYgcWFlelJ1RnA5ZTVFQ2MvRmxyTXVMZG1wbHEraXB1VHNnRStiNWlBNkFBQndxZElqc2p1T1hwbk9lZ2xrNTEwdXZKeTF2cUQvdE94SSBpS2g4MVROOVJma0tBQUN1UVhSYTQraVBTbUplRzdkczRlREZsTFBXRi9DZmxvbk92ZnhaQ09nZDlPbjE2VEJtRGdBQXR5QTgrdnFwIHkxbjNTbmhzT2N1bU85R0c1VUV1cUp4MUtjbU9scDFCZHN0WCtraUl2OFJQZGI0Nm9rUDVDZ0FBcmwxNlJOcmxyS3gzSityZjJacWIgbFN4a3AvTS9TU1ErRXNJNzBidzMxYUY4QlFBQTF5ZzZQZVVzcjNmblJmYjM3K2gweCt2ZldTU1hVTWJTaVk0OTVQTkppWTVOZHV6MCBGZVVyQUFDNFJlSFIxOU5XT2N1VEhTL2hzYktqcDdRV0p6M3JCZjhIU1NBNnJWUkhOeVJUdmdJQUFLVG4vK09Wcyt5eVFTMDNMK3JtIGxiTjB3ck9TQlRjcnJ4ZjhueEtObWx2UmlXU0hRejRCQUFEUnljdFpldG1nN2QzUm91TWRLV0hMV1l0dFZsNXlzaFB0MU5HajVsK2wgUFdadWx3ZFN2Z0lBZ0ZzVUhuMTl6WllOZXNtT3Q0UEhHMGRmWkxQeWVvSC9JZUxZcDkycEUvWHFhTkhSWjE5UnZnSUFBS1RuL3pPbyBsN3FjOWY1NTdYd0xaR2U4WmVuT0lwdVZsMXJHc3IwNjNwRVFYd1BSYVIzeVNma0tBQUJ1VVhSc09XdE1kL1E2bDNkSGRuNTkzcktFIFp4U2VRUmJZckx4ZTJIK0VscDN4UDZJMWdmWE5FUjF2K3VwT0tGOEJBQURDWTRPRk1WVDQrTHgyWnFXc1NqbHJjYzNLU3l4alJlV3IgU3FwalJlZGUvQU0rRVIwQUFMaGw2Ukg1c3dYNVR2Nk1vdXRtNWRmUGE2dE9kM1RLRTZVN2kydFdYaS9zZ2UvZHEvTk40ajZkZTlrOSB6Wnp5RlFBQUlEcTdNcUtGeHc0QzZYVEhpazYyY0hCeHpjcnJoVHp3V25Sc3JQYWdIdml2Z2V6MGJrbEdlQUFBNE5hRlI4dzFkNXpPIDBzM0tXblk4NlhrTlpHY2pDMHAzbHBUc2VLUG1hOW1kd1ByaXlJNFZIVytuRHVVckFBQ0FPR3dZbktEaDBRalA3OXV6SXp0ZU9XdE0gakJhUjdxd1g4a0JidTR6S1YxK1Y0R2pSMFR0MW9rUUh5UUVBQU5pVkR6c1VaSStTMEpOWnZ3WG5MOWt2WittRXg5dTlJMElaS3ozViAzRFltMjBUSEd6UFh2VHBNWHdFQUFMU0ZaMHhpdk9rc2ZRMytwVjVXbXBWMUtldHM2Yzc2ekEreWZsMkx6bHI4Q2F5djBpNWZhZEVaIEVCMEFBSURTOWJqVnJQemlpSTVPZUd6dnp0aS84eUdVc1pyVFYxOGN5ZmtxL1UzSkFBQUFzSDhkOXBxVk4rcDYvQzUvMmtsMGsvS3ogL09uaDhmcDN4ckxZMlU5Rlg1L3h3ZFd5czVMZHBtUnZXM0tXNnRqeUZVM0pBQUFBMDY3TDNwbVU5cHI4TEgzbExKRWJMMk5GcVk0KyAyYnpTcStQMTZTQTVBQUFBN2V0eHRGbFpCeEJ2bjlmZUxOMFpoVWVYczhieTJOblNuZldaSGxSdGozWUM2MTZKVGxUQzhzcFgrdndyIFVoMEFBSUREcnM5ZXVqUEtqazUzdkhMV21PNjh5d0xTbmZVQ0gxQ3ZWK2Vya1IxdnB3Nmo1Z0FBQU5Pdnkzb1VQV3BXMXNMenl3aVAgVjg3Ni9XL1BudTRNWjVhYzFxajVWMGQwOUU0ZGIza2dvK1lBQUFDSFhhT2pFdzMwTmZxTENTUzhZNXU4QmI4bnZ6WXZvWXpWU25XaSA4cFgzUURKcURnQUFNTTkxV3FjN252RDh2aTZQZTNlZTFkdS9YMTlVdWpPYzRjSHpVcDExWUl6ZUJGWW1Pa2dPQUFEQTRkZHFlNzF1IFhhdDFLTkdxd0p6OFduM3VNbFpydE0xNzhPd0VGdVVyQUFDQSthL1hxK0wxMnJ0bTYrdTFIU0k2dWZRTUozelFyQ1cydGlYYkJZTFIgcG1RV0NBSUFBTXgvemJiWDdhaFpPUW9uRnBQdW5MT01GZFVBSTBQTUxKRlJjd0FBZ1BtdjI2c0oxMjNkZHJLSWRHYzQwWU5sSHpqZCAzYTNQM3ZoaXpGQy96cWc1QUFEQTZRT0tiTkhna3lNOFgyUmhrMW1uTEdONVVWaXIyU2w3c0RnV0FnQUE0SFRDWTlNZEw2ekllbTNQIGx1NE1KM3FnUlBKR3A4d01IeVh1MVNIVkFRQUFPRTFnMFpQdVJPdGl2TERpYXNwWW5oWGFjN0Iwc2xOdGNHSUNDd0FBNFBpaFJTWGQgaVVJTGZSMzNKcW5sMk5meFU1YXhzbTV1VDNTaU9mM29RUUlBQUlEVEJSZmVaRlowTGJlbHJKTk9VdzlIZm1DeUIraEJkbXQ5MllNVCBwVHBIdDBFQUFBQkVaK2Q2SGsxbTJVTzhLeWNmbk9SNmZvcWVuY2dFN3lVdVlla0h4azVncllSZUhRQUFnSE5JVDdYLzFtdEowZW5PIFNmdHZoeU0rSUpFRmV1ZGdWVklkcjN0YkJPRUJBQUE0aGVpMHJ1dFpPYXQ2cnVWRnlZNTlZS0xUemFOVTU2d0dDQUFBQU9uMVBldmQgZVpScHJTbEhHemdhanZRZ2lDTTZVK3h2M2JBL2hBY0FBT0Qwb3FPRnh4czZlanBRZUJZdk85YjZWcks3UkxEVnF4T05xSkhxQUFBQSBuRmQwdkRERERoOTV3dk1rZmFXc1dhL3p4eTVqWlNXc0h1dTdFeWF3QUFBQWxpSTkyZkNScmQ0OE9jSVRYZU9QRW1nTVIzZ0FKSGdRIDdCTEJMd1hyMHcvQ2dPUUFBQUNjWFhRa3VkYTMrbklmcFQ2R3Zsalo4WXpQSHZwcDQ2MG5xY1ZiVnFZQUFBRGdmTktUbGJLOFVmVHMgV3U4SnoyelgrbUhtTDF3a1B2UXo2OVhSSlN6ZHE4TUVGZ0FBd1BKRXg1T2U2SVFFVDNwc0ZlZW92Ym5ITEdQWlhwMnNVOXN1RWRRbiBvM0lHRmdBQXdIS2x4MTd6ZGJxakF3NmQ3TFFhbFdlOTVoK3pqTld5dk9nTHQxLzAwWmNOQVFBQXdHVFJhUzBaaks3N2V2SjY3Vnp6IEYxZkdxcFN3SXNQejZuY25tNzBIQUFDQWc2Ny8xVWJsVEhpTzJxZzhuT0FMOXZwMXJPaEVSME13Ymc0QUFMQmMwYWtLejVNalBDY3IgWlEwemZyRWl0VlNuOHNYcWNYTlNIUUFBZ09XTGo3NytleWVpUjJISDBhczZjNWF4cWlVczc0czkrVFpGQUFBQU9Ma0Q5S3ljbWMwQiBqbFhHMGsxS1VjMHU2c2Era3lNMUtBRUFBTURzb21NOVlNN0FZNVowWjVqcGk0eEV4MFpZaitxTE8rc0pxQUFBQURDNzlMUW1zL1FKIEN0b045RFQyblN5d2pPWE4yZXVOeVpIUjZiMDZkb2tnNCtZQUFBQ1hKenFWZE9jeGNZRk1lQ1o3d2R3OU85NVpXQzNaT1dwMEJRQUEgQUNjVkg2OVJ1UkorWkgwN1ordlo2ZG10OHloeHFwT2RpM0h3RndnQUFBQW5FNTNldlR1UGtsZDZGdE96NDFsY0ZsdDVqY20yWHdmSiBBUUFBdUN6UnNYNlJwVHRlQ0tLZHdKNmljSkFiREROOFVUMEdsOVhuYUV3R0FBQzRmT25KRmd6Ym9hWEh3QXZXTXVOeXdXSEdMNmpTIGpPUjFYbWNia3dFQUFPQnlSQ2Z5Zyt4UThLT1hzdVlxWSttUjgwcFV4Y1prQUFDQTZ4YWZhUGRlbE81RTI1UVBUbmlHaVYrQVoyNTIgQ2l0clFvcStHTy96QUFBQXdHV0pqb2hmK2NtRXA5WGlNdGtOaHBtK2tHeDVrRmZHeW5wMWtCd0FBSURMRjUyb3AvZGU5bGZUVkU1ViBPR3ZQVHJSSTBCT2VCL1Yzc29nS0FBQUFMbDk4Qm1tdnBzbWFsR2NwWlEwVDduaG1iT3VHclhtZDF1eldBUUFBdUQ3UjhWd2g2dTA5IGFpbnIwSjRkejlhaU1oYUhmZ0lBQU55RzZOaTM5VlNXRGtZaTRabTFsSFZJejA2MEVqcWJvZGNsck9ob0NJUUhBQURnZXNUSEsyV04gQWNtajhZYWpsTEtHempzc3NoOU5lYkdVZDhjcmgzd0JBQURBOVloTzYvaUlrNVN5RHVuWjBhYm1iVWQ4TUs5bmpjbmRkeHdBQUFBVyBMVHJXTjRaTzRabXRsRFcxWjhkYkZCVGQ4Y2pRS0dFQkFBRGNodmhFTzNkT1VzbzZwR2NuTytUTDN1NkZFaFlBQU1DdGlrNDBsVlVwIFpVWEp6dXc5TzYzekxucFNIVXBZQUFBQXR5RTYxamt5ZDRqODRlQ3pzZzVwVVBaU0hTL1o4WHAxdkkzSkNBOEFBTUQxaWs5V3l2TDYgZmFOZTMrNkVaempDbmZWa0owcDFFQndBQUlEYkVKM1dnc0ZxMzg1UmVuYXlFbFowMW9XWDZzeDZxQmNBQUFCY2hPall0N05KN3NvSSBlbmRnTXFWbnh6WW1aNmxPZENjUkhnQUFnTnNUbjBIT01PRFUyN09UTlNmZlMxK3FnK0FBQUFEY2p1aDR3VW5tRWVOdExmNlptaUxGIDBHUkt6ODVjL1RyTk93Y0FBQUJYSVRwV2VySUtVWFRNVk5UN2UzQ0RjbXZrUEl1ZnNtVkFpQTRBQU1CdGlrOG1QRldmbUwyTTVRbFAgYStUOFh2TGpJVmFCOFFFQUFNRDFpbzVJZk9UVTJqaUU5WWs3eVNlN1Y0ZklqZ1FXMW1wT3pzNjBRSEFBQUFCdVUzU2lZNmNxZlR1VCBqbzNvbFIxN2F1bmEyQmNqNXdBQUFGQnhDdTl3VU9zVmxVclJRVDA3WHFkenRGK25JanFNbkFNQUFDQTZWbmlzNkhoZW9aM0M2d09lIExEc2k4U0xCcUlSbGJZd1NGZ0FBQUhpaTAycFU5cEtkU1VkUFRlM1o2ZG12TXdpVFdBQUFBTER2RmxHamNsVEtPa3FEc3Bmc2pNSnogN3dpUE53OS9oK2dBQUFCQTRoZFJzbE5aWjlPc0dnM0puZkRNUzkrWnRYTkhLcWVjQzlJREFBQncwNklqMGo1Y1BDcGxlUzB5TWtWMiBSUGFqb1ZYeHpsUWFrd0VBQUFEUnFTd1l0SDdSU25kV1BiSWpnWG5aemNuZUhkSWxyRkx6RUFBQUFOeWsvR1I5TzYxa3A5UzNVKzNaIHljcFlXblNxMWdVQUFBQ0lUclZ2SjlxM003bEIyZHV2VXhrTlcwdTlub2IwQUFBQTNMYm9XTWRvdGNyWVFLWGN0ek4wM29ub2prU2kgUTc4T0FBQUFaSTdSS3p6ZG5sRnBVQjdFYjA3MmhLZDFGaGJDQXdBQUFOWTNvc1hGRmVIeFBHTlZsUjByUE40Qm9GNnF3eUpCQUFBQSBxSXBPNjZRR0wxanhYS043R3N2K0l5OWFpajU1NjRnSXBBY0FBQUJXZ2ZCRXcxQlpiM0JheWhxQ1QyeWxKL3JrYTRrbnNKakNBZ0FBIGdLcncyQkYwYnlES0JpdWxKdVhXTkpiWG5PeWxPNU82b3dFQUFPQ21KVWY3eGlweERTOWs4VTQvZDkyalZjYXFOQ2RIeDY2WDU5OEIgQUFEZ3BzV25OZjA5SldCWnRXUkhwRFoyN3BXeHVvOWVCd0FBQUtSSDZxMHpYUUhMMERBc3J6djZybE4wQUFBQUFDTEJFYW0xem1TOSB3bW1UOHVCOFFuc25Ldld6TzRuUHFrQjRBQUFBb0NVNnZYMDc1Y1dDd3dHR2xVMWlNVzRPQUFBQXZmSlRGWjRvWkJGUGVySXkxdEQ0IGhOa0lHTk5ZQUFBQU1GVjBvbVhHV2Q5TzJLUmNtY1k2Sk5taE9Sa0FBQUJhb2hQNVIrWWRXbmk4bnAxMEdpczY3YnoxaVdoT0JnQUEgZ0VPa3B5ZG95WHFGM1RMV0toR2Q2aWRrY3pJQUFBRDBDbzVJdlVtNVVzcmFvelY2M2hLZE8rbGMyUXdBQUFDUXlFOTJDSGxMZEZ3UCBpVWJQbzFUSCs0VDA2Z0FBQU1EY29tUDdkdTdNNjYwbTVmKzhISkpQTk40eXlibXJmaUwrRHdFQUFHQ2k5TndaLy9BOHBObXpVeldyIGlsRlJ5Z0lBQUlCZXdjbEU1ODRSbnRhUkVmLzV1TmxTd1lyb2xKdURBQUFBQUJxaUkrSUhMaTNwU1JjTERoT3NxbUpUSkRzQUFBQncgaVBoazZVN1hNVlUyaWZGNmRxSjBwN0kxR2VFQkFBQ0FYdUdKSnJKYXdVczZqZVd0Vng0NlA4bEsySzhEQUFBQTg0aE9SWG9HOFpjYSBoMldzeUtpR3hpZUpHcE9aeEFJQUFJQkRwR2ZvY0pGU2czS2xoRldOalJBY0FBQUE2QlVjNlhTUlRIaEt5YzdRWVZTVXNBQUFBR0J1ICthbWtPNjBHNWRWUXNLcEI4a1FuTzFvZEFBQUFvQ0kybm9jTUVxYzdtWXMwajR2SVRHb29tQlRTQXdBQUFIT0lqeWM2MVhUblB6NHkgQkIrNEZSME4wbzZPRUI0QUFBQ1lLanlWZ2FsU3BTazdHeXY3b05tWUY1SURBQUFBY3duUGtOeWkvbUVSMDZBYzFja3ltL0lzQ2dBQSBBR0F1eVJHcGh6RHBkUGpRWVZHVlppQjI3QUFBQU1DYzBxTWJsZThrRDJCY0p4bWNEeWlCUlhrdjA5Z0lBQUFBb0ZOd3JFdGtqY290IDBmbGZldmZzZUtLVEhyNEZBQUFBTUZGOHZIUm5hTnoycHNPckc1UXJKZ1VBQUFCd2lOeEV3aE9KVHFXTUZZNmVWL3AxbU1RQ0FBQ0EgWTBsUEZNQ3Nla1JIcEQyTkZTMFZiQjY2QlFBQUFIQ2c4RlNrSnd0Zy92Zlcyck1UQ1UvTG9oQWVBQUFBT0ZSNFdzdU9vL2Z0TURRKyBjS3NCaURJV0FBQUFuRko4dXIzRWpwNUx4d2VqT1JrQUFBQk9MVG1lcDZUVDRhMWtwOGVndkRzSUFBQUFNRlZ5NUFBdjJWc3FLQkkzIEtLOGtUblRZbWd3QUFBREhsQjZSV251TjE3TVRIaGRSRVI1RUJ3QUFBSTRwT09JNHlhU3FVelE2dmtvK09FM0pBQUFBY0FycHNjRksgSkRpbEJtV1JmSHc4cXAxbEpnWUFBQUF3dC9pMFJ0RDNmQ1k3RzB1a1hyWkNkQUFBQUdBT3FhbUlUaVE4N3JUNFVMU29TSVFRSFFBQSBBRGlXOUt3YXd1UDFGdS85KzZGZ1Zpd1BCQUFBZ0tVSlR6WkV0ZU15MGFubmtyd2VTUkVBQUFEQXNjUW51NGtrUjFnTmdiU3NpamVFIEJ3QUFBSllnUHRIZkxXMVFSbmdBQUFEZ25HSWpqbTlrTFRjN2Y5N2FvTnl6VzRkZUhnQUFBRGltK0lqVTJteDJHQUpMeXNhN2FGWUcgQUFDQWM0aE85TDUwOTU4OTlUeGJ5YndxQ2cveUF3QUFBS2VTbnVhZlpVc0ZxNnVZQVFBQUFCWkxsT3hFMndtOVUwVVJId0FBQUZnQyBxMGgyYkFuS1MzS2FKNG9DQUFBQUxFRnVQTm5SLzhCclVLNlVzeVo5Y2dBQUFJQmpZNWNLdGtiT0k5RmgzdzRBQUFBc1duWWk0YWxNIFlDRTZBQUFBc0dqWmlUWVFpdFEzS0FNQUFBQXNWblpFYWh1UlNYQUFBQURnWW1Vbms1aktHVmdJRUFBQUFDeGVkZ0FBQUFDdVduYTIgd2QvWnFqL0wvZzRBQUFEQVltVm4yNUFjS1FnUEFBQUF3Q0psWitzSXp0WjVPN29CQUFBQUxGcDJ0T2g0Z3JQNXZFV2lRK0lEQUFBQSBpNWNkVDNRMmdmZ2dQQUFBQUhCeHNpUGlsNjgyNXBZSmo1aVBCUUFBQUxBSTJiRTlPNTdVV09HaFp3Y0FBQUF1Um5aRTRuTFZKcmw1IHBTOEFBQUNBVTFGeWp5SDRoMTZha3pVcEF3QUFBQ3hTZnFKa0o1ckdhazFtbFMwTEFBQUE0QlFNRWk4TzNCWWxCN2tCQUFDQVU3Q2QgOG1mVlBUdmU2OTRuUVh3QUFBRGdGSktUVlpXMmtleDRvbFBkb0l6a0FBQUF3Q21FWnh1OEhqSWtSbFE5SmdMUkFRQUFnR01KVHVRYyAyOFJiZHY1OENQNWk5RUdrOFQ0QUFBQ0FVd2hRcFg5NGEyVkhIRnZhU241UUtBQUFBTUM1QkNjN3ZQdy8vM1lvZkdDUk9Oa0JBQUFBIE9KYmdTQ0l6MGFrUGFSa3JraGg2ZGdBQUFHQkpvck5KaEdmdjMyZGxySmJZZEhkREF3QUFBQlFrSjNPUzZFaXJjRTFPZE9wNTlra1EgR3dBQUFEaTFCSG1uTzJTblBQem4zdzZTTnlGdkc4S0QrQUFBQU1DeEJVY2tQcUE4TzcvVExXTjVjdU5GUkZFVEVPSURBQUFBaDBwTyBKRDNiUkhvMmdhTTBqNHZZU0h3b0tNSURBQUFBcHhDZmx1Ulk0ZG41OTVYaklsbzFzYXpYQndBQUFHQ0s1R1NUV0pWVTV6Ly9ma2crIGFPdURaWWVDQWdBQUFNd2xQZHZBUTdLK25mL1FTblphTVJITnlnQUFBSEFPNlNsN3lkRDRZUGFEZmtpaEVRanBBUUFBZ0JrRnB6SnkgN3ZYc3lDZzcyWlpDVDNRaTRVRjBBQUFBWUM3UmlhU24wa2U4Y3hzQzBkbEludWhReGdJQUFJQmppazVMY3FyVkpuZURjcGJzWk5JRCBBQUFBY0tqa2lPTW1VY21xSkR4RDR3TnZwRC9sQVFBQUFKaERmaXBuWWtVOU8zc055dEh4RURiVnNYMDcyWEpCQUFBQWdGN0JzUzRSIE9VbHBlN0tXbmVnRGVrbE9KZGxCZkFBQUFPQlE4YkdwemtkRGVzS2xndEUwbHRldjgrRjhBaHFVQVFBQVlHN0o4WVRIYzVLc2w3ajcgdUlqc2c1UHFBQUFBd0RHa0ordlBzVjdpdHRWRW8rZlpqaDN2QXpPVkJRQUFBSE9Mam5hU0QrZTJxZmhJNWRUemo4SW5ZZDhPQUFBQSB6Q1U2SXZudXZ5NGZhUjBYa1gzZzdCTUFBQUFBVEJFY0t6cmJvdWlVRHdLVm1UNDR3Z01BQUFCVHhhZlZPOXdLWDNZK25yZEJXWndQIHZwSCtaQWZ4QVFBQWdCN0pzVzhmWE1MNnplQjhncFpOdll1L1lKQlNGZ0FBQUJ3cVBKWG01SGZwQ0Y1NmUzYmVDMGFWV1JvQUFBQkEgVlhvcXFZN1hXclBqSU5sU3dXelU2MTMyRXg0V0RBSUFBTURjb2hNNXlIdlZRYnhrUnlTdmswWFJFYnQyQUFBQVlJcmNpTFFYRzcrTCBYMkZxQ2s5MjZybVg3cnpMdEhJV0FBQUFRRVY4V28zSlVYVXBtc1pxSGhlUk5TaFh5bGhNWkFFQUFFQkZjaUxwaVVUSEJpK2hmd3dkIFpwVjlvdXlzTEFBQUFJQ0s4R1NCU3lRNlVhcXpjK3I1M2p0bC96aDFMOVh4ZW5lWXlBSUFBSUE1cENkclVQNUlIQ1JzVVBiS1RhM3ggY3lheUFBQUFZRzdKOFJZYnZ3YzNMVHBoWmFtM1FibXliMmVENUFBQUFFQlJjT3pMVm5OeU5JMVZIajIzd3JNeHdwT1pWY211QUFBQSBBQUxoOGNLV2ludWtZY3ZVWktkbi9KeUpMQUFBQUtpS1QxWlZ5bVFubkFRZkdwOHdtOGJ5YW1icDZCY0FBQUJBSWpsVjkyZ3RObTZlIGpSVjkwcGJzUko4VTBRRUFBSUJlNGNtOHcydFFEZ09XYVBSY0FzT3luK1F0a0I0a0J3QUFBRnB5WXlXbktqcGRKemkwR3BUSG02MmIgdlNXaWt5VTdDQkFBQUFCRXdwT1ZzRHp2ME03Uk5YcXVxZmJzZUovWVBXWWRBQUFBSUJDZmJWRjBzcEJsenp1cXlZNDMvdlVtdXdsUCBOdStPOEFBQUFFRExPV3pJNG5sSFMzVEVla2MwZWk0ZG4vaTk4TWtSSFFBQUFOZ1RFWm5XbU95VnNVU0taYXlzU1ZsLzhqZlpUM1l5IDRRRUFBQUNReER2c1FKVG5IRDFuYzRheUk0NXBSWDA3YjhrZHlNN0pRbjRBQUFBZ1duZmo5ZXRrd1VyejVJYWhjRWV5V0tsSGVCQWQgQUFBQThEd2oydXYzNWdqUGVHc3RGQ3pKVGxUS3NwTHpLbkd6TW4wN0FBQUEwQktlaXVpMFBFTmt3alNXRkd3clNuWTg0d0lBQUFESSBsZ25hWWFpVzZEUVhDa2F5MHpveXdpdGp2VW90MmFHY0JRQUFBRm1vMG1xVnlaS2RzdXg0ZDZneWtVWGZEZ0FBQVBRSVQ4VXhvbmFaIHNsOE1uWGZFczY1WHFkZlRFQjBBQUFEUW5wRlZqMXA5d1NYaDZXMVExdVlWV1JkOU93QUFBRkJ4aXloUW1WSTk2cDdHYXAxRTZ0WFQgNk5zQkFBQ0FYdUZwOVFTL2lyOVFzTlN2azhtT2Q4ZXlVMGhmSlc4aW9tOEhBQUFBeEJHZEtOWEoybVM2anFYcWFWQnV4VXl2NHFjNyA1ZEV3QUFBQXVHckJpZHpDTmllL1NwN3NkQTFBRGNVN1ZtbFNmalYzc05La2pQZ0FBQURjcHZUMFRtRzl5ZjZaV0VkdlVQNXc3a1JsIG16S1NBd0FBZ09qWWd6KzlYaDF2QUtxclg2Y2xPOTRkekpxVXN6dm1UV1VoUEFBQUFMY3BQRjRKeXdZbjFpdXlzZk9qOWV6WTJwcFggeW5vVDl1MEFBQUFnT0x0TzRUVW1SMU5ZV1hPeXlNdzlPeUxUbXBSYmpjcUlEd0FBd0cwS1QwdDBvdWJrcnZCa1Noa3J1b092UmVGQiBkQUFBQUc1WGVGcFRXUFptUzFnbjdkbVpjZ2NwWlFFQUFOeWU0SGlpRSszVzhYcUF0VTkwTHlrZURyaWpXUm1ydFhPSGJjb0FBQUMzIEt6eXRWT2RGL09Ca2trY01FKzVnWkdUZUhXeWxPNGdPQUFEQTdRaFBKZFY1a2RvVVZwbGg0cDF0VFdYWk81cFpHUUFBQUZ5djRIZ08gWVkrZWVwVzRIY1lLVDNjN3pERGhUdXN5VnF2V050Nml3N3V5QndRQUFBQ3VRM2k4NnBBV25kRWhYcVJkd3VyZTJkZmJvQ3lTSDl6MSA2dHpaTnlNOFhyME4wUUVBQUxodTRiSHVZQmNKWnFtTzE1eDhrZ1psM2FUOFhyekRING1kQVFBQXdIVUpUaVE4M3ZtYUwrYldhazR1IE03Vm5KMnRTOXU2c1hRb1VpUTdpQXdBQWNGM0Mwem9lNGszNVF1UU5CdzA0VGVuWkVXa3ZGM3cxZDl3N3NaUlNGZ0FBd0cwSVQ5VCsgTW9yT1MrQU5zNXpDTUxWbnAzTEhiY3JUdXVNQUFBQndQWUlUQ1k4WGtFVE55VkZJMHNWd3dCZVJuVmJxM1dsS1dRQUFBTGNsUEpVVCB6clAybDFsMjlFM3QyY21FcDlWb1JDa0xBQURnZG9Rbm0rQ3U5UGxHemNrbjdkbHA5ZTFVT3FzcFpRRUFBRnlQNEdoWDJFcDdZL0t2IHhCVU9LbUZOa1IzN3hXVG5XN3lZTHlEYnFNeFpXUUFBQU5jcFBGNHdrb1VpcjRrblRIS0VZWVl2d2pPMjFoY1JSVk9JRGdBQXdQVUkgajNmcVF1UUllcUJwdGhMV1ZObXBscktpTDBJTHorUnpMZ0FBQUdDUmdtTkZSMDloMmNia1g3SmZ3bW8xSjNjenpQQkZWWnFVOVJkaiBTMW1Uam1zSEFBQ0F4UXBQYXg5ZkZvYll5ZTJEM2VEUW5oMHJQSlVtNVJkcGIwWkVkQUFBQUM1UGNqVFpPVmcyREJrREVXOUZ6YUo2IGRyeGxRZDRYa28yaGJ4b1BIQUFBQUN4YmVMSXByS2pxYzdRUzFpR3k0MzFoUGFXc2FBeWRuVHNBQUFDWEx6eXRWT2VYN0ljaDJjR2YgSW1mdTJmRytzUGVPTDhwTGR4QWRBQUNBeXhLYzhXVXIxZmtsZmordnQxOW5sbjdlWWVZdnpOdTM0M1ZjWnhaSG96SUFBTUJsQzA5ciBCOSt6N0ZaN1JpYzR5cVQyTU9NWEdNM1M2eS9rMStjWFdObVNpT2dBQUFCY2p1Um9IN0RqNWxHbHAxTENXbFRQVG04cHE1THVDTklEIEFBQndFY0pUY1lHcC9Ub0h1Y0JjUFR2U0tUdlBwN0k1QUFBQU9KbndSQjZROWZCR1c1TVhYY2JLdGlsSFg2UTNha2FqTWdBQXdQSUYgSi9NQUw5VjVscjRTbHNoQ3lsZ2k5VkxXcy9TVnN1amZBUUFBdUF6aHlScVRXNVBaV1R2TFFReEgrSUpiNDJhZTFWV0ZCd0FBQUpZbCBPVnAwcGw3L2ozbzQrSENFTDdwNjZGY3J4cHJsV0hjQUFBQTRxdkJzMWZXNm11cWNySVExcCt6MGxMSTg0Ykdub2I4ZnkrNEFBQUJnIHR1dStkKzJ2OXVvY3ZURjVidG14WDdBVkhxOXZwN2QzUjVBZUFBQ0FSUWxQNzNCU3p6VDJiTmY4WTVXeHFrMUtWbnAwdXFPLzhObWIgbFFBQUFPQ2c2NzFJZkE3V2VEM1gxL3JLRk5aUnJ2WERFUitJMXZpWi9lSmZoSFFIQUFEZ1VvVEhTM2JHUGwydlQ4ZExkY2JyL1ZGYiBWNFlUUEFBMjNmRjZka2JwcVl5aElUb0FBQURMRVo3S0JGYldyM1BVRXRZeFpHZnFHSm9YYlVXbExEbUc5UUVBQUVENU9sOXRXWGtXIHY1SXpoaG9uT1RuaDJHV3NsdkY1RDRKWHk3TVBBcUlEQUFCd1B1SEpydkcvaXRmNGFBcHI5a0RqV0dXc1E0U25wM2NIQUFBQVRpYzUgSW42cUUvWGwvdnk4dGFhd2pucDlIMDd3d0ZTT2ovQ0VoeVdEQUFBQXl4T2VWcER4SE55OFZPY2tVOWZEaVIrUThVR0orbmE4VVhRYSBsUUVBQU00dk9TSnhxdU9Wc0hTcTgyeXU2Mjl5d29ucjRjZ1Bpa2k5bEdVZmxPeEVkTklkQUFDQTB3dFBkRTEvQ1VRbkttSFphL3BSIHIrZkRpUjRZVzhwNmwzWXBLeXBua2U0QUFBQ2NWbks4OE1KTGRUelJxWmF3amlZOHd3a2VITzhCOGg0Y3I1SEppN3hJZHdBQUFFNHYgUEwycGppYzZYbmh4OU92NGNLSUhTQ1R2M001aUx6MlRUN29EQUFCd1dzbnhRb3RXcXZNc2ZnbnI1S25PS1dUSGlvNCtFVFVxWlhuQyBRN29EQUFCd1B1RTVwRmNuR3pnNnlmVjdPT0VESlZMZnVVTzZBd0FBY0g3SkVibndWT2RVc3RPYjd2d1UwaDBBQUlDbENNOUZwenFuIGtwMUllbHJycGFlbU93Z1BBQURBZk5mc2kwNTFUaWs3YzZVN3JiMDdpQTRBQU1CODErNkxUM1ZPS1R1UjlGVFRuZkhCaTBiWE9CRWQgQUFCZy9tdjF4YWM2cDVhZFE5S2Q2cXcrNlE0QUFNQjhvblB4cWM1djFtZDZJRmVTcHp0ZXN2UGw4MzJQLysvMjhQOXU5NS8zLys1VCAyamFmSDNkbFBnOEFBQUQwWGFkYko1dFgyMDdPbnVxY1EzYXM2S3lrbHU3OCtKU2RwOCtiRlo2UFQrSFJzb1BvQUFBQTlGMmo5ZXNiIHlVODJqeW93aTBwMXppRTdrZlJFRCtTVEVwM3haWlR1akFuUFZza082UTRBQUVEZjlibDZnSGZyd005RnBEcm5rcDBwNlk0V25qSFogaWNwWkt5VTlDQThBQUVEdDJxeGZuM0xpZ2QyTHQ0aFU1MXl5RTBtUDEvdzBwanRhZUw2SVg4clNzck9TM1lRSEFBQUEydGRsVzc3eSBlblYwaThuaVU1MXp5azZXN25nUDZwUHNKanM2M2JsM2hFY25PeUtrT3dBQUFOazFXZFExZVN0NVUvS3pFcDBmNm4xblBkbDhpYklUIFNZK1g3andxNFJtbFJ6Y3JQM3plck95UTdnQUFBTlJGWjJ0RXg1dVUvbWxFWi9HcHpybGx4MHQzUGh6aGVWYkM0NlU3V25hOGNoYnAgRGdBQVFINDk5a3BZM3NMZm40N29hTmxaWEtwemJ0bXgwcU9GWjJ5RytuMy83cFh3UERrMzNidHpML3ZwRHFQb0FBQUEvdlZYdjY2YiBrcU9kT2ovVWJSUWZiK0h2WWxLZEpjaU9UbmZHdDBmWnVaUGRNWFN2bk9WTlp0M0o3aWo2Um5iTFdrZ1BBQURBbit0dU5tbytwanFSIDZDdysxVm1DN0ZpN3RPbk9teU04WHNKako3UFdzaitaeFNnNkFBREE3blczY29UVFQwZDJSdUhKRHVtbWpHVWU4Slh6b050MFozekEgdGV4OGtkMWt4MXMwdUJHYWxRRUFBRHpSMFUzSlduUzhwbVFyT2xtcXMxbUM1Q3hKZGlMTHRJM0s5NTh5bzB0WlQwcCtXbnQzYUZZRyBBQURZRjUyb0tUa1NuUi9pVDJDTnFZNDltSnN5bGlNZmRqckxUbVk5ZkQ3UWorS1hzanpoOFpxVkVSNEFBTGhGeVJGenZjMzIzSTF5IDg4L25MVXAxeGhLV0xsOXRsL0pGcnhmNm45QTZNOHMySzJkSFNOaUVaMURDQXdBQWNHdWlzeFgvU0FndjFmR1NIVytKb083VjJRWnkgaGV6SWJnT3hyaUVPc2orSy92TlRhaDZkVzVidXNGa1pBQUJ1WFhpeUl5SDA5Tlh2MnovaXB6b3ZFazlnTFNyVldacnNXT0d4cGF5byBXVm1YczZycERpZWpBd0RBclVtT0p6eWo2THpKZnZscUZKeHFVL0xpZW5XV0tqdjJQMFVMejl1bnRJek55dmZpSnp0MnlhQk5kOFlPIGNjcFpBQUJ3UzZLVEhRa1JMUTlzOWVyWUNhekZpYzVTWmNkclZoN0xXYVB3L0pLOG5CV05vZHQwaDNJV0FBRGNpdkI0TzNWc1Qyd20gT2o4TG9yTmQ0aGUvWHZoL2pCVWUyMEIxcjhUbUlaQ2RxSGVIY2hZQUFOeUM1Rmpoc1R0MVJ0RjVEa1FuV2lENEx2dUpqaXhSZUpaYyB4ckxOeWxwNHhtYmx0UkllTDltSjBwMUJpUTNsTEFBQXVHYlJ5YTZsZXZyS2lzNTR5OHBYM2w2ZHhiSDBaQ2RxVmg2VThEekxmcnFqIFgrcDB4MXMyU0RrTEFBQ3VXWGpzOUZVMFptNUZ4NTZCWlJjSWVxVXJ5bGdIbXFsM0t2cWQvRWwzN2dQWmVRaGtoM0lXQUFCY3MrUlkgNGRIbEsyLzZLcElkdTFNbjZ0VWgyVG5nUDh0clZoNlhBOTdKZmpuTHU3VjZkMFFvWndFQXdIV0pUbmFpdVhmSXB4VWRyMWZuWXBxUyBMMGwydlA4NDIwWCtJbi9LV2ZkR2Vtd3BpK2tzQUFDNEZlR0p5bGZlbVBsdndmbGIrbEtkeFpldkxrbDJiTE95VG5mMEtIb3IzY25LIFdmck1MQkhLV1FBQWNMbVNZNFhIbTc2eXl3UHQ3WWY0bTVJdnBuUjFhYkpqaFVka2YvZk9vSVFuazU0bzNlSHNMQUFBdUJiUnNlR0EgTjMxbHkxYzYxZEhUVjc5azk2QlByekdaTXRZUi95TjFMRGZJbjNLV2JWaU9aQ2M2RlYyZmprNjZBd0FBbDNhZHpKWUhWc3BYUDVUcyB2RjY2NkZ5YTdHVGxySlg4T1VxaUlqczIzYkg5T3lLN2sxb0lEd0FBWEVvWXNKWGFsbVFyT3Y4WTBibVlnejZ2U1hhczhJajQ1U3c5IG9hVWxwOVc3WTVNZHh0RUJBT0FhUk9kTjlyY2tWMFVua2gyNUpPRlpYOEYvYktXYzVjbU9GUjVQZWtRSkR3QUF3TkpGSnhzejk3WWsgL3kzNVFaOFhYYjY2Wk5scGxiTUdKUzllU2V1K0lUdTJXWm4rSFFBQVdQcDFzWGRMOHQreTM2dHpkZVdyUzVZZEt6d2l1K1VzZTNhVyBUWGp1cFhhTUJPUG9BQUN3OUd1aGZqMFNuWEg2eXFZNVVhcnpLbGRTdnJwMDJiSC8wZm8vZWV6ZGVSRS8zY2xrSjVyT0doQWVBQUJZIDhQWFBwanJlUHAwZjhpZlIwYUtqZCtyb0xjbFhJVHFYTGp1dFpZTzJuR1YzOEVUbHJFSDJqNU9nZndjQUFKWW9PbHZuRjM2ZDZuaWwgS3lzN1hsUHlWWlN2cmtGMnJQQ0k3SitkNVoyZmRSK0lUaVhkb1g4SEFBQ1dKRHFWNHlEK2NXUW5PeExpcWxLZGE1QWQ3ei9mbTg3eSAwcDJxOUZpcFlmOE9BQUNjKzVvWFRWN1pmVHFSNk5oTnlWbFQ4a1dMenJYSWpsZk9Xc2x1M1ZJdkQxd1hSQ2ZhcXN6K0hRQUFPUGN2IDl2cVgrM0dmem50RGRQNzllZk5TbmF3aGVYc05EOXcxSlR0Uk9jc3JhWG1pVTIxV0ZxRmhHUUFBemlNNlh1a3FPK0RUNjlQUnFZNDkgMGR3ZTlDblhJRHpySy8xbTBPbU8zYjFqUzFwcjZadk1FcUZoR1FBQXppTTZyY1dCbnVqOHV5QTZIOWNxT3RjbU8xNjZNOHJJYUwwNiAzYkdOeTFhQTdvU0daUUFBV0pib3RCcVNJOUd4NVN1dlQ4ZnIxYmtLcmpIWldabHZqR2k3c3Bmd1ZFVkhROE15QUFDY1FuUmFEY2svIGpPeG8wUmxsUjR1T25iNnlmVHBYSXp6cksvN21FUG1UN3RoeGRMdUQ1ODZSSFc4cWl3TkRBUURnWE5jMnJ5SFpIZ1ZoRTUzeHBiY2wgK2VxV0I5NlM3SGhHYk1mUmJjUHluU002Vm5haTA5RkZhRmdHQUlEalhzTXFEY2xhZEx6cHE2czlEdUpXWlNjYVIzK1gvWkpXdEduNSBUdmJMV1Y2Nkk3TGZzSXp3QUFEQUhLTGpsYSttaU01UEpUcXZSblN1c2svbkZtVEhDby9JYnNOeXE2VGx2UjJsT3lLNzUyY2hQQUFBIE1KZm9qSkl6UlhUK05xS2p5MWMzaytwY3UrelliNXlzZjhjMkxrZnlrL1h1Q01JREFBQXppNDVOZExJenI2enM2RU0rYmZucWFzZk0gYjFGMmJMcGpEMHZ6U2xyMlBDMXZNcXN5blFVQUFEQlZkTGFKNk9nTnlhUG8vSS9VKzNSdVNuUnVRWGFzOEd6VSsxZEtlRm9KVDBWNCByUGd3a2c0QUFGTkZSNWV1c2pPdi9wMkl6czN0MDdsbDJSSEo5Kys4eVc1NUtwT2VRZHJwemxvWVNRY0FnT21pbzh0WGtlallzbFhVIHB6T0t6cHZFNTE1ZHZmQ3NiL0FiU21TM2YwZkVQME1ya3h3ck81SDRNSklPQUFDOW9wTXREWXg2ZEZwOU9qclIyZHlTNk55YTdOaHYgTGx2Uzh0SWRMK214c3RNNlB3dmhBUUNBeXJWSlQxNTVpWTZXbmY5Uk42OVB4eDd3K1dFazUyWkU1eFpscDlLdzNKSWVUM1pXaWV5dyBnd2NBQUtKZnZIWFpTbCtQb3NNOS95MStvbU1ia25XZmptMUl2cGxlblZ1VkhTczhVY055ci9RTWlmVDg1ZzdoQVFBQVIzUjArYXExIEhYbVVHNXZvL0MzNWh1U2JhMGhHZG5hRlIxdTE3ZC9wbFI1UGN1ekhRWGdBQUJBZGtYeHBZTFJMeDRxT2QrN1ZXTDd5bGdiZVZKOE8gc3VQL1oyOE9sSjFXdWlNSUR3QUFvaVB4MHNBM1IzU3M1RVNpWTA4eTk0NkR1RW5SdVhYWnNkOThka0pMSE9ucEZSMVBaQkFlQUFCRSBaMXNRSFR0aVhsMGM2RW5PellvT3NoT2ZueVd5MzJ6c2lVOXJ5YUQrV0FnUEFBQ2k0eTBOZkpkNE83THQwL2tmSlRvL3BYYVMrYzMyIDZpQTdzZkJvMjE0bG90TXFjV1VUV2dnUEFNRHRpbzZkdkhwUm9oUDE2SGdOeVQ4VDBibnBobVJrcHkwOG0rRHZlS0xUYWxKdXlRdkMgQXdCd2U2S1RIUU9oVHpIUGR1bDRmVHFSNk55ODhDQTd2dkI0WStsWjQvSnFvdXdnUEFBQWlJNVh1ckxOeUZwMmVzNjhJdGxCZGxMaCBrYzl2bXRYbk4xSlZlaUxaV1NFOEFBQ0lqdFI3ZFBUTFNxSno4eVBteUU3L042a280WkZFZHFyYmsxc2dQQUFBMXkwNmVwZU90eDM1IGIwZDB4cEtXVG5UR1BoMmI2Tno4aURteU0vMGJ0aW83Y3FEc0lEd0FBTmNyT2w2aWt6VWoyejRkUFhrMUhpZkJMaDFrNStCdldHOGsgL1NQNCs5bGVuVjRRSGdDQTZ4ZWRiR2xnSmpyZUtlYnMwa0YyWmhjZUVmOUlDR204RCtFQkFMZ2QwUmxGcEtjWk9UdkZuRjA2eU03SiBoRWNmMWphSDFDQThBQUNYTHpsYWRQUU9uUS9aM1l6ODYxTmV4a1JubEp2Ly9yenBwWUd0d3owUkhXVG5hTUtqMDUzM2pvK3htdmpEIGcvQUFBRnltNkV4SmRIU3EweElkbGdZaU95Y1RubzhaNUVZYTM2d0lEd0RBTWtWSHR6bDRSMEM4aUw4d2NCU2Qvell2N1lpNVBzV2MgcFlISXpsbUZaeTZwc2I4aDZMZnZFQjRBZ01XSlR1WDBjcDNvL0NPN2lZNHVYVVZMQTcwUmMwUUgyVm04OFBRSzBTZzY0NUVVV25nRSA2UUVBV0lUb3ZEZEV4enNDSXB1ODB0dVIzNFdsZ2NqT0JRdlBOcmpwUDdzMy8yWXdra1BLQXdCd1B0R3h5d0x0SGgxZHVvb21yLzV4IFJFZjM2V3lFWFRySXpnVUt6N1pEZ1BUNzdwVG8ySlFINFFFQU9JL29qRXYrOUZiazZBaUk3QVR6ckVjSDBVRjJMa0o0dG8wZkhQMEQgMUlvcWJicUQ4QUFBbkY1MDlMTEE2UGlIdjQzZ1JLTGpuWGZGZG1SazV5S0ZKL3M0a2V4NHQ3V1JIb1FIQU9BMG9tT1hCYjdKbngwNiAwVGxYbnVqb2hZRzZSd2ZSUVhhdVNuZ2lrZGtVeE9jM2R3Z1BBTUJSSlVla3ZTelFqcGFQRTFmMlFFOTdxS2ZlbzZPbnJ1alJRWGF1IFNuanNWdWJvVmlsdElUd0FBS2NSbmZkRWRFYVo4ZnB6c3JPdUVCMWs1eXFGSjB0MVd0TGo3Vmk0RTBiVEFRRG1FcDFzV1dCTGRQNG4gRUoxL0pEN1VrMlprWk9mcWhNZWJzb3FrSnBJZWZiT2o2VXhxQVFBY0pqcFJvdk9haUU0MFd1NU5YSGxIUUh6SWJwS1A2Q0E3RnlrOCAzamZ2TnZuQmFrbU9kN3NUSnJVQUFPWVNuWTlFZFBRT0hadm82SDRkbmVqOGt2cFpWNGdPc25PeHd2UHUvRDByT3Exa3B5VkFOQzREIEFQUkpqa2pjaU93dEM3VEhQMFE5T2xaMFhoQWRaT2VXaEtlMVo2ZjNGaTBpcEk4SEFDQVhIZHVmayszUThZNS84TWJMLzFhaW8wZkwgc3gwNmlBNnljMVhDVXlsajlhWTdudlRvLzF2NmVBQUFmTkhKSnE3R3JjaWpzSGpIUCtpU2xkMmhZN2NpandMMUlaeDFoZXhjdWZDcyBBdEh4ZHV6WTIwZnllaVE5OVBFQUFNUy9iRlltcmtiUjhSS2Rmd2VpWTNmbzJFUUgwVUYycmxwNFJQeEpyVW81NjBOMmE4a2ZnZlJZIGNhS1BCd0I0SHQ1OWFjdFdyWW1yTE5IUkUxZFdkTjRRSFdRSDRka1ZIVTk2dG9IMGZDVFNzMGwrb09qakFZQmJGcDJvYkRVbU9tTi8gVG5UOGc3MWxvK1hSc2tEN3ZBL0l6dFVMai8yR2IyMVcvaWpjSXVHeGZUejZSc29EQU5jcU9TTHRzcFVXSFc5WjROK0I2T2orSER0YSB6ckpBWkFmaFVlL3pVcDVzQjgrSCtXM2t2U0ErWGgrUFY5WVNwQWNBcmtoMFdtV3JVWEs4aVNzdjBSbmYva2Y4d3p4WkZvanNRRUY0IFdodVdyZXhVRTU3ZnR3Y2pQTnRFZWhBZUFMZ0cwYW1VcmFLSnE3OEQyZmxIL1A0Y2R1Z2dPeEQ4TUlxUmk5Wm9ldFNrM0VwNnJQaXMgUDI5YkpUMTJXa3VRSGdDNDRPZFY3NWZGckd6bDdkRFJMNzJ4Y3QyZnd3NGRaQWVTSDg3S2FIcHJNc3VUbkhmemcrZlZqdGRHYkVoNSBBT0NTUlNmNkpiRlZ0dnJSRUoyb2JEVk9YRVdubGlNNnlBNDR3aU95UDVwZW1jeDZsLzEwNXoyUkladnk2QkgxbFpEeUFNQmxTVTcwIFhGa3RXMFdpODQvc0h2dVFIZjNBYURteUF4T0VwN0owc0NVN1dXbnJNUkNlc2FSRnlnTUFsNUxtaU9SbEsrOThLMXUyK2p0SmMzVFogU3UvUGlmcHpFQjFrQjRyQ00wcFA5QnRMVnM3U3Y4bThteDlNVDM0ZWxQVGNDU2tQQUZ4dW1yTXh6NEhlK1ZZL0hOR3h2VGsyemZIMiA1K2cwWnhOSUdDQTcwQkNlYmZHSE8ycFc5bVFua2g0dFBLUThBSEJKYWM3V1BBZStLZEg1cFVRbksxdDVUY2hSMllyK0hHUUhadnl0IFJhVGV1QnlsTzFwMjdHMzg4eWZ4ZTNsSWVRQmd5V2xPMUlTY2JVT09FaDJ2Q1ZtTGp0ZjdTTmtLMllFWmZyaTl4dVhla3RhYitTMUggdjdUU00vYnkzQXNwRHdCY1JwclRVN2I2cDVIbS9EQnBUblMrRmFLRDdNQ1JoYWVWOGtTeTg1cklqcFdlUjFJZUFGaG9tdU0xSVh1SCBlT3B0eUhaUllGUzJhbTFEOXNwV2lBNnlBMGNRbm15ZnhOWThBV1RTWTI5ZUw0K1g4Z3lmMGtQS0F3Q25sSnpvbHpxZDVyVEd5cTNrIFVMWkNkbUNoUC93MjRaSGlrNEc5ZWJMejVvalBvL2dOeklPd2ZSa0Fqdk5jNTVXczlLU1ZiVUwyeWxZL2xOUjRrdVB0enFGc2hlekEgQWxPZWpkUjZlS3JwamhXZmJHSnJMR3RwNGJFbnFTTTlBREJIbXVQMTVuaExBcjMrbkgrQ05PZW41R2RiV2RFUlJBZlpnZk1KanpnLyBqSzBlbnFyc2FPbDVVaC9yWHZ6eUZxVXRBSmhUY3FwcGppMWIvZE9RbkZGMFhvU3lGYklERnlFOFc5bHRHTTZhK0ZvcHowdERmR3hwIFN3dlAyTXNqUWdNekFQUkpqb2hmc29wK1VkTzdjMzRtb3FNbEoydENwbXlGN01EQ255d3F4MHkwUnRKN3BPZExJRHk2cERVSXBTMEEgeUorN3ZEVGFHeWUzazFaNmQ0NG5PcDdrMkNaa081aEIyUXJaZ1F0S2VTU1JudXhvaWFpYzllS0lqeGFrMzZXdEJ5ZmxzYjA4WG1rTCA2UUc0N1RTbnAyU1ZwVGsyMFlsS1Zsa1RNbVVyWkFjdVRIaTJKa25abXQ5V05zNXZUZG1VVnF1djUrbnpZendvOFZuTGJtbkxUbTFwIDZVRjRBRzVYY3V3R1pPL3dUcTgzUisvUCtTZEljbXpKS2pyeTRjTzVUNGdPc2dNTGYwSnBwVHpaV1ZydnNydDQ4Q1c1L2Y3enI0SDAgNk5MV1J2eXBMVkllZ051U0hKSDJVVGRlQTdKTmN6elJHVi8vR2FRNWRzclVIby9Ea2tCa0IyNDA1ZkhLV1ZaMnh0ZS9Pc0l6bHJiVyBTbmpvNXdHNExkR0orbkt5U2RFWDJkK2I0NVd0ZnNoKzg3RlhzcXBzUWliTlFYYmdobEtlcUt6MTBraDZ0Qmc5T1NuUC9hZnNyQ1hmIHpZUDBBRnhYbWxNNTVpRXJXWGxOeUpua2VDV3JWbThPb29Qc3dBMm1QTmxPbmhmelc5ZUwrUTFxVEhtMDlEd282Zm1RM1lXRUE5SUQgY0hPU1V5MVoyVFFua3B5ZjZ0L3FYNzZxYVE2aWcrd0FLYzllV2FzbE8xcDRSdWw1Tk5LamhRZnBBYmg4d2ZFa3gvc2x5bHNNNktVNSB0amZIM25TU0U1V3NkQU15YVE2eUE2UTg0VzlmbFpUbmwvbXRURC94ZkRIQzh5aTdwYTBwMG9QNEFDd3J4UkhwMis4VjdjelJrMVkvIHhKK3VzdnR5ZmdXU1E1b0R5QTVQVXFXVXg1YTAzb1BmeUY0YzJSbHZYNVgwUEFVcFQ0LzBDR2tQd0VWSlRqUktycyt6YXFVNVZuS2UgelhPUG5iS0tKSWMwQjlrQlVwNmR0NGRBZXJ4OVBKSG8vRksvZlgzNUZKOHZKdVY1Vk1KVGxSNUJlZ0F1U25KYUpTdXZOOGRLanUzTCBzWktUalpPVDVpQTd3Qk5ZbXZMMGxyVittU2V5YitybEtEMWZUTkx6Z1BRQVhLVGtlR1BrbnVTMEdwQi9CcUpUN2N2UjIrSDEvUkxTIEhFQjJvSnJ5UlAwOGJ4S1h0ZlNUbWhhZXIwN0sweXM5SzlsZlRvajBBTXd2T0NMNzVaK04xQ2FzM3B6bmhHZnhlM04rR1BIUkUxYlIgS0htMVpJWG9BQmNFQ0w4bjlNdFJMRWJaR1BmbHJEK0ZaSlNVUnlVdVg0ellqS0pqYjE4bVNJOWRURGlZKzd2aSt4eGc5aFRIUzN1OSBoYVRlQUVQVW0rTkpUdFI4L0tvK2g1V2NqZmc5T1VnT2NCR0EwdmVGYlJBZWxQRGNLZUhKcE9lTGtwNnZuZEpqeDlYdG1Wdlo5SmIzIHRRQkFudUtJNUh0eW9qRnlyeS9IcGprL2t4U24wbnhzMHh4S1ZvRHN3RkZTbnBWSlZrYnB1UzhrUFYrY3hLY2xQZDY0dXQzR1BFaCsgRElXUTlnQ1VVaHlSdUIvSEsxZTl5MjdmM3BqRWpNbU1saHg5KzJIK1RBOHplRXNCS1ZrQnNnTm5rUjVkUXJvckpEMlBTZEx6SlpDZSA4ZTgvT2tuUFd2enlWdGJYUTlvRENFNDd4Y242Y1ZvcktMeVNsWGZUZjhkT1dFV1NZNXVQa1J4QWR1Q28zeXV0MHBZblBROG02WGtxIFNJK2QzSHFVZURIaFd2SytIdEllUUhKcUtVNUxjcndKVExzejU5bVJtNWJrakIvN1hmeFJja3BXZ096QTJhWEhTM3EwaEZTbEp4TWUgbmZJOFN0N1QwOXZNalBnQUtjNXVpaEtOa0VkOU9jK3kzNS96MDVFZ2U3eU1UWEphKzNKSWN3RFpnWk4vNzJUOVBNTkU2ZkhTSG04LyB6Mk1nUGQ3SStsMGdQYTB5Rno4bmNDMkNJNFVVSnpzVHowdHlmZ1dKem5ORGNuUlBqaDBqcHk4SGtCMVlmTW9qUmlnT2xaNHZRY0x6IFZFaDY3cDJrcDFMaXlucDYrSm1CU3hFY2tYZ0JvRzA2ZnBmMndiOTJVL3B6NGZZcmtSeWI1SGdUVnBTc0FObUJxNVNleDBSNnZnVFMgWTVPZXg2TDBlTTNNMmM0ZXhBZVdMRGdpZnBtcUo4WHBrWnhmaWR6MFNJNGRhNC9Pc0VKMEFObUJxNWFlU0g2ZUpraVBMbkY1KzNwMCAyb1A0d0NVSmpqZ0pqbmVVUTZWVUZVbk9MMGR1bmh1Q1UrM0oyVGhmRDVJRHlBNWN2ZlJFNHZQRmtaK25pZEtUbGJpeUVYYkVCMDRwIE55SnhTY2VXZld5S3MxR0NFYVU0dHVuNHhVak1jL0RTQ2s3VWo0UGtBTElEU0U4Z1BWN2FrNG1QSnp4Uk03TW5QZXRFZW16aUkxSnIgYnVibkRPWVduRmFaYW1xcEtrdHk3UHRlQ2luT20reHVXa1p5QU5rQnBNZElqN2VWMlV0N0hoM0o4VjUvVEtUSFcxSllGWjhwUjFUdyBjd2N0dVpraU9LMEZnRzlKaXVOSmpuMzlaVUtLZytRQXNnTklUME42ZXRPZXgwQjR2TW10Ykd6ZGxyZ3k4VmxKKzRnSzVBZW15STNJIC9pUlZWS2JTQ1lvOXltR0s1RVNOeHA3Z1JOdU9rUnhBZG9EdnUwN3B1WE9rcDFMbWltNlBEZW14YVk4VkgrOGcwbXJpVXptdWdwL04gNnhPYlRHNGtTVzhxWmFwcVAwN1VrMU1WbkZhSzQrM0lRWElBMlFHKy94THBXVFdreDB0N0l2RjVESVRIbHJhOEV0ZTl0TXRjUGVLRCAvTnlHMkV5Um02cmdWRXBWclo2Y2x1QWNtdUpza1J4QWRnRGEwck9hTWUzeHlsMlBRY29UaVUrcnpPV05zUjhxUHdqUVpZdU52ZGozIENJNTMwcmh0T1BaS1ZhOUtWS0tTbFgzZmkvazNWbkM4TGNmUnVWWHN5UUZrQjZCRGVrVGk4N2VzOU53NTBtUEZ4MnR1Zmt6ZVo0V24gTXNuVkVwK2VrdGNoNCszOGJCOVBhbHBpVXhHY0xMM0pCTWRMY2Q0Y3dmSEtWbEdUc1Qyanl0dUw4Mjd1V3lRNFNBNGdPd0F6U1k5MyA4S2czdmg2VnVUejV5VzRQenN1b3hPV1Z1UTZSSDVINUo3MzR1YTlmaEZ2TC9DU1FHbkZFb0ZXZTJwajB4Q1k0VWFrcUtsbEYwbU1UIG5LaE1GVTFVYlFLQlEzSUEyUUU0a3ZSRWg0KzJ4Q2RLZlI0YXdoTTFNM3ZTTTBWK3BwYThLc25QNm9hZUc3WUgvdDJla3BRRVVoT04gaDA5SmNGcVM4K3FrTkZIL3paUm00MDB4eFVGeUFOa0JtT243TkV0N290NGUyOSt6RHNRblNuNDgyZkZTbm50SGZPN041MjgxT0I5UyA4b29Fc2ZKenYxckljOHZjRjh0dDhmM2J3c3ZvYUlhVzNIZ054bFp1SXNsNURVVG5wZmp5VmZaTFZGR1ppaFFIa0IyQUswaDdNdkdKIFNsNWUrdVBKanRmSUhQWDNlRnViNTBoOU1nSHE3UUZhU2hLMG5lSHZWOHRSbFo2YmpmVDMzclFTbkt3WEp4T2Q2SDNleDNpWGVKcXEgSlRuMk1VRnlBTmtCT0ZQYUV6VTFqNEpnUldJdGVibkxTc3hENHhaSno0TWpWVjdKNjA3aUptZHZ0SDBRdjQ4cGVpem1rcURxbjA5NSBmdGxPL0xOZXFXa0pUYVdwZUZ1UW14N0JhU1U1VVJuTFMyMWFQVGlrT0lEc0FGeHAydE9UK0hqaVk4dGVsWmYzeGNTbjFlQ2NIVjFoIFU1OUsraE5KejZyeHVGYWtjK3B6ekxiejdaYlVTSERCM3NvMHVhbjAza1J5MDVLYzEwYWk4OVloTmphOThTYXBQaHh4SThVQlpBZmcgUXRNZVNhUm5WUkNmT3lNaTl4S1h2dTZUOTdYa0oycHVidlg0M0FYU002Y0FWVVJtYWtyVWs4UkVGOXdwaS9zeXNka1d4Q1piOHZmaCBTTWRiUVhUZUFwbXBpazJVM2xRVEhGSWNRSFlBcmlUdGtZbmljeWR4ejQzWGtIemZrSitzcWJsWGV1N00vYTRtUHozOVA5SklmYVpNIGlmVTBDTGYyMnZRSXpxWW9PQzI1cWFRNFdibXE5MmJUb1EvbnBiM1AyZEkvSnFvQTJRRzRnYlNuUjN5R0lQWEorbjRxQXRScVpyNlggOWhqN0lmSXp4N2g3cFUrb1JUYnh0RTFFcUNvNVdiOU5iM29USlRudlR1TFNFcDczSksySlVodHZQRHhLYjFyajRxUTRnT3dBSUQ1aCBuMCtVL2tRQ0ZNblBXdktSZGZ2djdRaDdkcXZLVDFWOHZNZEtwRjRheTVLZFNxa3BTM21tQ3M2SCtNdjlNc0dKa3B5cThMd0hTVTFGIGJENmMreHdsVlJYQlFYSUEyUUZBZkZ6eGlaS2ZvVU4rSXBtNVQvN091aUE4VVptcjFlc3paYU56MWd1MUtpWThGVmxwbFY2bU5CZFggU2xTZTRId0VRaEtKUy9iMlIxRnNyTnhzcGI4OGhlQUFUL2dBL0J4MGlVOHIrV2tsUUo2d3JJczNyNFIyVjB4Nk11R3BqTFpYRzc1WCB5YitWUUhncVBUVlp5dU10OXRzbUNVNUZkTEpFNXlNUm52ZEVpRnBTOHhIYzU1YllJRGdBeUE3QTdPSWpRWnBSRWFCVytlc3VFWnNwIGdqTkZlTHl2S1JPZFZqbXNtdXhrcGFkV1AwOTBUTU1VMGNtRUoyb016cHFHSTZuNWtIeTB2VGU1UVhBQWtCMkFXY1JIcEwrc1UwbC8gV2pMVUl6S3QvcDFLV2FzNnNSVjlqYXRDdWhPVm9Ib3YrRDBialQzWnFZalBoN1Q3YUZwU2t6VVNSd2VIUmttV0lEZ0F5QTdBc1g5VyBLdE5KMVNRazZ3RWFPb1dsVjI1YS9UdFR2NTVXdXROS2RUSVJhQjNua1BYcFRKR2ZUZVAxVGVOMVQ5eGFKYW5LNkQyQ0E0RHNBSnd0IDllbVZuMVZER0lhaW5IaC9mdGY1NzF1eTBrcDFvcDZmbHV4a2sxTlowdUVkekxrcDNENEtNaFJKUzFSK2F0M3ZhditSU0Z5YVFtNEEga0IyQVJhVSttZnhrOHRCcS9CMGFyN2QyNjB6WnZTTlNLMlBaOTltdjJWNjBiYzlOMUxkVGJWS3U3dFNwL25sRlpGcEMwOXR2UTJrSyBBTmtCdURyNWtZSllEQWZLVWVzb2libkd6dWRxVUo1ei9IeGJsS2xONFg1VVpLYWEyZ2pwRFFDeUEzQUw4bE1SSUpINWR0NE14YjlYIFdTcTRsRDA3SXZWaklsb2ZmMDZaNmRsVWpOd0FJRHNBVi85ejF6cHh2RmVJcENBdVU4N0dhbjNlSWZrN0xkbVJRRGdpcVpnaVBaVy8gSnpLOXI0YlVCZ0RaQVlDSkFqUzNFTFZlRjhrUEFlMUpuMXBFQXRLU0RDa2tLcjJ2VjE1V3BRYTVBVUIyQUdEaXorZnFTRkxVZWwrUCBYTFUrUmlRUGg0ckdkc0xIcnI2TzJBQWdPd0N3Z0ovWm5oNmhYbkdxeWs5RmRLcVNVVTFRdGgxdnoxRnFRbW9Ba0IwQXVCQVJhdjNiIFZlZkhYRTI0WDl2T3Qzdmw0NUNtWUtRRzRNTDV2d0lNQURhOWUyNnFaLzIwQUFBQUFFbEZUa1N1UW1DQyIKICAgICAgIGlkPSJpbWFnZTM5ODAiIC8+PGcKICAgICAgIGlkPSJnMzk4MiI+PGNpcmNsZQogICAgICAgICBzb2RpcG9kaTpyeT0iMjc1LjkwOSIKICAgICAgICAgc29kaXBvZGk6cng9IjI3NS45MDkiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIyNzguOTMzOTkiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIyNzkuNTE1MDEiCiAgICAgICAgIGN4PSIyNzkuNTE1MDEiCiAgICAgICAgIGN5PSIyNzguOTMzOTkiCiAgICAgICAgIHI9IjI3NS45MDkiCiAgICAgICAgIGlkPSJjaXJjbGUzOTg0IgogICAgICAgICBkPSJtIDU1NS40MjQwMSwyNzguOTMzOTkgYyAwLDE1Mi4zODAzMyAtMTIzLjUyODY2LDI3NS45MDkgLTI3NS45MDksMjc1LjkwOSAtMTUyLjM4MDMzLDAgLTI3NS45MDg5OTE5LC0xMjMuNTI4NjcgLTI3NS45MDg5OTE5LC0yNzUuOTA5IDAsLTE1Mi4zODAzMyAxMjMuNTI4NjYxOSwtMjc1LjkwODk5NjEgMjc1LjkwODk5MTksLTI3NS45MDg5OTYxIDE1Mi4zODAzNCwwIDI3NS45MDksMTIzLjUyODY2NjEgMjc1LjkwOSwyNzUuOTA4OTk2MSB6IiAvPjwvZz48L2c+PGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaWQ9IkZyYW1lX2NvcHlfMV8iCiAgICAgZGlzcGxheT0iaW5saW5lIiAvPjwvZz48ZwogICBzdHlsZT0iZGlzcGxheTpub25lIgogICBpZD0iRnJhbWVfY29weV8yIgogICBkaXNwbGF5PSJub25lIgogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3NjUuNDU3MjYsLTMxNC4xMTY0KSI+PGNpcmNsZQogICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZGlzcGxheTppbmxpbmUiCiAgICAgc29kaXBvZGk6cnk9IjI3NS45MDkiCiAgICAgc29kaXBvZGk6cng9IjI3NS45MDkiCiAgICAgc29kaXBvZGk6Y3k9IjI3OC45MzM5OSIKICAgICBzb2RpcG9kaTpjeD0iMjc5LjUxNTAxIgogICAgIGRpc3BsYXk9ImlubGluZSIKICAgICBjeD0iMjc5LjUxNTAxIgogICAgIGN5PSIyNzguOTMzOTkiCiAgICAgcj0iMjc1LjkwOSIKICAgICBpZD0iY2lyY2xlMzk4OCIKICAgICBkPSJtIDU1NS40MjQwMSwyNzguOTMzOTkgYyAwLDE1Mi4zODAzMyAtMTIzLjUyODY2LDI3NS45MDkgLTI3NS45MDksMjc1LjkwOSAtMTUyLjM4MDMzLDAgLTI3NS45MDg5OTE5LC0xMjMuNTI4NjcgLTI3NS45MDg5OTE5LC0yNzUuOTA5IDAsLTE1Mi4zODAzMyAxMjMuNTI4NjYxOSwtMjc1LjkwODk5NjEgMjc1LjkwODk5MTksLTI3NS45MDg5OTYxIDE1Mi4zODAzNCwwIDI3NS45MDksMTIzLjUyODY2NjEgMjc1LjkwOSwyNzUuOTA4OTk2MSB6IiAvPjxnCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlkPSJGcmFtZV9jb3B5XzJfMV8iCiAgICAgZGlzcGxheT0iaW5saW5lIiAvPjwvZz48ZwogICBpZD0iRm9yZWdyb3VuZF9HcmlkXzFfIgogICB0cmFuc2Zvcm09Im1hdHJpeCgwLjMzMzY5MiwwLDAsMC4zMzM2OTIsLTg4Ny4zOTg1NywtMTg1LjUxODg5KSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzgxOSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gNy4yNSwyNS4zNzUgNzkuNjYwNjA2LDAgQyA5MC42MjUsMjUuMzc1IDEwOC43NSw0MS44NjYwNzggMTA4Ljc1LDQ3LjA5MTkxOCBsIDAsNTAuNzgzMDgyIC0xMDEuNSwwIDAsLTcyLjUgeiIKICAgaWQ9InJlY3QyOTY2IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjYyIgLz48cGF0aAogICBkPSJtIDguMTU2MjUsMjkuOTA2MjUgMCw3MC42ODc1IDk5LjY4NzUsMCAwLC00OS44NzUgYyAwLC0wLjc4MDcgLTEuMDAzNDQsLTIuODA1MTI5IC0yLjcxODc1LC01LjAzMTI1IC0xLjcxNTMxLC0yLjIyNjEyMSAtNC4wNTgwNywtNC43NjA4IC02LjUzMTI1LC03LjEyNSAtMi40NzMxODMsLTIuMzY0MiAtNS4wNzIzNjgsLTQuNTYwODY1IC03LjI1LC02LjE1NjI1IC0xLjA4ODgxNiwtMC43OTc2OTMgLTIuMDc5ODk1LC0xLjQ0NDIxIC0yLjg3NSwtMS44NzUgLTAuNzk1MTA1LC0wLjQzMDc5IC0xLjQzNDY2NiwtMC42MjUgLTEuNTYyNSwtMC42MjUgbCAtNzguNzUsMCB6IgogICBpZD0icGF0aDM4NDkiCiAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MTg5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gNy4yNSAyOSBMIDcuMjUgMTAxLjUgTCAxMDguNzUgMTAxLjUgTCAxMDguNzUgNTAuNzE4NzUgQyAxMDguNzUgNDUuNDkyOTEgOTAuNjIwNjQ0IDI5IDg2LjkwNjI1IDI5IEwgNy4yNSAyOSB6ICIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC45MDkzMTA3IgogICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpvZmZzZXQiCiAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMuNjI1KSIgLz48cGF0aAogICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpvZmZzZXQiCiAgIGlua3NjYXBlOnJhZGl1cz0iLTEuODAyMzkwNSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gNy4yNSAyOSBMIDcuMjUgMTAxLjUgTCAxMDguNzUgMTAxLjUgTCAxMDguNzUgNTAuNzE4NzUgQyAxMDguNzUgNDUuNDkyOTEgOTAuNjIwNjQ0IDI5IDg2LjkwNjI1IDI5IEwgNy4yNSAyOSB6ICIKICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDM4NDcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICBpZD0icGF0aDM4NDUiCiAgIGQ9Im0gOS4wNjI1LDMwLjgxMjUgMCw2OC44NzUgOTcuODc1LDAgMCwtNDguOTY4NzUgYyAwLC0wLjI2NDMyNSAtMC44MjYzLC0yLjMyNzg3MiAtMi41LC00LjUgLTEuNjczNywtMi4xNzIxMjggLTQuMDIwMjUsLTQuNjkwNjQ5IC02LjQ2ODc1LC03LjAzMTI1IC0yLjQ0ODQ5NSwtMi4zNDA2MDEgLTUuMDIyMTU5LC00LjQ5OTAxNCAtNy4xNTYyNSwtNi4wNjI1IC0xLjA2NzA0NSwtMC43ODE3NDMgLTIuMDA5OTkzLC0xLjQxMTU2MiAtMi43NSwtMS44MTI1IC0wLjc0MDAwNywtMC40MDA5MzggLTEuMzU4ODc2LC0wLjUgLTEuMTU2MjUsLTAuNSBsIC03Ny44NDM3NSwwIHoiCiAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMuNjI1KSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQwMjExNjM2O3N0cm9rZTpub25lIgogICBkPSJtIDEyLjY4NzUsMjkuOTA2MjUgMCwwLjQ1MzEyNSAwLDYyLjk4NDM3NSAwLjQ1MzEyNSwwIDkwLjYyNTAwNSwwIDAuNDUzMTIsMCAwLC0wLjQ1MzEyNSAwLC01MC4yOTY4NzUgLTAuNDUzMTIsMCAwLDUwLjI5Njg3NSAtOTAuNjI1MDA1LDAgMCwtNjIuNTMxMjUgNzkuMjk2ODc1LDAgMCwtMC40NTMxMjUgLTc5Ljc1LDAgeiIKICAgaWQ9InJlY3Q0MDMyIgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjY2NjY2NjYyIgLz48cGF0aAogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICBpZD0icGF0aDM3OTciCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTA2MjUsMCwwLDAuOTA2MjUsMCwtMy42MjUpIgogICBkPSJNIDk3LjQxNDIxNCwzMiBDIDEwMS40MTQyMSwzMiAxMDMuMzE0OTksNDguMDM5MjUgMTA0LDUzLjYzNTE4NCAxMDcuODYwMDcsNTEuMTcxNDE1IDEyMCw1MiAxMjAsNTYgbCAwLDAgQyAxMjAsNTAuMjQwOTU5IDEwMy4xMDM1MSwzMiA5Ny40MTQyMTQsMzIgeiIKICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM4MDUpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjM4MDcpIgogICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgzODEzKSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM0Nik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gODcsMjUuMzc1IGMgMy42MjUsMCA0LjU4NjIyMywxMy43MzQ1NTEgNS4yMDcwMTMsMTguODA1ODY3IEMgOTUuNzA1MjAyLDQxLjk0ODA3NiAxMDguNzUsNDMuNSAxMDguNzUsNDcuMTI1IGwgMCwtMC4wMjgzMiBDIDEwOC43NSw0MS44Nzc1NDkgOTIuMTU1OTI4LDI1LjM3NSA4NywyNS4zNzUgeiIKICAgaWQ9InJlY3QzNzY4IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOm9mZnNldCIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC44NDIwMDc4MiIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gOTYgMzIgQyAxMDAgMzIgMTAxLjA2NDk5IDQ3LjE1NDA2NiAxMDEuNzUgNTIuNzUgQyAxMDUuNjAwOTggNTAuMjkyMDMyIDExOS45MzI1MiA1MS45ODg5MjUgMTIwIDU1Ljk2ODc1IEMgMTIwIDUwLjIwOTcwOSAxMDEuNjg5MyAzMiA5NiAzMiB6ICIKICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM4NTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICBpZD0icGF0aDM4NTUiCiAgIGQ9Im0gOTkuMjUsMzQuMTU2MjUgYyAwLjcxNzU0OCwxLjYxNjY2OCAxLjI1NzQ5LDMuNzAzMjg1IDEuNjg3NSw1Ljk2ODc1IDAuNzkwNzgsNC4xNjYxMjYgMS4xNzMxMyw4LjU4MjU3MiAxLjUsMTEuNDY4NzUgMS4wNjY1LC0wLjQwNjA4MyAyLjI3NjQ1LC0wLjY4NjEzOCAzLjcxODc1LC0wLjc4MTI1IDEuOTU5NTUsLTAuMTI5MjIxIDQuMTU1MjgsLTAuMDAzNSA2LjI1LDAuMzEyNSAxLjk5MzMzLDAuMzAwNzM4IDMuODc1MTcsMC43ODY1ODYgNS4zNzUsMS40Njg3NSAtMC40MTgwMiwtMC43NDM0MjEgLTAuODA1NjgsLTEuNDc1MjY5IC0xLjQwNjI1LC0yLjMxMjUgLTEuNzY3MiwtMi40NjM1OTUgLTQuMjI2MjcsLTUuMjY1Njk2IC02Ljg0Mzc1LC03Ljg3NSAtMi42MTc0OCwtMi42MDkzMDQgLTUuNDExMzEsLTUuMDIxOTUxIC03Ljg3NSwtNi43ODEyNSAtMC44Nzc5OCwtMC42MjY5NTYgLTEuNjM0OTEsLTEuMDQyNDEgLTIuNDA2MjUsLTEuNDY4NzUgeiIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLjE4MTI1LC0zLjg5Njg3NSkiIC8+PHBhdGgKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLjE4MTI1LC0zLjg5Njg3NSkiCiAgIGQ9Im0gOTkuMjUsMzQuMTU2MjUgYyAwLjcxNzc3NCwxLjYxNzE3NSAxLjI1NzQ2LDMuNzAzMTM3IDEuNjg3NSw1Ljk2ODc1IDAuNzg4NzEsNC4xNTUyMzggMS4xNzM0NSw4LjU0OTM3OSAxLjUsMTEuNDM3NSAxLjA2MjY3LC0wLjQwMDM1OCAyLjI4Njg2LC0wLjY1NTU3NSAzLjcxODc1LC0wLjc1IDEuOTU5ODgsLTAuMTI5MjQ0IDQuMTU1MDIsLTAuMDM0ODIgNi4yNSwwLjI4MTI1IDEuOTgyNDIsMC4yOTkwOTIgMy44NDc1LDAuODIzNjYyIDUuMzQzNzUsMS41IC0wLjQxNzQ4LC0wLjc0MjE0MSAtMC43NzU2NCwtMS40NzY5NTUgLTEuMzc1LC0yLjMxMjUgLTEuNzY3MDIsLTIuNDYzMzUgLTQuMjI2MzksLTUuMjM0NTY5IC02Ljg0Mzc1LC03Ljg0Mzc1IC0yLjYxNzM2LC0yLjYwOTE4MSAtNS40MTE1NiwtNS4wNTMzNzUgLTcuODc1LC02LjgxMjUgLTAuODc3ODksLTAuNjI2ODk0IC0xLjYzNTAzLC0xLjA0MjUyNSAtMi40MDYyNSwtMS40Njg3NSB6IgogICBpZD0icGF0aDUxNTEiCiAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MTU5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gOTYgMzIgQyAxMDAgMzIgMTAxLjA2NDk5IDQ3LjE1NDA2NiAxMDEuNzUgNTIuNzUgQyAxMDUuNjAwOTggNTAuMjkyMDMyIDExOS45MzI1MiA1MS45ODg5MjUgMTIwIDU1Ljk2ODc1IEMgMTIwIDUwLjIwOTcwOSAxMDEuNjg5MyAzMiA5NiAzMiB6ICIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC44NDU4NzEzMyIKICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6b2Zmc2V0IiAvPjxwYXRoCiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gNjkuNzgxMjUsODQuMjgxMjUgMCwwLjQ1MzEyNSAwLDguMTU2MjUgMC40NTMxMjUsMCAwLC04LjE1NjI1IDMzLjUzMTI1NSwwIDAsLTAuNDUzMTI1IC0zMy41MzEyNTUsMCAtMC40NTMxMjUsMCB6IgogICBpZD0icmVjdDQwNDEiCiAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPjxyZWN0CiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIGlkPSJyZWN0NDA0NiIKICAgd2lkdGg9IjAuNDUzMTI1IgogICBoZWlnaHQ9IjguMTU2MjUiCiAgIHg9Ijg0LjI4MTI1IgogICB5PSI4NC43MzQzNzUiIC8+PHJlY3QKICAgeT0iODguODEyNSIKICAgeD0iLTg0LjI4MTI1IgogICBoZWlnaHQ9IjAuNDUzMTI1IgogICB3aWR0aD0iMTQuMDQ2ODc1IgogICBpZD0icmVjdDQwNDgiCiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiIC8+PHJlY3QKICAgeT0iODQuNzM0Mzc1IgogICB4PSI5NC4yNSIKICAgaGVpZ2h0PSI4LjE1NjI1IgogICB3aWR0aD0iMC40NTMxMjUiCiAgIGlkPSJyZWN0NDA1MCIKICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC40MDIxMTYzNjtzdHJva2U6bm9uZSIgLz48cGF0aAogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC4wOTA2MjUsMC4wOTA2MjUpIgogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQwMjExNjM2O3N0cm9rZTpub25lIgogICBkPSJtIDUyLjc4MTI1LDMzLjI4MTI1IC02LDMuNDY4NzUgYyAtMC4xMTUzNDgsLTAuMDgzNDkgLTAuMjQ1NjY0LC0wLjEyNSAtMC40MDYyNSwtMC4xMjUgLTAuMzEyNDQ2LDAgLTAuNTc2NDE0LDAuMjAzNTE5IC0wLjY4NzUsMC40Njg3NSBsIC03LjE4NzUsMCBDIDM4LjM4NjA5OSwzNi44MzQ3MzkgMzguMTUwODA5LDM2LjYyNSAzNy44NDM3NSwzNi42MjUgYyAtMC4zMDcwNTgsMCAtMC41NDIzNDYsMC4yMDk3NCAtMC42NTYyNSwwLjQ2ODc1IGwgLTcuMTI1LDAgLTAuMDMxMjUsMCAtMi44MTI1LC0xLjY1NjI1IGMgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjUzMTI1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IGwgMS43NSwxIC0xMi41OTM3NSwwIGMgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjQ2ODc1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCBsIDEyLjc4MTI1LDAgLTEuOTM3NSwxLjA5Mzc1IGMgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjUzMTI1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgbCAyLjkzNzUsLTEuNzUgMC4wMzEyNSwwIDcsMCBjIDAuMDc3MDYsMC4xNjQ1MTkgMC4yMTA5MjEsMC4yNzM0OTUgMC4zNzUsMC4zNDM3NSBsIDAsMy41OTM3NSBjIC0yLjc3OTA2MiwwLjE1MDY1OCAtNSwyLjQ2NTEyMiAtNSw1LjI4MTI1IDAsMi44MTYxMyAyLjIyMDkzOCw1LjEzMDU5MiA1LDUuMjgxMjUgbCAwLDQuMzc1IGMgLTIuNzg3MzMsMC4xNDIwNCAtNS4wMzEyNSwyLjQ1OTA4NyAtNS4wMzEyNSw1LjI4MTI1IDAsMi44MjIxNjUgMi4yNDM5Miw1LjEzOTIxIDUuMDMxMjUsNS4yODEyNSBsIDAsNC40MDYyNSBjIC0yLjc4NzMzLDAuMTQyMDQgLTUuMDMxMjUsMi40NTkwODcgLTUuMDMxMjUsNS4yODEyNSAwLDIuODIyMTY1IDIuMjQ0MzksNS4xMDg0MyA1LjAzMTI1LDUuMjUgbCAwLDMuNjUzMTI1IGMgLTAuMTc0MDg4LDAuMDczOTYgLTAuMjk3MTE0LDAuMjM1MTk3IC0wLjM3NSwwLjQwNjI1IGwgLTguODc1LDAgMS45Mzc1LC0xLjEyNSBjIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODUsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjUgYyAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgLTAuMDA2NCwtMC4wMTM2IC0wLjAxNzY1LC0wLjAyNDg2IC0wLjAzMTI1LC0wLjAzMTI1IC0wLjAxMDIxLC0wLjAwMjUgLTAuMDIxMDQsLTAuMDAyNSAtMC4wMzEyNSwwIC0wLjAxMDIxLC0wLjAwMjUgLTAuMDIxMDQsLTAuMDAyNSAtMC4wMzEyNSwwIGwgLTIuODc1LDEuNjU2MjUgYyAtMC4wMTM2LDAuMDA2NCAtMC4wMjQ4NSwwLjAxNzY1IC0wLjAzMTI1LDAuMDMxMjUgbCAtMC4wMzEyNSwwLjA2MjUgLTEwLjAzMTI1LDAgYyAtMC4wMTAyMSwtMC4wMDI1IC0wLjAyMTA0LC0wLjAwMjUgLTAuMDMxMjUsMCAtMC4wMTM2LDAuMDA2NCAtMC4wMjQ4NSwwLjAxNzY1IC0wLjAzMTI1LDAuMDMxMjUgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgbCAwLDAuNDM3NSBjIC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IDAuMDA2NCwwLjAxMzYgMC4wMTc2NSwwLjAyNDg2IDAuMDMxMjUsMC4wMzEyNSAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgbCAxMC4xMjUsMCAwLjAzMTI1LDAgMi44MTI1LDEuNjU2MjUgYyAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgMC4wMTAyMSwwLjAwMjUgMC4wMjEwNCwwLjAwMjUgMC4wMzEyNSwwIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODUsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjUgYyAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgLTAuMDA2NCwtMC4wMTM2IC0wLjAxNzY1LC0wLjAyNDg2IC0wLjAzMTI1LC0wLjAzMTI1IGwgLTEuNzUsLTEuMDMxMjUgOC42ODc1LDAgYyAwLjExMzkwMSwwLjI1OTAxMSAwLjM0OTE5MiwwLjQ2ODc1IDAuNjU2MjUsMC40Njg3NSAwLjMwNzA1OSwwIDAuNTQyMzQ2LC0wLjIwOTc0IDAuNjU2MjUsLTAuNDY4NzUgbCAyNC4wMzEyNSwwIGMgMC4wMTAyMSwwLjAwMjUgMC4wMjEwNCwwLjAwMjUgMC4wMzEyNSwwIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODYsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjQzNzUgMCwtOC44NjU2MjUgQyA2Mi43NzI4MTIsNzcuMjQyNjc0IDYyLjkyMzc5NSw3Ny4wOTAwNzIgNjMsNzYuOTEyNSBsIDMuOTY4NzUsMCBjIDAuMTUwNjY2LDIuNzc4NjMyIDIuNDY1NjAyLDQuOTY4NzUgNS4yODEyNSw0Ljk2ODc1IDIuODE2MTE0LDAgNS4wOTk3NzgsLTIuMTkwODg3IDUuMjUsLTQuOTY4NzUgbCA0LjA2MjUsMCBjIDAuMTA1MzEyLDAuMjc1ODc2IDAuMzY5NjIyLDAuNDY4NzUgMC42ODc1LDAuNDY4NzUgMC40MTE4NDEsMCAwLjc1LC0wLjM0MTEwOSAwLjc1LC0wLjc1IDAsLTAuMzEwNDU5IC0wLjIwMDgwNCwtMC41NzcwNDEgLTAuNDY4NzUsLTAuNjg3NSBsIDAsLTEzLjIxNTYyNSBDIDgyLjc5ODcxNiw2Mi42MTc0MjEgODMsNjIuMzUwODQ4IDgzLDYyLjA0MDYyNSBjIDAsLTAuMzEwMjIyIC0wLjIwMTI4NCwtMC41NzY3OTcgLTAuNDY4NzUsLTAuNjg3NSBsIDAsLTE0LjA2MjUgQyA4Mi43OTIzMDksNDcuMTc2OTkyIDgzLDQ2LjkzOTI0OSA4Myw0Ni42MzQzNzUgYyAwLC0wLjMwNDg3MyAtMC4yMDc2OTEsLTAuNTQyNjE4IC0wLjQ2ODc1LC0wLjY1NjI1IGwgMCwtOC4zNTMxMjUgMCwtMC40Njg3NSBjIDAuMDAyNSwtMC4wMTAyMSAwLjAwMjUsLTAuMDIxMDQgMCwtMC4wMzEyNSAtMC4wMDY0LC0wLjAxMzYgLTAuMDE3NjUsLTAuMDI0ODYgLTAuMDMxMjUsLTAuMDMxMjUgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgbCAtMjcuNjU2MjUsMCBDIDU0LjY5ODU5OSwzNi44MzQ3MzkgNTQuNDYzMzA5LDM2LjYyNSA1NC4xNTYyNSwzNi42MjUgYyAtMC40MTE4NDEsMCAtMC43NSwwLjM0MTExIC0wLjc1LDAuNzUgMCwwLjQwODg5MSAwLjMzODE1OSwwLjc1IDAuNzUsMC43NSAwLjMwMjYzNCwwIDAuNTQxNDYxLC0wLjE4MDA1MSAwLjY1NjI1LC0wLjQzNzUgbCAyNy4xMjUsMCAwLDguMjkwNjI1IGMgLTAuMTY1NzQ1LDAuMDc3MDIgLTAuMjczNDgsMC4yMTIxODQgLTAuMzQzNzUsMC4zNzUgbCAtNC4wMzEyNSwwIGMgLTAuMTUwNjU4LC0yLjc3OTA2MiAtMi40NjUxMiwtNSAtNS4yODEyNSwtNSAtMi44MTYxMjgsMCAtNS4xMzA1OTIsMi4yMjA5MzggLTUuMjgxMjUsNSBsIC00LDAgYyAtMC4xMDUzMTIsLTAuMjc1ODc2IC0wLjM2OTYyMSwtMC40Njg3NSAtMC42ODc1LC0wLjQ2ODc1IC0wLjQxMTg0MSwwIC0wLjc1LDAuMzQxMTEgLTAuNzUsMC43NSAwLDAuMzAwNjUzIDAuMTc3NTksMC41NDE5OCAwLjQzNzUsMC42NTYyNSBsIDAsMTQuMDYyNSBjIC0wLjI2Njg3NiwwLjExMTQ5NSAtMC40Mzc1LDAuMzgxODE2IC0wLjQzNzUsMC42ODc1IDAsMC4zMDU2ODUgMC4xNzA2MjQsMC41NzYwMDUgMC40Mzc1LDAuNjg3NSBsIDAsMTMuMjE1NjI1IGMgLTAuMjY2ODc2LDAuMTExNDk1IC0wLjQzNzUsMC4zODE4MTYgLTAuNDM3NSwwLjY4NzUgMCwwLjMwNTY4NSAwLjE3MDYyNCwwLjU3NjAwNSAwLjQzNzUsMC42ODc1IGwgMCw4LjgwMzEyNSAtMjMuNSwwIGMgLTAuMDc3ODksLTAuMTcxMDUzIC0wLjIwMDkxMSwtMC4zMzIyODggLTAuMzc1LC0wLjQwNjI1IGwgMCwtMy42NTMxMjUgYyAyLjc2NTY3LC0wLjE2MzgxMiA0Ljk2ODc1LC0yLjQ0MzE5MyA0Ljk2ODc1LC01LjI1IDAsLTIuODA2ODA1IC0yLjIwMjYwNywtNS4xMTY5NjggLTQuOTY4NzUsLTUuMjgxMjUgbCAwLC00LjQwNjI1IGMgMi43NjYxNDMsLTAuMTY0MjgyIDQuOTY4NzUsLTIuNDc0NDQzIDQuOTY4NzUsLTUuMjgxMjUgMCwtMi44MDY4MDUgLTIuMjAyNjA3LC01LjExNjk2OCAtNC45Njg3NSwtNS4yODEyNSBsIDAsLTQuMzc1IGMgMi43NzkwNjMsLTAuMTUwNjU4IDUsLTIuNDY1MTIgNSwtNS4yODEyNSAwLC0yLjgxNjEyOCAtMi4yMjA5MzcsLTUuMTMwNTkyIC01LC01LjI4MTI1IGwgMCwtMy41OTM3NSBjIDAuMTY0MDc4LC0wLjA3MDI2IDAuMjk3OTQyLC0wLjE3OTIzIDAuMzc1LC0wLjM0Mzc1IGwgNy4xODc1LDAgYyAwLjExMTg4OSwwLjI2NDY2NiAwLjM3OTU1NywwLjQzNzUgMC42ODc1LDAuNDM3NSAwLjQxMTg0MSwwIDAuNzE4NzUsLTAuMzQ0NzU0IDAuNzE4NzUsLTAuNzUgMCwtMC4wMzQyOCAwLjAwNzUsLTAuMDcxOTkgMCwtMC4wOTM3NSBsIDUuOTY4NzUsLTMuNSBjIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODYsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgMC4wMDI1LC0wLjAxMDIxIDAuMDAyNSwtMC4wMjEwNCAwLC0wLjAzMTI1IEwgNTIuODc1LDMzLjMxMjUgYyAtMC4wMDY0LC0wLjAxMzYgLTAuMDE3NjUsLTAuMDI0ODYgLTAuMDMxMjUsLTAuMDMxMjUgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgeiBtIC0xNC45Mzc1LDguOTA2MjUgYyAxLjE5MzQ4MywwIDIuMjY1NzAyLDAuNDg0MDYyIDMuMDkzNzUsMS4yMTg3NSBsIC0zLjA5Mzc1LDMuMTI1IC0zLjEyNSwtMy4xMjUgYyAwLjgyODY2NiwtMC43MzQxOTkgMS45MzE1MTksLTEuMjE4NzUgMy4xMjUsLTEuMjE4NzUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IGMgMS4xOTM0ODMsMCAyLjI2NTcwMiwwLjQ4NDA2MiAzLjA5Mzc1LDEuMjE4NzUgbCAtMy4wOTM3NSwzLjEyNSAtMy4xMjUsLTMuMTI1IGMgMC44Mjg2NjYsLTAuNzM0MTk5IDEuOTMxNTE5LC0xLjIxODc1IDMuMTI1LC0xLjIxODc1IHogbSAtMzcuOTM3NSwxLjg2NTYyNSAzLjEyNSwzLjEyNSBMIDM0LjM0Mzc1LDUwIEMgMzMuNjA5MDYyLDQ5LjE3MTk1MiAzMy4xMjUsNDguMDk5NzMzIDMzLjEyNSw0Ni45MDYyNSBjIDAsLTEuMTkzNDgxIDAuNDg0NTUxLC0yLjI5NjMzNCAxLjIxODc1LC0zLjEyNSB6IG0gNi45Njg3NSwwIGMgMC43MzQxOTksMC44Mjg2NjYgMS4yMTg3NSwxLjkzMTUxOSAxLjIxODc1LDMuMTI1IDAsMS4xOTM0ODMgLTAuNDg0MDYyLDIuMjY1NzAyIC0xLjIxODc1LDMuMDkzNzUgbCAtMy4wOTM3NSwtMy4wOTM3NSAzLjA5Mzc1LC0zLjEyNSB6IG0gMjcuNDY4NzUsLTAuMjcxODc1IDMuMTI1LDMuMTI1IC0zLjEyNSwzLjA5Mzc1IGMgLTAuNzM0Njg4LC0wLjgyODA0OCAtMS4yMTg3NSwtMS45MDAyNjcgLTEuMjE4NzUsLTMuMDkzNzUgMCwtMS4xOTM0ODEgMC40ODQ1NTEsLTIuMjk2MzM0IDEuMjE4NzUsLTMuMTI1IHogbSA2Ljk2ODc1LDAgYyAwLjczNDE5OSwwLjgyODY2NiAxLjIxODc1LDEuOTMxNTE5IDEuMjE4NzUsMy4xMjUgMCwxLjE5MzQ4MyAtMC40ODQwNjIsMi4yNjU3MDIgLTEuMjE4NzUsMy4wOTM3NSBsIC0zLjA5Mzc1LC0zLjA5Mzc1IDMuMDkzNzUsLTMuMTI1IHogbSAtMTIuNzUsMy40MDYyNSA0LDAgYyAwLjE1MDY1OCwyLjc3OTA2MyAyLjQ2NTEyMiw1IDUuMjgxMjUsNSAyLjgxNjEzLDAgNS4xMzA1OTIsLTIuMjIwOTM3IDUuMjgxMjUsLTUgbCA0LjAzMTI1LDAgYyAwLjA3MDI3LDAuMTYyODE1IDAuMTc4MDA0LDAuMjk3OTg1IDAuMzQzNzUsMC4zNzUgbCAwLDE0LjA2MjUgYyAtMC4xNjkyODMsMC4wNzA4MyAtMC4yNzAxNzEsMC4yMDkzOTUgLTAuMzQzNzUsMC4zNzUgbCAtNC4wNjI1LDAgYyAwLjAwMTYsLTAuMDUyOTkgMCwtMC4xMDI4ODIgMCwtMC4xNTYyNSAwLC0yLjkxMzI2IC0yLjM2Nzk5LC01LjI4MTI1IC01LjI4MTI1LC01LjI4MTI1IC0yLjkxMzI2LDAgLTUuMjgxMjUsMi4zNjc5OSAtNS4yODEyNSw1LjI4MTI1IDAsMC4wNTI2NCAtMi42MmUtNCwwLjEwMzE0MiAwLDAuMTU2MjUgbCAtMy45Njg3NSwwIGMgLTAuMDc1MzYsLTAuMTcyMjQgLTAuMjM3MzU3LC0wLjI3MTQzMyAtMC40MDYyNSwtMC4zNDM3NSBsIDAsLTE0LjA5Mzc1IGMgMC4xNzI2NDgsLTAuMDc3NzQgMC4zMzIxNDQsLTAuMjAyMjEzIDAuNDA2MjUsLTAuMzc1IHogTSAzNy44NDM3NSw0Ny4yODEyNSA0MC45Mzc1LDUwLjM3NSBjIC0wLjgyODA0OCwwLjczNDY4OCAtMS45MDAyNjcsMS4yMTg3NSAtMy4wOTM3NSwxLjIxODc1IC0xLjE5MzQ4MSwwIC0yLjI5NjMzNCwtMC40ODQ1NTEgLTMuMTI1LC0xLjIxODc1IGwgMy4xMjUsLTMuMDkzNzUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IDMuMDkzNzUsMy4wOTM3NSBjIC0wLjgyODA0OCwwLjczNDY4OCAtMS45MDAyNjcsMS4yMTg3NSAtMy4wOTM3NSwxLjIxODc1IC0xLjE5MzQ4MSwwIC0yLjI5NjMzNCwtMC40ODQ1NTEgLTMuMTI1LC0xLjIxODc1IGwgMy4xMjUsLTMuMDkzNzUgeiBNIDM3LjgxMjUsNTcuMTU2MjUgYyAxLjE3OTY3NiwwIDIuMjM4MjI3LDAuNDY4Mjg5IDMuMDYyNSwxLjE4NzUgbCAtMy4wMzEyNSwzLjA2MjUgLTMuMDYyNSwtMy4wNjI1IGMgMC44MjIxODYsLTAuNzExODEzIDEuODU5ODUsLTEuMTg3NSAzLjAzMTI1LC0xLjE4NzUgeiBNIDcyLjI1LDU2Ljg4NDM3NSBjIDEuMTc5Njc2LDAgMi4yMzgyMjcsMC40NjgyODkgMy4wNjI1LDEuMTg3NSBsIC0zLjAzMTI1LDMuMDYyNSAtMy4wNjI1LC0zLjA2MjUgYyAwLjgyMjE4NiwtMC43MTE4MTMgMS44NTk4NSwtMS4xODc1IDMuMDMxMjUsLTEuMTg3NSB6IG0gLTM3Ljg3NSwxLjgwMzEyNSAzLjA5Mzc1LDMuMDkzNzUgLTMuMTg3NSwzLjE1NjI1IGMgLTAuMDA0NSwtMC4wMDUyIC0wLjAyNjgyLDAuMDA1MiAtMC4wMzEyNSwwIC0wLjcwOTM0NCwtMC44Mjc3NTQgLTEuMTI1LC0xLjkyMDYzOCAtMS4xMjUsLTMuMDkzNzUgMCwtMS4yMTY1ODYgMC40OTEyMTQsLTIuMzIyNjE3IDEuMjUsLTMuMTU2MjUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IDMuMDkzNzUsMy4wOTM3NSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTIgLTAuMDI2ODIsMC4wMDUyIC0wLjAzMTI1LDAgLTAuNzA5MzQ0LC0wLjgyNzc1NCAtMS4xMjUsLTEuOTIwNjM4IC0xLjEyNSwtMy4wOTM3NSAwLC0xLjIxNjU4NiAwLjQ5MTIxNCwtMi4zMjI2MTcgMS4yNSwtMy4xNTYyNSB6IE0gNDEuMjUsNTguNzE4NzUgYyAwLjc1MTU1MiwwLjgzMTgzNSAxLjI1LDEuOTE2MzY2IDEuMjUsMy4xMjUgMCwxLjE2NjQwMyAtMC40ODA0MjgsMi4yMDk5OCAtMS4xODc1LDMuMDMxMjUgTCAzOC4yMTg3NSw2MS43ODEyNSA0MS4yNSw1OC43MTg3NSB6IG0gMzQuNDM3NSwtMC4yNzE4NzUgYyAwLjc1MTU1MiwwLjgzMTgzNSAxLjI1LDEuOTE2MzY2IDEuMjUsMy4xMjUgMCwxLjE2NjQwMyAtMC40ODA0MjgsMi4yMDk5OCAtMS4xODc1LDMuMDMxMjUgbCAtMy4wOTM3NSwtMy4wOTM3NSAzLjAzMTI1LC0zLjA2MjUgeiBNIDM3Ljg0Mzc1LDYyLjEyNSBsIDMuMTI1LDMuMTU2MjUgYyAtMC44Mjk2ODEsMC43Nzk4MDEgLTEuOTMwNTYzLDEuMjgxMjUgLTMuMTU2MjUsMS4yODEyNSAtMS4yMTU4MjksMCAtMi4zMjQ1NzMsLTAuNDU1MDc2IC0zLjE1NjI1LC0xLjIxODc1IDAuMDAyNSwtMC4wMTAyMSAwLjAwMjUsLTAuMDIxMDQgMCwtMC4wMzEyNSBsIDMuMTg3NSwtMy4xODc1IHogbSAzNC40Mzc1LC0wLjI3MTg3NSAzLjEyNSwzLjE1NjI1IGMgLTAuODI5NjgxLDAuNzc5ODAxIC0xLjkzMDU2MywxLjI4MTI1IC0zLjE1NjI1LDEuMjgxMjUgLTEuMjE1ODI5LDAgLTIuMzI0NTczLC0wLjQ1NTA3NiAtMy4xNTYyNSwtMS4yMTg3NSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAzLjE4NzUsLTMuMTg3NSB6IE0gNjMsNjIuMzIxODc1IGwgNC4wMzEyNSwwIGMgMC4zNjcyNjgsMi41NTU3ODIgMi41NjIzNzUsNC41MzEyNSA1LjIxODc1LDQuNTMxMjUgMi42NTU5ODgsMCA0Ljg1MDAxNSwtMS45NzU2MyA1LjIxODc1LC00LjUzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCBsIDQuMDkzNzUsMCBjIDAuMDcyMzMsMC4xNjc1OTQgMC4xNzAwODMsMC4zMzEwMyAwLjM0Mzc1LDAuNDA2MjUgbCAwLDEzLjIxNTYyNSBjIC0wLjE2OTYzMywwLjA3MDcgLTAuMjcwMTY5LDAuMjA5MjUgLTAuMzQzNzUsMC4zNzUgbCAtNC4wOTM3NSwwIEMgNzcuMzM0MDk3LDczLjU1Mzc2NCA3NS4wNTU4OTYsNzEuMzUgNzIuMjUsNzEuMzUgYyAtMi44MTU2NDgsMCAtNS4xMzA1ODQsMi4xOTAxMTkgLTUuMjgxMjUsNC45Njg3NSBsIC0zLjk2ODc1LDAgQyA2Mi45MjQ2NCw3Ni4xNDY1MSA2Mi43NjI2NDMsNzYuMDQ3MzE3IDYyLjU5Mzc1LDc1Ljk3NSBsIDAsLTEzLjI0Njg3NSBDIDYyLjc3MjgxMiw2Mi42NTIwNDkgNjIuOTIzNzk1LDYyLjQ5OTQ0NyA2Myw2Mi4zMjE4NzUgeiBNIDM3LjgxMjUsNzIuMTI1IGMgMS4xODA3NjgsMCAyLjIzODg3MiwwLjQzODczMyAzLjA2MjUsMS4xNTYyNSBsIC0zLjAzMTI1LDMuMDYyNSAtMy4wNjI1LC0zLjA2MjUgQyAzNS42MDI3ODIsNzIuNTcxMTM0IDM2LjY0LDcyLjEyNSAzNy44MTI1LDcyLjEyNSB6IE0gNzIuMjUsNzEuOTQzNzUgYyAxLjE4MDc2OCwwIDIuMjM4ODcyLDAuNDM4NzMzIDMuMDYyNSwxLjE1NjI1IEwgNzIuMjgxMjUsNzYuMTYyNSA2OS4yMTg3NSw3My4xIEMgNzAuMDQwMjgyLDcyLjM4OTg4NCA3MS4wNzc1LDcxLjk0Mzc1IDcyLjI1LDcxLjk0Mzc1IHogbSAtMzcuODc1LDEuNzEyNSAzLjA5Mzc1LDMuMDYyNSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTEgLTAuMDI2ODIsMC4wMDUxIC0wLjAzMTI1LDAgLTAuNzA5Mjc2LC0wLjgyMDc0OCAtMS4xMjUsLTEuODg5Mzg4IC0xLjEyNSwtMy4wNjI1IDAsLTEuMjE2NTg2IDAuNDkxMjE0LC0yLjMyMjYxNyAxLjI1LC0zLjE1NjI1IHogbSA2Ljg3NSwwIGMgMC43NTEwNiwwLjgzMjQ1OSAxLjI1LDEuOTQ3NjE1IDEuMjUsMy4xNTYyNSAwLDEuMTY2NDAzIC0wLjQ3OTk0NiwyLjE3OTMzNyAtMS4xODc1LDMgTCAzOC4yMTg3NSw3Ni43MTg3NSA0MS4yNSw3My42NTYyNSB6IG0gMjcuNTYyNSwtMC4xODEyNSAzLjA5Mzc1LDMuMDYyNSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTEgLTAuMDI2ODIsMC4wMDUxIC0wLjAzMTI1LDAgLTAuNzA5Mjc2LC0wLjgyMDc0OCAtMS4xMjUsLTEuODg5Mzg4IC0xLjEyNSwtMy4wNjI1IDAsLTEuMjE2NTg2IDAuNDkxMjE0LC0yLjMyMjYxNyAxLjI1LC0zLjE1NjI1IHogbSA2Ljg3NSwwIGMgMC43NTEwNiwwLjgzMjQ1OSAxLjI1LDEuOTQ3NjE1IDEuMjUsMy4xNTYyNSAwLDEuMTY2NDAzIC0wLjQ3OTk0NiwyLjE3OTMzNyAtMS4xODc1LDMgTCA3Mi42NTYyNSw3Ni41Mzc1IDc1LjY4NzUsNzMuNDc1IHogbSAtMzcuODQzNzUsMy42MTg3NSAzLjEyNSwzLjEyNSBDIDQwLjEzOTA2OSw4MC45OTg1NTEgMzkuMDM4MTg3LDgxLjUgMzcuODEyNSw4MS41IGMgLTEuMjE5MzAyLDAgLTIuMzIzODc5LC0wLjQ1ODc5MiAtMy4xNTYyNSwtMS4yMTg3NSAtMC4wMDUsLTAuMDA0NiAwLjAwNSwtMC4wMjY2NiAwLC0wLjAzMTI1IGwgMy4xODc1LC0zLjE1NjI1IHogbSAzNC40Mzc1LC0wLjE4MTI1IDMuMTI1LDMuMTI1IGMgLTAuODI5NjgxLDAuNzc5ODAxIC0xLjkzMDU2MywxLjI4MTI1IC0zLjE1NjI1LDEuMjgxMjUgLTEuMjE5MzAyLDAgLTIuMzIzODc5LC0wLjQ1ODc5MiAtMy4xNTYyNSwtMS4yMTg3NSAtMC4wMDUsLTAuMDA0NiAwLjAwNSwtMC4wMjY2NiAwLC0wLjAzMTI1IGwgMy4xODc1LC0zLjE1NjI1IHoiCiAgIGlkPSJwYXRoNTM5NiIKICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY3NjY3NjY2Njc3NzY2NzY2Njc3NjY3NzY2Njc2Njc3NzY2NjY2Njc2Njc2Njc2NjY2Njc2Njc3NzY2NjY2Nzc2Njc3NjY2Njc3NzY2NzY2Njc2Njc3NjY2NjY3NjY3NzY2NzY2NzY2Njc3NjY3Nzc2NjY2Njc2Njc3NjY3NjY3NjY2NjY3NjY3NjY3NjY2Njc3NjY3NzY2Nzc2NjY2NjY2NjY2NjY2Njc2Njc2NjY2NjY3NjY3NjY2NjY3NjY2NjY2Nzc3NjY2NjY2Njc2NjY2NzY2NjY2NjY2NjY2NjY2Njc3NjY2Njc3NjY3NjY2Njc2NjY2Njc2NjY2Njc2NjY2Njc2NjY2NjY2NzY2NjY2NjY2NjY2NjY2NjY2Njc3NjY3NjY2NjY2Nzc2Njc2NjY2Njc3NjY2Njc3NjYyIgLz48cmVjdAogICBzdHlsZT0ib3BhY2l0eTowLjg3MTI4NzA5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1MzExKSIKICAgaWQ9InJlY3Q1Mjg3IgogICB3aWR0aD0iMTAiCiAgIGhlaWdodD0iMSIKICAgeD0iMTciCiAgIHk9IjExOCIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NTE1NjI1LDAsMCwwLjkwNjI1LC0xLjA0MjE4NzUsLTMuNjI1KSIKICAgcnk9IjAuNSIgLz48cGF0aAogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjYyIKICAgaWQ9InBhdGg0MTk3IgogICBkPSJtIDcuMjUsMjUuMzc1IDc5LjY2MDYwNiwwIEMgOTAuNjI1LDI1LjM3NSAxMDguNzUsNDEuODY2MDc4IDEwOC43NSw0Ny4wOTE5MTggbCAwLDUwLjc4MzA4MiAtMTAxLjUsMCAwLC03Mi41IHoiCiAgIHN0eWxlPSJvcGFjaXR5OjAuMDM0NjUzNDk7ZmlsbDp1cmwoI3BhdHRlcm41MTQ5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz48cGF0aAogICBzdHlsZT0ib3BhY2l0eTowLjg3MTI4NzA5O2ZpbGw6IzAwNjE5YTtmaWxsLW9wYWNpdHk6MC44NDY1NjA4NTtzdHJva2U6bm9uZSIKICAgZD0ibSAxMDIuNjYxMTMsODUuODM4ODY3IGMgLTAuMDk3MSwwLjA0NTMgLTAuMTg2LDAuMDk2MzEgLTAuMjgzMiwwLjE0MTYwMiAtMC43MTY2MywwLjMzOSAtMS40MzU4OCwwLjY4MTc0OSAtMi4xMjQwMiwxLjA3NjE3MiAtMC4yNTU2NTcsMC4xNTcwOCAtMC40MjkwMzIsMC4yNTk4MDMgLTAuNjc5NjkxLDAuNDI0ODA0IC0wLjQyNjA5MiwwLjI4MDQ5NCAtMC44MzMzNDIsMC41OTg4NDEgLTEuMjE3Nzc0LDAuOTM0NTcxIC0wLjIzMzM2OCwwLjIxMzM4NSAtMC4yODk1MzgsMC4yNTg5ODggLTAuNTA5NzY1LDAuNDgxNDQ1IC0wLjI2NjAzOSwwLjI2ODczIC0wLjUxMjQ4NSwwLjUzOTc2MiAtMC43NjQ2NDksMC44MjEyODkgLTAuMDY0MzQsMC4wNzc3NiAtMC4xMzQwOTgsMC4xNDg2NTIgLTAuMTk4MjQyLDAuMjI2NTYyIDAuMDA3MywtMC4xMTI1MDEgMC4wMjA3NSwtMC4yMjc0NDEgMC4wMjgzNywtMC4zMzk4NDMgMC4wNDU4NiwtMC42MDMwMSAwLjA5NDI2LC0xLjE4NzkwNCAwLjE5ODI0MiwtMS43ODQxOCAwLjAxNjc2LC0wLjA4NTE5IDAuMDM4NDIsLTAuMTcwMDAzIDAuMDU2NjQsLTAuMjU0ODgzIDAuMDM2ODgsLTAuMTcxNzcgMC4wODk3MiwtMC4zNDE4MjggMC4xNDE2MDEsLTAuNTA5NzY1IC0wLjExODE4NCwtMC4xMDM2NDMgLTAuMjUyODI2LC0wLjE5Nzk1MyAtMC41MDk3NjYsLTAuNDgxNDQ2IC0wLjAyMTc1LDAuMDkzMjIgLTAuMDM5NDIsMC4xODkwMTcgLTAuMDU2NjQsMC4yODMyMDMgLTAuMDE3MzEsMC4wOTQyMSAtMC4wNDE0MiwwLjE4ODY0NSAtMC4wNTY2NCwwLjI4MzIwNCAtMC4wOTQwNSwwLjYwNTYxIC0wLjEzOTcxNiwxLjIwMjY0OCAtMC4xOTgyNDIsMS44MTI1IC0wLjAzNjcsMC40MDQ4NzYgLTAuMDgxNDcsMC44MTI0NzEgLTAuMTEzMjgxLDEuMjE3NzczIC0wLjAzMzA4LDAuNDAyNzI4IC0wLjAyNjkyLDAuNDA2NTggMC4xNjk5MjIsMS4wNDc4NTIgMC4wMTAzMywwLjAzMzUzIDAuMDQ5OTMsMC4wMjUxOSAwLjA4NDkxLDAuMDI4MzYgMC4xMjk4NTcsMC4wMTM2OCAwLjE1MDksLTAuMDA2MyAwLjI1NDg4MywtMC4wNTY2NCAwLjAyMzkzLC0wLjAyMjExIDAuMDYyNzEsLTAuMDMyODEgMC4wODQ5MiwtMC4wNTY2NCAwLjA4OTA4LC0wLjA5NTE0IDAuMTUyMzIyLC0wLjIwNTE2NiAwLjIyNjU2MiwtMC4zMTE1MjMgMC4xNjg5OTgsLTAuMjQyMTQxIDAuMDQxMjQsLTAuMDQ0MjMgMC4yMjY1NjMsLTAuMzExNTI0IDAuMjgxMSwtMC40MDY5OTcgMC41ODcwMzIsLTAuODA5MDE4IDAuOTM0NTcsLTEuMTYxMTMzIDAuMDgxMDIsLTAuMDgyMTEgMC4xNzIyMDYsLTAuMTQ2MDk2IDAuMjU0ODgzLC0wLjIyNjU2MiAwLjQ2NzMxNywtMC40MzQ3MSAwLjk2NDA1OSwtMC44MTY5NzYgMS41MDA5NzQsLTEuMTYxMTMzIDAuMTEzMzEsLTAuMDcyNTkgMC4yMjU0NiwtMC4xNTU2OTQgMC4zMzk4NCwtMC4yMjY1NjMgMC41Njg3MiwtMC4zNDg4NzkgMS4xNzE3NiwtMC42NDI4ODQgMS43ODQxOCwtMC45MDYyNSAwLjEwNTI3LC0wLjA0NTI3IDAuMjM0MTksLTAuMDY5MDUgMC4zMzk4NSwtMC4xMTMyODEgMC4wOTc5LC0wLjAzOTI5IDAuMTg1MywtMC4xMDIzMDEgMC4yODMyLC0wLjE0MTYwMSAwLDAgLTAuMTk4MjQsLTAuNzM2MzI4IC0wLjE5ODI0LC0wLjczNjMyOCB6IgogICBpZD0icGF0aDU2ODgiCiAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3Nzc3Nzc3NjY3Nzc3Nzc3Nzc3Nzc3Nzc3NjYyIgLz48ZwogICBpZD0ibGF5ZXI0IgogICBpbmtzY2FwZTpsYWJlbD0iYm94IgogICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjQzMzkyMywwLDAsMC42NDMzOTIzLDI4Ni42MDcwMSw4Ni4xMDEyMjUpIiAvPjxnCiAgIGlkPSJsYXllcjUiCiAgIGlua3NjYXBlOmxhYmVsPSJ6aXBfYXBwIgogICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjQzMzkyMywwLDAsMC42NDMzOTIzLDI4Ni42MDcwMSw4Ni4xMDEyMjUpIiAvPjxyZWN0CiAgIHN0eWxlPSJvcGFjaXR5OjAuNTc3ODY4ODk7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICBpZD0icmVjdDEzMjciCiAgIHdpZHRoPSIwLjY0MzM5MjMyIgogICBoZWlnaHQ9IjAiCiAgIHg9IjI4Ny4xOTkwNyIKICAgeT0iOTYuNDc3Njc2IiAvPjxwYXRoCiAgIHN0eWxlPSJvcGFjaXR5OjAuODcxMjg3MDk7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTI3Myk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNTI4MykiCiAgIGQ9Im0gMzAsNDUgMCw2MyAtMTQsMTEgMTEsMCAxNCwtMTEgMCwtNjMgLTExLDAgeiIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLC00LjUzMTI1KSIKICAgaWQ9InJlY3Q1MjQ2IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiIC8+PGcKICAgaWQ9Imc1MTI5IgogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjE4MTI1LC0zLjYyNSkiPjxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtNS40Mzc1KSIKICAgICBpZD0iZzUwODAiPjxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTM2Nik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICBpZD0icGF0aDUwNDkiCiAgICAgICBzb2RpcG9kaTpjeD0iMTE1LjUiCiAgICAgICBzb2RpcG9kaTpjeT0iMTAuMDU5NjE0IgogICAgICAgc29kaXBvZGk6cng9IjAuNSIKICAgICAgIHNvZGlwb2RpOnJ5PSIwLjUiCiAgICAgICBkPSJtIDExNiwxMC4wNTk2MTQgYyAwLDAuMjc2MTQzIC0wLjIyMzg2LDAuNSAtMC41LDAuNSAtMC4yNzYxNCwwIC0wLjUsLTAuMjIzODU3IC0wLjUsLTAuNSAwLC0wLjI3NjE0MjIgMC4yMjM4NiwtMC40OTk5OTk4IDAuNSwtMC40OTk5OTk4IDAuMjc2MTQsMCAwLjUsMC4yMjM4NTc2IDAuNSwwLjQ5OTk5OTggeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzU5Mzc2MywwLDAsMS4zNTkzNzUsLTEzNy4yOTcwMywxLjA1MTc3NDQpIiAvPjxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHJ4PSIwIgogICAgICAgeT0iMTkuOTQwMzg2IgogICAgICAgeD0iMTcuMjI4MTMiCiAgICAgICBoZWlnaHQ9IjQuMDc5Njg5IgogICAgICAgd2lkdGg9IjUiCiAgICAgICBpZD0icmVjdDQ5MjIiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM2OCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MzcwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDk1MCIKICAgICAgIHdpZHRoPSI1IgogICAgICAgaGVpZ2h0PSI0LjA3OTY4OSIKICAgICAgIHg9IjE3LjIyODEzIgogICAgICAgeT0iMTkuOTQwMzg2IgogICAgICAgcng9IjAiCiAgICAgICByeT0iMCIgLz48cmVjdAogICAgICAgcnk9IjAuMTU3MDU2NiIKICAgICAgIHJ4PSIxLjA2MTkxNDYiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgtMC45OTk5OTk5NCwzLjU1Mzc2MDhlLTQsMC4wMDY2MDYzOSwwLjk5OTk3ODE4LDAsMCkiCiAgICAgICB5PSIyMy41NDU2OTYiCiAgICAgICB4PSItMjMuNTk4Mjg4IgogICAgICAgaGVpZ2h0PSIwLjQ0MjY3MSIKICAgICAgIHdpZHRoPSI4LjA1NzA5NjUiCiAgICAgICBpZD0icmVjdDQ5MDgiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM3Mik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzc0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDkyNiIKICAgICAgIHdpZHRoPSIxLjM1OTM4IgogICAgICAgaGVpZ2h0PSI1LjI1NDg4MjgiCiAgICAgICB4PSIxOS4wMzEyNSIKICAgICAgIHk9IjE0LjY4NTUwMiIKICAgICAgIHJ4PSIwIgogICAgICAgcnk9IjAiIC8+PHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmUiCiAgICAgICBkPSJtIDI0LjcyNjM2NSwxMTEuOTI2OTEgMC42MDE3NiwtNjQuOTg2NTI0IC0xMS4xLDAgMC40OTk5OSw2NC45NDg1NjQgOS45OTgyNSwwLjAzOCB6IgogICAgICAgaWQ9InBhdGgzNzgzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIGlkPSJwYXRoMzc5NSIKICAgICAgIGQ9Im0gMjQuNDU3ODU1LDExMS45MjU5MSAwLjU0MjAzLC02NC45NTE0NDUgLTIuOTgzOTYsLTAuMDI3NTggLTAuMTkyMjMsNjQuOTY5MDE1IDIuNjM0MTYsMC4wMSB6IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC40MjU3NDI1OTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzc2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiCiAgICAgICBpZD0icGF0aDM3ODUiCiAgICAgICBkPSJtIDE0Mi41Mjc5NywxMjkuNjM1NjIgMC4wMzg5LC05NC41MjI2OTEgLTIuNzgzODEsLTAuMDM5MDMgMC4yODc0Nyw5NC41NDgxOTEgMi40NTczOSwwLjAxMzUgNWUtNSwzZS01IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM3OCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDgzOCkiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwwLDAuODI0Mzg1MiwtMTIzLjQyMzQ4LDUuOTg4MTAxOCkiIC8+PHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNDI1NzQyNTk7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM4MCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDg2MikiCiAgICAgICBkPSJtIDE0Ni42MDQzMywxMjkuNzcxNzggMC4zMTI2MywtOTQuNzM0Njc1IC0xLjE0MDIyLC0wLjAyOTk4IDAuMDM5Myw5NC43NjAzMjUgMC43ODgyNywwLjAwNCB6IgogICAgICAgaWQ9InBhdGgzODA1IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTk0MDM2MiwwLDAsMC42ODU2MjMzLC0xMjMuNDIzNDgsMjIuOTQzMTU1KSIgLz48cmVjdAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzODIpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgaWQ9InJlY3QzNzczIgogICAgICAgd2lkdGg9IjEwLjAwMTQ0OSIKICAgICAgIGhlaWdodD0iMi41NjI2MTE2IgogICAgICAgeD0iLTI0Ljg4NTkyOSIKICAgICAgIHk9Ii0xMTIuOTE1ODIiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgtMC45OTk5OTg2MywtMC4wMDE2NTczNSwwLjAwMTQxNjYsLTAuOTk5OTk5LDAsMCkiCiAgICAgICByeD0iMS4zMTgxNzc2IgogICAgICAgcnk9IjAuOTA5MTk3NTEiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzg0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDg2NiIKICAgICAgIHdpZHRoPSIxMS4wOTQwMTkiCiAgICAgICBoZWlnaHQ9IjExLjk5OTk5OCIKICAgICAgIHg9IjE0LjIzNjM3NSIKICAgICAgIHk9IjM0Ljk0MDM4NCIKICAgICAgIHJ4PSIwIgogICAgICAgcnk9IjAiIC8+PHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiCiAgICAgICBpZD0icGF0aDQ5MDQiCiAgICAgICBkPSJtIDIzLjcyNjM2NSwyMy43MTQ3MTcgMS42MDE3NiwxMS4yMjU2NjkgLTExLjEsMCAxLjQ5OTk5LC0xMS4yMTkxMTEgNy45OTgyNSwtMC4wMDY2IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjQyNTc0MjU5O2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzODYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAyMy4zMDg4MDUsMjMuNzE0ODkyIDEuNjkwNTksMTEuMjE5NjA3IC0yLjk4MzQ3LDAuMDA0OCAtMC44NDExLC0xMS4yMjI2NDMgMi4xMzM5OCwtMC4wMDE3IHoiCiAgICAgICBpZD0icGF0aDQ5MDYiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwwLjAwNzQ2ODc1LC0wLjExODQzMzUsLTEyNC4wMzg5OSwzOS4wODU2MykiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM4OCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDgzOCkiCiAgICAgICBkPSJtIDE0Mi4xMjU1NywxMjkuNzQ5MzUgMC40NDEzNSwtOTQuNjM2NDIxIC0yLjc4MzgxLC0wLjAzOTAzIDAuMjg3NDcsOTQuNjYxOTIxIDIuMDU0OTksMC4wMTM1IHoiCiAgICAgICBpZD0icGF0aDQ5MTAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwtMC4wMDc0NjE3MSwtMC4xMTg0MzM1LC0xMjMuMTYyMjQsMzkuMDg1NjMpIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIGlkPSJwYXRoNDkxMiIKICAgICAgIGQ9Im0gMTQ2LjYwNDMzLDEyOS43NzE3OCAwLjMxMjYzLC05NC43MzQ2NzUgLTEuMTQwMjIsLTAuMDI5OTggMC4wMzkzLDk0Ljc2MDMyNSAwLjc4ODI3LDAuMDA0IHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjQyNTc0MjU5O2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzOTApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjQ4NjIpIiAvPjxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHJ4PSIwIgogICAgICAgeT0iLTIxLjU0NjY1OSIKICAgICAgIHg9IjE3LjIyODEzIgogICAgICAgaGVpZ2h0PSIxLjYwNjI3NDYiCiAgICAgICB3aWR0aD0iNSIKICAgICAgIGlkPSJyZWN0NDk2MCIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MzkyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMSwtMSkiIC8+PHJlY3QKICAgICAgIHJ5PSIwIgogICAgICAgcng9IjAiCiAgICAgICB5PSItMTA5LjY1NjI1IgogICAgICAgeD0iMTQuNjk4MjQyIgogICAgICAgaGVpZ2h0PSIzLjYyNSIKICAgICAgIHdpZHRoPSIxMC4wNjc4NzEiCiAgICAgICBpZD0icmVjdDQzNTgiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM5NCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDEsLTEpIiAvPjwvZz48L2c+PHJlY3QKICAgc3R5bGU9Im9wYWNpdHk6MC41MDk5MDA5ODtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ1MzA5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1Mjk5KSIKICAgaWQ9InJlY3Q1MjkzIgogICB3aWR0aD0iOS40OTk5OTYyIgogICBoZWlnaHQ9IjEuMDAwMDA0OCIKICAgeD0iMTciCiAgIHk9IjExNyIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLC0zLjYyNSkiCiAgIHJ5PSIwLjI1IiAvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"qelectrotech,qelectrotech\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"qelectrotech.Qelectrotech\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"qElectrotech\"\nLABEL oc.displayname=\"qElectrotech\"\nLABEL oc.path=\"/usr/bin/qelectrotech\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"qElectrotech\"\nENV APPBIN \"/usr/bin/qelectrotech\"\nENV APP \"/usr/bin/qelectrotech\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/qelectrotech/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/qelectrotech/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application qElectrotech

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/qElectrotech.d\n
"},{"location":"applications/qelectrotech/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f qElectrotech.d -t qElectrotech .\n
"},{"location":"applications/qelectrotech/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect qElectrotech > qElectrotech.json\ndocker image save qElectrotech -o qElectrotech.tar\nctr -n k8s.io images import qElectrotech.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @qElectrotech.json\n\n
"},{"location":"applications/remarkable/","title":"remarkable","text":""},{"location":"applications/remarkable/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/remarkable/#displayname","title":"Displayname","text":"
Remarkable\n
"},{"location":"applications/remarkable/#path","title":"Path","text":"
/usr/bin/remarkable\n
"},{"location":"applications/remarkable/#mimetype","title":"Mimetype","text":"
text/x-markdown;text/markdown;\n
"},{"location":"applications/remarkable/#file-extensions","title":"File extensions","text":"

\"md;markdown\"

"},{"location":"applications/remarkable/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"md;markdown\"

"},{"location":"applications/remarkable/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/remarkable/#wm_class","title":"WM_CLASS","text":"
remarkable.Remarkable\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/remarkable/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/remarkable.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/remarkable/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\nRUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install  --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/remarkable/#json-dump","title":"JSON dump","text":"

json source file remarkable.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\",\n        \"RUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install  --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"remarkable.svg\",\n    \"keyword\": \"markdown,editor\",\n    \"launch\": \"remarkable.Remarkable\",\n    \"name\": \"remarkable\",\n    \"displayname\": \"Remarkable\",\n    \"path\": \"/usr/bin/remarkable\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/x-markdown;text/markdown;\",\n    \"legacyfileextensions\": \"md;markdown\",\n    \"fileextensions\": \"md;markdown\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/remarkable.desktop\",\n    \"usedefaultapplication\": true\n}\n
"},{"location":"applications/remarkable/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output remarkable.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remarkable.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remarkable.d.3.0.json\n\n
"},{"location":"applications/remarkable/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\nRUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install  --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"remarkable.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMjgiCiAgIHZpZXdCb3g9IjAgMCAzNi4xMjQ0NDUgMzYuMTI0NDQ1IgogICBoZWlnaHQ9IjEyOCIKICAgaWQ9InN2ZzIiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40OC40IHI5OTM5IgogICBzb2RpcG9kaTpkb2NuYW1lPSJyZW1hcmthYmxlLnN2ZyI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMjgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTMwMSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3NDQiCiAgICAgaWQ9Im5hbWVkdmlldzI2IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTpzbmFwLWdsb2JhbD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iNCIKICAgICBpbmtzY2FwZTpjeD0iNjkuMzA2MTI3IgogICAgIGlua3NjYXBlOmN5PSI1OS4wMjI0MTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjY1IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzIiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIHR5cGU9Inh5Z3JpZCIKICAgICAgIGlkPSJncmlkMzc3NyIKICAgICAgIGVtcHNwYWNpbmc9IjUiCiAgICAgICB2aXNpYmxlPSJ0cnVlIgogICAgICAgZW5hYmxlZD0idHJ1ZSIKICAgICAgIHNuYXB2aXNpYmxlZ3JpZGxpbmVzb25seT0idHJ1ZSIgLz4KICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ0NjAiPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MzUwNGQiCiAgICAgICAgIGlkPSJzdG9wNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI2ZTZhIgogICAgICAgICBpZD0ic3RvcDkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY4OTAwIgogICAgICAgICBpZD0ic3RvcDEyIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmE1M2QiCiAgICAgICAgIGlkPSJzdG9wMTQiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDU4LDAsMCwwLjA1MjU3LC0xLjU3NDkyLC0xLjQxNzQyKSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQwMzgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTUwIgogICAgICAgeTE9IjIxMiIKICAgICAgIHkyPSIxMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgyPSIwIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTA1MjUsMCwwLDEuMTA1MjUsLTEzNC4yNzg3NCwtMjk1Ljc2MTgzKSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ0NjAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NDMxIgogICAgICAgeTE9IjI3OS4wOTYwMSIKICAgICAgIHkyPSIyNjguMzI5OTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgyPSIwIiAvPgogIDwvZGVmcz4KICA8ZwogICAgIHN0eWxlPSJmaWxsOiM0Y2MxZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQiCiAgICAgaWQ9ImcxOCIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjc4MjY1NjMsMCwwLDIuNzgyNjU2MywtMC43ODQ3MDkwOSwtMC43ODQ3MDkxNSkiPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMi45ODIiCiAgICAgICB4PSIwLjI4MjAwMDAxIgogICAgICAgeT0iMC4yODIwMDAwMSIKICAgICAgIHJ4PSI2LjQ5MTAwMDIiCiAgICAgICBoZWlnaHQ9IjEyLjk4MiIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNTtmaWxsOiM0Y2MxZmY7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDIwIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMS44NTMiCiAgICAgICB4PSIwLjg0NyIKICAgICAgIHk9IjAuODQ3IgogICAgICAgcng9IjUuOTI2MDAwMSIKICAgICAgIGhlaWdodD0iMTEuODUzIgogICAgICAgc3R5bGU9ImZpbGw6IzRjYzFmZjtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0MjIiIC8+CiAgPC9nPgogIDxnCiAgICAgc3R5bGU9ImZvbnQtc2l6ZTozMS40MTMwOTkyOXB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpTYW5zIgogICAgIGlkPSJ0ZXh0Mzc3MyI+CiAgICA8cGF0aAogICAgICAgZD0ibSAyOS42ODM1NDIsMTIuMDEyMTQxIGMgLTIuNGUtNSwwLjc4MjI3NSAtMC41NTIyMDcsMS45NDY0NiAtMS42NTY1NSwzLjQ5MjU2IC0wLjIyMDg5NiwwLjMxMjkxNSAtMC45NTI1MzgsMC43Njg0NjYgLTIuMTk0OTI5LDEuMzY2NjU0IC0wLjI5NDUxOCwwLjM1ODkyOSAtMC44Njk3MDgsMC44MDA2NzUgLTEuNzI1NTczLDEuMzI1MjQgLTAuNjM1MDI5LDAuMTkzMjczIC0xLjU0MTUyOSwwLjUwMTU3NSAtMi43MTk1MDMsMC45MjQ5MDcgLTAuMzk1NzQ3LDAuMjMwMDg0IC0wLjk3NTUzOSwwLjUyOTE4MyAtMS43MzkzNzgsMC44OTcyOTggLTAuMTE5NjUzLDAuMDI3NjIgLTEuMDUzNzYzLDAuMTc5NDY3IC0yLjgwMjMzLDAuNDU1NTUxIC0xLjM5ODg3NSwwLjIyMDg4IC0yLjA5ODMwNiwwLjUwNjE3NSAtMi4wOTgyOTcsMC44NTU4ODQgLTllLTYsMC4zMjIxMTMgMC42MDI3OSwwLjkxMTEwOCAxLjgwODQwMSwxLjc2Njk4NyAwLjk4NDcxNSwwLjY5OTQzNiAxLjY1NjUzNywxLjEyNzM3OCAyLjAxNTQ2OSwxLjI4MzgyNiAwLjk4NDcxMywwLjQzMjU0NyAyLjYyMjg1NSwxLjE3MzM5MiA0LjkxNDQzMiwyLjIyMjUzOCBsIDIuMzc0Mzg4LDAuNzg2ODYyIGMgMS4wNTgzMywwLjQ3ODU1OCAxLjYwMTMxLDEuMDQ5MTQ3IDEuNjI4OTQxLDEuNzExNzY4IC0wLjE2NTY3NywwLjMwMzY5OSAtMC40MTQxNTksMC40NTU1NDkgLTAuNzQ1NDQ4LDAuNDU1NTUxIC0wLjAwOTIsLTJlLTYgLTAuMTkzMjg1LC0wLjAzNjgxIC0wLjU1MjE4MywtMC4xMTA0MzYgLTAuMzU4OTM5LC0wLjA2NDQyIC0wLjU3NTIxMSwtMC4wOTY2MyAtMC42NDg4MTUsLTAuMDk2NjMgLTEuMjcwMDQxLC0xZS02IC0yLjQzODgyOCwtMC4yNDM4ODIgLTMuNTA2MzY1LC0wLjczMTY0MyAtMC4wNjQ0NCwtMC4wMDkyIC0xLjEwODk4MywtMC40ODc3NjIgLTMuMTMzNjQsLTEuNDM1Njc2IC0wLjQxNDE1MSwtMC4yNTc2ODUgLTEuMDM1MzU2LC0wLjY1ODAxOCAtMS44NjM2MTksLTEuMjAwOTk5IC0wLjY4MTAzNywtMC40NDE3NDUgLTEuMTczNCwtMC44NjA0ODMgLTEuNDc3MDksLTEuMjU2MjE3IC0wLjExOTY1LC0wLjAwOTIgLTAuMjg1MzA1LC0wLjA0MTQxIC0wLjQ5Njk2NSwtMC4wOTY2MyAtMC4zMDM3MTEsLTAuNDY5MzUzIC0xLjE1MDM5MSwtMS4xMjczNzEgLTIuNTQwMDQ0LC0xLjk3NDA1NiAtMS4xNjg3OTQsLTAuNzI3MDM2IC0xLjc1MzE4NywtMS4zMDIyMjYgLTEuNzUzMTgyLC0xLjcyNTU3MyAwLjA1NTIxLC0wLjEzODAzOSAwLjIzMDA3MSwtMC41NzUxODQgMC41MjQ1NzQsLTEuMzExNDM1IDEuODMxNDAxLC0wLjM5NTcyMyA0LjE1OTc3MSwtMC45Mzg3MDMgNi45ODUxMiwtMS42Mjg5NDEgMC4yODUyODEsLTAuMDU1MjEgMC45ODQ3MTMsLTAuMjE2MjYyIDIuMDk4Mjk2LC0wLjQ4MzE2IDAuNzE3ODIzLC0wLjE3NDg0OCAxLjk2OTQzNywtMC44NjUwNzcgMy43NTQ4NDcsLTIuMDcwNjg4IDIuMjM2MzIyLC0xLjUxODQ5MSAzLjM1NDQ5MiwtMi43NzkzMDggMy4zNTQ1MTQsLTMuNzgyNDU2IC0yLjJlLTUsLTAuODkyNjggLTAuMzkxMTUxLC0xLjcwNzE0OTMgLTEuMTczMzksLTIuNDQzNDExMyBDIDI1LjUzMjk0NCw4LjQ2NDM4MjIgMjQuNTc1ODI3LDguMDA0MjI5OCAyMy40NDM4Nyw3LjgyOTM1MjMgMjIuOTE5Mjc4LDcuNjE3NzAxOSAyMi42MDE3NzMsNy41MTE4NjY4IDIyLjQ5MTM1NCw3LjUxMTg0NjggYyAtMC4xODQwNzgsMmUtNSAtMC41MjQ1OTEsLTAuMDA0NTggLTEuMDIxNTQsLTAuMDEzODA0IC0wLjYwNzQxNywtMC4wMDkxOCAtMS4wOTk3OCwtMC4wMTM3ODUgLTEuNDc3MDksLTAuMDEzODA1IGwgLTEuNjg0MTU5LC0wLjAxMzgwNSBjIC0wLjEyODg1NiwyZS01IC0wLjE5MzI3NywwLjAxMzgyNSAtMC4xOTMyNjQsMC4wNDE0MTQgLTEuM2UtNSwwLjA5MjA1MSAtMC4wMTM4MiwwLjE1MTg3MDMgLTAuMDQxNDEsMC4xNzk0NTk2IC0wLjI1NzY5OCwtMC4wMDkxOCAtMC40OTIzNzYsLTAuMDEzNzg1IC0wLjcwNDAzNCwtMC4wMTM4MDQgLTAuNjM1MDIyLDEuOThlLTUgLTEuMDUzNzYxLDAuMDI3NjI5IC0xLjI1NjIxNywwLjA4MjgyNyAtMC40NTA5NiwwLjEzODA2NTQgLTEuMTk2NDA3LDAuNDIzMzU5OCAtMi4yMzYzNDMsMC44NTU4ODQyIC0wLjUyNDU4MiwwLjEzODA2NDUgLTEuMTc3OTk4LDAuMzIyMTI1NSAtMS45NjAyNTEsMC41NTIxODMzIC0wLjY4MTAzMSwwLjMwMzcxODkgLTEuMDY3NTU5LDAuNjAyODE3OSAtMS4xNTk1ODUsMC44OTcyOTgxIC0wLjU0Mjk4NSwxLjc2NzAwMiAtMC45MTExMDY1LDMuODYwNjk1IC0xLjEwNDM2NjMsNi4yODEwODUgMC4wMzY4MDgsMC40OTY5NzYgMC4wNTUyMTQsMS4yNTYyMjcgMC4wNTUyMTgsMi4yNzc3NTcgLTQuMmUtNiwwLjE2NTY2NCAtNC4yZS02LDAuMzQwNTIxIDAsMC41MjQ1NzQgLTAuMDY0NDI2LDAuMTQ3MjU3IC0wLjE2MTA1NzUsMC4zODE5MzUgLTAuMjg5ODk2MiwwLjcwNDAzNCAtMC4xOTMyNjc5LDAuODc0Mjk3IC0wLjI4OTg5OTksMS42NDI3NTEgLTAuMjg5ODk2MywyLjMwNTM2NSAtMy42ZS02LDAuMTc0ODYzIDAuMDA0NiwwLjM0MDUxOCAwLjAxMzgwNSwwLjQ5Njk2NSBsIDAuMDgyODI4LDAuODY5Njg5IGMgMC4wMjc2MDUsMC4zNDk3MiAwLjA0MTQxLDAuODU1ODg3IDAuMDQxNDE0LDEuNTE4NTA0IC0zLjhlLTYsMS40MzU2NzggLTAuMjcxNDkzNywyLjE1MzUxNiAtMC44MTQ0NzA1LDIuMTUzNTE1IC0yLjllLTYsMWUtNiAtMC4xOTc4Njg0LC0wLjA2OTAyIC0wLjU5MzU5NzEsLTAuMjA3MDY4IEMgNy40NzE5NjQ1LDI2Ljg0Mjg2NiA3LjI0NjQ4OTgsMjYuNzY5MjQyIDcuMTgyMDcwMiwyNi43NjkyNDEgNi45ODg4MDQ1LDI1Ljc0NzcwNCA2Ljg5MjE3MjUsMjQuMDQ1MTQgNi44OTIxNzM5LDIxLjY2MTU0NSBjIC0xLjRlLTYsLTAuMDkyMDIgMC4wNzgyMjQsLTAuODQ2Njc0IDAuMjM0Njc4LC0yLjI2Mzk1MSAwLjIwMjQ2NTQsLTEuOTMyNjMyIDAuMzkxMTI3OCwtMy40NzQxNDMgMC41NjU5ODc5LC00LjYyNDUzNiAwLjE5MzI2MTgsLTAuNjI1Nzk1IDAuMzkxMTI3MywtMS4zNzEyNDEgMC41OTM1OTcxLC0yLjIzNjM0MyBsIDAsLTAuNjYyNjIgYyAtMC4xMzgwNDg1LC0wLjEzODAzIC0wLjIyNTQ3NzQsLTAuMjExNjU0IC0wLjI2MjI4NzEsLTAuMjIwODczIC0yLjVlLTYsMS42ZS01IC0wLjE0MjY0OTcsMC4wNjkwNCAtMC40Mjc5NDIxLDAuMjA3MDY5IEMgNy4zMjAxMTQyLDExLjk4OTE0OSA3LjE0OTg1NzksMTIuMDUzNTcgNy4wODU0MzgxLDEyLjA1MzU1NSA2LjkxMDU3ODYsMTIuMDUzNTcgNi43NDk1MjUzLDExLjg4NzkxNiA2LjYwMjI3NzcsMTEuNTU2NTkgNi41MDEwNDMxLDExLjM0NDkzNiA2LjQ1MDQyNjMsMTEuMTY1NDc2IDYuNDUwNDI3MywxMS4wMTgyMTEgNi40NTA0MjYzLDEwLjAzMzUwMiA2LjcyMTkxNjIsOS4yMzI4MzY1IDcuMjY0ODk3Nyw4LjYxNjIxMzYgNy42NDIyMjA5LDguMTkyODkyMyA4LjQ3NTA5NjYsNy41Mzk0NzYgOS43NjM1Mjc0LDYuNjU1OTYyNyA5LjkwMTU2ODgsNi41NjM5NTMgMTEuMDk3OTY1LDYuMjk3MDY0NyAxMy4zNTI3MTksNS44NTUyOTY4IGMgMi4zMDk5NTcsLTAuNDMyNTIxNiAzLjg4MzY3OCwtMC42NDg3OTMyIDQuNzIxMTY4LC0wLjY0ODgxNTQgMS44NDA1OTcsMi4yMmUtNSAzLjU5ODM3OCwwLjA4Mjg1IDUuMjczMzUxLDAuMjQ4NDgyNSAwLjExOTYyMiwwLjEwMTI1NTUgMC4zMjIwODksMC4xOTMyODYgMC42MDc0MDIsMC4yNzYwOTE2IDAuODc0MjcxLDAuMDA5MjIgMS45MDUwMTIsMC40OTIzODQ4IDMuMDkyMjI2LDEuNDQ5NDgxMyAxLjE4NzE3MiwwLjk1NzEzNzIgMS44Nzc0LDEuODU0NDM0MiAyLjA3MDY4OCwyLjY5MTg5MzkgLTIuNGUtNSwwLjAxODQyNCAwLjA2NDQsMC4xNjEwNzEzIDAuMTkzMjY0LDAuNDI3OTQyMyAwLjEyODgxOSwwLjI2NjkwNSAwLjE5MzI0LDAuNDE0MTU0IDAuMTkzMjY0LDAuNDQxNzQ2IC0yLjRlLTUsMC4wMzY4MyAwLjAzMjE5LDAuMjQzODk4IDAuMDk2NjMsMC42MjEyMDcgMC4wNTUxOSwwLjM5NTc0NyAwLjA4MjgsMC42MTIwMTggMC4wODI4MywwLjY0ODgxNSIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MjguMjcxNzg3NjRweDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiNmZmZmZmY7Zm9udC1mYW1pbHk6RGFuaWVsOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246RGFuaWVsIEJvbGQiCiAgICAgICBpZD0icGF0aDI5OTYiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"remarkable,markdown,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"remarkable.desktop\"\nLABEL oc.launch=\"remarkable.Remarkable\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"remarkable\"\nLABEL oc.displayname=\"Remarkable\"\nLABEL oc.path=\"/usr/bin/remarkable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/x-markdown;text/markdown;\"\nLABEL oc.fileextensions=\"md;markdown\"\nLABEL oc.legacyfileextensions=\"md;markdown\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remarkable\"\nENV APPBIN \"/usr/bin/remarkable\"\nENV APP \"/usr/bin/remarkable\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/remarkable/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remarkable/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application remarkable

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remarkable.d\n
"},{"location":"applications/remarkable/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f remarkable.d -t remarkable .\n
"},{"location":"applications/remarkable/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect remarkable > remarkable.json\ndocker image save remarkable -o remarkable.tar\nctr -n k8s.io images import remarkable.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remarkable.json\n\n
"},{"location":"applications/remmina/","title":"remmina","text":""},{"location":"applications/remmina/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/remmina/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/remmina/#ubuntu-packages","title":"Ubuntu packages","text":"
remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice\n
"},{"location":"applications/remmina/#displayname","title":"Displayname","text":"
Remmina\n
"},{"location":"applications/remmina/#path","title":"Path","text":"
/usr/bin/remmina\n
"},{"location":"applications/remmina/#mimetype","title":"Mimetype","text":"
application/x-remmina;\n
"},{"location":"applications/remmina/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/remmina/#wm_class","title":"WM_CLASS","text":"
remmina.Remmina\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/remmina/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/remmina-file.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/remmina/#json-dump","title":"JSON dump","text":"

json source file remmina.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice\",\n    \"icon\": \"remmina.svg\",\n    \"keyword\": \"rdp,tsclient\",\n    \"launch\": \"remmina.Remmina\",\n    \"name\": \"remmina\",\n    \"displayname\": \"Remmina\",\n    \"args\": \"\",\n    \"path\": \"/usr/bin/remmina\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"application/x-remmina;\",\n    \"desktopfile\": \"/usr/share/applications/remmina-file.desktop\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"usedefaultapplication\": true\n}\n
"},{"location":"applications/remmina/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output remmina.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remmina.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remmina.d.3.0.json\n\n
"},{"location":"applications/remmina/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"remmina.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmVyc2lvbj0iMS4xIj4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMwOC4zKSI+CiAgPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iMTIiIGN5PSIzMjAuMyIgcj0iOSIvPgogIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMSIgZD0ibSA4LDMxNS4xMzM5NyB2IDIuNDI1NzggTCA5Ljg2MTMyODEsMzE4Ljc5OTk4IDgsMzIwLjA0MDIyIHYgMi40MjU3OCBsIDUuNSwtMy42NjYwMiB6Ii8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzIwYWE3MyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwzMDguMykiIGQ9Ik0gOCA2LjMzMzk4NDQgTCA4IDguNzU5NzY1NiBMIDkuODYxMzI4MSAxMCBMIDggMTEuMjQwMjM0IEwgOCAxMy42NjYwMTYgTCAxMy41IDEwIEwgOCA2LjMzMzk4NDQgeiIvPgogIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMSIgZD0ibSAxNiwzMTkuMTMzOTcgLTUuNSwzLjY2NjAxIDUuNSwzLjY2NjAyIHYgLTIuNDI1NzggTCAxNC4xNDA2MjUsMzIyLjc5OTk4IDE2LDMyMS41NTk3NSBaIi8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzM5ODlkYSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwzMDguMykiIGQ9Ik0gMTYgMTAuMzMzOTg0IEwgMTAuNSAxNCBMIDE2IDE3LjY2NjAxNiBMIDE2IDE1LjI0MDIzNCBMIDE0LjE0MDYyNSAxNCBMIDE2IDEyLjc1OTc2NiBMIDE2IDEwLjMzMzk4NCB6Ii8+CiAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4yIiBkPSJtIDIwLjc0OTAyNCwzMTUuOTcyODUgLTEuNjgxNjQxLDEuMTE5MTQgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDIwLDMyMC43OTk5OSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDEyLDMyOC44IDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS44NDQ3MjY1LDMyNS44ODg4NiBMIDQuMTY4OTQ1MiwzMjcuMDA0MSBDIDYuMDAyMTQ2NSwzMjkuMzEzNjMgOC44MjkxMTc0LDMzMC44IDEyLDMzMC44IGMgNS41MTM5NTYsMCAxMCwtNC40ODU3OCAxMCwtMTAuMDAwMDEgMCwtMS43NTA3MSAtMC40NTcwMDEsLTMuMzk0NDUgLTEuMjUwOTc2LC00LjgyNzE0IHoiLz4KICA8cGF0aCBzdHlsZT0iZmlsbDojMjBhYTczIiBkPSJtIDIwLjc0OTAyNCwzMTUuNDcyODUgLTEuNjgxNjQxLDEuMTE5MTQgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDIwLDMyMC4yOTk5OSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDEyLDMyOC4zIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS44NDQ3MjY1LDMyNS4zODg4NiBMIDQuMTY4OTQ1MiwzMjYuNTA0MSBDIDYuMDAyMTQ2NSwzMjguODEzNjMgOC44MjkxMTc0LDMzMC4zIDEyLDMzMC4zIGMgNS41MTM5NTYsMCAxMCwtNC40ODU3OCAxMCwtMTAuMDAwMDEgMCwtMS43NTA3MSAtMC40NTcwMDEsLTMuMzk0NDUgLTEuMjUwOTc2LC00LjgyNzE0IHoiLz4KICA8cGF0aCBzdHlsZT0ib3BhY2l0eTowLjIiIGQ9Im0gMTIsMzEwLjc5OTk5IGMgLTUuNTE0MjE2OSwwIC0xMCw0LjQ4NTc5IC0xMCwxMCAwLDEuNjI3MzYgMC4zOTIwMjYzLDMuMTY0MTEgMS4wODQ5NjA5LDQuNTIzNDUgTCA0Ljc3NDQxNCwzMjQuMTk5NDEgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDQsMzIwLjc5OTk5IGEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMSA4LC04IDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS45Mjc3MzQsMi42NDc0NyBsIDEuNjg1NTQ3LC0xLjEyMTEgQyAxNy43Nzc4MiwzMTIuMTcwNzIgMTUuMDQ2MDQ5LDMxMC43OTk5OSAxMiwzMTAuNzk5OTkgWiIvPgogIDxwYXRoIHN0eWxlPSJmaWxsOiMzOTg5ZGEiIGQ9Im0gMTIsMzEwLjMgYyAtNS41MTQyMTY5LDAgLTEwLDQuNDg1NzggLTEwLDkuOTk5OTkgMCwxLjYyNzM2IDAuMzkyMDI2MywzLjE2NDExIDEuMDg0OTYwOSw0LjUyMzQ1IEwgNC43NzQ0MTQsMzIzLjY5OTQxIEEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMSA0LDMyMC4yOTk5OSBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgOCwtOCA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDUuOTI3NzM0LDIuNjQ3NDcgbCAxLjY4NTU0NywtMS4xMjExIEMgMTcuNzc3ODIsMzExLjY3MDcyIDE1LjA0NjA0OSwzMTAuMyAxMiwzMTAuMyBaIi8+CiAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4yO2ZpbGw6I2ZmZmZmZiIgZD0ibSAxMiwzMTAuMyBjIC01LjUxNDIxNjksMCAtMTAsNC40ODU3OCAtMTAsOS45OTk5OSAwLDAuMDc1MSAwLjAwNTE3LDAuMTQ4OSAwLjAwNjg0LDAuMjIzNjQgMC4xNDczNDM4LC01LjM4NjU1IDQuNTcxNjU5MSwtOS43MjM2NCA5Ljk5MzE2NCwtOS43MjM2NCAyLjg5NTE0MiwwIDUuNTA0NDUsMS4yNDAzMSA3LjMzMjAzMSwzLjIxMzg3IGwgMC4yODEyNSwtMC4xODc1IEMgMTcuNzc3ODIsMzExLjY3MDcyIDE1LjA0NjA0OSwzMTAuMyAxMiwzMTAuMyBaIE0gNC4wMDg3ODksMzIwLjYyNTE5IEEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMCA0LDMyMC43OTk5OSBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDAgMC42MTEzMjgxLDMuMDA3ODIgbCAwLjE2MzA4NTksLTAuMTA4NCBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgLTAuNzY1NjI1LC0zLjA3NDIyIHoiLz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"remmina,rdp,tsclient\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"remmina-file.desktop\"\nLABEL oc.launch=\"remmina.Remmina\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"remmina\"\nLABEL oc.displayname=\"Remmina\"\nLABEL oc.path=\"/usr/bin/remmina\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-remmina;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remmina\"\nENV APPBIN \"/usr/bin/remmina\"\nENV APP \"/usr/bin/remmina\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/remmina/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remmina/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application remmina

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remmina.d\n
"},{"location":"applications/remmina/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f remmina.d -t remmina .\n
"},{"location":"applications/remmina/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect remmina > remmina.json\ndocker image save remmina -o remmina.tar\nctr -n k8s.io images import remmina.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remmina.json\n\n
"},{"location":"applications/remotedesktopmanager/","title":"remotedesktopmanager","text":""},{"location":"applications/remotedesktopmanager/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/remotedesktopmanager/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/remotedesktopmanager/#ubuntu-packages","title":"Ubuntu packages","text":"
gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common\n
"},{"location":"applications/remotedesktopmanager/#licence","title":"Licence","text":"

** This application is NO FREE. ** You need to build it manually.

"},{"location":"applications/remotedesktopmanager/#displayname","title":"Displayname","text":"
RemoteDesktop\n
"},{"location":"applications/remotedesktopmanager/#path","title":"Path","text":"
/bin/remotedesktopmanager.free\n
"},{"location":"applications/remotedesktopmanager/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/remotedesktopmanager/#wm_class","title":"WM_CLASS","text":"
RemoteDesktopManager.Free.RemoteDesktopManager.Free\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/remotedesktopmanager/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/remotedesktopmanager.free.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/remotedesktopmanager/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\nRUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\nCOPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\n
"},{"location":"applications/remotedesktopmanager/#json-dump","title":"JSON dump","text":"

json source file remotedesktopmanager.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"licence\": \"non-free\",\n    \"debpackage\": \"gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common\",\n    \"icon\": \"circle-remotedesktopmanager.svg\",\n    \"keyword\": \"remote,desktop,ssh\",\n    \"launch\": \"RemoteDesktopManager.Free.RemoteDesktopManager.Free\",\n    \"name\": \"remotedesktopmanager\",\n    \"displayname\": \"RemoteDesktop\",\n    \"path\": \"/bin/remotedesktopmanager.free\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"\",\n    \"desktopfile\": \"/usr/share/applications/remotedesktopmanager.free.desktop\",\n    \"preruncommands\": [\n        \"RUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\",\n        \"RUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\",\n        \"COPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\"\n    ]\n}\n
"},{"location":"applications/remotedesktopmanager/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output remotedesktopmanager.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remotedesktopmanager.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remotedesktopmanager.d.3.0.json\n\n
"},{"location":"applications/remotedesktopmanager/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\nRUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\nCOPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle-remotedesktopmanager.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJjLTMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjQxOTk5ODc0Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiLTYiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlLTMiIHgxPSI1MTkuMiIgeDI9IjUxOS4yIiB5MT0iMTAyNC44IiB5Mj0iNC44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wNjM1ODYgMCAwIC4wNjM1ODMgLS41NTYxNyAtLjU1MjcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2MDYwNjAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDE0MTQxIiBvZmZzZXQ9Ii4wMTk1NTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFlMWUxZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnLTUiIHg9Ii0uMDMxNjUyIiB5PSItLjA0MTk0NyIgd2lkdGg9IjEuMDYzMyIgaGVpZ2h0PSIxLjA4MzkiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNjEwNjU4NDIiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYtNiIgeDE9IjQwOS41NyIgeDI9IjQwOS45NCIgeTE9IjU0Mi44IiB5Mj0iNTA0LjE5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDUyMywwLDAsMS4wMjc2LC03Mi41NjgsLTguNjkzMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg2ZDBmYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNzk0ZjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjLTMpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiLTYpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTUwLjI0OSA4LjE5MzJxLTMuODU5Ny0yLjk3MjUtOC40NDQtNC41NTU3LTQuNzM3Mi0xLjYzNzMtOS44MDIxLTEuNjM3M2MtMTYuNTcgMC0zMC4wMDMgMTMuNDMyLTMwLjAwMyAzMC4wMDEgMCAxNS4xNTggMTEuMjQ1IDI3LjY4NCAyNS44NDUgMjkuNzA5IDAuNzEyMTYgMC4wOTg1NSAxLjQzMzkgMC4xNzQ4NSAyLjE1ODcgMC4yMTkzNiAwLjY2MTI4IDAuMDQxMzMgMS4zMjU4IDAuMDY5OTQgMS45OTk4IDAuMDY5OTQgMTYuNTY3IDAgMjkuOTk3LTEzLjQzMiAyOS45OTctMjkuOTk5IDAtMS4zMDk4LTAuMDgyNjYtMi42MDM3LTAuMjQ0ODEtMy44NjU4LTAuMTg3NTgtMS40NzUxLTAuNDkyNzktMi45MDktMC44ODM4Ny00LjMwNDZxLTEuMzI4OS00LjY4OTItNC4wODIyLTguNzI2NS0yLjcyMTUtMy45NzcxLTYuNTQwMS02LjkxMTJ6IiBmaWxsPSJ1cmwoI2UtMykiIHN0cm9rZS13aWR0aD0iLjk5NzI0Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguNDY1ODYgLS4wNTU1NjYgLjA1NzI1OCAuNDUyMDkgLTIwOS40MSAtMTUzLjYzKSI+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWx0ZXI9InVybCgjZy01KSIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWxsPSJ1cmwoI2YtNikiLz4KICA8ZyBmaWxsPSIjZDVmZmZmIj4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDk4LjM1IiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ4OS44MyIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODEuMzEiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICA8L2c+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNiwxNikiIGZpbGw9IiNmZmYiPgogIDxwYXRoIGQ9Im0xNiAxMmE5IDkgMCAwIDAtNy44NzcgNC42NjhjMC4xMjkgMC4zNjQgMC4zNTcgMC42NzcgMC42NTYgMC45MDhhOCA4IDAgMCAxIDcuMjIxLTQuNTc2IDQgNCAwIDAgMC00IDQgNCA0IDAgMCAwIDQgNCA0IDQgMCAwIDAgNC00IDQgNCAwIDAgMC0zLjY1LTMuOTgyIDggOCAwIDAgMSA2Ljg3IDQuNTU4YzAuMzAyLTAuMjM0IDAuNTMzLTAuNTUgMC42Ni0wLjkxOGE5IDkgMCAwIDAtNy44OC00LjY1OHptMCAyYTMgMyAwIDAgMSAzIDMgMyAzIDAgMCAxLTMgMyAzIDMgMCAwIDEtMy0zIDMgMyAwIDAgMSAzLTN6bTAgMWEyIDIgMCAwIDAtMiAyIDIgMiAwIDAgMCAyIDIgMiAyIDAgMCAwIDItMiAyIDIgMCAwIDAtMC4wOS0wLjU4OCAxIDEgMCAwIDEtMC45MSAwLjU4OCAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMSAwLjU5LTAuOTEgMiAyIDAgMCAwLTAuNTktMC4wOXoiLz4KICA8cGF0aCBkPSJtOCAxMXYxMWg3djJoLTN2MWg4di0xaC0zdi0yaDd2LTExaC0xNXptMSAxaDE0djloLTE0eiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"remotedesktopmanager,remote,desktop,ssh\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"remotedesktopmanager.free.desktop\"\nLABEL oc.launch=\"RemoteDesktopManager.Free.RemoteDesktopManager.Free\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"remotedesktopmanager\"\nLABEL oc.displayname=\"RemoteDesktop\"\nLABEL oc.path=\"/bin/remotedesktopmanager.free\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remotedesktopmanager\"\nENV APPBIN \"/bin/remotedesktopmanager.free\"\nENV APP \"/bin/remotedesktopmanager.free\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/remotedesktopmanager/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remotedesktopmanager/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application remotedesktopmanager

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remotedesktopmanager.d\n
"},{"location":"applications/remotedesktopmanager/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f remotedesktopmanager.d -t remotedesktopmanager .\n
"},{"location":"applications/remotedesktopmanager/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect remotedesktopmanager > remotedesktopmanager.json\ndocker image save remotedesktopmanager -o remotedesktopmanager.tar\nctr -n k8s.io images import remotedesktopmanager.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remotedesktopmanager.json\n\n
"},{"location":"applications/rhythmbox/","title":"rhythmbox","text":""},{"location":"applications/rhythmbox/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/rhythmbox/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/rhythmbox/#alpine-packages","title":"Alpine packages","text":"
rhythmbox\n
"},{"location":"applications/rhythmbox/#path","title":"Path","text":"
/usr/bin/rhythmbox\n
"},{"location":"applications/rhythmbox/#mimetype","title":"Mimetype","text":"
application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\n
"},{"location":"applications/rhythmbox/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/rhythmbox/#wm_class","title":"WM_CLASS","text":"
rhythmbox.Rhythmbox\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/rhythmbox/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Rhythmbox3.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/rhythmbox/#json-dump","title":"JSON dump","text":"

json source file rhythmbox.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"rhythmbox\",\n    \"icon\": \"circle_rhythmbox.svg\",\n    \"keyword\": \"rhythmbox,audio;song;mp3;cd;podcast;MTP;playlist;last.fm;dlna;radio;\",\n    \"launch\": \"rhythmbox.Rhythmbox\",\n    \"name\": \"rhythmbox\",\n    \"path\": \"/usr/bin/rhythmbox\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Rhythmbox3.desktop\"\n}\n
"},{"location":"applications/rhythmbox/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output rhythmbox.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/rhythmbox.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @rhythmbox.d.3.0.json\n\n
"},{"location":"applications/rhythmbox/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update rhythmbox\nLABEL oc.icon=\"circle_rhythmbox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iIzRjNGM0YyIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzJhMmEyYSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSI1MjAiIHgyPSI1MjAiIHkxPSIyNCIgeTI9IjEwMDQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTM3OS42NSAtNDg1LjkzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+PGxpbmVhckdyYWRpZW50IGlkPSJnIiB4MT0iMzk4Ljk1IiB4Mj0iMzk4Ljk1IiB5MT0iMTEzLjQxIiB5Mj0iOTEzLjQxIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00MzAuMjIgLTUwNi4zMykgc2NhbGUoMS4wMjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZWRmMmQiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNDhkMDEiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iNTU4Ljk1IiB4Mj0iNTU4Ljk1IiB5MT0iMjEzLjQxIiB5Mj0iODEzLjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC45OCAwIDAgLjk4IC00MDcuNTkgLTQ4NC45MSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iYiI+PHN0b3Agb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iayIgeDE9IjUyOC45NSIgeDI9IjUyOC45NSIgeTE9IjM2MS4wNiIgeTI9IjY4OC41MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtNDY3LjU4IC01NDEuNjgpIHNjYWxlKDEuMDg4OSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxsaW5lYXJHcmFkaWVudCBpZD0ibCIgeDE9IjU1OC45NSIgeDI9IjU1OC45NSIgeTE9IjIxMy40MSIgeTI9IjgxMy40MSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYgMCAwIC4wNiAtMS4wNTcgLjcxNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC01MTAuNjQgLTY2My41Mikgc2NhbGUoMS4zMjc2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNlNmU2ZTYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGZpbHRlciBpZD0iaiIgeD0iLS4zNiIgeT0iLS4zNiIgd2lkdGg9IjEuNzIiIGhlaWdodD0iMS43MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzMCIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDgxIiB5PSItLjA4MSIgd2lkdGg9IjEuMTYyIiBoZWlnaHQ9IjEuMTYyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMzLjEyNCIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii44OSIvPjwvZmlsdGVyPjxyYWRpYWxHcmFkaWVudCBpZD0iaCIgY3g9IjU1MC45NSIgY3k9IjUyMS40MSIgcj0iNDI1IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00MzAuMjIgLTUwNi4zMykgc2NhbGUoMS4wMjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZThjMDYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZWE5MzMiIG9mZnNldD0iMSIvPjwvcmFkaWFsR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zODkuMzIgLTQ4OS45Mikgc2NhbGUoMS4wMTE1KSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIvPjxyZWN0IHg9IjEuOTgzIiB5PSIxLjk3OCIgd2lkdGg9IjU5Ljk5NyIgaGVpZ2h0PSI1OS45OTciIHJ5PSIyOS45OTgiIGZpbGw9InVybCgjZCkiLz48ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDM2NzMgMCAwIC4wMzY3MyAyNy4xMzggMzguMDQyKSI+PGNpcmNsZSBjeD0iMTMyLjM1IiBjeT0iMjYuMDc0IiByPSI0OTAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+PGNpcmNsZSBjeD0iMTMyLjM1IiBjeT0iMjYuMDc0IiByPSI0OTAiIGZpbGw9InVybCgjZikiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjQwOC40MyIgZmlsbD0idXJsKCNnKSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9InVybCgjaCkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iNTQuMjQ1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNjEuNjcgLTYzMS45MSkiIGZpbGw9Im5vbmUiPjxjaXJjbGUgY3g9IjUxMiIgY3k9IjU0MC4zNiIgcj0iMTc1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPjxjaXJjbGUgY3g9IjIyNi4wMyIgY3k9IjgyNS42MSIgcj0iMTI1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPjxwYXRoIGQ9Im0zNjAgNDUyLjM2LTIzNSAzMDAgMTgwIDE3MCAzMTUtMjQ1eiIvPjwvZz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjI0NSIgZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIiBvcGFjaXR5PSIuMiIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48Y2lyY2xlIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01MDguMyAtNjQyLjg3KSBzY2FsZSgxLjE2MjgpIiBjeD0iNTUwLjk1IiBjeT0iNjExLjQxIiByPSIxMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2opIiBvcGFjaXR5PSIuNCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjE2My4zMyIgZmlsbD0idXJsKCNrKSIgZmlsbC1ydWxlPSJldmVub2RkIiBvcGFjaXR5PSIuOSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzkwLjMyIC00OTYuNTkpIHNjYWxlKDE2LjMzMykiIGQ9Ik0zMS44ODcgMTdBMTUgMTUgMCAwIDAgMTcgMzJhMTUgMTUgMCAwIDAgMTQuMzUgMTQuOTg2QTE0LjM1OSAxNC41IDAgMCAxIDE3LjY0MSAzMi41IDE0LjM1OSAxNC41IDAgMCAxIDMyIDE4YTE0LjM1OSAxNC41IDAgMCAxIDE0LjM1OSAxNC41IDE0LjM1OSAxNC41IDAgMCAxLTEzLjczNiAxNC40ODZBMTUgMTUgMCAwIDAgNDcgMzJhMTUgMTUgMCAwIDAtMTUtMTUgMTUgMTUgMCAwIDAtLjExMyAwem0uNzM2IDI5Ljk4NmExNC4zNTkgMTQuNSAwIDAgMS0uMzE4LjAxIDE1IDE1IDAgMCAwIC4zMTgtLjAxem0tLjMxOC4wMUExNC4zNTkgMTQuNSAwIDAgMSAzMiA0N2ExNSAxNSAwIDAgMCAuMzA1LS4wMDR6IiBmaWxsPSJ1cmwoI2wpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIG9wYWNpdHk9Ii4wNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48L2c+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii0yMCIgcj0iMyIgb3BhY2l0eT0iLjc1Ii8+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii00NCIgcj0iMyIgb3BhY2l0eT0iLjc1Ii8+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii0yMCIgcj0iMiIgZmlsbD0iIzRkNGQ0ZCIvPjxjaXJjbGUgdHJhbnNmb3JtPSJyb3RhdGUoOTApIiBjeD0iMTciIGN5PSItNDQiIHI9IjIiIGZpbGw9IiM0ZDRkNGQiLz48L3N2Zz4=\"\nLABEL oc.keyword=\"rhythmbox,rhythmbox,audio;song;mp3;cd;podcast;MTP;playlist;last.fm;dlna;radio;\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.gnome.Rhythmbox3.desktop\"\nLABEL oc.launch=\"rhythmbox.Rhythmbox\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"rhythmbox\"\nLABEL oc.displayname=\"rhythmbox\"\nLABEL oc.path=\"/usr/bin/rhythmbox\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"rhythmbox\"\nENV APPBIN \"/usr/bin/rhythmbox\"\nENV APP \"/usr/bin/rhythmbox\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/rhythmbox/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/rhythmbox/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application rhythmbox

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/rhythmbox.d\n
"},{"location":"applications/rhythmbox/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f rhythmbox.d -t rhythmbox .\n
"},{"location":"applications/rhythmbox/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect rhythmbox > rhythmbox.json\ndocker image save rhythmbox -o rhythmbox.tar\nctr -n k8s.io images import rhythmbox.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @rhythmbox.json\n\n
"},{"location":"applications/robots/","title":"Robots","text":""},{"location":"applications/robots/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/robots/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/robots/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-robots\n
"},{"location":"applications/robots/#path","title":"Path","text":"
/usr/games/gnome-robots\n
"},{"location":"applications/robots/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/robots/#wm_class","title":"WM_CLASS","text":"
gnome-robots.Gnome-robots\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/robots/#desktopfile","title":"Desktopfile","text":"
gnome-robots.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/robots/#json-dump","title":"JSON dump","text":"

json source file robots.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-robots\",\n    \"icon\": \"circle_gnome-robots.svg\",\n    \"keyword\": \"gnome robots,game robots,robots\",\n    \"launch\": \"gnome-robots.Gnome-robots\",\n    \"name\": \"Robots\",\n    \"path\": \"/usr/games/gnome-robots\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"gnome-robots.desktop\"\n}\n
"},{"location":"applications/robots/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output robots.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/robots.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @robots.d.3.0.json\n\n
"},{"location":"applications/robots/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-robots && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-robots.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iSXRlcm0iIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ii01MDYuNDUiIHgyPSItNTA2LjQ1IiB5MT0iLTE5LjEwMSIgeTI9IjEwMTMuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDU4ODI0IDAgMCAuMDU4ODI0IDYxLjc5MSAzLjEyMzYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNjI2MjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzIiBvZmZzZXQ9Ii41MDc2OSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGE0YTRhIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjkwMDAwMDA2Ii8+CiAgPC9maWx0ZXI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iMTguNjg1IiBjeT0iMjUuNjY4IiByPSI1LjA1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2siLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImsiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTQwMDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2E0MDAwMCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYyIgY3g9IjE4LjY4NSIgY3k9IjI1LjY2OCIgcj0iNS4wNSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNqIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJqIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2MwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSIxOC42ODUiIGN5PSIyNS42NjgiIHI9IjUuMDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjaSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlZjI5MjkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWYyOTI5IiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJoIiBjeD0iMTMuMTk5IiBjeT0iMTIuNDY0IiByPSIyMS4wMDkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wNjQ5IC42MTQ4MiAtLjYyMzAxIDEuMDc5MSAxNC40MDMgLTEuNTU0NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2QzZDdjZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4ODhhODUiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iNS42OTM0IiB4Mj0iNDAuNTAzIiB5MT0iNS40NTgzIiB5Mj0iNDAuMDgxIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNDk0OCA3LjU0NjIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlZWVlZWMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWVlZWVjIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0ibCIgeD0iLS4xMjA5MyIgeT0iLS4xMTkwOSIgd2lkdGg9IjEuMjQxOSIgaGVpZ2h0PSIxLjIzODIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjIuMDM1OTI1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8bWFzaz4KICA8ZyBpZD0iZyI+CiAgIDxwYXRoIGQ9Im05NjkuNzUgMzkyLjA1Yy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNC0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1LTcyLjYtNzIuNi0xNTcuMTUtMTE2LjY1LTI1My42NS0xMzIuMDUtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LTAuNTUtMTkuODUtMC44NS0zMC4xLTAuODUtOS4zNSAwLTE4LjYgMC4yNS0yNy45IDAuNzUtMTE4LjM1IDYuMS0yMjAuMyA1MS45NS0zMDUuODUgMTM3LjVxLTEzOC4yNSAxMzguMjUtMTM4LjI1IDMzMy43NWMwIDEzMC4zNSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjggNTYuNyA1Ni42NSAxMjAuNTUgOTUuOSAxOTEuMSAxMTcuNTUgMzYuNzUgMTEuMjUgNzQuOCAxNy44NSAxMTQuNzUgMTkuOTVoMC40YzguNSAwLjQ1IDE2LjYgMC43IDI0LjUgMC43aDNjMTAuMyAwIDIwLjUtMC4zIDMwLjEtMC44IDIuNS0wLjE1IDQuNzUtMC4zIDYuOTUtMC40NSAyMC4yLTEuNDUgMzkuOS00LjA1IDU4LjctNy43IDcuOTUtMS41NSAxNS44LTMuMyAyMy40LTUuMTUgODAuOC0yMC4zIDE1Mi4xNS02MS42IDIxNC42NS0xMjQuMSA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTguNDUtNDcuNjUgMjguNjUtOTguOCAzMC41NS0xNTMuNSAwLjItNi4wNSAwLjMtMTIuMjUgMC4zLTE4LjV2LTNjLTAuMi00MC42NS00Ljk1LTc5LjUtMTQuMy0xMTd6IiBmaWxsPSIjZmZmIi8+CiAgPC9nPgogPC9tYXNrPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiIHN0eWxlPSJwYWludC1vcmRlcjpmaWxsIG1hcmtlcnMgc3Ryb2tlIi8+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0idXJsKCNiKSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHlsZT0icGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLjU1MTczIC40MDcwNikiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjUiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNDk0OCA3LjU0NjIpIj4KICAgPHBhdGggZD0ibTcuNTEzMyAxOC40NTRoMzIuOTk4djExLjc3OGgtMzIuOTk4YzNlLTQgLTMuOTI2IDNlLTQgLTcuODUyIDNlLTQgLTExLjc3OHoiIHN0cm9rZT0iIzJlMzQzNiIvPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjE0MjksMCwwLDEuMTQyOSwtNDYuMjAyLC0xMi4xNzUpIiBvcGFjaXR5PSIuNzUiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6Ii8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6Ii8+CiAgIDwvZz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTU2LjIwMiwtMTIuMTc1KSI+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjM4NjEsMCwwLDEuMzg2MSwzNS41MjcsLTMuOTI1NykiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5MDEgMCAwIC45OTAxIDQyLjkyNyA2LjI5ODEpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC41OTQwNiAwIDAgLjU5NDA2IDUwLjMyNyAxNi40NjQpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgPC9nPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjE0MjksMCwwLDEuMTQyOSwtMzYuMjAyLC0xMi4xNzUpIiBvcGFjaXR5PSIuNSI+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjM4NjEsMCwwLDEuMzg2MSwzNS41MjcsLTMuOTI1NykiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5MDEgMCAwIC45OTAxIDQyLjkyNyA2LjI5ODEpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC41OTQwNiAwIDAgLjU5NDA2IDUwLjMyNyAxNi40NjQpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgPC9nPgogIDwvZz4KICA8cGF0aCBkPSJtMzEuNDY0IDExLjA3N2MtMTAuMTE3IDAtMTguNTQ0IDcuMzI4OC0yMC4yMTkgMTYuOTY5aDQwLjQwNmMtMS42NzYtOS42MzktMTAuMDcxLTE2Ljk2OS0yMC4xODctMTYuOTY5em0tMjAuMTg4IDI0LjA2M2MxLjY5MDIgOS42MjIgMTAuMDgzIDE2Ljk2OCAyMC4xODggMTYuOTY4IDEwLjEwNSAwIDE4LjQ5OC03LjM0NCAyMC4xODctMTYuOTY4eiIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMyZTM0MzYiIHN0cm9rZS13aWR0aD0iMXB4Ii8+CiAgPHBhdGggZD0ibTMxLjQ2NCAxMi4wNzdjLTkuMjI2IDAtMTYuOTUgNi40NDk4LTE4Ljk2OSAxNS4wNjNoMzcuOTM4Yy0yLjAyLTguNjEzLTkuNzQ0LTE1LjA2My0xOC45NjktMTUuMDYzem0tMTguOTY5IDIzLjk2OWMyLjAxOTIgOC42MTMgOS43NDMgMTUuMDMxIDE4Ljk2OSAxNS4wMzEgOS4yMjUgMCAxNi45NDktNi40MTggMTguOTY5LTE1LjAzMXoiIHN0cm9rZT0idXJsKCNmKSIgc3Ryb2tlLXdpZHRoPSIxcHgiLz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC41NTE3MyAuNDA3MDYpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3LjQ5NDggNy41NDYyKSI+CiAgIDxwYXRoIGQ9Im03LjUxMzMgMTguNDU0aDMyLjk5OHYxMS43NzhoLTMyLjk5OGMzZS00IC0zLjkyNiAzZS00IC03Ljg1MiAzZS00IC0xMS43Nzh6IiBmaWxsPSIjMmUzNDM2IiBzdHJva2U9IiMyZTM0MzYiLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTQ2LjIwMiwtMTIuMTc1KSIgb3BhY2l0eT0iLjc1Ij4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuMzg2MSwwLDAsMS4zODYxLDM1LjUyNywtMy45MjU3KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguOTkwMSAwIDAgLjk5MDEgNDIuOTI3IDYuMjk4MSkiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIgZmlsbD0idXJsKCNjKSIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjU5NDA2IDAgMCAuNTk0MDYgNTAuMzI3IDE2LjQ2NCkiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIgZmlsbD0idXJsKCNhKSIvPgogICA8L2c+CiAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTQyOSwwLDAsMS4xNDI5LC01Ni4yMDIsLTEyLjE3NSkiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiIGZpbGw9InVybCgjZSkiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDwvZz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTM2LjIwMiwtMTIuMTc1KSIgb3BhY2l0eT0iLjUiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiIGZpbGw9InVybCgjZSkiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDwvZz4KICA8L2c+CiAgPHBhdGggZD0ibTMxLjQ2NCAxMS4wNzdjLTEwLjExNyAwLTE4LjU0NCA3LjMyODgtMjAuMjE5IDE2Ljk2OWg0MC40MDZjLTEuNjc2LTkuNjM5LTEwLjA3MS0xNi45NjktMjAuMTg3LTE2Ljk2OXptLTIwLjE4OCAyNC4wNjNjMS42OTAyIDkuNjIyIDEwLjA4MyAxNi45NjggMjAuMTg4IDE2Ljk2OCAxMC4xMDUgMCAxOC40OTgtNy4zNDQgMjAuMTg3LTE2Ljk2OHoiIGZpbGw9InVybCgjaCkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjMmUzNDM2IiBzdHJva2Utd2lkdGg9IjFweCIvPgogIDxwYXRoIGQ9Im0zMS40NjQgMTIuMDc3Yy05LjIyNiAwLTE2Ljk1IDYuNDQ5OC0xOC45NjkgMTUuMDYzaDM3LjkzOGMtMi4wMi04LjYxMy05Ljc0NC0xNS4wNjMtMTguOTY5LTE1LjA2M3ptLTE4Ljk2OSAyMy45NjljMi4wMTkyIDguNjEzIDkuNzQzIDE1LjAzMSAxOC45NjkgMTUuMDMxIDkuMjI1IDAgMTYuOTQ5LTYuNDE4IDE4Ljk2OS0xNS4wMzF6IiBmaWxsPSJub25lIiBzdHJva2U9InVybCgjZikiIHN0cm9rZS13aWR0aD0iMXB4Ii8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"robots,gnome robots,game robots,robots\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-robots.desktop\"\nLABEL oc.launch=\"gnome-robots.Gnome-robots\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Robots\"\nLABEL oc.displayname=\"Robots\"\nLABEL oc.path=\"/usr/games/gnome-robots\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Robots\"\nENV APPBIN \"/usr/games/gnome-robots\"\nENV APP \"/usr/games/gnome-robots\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/robots/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/robots/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Robots

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Robots.d\n
"},{"location":"applications/robots/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Robots.d -t Robots .\n
"},{"location":"applications/robots/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Robots > Robots.json\ndocker image save Robots -o Robots.tar\nctr -n k8s.io images import Robots.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Robots.json\n\n
"},{"location":"applications/shotcut/","title":"Shotcut","text":""},{"location":"applications/shotcut/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/shotcut/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/shotcut/#alpine-packages","title":"Alpine packages","text":"
shotcut mesa-dri-gallium\n
"},{"location":"applications/shotcut/#path","title":"Path","text":"
/usr/bin/shotcut\n
"},{"location":"applications/shotcut/#mimetype","title":"Mimetype","text":"
image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\n
"},{"location":"applications/shotcut/#file-extensions","title":"File extensions","text":"

\"mlt\"

"},{"location":"applications/shotcut/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"mlt\"

"},{"location":"applications/shotcut/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/shotcut/#wm_class","title":"WM_CLASS","text":"
shotcut.Shotcut\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/shotcut/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.shotcut.Shotcut.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/shotcut/#json-dump","title":"JSON dump","text":"

json source file shotcut.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"shotcut mesa-dri-gallium\",\n    \"icon\": \"circle_shotcut.svg\",\n    \"keyword\": \"video,audio,editing,suite,mlt,4k,video4linux,blackmagic,decklink\",\n    \"launch\": \"shotcut.Shotcut\",\n    \"name\": \"Shotcut\",\n    \"path\": \"/usr/bin/shotcut\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\",\n    \"fileextensions\": \"mlt\",\n    \"legacyfileextensions\": \"mlt\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/org.shotcut.Shotcut.desktop\",\n    \"usedefaultapplication\": false\n}\n
"},{"location":"applications/shotcut/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output shotcut.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/shotcut.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @shotcut.d.3.0.json\n\n
"},{"location":"applications/shotcut/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update shotcut mesa-dri-gallium\nLABEL oc.icon=\"circle_shotcut.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiA8ZGVmcz4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItMTM2Ljk5IiBjeT0iMTk4LjY1IiByPSIzOC41IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wOTgxOTYgMCAwIC4wODI0NzEgMjEuOTE4IC03LjkyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMjU2MWRiIiBzdG9wLW9wYWNpdHk9Ii45NDExOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwZDBkMGQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4yMzI1OCIgeT0iLS4yNDc5MSIgd2lkdGg9IjEuNDY1MiIgaGVpZ2h0PSIxLjQ5NTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMDYwNzE4NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImoiIHg9Ii0uMDExNjI5IiB5PSItLjAxMjM5NiIgd2lkdGg9IjEuMDIzMyIgaGVpZ2h0PSIxLjAyNDgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMDMwNDU1NDkxIi8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iYSIgeD0iLS4wNjI0NDQiIHk9Ii0uMDY2NTYiIHdpZHRoPSIxLjEyNDkiIGhlaWdodD0iMS4xMzMxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjA4NTUyNzgzNiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImkiIHg9Ii0uMDU1MjM5IiB5PSItLjA2NTY2IiB3aWR0aD0iMS4xMTA1IiBoZWlnaHQ9IjEuMTMxMyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NjI0MjQ3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4yMzI1OCIgeT0iLS4yNDc5MSIgd2lkdGg9IjEuNDY1MiIgaGVpZ2h0PSIxLjQ5NTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNTEyMDkyMzUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjA1ODE0NSIgeT0iLS4wNjE5NzgiIHdpZHRoPSIxLjExNjMiIGhlaWdodD0iMS4xMjQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMTI4MDIzMDkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjE5NjI4IiB5PSItLjMwODc3IiB3aWR0aD0iMS4zOTI2IiBoZWlnaHQ9IjEuNjE3NSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMi45ODc4MDM3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibiIgeD0iLS4xMDk3OCIgeT0iLS4xMjk5OSIgd2lkdGg9IjEuMjE5NiIgaGVpZ2h0PSIxLjI2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjE1MjI3ODI5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibSIgeD0iLS4xODk4NyIgeT0iLS4yNDMyMyIgd2lkdGg9IjEuMzc5NyIgaGVpZ2h0PSIxLjQ4NjUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMTUyMjc4MjkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI4LjQ2NjciIHgyPSI4LjQ2NjciIHkxPSIyODAuNiIgeTI9IjI5Ni40NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAxMiAwIDAgMS4wMTIgLS4xMDIgLTI4My41NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM5ZjlmOWYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iMjgyLjE4IiB5Mj0iMjk0Ljg4IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2NjYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iMjgzLjI0IiB5Mj0iMjkzLjgyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMjEyMTIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iLTIuOTIwMyIgeTI9IjE5Ljg0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjY2MiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJlYmViIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9Im8iIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjM0MTQxMDE2Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguNjk3NDYgMCAwIC42OTc0NiAyLjU2MTMgMi41NjYpIiBzdHJva2Utd2lkdGg9IjEuNDMzOCI+CiAgPGNpcmNsZSBjeD0iOC40NjY3IiBjeT0iOC40NiIgcj0iMTEuMzgiIGZpbHRlcj0idXJsKCNvKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iOC40NjY3IiBjeT0iOC40NiIgcj0iMTEuMzgiIGZpbGw9InVybCgjbCkiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI3Ljk2NjMiIGZpbGw9InVybCgjZSkiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI2LjM1IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNDMzOCIvPgogIDxjaXJjbGUgY3g9IjguNDY2NyIgY3k9IjguNDYiIHI9IjUuMjkxNyIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIxLjQzMzgiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI0LjExNiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlPSIjMGQyMjRkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjMzNjMzIi8+CiAgPGcgc3Ryb2tlLXdpZHRoPSIxLjQzMzgiPgogICA8cGF0aCBkPSJtNC45NDQ4IDYuNDcgMS40NjQ2IDAuODEwNDNzMC40NTc3MS0wLjQ3NzQ3IDAuNzcxOTItMC42ODYxNGMwLjM0ODE2LTAuMjMxMiAxLjEwNDctMC40MTU4NyAxLjA5MjUtMC4zNjA0N2wtMC4yNDA4Mi0xLjc2MjFzLTEuNjIxMy0wLjE2MDctMy4wODgyIDEuOTk4M3oiIGZpbGw9IiM0Njc4Y2MiIGZpbHRlcj0idXJsKCNuKSIgb3BhY2l0eT0iLjgiLz4KICAgPHBhdGggZD0ibTQuNzg3NyA2LjczIDEuNTY1IDAuNjk1MzlzLTAuMDg4MjkyIDAuMjAxNjItMC4xMjMwNyAwLjQyMDkzYy0wLjAzMTc5MSAwLjIwMDUyIDAuMDA0NDQgMC4zODYyMyAwLjAwNDQ0IDAuMzg2MjNsLTEuODA2Mi0wLjAxODNzMC4wNzIxOTMtMS4wMzU5IDAuMzU5OTEtMS40ODQyeiIgZmlsbD0iIzQ2NzhjYyIgZmlsdGVyPSJ1cmwoI20pIiBvcGFjaXR5PSIuOCIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yODAuMDcpIiBmaWxsPSIjZmZmIj4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4xNTY4MyAtLjEzNTkxIC4xMzU5MSAuMTU2ODMgMzYuMjc4IDI0OC42OCkiIGN4PSItMjI4LjMzIiBjeT0iNDQuOTQ0IiByeD0iMy4wODMiIHJ5PSIxLjkwMjgiIGZpbGwtb3BhY2l0eT0iLjMiIGZpbHRlcj0idXJsKCNnKSIvPgogICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJtYXRyaXgoLjEwMjkxIC0uMDg5MTggLjA4OTE4IC4xMDI5MSAyNi4xMTIgMjYyLjAzKSIgY3g9Ii0yMjguMSIgY3k9IjUxLjE2NiIgcng9IjEuOTE3OCIgcnk9IjEuMTgzNyIgZmlsbC1vcGFjaXR5PSIuMyIgZmlsdGVyPSJ1cmwoI2EpIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMTE4NzMgLS4wNzk0MjUgLjA3OTQyNSAuMTE4NzMgMjcuNDA2IDI1OS43NSkiIGN4PSItMjIyLjAzIiBjeT0iMTExLjcyIiByeD0iMTguNDE5IiByeT0iMTEuMzY4IiBmaWx0ZXI9InVybCgjaSkiIG9wYWNpdHk9Ii4yIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMTAyOTEgLS4wODkxOCAuMDg5MTggLjEwMjkxIDI2Ljc2NCAyNjEuNDYpIiBjeD0iLTIzNS4yOSIgY3k9Ijc1LjA0NiIgcng9IjMuNjY3IiByeT0iMi4yNjMzIiBmaWxsLW9wYWNpdHk9Ii4zIiBmaWx0ZXI9InVybCgjaikiLz4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4xMjUyMyAtLjEwODUzIC4xMDg1MyAuMTI1MjMgMjkuOTE4IDI1NC43KSIgY3g9Ii0yMzQuMjEiIGN5PSI4OC43NTkiIHJ4PSI2LjM4NTkiIHJ5PSIzLjk0MTMiIGZpbHRlcj0idXJsKCNrKSIvPgogICA8L2c+CiAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiPgogICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJtYXRyaXgoLjE0MDQ2IC0uMDgyODE0IC4wODI4MTQgLjE0MDQ2IDMxLjY1MSAyNTYuMDIpIiBjeD0iLTIyMi4wMyIgY3k9IjExMS43MiIgcng9IjE4LjQxOSIgcnk9IjExLjM2OCIgZmlsbD0iIzQzOTdlZSIgZmlsdGVyPSJ1cmwoI2YpIiBvcGFjaXR5PSIuNDUiLz4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4wODEzMjUgLS4wNzA0NzYgLjA3MDQ3NiAuMDgxMzI1IDIyLjA1OSAyNjcuMTMpIiBjeD0iLTIyOC4zMyIgY3k9IjQ0Ljk0NCIgcng9IjMuMDgzIiByeT0iMS45MDI4IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii44NTQxNyIgZmlsdGVyPSJ1cmwoI2gpIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMDY5MTU2IC0uMDU5OTMgLjA1OTkzIC4wNjkxNTYgMjAuOCAyNzEuNDkpIiBjeD0iLTIyOC4xIiBjeT0iNTEuMTY2IiByeD0iMS45MTc4IiByeT0iMS4xODM3IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii4zIiBmaWx0ZXI9InVybCgjYSkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"shotcut,video,audio,editing,suite,mlt,4k,video4linux,blackmagic,decklink\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.shotcut.Shotcut.desktop\"\nLABEL oc.launch=\"shotcut.Shotcut\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Shotcut\"\nLABEL oc.displayname=\"Shotcut\"\nLABEL oc.path=\"/usr/bin/shotcut\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\"\nLABEL oc.fileextensions=\"mlt\"\nLABEL oc.legacyfileextensions=\"mlt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Shotcut\"\nENV APPBIN \"/usr/bin/shotcut\"\nENV APP \"/usr/bin/shotcut\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/shotcut/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/shotcut/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Shotcut

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Shotcut.d\n
"},{"location":"applications/shotcut/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Shotcut.d -t Shotcut .\n
"},{"location":"applications/shotcut/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Shotcut > Shotcut.json\ndocker image save Shotcut -o Shotcut.tar\nctr -n k8s.io images import Shotcut.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Shotcut.json\n\n
"},{"location":"applications/stellarium/","title":"Stellarium","text":""},{"location":"applications/stellarium/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/stellarium/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/stellarium/#alpine-packages","title":"Alpine packages","text":"
stellarium\n
"},{"location":"applications/stellarium/#path","title":"Path","text":"
/usr/bin/stellarium\n
"},{"location":"applications/stellarium/#mimetype","title":"Mimetype","text":"
application/x-stellarium-script;\n
"},{"location":"applications/stellarium/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/stellarium/#wm_class","title":"WM_CLASS","text":"
stellarium.stellarium\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/stellarium/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.stellarium.Stellarium.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/stellarium/#json-dump","title":"JSON dump","text":"

json source file stellarium.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"stellarium\",\n    \"icon\": \"stellarium.svg\",\n    \"keyword\": \"stellarium,astronomy\",\n    \"launch\": \"stellarium.stellarium\",\n    \"name\": \"Stellarium\",\n    \"path\": \"/usr/bin/stellarium\",\n    \"mimetype\": \"application/x-stellarium-script;\",\n    \"desktopfile\": \"/usr/share/applications/org.stellarium.Stellarium.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/stellarium/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output stellarium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stellarium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stellarium.d.3.0.json\n\n
"},{"location":"applications/stellarium/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update stellarium\nLABEL oc.icon=\"stellarium.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgaGVpZ2h0PSI0OCIgaWQ9InN2ZzgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDEyLjcgMTIuNyIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVmcyBpZD0iZGVmczIiPjxjbGlwUGF0aCBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImNsaXBQYXRoNTM0MyI+PHBhdGggZD0ibSAzLjA2ODgzNTEsMjg1LjU1Njc3IGMgLTEuNjEzNTY4LDEuMTk1OTYgLTIuNTY2MjE4MSwzLjA4NDc4IC0yLjU2ODgzNTA5LDUuMDkzMjMgMCwzLjUwNzAxIDIuODQyOTkyMTksNi4zNSA2LjM1MDAwMDA5LDYuMzUgQyAxMC4zNTcwMDgsMjk3IDEzLjIsMjk0LjE1NzAxIDEzLjIsMjkwLjY1IGMgLTAuMDAyMiwtMC44NDI5NiAtMC40NTIwNzgsLTIuNzEyNzEgLTAuNTAwMjI4LC0yLjQ1MzU5IC0wLjAyNDI0LDAuODQxMjEgLTAuNTcxODA5LDIuMzUzMjIgLTAuNjAyMDMxLDIuMjMxMzggLTAuMDAyNiwtMC41MDYyMSAtMC4yODc2LC0xLjQyNjI2IC0wLjMwNTA5OCwtMS4xOTUwOSAwLjAyODA0LDEuNDA2OTUgLTEuNDgzNzQsMy4xNzY3NyAtMi4zMDc2NjIzLDMuNTAwMzggLTAuODMxMDQ1NywwLjM2OTQyIC0xLjczNzE2MzcsMC41NjQxMiAtMi42MTE3MjY3LDAuNTY1MzQgLTAuMTczNjkxOCwyZS01IC0xLjE2ODY1MTksLTAuMTM4MDcgLTEuNjQ0MzQzOSwtMC43MDQzNSAtMC44MjYzNzYsLTAuODkyNTMgLTAuMDAyMDEsLTEuMDk5OTQgMC40NjI1MDM5LC0xLjI3MzMxIDAuNTA1NTg2MiwtMC4xODg3MSAxLjAzMDg4NywtMC4zMDk2OSAxLjUyMDMyMTIsLTAuNDIwMTMgMC43NDU2OTg4LC0wLjE2ODI2IDAuNDcxMDYxOCwtMC41MjYyNiAwLjEwNDkwMjgsLTAuNjI4OSAtMC45MjY2OTM5LC0wLjI1OTc2IC0yLjA0NDg4NiwwLjMzNTQzIC0yLjg2NTQ1NzksMC4zMDU5MyAtMC44NDg0MDYsLTAuMDI5MSAtMC44MDQ2MTgsLTEuNjk2MjEgLTAuMTQwNTYwMSwtMS43NjIxNyAwLjczOTQyMTIsLTAuMDczNCAxLjY2NjUxNTEsLTAuNTEwNzkgMS40NjE3NzksLTAuNjU2NzMgLTAuODMwMzU0OSwtMC42MTY3MiAtMC45NjE3MzY5LC0wLjc5MDgxIC0xLjA1OTU1NDksLTEuMTY0MTggLTAuMTQ4MDIwMSwtMC41NjUgMC4zNDEyODIsLTEuMDM1NTcgMC4wNTc3NywtMC45NjM1NiAtMC4yNTk2MTY5LDAuMDggLTAuNDExMDY3OCwwLjE1NjQxIC0wLjU5ODg2MTksMC4yNTcxNSAtMC4xNjcyOTI5LDAuMDg5NyAtMC4yOTM4MTQsMC4wNTQ2IC0wLjY3NTE4NDEsMC4wMDIgLTAuMzI0OTQ0OSwtMC4wNDUgLTAuMzg3MDA1OCwtMC4wNTU3IC0wLjM3NTUwMDksLTAuMjU2NzMgMC4wMTE1LC0wLjIwMDk3IDAuMDcyOTUsLTAuNTIxMjUgLTAuMDUyMjMsLTAuNDc2NDggeiIgaWQ9InBhdGg1MzQ1IiBzdHlsZT0iZmlsbDojN2FhZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjAxMDQ1OTQyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIi8+PC9jbGlwUGF0aD48Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDQ1NDMiPjxwYXRoIGQ9Im0gMS43NzYwMDg4LDI5MS41Njk2IGMgLTEuODI2MTMzMzksMC4xNzQzNCAtMy4yOTQwMzE1LDAuOTE5MzQgLTMuNDkwMzk5NiwyLjE2NDUxIC0wLjI2MjkwNTQsMS42NjcyOSAxLjU2Nzg1OTEsMy4zNDEyNyA0LjA4OTEyMTMsMy43Mzg5MyAxLjIxNzIwODQsMC4xOTExOSAyLjQzNDIzNCwwLjA1MyAzLjM4MDc0MjMsLTAuMzgzODcgMC43MzEwMTk0LDAuNTI4MyAxLjY2OTM1NywwLjkwMDc4IDIuNjcwNDcyMSwxLjA2MDA4IDIuNTIxMjY5MSwwLjM5NzcxIDQuNzc4MzM4MSwtMC42MzE1IDUuMDQxMjgwMSwtMi4yOTg4IDAuMjYyOTA1LC0xLjY2NzMgLTEuNDkwNjY3LC0xLjk0MzI5IC00LjI1NzE2MywtMi4xNzkzOCAtMi43NjY0OTU4LC0wLjIzNjA5IC0zLjYxNjM4OTYsLTEuNjg4MzkgLTUuNzQ3MDQ0OCwtMi4wNDU3NSAtMC41NjYwMTkxLC0wLjA4OTMgLTEuMTM4MDgwOCwtMC4xMDgxNyAtMS42ODcwMDg0LC0wLjA1NTcgeiIgaWQ9InBhdGg0NTQ1IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMTE2NjY2NTY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGlkPSJsYXllcjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4NC4zKSI+PGNpcmNsZSBjeD0iNi4zNDk5OTk5IiBjeT0iMjkwLjY0OTk5IiBpZD0icGF0aDQ1MTQiIHI9IjYuMzQ5OTk5OSIgc3R5bGU9ImZpbGw6I2FhY2NmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS43NDY1ODgxMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQ1NDMpIiBkPSJtIDEyLjcsMjkwLjY0OTk5IGEgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSAtNi4zNTAwMDAxLDYuMzUgQSA2LjM0OTk5OTksNi4zNDk5OTk5IDAgMCAxIDAsMjkwLjY0OTk5IGEgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSA2LjM0OTk5OTksLTYuMzUgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSA2LjM1MDAwMDEsNi4zNSB6IiBpZD0icGF0aDQ1MTQtMyIgc3R5bGU9ImZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS43NDY1ODgxMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPjxnIGlkPSJnNDY3Ny05IiBzdHlsZT0iZmlsbDojNWI5OWY4O2ZpbGwtb3BhY2l0eToxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOS4xNTI0OTU4LC0zLjUyNDkyMzIpIj48cGF0aCBkPSJtIDE5LjU2NzQ1OCwyOTEuNzc1NjEgYSAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAwIC0wLjQ2ODk5MiwtMC4zNjQ2NyAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAxIC0wLjM2NTExNiwzLjA0NzM0IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDEgLTMuMDQ2NDYsMC4zNjYgMi40ODY2ODExLDIuNDg2NjgxMSAwIDAgMCAwLjM2NDIzMSwwLjQ2NzY2IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMy41MTYzMzcsNC41ZS00IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMCwtMy41MTY3OCB6IiBpZD0icGF0aDQ1MjYtNjkiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41NjA1MDIyOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PHBhdGggZD0ibSA2LjQxODUxNDUsMjk0LjIzMjk5IC0wLjM1NjYyNDksLTAuMjUzOTQgLTAuMzU2NjI0OSwwLjI1Mzk0IDAuMDQxNjAyLC0wLjQzNTgyIC0wLjM5ODIyNjcsLTAuMTgxODcgMC4zOTgyMjY3LC0wLjE4MTg4IC0wLjA0MTYwMiwtMC40MzU4MiAwLjM1NjYyNSwwLjI1Mzk0IDAuMzU2NjI0OSwtMC4yNTM5NCAtMC4wNDE2MDIsMC40MzU4MiAwLjM5ODIyNjcsMC4xODE4OCAtMC4zOTgyMjY3LDAuMTgxODcgeiIgaWQ9InBhdGg0NTYxLTMzIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4xMTY4ODgxLC0wLjY0NDgzNTY1LDAuNjQ0ODM1NjUsMS4xMTY4ODgxLC0xODMuMzc4MjEsLTMyLjQ5MTY2NikiLz48Y2lyY2xlIGN4PSIxMS4zMTU4NTUiIGN5PSIyOTMuNzIzOTQiIGlkPSJwYXRoNDYyMS04IiByPSIwLjMwMjY3ODI2IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuOTg5NDk2MjM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxjaXJjbGUgY3g9IjE1LjU3NTQyMSIgY3k9IjI5MC4yMjA3OSIgaWQ9InBhdGg0NjI1LTAiIHI9IjAuMzU4MjY4ODkiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6My42OTkzOTgwNDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PGNpcmNsZSBjeD0iMTcuMTY4NjIzIiBjeT0iMjkyLjAxNDg5IiBpZD0icGF0aDQ2MjUtNS01IiByPSIwLjIyNjQ5Njk5IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMzM4NzUyOTk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGQ9Im0gNi40MTg1MTQ1LDI5NC4yMzI5OSAtMC4zNTY2MjQ5LC0wLjI1Mzk0IC0wLjM1NjYyNDksMC4yNTM5NCAwLjA0MTYwMiwtMC40MzU4MiAtMC4zOTgyMjY3LC0wLjE4MTg3IDAuMzk4MjI2NywtMC4xODE4OCAtMC4wNDE2MDIsLTAuNDM1ODIgMC4zNTY2MjUsMC4yNTM5NCAwLjM1NjYyNDksLTAuMjUzOTQgLTAuMDQxNjAyLDAuNDM1ODIgMC4zOTgyMjY3LDAuMTgxODggLTAuMzk4MjI2NywwLjE4MTg3IHoiIGlkPSJwYXRoNDU2MS0xLTYiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS41OTk5MTY0NjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjY4NzMwMTcyLC0wLjM5NjgxMzg1LDAuMzk2ODEzODUsMC42ODczMDE3MiwtMTA2LjEzNzk2LDk0LjI3OTU3NikiLz48L2c+PGcgaWQ9Imc0Njc3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOS4zMjk0NTE3LC0zLjc0MjMyMjQpIj48cGF0aCBkPSJtIDE5LjU2NzQ1OCwyOTEuNzc1NjEgYSAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAwIC0wLjQ2ODk5MiwtMC4zNjQ2NyAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAxIC0wLjM2NTExNiwzLjA0NzM0IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDEgLTMuMDQ2NDYsMC4zNjYgMi40ODY2ODExLDIuNDg2NjgxMSAwIDAgMCAwLjM2NDIzMSwwLjQ2NzY2IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMy41MTYzMzcsNC41ZS00IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMCwtMy41MTY3OCB6IiBpZD0icGF0aDQ1MjYiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41NjA1MDIyOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PHBhdGggZD0ibSA2LjQxODUxNDUsMjk0LjIzMjk5IC0wLjM1NjYyNDksLTAuMjUzOTQgLTAuMzU2NjI0OSwwLjI1Mzk0IDAuMDQxNjAyLC0wLjQzNTgyIC0wLjM5ODIyNjcsLTAuMTgxODcgMC4zOTgyMjY3LC0wLjE4MTg4IC0wLjA0MTYwMiwtMC40MzU4MiAwLjM1NjYyNSwwLjI1Mzk0IDAuMzU2NjI0OSwtMC4yNTM5NCAtMC4wNDE2MDIsMC40MzU4MiAwLjM5ODIyNjcsMC4xODE4OCAtMC4zOTgyMjY3LDAuMTgxODcgeiIgaWQ9InBhdGg0NTYxIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4xMTY4ODgxLC0wLjY0NDgzNTY1LDAuNjQ0ODM1NjUsMS4xMTY4ODgxLC0xODMuMzc4MjEsLTMyLjQ5MTY2NikiLz48Y2lyY2xlIGN4PSIxMS4zMTU4NTUiIGN5PSIyOTMuNzIzOTQiIGlkPSJwYXRoNDYyMSIgcj0iMC4zMDI2NzgyNiIgc3R5bGU9Im9wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjk4OTQ5NjIzO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiLz48Y2lyY2xlIGN4PSIxNS41NzU0MjEiIGN5PSIyOTAuMjIwNzkiIGlkPSJwYXRoNDYyNSIgcj0iMC4zNTgyNjg4OSIgc3R5bGU9Im9wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozLjY5OTM5ODA0O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiLz48Y2lyY2xlIGN4PSIxNy4xNjg2MjMiIGN5PSIyOTIuMDE0ODkiIGlkPSJwYXRoNDYyNS01IiByPSIwLjIyNjQ5Njk5IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMzM4NzUyOTk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGQ9Im0gNi40MTg1MTQ1LDI5NC4yMzI5OSAtMC4zNTY2MjQ5LC0wLjI1Mzk0IC0wLjM1NjYyNDksMC4yNTM5NCAwLjA0MTYwMiwtMC40MzU4MiAtMC4zOTgyMjY3LC0wLjE4MTg3IDAuMzk4MjI2NywtMC4xODE4OCAtMC4wNDE2MDIsLTAuNDM1ODIgMC4zNTY2MjUsMC4yNTM5NCAwLjM1NjYyNDksLTAuMjUzOTQgLTAuMDQxNjAyLDAuNDM1ODIgMC4zOTgyMjY3LDAuMTgxODggLTAuMzk4MjI2NywwLjE4MTg3IHoiIGlkPSJwYXRoNDU2MS0xIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMC42ODczMDE3MiwtMC4zOTY4MTM4NSwwLjM5NjgxMzg1LDAuNjg3MzAxNzIsLTEwNi4xMzc5Niw5NC4yNzk1NzYpIi8+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"stellarium,stellarium,astronomy\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.stellarium.Stellarium.desktop\"\nLABEL oc.launch=\"stellarium.stellarium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Stellarium\"\nLABEL oc.displayname=\"Stellarium\"\nLABEL oc.path=\"/usr/bin/stellarium\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-stellarium-script;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Stellarium\"\nENV APPBIN \"/usr/bin/stellarium\"\nENV APP \"/usr/bin/stellarium\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/stellarium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/stellarium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Stellarium

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Stellarium.d\n
"},{"location":"applications/stellarium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Stellarium.d -t Stellarium .\n
"},{"location":"applications/stellarium/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Stellarium > Stellarium.json\ndocker image save Stellarium -o Stellarium.tar\nctr -n k8s.io images import Stellarium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Stellarium.json\n\n
"},{"location":"applications/step/","title":"Step","text":""},{"location":"applications/step/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/step/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/step/#alpine-packages","title":"Alpine packages","text":"
step\n
"},{"location":"applications/step/#path","title":"Path","text":"
/usr/bin/step\n
"},{"location":"applications/step/#mimetype","title":"Mimetype","text":"
application/x-step;\n
"},{"location":"applications/step/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/step/#wm_class","title":"WM_CLASS","text":"
step.step\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/step/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.kde.step.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/step/#json-dump","title":"JSON dump","text":"

json source file step.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"step\",\n    \"icon\": \"step.svg\",\n    \"keyword\": \"step\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"launch\": \"step.step\",\n    \"name\": \"Step\",\n    \"path\": \"/usr/bin/step\",\n    \"mimetype\": \"application/x-step;\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.step.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/step/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output step.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/step.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @step.d.3.0.json\n\n
"},{"location":"applications/step/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update step\nLABEL oc.icon=\"step.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHBhdGggc3R5bGU9ImZpbGw6I0ExQTdBRjsiIGQ9Ik00MjAsNDZIOTJjLTI0LjI2MiwwLTQ0LDE5LjczOC00NCw0NHYzMTJjMCw2LjYyNyw1LjM3MywxMiwxMiwxMnMxMi01LjM3MywxMi0xMlY5MA0KCWMwLTExLjAyOCw4Ljk3Mi0yMCwyMC0yMGgzMjhjMTEuMDI4LDAsMjAsOC45NzIsMjAsMjB2MzEyYzAsNi42MjcsNS4zNzMsMTIsMTIsMTJzMTItNS4zNzMsMTItMTJWOTBDNDY0LDY1LjczOCw0NDQuMjYyLDQ2LDQyMCw0NnoNCgkiLz4NCjxnPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiM1NTYwNkU7IiBkPSJNMjQ4LDI1OGMwLDQuNDE4LDMuNTgyLDgsOCw4czgtMy41ODIsOC04VjcwaC0xNlYyNTh6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzU1NjA2RTsiIGQ9Ik0zNzAuNjkyLDcwaC0xNy42NTNsODAuODU0LDE3My4zOTJjMS4xODMsMi41MzksMy41MjksNC4xNjIsNi4xMDcsNC41MzZ2LTI5LjI5NkwzNzAuNjkyLDcweiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiM1NTYwNkU7IiBkPSJNNDQ0LjUyMywyNDcuMjYyYzQuMDA0LTEuODY3LDUuNzM3LTYuNjI3LDMuODY5LTEwLjYzMUw0NDAsMjE4LjYzMnYyOS4yOTYNCgkJYzAuMzc5LDAuMDU1LDAuNzYyLDAuMDg1LDEuMTQ3LDAuMDg1QzQ0Mi4yNzksMjQ4LjAxMyw0NDMuNDMsMjQ3Ljc3MSw0NDQuNTIzLDI0Ny4yNjJ6Ii8+DQo8L2c+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkY4Qzc4OyIgZD0iTTI1NiwyNThjLTI2LjQ2OCwwLTQ4LDIxLjUzMy00OCw0OHMyMS41MzIsNDgsNDgsNDhzNDgtMjEuNTMzLDQ4LTQ4UzI4Mi40NjgsMjU4LDI1NiwyNTh6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojREI2QjVFOyIgZD0iTTI3MiwzNDZjLTI2LjQ2OCwwLTQ4LTIxLjUzMy00OC00OGMwLTE1LjU2LDcuNDQ4LTI5LjQwOSwxOC45Ni0zOC4xODUNCglDMjIyLjgxMSwyNjUuNTEyLDIwOCwyODQuMDUzLDIwOCwzMDZjMCwyNi40NjcsMjEuNTMyLDQ4LDQ4LDQ4YzEwLjkwNywwLDIwLjk3MS0zLjY2MywyOS4wNC05LjgxNQ0KCUMyODAuODkxLDM0NS4zNTgsMjc2LjUyLDM0NiwyNzIsMzQ2eiIvPg0KPHBhdGggc3R5bGU9ImZpbGw6IzU1NjA2RTsiIGQ9Ik0xNDQsMjU4YzAsNC40MTgsMy41ODIsOCw4LDhzOC0zLjU4Miw4LThWNzBoLTE2VjI1OHoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNGRjhDNzg7IiBkPSJNMTUyLDI1OGMtMjYuNDY4LDAtNDgsMjEuNTMzLTQ4LDQ4czIxLjUzMiw0OCw0OCw0OHM0OC0yMS41MzMsNDgtNDhTMTc4LjQ2OCwyNTgsMTUyLDI1OHoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNEQjZCNUU7IiBkPSJNMTY4LDM0NmMtMjYuNDY4LDAtNDgtMjEuNTMzLTQ4LTQ4YzAtMTUuNTYsNy40NDgtMjkuNDA5LDE4Ljk2LTM4LjE4NQ0KCUMxMTguODExLDI2NS41MTIsMTA0LDI4NC4wNTMsMTA0LDMwNmMwLDI2LjQ2NywyMS41MzIsNDgsNDgsNDhjMTAuOTA3LDAsMjAuOTcxLTMuNjYzLDI5LjA0LTkuODE1DQoJQzE3Ni44OTEsMzQ1LjM1OCwxNzIuNTIsMzQ2LDE2OCwzNDZ6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkY4Qzc4OyIgZD0iTTUwNC45MzIsMjYzLjIyOWMtNS40MTktMTEuNjItMTUuMDM4LTIwLjQzNS0yNy4wODYtMjQuODJjLTEyLjA1LTQuMzg2LTI1LjA4NC0zLjgxNi0zNi43MDMsMS42MDMNCgljLTIzLjk4NywxMS4xODUtMzQuNDAyLDM5LjgtMjMuMjE3LDYzLjc4OGM4LjEzNiwxNy40NDYsMjUuNDg3LDI3LjcxMyw0My41NzYsMjcuNzEyYzYuNzgyLDAsMTMuNjcxLTEuNDQ0LDIwLjIxMi00LjQ5NQ0KCUM1MDUuNzAxLDMxNS44MzIsNTE2LjExNiwyODcuMjE2LDUwNC45MzIsMjYzLjIyOXoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNEQjZCNUU7IiBkPSJNNDgwLjA3MSwzMjJjLTE4LjA4OSwwLjAwMS0zNS40NC0xMC4yNjYtNDMuNTc2LTI3LjcxMmMtOS40MS0yMC4xODEtMy41MjktNDMuNjM0LDEyLjg1Ny01Ny4yMzENCgljLTIuNzkxLDAuNzMyLTUuNTM5LDEuNzA5LTguMjA5LDIuOTU0Yy0yMy45ODcsMTEuMTg1LTM0LjQwMiwzOS44LTIzLjIxNyw2My43ODhjOC4xMzYsMTcuNDQ2LDI1LjQ4NywyNy43MTMsNDMuNTc2LDI3LjcxMg0KCWM2Ljc4MiwwLDEzLjY3MS0xLjQ0NCwyMC4yMTItNC40OTVjMy44MTQtMS43NzksNy4yODItNC4wMDEsMTAuMzc4LTYuNTczQzQ4OC4xMDksMzIxLjQ4Miw0ODQuMDcyLDMyMiw0ODAuMDcxLDMyMnoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiMzQzlGRTg7IiBkPSJNNDcyLDM5NEg0MGMtMjIuMDU2LDAtNDAsMTcuOTQ0LTQwLDQwdjI0YzAsNC40MTgsMy41ODIsOCw4LDhoNDk2YzQuNDE4LDAsOC0zLjU4Miw4LTh2LTI0DQoJQzUxMiw0MTEuOTQ0LDQ5NC4wNTYsMzk0LDQ3MiwzOTR6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojNDI3RkM5OyIgZD0iTTAsNDQyLjMzM1Y0NThjMCw0LjQxOCwzLjU4Miw4LDgsOGg0OTZjNC40MTgsMCw4LTMuNTgyLDgtOHYtMTUuNjY3SDB6Ii8+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"step,step\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.step.desktop\"\nLABEL oc.launch=\"step.step\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Step\"\nLABEL oc.displayname=\"Step\"\nLABEL oc.path=\"/usr/bin/step\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-step;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Step\"\nENV APPBIN \"/usr/bin/step\"\nENV APP \"/usr/bin/step\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/step/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/step/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Step

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Step.d\n
"},{"location":"applications/step/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Step.d -t Step .\n
"},{"location":"applications/step/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Step > Step.json\ndocker image save Step -o Step.tar\nctr -n k8s.io images import Step.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Step.json\n\n
"},{"location":"applications/stress/","title":"stress","text":""},{"location":"applications/stress/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/stress/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/stress/#ubuntu-packages","title":"Ubuntu packages","text":"
at-spi2-core gnome-terminal dbus-x11 stress\n
"},{"location":"applications/stress/#arguments","title":"Arguments","text":"

\"--disable-factory --class=stress\"

"},{"location":"applications/stress/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/stress/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/stress/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.stress\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/stress/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/gnome-terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/stress/#json-dump","title":"JSON dump","text":"

json source file stress.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"at-spi2-core gnome-terminal dbus-x11 stress\",\n    \"icon\": \"stress.svg\",\n    \"keyword\": \"stress,cpu,shell\",\n    \"launch\": \"gnome-terminal-server.stress\",\n    \"name\": \"stress\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false,\n        \"ipc_mode\": false\n    },\n    \"args\": \"--disable-factory --class=stress\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/gnome-terminal.desktop\"\n}\n
"},{"location":"applications/stress/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output stress.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stress.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stress.d.3.0.json\n\n
"},{"location":"applications/stress/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends at-spi2-core gnome-terminal dbus-x11 stress && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"stress.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDk2LjgiIGhlaWdodD0iNDk2LjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CgogPGc+CiAgPHRpdGxlPkxheWVyIDE8L3RpdGxlPgogIDxwYXRoIGlkPSJzdmdfMSIgZmlsbD0iIzZlYzZmMCIgZD0ibTE1Miw0ODRjMCw2LjQgLTUuNiwxMiAtMTIsMTJsMCwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsLTQ3MmMwLC02LjQgNS42LC0xMiAxMiwtMTJsMCwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDQ3MnoiLz4KICA8cGF0aCBpZD0ic3ZnXzMiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0yMDgsNDg0YzAsNi40IC01LjYsMTIgLTEyLDEybDAsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLC00NzJjMCwtNi40IDUuNiwtMTIgMTIsLTEybDAsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCw0NzJ6Ii8+CiAgPHBhdGggaWQ9InN2Z181IiBmaWxsPSIjNmVjNmYwIiBkPSJtMzEyLDQ4NGMwLDYuNCAtNS42LDEyIC0xMiwxMmwwLDBjLTYuNCwwIC0xMiwtNS42IC0xMiwtMTJsMCwtNDcyYzAsLTYuNCA1LjYsLTEyIDEyLC0xMmwwLDBjNi40LDAgMTIsNS42IDEyLDEybDAsNDcyeiIvPgogIDxwYXRoIGlkPSJzdmdfNyIgZmlsbD0iIzZlYzZmMCIgZD0ibTM2OCw0ODRjMCw2LjQgLTUuNiwxMiAtMTIsMTJsMCwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsLTQ3MmMwLC02LjQgNS42LC0xMiAxMiwtMTJsMCwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDQ3MnoiLz4KICA8cGF0aCBpZD0ic3ZnXzkiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0yNjAsNDg0YzAsNi40IC01LjYsMTIgLTEyLDEybDAsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLC00NzJjMCwtNi40IDUuNiwtMTIgMTIsLTEybDAsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCw0NzJ6Ii8+CiAgPHBhdGggaWQ9InN2Z18xMSIgZmlsbD0iIzZlYzZmMCIgZD0ibTEyLjgsMTUyYy03LjIsMCAtMTIuOCwtNC44IC0xMi44LC0xMmwwLDBjMCwtNy4yIDUuNiwtMTIgMTIuOCwtMTJsNDcxLjIsMGM3LjIsMCAxMi44LDQuOCAxMi44LDEybDAsMGMwLDcuMiAtNS42LDEyIC0xMi44LDEybC00NzEuMiwweiIvPgogIDxwYXRoIGlkPSJzdmdfMTMiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im00OTYsMTk2YzAsNi40IC01LjYsMTIgLTEyLDEybC00NzIsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLDBjMCwtNi40IDUuNiwtMTIgMTIsLTEybDQ3MiwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDB6Ii8+CiAgPHBhdGggaWQ9InN2Z18xNSIgZmlsbD0iIzZlYzZmMCIgZD0ibTQ5NiwzMDBjMCw2LjQgLTUuNiwxMiAtMTIsMTJsLTQ3MiwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsMGMwLC02LjQgNS42LC0xMiAxMiwtMTJsNDcyLDBjNi40LDAgMTIsNS42IDEyLDEybDAsMHoiLz4KICA8cGF0aCBpZD0ic3ZnXzE3IiBmaWxsPSIjNmVjNmYwIiBkPSJtNDk2LDI1MWMwLDYuNCAtNS42LDEyIC0xMiwxMmwtNDcyLDBjLTYuNCwwIC0xMiwtNS42IC0xMiwtMTJsMCwwYzAsLTYuNCA1LjYsLTEyIDEyLC0xMmw0NzIsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCwweiIvPgogIDxwYXRoIGlkPSJzdmdfMTkiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0xMi44LDM2OGMtNy4yLDAgLTEyLjgsLTQuOCAtMTIuOCwtMTJsMCwwYzAsLTcuMiA1LjYsLTEyIDEyLjgsLTEybDQ3MS4yLDBjNy4yLDAgMTIuOCw0LjggMTIuOCwxMmwwLDBjMCw3LjIgLTUuNiwxMiAtMTIuOCwxMmwtNDcxLjIsMHoiLz4KICA8cGF0aCBpZD0ic3ZnXzIxIiBmaWxsPSIjMzYzRjNFIiBkPSJtNDA4LDM4MS42YzAsMTQuNCAtMTIsMjYuNCAtMjYuNCwyNi40bC0yNTkuMiwwYy0xNC40LDAgLTI2LjQsLTEyIC0yNi40LC0yNi40bDAsLTI1OS4yYzAsLTE0LjQgMTIsLTI2LjQgMjYuNCwtMjYuNGwyNTkuMiwwYzE0LjQsMCAyNi40LDEyIDI2LjQsMjYuNGwwLDI1OS4yeiIvPgogIDxwYXRoIGlkPSJzdmdfMjIiIGQ9Im05NiwxMjIuNGMwLC0xNC40IDEyLC0yNi40IDI2LjQsLTI2LjRsMjU5LjIsMGMxNC40LDAgMjYuNCwxMiAyNi40LDI2LjRsMCwyNTkuMmMwLDE0LjQgLTEyLDI2LjQgLTI2LjQsMjYuNCIvPgogIDxwYXRoIGlkPSJzdmdfMjMiIGZpbGw9IiM0OTUxNTAiIGQ9Im0zNTIsMzM1LjJjMCw5LjYgLTcuMiwxNi44IC0xNi44LDE2LjhsLTE2Ni40LDBjLTkuNiwwIC0xNi44LC03LjIgLTE2LjgsLTE2LjhsMCwtMTY2LjRjMCwtOS42IDcuMiwtMTYuOCAxNi44LC0xNi44bDE2Ni40LDBjOS42LDAgMTYuOCw3LjIgMTYuOCwxNi44bDAsMTY2LjR6Ii8+CiAgPGcgaWQ9InN2Z18yOSIvPgogIDxnIGlkPSJzdmdfMzAiLz4KICA8ZyBpZD0ic3ZnXzMxIi8+CiAgPGcgaWQ9InN2Z18zMiIvPgogIDxnIGlkPSJzdmdfMzMiLz4KICA8ZyBpZD0ic3ZnXzM0Ii8+CiAgPGcgaWQ9InN2Z18zNSIvPgogIDxnIGlkPSJzdmdfMzYiLz4KICA8ZyBpZD0ic3ZnXzM3Ii8+CiAgPGcgaWQ9InN2Z18zOCIvPgogIDxnIGlkPSJzdmdfMzkiLz4KICA8ZyBpZD0ic3ZnXzQwIi8+CiAgPGcgaWQ9InN2Z180MSIvPgogIDxnIGlkPSJzdmdfNDIiLz4KICA8ZyBpZD0ic3ZnXzQzIi8+CiA8L2c+Cjwvc3ZnPg==\"\nLABEL oc.keyword=\"stress,stress,cpu,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"gnome-terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.stress\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=stress\"\nLABEL oc.name=\"stress\"\nLABEL oc.displayname=\"stress\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"stress\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=stress\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/stress/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/stress/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application stress

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stress.d\n
"},{"location":"applications/stress/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f stress.d -t stress .\n
"},{"location":"applications/stress/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect stress > stress.json\ndocker image save stress -o stress.tar\nctr -n k8s.io images import stress.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stress.json\n\n
"},{"location":"applications/sublime-text/","title":"sublime-Text","text":""},{"location":"applications/sublime-text/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/sublime-text/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/sublime-text/#ubuntu-packages","title":"Ubuntu packages","text":"
sublime-text\n
"},{"location":"applications/sublime-text/#path","title":"Path","text":"
/opt/sublime_text/sublime_text\n
"},{"location":"applications/sublime-text/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/sublime-text/#wm_class","title":"WM_CLASS","text":"
sublime_text.Sublime_text\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/sublime-text/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/sublime_text.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/sublime-text/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\nRUN echo \"deb https://download.sublimetext.com/ apt/stable/\" | tee /etc/apt/sources.list.d/sublime-text.list\nRUN apt-get update && apt-get install --yes libgl1 && apt-get clean\n
"},{"location":"applications/sublime-text/#json-dump","title":"JSON dump","text":"

json source file sublime-text.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\",\n        \"RUN echo \\\"deb https://download.sublimetext.com/ apt/stable/\\\" | tee /etc/apt/sources.list.d/sublime-text.list\",\n        \"RUN apt-get update && apt-get install --yes libgl1 && apt-get clean\"\n    ],\n    \"debpackage\": \"sublime-text\",\n    \"installrecommends\": true,\n    \"icon\": \"circle_sublime-text.svg\",\n    \"keyword\": \"ide,code,sublime-text\",\n    \"launch\": \"sublime_text.Sublime_text\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"sublime-Text\",\n    \"path\": \"/opt/sublime_text/sublime_text\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/sublime_text.desktop\"\n}\n
"},{"location":"applications/sublime-text/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output sublime-text.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sublime-text.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sublime-text.d.3.0.json\n\n
"},{"location":"applications/sublime-text/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\nRUN echo \"deb https://download.sublimetext.com/ apt/stable/\" | tee /etc/apt/sources.list.d/sublime-text.list\nRUN apt-get update && apt-get install --yes libgl1 && apt-get clean\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y sublime-text && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_sublime-text.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iU3VibGltZS1UZXh0IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InN1YmxpbWUtaWNvbi1iIiB4MT0iMTkzLjU5IiB4Mj0iMjExLjQ5IiB5MT0iNDE0LjU2IiB5Mj0iMzI0Ljc1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuODcxNyAwIDAgMS4yNDc4IDE4Mi4wNSAxNTkuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRjk3MDAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjRjQ4RTAwIiBvZmZzZXQ9Ii41MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjQ0U2RTAwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjUyMC40NCIgeDI9IjUyMCIgeTE9IjM2LjgyMiIgeTI9Ijk4NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0ZDRkNGQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzIzMjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjUyMCIgeDI9IjUyMCIgeTE9IjQiIHkyPSIxMDI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmOWY5ZjkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDQxMzc3IiB5PSItLjAzMTg2IiB3aWR0aD0iMS4wODI4IiBoZWlnaHQ9IjEuMDYzNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi43NzE0MDczIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IHgxPSI1MjAiIHgyPSI1MjAiIHkxPSI0IiB5Mj0iMTAyNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTA0Njg4Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDYzODA5IDAgMCAuMDYzODA5IC0uNjY5OTkgLS42Njk5OSkiIHN0cm9rZS13aWR0aD0iMTUuNjcyIj4KICA8Zz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzAuMTYiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHJva2UtbWl0ZXJsaW1pdD0iMCIgc3Ryb2tlLXdpZHRoPSIwIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICA8ZyBpZD0ic2hhZG93IiB0cmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9IjE1LjY3MiI+PC9nPgogICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1MTIiIHI9IjQ3MC4xNiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLW1pdGVybGltaXQ9IjAiIHN0cm9rZS13aWR0aD0iMCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMTQuNDgzIDMuODgwNykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iMjQuMDQ1Ij4KICAgIDxwYXRoIGQ9Im03MDguMjggNTEyLjA4YzAtNS45ODE2LTQuNDE5Mi05LjQzMDgtOS44NDI0LTcuNzE3MWwtMzczLjA4IDExOC4zNGMtNS40MzQgMS43MjQ2LTkuODQyNCA3Ljk3OS05Ljg0MjQgMTMuOTV2MTIwLjk1YzAgNS45ODE2IDQuNDA4MyA5LjQ0MTcgOS44NDI0IDcuNzE3MWwzNzMuMDgtMTE4LjMzYzUuNDIzMS0xLjcyNDYgOS44NDI0LTcuOTc5IDkuODQyNC0xMy45NjF6Ii8+CiAgICA8cGF0aCBkPSJtMzE1LjUyIDUwOC45YzAgNS45ODEyIDQuNDA3NyAxMi4yMzUgOS44NDEgMTMuOTZsMzczLjA5IDExOC4zNWM1LjQzMzMgMS43MjQ1IDkuODQxLTEuNzM1NCA5Ljg0MS03LjcwNTd2LTEyMC45NmMwLTUuOTcwMy00LjQwNzctMTIuMjI0LTkuODQxLTEzLjk0OWwtMzczLjA5LTExOC4zNWMtNS40MzMzLTEuNzI0NS05Ljg0MSAxLjcyNDUtOS44NDEgNy43MDU3eiIvPgogICAgPHBhdGggZD0ibTcwOC4yOCAyNjMuODRjMC01Ljk4MTYtNC40MTkyLTkuNDQxNy05Ljg0MjQtNy43MTcxbC0zNzMuMDggMTE4LjMzYy01LjQzNCAxLjcyNDYtOS44NDI0IDcuOTc5MS05Ljg0MjQgMTMuOTYxdjEyMC45NWMwIDUuOTgxNiA0LjQwODMgOS40MzA4IDkuODQyNCA3LjcxNzFsMzczLjA4LTExOC4zNGM1LjQyMzEtMS43MjQ2IDkuODQyNC03Ljk3OSA5Ljg0MjQtMTMuOTV6Ii8+CiAgIDwvZz4KICA8L2c+CiAgPGcgc3Ryb2tlLXdpZHRoPSIyMy45NTEiPgogICA8cGF0aCBkPSJtNzIwIDUwNGMwLTUuOTU4Mi00LjQwMi05LjM5NC05LjgwMzktNy42ODY5bC0zNzEuNjMgMTE3Ljg4Yy01LjQxMjggMS43MTc5LTkuODAzOSA3Ljk0NzktOS44MDM5IDEzLjg5NXYxMjAuNDhjMCA1Ljk1ODIgNC4zOTExIDkuNDA0OCA5LjgwMzkgNy42ODdsMzcxLjYzLTExNy44N2M1LjQwMTktMS43MTc5IDkuODAzOS03Ljk0NzkgOS44MDM5LTEzLjkwNnoiIGZpbGw9InVybCgjc3VibGltZS1pY29uLWIpIi8+CiAgIDxwYXRoIGQ9Im0zMjguNzcgNTAwLjgzYzAgNS45NTc4IDQuMzkwNSAxMi4xODcgOS44MDI2IDEzLjkwNWwzNzEuNjMgMTE3Ljg4YzUuNDEyIDEuNzE3OCA5LjgwMjYtMS43Mjg2IDkuODAyNi03LjY3NTZ2LTEyMC40OGMwLTUuOTQ3LTQuMzkwNS0xMi4xNzctOS44MDI2LTEzLjg5NGwtMzcxLjYzLTExNy44OGMtNS40MTItMS43MTc4LTkuODAyNiAxLjcxNzgtOS44MDI2IDcuNjc1NnoiIGZpbGw9IiNmZjk4MDAiLz4KICAgPHBhdGggZD0ibTcyMCAyNTYuNzNjMC01Ljk1ODItNC40MDItOS40MDQ4LTkuODAzOS03LjY4N2wtMzcxLjYzIDExNy44N2MtNS40MTI4IDEuNzE3OS05LjgwMzkgNy45NDc5LTkuODAzOSAxMy45MDZ2MTIwLjQ4YzAgNS45NTgyIDQuMzkxMSA5LjM5NCA5LjgwMzkgNy42ODdsMzcxLjYzLTExNy44OGM1LjQwMTktMS43MTc5IDkuODAzOS03Ljk0NzkgOS44MDM5LTEzLjg5NXoiIGZpbGw9IiNmZjk4MDAiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"sublime-text,ide,code,sublime-text\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"sublime_text.desktop\"\nLABEL oc.launch=\"sublime_text.Sublime_text\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"sublime-Text\"\nLABEL oc.displayname=\"sublime-Text\"\nLABEL oc.path=\"/opt/sublime_text/sublime_text\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"sublime-Text\"\nENV APPBIN \"/opt/sublime_text/sublime_text\"\nENV APP \"/opt/sublime_text/sublime_text\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/sublime-text/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/sublime-text/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application sublime-Text

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sublime-Text.d\n
"},{"location":"applications/sublime-text/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f sublime-Text.d -t sublime-Text .\n
"},{"location":"applications/sublime-text/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect sublime-Text > sublime-Text.json\ndocker image save sublime-Text -o sublime-Text.tar\nctr -n k8s.io images import sublime-Text.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sublime-Text.json\n\n
"},{"location":"applications/sudoku/","title":"sudoku","text":""},{"location":"applications/sudoku/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/sudoku/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/sudoku/#alpine-packages","title":"Alpine packages","text":"
gnome-sudoku\n
"},{"location":"applications/sudoku/#path","title":"Path","text":"
/usr/bin/gnome-sudoku\n
"},{"location":"applications/sudoku/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/sudoku/#wm_class","title":"WM_CLASS","text":"
org.gnome.Sudoku.org.gnome.Sudoku\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/sudoku/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Sudoku.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/sudoku/#json-dump","title":"JSON dump","text":"

json source file sudoku.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"gnome-sudoku\",\n    \"icon\": \"org.gnome.Sudoku.svg\",\n    \"keyword\": \"sudoku\",\n    \"launch\": \"org.gnome.Sudoku.org.gnome.Sudoku\",\n    \"name\": \"sudoku\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-sudoku\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Sudoku.desktop\"\n}\n
"},{"location":"applications/sudoku/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output sudoku.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sudoku.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sudoku.d.3.0.json\n\n
"},{"location":"applications/sudoku/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-sudoku\nLABEL oc.icon=\"org.gnome.Sudoku.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjMxLjIyMiIgeDI9IjMxLjYyOCIgeTE9IjYxLjE0NyIgeTI9IjIuODUzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzlhOWE5YSIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0ic2lsdmVyIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjMxLjY0MSIgeDI9IjMyLjE2OCIgeTE9IjYxLjMzOSIgeTI9IjMuODEyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2VmYjUyOCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2U2OWM3NiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMS43MjIiIHgyPSIzMi4yNzgiIHkxPSI2Mi44NzMiIHkyPSIuNzQzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48ZmlsdGVyIGlkPSJhIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xNiIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMTUzIiB5PSItLjA5OCIgd2lkdGg9IjEuMzA2IiBoZWlnaHQ9IjEuMTk2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii4zNiIvPjwvZmlsdGVyPjwvZGVmcz48cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0NiAtLjU0NikiIGQ9Ik05MjkuODUgMjg5LjY1Yy0yLjM1LTQuMzUtNC45NS05LTcuNjUtMTMuNi0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1Qzc3My4yNSAxMDUuNyA2ODguNyA2MS42NSA1OTIuMiA0Ni4yNWMtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LS41NS0xOS44NS0uODUtMzAuMS0uODUtOS4zNSAwLTE4LjYuMjUtMjcuOS43NS0xMTguMzUgNi4xLTIyMC4zIDUxLjk1LTMwNS44NSAxMzcuNS0yMC41IDIwLjUtMzguNzUgNDEuOTUtNTQuNyA2NC40LTE1LjM1IDIxLjU1LTI4LjU1IDQ0LTM5LjYgNjcuMmwtLjAyNS0uMDI1UTQwLjA1IDQwMS44NzMgNDAuMDUgNTEyLjA1NWMwIDEzMC4zNSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjggNTYuNyA1Ni42NSAxMjAuNTUgOTUuOSAxOTEuMSAxMTcuNTUgMzYuNzUgMTEuMjUgNzQuOCAxNy44NSAxMTQuNzUgMTkuOTVoLjRjOC41LjQ1IDE2LjYuNyAyNC41LjdoM2MxMC4zIDAgMjAuNS0uMyAzMC4xLS44IDIuNS0uMTUgNC43NS0uMyA2Ljk1LS40NSAyMC4yLTEuNDUgMzkuOS00LjA1IDU4LjctNy43IDcuOTUtMS41NSAxNS44LTMuMyAyMy40LTUuMTUgODAuOC0yMC4zIDE1Mi4xNS02MS42IDIxNC42NS0xMjQuMSA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTguNDUtNDcuNjUgMjguNjUtOTguOCAzMC41NS0xNTMuNS4yLTYuMDUuMy0xMi4yNS4zLTE4LjV2LTNjLS4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTUuMDUtMTQuMjUtMTAuODUtMjguMjUtMTcuNDUtNDIuMTUtMS44NS0zLjgtMy43NS03LjY1LTUuNy0xMS41LTEuNDUtMi44NS0yLjk1LTUuNy00LjY1LTguOHoiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjYwIiByeD0iMzAiIHJ5PSIzMCIgZmlsbD0idXJsKCNiKSIvPjxyZWN0IHg9IjIxLjI4NiIgeT0iMjEuMjg2IiB3aWR0aD0iMjEuNDI5IiBoZWlnaHQ9IjIxLjQyOSIgcnk9IjAiIGZpbGw9InVybCgjYykiLz48ZyBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMjYuNjE2IDIxLjI2NnEwIC44NjQtLjQ5MiAxLjM4LS40OC41MDQtMS4yODQuNjcydi4wNDhxMS4wMi4xMiAxLjUyNC42NDguNTE2LjUyOC41MTYgMS4zOCAwIC43NTYtLjM0OCAxLjMzMnQtMS4wOC45cS0uNzIuMzI0LTEuODYuMzI0LS42NzIgMC0xLjI0OC0uMTA4LS41NzYtLjA5Ni0xLjEwNC0uMzZ2LS45ODRxLjU0LjI3NiAxLjE2NC40MnQxLjIuMTQ0cTEuMTUyIDAgMS42NTYtLjQ0NC41MTYtLjQ1Ni41MTYtMS4yNDggMC0uODA0LS42MzYtMS4xNTItLjYyNC0uMzYtMS43NjQtLjM2aC0uODI4di0uOWguODRxMS4wNTYgMCAxLjU5Ni0uNDQ0LjU1Mi0uNDQ0LjU1Mi0xLjE3NiAwLS42MjQtLjQyLS45Ni0uNDItLjM0OC0xLjE0LS4zNDgtLjY5NiAwLTEuMTg4LjIwNHQtLjk3Mi41MTZsLS41MjgtLjcycS40NTYtLjM2IDEuMTI4LS42MjQuNjg0LS4yNjQgMS41NDgtLjI2NCAxLjM0NCAwIDEuOTkyLjYuNjYuNi42NiAxLjUyNHoiIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjUxOTggMCAwIDEuNDU5NyAtNC41NjUgLTIuMzcpIi8+PHBhdGggZD0iTTM1Ljg4NiAyOC42NzJxMCAxLjI2LS43NDggMi4wMTQtLjczLjczNi0xLjk1Mi45OHYuMDcxcTEuNTUuMTc1IDIuMzE3Ljk0Ni43ODQuNzcuNzg0IDIuMDE0IDAgMS4xMDQtLjUzIDEuOTQ1dC0xLjY0IDEuMzEzcS0xLjA5NS40NzMtMi44MjcuNDczLTEuMDIyIDAtMS44OTctLjE1Ny0uODc1LS4xNC0xLjY3OC0uNTI2VjM2LjMxcS44Mi40MDMgMS43Ny42MTN0MS44MjMuMjFxMS43NSAwIDIuNTE3LS42NDguNzg0LS42NjYuNzg0LTEuODIyIDAtMS4xNzMtLjk2Ny0xLjY4MS0uOTQ4LS41MjYtMi42OC0uNTI2aC0xLjI1OXYtMS4zMTRoMS4yNzdxMS42MDUgMCAyLjQyNS0uNjQ4Ljg0LS42NDguODQtMS43MTYgMC0uOTExLS42NC0xLjQwMi0uNjM3LS41MDgtMS43MzItLjUwOC0xLjA1NyAwLTEuODA1LjI5OHQtMS40NzcuNzUzbC0uODAzLTEuMDVxLjY5My0uNTI2IDEuNzE0LS45MTEgMS4wNC0uMzg2IDIuMzUzLS4zODYgMi4wNDMgMCAzLjAyOC44NzYgMS4wMDMuODc2IDEuMDAzIDIuMjI1eiIvPjwvZz48cGF0aCBkPSJNMjEuMjg2IDMuOTkyQTI5LjkxMyAyOS45MTMgMCAwIDAgMy45OTIgMjEuMjg2aDE3LjI5NHptMjEuNDI5IDB2MTcuMjk0aDE3LjI5NEEyOS45MTMgMjkuOTEzIDAgMCAwIDQyLjcxNSAzLjk5MnpNMy45OTMgNDIuNzE0YTI5LjkxMyAyOS45MTMgMCAwIDAgMTcuMjk0IDE3LjI5NFY0Mi43MTR6bTM4LjcyMiAwdjE3LjI5NGEyOS45MTMgMjkuOTEzIDAgMCAwIDE3LjI5NC0xNy4yOTR6IiBmaWxsPSJ1cmwoI2UpIi8+PC9zdmc+\"\nLABEL oc.keyword=\"sudoku,sudoku\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Sudoku.desktop\"\nLABEL oc.launch=\"org.gnome.Sudoku.org.gnome.Sudoku\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"sudoku\"\nLABEL oc.displayname=\"sudoku\"\nLABEL oc.path=\"/usr/bin/gnome-sudoku\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"sudoku\"\nENV APPBIN \"/usr/bin/gnome-sudoku\"\nENV APP \"/usr/bin/gnome-sudoku\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/sudoku/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/sudoku/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application sudoku

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sudoku.d\n
"},{"location":"applications/sudoku/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f sudoku.d -t sudoku .\n
"},{"location":"applications/sudoku/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect sudoku > sudoku.json\ndocker image save sudoku -o sudoku.tar\nctr -n k8s.io images import sudoku.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sudoku.json\n\n
"},{"location":"applications/supertux2/","title":"supertux2","text":""},{"location":"applications/supertux2/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpinei.minimal

"},{"location":"applications/supertux2/#distribution","title":"Distribution","text":"

alpine

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/supertux2/#alpine-packages","title":"Alpine packages","text":"
supertux mesa-gl mesa-egl mesa-dri-gallium\n
"},{"location":"applications/supertux2/#displayname","title":"Displayname","text":"
supertux2\n
"},{"location":"applications/supertux2/#path","title":"Path","text":"
/usr/games/supertux2\n
"},{"location":"applications/supertux2/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/supertux2/#wm_class","title":"WM_CLASS","text":"
supertux2.supertux2\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/supertux2/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/supertux2.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/supertux2/#json-dump","title":"JSON dump","text":"

json source file supertux2.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"supertux mesa-gl mesa-egl mesa-dri-gallium\",\n    \"icon\": \"circle_supertux.svg\",\n    \"keyword\": \"supertux\",\n    \"launch\": \"supertux2.supertux2\",\n    \"name\": \"supertux2\",\n    \"displayname\": \"supertux2\",\n    \"path\": \"/usr/games/supertux2\",\n    \"template\": \"abcdesktopio/oc.template.alpinei.minimal\",\n    \"desktopfile\": \"/usr/share/applications/supertux2.desktop\"\n}\n
"},{"location":"applications/supertux2/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output supertux2.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/supertux2.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @supertux2.d.3.0.json\n\n
"},{"location":"applications/supertux2/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpinei.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update supertux mesa-gl mesa-egl mesa-dri-gallium\nLABEL oc.icon=\"circle_supertux.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iTXBsYXllciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjE2Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iLTIwLjU0MiIgeDI9Ii0yMy4wODUiIHkxPSI0MC44NTYiIHkyPSI0My4yOTciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTM2IDAgMCAxLjkxMzYgMTMwLjY3IDEyLjYwNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2E5YTlhOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNhOWE5YTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSItNTkuNjEyIiB4Mj0iLTQzLjc5MiIgeTE9IjUxLjE4NiIgeTI9IjUxLjE4NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjkxMzYgMCAwIDEuOTEzNiAxMzAuNjcgMTIuNjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZDcwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM5OTgxMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMjI4LjgxIiB4Mj0iMjI4LjgxIiB5MT0iNjExLjE4IiB5Mj0iNjE0LjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDMyNCAwIDAgMi4wMzI0IC0zODMuNzMgLTEyMTUuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9Ii00Ni4xMzUiIHgyPSItNDMuMjM0IiB5MT0iMjMuMTkiIHkyPSIyMi42NDUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTM2IDAgMCAxLjkxMzYgMTMwLjY3IDEyLjYwNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIzMjMyMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMzIzMjMiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImkiIHgxPSItMjMuNDY1IiB4Mj0iLTEyLjA3IiB5MT0iNDQuNTc4IiB5Mj0iNDQuNTc4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuOTEzNiAwIDAgMS45MTM2IDEzMC42NyAxMi42MDcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSItMjcuNjY1IiB4Mj0iLTI2LjE4NiIgeTE9IjI2LjY3IiB5Mj0iMzYuNjM2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuOTEzNiAwIDAgMS45MTM2IDEzMC41OSAxMy4zMjYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZGZkZmQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTZhNmE2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjMyIiB4Mj0iMzIiIHkxPSIyIiB5Mj0iNjIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZkZmRmZCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkY2RjZGMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjIiIHkyPSI2MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguODMzMzMgMCAwIC44MzMzMyA1LjMzMzMgNS4zMzMyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmJkZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQ3YTZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA3MDE2NCIgeT0iLS4wNTI0MDgiIHdpZHRoPSIxLjE0MDMiIGhlaWdodD0iMS4xMDQ4IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjY5MzA1MSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzU1OSAwIDAgLjA2MzU1OSAtLjU0NTU1IC0uNTQ1NTUpIiBkPSJtOTI5Ljg1IDI4OS42NWMtMi4zNS00LjM1LTQuOTUtOS03LjY1LTEzLjYtMjAuMy0zNC41LTQ1LjgtNjcuMi03Ni4zNS05Ny43NS03Mi42LTcyLjYtMTU3LjE1LTExNi42NS0yNTMuNjUtMTMyLjA1LTE2LjI1LTIuNi0zMi44LTQuNC01MC4wNS01LjM1LTkuNy0wLjU1LTE5Ljg1LTAuODUtMzAuMS0wLjg1LTkuMzUgMC0xOC42IDAuMjUtMjcuOSAwLjc1LTExOC4zNSA2LjEtMjIwLjMgNTEuOTUtMzA1Ljg1IDEzNy41LTIwLjUgMjAuNS0zOC43NSA0MS45NS01NC43IDY0LjQtMTUuMzUgMjEuNTUtMjguNTUgNDQtMzkuNiA2Ny4ybC0wLjAyNS0wLjAyNXEtNDMuOTI1IDkxLjk5OC00My45MjUgMjAyLjE4YzAgMTMwLjM1IDQ2LjEgMjQxLjY1IDEzOC4yNSAzMzMuOCA1Ni43IDU2LjY1IDEyMC41NSA5NS45IDE5MS4xIDExNy41NSAzNi43NSAxMS4yNSA3NC44IDE3Ljg1IDExNC43NSAxOS45NWgwLjRjOC41IDAuNDUgMTYuNiAwLjcgMjQuNSAwLjdoM2MxMC4zIDAgMjAuNS0wLjMgMzAuMS0wLjggMi41LTAuMTUgNC43NS0wLjMgNi45NS0wLjQ1IDIwLjItMS40NSAzOS45LTQuMDUgNTguNy03LjcgNy45NS0xLjU1IDE1LjgtMy4zIDIzLjQtNS4xNSA4MC44LTIwLjMgMTUyLjE1LTYxLjYgMjE0LjY1LTEyNC4xIDQ4LjYtNDguNiA4NC40LTEwMi41IDEwNy4zNS0xNjEuOCAxOC40NS00Ny42NSAyOC42NS05OC44IDMwLjU1LTE1My41IDAuMi02LjA1IDAuMy0xMi4yNSAwLjMtMTguNXYtM2MtMC4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTUuMDUtMTQuMjUtMTAuODUtMjguMjUtMTcuNDUtNDIuMTUtMS44NS0zLjgtMy43NS03LjY1LTUuNy0xMS41LTEuNDUtMi44NS0yLjk1LTUuNy00LjY1LTguOHoiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY4MyIvPgogPHBhdGggZD0ibTU4LjU1NSAxNy44NjRjLTAuMTQ5MzYtMC4yNzY0OC0wLjMxNDYyLTAuNTcyMDMtMC40ODYyMy0wLjg2NDQxLTEuMjkwMy0yLjE5MjgtMi45MTEtNC4yNzEyLTQuODUyNy02LjIxMjktNC42MTQ0LTQuNjE0NC05Ljk4ODMtNy40MTQyLTE2LjEyMi04LjM5My0xLjAzMjgtMC4xNjUyNS0yLjA4NDctMC4yNzk2Ni0zLjE4MTEtMC4zNDAwNC0wLjYxNjUyLTAuMDM0OTU4LTEuMjYxNy0wLjA1NDAyNS0xLjkxMzEtMC4wNTQwMjUtMC41OTQyOCAwLTEuMTgyMiAwLjAxNTg5LTEuNzczMyAwLjA0NzY2OS03LjUyMjIgMC4zODc3MS0xNC4wMDIgMy4zMDE5LTE5LjQ0IDguNzM5NC0xLjMwMyAxLjMwMy0yLjQ2MjkgMi42NjYzLTMuNDc2NyA0LjA5MzItMC45NzU2MyAxLjM2OTctMS44MTQ2IDIuNzk2Ni0yLjUxNjkgNC4yNzEybC0wLjAwMTU5LTAuMDAxNnEtMi43OTE4IDUuODQ3My0yLjc5MTggMTIuODVjMCA4LjI4NDkgMi45MzAxIDE1LjM1OSA4Ljc4NzEgMjEuMjE2IDMuNjAzOCAzLjYwMDYgNy42NjIxIDYuMDk1MyAxMi4xNDYgNy40NzE0IDIuMzM1OCAwLjcxNTA0IDQuNzU0MiAxLjEzNDUgNy4yOTM0IDEuMjY4aDAuMDI1NDJjMC41NDAyNSAwLjAyODYgMS4wNTUxIDAuMDQ0NDkgMS41NTcyIDAuMDQ0NDloMC4xOTA2OGMwLjY1NDY2IDAgMS4zMDMtMC4wMTkwNyAxLjkxMzEtMC4wNTA4NSAwLjE1ODktMC4wMDk1IDAuMzAxOTEtMC4wMTkwNyAwLjQ0MTc0LTAuMDI4NiAxLjI4MzktMC4wOTIxNiAyLjUzNi0wLjI1NzQyIDMuNzMwOS0wLjQ4OTQxIDAuNTA1My0wLjA5ODUyIDEuMDA0Mi0wLjIwOTc1IDEuNDg3My0wLjMyNzMzIDUuMTM1Ni0xLjI5MDMgOS42NzA1LTMuOTE1MiAxMy42NDMtNy44ODc3IDMuMDg5LTMuMDg5IDUuMzY0NC02LjUxNDggNi44MjMxLTEwLjI4NCAxLjE3MjctMy4wMjg2IDEuODIxLTYuMjc5NyAxLjk0MTctOS43NTYzIDAuMDEyNzEtMC4zODQ1MyAwLjAxOTA3LTAuNzc4NiAwLjAxOTA3LTEuMTc1OHYtMC4xOTA2OGMtMC4wMTI3MS0yLjU4MzctMC4zMTQ2Mi01LjA1My0wLjkwODktNy40MzY0LTAuMDY5OTEtMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDMtMC4yMzE5OS0wLjg2NDQxLTAuMDYzNTYtMC4yMTYxLTAuMTI3MTItMC40MzUzOC0wLjIwMDIxLTAuNjY3MzctMC4xMDE3LTAuMzI3MzMtMC4yMTYxLTAuNjY3MzctMC4zMzY4Ni0xLjAwNzQtMC4zMjA5Ny0wLjkwNTcyLTAuNjg5NjItMS43OTU1LTEuMTA5MS0yLjY3OS0wLjExNzU4LTAuMjQxNTItMC4yMzgzNS0wLjQ4NjIzLTAuMzYyMjktMC43MzA5My0wLjA5MjE2LTAuMTgxMTQtMC4xODc1LTAuMzYyMjktMC4yOTU1NS0wLjU1OTMyeiIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIuOTk2OCIvPgogPHBhdGggZD0ibTU0LjEyOSAyMC4yMmMtMC4xMjQ0Ny0wLjIzMDQtMC4yNjIxOC0wLjQ3NjctMC40MDUxOS0wLjcyMDM0LTEuMDc1Mi0xLjgyNzMtMi40MjU4LTMuNTU5My00LjA0NC01LjE3NzQtMy44NDUzLTMuODQ1My04LjMyMzYtNi4xNzg1LTEzLjQzNS02Ljk5NDItMC44NjA3LTAuMTM3NzEtMS43MzczLTAuMjMzMDUtMi42NTEtMC4yODMzNy0wLjUxMzc3LTAuMDI5MTMxLTEuMDUxNC0wLjA0NTAyMS0xLjU5NDMtMC4wNDUwMjEtMC40OTUyMyAwLTAuOTg1MTcgMC4wMTMyNDEtMS40Nzc4IDAuMDM5NzI0LTYuMjY4NSAwLjMyMzA5LTExLjY2OCAyLjc1MTYtMTYuMiA3LjI4MjgtMS4wODU4IDEuMDg1OC0yLjA1MjQgMi4yMjE5LTIuODk3MiAzLjQxMS0wLjgxMzAzIDEuMTQxNC0xLjUxMjIgMi4zMzA1LTIuMDk3NSAzLjU1OTNsLTAuMDAxMzMtMC4wMDEzcS0yLjMyNjUgNC44NzI4LTIuMzI2NSAxMC43MDljMCA2LjkwNDEgMi40NDE3IDEyLjc5OSA3LjMyMjYgMTcuNjggMy4wMDMyIDMuMDAwNSA2LjM4NTEgNS4wNzk0IDEwLjEyMiA2LjIyNjIgMS45NDY1IDAuNTk1ODcgMy45NjE5IDAuOTQ1NDUgNi4wNzc5IDEuMDU2N2gwLjAyMTE4YzAuNDUwMjEgMC4wMjM4MyAwLjg3OTI0IDAuMDM3MDggMS4yOTc3IDAuMDM3MDhoMC4xNTg5YzAuNTQ1NTUgMCAxLjA4NTgtMC4wMTU4OSAxLjU5NDMtMC4wNDIzOCAwLjEzMjQyLTAuMDA3OSAwLjI1MTU5LTAuMDE1ODkgMC4zNjgxMS0wLjAyMzgzIDEuMDY5OS0wLjA3NjggMi4xMTMzLTAuMjE0NTEgMy4xMDkxLTAuNDA3ODQgMC40MjEwOC0wLjA4MjEgMC44MzY4Ni0wLjE3NDc5IDEuMjM5NC0wLjI3Mjc4IDQuMjc5Ny0xLjA3NTIgOC4wNTg4LTMuMjYyNyAxMS4zNjktNi41NzMxIDIuNTc0Mi0yLjU3NDIgNC40NzAzLTUuNDI5IDUuNjg1OS04LjU2OTkgMC45NzcyMi0yLjUyMzggMS41MTc1LTUuMjMzMSAxLjYxODEtOC4xMzAzIDAuMDEwNTktMC4zMjA0NCAwLjAxNTg5LTAuNjQ4ODMgMC4wMTU4OS0wLjk3OTg3di0wLjE1ODljLTAuMDEwNTktMi4xNTMxLTAuMjYyMTgtNC4yMTA4LTAuNzU3NDItNi4xOTctMC4wNTgyNi0wLjIzMDQtMC4xMjQ0Ny0wLjQ3NjctMC4xOTMzMy0wLjcyMDM0LTAuMDUyOTctMC4xODAwOC0wLjEwNTkzLTAuMzYyODItMC4xNjY4NC0wLjU1NjE0LTAuMDg0NzUtMC4yNzI3OC0wLjE4MDA4LTAuNTU2MTQtMC4yODA3Mi0wLjgzOTUxLTAuMjY3NDgtMC43NTQ3Ny0wLjU3NDY4LTEuNDk2My0wLjkyNDI2LTIuMjMyNS0wLjA5Nzk5LTAuMjAxMjctMC4xOTg2Mi0wLjQwNTE5LTAuMzAxOTEtMC42MDkxMS0wLjA3NjgtMC4xNTA5NS0wLjE1NjI1LTAuMzAxOTEtMC4yNDYyOS0wLjQ2NjF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTY4Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMzE4OTEgMCAwIC4zMTg5MSAxMS4zNjEgMTEuODMpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjMuMTM1NiI+CiAgPHBhdGggZD0ibTY3LjcxMSA3NS41NjIgMjcuMTA1IDE3Ljg4OS0zLjk0NzIgOS40NTI2cy0yMi40NTctMTguMDEtMjMuMTU4LTI3LjM0MnoiLz4KICA8cGF0aCBkPSJtNzAuOTIyIDQ0LjUyMmMxMC4xMTktNi45MDg1IDI1LjAzOC0xOC43NTYgMjYuNjYxLTI0LjEzMSAxLjU1NjgtNS4xNTcgNy45Nzg4LTQuMTg0IDYuNTE5MiAxLjY1NDEtMS40NTk1IDUuODM4MS05LjQzODMgMjguODk5LTIxLjk5IDQ0LjI3MiIvPgogIDxwYXRoIGQ9Im0xOS43NDEgOTYuNzc0YzUuNzI3Ni0xLjY4MjcgOC45MzEyLTguMjg3IDEzLjEyMy0xMi40MjIgNy41OTcyIDYuOTczOSA0Ny4xNTIgMjAuMzgyIDI2LjU5MiAyMC43MjQtMTAuNTY1LTAuNjA4MzctMTYuNzEyIDUuMTI4OS0yMi40NjggOS44MDg5eiIvPgogIDxwYXRoIGQ9Im02My45MjYgMS4zOTM2Yy0xNC45OTkgMC4yNzUyMS0xOS45NTMgMTEuNjk3LTE5Ljk1MyAxNy4zMzggMCA1LjY0MTggMS44NTI4IDE3LjM2OS0yLjY4ODIgMjUuMDc1LTMgNS4wOTA5LTEyLjUwNiAxNy4xNTYtMTUuMjAxIDI4LjQ1NC0yLjY5MTggMTEuMjg0LTAuNTg5OCAzNS4wOSAzMC42ODYgMzUuNjQgMzIuMiAwLjU2NjcgMjkuOTg3IDcuNDQ2MiAyOS45ODcgNy40NDYybDExLjQyNi0yMS44MjdjLTIuOTg3NC0xLjQyNzYtNy41NTktMy41OTI4LTcuMzY5My0zLjk5NDkgNS43NDIzLTEyLjE3My05LjYzMDUtMzQuODA0LTEyLjUyLTQzLjYxMS0yLjg4OTctOC44MDY4IDAuNTA3MjYtMTAuOTg1IDIuODQ2Ni0xNi4zNTIgMi4zMzkzLTUuMzY2NiAzLjI4ODctMjguMTY5LTE3LjIxNS0yOC4xNjl6Ii8+CiAgPHBhdGggZD0ibTIxLjY4MSA5Ny4xNjdjLTIuODMzOC0yLjI2NjMtNS4yNjY4IDAuODcyMTItMy41NzA4IDMuODkwNCAxLjY5NTkgMy4wMTgzIDE2LjE2MyAxNy41NCAyMC4zMTggMjIuMTE3IDQuMTU1NCA0LjU3NyAxMS4zODktMi4xMDU2IDQuODU5NC01Ljg3MjctNi41My0zLjc2NzItMTguNzczLTE3Ljg2OS0yMS42MDctMjAuMTM1eiIvPgogIDxwYXRoIGQ9Im0yNS41NTkgODQuNDg2YzEuMTc3OCA0LjUxNDctNC4zNjI0IDkuOTI3NS03LjMyMDggMTIuNzEzLTMuODQ4IDMuNjIzIDAuMDk4MTQgNS41OTQzIDEuMzc0IDUuNDk2MiAxLjI3NTktMC4wOTggMTAuNzYyLTMuNTI4MyAxOC4xMjMgMC41OTM4MiIvPgogIDxwYXRoIGQ9Im03My4xMzEgMTEuMzM5Yy00LjMwNDctMC4wNDkwOC03LjMwNzQgNC44NDI5LTUuMDU4MyAxMC42IDEuMjg5MSAzLjI5OTkgOS43NjU4IDMuMTE4NyAxMC4zMDQtMC4zMTk4NSAwLjkxNzgyLTUuODY0My0wLjk4NzM3LTEwLjIzMi01LjI0NTYtMTAuMjh6Ii8+CiAgPHBhdGggZD0ibTcyLjc2MSAxNy4yOTFhMy4wMzgzIDMuNjg1OCAwIDAgMSA0LjI5MTEtMC4wMDc5IDMuMDM4MyAzLjY4NTggMCAwIDEgMC4wMTcyIDUuMjA1NSAzLjAzODMgMy42ODU4IDAgMCAxLTQuMjkxIDAuMDM0NjEgMy4wMzgzIDMuNjg1OCAwIDAgMS0wLjAzOTk2LTUuMjA1MyIvPgogIDxwYXRoIGQ9Im04MS40NjMgMzMuMDM2YzIuNzIyIDAuMDkwNjYgMTguODczLTMuMDg0OSAxOS4wNTQtNS4zNTMzIDAuMTgxNS0yLjI2ODMtMTEuMzQyLTMuMzU3MS0xMy42MS00LjM1NTItMi4yNjgzLTAuOTk4MDgtMTMuMjkzLTMuOTQxOS0xMy4xNTYgMy40NDc5IDAuMTM2NzkgNy4zODk3IDQuOTkwMyA2LjE2OTkgNy43MTIzIDYuMjYwNnoiLz4KICA8cGF0aCBkPSJtNzcuMzI0IDI4LjgwMmM1Ljc0MTMgMS4yNDY4IDEyLjcwMyAxLjY2ODQgMTYuNTUzIDEuMDI2NSIgc3Ryb2tlPSIjYWU5MzAwIiBzdHJva2Utd2lkdGg9IjMuMTg2NSIvPgogIDxwYXRoIGQ9Im04MS40NjMgMzMuMDM2YzIuNzIyIDAuMDkwNjYgMTguODczLTMuMDg0OSAxOS4wNTQtNS4zNTMzIDAuMTgxNS0yLjI2ODMtMTEuMzQyLTMuMzU3MS0xMy42MS00LjM1NTItMi4yNjgzLTAuOTk4MDgtMTMuMjkzLTMuOTQxOS0xMy4xNTYgMy40NDc5IDAuMTM2NzkgNy4zODk3IDQuOTkwMyA2LjE2OTkgNy43MTIzIDYuMjYwNnoiLz4KICA8cGF0aCBkPSJtNDUuODM2IDQwLjE2OGMtMTMuNTEyIDExLjQ0Mi0zNC43MjkgMzguNzktMzAuNDg1IDQxLjQ1IDMuNjYwMyAyLjI5MzQgMjUuNDc1LTE2LjYyMSAzNC43LTE4LjU1Ii8+CiAgPHBhdGggZD0ibTQwLjU1MyA0NS4xNjJjLTguNTU2NyA5LjA2NjctMjAuNzczIDIzLjQ2MS0yNC42MjUgMzEuMjY0LTMuODAyNCA2LjAxNzkgMC41OTYzMiA4LjI2MzQgNS43NTI1IDMuMzI2MiA3LjAwMzEtMy44NjY5IDE3LjUtMTMuMDQ0IDI0LjM4MS0xNC40ODMiLz4KICA8cGF0aCBkPSJtOTguNjQgODMuNjYxYzAuMzgxOTctNS40NTI2IDguMDE4Ni02LjM1ODYgNy45NzAyIDAuMzEyNjYtMC4wNTUxIDcuNTg3OS0xMC4zMzEgMjUuOTQ3LTE0LjIgMzAuNTMyLTMuNzI4NCA0LjQxODEtNy40MzE1IDAuOTYyNzQtNC44MTYyLTMuMzAyNiAyLjYxNDEtNC4yNjM0IDEwLjUzMS0yMC4xOSAxMS4wNDYtMjcuNTQyeiIvPgogIDxwYXRoIGQ9Im03OS42MDMgNTMuMTE3Yy0yLjU5MjctMS4xNDk4LTMuNTA4IDUuNTYzOS01LjY2MzQgOC43MDA2LTIuNTk2NyAzLjc3ODktNS4wOTg1IDcuNDE2NS0zLjE4NyAxMy4zOTJsMTkuNzU1IDEzLjcxMmMyLjU0NzYtMTAuMDI3LTQuMjgzOC0yNC42MjctMTAuOTA1LTM1LjgwNXoiLz4KICA8cGF0aCBkPSJtNzQuMTMzIDE2Ljk3YTEuMDM1NSAwLjY1OTExIDAgMCAxIDEuNDYyNC0wLjAwMTIgMS4wMzU1IDAuNjU5MTEgMCAwIDEgMC4wMDU4IDAuOTMwODggMS4wMzU1IDAuNjU5MTEgMCAwIDEtMS40NjI0IDAuMDA2MiAxLjAzNTUgMC42NTkxMSAwIDAgMS0wLjAxMzYtMC45MzA4NSIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjMxODkxIDAgMCAuMzE4OTEgMTEuMzYxIDExLjgzKSIgc3Ryb2tlLXdpZHRoPSIzLjEzNTYiPgogIDxwYXRoIGQ9Im02Ny43MTEgNzUuNTYyIDI3LjEwNSAxNy44ODktMy45NDcyIDkuNDUyNnMtMjIuNDU3LTE4LjAxLTIzLjE1OC0yNy4zNDJ6IiBmaWxsPSJ1cmwoI2YpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNzAuOTIyIDQ0LjUyMmMxMC4xMTktNi45MDg1IDI1LjAzOC0xOC43NTYgMjYuNjYxLTI0LjEzMSAxLjU1NjgtNS4xNTcgNy45Nzg4LTQuMTg0IDYuNTE5MiAxLjY1NDEtMS40NTk1IDUuODM4MS05LjQzODMgMjguODk5LTIxLjk5IDQ0LjI3MiIgZmlsbD0iIzE4MTgxOCIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTE5Ljc0MSA5Ni43NzRjNS43Mjc2LTEuNjgyNyA4LjkzMTItOC4yODcgMTMuMTIzLTEyLjQyMiA3LjU5NzIgNi45NzM5IDQ3LjE1MiAyMC4zODIgMjYuNTkyIDIwLjcyNC0xMC41NjUtMC42MDgzNy0xNi43MTIgNS4xMjg5LTIyLjQ2OCA5LjgwODl6IiBmaWxsPSIjMTgxODE4IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNjMuOTI2IDEuMzkzNmMtMTQuOTk5IDAuMjc1MjEtMTkuOTUzIDExLjY5Ny0xOS45NTMgMTcuMzM4IDAgNS42NDE4IDEuODUyOCAxNy4zNjktMi42ODgyIDI1LjA3NS0zIDUuMDkwOS0xMi41MDYgMTcuMTU2LTE1LjIwMSAyOC40NTQtMi42OTE4IDExLjI4NC0wLjU4OTggMzUuMDkgMzAuNjg2IDM1LjY0IDMyLjIgMC41NjY3IDI5Ljk4NyA3LjQ0NjIgMjkuOTg3IDcuNDQ2MmwxMS40MjYtMjEuODI3Yy0yLjk4NzQtMS40Mjc2LTcuNTU5LTMuNTkyOC03LjM2OTMtMy45OTQ5IDUuNzQyMy0xMi4xNzMtOS42MzA1LTM0LjgwNC0xMi41Mi00My42MTEtMi44ODk3LTguODA2OCAwLjUwNzI2LTEwLjk4NSAyLjg0NjYtMTYuMzUyIDIuMzM5My01LjM2NjYgMy4yODg3LTI4LjE2OS0xNy4yMTUtMjguMTY5eiIgZmlsbD0iIzIzMjMyMyIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTIxLjY4MSA5Ny4xNjdjLTIuODMzOC0yLjI2NjMtNS4yNjY4IDAuODcyMTItMy41NzA4IDMuODkwNCAxLjY5NTkgMy4wMTgzIDE2LjE2MyAxNy41NCAyMC4zMTggMjIuMTE3IDQuMTU1NCA0LjU3NyAxMS4zODktMi4xMDU2IDQuODU5NC01Ljg3MjctNi41My0zLjc2NzItMTguNzczLTE3Ljg2OS0yMS42MDctMjAuMTM1eiIgZmlsbD0idXJsKCNoKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTI1LjU1OSA4NC40ODZjMS4xNzc4IDQuNTE0Ny00LjM2MjQgOS45Mjc1LTcuMzIwOCAxMi43MTMtMy44NDggMy42MjMgMC4wOTgxNCA1LjU5NDMgMS4zNzQgNS40OTYyIDEuMjc1OS0wLjA5OCAxMC43NjItMy41MjgzIDE4LjEyMyAwLjU5MzgyIiBmaWxsPSIjMjMyMzIzIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNzMuMTMxIDExLjMzOWMtNC4zMDQ3LTAuMDQ5MDgtNy4zMDc0IDQuODQyOS01LjA1ODMgMTAuNiAxLjI4OTEgMy4yOTk5IDkuNzY1OCAzLjExODcgMTAuMzA0LTAuMzE5ODUgMC45MTc4Mi01Ljg2NDMtMC45ODczNy0xMC4yMzItNS4yNDU2LTEwLjI4eiIgZmlsbD0iI2ZkZmRmZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTcyLjc2MSAxNy4yOTFhMy4wMzgzIDMuNjg1OCAwIDAgMSA0LjI5MTEtMC4wMDc5IDMuMDM4MyAzLjY4NTggMCAwIDEgMC4wMTcyIDUuMjA1NSAzLjAzODMgMy42ODU4IDAgMCAxLTQuMjkxIDAuMDM0NjEgMy4wMzgzIDMuNjg1OCAwIDAgMS0wLjAzOTk2LTUuMjA1MyIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTgxLjQ2MyAzMy4wMzZjMi43MjIgMC4wOTA2NiAxOC44NzMtMy4wODQ5IDE5LjA1NC01LjM1MzMgMC4xODE1LTIuMjY4My0xMS4zNDItMy4zNTcxLTEzLjYxLTQuMzU1Mi0yLjI2ODMtMC45OTgwOC0xMy4yOTMtMy45NDE5LTEzLjE1NiAzLjQ0NzkgMC4xMzY3OSA3LjM4OTcgNC45OTAzIDYuMTY5OSA3LjcxMjMgNi4yNjA2eiIgZmlsbD0idXJsKCNlKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc3LjMyNCAyOC44MDJjNS43NDEzIDEuMjQ2OCAxMi43MDMgMS42Njg0IDE2LjU1MyAxLjAyNjUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FlOTMwMCIgc3Ryb2tlLXdpZHRoPSIuNjI3MTMiLz4KICA8cGF0aCBkPSJtODEuNDYzIDMzLjAzNmMyLjcyMiAwLjA5MDY2IDE4Ljg3My0zLjA4NDkgMTkuMDU0LTUuMzUzMyAwLjE4MTUtMi4yNjgzLTExLjM0Mi0zLjM1NzEtMTMuNjEtNC4zNTUyLTIuMjY4My0wLjk5ODA4LTEzLjI5My0zLjk0MTktMTMuMTU2IDMuNDQ3OSAwLjEzNjc5IDcuMzg5NyA0Ljk5MDMgNi4xNjk5IDcuNzEyMyA2LjI2MDZ6IiBmaWxsPSJub25lIi8+CiAgPHBhdGggZD0ibTQ1LjgzNiA0MC4xNjhjLTEzLjUxMiAxMS40NDItMzQuNzI5IDM4Ljc5LTMwLjQ4NSA0MS40NSAzLjY2MDMgMi4yOTM0IDI1LjQ3NS0xNi42MjEgMzQuNy0xOC41NSIgZmlsbD0idXJsKCNqKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTQwLjU1MyA0NS4xNjJjLTguNTU2NyA5LjA2NjctMjAuNzczIDIzLjQ2MS0yNC42MjUgMzEuMjY0LTMuODAyNCA2LjAxNzkgMC41OTYzMiA4LjI2MzQgNS43NTI1IDMuMzI2MiA3LjAwMzEtMy44NjY5IDE3LjUtMTMuMDQ0IDI0LjM4MS0xNC40ODMiIGZpbGw9Im5vbmUiLz4KICA8cGF0aCBkPSJtOTguNjQgODMuNjYxYzAuMzgxOTctNS40NTI2IDguMDE4Ni02LjM1ODYgNy45NzAyIDAuMzEyNjYtMC4wNTUxIDcuNTg3OS0xMC4zMzEgMjUuOTQ3LTE0LjIgMzAuNTMyLTMuNzI4NCA0LjQxODEtNy40MzE1IDAuOTYyNzQtNC44MTYyLTMuMzAyNiAyLjYxNDEtNC4yNjM0IDEwLjUzMS0yMC4xOSAxMS4wNDYtMjcuNTQyeiIgZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc5LjYwMyA1My4xMTdjLTIuNTkyNy0xLjE0OTgtMy41MDggNS41NjM5LTUuNjYzNCA4LjcwMDYtMi41OTY3IDMuNzc4OS01LjA5ODUgNy40MTY1LTMuMTg3IDEzLjM5MmwxOS43NTUgMTMuNzEyYzIuNTQ3Ni0xMC4wMjctNC4yODM4LTI0LjYyNy0xMC45MDUtMzUuODA1eiIgZmlsbD0idXJsKCNnKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc0LjEzMyAxNi45N2ExLjAzNTUgMC42NTkxMSAwIDAgMSAxLjQ2MjQtMC4wMDEyIDEuMDM1NSAwLjY1OTExIDAgMCAxIDAuMDA1OCAwLjkzMDg4IDEuMDM1NSAwLjY1OTExIDAgMCAxLTEuNDYyNCAwLjAwNjIgMS4wMzU1IDAuNjU5MTEgMCAwIDEtMC4wMTM2LTAuOTMwODUiIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"supertux2,supertux\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"supertux2.desktop\"\nLABEL oc.launch=\"supertux2.supertux2\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpinei.minimal\"\nLABEL oc.name=\"supertux2\"\nLABEL oc.displayname=\"supertux2\"\nLABEL oc.path=\"/usr/games/supertux2\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"supertux2\"\nENV APPBIN \"/usr/games/supertux2\"\nENV APP \"/usr/games/supertux2\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/supertux2/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/supertux2/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application supertux2

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/supertux2.d\n
"},{"location":"applications/supertux2/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f supertux2.d -t supertux2 .\n
"},{"location":"applications/supertux2/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect supertux2 > supertux2.json\ndocker image save supertux2 -o supertux2.tar\nctr -n k8s.io images import supertux2.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @supertux2.json\n\n
"},{"location":"applications/swell-foop/","title":"swell-foop","text":""},{"location":"applications/swell-foop/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/swell-foop/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/swell-foop/#ubuntu-packages","title":"Ubuntu packages","text":"
swell-foop\n
"},{"location":"applications/swell-foop/#displayname","title":"Displayname","text":"
swell-foop\n
"},{"location":"applications/swell-foop/#path","title":"Path","text":"
/usr/games/swell-foop\n
"},{"location":"applications/swell-foop/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/swell-foop/#wm_class","title":"WM_CLASS","text":"
swell-foop.Swell-foop\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/swell-foop/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.SwellFoop.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/swell-foop/#json-dump","title":"JSON dump","text":"

json source file swell-foop.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"swell-foop\",\n    \"icon\": \"circle_swell-foop.svg\",\n    \"keyword\": \"swell,foop\",\n    \"launch\": \"swell-foop.Swell-foop\",\n    \"name\": \"swell-foop\",\n    \"displayname\": \"swell-foop\",\n    \"path\": \"/usr/games/swell-foop\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.SwellFoop.desktop\"\n}\n
"},{"location":"applications/swell-foop/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output swell-foop.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/swell-foop.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @swell-foop.d.3.0.json\n\n
"},{"location":"applications/swell-foop/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends swell-foop && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_swell-foop.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNjhiMGUzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY4ODRlMyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjIiIHkyPSI2MiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWQyMTIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMzkzZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIxOC4wMDIiIHgyPSIxOC4wMDIiIHkxPSIxMiIgeTI9IjI0LjAwMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMzAuMDA0IiB4Mj0iMzAuMDA0IiB5MT0iMTIiIHkyPSIyNC4wMDMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjMwLjAwNCIgeDI9IjMwLjAwNCIgeTE9IjI0IiB5Mj0iMzUuOTk5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIxOC4wMDIiIHgyPSIxOC4wMDIiIHkxPSIyNCIgeTI9IjM1Ljk5OSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWVlZTRjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZjA2ZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJoIiB4PSItLjA1OTk5NSIgeT0iLS4wNjAwMDUiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzgyNjQxMjkiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mjc0NSAwIDAgLjA2Mjc0NSAtLjEyNTQ5IC0uMTI1NDkpIiBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzguMTIiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjkzOCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuODEzNiAxMS4wNjgpIiBmaWx0ZXI9InVybCgjaCkiIG9wYWNpdHk9Ii41Ij4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyA4LjUwOTIgLTEwLjM3MikiPgogICA8Zz4KICAgIDxnPgogICAgIDxwYXRoIGQ9Im0yNi40MDIgMTJoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0xNC4zOTggMTJoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0yNi40MDIgMjRoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0xNC4zOTggMjRoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuODEzNiAxMS4wNjgpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyA4LjUwOTIgLTEwLjM3MikiPgogICA8Zz4KICAgIDxwYXRoIGQ9Im0yNi40MDIgMTJoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIgZmlsbD0idXJsKCNlKSIvPgogICAgPHBhdGggZD0ibTE0LjM5OCAxMmg3LjIwN2MxLjMyNCAwIDIuMzk4IDEuMDc0IDIuMzk4IDIuMzk4djcuMjA3YzAgMS4zMjQtMS4wNzQgMi4zOTgtMi4zOTggMi4zOThoLTcuMjA3Yy0xLjMyNCAwLTIuMzk4LTEuMDc0LTIuMzk4LTIuMzk4di03LjIwN2MwLTEuMzI0IDEuMDc0LTIuMzk4IDIuMzk4LTIuMzk4IiBmaWxsPSJ1cmwoI2YpIi8+CiAgICA8cGF0aCBkPSJtMjYuNDAyIDI0aDcuMjAzYzEuMzI0IDAgMi4zOTggMS4wNzQgMi4zOTggMi4zOTh2Ny4yMDNjMCAxLjMyNC0xLjA3NCAyLjM5OC0yLjM5OCAyLjM5OGgtNy4yMDNjLTEuMzI0IDAtMi4zOTgtMS4wNzQtMi4zOTgtMi4zOTh2LTcuMjAzYzAtMS4zMjQgMS4wNzQtMi4zOTggMi4zOTgtMi4zOTgiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im0xNC4zOTggMjRoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIgZmlsbD0idXJsKCNjKSIvPgogICA8L2c+CiAgPC9nPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"swell-foop,swell,foop\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.SwellFoop.desktop\"\nLABEL oc.launch=\"swell-foop.Swell-foop\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"swell-foop\"\nLABEL oc.displayname=\"swell-foop\"\nLABEL oc.path=\"/usr/games/swell-foop\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"swell-foop\"\nENV APPBIN \"/usr/games/swell-foop\"\nENV APP \"/usr/games/swell-foop\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/swell-foop/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/swell-foop/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application swell-foop

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/swell-foop.d\n
"},{"location":"applications/swell-foop/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f swell-foop.d -t swell-foop .\n
"},{"location":"applications/swell-foop/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect swell-foop > swell-foop.json\ndocker image save swell-foop -o swell-foop.tar\nctr -n k8s.io images import swell-foop.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @swell-foop.json\n\n
"},{"location":"applications/taquin/","title":"taquin","text":""},{"location":"applications/taquin/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/taquin/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/taquin/#alpine-packages","title":"Alpine packages","text":"
gnome-taquin\n
"},{"location":"applications/taquin/#path","title":"Path","text":"
/usr/bin/gnome-taquin\n
"},{"location":"applications/taquin/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/taquin/#wm_class","title":"WM_CLASS","text":"
org.gnome.Taquin.org.gnome.Weather\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/taquin/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Taquin.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/taquin/#json-dump","title":"JSON dump","text":"

json source file taquin.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"gnome-taquin\",\n    \"icon\": \"org.gnome.Taquin.svg\",\n    \"keyword\": \"taquin\",\n    \"launch\": \"org.gnome.Taquin.org.gnome.Weather\",\n    \"name\": \"taquin\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-taquin\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Taquin.desktop\"\n}\n
"},{"location":"applications/taquin/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output taquin.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/taquin.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @taquin.d.3.0.json\n\n
"},{"location":"applications/taquin/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-taquin\nLABEL oc.icon=\"org.gnome.Taquin.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iI2ZkZmNmYiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2YxZjBlZiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI0OCIgeDI9IjQ2NCIgeTE9IjQ0IiB5Mj0iNDQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQuOTIzIDI1LjY1NSkgc2NhbGUoLjE0NDIzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNiYWJkYjYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNmY1ZjQiIG9mZnNldD0iLjA0MiIvPjxzdG9wIHN0b3AtY29sb3I9IiNkNWQzY2YiIG9mZnNldD0iLjA4MyIvPjxzdG9wIHN0b3AtY29sb3I9IiNkZWRkZGEiIG9mZnNldD0iLjkxNSIvPjxzdG9wIHN0b3AtY29sb3I9IiNlYmVhZTgiIG9mZnNldD0iLjk0NCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNmY1ZjQiIG9mZnNldD0iLjk4NSIvPjxzdG9wIHN0b3AtY29sb3I9IiNiYWJkYjYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMzIuNTc3IiB4Mj0iMzIuNTc3IiB5MT0iMiIgeTI9IjU3Ljk2MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIC4wMDEpIHNjYWxlKC45OTk5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjUyLjE4MyIgeDI9IjUyLjE4MyIgeTE9IjMuODIiIHkyPSI1Ny45NjEiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAuMDAxKSBzY2FsZSguOTk5OTgpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz48bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIxMi4zODUiIHgyPSIxMi4zODUiIHkxPSIzLjQxNCIgeTI9IjU3LjE0MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIC4wMDEpIHNjYWxlKC45OTk5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxmaWx0ZXIgaWQ9ImIiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii44OSIvPjwvZmlsdGVyPjwvZGVmcz48cmVjdCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzg5LjMyIC00ODkuOTIpIHNjYWxlKDEuMDExNSkiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2IpIiBvcGFjaXR5PSIuMjUiLz48cGF0aCBkPSJNMjIuNzY5IDQxLjIzNGgxOS42MTV2MTguNDYxSDIyLjc2OXoiIGZpbGw9IiNkZWRkZGEiLz48Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0iI2M1YzRjMSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48cGF0aCBkPSJNMzEuODU1IDJhMzAgMzAgMCAwIDAtOS4wODYgMS40NTV2NTcuMDgyYzIuOS45MyA1Ljk5MiAxLjQzOCA5LjIxIDEuNDM4aC4wMDFjMy42NiAwIDcuMTY1LS42NSAxMC40MDItMS44NFYzLjg1NUEzMCAzMCAwIDAgMCAzMiAyYTMwIDMwIDAgMCAwLS4xNDQgMHoiIGZpbGw9InVybCgjYykiLz48cGF0aCBkPSJNNDIuMzg0IDQxLjIzdjE4LjQ2MWgxLjEyNWEyOS45NDQgMjkuOTQ0IDAgMCAwIDE3LjAyLTE4LjQ2MXoiIGZpbGw9InVybCgjZCkiLz48cGF0aCBkPSJNNDIuMzg1IDMuODU2djU2LjI3NmEzMi4wMDIgMzIuMDAyIDAgMCAwIDMuODk3LTEuNzUgMzAgMzAgMCAwIDAgLjAwNy0uMDAzIDMwIDMwIDAgMCAwIC4yMTMtLjExOGMuMjUtLjEzNC40OTctLjI4Ni43NDYtLjQyN0EzMCAzMCAwIDAgMCA2MiAzMiAzMCAzMCAwIDAgMCA0Mi4zODUgMy44NTV6IiBmaWxsPSJ1cmwoI2UpIi8+PHBhdGggZD0iTTU1Ljc2NSAxMy42NjNhMjIuMDQ4IDIyLjA0OCAwIDAgMC00LjMzMiA2Ljc5OWgzLjc2NGExOC40NzkgMTguNDc5IDAgMCAxIDIuNTU4LTMuODczIDI5LjkwOSAyOS45MDkgMCAwIDAtMS45OS0yLjkyNnoiIGZpbGw9IiMxYTVmYjQiLz48cGF0aCBkPSJNMy40MTYgMjIuNzcxQTMwLjEwNCAzMC4xMDQgMCAwIDAgMiAzMS4yODF2MS4zOTRBMzAuMTYgMzAuMTYgMCAwIDAgMy4wODQgNDBIMjIuNzdWMjIuNzdIMy40MTZ6IiBvcGFjaXR5PSIuMTUiLz48cGF0aCBkPSJNMjIuNzY5IDMuNDE1QTI5LjkyIDI5LjkyIDAgMCAwIDIgMzEuMjh2MS4zOTVjLjA0OSAyLjE0OC4zMiA0LjIzOC43OTMgNi4yNUgyMi43N1YzLjQxNHoiIGZpbGw9InVybCgjZikiLz48cGF0aCBkPSJNMjIuNzY5IDEwLjcyOHYzLjk0N2EyNC4zMjIgMjQuMzIyIDAgMCAwIDEwLjQyIDIuMzI2IDI0LjM5OCAyNC4zOTggMCAwIDAgOS4xOTUtMS43ODV2LTMuODIyYTIwLjU1OCAyMC41NTggMCAwIDEtOS4xOTUgMi4xNDZjLTMuODMzIDAtNy40MDItMS4wMzItMTAuNDItMi44MTJ6bTAgMTYuMTUydjMuODIyYTE4LjQ3NiAxOC40NzYgMCAwIDEgNy45NTcgOC4yNGgzLjc2MUEyMi4wNDUgMjIuMDQ1IDAgMCAwIDIyLjc2OCAyNi44OHptMzAuMDM0LjUwNmMtMy43NDUgMC03LjI4Mi44NDItMTAuNDIgMi4zMjZ2My45NDdjMy4wMTctMS43OCA2LjU4Ni0yLjgxMiAxMC40Mi0yLjgxMiAzLjMwOCAwIDYuNDIuNzcgOS4xNSAyLjEyNS4wMS0uMzMxLjAyNi0uNjYxLjAyNi0uOTk0IDAtLjk2Ni0uMDUtMS45Mi0uMTQtMi44NjJhMjQuMzk4IDI0LjM5OCAwIDAgMC05LjAzNi0xLjczem0tLjg3MyAxMS41NDdhMjIuMDYgMjIuMDYgMCAwIDAgNi4xNzQgNy44MjggMjkuODA4IDI5LjgwOCAwIDAgMCAxLjU1OC0zLjE3NCAxOC40ODMgMTguNDgzIDAgMCAxLTMuODUxLTQuNjU0SDUxLjkzeiIgZmlsbD0iIzFhNWZiNCIvPjxwYXRoIGQ9Ik00LjUxIDE5Ljg4NmMtLjA4NS4xOTItLjE3LjM4Mi0uMjUuNTc2SDU5LjdjLS4wOC0uMTk0LS4xNjYtLjM4NC0uMjUtLjU3NnoiIGZpbGwtb3BhY2l0eT0iLjA4MSIvPjxwYXRoIGQ9Ik0xMC4zNDggMjAuNDY1YTE5LjY2IDE5LjY2IDAgMCAxIDEuOTczIDguNjE1IDE5LjYzIDE5LjYzIDAgMCAxLTIuNjMxIDkuODQ2aDQuMTRhMjMuMjMzIDIzLjIzMyAwIDAgMCAyLjE4NC05Ljg0NmMwLTIuOTUtLjU2MS01Ljg3NC0xLjY1NC04LjYxNWgtNC4wMTJ6bTI2LjMwNSAxOC40NjFDMzUuNTYgNDEuNjY2IDM0LjMwOCA0NSAzNC4zMDkgNTBjMCA1LjU5IDEuNDc4IDguNTczIDMuNzUyIDExLjM4MWEzMCAzMCAwIDAgMCAzLjM2NS0uOUMzOS4zOTggNTcuOTEgMzguMDAxIDU1IDM4LjAwMSA1MGMwLTUgMS40MDItOC40NzQgMi42NjYtMTEuMDc0aC00LjAxNHoiIGZpbGw9IiMxYTVmYjQiLz48cGF0aCBkPSJNMjMuMzQ2IDMuMjc1YTMwIDMwIDAgMCAwLS41NzYuMTh2NTcuMDgyYy4xOTIuMDYyLjM4My4xMjQuNTc2LjE4MlYzLjI3NnoiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjk1MyIgb3BhY2l0eT0iLjUiLz48cGF0aCBkPSJNMjIuNzY5IDMuNDE1Yy0uMTk0LjA2My0uMzg2LjEzLS41NzguMTk2djM1LjMxM2guNTc4VjMuNDE0eiIgZmlsbC1vcGFjaXR5PSIuMDgxIi8+PHBhdGggZD0iTTQyLjM4NSAzLjg1NnY1Ni4yODZhMzAgMzAgMCAwIDAgLjU3Ni0uMjE2VjQuMDc2YTMwIDMwIDAgMCAwLS41NzYtLjIyMXoiIGZpbGw9IiNmZmYiIG9wYWNpdHk9Ii41Ii8+PHBhdGggZD0iTTQxLjgwOSAzLjY1djU2LjY4MmMuMTkyLS4wNjYuMzg2LS4xMjkuNTc2LS4xOTlWMy44NTZhMzAgMzAgMCAwIDAtLjU3Ni0uMjA1eiIgb3BhY2l0eT0iLjEiLz48cGF0aCBkPSJNNC4yNiAyMC40NjJjLS4wOC4xOTEtLjE1Mi4zODUtLjIyNy41NzhoNTUuODk1Yy0uMDc1LS4xOTMtLjE1LS4zODctLjIyOC0uNTc4SDQuMjZ6bTE4LjUxIDE4LjQ2M3YuNTc2aDM4LjI2N2MuMDQ4LS4xOS4wODctLjM4NC4xMzItLjU3NkgyMi43N3oiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjU1NSIvPjxwYXRoIGQ9Ik0yLjY2IDM4LjM0NmMuMDQyLjE5NC4wODguMzg2LjEzMy41NzhoNTguMzc2Yy4wNDUtLjE5Mi4wOTEtLjM4NC4xMzMtLjU3OEgyLjY2eiIgZmlsbC1vcGFjaXR5PSIuMDgxIi8+PC9zdmc+\"\nLABEL oc.keyword=\"taquin,taquin\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Taquin.desktop\"\nLABEL oc.launch=\"org.gnome.Taquin.org.gnome.Weather\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"taquin\"\nLABEL oc.displayname=\"taquin\"\nLABEL oc.path=\"/usr/bin/gnome-taquin\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"taquin\"\nENV APPBIN \"/usr/bin/gnome-taquin\"\nENV APP \"/usr/bin/gnome-taquin\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/taquin/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/taquin/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application taquin

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/taquin.d\n
"},{"location":"applications/taquin/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f taquin.d -t taquin .\n
"},{"location":"applications/taquin/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect taquin > taquin.json\ndocker image save taquin -o taquin.tar\nctr -n k8s.io images import taquin.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @taquin.json\n\n
"},{"location":"applications/teams/","title":"teams","text":""},{"location":"applications/teams/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/teams/#arguments","title":"Arguments","text":"

\"--disable-namespace-sandbox --disable-setuid-sandbox\"

"},{"location":"applications/teams/#displayname","title":"Displayname","text":"
Microsoft Teams\n
"},{"location":"applications/teams/#path","title":"Path","text":"
/usr/bin/teams\n
"},{"location":"applications/teams/#mimetype","title":"Mimetype","text":"
x-scheme-handler/msteams;\n
"},{"location":"applications/teams/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/teams/#wm_class","title":"WM_CLASS","text":"
microsoft teams - preview.Microsoft Teams - Preview\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/teams/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/teams.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/teams/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/teams/#json-dump","title":"JSON dump","text":"

json source file teams.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"\",\n    \"preruncommands\": [\n        \"RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\\\" > /etc/apt/sources.list.d/teams.list\",\n        \"RUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"icon\": \"teams.svg\",\n    \"keyword\": \"teams\",\n    \"launch\": \"microsoft teams - preview.Microsoft Teams - Preview\",\n    \"name\": \"teams\",\n    \"displayname\": \"Microsoft Teams\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/teams\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"args\": \"--disable-namespace-sandbox --disable-setuid-sandbox\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"x-scheme-handler/msteams;\",\n    \"desktopfile\": \"/usr/share/applications/teams.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/teams/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output teams.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/teams.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @teams.d.3.0.json\n\n
"},{"location":"applications/teams/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"teams.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjEyOCAxNjAgNzY4IDcwNCI+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSItLjIiIHkxPSItLjIiIHgyPSIuOCIgeTI9Ii44Ij4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNWE2MmM0Ii8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzM5NDBhYiIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGNsaXBQYXRoIGlkPSJjIj4KCQkJPHBhdGggZmlsbD0iI2ZmZiIgZD0iTTY4NCA0MzJINTEydi00OS4xNDNBMTEyIDExMiAwIDEgMCA0MTYgMjcyYTExMS41NTYgMTExLjU1NiAwIDAgMCAxMC43ODUgNDhIMTYwYTMyLjA5NCAzMi4wOTQgMCAwIDAtMzIgMzJ2MzIwYTMyLjA5NCAzMi4wOTQgMCAwIDAgMzIgMzJoMTc4LjY3YzE1LjIzNiA5MC44IDk0LjIgMTYwIDE4OS4zMyAxNjAgMTA2LjAzOSAwIDE5Mi04NS45NjEgMTkyLTE5MlY0NjhhMzYgMzYgMCAwIDAtMzYtMzZ6Ii8+CgkJPC9jbGlwUGF0aD4KCTwvZGVmcz4KCTxwYXRoIGZpbGw9IiM1MDU5YzkiIGQ9Ik02OTIgNDMyaDE2OGEzNiAzNiAwIDAgMSAzNiAzNnYxNjRhMTIwIDEyMCAwIDAgMS0xMjAgMTIwIDEyMCAxMjAgMCAwIDEtMTIwLTEyMFY0NjhhMzYgMzYgMCAwIDEgMzYtMzZ6Ii8+Cgk8Y2lyY2xlIGZpbGw9IiM1MDU5YzkiIGN4PSI3NzYiIGN5PSIzMDQiIHI9IjgwIi8+Cgk8cGF0aCBmaWxsPSIjN2I4M2ViIiBkPSJNMzcyIDQzMmgzMTJhMzYgMzYgMCAwIDEgMzYgMzZ2MjA0YTE5MiAxOTIgMCAwIDEtMTkyIDE5MiAxOTIgMTkyIDAgMCAxLTE5Mi0xOTJWNDY4YTM2IDM2IDAgMCAxIDM2LTM2eiIvPgoJPGNpcmNsZSBmaWxsPSIjN2I4M2ViIiBjeD0iNTI4IiBjeT0iMjcyIiByPSIxMTIiLz4KCTxnIGNsaXAtcGF0aD0idXJsKCNjKSI+CgkJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzIgLTI0KSBzY2FsZSAoNS45MDc3KSI+CgkJCTxwYXRoIG9wYWNpdHk9Ii4wNSIgZD0iTTg1IDYzdjU5LjYyYTUuMzgyIDUuMzgyIDAgMCAxLTUuMzggNS4zOEg0NS4yNWMtLjMtLjMzLS41OS0uNjYtLjg3LTFzLS41Ni0uNjYtLjgzLTEtLjUzLS42Ni0uNzktMS0uNTEtLjY2LS43Ni0xYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyYy4wNi0uMDguMTItLjE3LjE3LS4yNXMuMTItLjE3LjE5LS4yNS4xMi0uMTcuMTgtLjI1YTIuMzQ4IDIuMzQ4IDAgMCAxIC4xOS0uMjVoMzcuNjFjMi45NyAwIDUuMzggMy4wMyA1LjM4IDZ6IiBzdHlsZT0iJiMxMDsiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjA3NSIgZD0iTTg0LjI1IDYzLjF2NTguNTJhNS4zIDUuMyAwIDAgMS01LjI5IDUuMzhINDQuMzhjLS4yOS0uMzMtLjU2LS42Ni0uODMtMXMtLjUzLS42Ni0uNzktMS0uNTEtLjY2LS43Ni0xYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyYy4wNi0uMDguMTItLjE3LjE3LS4yNXMuMTItLjE3LjE5LS4yNS4xMi0uMTcuMTgtLjI1aDM3LjA1YzIuOTcgMCA1LjM4IDIuODcgNS4zOCA1Ljg1eiIvPgoJCQk8cGF0aCBvcGFjaXR5PSIuMSIgZD0iTTgzLjUgNjMuMTl2NTcuNDNhNS4yMjMgNS4yMjMgMCAwIDEtNS4xOSA1LjM4SDQzLjU1Yy0uMjctLjMzLS41My0uNjYtLjc5LTFzLS41MS0uNjYtLjc2LTFhNTYuMjU5IDU2LjI1OSAwIDAgMS0xMS0zMy41VjkwYTU2LjI1OSA1Ni4yNTkgMCAwIDEgMTAuMjgtMzJjLjA2LS4wOC4xMi0uMTcuMTctLjI1cy4xMi0uMTcuMTktLjI1aDM2LjQ4YTUuNjU1IDUuNjU1IDAgMCAxIDUuMzggNS42OXoiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjEyNSIgZD0iTTgyLjc1IDYzLjI4djU2LjM0YTUuMTQ0IDUuMTQ0IDAgMCAxLTUuMSA1LjM4SDQyLjc2Yy0uMjYtLjMzLS41MS0uNjYtLjc2LTFhNTYuMjU5IDU2LjI1OSAwIDAgMS0xMS0zMy41VjkwYTU2LjI1OSA1Ni4yNTkgMCAwIDEgMTAuMjgtMzJjLjA2LS4wOC4xMi0uMTcuMTctLjI1aDM1LjkyYTUuNTEyIDUuNTEyIDAgMCAxIDUuMzggNS41M3oiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjIiIGQ9Ik04MiA2My4zOHY1NS4yNGE1LjA3IDUuMDcgMCAwIDEtNSA1LjM4SDQyYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyaDM1LjM0QTUuMzgyIDUuMzgyIDAgMCAxIDgyIDYzLjM4eiIvPgoJCTwvZz4KCTwvZz4KCTxyZWN0IGZpbGw9InVybCgjZykiIHg9IjEyOCIgeT0iMzIwIiB3aWR0aD0iMzg0IiBoZWlnaHQ9IjM4NCIgcng9IjMyIiByeT0iMzIiLz4KCTxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0zOTkuMzY1IDQ0NS44NTVoLTYwLjI5M3YxNjQuMmgtMzguNDE4di0xNjQuMmgtNjAuMDJWNDE0aDE1OC43M3oiLz4KPC9zdmc+\"\nLABEL oc.keyword=\"teams,teams\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"teams.desktop\"\nLABEL oc.launch=\"microsoft teams - preview.Microsoft Teams - Preview\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--disable-namespace-sandbox --disable-setuid-sandbox\"\nLABEL oc.name=\"teams\"\nLABEL oc.displayname=\"Microsoft Teams\"\nLABEL oc.path=\"/usr/bin/teams\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/msteams;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"teams\"\nENV APPBIN \"/usr/bin/teams\"\nLABEL oc.args=\"--disable-namespace-sandbox --disable-setuid-sandbox\"\nENV APP \"/usr/bin/teams\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/teams/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/teams/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application teams

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/teams.d\n
"},{"location":"applications/teams/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f teams.d -t teams .\n
"},{"location":"applications/teams/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect teams > teams.json\ndocker image save teams -o teams.tar\nctr -n k8s.io images import teams.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @teams.json\n\n
"},{"location":"applications/terminal/","title":"Terminal","text":""},{"location":"applications/terminal/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.20.04

"},{"location":"applications/terminal/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/terminal/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
"},{"location":"applications/terminal/#arguments","title":"Arguments","text":"

\"--disable-factory\"

"},{"location":"applications/terminal/#displayname","title":"Displayname","text":"
Terminal sudo\n
"},{"location":"applications/terminal/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/terminal/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/terminal/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/terminal/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.Gnome-terminal\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/terminal/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/terminal/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
"},{"location":"applications/terminal/#json-dump","title":"JSON dump","text":"

json source file terminal.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"terminal,bash,shell,cmd,admin,ftp,telnet,netcat,sshfs,curl,wget,git,ssh\",\n    \"launch\": \"gnome-terminal-server.Gnome-terminal\",\n    \"name\": \"Terminal\",\n    \"displayname\": \"Terminal sudo\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.20.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\",\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\"\n    ]\n}\n
"},{"location":"applications/terminal/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output terminal.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminal.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminal.d.3.0.json\n\n
"},{"location":"applications/terminal/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.20.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminal,terminal,bash,shell,cmd,admin,ftp,telnet,netcat,sshfs,curl,wget,git,ssh\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.Gnome-terminal\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.20.04\"\nENV ARGS=\"--disable-factory\"\nLABEL oc.name=\"Terminal\"\nLABEL oc.displayname=\"Terminal sudo\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Terminal\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/terminal/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminal/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Terminal

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Terminal.d\n
"},{"location":"applications/terminal/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Terminal.d -t Terminal .\n
"},{"location":"applications/terminal/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Terminal > Terminal.json\ndocker image save Terminal -o Terminal.tar\nctr -n k8s.io images import Terminal.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Terminal.json\n\n
"},{"location":"applications/terminalai/","title":"terminalai","text":""},{"location":"applications/terminalai/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk.fulldev.ia

"},{"location":"applications/terminalai/#use-ubuntu-package","title":"use ubuntu package","text":"

gnome-terminal dbus-x11

"},{"location":"applications/terminalai/#arguments","title":"Arguments","text":"

\"--disable-factory --class=terminalai\"

"},{"location":"applications/terminalai/#display-name","title":"Display name","text":"

\"Shell AI\"

"},{"location":"applications/terminalai/#path","title":"path","text":"

\"/usr/bin/gnome-terminal\"

"},{"location":"applications/terminalephemeral/","title":"terminalephemeral","text":""},{"location":"applications/terminalephemeral/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/terminalephemeral/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/terminalephemeral/#ubuntu-packages","title":"Ubuntu packages","text":"
at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils\n
"},{"location":"applications/terminalephemeral/#arguments","title":"Arguments","text":"

\"--disable-factory --class=ephemeral\"

"},{"location":"applications/terminalephemeral/#displayname","title":"Displayname","text":"
Terminal [ephemeral container]\n
"},{"location":"applications/terminalephemeral/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/terminalephemeral/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/terminalephemeral/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.ephemeral\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/terminalephemeral/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/terminalephemeral/#json-dump","title":"JSON dump","text":"

json source file terminalephemeral.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"ephemeral,terminal,shell\",\n    \"launch\": \"gnome-terminal-server.ephemeral\",\n    \"name\": \"terminalephemeral\",\n    \"displayname\": \"Terminal [ephemeral container]\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false,\n        \"ipc_mode\": false\n    },\n    \"args\": \"--disable-factory --class=ephemeral\",\n    \"containerengine\": \"ephemeral_container\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\"\n}\n
"},{"location":"applications/terminalephemeral/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output terminalephemeral.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalephemeral.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalephemeral.d.3.0.json\n\n
"},{"location":"applications/terminalephemeral/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminalephemeral,ephemeral,terminal,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.ephemeral\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=ephemeral\"\nLABEL oc.name=\"terminalephemeral\"\nLABEL oc.displayname=\"Terminal [ephemeral container]\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"terminalephemeral\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=ephemeral\"\nENV APP \"/usr/bin/gnome-terminal\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/terminalephemeral/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminalephemeral/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application terminalephemeral

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalephemeral.d\n
"},{"location":"applications/terminalephemeral/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f terminalephemeral.d -t terminalephemeral .\n
"},{"location":"applications/terminalephemeral/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect terminalephemeral > terminalephemeral.json\ndocker image save terminalephemeral -o terminalephemeral.tar\nctr -n k8s.io images import terminalephemeral.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalephemeral.json\n\n
"},{"location":"applications/terminalpod/","title":"terminalpod","text":""},{"location":"applications/terminalpod/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/terminalpod/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/terminalpod/#ubuntu-packages","title":"Ubuntu packages","text":"
pulseaudio-utils at-spi2-core gnome-terminal dbus-x11\n
"},{"location":"applications/terminalpod/#arguments","title":"Arguments","text":"

\"--disable-factory --class=pod\"

"},{"location":"applications/terminalpod/#displayname","title":"Displayname","text":"
Terminal [Pod]\n
"},{"location":"applications/terminalpod/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/terminalpod/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/terminalpod/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.pod\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/terminalpod/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/terminalpod/#json-dump","title":"JSON dump","text":"

json source file terminalpod.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"pulseaudio-utils at-spi2-core gnome-terminal dbus-x11\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"pod,terminal,shell\",\n    \"launch\": \"gnome-terminal-server.pod\",\n    \"name\": \"terminalpod\",\n    \"displayname\": \"Terminal [Pod]\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false,\n        \"ipc_mode\": false\n    },\n    \"args\": \"--disable-factory --class=pod\",\n    \"containerengine\": \"pod_application\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\"\n}\n
"},{"location":"applications/terminalpod/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output terminalpod.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalpod.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalpod.d.3.0.json\n\n
"},{"location":"applications/terminalpod/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends pulseaudio-utils at-spi2-core gnome-terminal dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminalpod,pod,terminal,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.pod\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=pod\"\nLABEL oc.name=\"terminalpod\"\nLABEL oc.displayname=\"Terminal [Pod]\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"terminalpod\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=pod\"\nENV APP \"/usr/bin/gnome-terminal\"\nLABEL oc.containerengine=\"pod_application\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/terminalpod/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminalpod/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application terminalpod

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalpod.d\n
"},{"location":"applications/terminalpod/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f terminalpod.d -t terminalpod .\n
"},{"location":"applications/terminalpod/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect terminalpod > terminalpod.json\ndocker image save terminalpod -o terminalpod.tar\nctr -n k8s.io images import terminalpod.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalpod.json\n\n
"},{"location":"applications/tetravex/","title":"Tetravex","text":""},{"location":"applications/tetravex/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/tetravex/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/tetravex/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-tetravex\n
"},{"location":"applications/tetravex/#path","title":"Path","text":"
/usr/games/gnome-tetravex\n
"},{"location":"applications/tetravex/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/tetravex/#wm_class","title":"WM_CLASS","text":"
gnome-tetravex.Gnome-tetravex\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/tetravex/#json-dump","title":"JSON dump","text":"

json source file tetravex.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-tetravex\",\n    \"icon\": \"gnome-tetravex.svg\",\n    \"keyword\": \"game\",\n    \"launch\": \"gnome-tetravex.Gnome-tetravex\",\n    \"name\": \"Tetravex\",\n    \"path\": \"/usr/games/gnome-tetravex\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktop\": \"gnome-tetravex.desktop\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"384M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    }\n}\n
"},{"location":"applications/tetravex/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output tetravex.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/tetravex.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @tetravex.d.3.0.json\n\n
"},{"location":"applications/tetravex/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-tetravex && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gnome-tetravex.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnIHN0YW5kYWxvbmU9J25vJz8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZyB4bWxuczpjYz0naHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjJyB4bWxuczpkYz0naHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nIHNvZGlwb2RpOmRvY25hbWU9J2dub21lLXRldHJhdmV4LXN5bWJvbGljLnN2ZycgaGVpZ2h0PScxNicgaWQ9J3N2ZzczODQnIHhtbG5zOmlua3NjYXBlPSdodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlJyB4bWxuczpvc2I9J2h0dHA6Ly93d3cub3BlbnN3YXRjaGJvb2sub3JnL3VyaS8yMDA5L29zYicgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyB4bWxuczpzb2RpcG9kaT0naHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQnIHhtbG5zOnN2Zz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgaW5rc2NhcGU6dmVyc2lvbj0nMC45MSByMTM3MjUnIHdpZHRoPScxNicgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PSIwIDAgMTYgMTYiPgogIDxtZXRhZGF0YSBpZD0nbWV0YWRhdGE5MCc+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsgcmRmOmFib3V0PScnPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0naHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UnLz4KICAgICAgICA8ZGM6dGl0bGU+R25vbWUgU3ltYm9saWMgSWNvbiBUaGVtZTwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcgaW5rc2NhcGU6YmJveC1wYXRocz0ndHJ1ZScgYm9yZGVyY29sb3I9JyM2NjY2NjYnIGJvcmRlcm9wYWNpdHk9JzEnIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9J2xheWVyOScgaW5rc2NhcGU6Y3g9JzIwOS42ODE0OScgaW5rc2NhcGU6Y3k9JzguOTU0NDEnIGdyaWR0b2xlcmFuY2U9JzEwJyBpbmtzY2FwZTpndWlkZS1iYm94PSd0cnVlJyBndWlkZXRvbGVyYW5jZT0nMTAnIGlkPSduYW1lZHZpZXc4OCcgaW5rc2NhcGU6b2JqZWN0LW5vZGVzPSdmYWxzZScgaW5rc2NhcGU6b2JqZWN0LXBhdGhzPSdmYWxzZScgb2JqZWN0dG9sZXJhbmNlPScxMCcgcGFnZWNvbG9yPScjNTU1NzUzJyBpbmtzY2FwZTpwYWdlb3BhY2l0eT0nMScgaW5rc2NhcGU6cGFnZXNoYWRvdz0nMicgc2hvd2JvcmRlcj0nZmFsc2UnIHNob3dncmlkPSdmYWxzZScgc2hvd2d1aWRlcz0ndHJ1ZScgaW5rc2NhcGU6c25hcC1iYm94PSd0cnVlJyBpbmtzY2FwZTpzbmFwLWJib3gtbWlkcG9pbnRzPSdmYWxzZScgaW5rc2NhcGU6c25hcC1nbG9iYWw9J3RydWUnIGlua3NjYXBlOnNuYXAtZ3JpZHM9J3RydWUnIGlua3NjYXBlOnNuYXAtbm9kZXM9J3RydWUnIGlua3NjYXBlOnNuYXAtb3RoZXJzPSdmYWxzZScgaW5rc2NhcGU6c25hcC10by1ndWlkZXM9J3RydWUnIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9JzEzNzYnIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9JzEnIGlua3NjYXBlOndpbmRvdy13aWR0aD0nMjU2MCcgaW5rc2NhcGU6d2luZG93LXg9JzAnIGlua3NjYXBlOndpbmRvdy15PScyNycgaW5rc2NhcGU6em9vbT0nMzInPgogICAgPGlua3NjYXBlOmdyaWQgZW1wc3BhY2luZz0nMicgZW5hYmxlZD0ndHJ1ZScgaWQ9J2dyaWQ0ODY2JyBvcmlnaW54PSctODAuOTk5OTk4JyBvcmlnaW55PSctMzYyJyBzbmFwdmlzaWJsZWdyaWRsaW5lc29ubHk9J3RydWUnIHNwYWNpbmd4PScxcHgnIHNwYWNpbmd5PScxcHgnIHR5cGU9J3h5Z3JpZCcgdmlzaWJsZT0ndHJ1ZScvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDx0aXRsZSBpZD0ndGl0bGU5MTY3Jz5Hbm9tZSBTeW1ib2xpYyBJY29uIFRoZW1lPC90aXRsZT4KICA8ZGVmcyBpZD0nZGVmczczODYnPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSdsaW5lYXJHcmFkaWVudDcyMTInIG9zYjpwYWludD0nc29saWQnPgogICAgICA8c3RvcCBpZD0nc3RvcDcyMTQnIG9mZnNldD0nMCcgc3R5bGU9J3N0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsnLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxnIGlua3NjYXBlOmdyb3VwbW9kZT0nbGF5ZXInIGlkPSdsYXllcjknIGlua3NjYXBlOmxhYmVsPSdhcHBzJyBzdHlsZT0nZGlzcGxheTppbmxpbmUnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKC0zMjIuMDAwMiwxNDUpJz4KCiAgICA8cGF0aCBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPScwJyBkPSdtIDMyNC4zNDM5NSwtMTQ0IDUuNjI1LDUuNjI1IDUuNjI1LC01LjYyNSAtMTEuMjUsMCB6IG0gNS42NTYyNSwxIGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSA3LDAuNDA2MjUgLTUuNjI1LDUuNjI1IDUuNjI1LDUuNjI1IDAsLTExLjI1IHogbSAtMTQsMC4wNjI1IDAsMTEuMTI1IDUuNTYyNSwtNS41NjI1IC01LjU2MjUsLTUuNTYyNSB6IG0gMiw0LjUzMTI1IGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSAxMCwwIGMgMC41NTIyOSwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcxLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSAtNS4wMzEyNSwyLjQzNzUgLTUuNTYyNSw1LjU2MjUgMTEuMTI1LDAgLTUuNTYyNSwtNS41NjI1IHogbSAwLjAzMTIsMi41NjI1IGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHonIGlkPSdyZWN0NzAyNicgc3R5bGU9J2ZpbGw6I2JlYmViZTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZScvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"tetravex,game\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"gnome-tetravex.Gnome-tetravex\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"Tetravex\"\nLABEL oc.displayname=\"Tetravex\"\nLABEL oc.path=\"/usr/games/gnome-tetravex\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"384M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Tetravex\"\nENV APPBIN \"/usr/games/gnome-tetravex\"\nENV APP \"/usr/games/gnome-tetravex\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/tetravex/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/tetravex/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Tetravex

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Tetravex.d\n
"},{"location":"applications/tetravex/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Tetravex.d -t Tetravex .\n
"},{"location":"applications/tetravex/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Tetravex > Tetravex.json\ndocker image save Tetravex -o Tetravex.tar\nctr -n k8s.io images import Tetravex.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Tetravex.json\n\n
"},{"location":"applications/thunderbird/","title":"thunderbird","text":""},{"location":"applications/thunderbird/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/thunderbird/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/thunderbird/#ubuntu-packages","title":"Ubuntu packages","text":"
tk thunderbird gnome-keyring\n
"},{"location":"applications/thunderbird/#displayname","title":"Displayname","text":"
Thunderbird\n
"},{"location":"applications/thunderbird/#path","title":"Path","text":"
/usr/bin/thunderbird\n
"},{"location":"applications/thunderbird/#mimetype","title":"Mimetype","text":"
x-scheme-handler/mailto\n
"},{"location":"applications/thunderbird/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/thunderbird/#wm_class","title":"WM_CLASS","text":"
Mail.Thunderbird\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/thunderbird/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/thunderbird.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/thunderbird/#json-dump","title":"JSON dump","text":"

json source file thunderbird.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"tk thunderbird gnome-keyring\",\n    \"icon\": \"thunderbird.svg\",\n    \"keyword\": \"mail\",\n    \"launch\": \"Mail.Thunderbird\",\n    \"name\": \"thunderbird\",\n    \"displayname\": \"Thunderbird\",\n    \"path\": \"/usr/bin/thunderbird\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"x-scheme-handler/mailto\",\n    \"desktopfile\": \"/usr/share/applications/thunderbird.desktop\"\n}\n
"},{"location":"applications/thunderbird/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output thunderbird.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/thunderbird.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @thunderbird.d.3.0.json\n\n
"},{"location":"applications/thunderbird/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends tk thunderbird gnome-keyring && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"thunderbird.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAyNDYuOTYgMjQyLjgwOCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQ2Ljk2IDI0Mi44MDg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiMzNjM5NTk7fQ0KCS5zdDF7ZmlsbDp1cmwoI1NWR0lEXzFfKTt9DQoJLnN0MntmaWxsOiNGQkZCRkI7fQ0KCS5zdDN7ZmlsbDojOTk5OTk5O30NCgkuc3Q0e2ZpbGw6I0Y4RjhGODt9DQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMl8pO30NCgkuc3Q2e2ZpbGw6dXJsKCNTVkdJRF8zXyk7fQ0KCS5zdDd7ZmlsbDp1cmwoI1NWR0lEXzRfKTt9DQoJLnN0OHtmaWxsOiMzRjY0OTk7fQ0KCS5zdDl7ZmlsbDp1cmwoI1NWR0lEXzVfKTt9DQoJLnN0MTB7ZmlsbDp1cmwoI1NWR0lEXzZfKTt9DQoJLnN0MTF7ZmlsbDp1cmwoI1NWR0lEXzdfKTt9DQoJLnN0MTJ7ZmlsbDp1cmwoI1NWR0lEXzhfKTt9DQoJLnN0MTN7ZmlsdGVyOnVybCgjQWRvYmVfT3BhY2l0eU1hc2tGaWx0ZXIpO30NCgkuc3QxNHtmaWxsOnVybCgjU1ZHSURfMTBfKTt9DQoJLnN0MTV7bWFzazp1cmwoI1NWR0lEXzlfKTt9DQoJLnN0MTZ7b3BhY2l0eTowLjY7fQ0KCS5zdDE3e29wYWNpdHk6MC4yO30NCgkuc3QxOHtmaWxsOnVybCgjU1ZHSURfMTFfKTt9DQoJLnN0MTl7ZmlsbDp1cmwoI1NWR0lEXzEyXyk7fQ0KCS5zdDIwe29wYWNpdHk6MC4xO2ZpbGw6I0YyRjJGMjt9DQoJLnN0MjF7ZmlsbDojMkY0MjgyO30NCgkuc3QyMntmaWxsOnVybCgjU1ZHSURfMTNfKTt9DQoJLnN0MjN7ZmlsbDp1cmwoI1NWR0lEXzE0Xyk7fQ0KCS5zdDI0e2ZpbGw6I0ZGRkZGRjt9DQoJLnN0MjV7ZmlsbDp1cmwoI1NWR0lEXzE1Xyk7fQ0KCS5zdDI2e2ZpbGw6dXJsKCNTVkdJRF8xNl8pO30NCgkuc3QyN3tmaWxsOnVybCgjU1ZHSURfMTdfKTt9DQoJLnN0Mjh7ZmlsbDp1cmwoI1NWR0lEXzE4Xyk7fQ0KCS5zdDI5e2ZpbGw6dXJsKCNTVkdJRF8xOV8pO30NCgkuc3QzMHtmaWxsOnVybCgjU1ZHSURfMjBfKTt9DQoJLnN0MzF7ZmlsbDp1cmwoI1NWR0lEXzIxXyk7fQ0KCS5zdDMye2ZpbGw6dXJsKCNTVkdJRF8yMl8pO30NCgkuc3QzM3tmaWxsOnVybCgjU1ZHSURfMjNfKTt9DQoJLnN0MzR7ZmlsbDp1cmwoI1NWR0lEXzI0Xyk7fQ0KCS5zdDM1e2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyXzFfKTt9DQoJLnN0MzZ7ZmlsbDp1cmwoI1NWR0lEXzI2Xyk7fQ0KCS5zdDM3e21hc2s6dXJsKCNTVkdJRF8yNV8pO30NCgkuc3QzOHtmaWxsOnVybCgjU1ZHSURfMjdfKTt9DQoJLnN0Mzl7ZmlsbDp1cmwoI1NWR0lEXzI4Xyk7fQ0KCS5zdDQwe2ZpbGw6dXJsKCNTVkdJRF8yOV8pO30NCgkuc3Q0MXtmaWxsOnVybCgjU1ZHSURfMzBfKTt9DQoJLnN0NDJ7ZmlsbDp1cmwoI1NWR0lEXzMxXyk7fQ0KCS5zdDQze2ZpbGw6dXJsKCNTVkdJRF8zMl8pO30NCgkuc3Q0NHtmaWxsOnVybCgjU1ZHSURfMzNfKTt9DQoJLnN0NDV7ZmlsbDp1cmwoI1NWR0lEXzM0Xyk7fQ0KCS5zdDQ2e2ZpbGw6dXJsKCNTVkdJRF8zNV8pO30NCgkuc3Q0N3tmaWxsOnVybCgjU1ZHSURfMzZfKTt9DQoJLnN0NDh7ZmlsbDp1cmwoI1NWR0lEXzM3Xyk7fQ0KCS5zdDQ5e2ZpbGw6dXJsKCNTVkdJRF8zOF8pO30NCgkuc3Q1MHtmaWxsOnVybCgjU1ZHSURfMzlfKTt9DQoJLnN0NTF7ZmlsbDp1cmwoI1NWR0lEXzQwXyk7fQ0KCS5zdDUye2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyXzJfKTt9DQoJLnN0NTN7ZmlsbDp1cmwoI1NWR0lEXzQyXyk7fQ0KCS5zdDU0e21hc2s6dXJsKCNTVkdJRF80MV8pO30NCgkuc3Q1NXtmaWxsOnVybCgjU1ZHSURfNDNfKTt9DQoJLnN0NTZ7ZmlsbDp1cmwoI1NWR0lEXzQ0Xyk7fQ0KCS5zdDU3e2ZpbGw6dXJsKCNTVkdJRF80NV8pO30NCgkuc3Q1OHtmaWxsOnVybCgjU1ZHSURfNDZfKTt9DQoJLnN0NTl7ZmlsbDp1cmwoI1NWR0lEXzQ3Xyk7fQ0KCS5zdDYwe2ZpbGw6dXJsKCNTVkdJRF80OF8pO30NCjwvc3R5bGU+DQo8Zz4NCgk8Zz4NCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxOTkuNTMzIiB5MT0iMjAxLjkwNyIgeDI9IjM5LjY3ODciIHkyPSI0Mi4wNTI3Ij4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzAwMzYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMjI5NyIgc3R5bGU9InN0b3AtY29sb3I6IzE4MDIzQiIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC41MTIyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjYwOTRBIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjgyMTEiIHN0eWxlPSJzdG9wLWNvbG9yOiMzRDE1NjMiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM0RTFENzUiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTE4OC44ODcsMzUuNDkyYy0xNC41MDEtOS40NzItMzMuMDQ2LTEyLjUzOC00My4yODEtMTMuNjA5Yy0xMC45NTQtMS4xNDUtMjAuNDY4LTAuOTQzLTI4LjgzNiwwLjI4NQ0KCQkJYy0wLjcwOS0wLjAwOS0xLjQxNC0wLjAzNy0yLjEyNy0wLjAzN2MtMC41NDQsMC0xLjA4LDAuMDIzLTEuNjI3LDAuMDI5YzAuMjI1LTAuMjc1LDAuMzgxLTAuNDQ1LDAuMzgxLTAuNDQ1DQoJCQlzLTAuNDQsMC4wNjktMS4zMDQsMC40NmMtMi43MTcsMC4wNDQtNS40MjEsMC4xMzgtOC4wODUsMC4zMmMzLjcxMS00LjA2OCw2Ljc1MS02LjIsNi43NTEtNi4ycy0zLjYwOCwwLjUyOC0xMC4xOTIsNi40OTYNCgkJCWMtMy4xMzIsMC4yODgtNi4yMjEsMC42Ny05LjI1OCwxLjE0NWM2LjkxOC05LjM2MiwxNC4xNTUtMTMuMzA0LDE0LjE1NS0xMy4zMDRzLTguNzcyLTEuNzg2LTIyLjUwNywxMi4wMTYNCgkJCWMtMS4xNDksMS4xNTUtMi4yMTUsMi4zNTYtMy4yNDYsMy41NzJDMzkuNjgsMzUuOTA3LDExLjAzLDYxLjc1OCwxMS4wMyw5Mi4xMzljMCw1Ljk1OC0xLjgyOSwxMi41MTEsMC4xNDMsMTkuMDU0DQoJCQljLTAuNzg4LDEwLjQ1MywwLjg5LDM4Ljk3NSwwLjg5LDM4Ljk3NXMxMC44MzcsNTguNjQ5LDUyLjUxLDY4Ljg0NmMwLjY2MiwwLjE1OC04LjcwNy0xNC42Mi0xMi44NTEtMzIuNDQyDQoJCQljOC4wNjksOC4yMDgsMTcuNjg1LDE0LjY5OSwyOC40NzgsMTUuODI0YzEuMzI1LDAuMTM3LTYuMTY1LTguNjQtMTIuNzI1LTE5LjIzNGw5NC42OTgsMzEuOTA2DQoJCQljNDkuNTI5LTIxLjI3NCw0My43NjMtMTkuMzU3LDU0LjM5Ny0zMC44NzVjMjMuNDI4LTI1LjM2LDI2LjcwOC0zOS43NSwyMC44MDYtODIuMjM1DQoJCQlDMjMzLjM4Myw3My4yNzksMjEyLjIxNiw0NC44NzUsMTg4Ljg4NywzNS40OTJ6Ii8+DQoJCTxwb2x5Z29uIGNsYXNzPSJzdDIiIHBvaW50cz0iMjIuNjg3LDYyLjI3NiA4LjU0NiwxNDIuNjggMTYuMzg3LDE2Ni45NzQgMTcyLjkxMSwyMTkuMDE1IDIwMS45MzksOTUuNTkxIAkJIi8+DQoJCTxnPg0KCQkJPHBhdGggY2xhc3M9InN0MyIgZD0iTTIzLjEyOCw2NS4wMWMwLjc4NSwxLjY4OSwwLjU1NCwyLjA4OSwwLjA2NSwyLjA4OWMtMC4yMiwwLTAuNDkyLTAuMDgxLTAuNzQ3LTAuMTYxDQoJCQkJYy0wLjI1NS0wLjA4MS0wLjQ5NC0wLjE2MS0wLjY0OC0wLjE2MWMtMC40MzMsMC0wLjE4OSwwLjYzOSwyLjI2MywzLjcyYzMuNDY4LDQuNDA2LDU0LjM5OSw4MS4yOTMsNTcuMTgyLDgxLjI5Mw0KCQkJCWMwLjAxNSwwLDAuMDI4LTAuMDAyLDAuMDQtMC4wMDZjMjMuNzEtOC40NDgsMTI0LjU0My00My4wNTgsMTI0LjU0My00My4wNThMMTk1LjUxLDkzLjY5N0wyMy4xMjgsNjUuMDEiLz4NCgkJPC9nPg0KCQk8cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMjQuNjA3LDYzLjEyMWMwLDAsMC43NiwzLjkzMiw0LjI4MSw4LjI4NGMzLjUsNC4zOTIsNTAuNTEsNzUuNTcxLDUyLjg2OSw3NC45NDQNCgkJCWMzMC43OTUtOC4xNzYsMTQyLjUyNS01MS42NzQsMTQyLjUyNS01MS42NzRMMjQuNjA3LDYzLjEyMXoiLz4NCgkJPHBvbHlnb24gY2xhc3M9InN0MyIgcG9pbnRzPSIxNjcuMzIxLDIxNy4xNjEgMTguNTY4LDE2Ny43MDMgMTkuMDk0LDE3MS4xNzggMTY4Ljk3NiwyMjEuMDEyIAkJIi8+DQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMl8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTAuMjQyOCIgeTE9Ijk1LjMxMTMiIHgyPSI1Ny43MDM5IiB5Mj0iOTUuMzExMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMzE1NkE4Ii8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjI0NzQiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMzUxQTQiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuNTM2NSIgc3R5bGU9InN0b3AtY29sb3I6IzNCNDM5NyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC44NDUzIiBzdHlsZT0ic3RvcC1jb2xvcjojNDcyQzgyIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojNEUxRDc1Ii8+DQoJCTwvbGluZWFyR3JhZGllbnQ+DQoJCTxwYXRoIGNsYXNzPSJzdDUiIGQ9Ik01Ny43MDQsNTkuNzk1YzAsMC01NC4xMjIsMTUuODUtMjkuMjg4LDcxLjAzM2MwLDAtMTEuMzg3LTEwLjQyNi0xOC4xNjctMjMuNzU3DQoJCQlDOS45NDQsMTA2LjQ3NCwyMS41NSw2NS4yNDIsMjEuNTUsNjUuMjQyTDU3LjcwNCw1OS43OTV6Ii8+DQoJCQ0KCQkJPHJhZGlhbEdyYWRpZW50IGlkPSJTVkdJRF8zXyIgY3g9IjU5LjA3MzIiIGN5PSIxMTMuOTIzMiIgcj0iODUuMjQ2NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAxLjQ1IDAgLTUxLjI2NTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjE2NTQiIHN0eWxlPSJzdG9wLWNvbG9yOiMxNENEREEiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuNTQ3OCIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC42NTQ2IiBzdHlsZT0ic3RvcC1jb2xvcjojMjY1OEFDIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjg2NCIgc3R5bGU9InN0b3AtY29sb3I6IzM3M0Y4MSIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzQzMkQ2MiIvPg0KCQk8L3JhZGlhbEdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3Q2IiBkPSJNMjguNDE2LDEzMC44MjhjLTQuNzA3LTAuMDgxLTEyLjI2OS0zLjk2NC0xNC43MjItOC42NjVjLTMuMDY2LDUxLjA5OCwxNy43ODIsODAuOTM5LDUwLjg4LDk2Ljg1Mw0KCQkJQzUzLjc1OSwyMTcuNzc2LDAsMTg5LjQwNywwLDEyMS4xNEMwLDYzLjA5Myw0Ni4wNiwxMS4yMDgsMTE4LjE0Miw4LjgzMWMwLjQ0MiwzLjI1NC0zNS43MzYsMTEuNDE0LTM2Ljg5MywxNS4yNTENCgkJCWMtMS43OTYsNS45NzItNS45MjQsMTIuNDczLTkuNDA2LDE3LjY4NGMtNC43MTgsNy4wNjEsNi41NTcsMTMuMDk5LTEuNzI5LDE1LjAwMWMtMTIuNDY4LDIuODYxLTI5LjA5OCwxLjI3Ny00MS4zNjEsMTcuMjE5DQoJCQlDMTAuMzE5LDk3Ljk1MSwyMi42MiwxMjUuMzY1LDI4LjQxNiwxMzAuODI4eiIvPg0KCQk8Zz4NCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfNF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDQuNTM4NyIgeTE9IjU3Ljg5NzUiIHgyPSIxOTEuNTE1IiB5Mj0iNTcuODk3NSI+DQoJCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuMTg0NiIgc3R5bGU9InN0b3AtY29sb3I6IzJCNTFBQyIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuNjgyNiIgc3R5bGU9InN0b3AtY29sb3I6IzQ0MkM4NCIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuOTQwOSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQkJPC9saW5lYXJHcmFkaWVudD4NCgkJCTxwYXRoIGNsYXNzPSJzdDciIGQ9Ik0xMzcuMDQ4LDEwLjY5OWMtNDYuNjgyLTMuNTgyLTcwLjcwNywxNS4wOTctODYuMTMsMzYuODE3Yy01LjYxNyw3LjkwNi01LjAwMiwxNS4xNjYtMy4wNjgsMjMuOTM3DQoJCQkJYzAuODMxLDMuNzQ0LDEuNjcxLDUuNTM4LDAuNjU5LDkuMzU1Yy0wLjU1OCwyLjEwNi0wLjQ2NSw0LjA3Mi0xLjE1OCw1LjMxNGMtMC45NTksMS43MTctMi4xOCwzLjU5NC0yLjU4OSw2LjY3Nw0KCQkJCWMtMS4wMjIsNy42OTksMS43MDMsMTAuMTUxLDMuNDA2LDEyLjc0MWMyLjQyNi0yLjQwOSw3LjE2NS04LjA3OSwxNS43MS0xMS40NjZjOC41NDUtMy4zODcsMTQuMTY3LTguNDc3LDI0Ljg3Ni0xMy45NDENCgkJCQljMTQuNjMyLTcuNDYzLDMxLjc4MiwzLjg1OSw2NC4zLTYuNzk2YzEwLjAwNi0zLjI3OSwzMy4wMDItMzcuMzQ0LDM4LjQ2MS0zOC42NTJDMTc2LjMxMiwxNy44NzMsMTUwLjQ0OCwxMS43MjYsMTM3LjA0OCwxMC42OTl6DQoJCQkJIi8+DQoJCTwvZz4NCgkJPHBhdGggY2xhc3M9InN0OCIgZD0iTTEwNi4yMDcsMC4wMzJjMCwwLTguMzM1LDQuMDI2LTExLjk2NSwxMS4zMDFjOC4zODEtNC4yMjUsMTMuMjQ2LTYuNTMzLDE1LjU0Ni02LjgwOA0KCQkJYzAsMC0yLjIwMywxLjA2Ny00LjkzNSw2Ljg3YzQuODMtMS41NDcsNi40OTMtMi41MjIsNy44MTktMi41MzdjMCwwLTAuMzg1LDAuNjEtMC43MzcsNi40MDINCgkJCWMtNy40MTctMi40MDQtMjEuNjkzLDAuMzk3LTI5LjI4Nyw1LjE1M0M4MC4wNzIsNi42NzgsMTA2LjIwNywwLjAzMiwxMDYuMjA3LDAuMDMyeiIvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzVfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjY2LjE3MzYiIHkxPSIyMy4yMDU2IiB4Mj0iMTY3LjI2NDIiIHkyPSIxMTEuMDgyMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjAyMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiM0OEE4RTAiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMzg4MyIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC40OTY4IiBzdHlsZT0ic3RvcC1jb2xvcjojMkI1MUFDIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjc4OTIiIHN0eWxlPSJzdG9wLWNvbG9yOiM0NDJDODQiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuOTQwOSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3Q5IiBkPSJNMTM5LjM3OSw4LjYzQzEyNS4wNyw2Ljc3NiwxMTMuMTA5LDcuMTQxLDEwMi45NCw5LjFjMy4xOTgtMy4wNjUsNi44OTgtNC41NzUsNi44OTgtNC41NzUNCgkJCWMtNC43OTUsMC40MjQtMTAuNzgxLDMuNTU0LTE1LjkxNyw2Ljg2OGMtMi41ODgsMC44MjYtNS4wNTQsMS43NTgtNy4zOSwyLjc5OWMxLjQzLTEuODg1LDMuMDk0LTMuODk5LDQuNzItNS40NDUNCgkJCWM2LjAzOS01Ljc0MywxNS4wMDYtOC43MTUsMTUuMDA2LTguNzE1Qzk4LjYwMy0wLjUzLDcyLjk4OSw2LjAyNyw1Ny41NzYsMzcuMjQ1Yy0yLjUyNiwzLjA3Ny00Ljg4Myw2LjIzNS03LjEyOSw5LjM5OA0KCQkJYy01Ljc5OCw4LjE2NC01LjE2MiwxNS42NTgtMy4xNjIsMjQuNzE1YzAuODUyLDMuODY3LDEuMDA5LDEwLjA0LDAuMTY4LDE0LjAyOWMtMC4xNjgsMC43OTktMi4zNjMsMi44NjMtMi45MjYsOC40MjgNCgkJCWMtMC42MDIsNS45MDUsMS41MDUsOC44MDQsMy41ODIsMTEuMjAzYzcuMzgtMTAuNzkyLDE0LjY2MS0xMi45MzEsMTQuNjYxLTEyLjkzMUM3My4xLDg3Ljg1NSw3Ny40LDgzLjMzNSw4OC40NTgsNzcuNjk0DQoJCQljMTUuMTA4LTcuNzA5LDY3LjkzOSwxNy40NSwxMDEuNTEyLDYuNDQ4YzEwLjMzMi0zLjM4NC0zLjk3Ny00Ny4zNTksMS42NjMtNDguNzA5QzE3NS45MzQsMTguMDczLDE1My4xMzksMTAuNDEzLDEzOS4zNzksOC42M3oiDQoJCQkvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzZfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE5LjY3NjIiIHkxPSIzMzcuNDEzOSIgeDI9IjIxNy44MzUzIiB5Mj0iNDMuNjMwOSI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjM3ODciIHN0eWxlPSJzdG9wLWNvbG9yOiMzMTU2QTgiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM0RTFENzUiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MTAiIGQ9Ik0yNDQuMTc2LDEwMy4yODhjLTguMjc2LTQzLjIzNy00OC4wOTYtODIuNTcyLTgwLjExNy04NC43NTJjLTE0LjIxMS0wLjk2OC05Ljg0Nyw2LjMxOS0xOC43MzksOS4wOTQNCgkJCWMtMzguMzIsMTEuOTU5LTM4LjkwNiwxOC45NDEtMzguOTA2LDE4Ljk0MWM4MS4yNTIsMy44MTksODIuNDg0LDg0LjA2NCw2MC43MjQsMTA0LjM2NmM2LjEyMy0xLjQyOCwxMi43NjItOC45MTQsMTguODU5LTIwLjY2Ng0KCQkJYy0wLjczMiw0LjkzMS0xLjM2LDEwLjk4LTIuMjc0LDE3LjcyOWMtMi43ODgsMjAuNTk1LDAuODIzLDYzLjYxNC01OC4zNTYsOTIuNDA1YzAsMCwzMi4zNzItMi42NDYsNDguNDI1LTIwLjcxNw0KCQkJYy02LjUyOCwxNS4wMTItMjQuNDQxLDIzLjEyMS0yNC40NDEsMjMuMTIxYzEzLjE4Mi0xLjkyOCw0Ny44MS0xMi4xNDYsNjkuODY4LTM5LjczMg0KCQkJQzI0NC4xODUsMTcxLjg1MiwyNTEuNjkzLDE0Mi41NTgsMjQ0LjE3NiwxMDMuMjg4eiIvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzdfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ijk2Ljc0NTIiIHkxPSIyNzguNjQ1OCIgeDI9IjIwNi4zMTc1IiB5Mj0iMzIuNTQyMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMjlBQkUyIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjc3MzMiIHN0eWxlPSJzdG9wLWNvbG9yOiMzODVBQTYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuODU3NSIgc3R5bGU9InN0b3AtY29sb3I6IzQxNDI5MyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QxMSIgZD0iTTE2NC45OTMsMTgyLjIyMWMwLDAsMjYuMzk2LTcuMzgsMzQuOTAzLTIxLjYzM2MtMS4wMzIsMTYuNjE5LTE2LjEwNywzMy42NjItMTYuMTA3LDMzLjY2Mg0KCQkJczIyLjAzOC00LjQ2LDMxLjQzNi0xOS45NjhjLTEuMjI0LDEzLjk5NC0xOC4xOTEsMzIuOTA3LTE4LjE5MSwzMi45MDdjMTcuMzQ2LTMuMTEzLDYwLjkzLTMwLjY0NSw0Ny4xNDMtMTAzLjkwMQ0KCQkJYy04LjE0Mi00My4yNjItNDguMDk2LTgyLjU3Mi04MC4xMTctODQuNzUyYy0xNC4yMTEtMC45NjgtOS44NDcsNi4zMTktMTguNzM5LDkuMDk0Yy0zOC4zMiwxMS45NTktMzguOTA2LDE4Ljk0MS0zOC45MDYsMTguOTQxDQoJCQljODEuMjUyLDMuODE5LDEwMi44NDQsNDYuMzQ0LDYwLjcyNCwxMDMuMjMxYzYuMTIzLTEuNDI5LDguNTc4LTQuNzk0LDEzLjE3OC0xMC4zMDENCgkJCUMxODAuMzE1LDEzOS41MDEsMTgyLjQwMSwxNjEuMjgxLDE2NC45OTMsMTgyLjIyMXoiLz4NCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF84XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0OC4yNjg2IiB5MT0iOTIuMDMzNyIgeDI9IjU0LjI0MTQiIHkyPSI5NS40NjgzIj4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNCMERDRDYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM1M0FDRTAiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MTIiIGQ9Ik02MC42MDksODUuNTY3YzAsMC00LjcxOSwzLjMwMS04LjEzNiwyLjQ2Yy00LjA0NS0wLjk5My00LjczLTQuOTEzLTQuNzMtNC45MTMNCgkJCWMtMC4wODksMC44MDMtMC4xOTIsMS41NzgtMC4zNDEsMi4yNzNjLTAuMTY4LDAuNzk5LTIuMzYzLDIuODYzLTIuOTI2LDguNDI4Yy0wLjYwMiw1LjkwNSwxLjYxNSw5LjMyNSwzLjY5MiwxMS43MjQNCgkJCUM1NS41NDksOTQuNzQ3LDYyLjcyLDkyLjA4Nyw2Mi43Miw5Mi4wODdDNTkuOTExLDkxLjEwNSw2MC42MDksODUuNTY3LDYwLjYwOSw4NS41Njd6Ii8+DQoJCTxkZWZzPg0KCQkJPGZpbHRlciBpZD0iQWRvYmVfT3BhY2l0eU1hc2tGaWx0ZXIiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMTYyLjY4IiB5PSIxOC4zNTUiIHdpZHRoPSIxNC45MjciIGhlaWdodD0iNi42MjkiPg0KCQkJCTxmZUNvbG9yTWF0cml4ICB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMSAwIDAgMCAwICAwIDEgMCAwIDAgIDAgMCAxIDAgMCAgMCAwIDAgMSAwIi8+DQoJCQk8L2ZpbHRlcj4NCgkJPC9kZWZzPg0KCQk8bWFzayBtYXNrVW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4PSIxNjIuNjgiIHk9IjE4LjM1NSIgd2lkdGg9IjE0LjkyNyIgaGVpZ2h0PSI2LjYyOSIgaWQ9IlNWR0lEXzlfIj4NCgkJCTxnIGNsYXNzPSJzdDEzIj4NCgkJCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzEwXyIgY3g9IjE1NC4zODQiIGN5PSI2Ny45OTg1IiByPSI1MS45Njc1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQoJCQkJCTxzdG9wICBvZmZzZXQ9IjAuODY4IiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQoJCQkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDAiLz4NCgkJCQk8L3JhZGlhbEdyYWRpZW50Pg0KCQkJCTxyZWN0IHg9IjkxLjI5NSIgeT0iLTcuMjE4IiBjbGFzcz0ic3QxNCIgd2lkdGg9IjEwMC4wMTUiIGhlaWdodD0iOTMuMzM5Ii8+DQoJCQk8L2c+DQoJCTwvbWFzaz4NCgkJPGcgY2xhc3M9InN0MTUiPg0KCQkJPGcgY2xhc3M9InN0MTYiPg0KCQkJCTxnIGNsYXNzPSJzdDE3Ij4NCgkJCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTc2LjIxMzkiIHkxPSIyMy4wODUxIiB4Mj0iMTY0LjI0MDMiIHkyPSIyMC41NTU0Ij4NCgkJCQkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMDkyQjkiLz4NCgkJCQkJCTxzdG9wICBvZmZzZXQ9IjAuMjE5OSIgc3R5bGU9InN0b3AtY29sb3I6IzI1OERCNiIvPg0KCQkJCQkJPHN0b3AgIG9mZnNldD0iMC42NTY0IiBzdHlsZT0ic3RvcC1jb2xvcjojMTY4NUIxIi8+DQoJCQkJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTA4MkFGIi8+DQoJCQkJCTwvbGluZWFyR3JhZGllbnQ+DQoJCQkJCTxwYXRoIGNsYXNzPSJzdDE4IiBkPSJNMTYzLjUxMywxOC40MzRjMS4xMDYtMC4yODcsNS42MjEsMC4yMDQsOC41ODQsMS41MzNjMi45NjQsMS4zMjksOC4wNzMsMy42NzksMy45ODYsNC43MDENCgkJCQkJCWMtNC4wODgsMS4wMjItNi40MzgtMC42MTMtOC40ODItMi4zNTFTMTYwLjc1NCwxOS4xNDksMTYzLjUxMywxOC40MzR6Ii8+DQoJCQkJPC9nPg0KCQkJPC9nPg0KCQk8L2c+DQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMTJfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjgwLjc4MzgiIHkxPSIzOC4wMjUyIiB4Mj0iOTAuNjM3IiB5Mj0iNzcuNTQ0MyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjAwNzQiIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzk4RDE7c3RvcC1vcGFjaXR5OjAiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMjQ4MiIgc3R5bGU9InN0b3AtY29sb3I6IzExODdDMjtzdG9wLW9wYWNpdHk6MC42MTk3Ii8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjY0MjIiIHN0eWxlPSJzdG9wLWNvbG9yOiMzRjY0OTk7c3RvcC1vcGFjaXR5OjAuNzEiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMyRjQyODI7c3RvcC1vcGFjaXR5OjAuNSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QxOSIgZD0iTTYxLjA1MSw4NC45MjFjMCwwLDI1Ljg4OC00Mi42NjIsNDkuMjkyLTU0LjE3NWMyLjE3My0xLjA5My0zMi40MDUsOS4xOTEtNDYuMzIsMjQuNTUNCgkJCUM1NS43NTIsNjQuNDI1LDYwLjEzMiw4Mi4yOTgsNjEuMDUxLDg0LjkyMXoiLz4NCgkJPHBhdGggY2xhc3M9InN0MjAiIGQ9Ik02MS4wNTEsODQuOTIxYzAuMDI0LTAuMDE1LDAuMDUtMC4wMywwLjA3NS0wLjA0NWM2LjY5NC00LjEzNiwxOC4xNjYtNi41MTgsMjEuODY0LTE0LjAxNQ0KCQkJYzE0LjIzNy0yOC44NjksMjcuMzU0LTQwLjExNSwyNy4zNTQtNDAuMTE1Qzg2LjkzOSw0Mi4yNTksNjEuMDUxLDg0LjkyMSw2MS4wNTEsODQuOTIxeiIvPg0KCQk8cGF0aCBjbGFzcz0ic3QyMSIgZD0iTTYzLjUxMiw3Ny4xMThjMCwwLTQuNjY2LTcuMTU5LDIuMDUzLTEzLjY4N2MzLjU0Ni0zLjQ0LDguOTE5LTEuNTI5LDkuNTQtMC45MQ0KCQkJYzIuNjQ0LDIuNjIyLDAuOTgyLDguMTU2LTEuMzk4LDExLjI4OEM3Mi4zNjIsNzUuNTczLDY4LjQ0OCw3OC4zMTksNjMuNTEyLDc3LjExOHoiLz4NCgkJDQoJCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzEzXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0OC43MzgzIiB5MT0iMTQuMzczIiB4Mj0iNDMuMTk5MyIgeTI9IjExLjMwMjciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC45OTk0IDAuMDM0OSAtMC4wMzQ5IDAuOTk5NCAyNC41OTA2IDU3LjEyMDIpIj4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGOUMyMUIiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMTQ3OSIgc3R5bGU9InN0b3AtY29sb3I6I0YzQkExQiIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC4zNzg3IiBzdHlsZT0ic3RvcC1jb2xvcjojRTNBNDFCIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjY2MzQiIHN0eWxlPSJzdG9wLWNvbG9yOiNDOTgwMUMiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuOTg4NCIgc3R5bGU9InN0b3AtY29sb3I6I0E0NEUxQyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0EzNEMxQyIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QyMiIgZD0iTTY2LjE4Nyw3Ni42NzRjMCwwLTMuMjI0LTQuOTQ5LDEuNDIyLTkuNDU5YzIuNDQ2LTIuMzc2LDYuMTYxLTEuMDU2LDYuNTkyLTAuNjMNCgkJCWMxLjgyNiwxLjgxMiwwLjY3Niw1LjYzNy0wLjk2OCw3LjhDNzIuMzA0LDc1LjYwOCw2OS41OTgsNzcuNTA0LDY2LjE4Nyw3Ni42NzR6Ii8+DQoJCTxwYXRoIGQ9Ik03Mi42MjMsNzEuMzkzYy0wLjA3MiwxLjk3OC0xLjc0NiwzLjUyMi0zLjczOCwzLjQ1NGMtMS45OTYtMC4wNjktMy41NTgtMS43MjYtMy40ODctMy43MDQNCgkJCWMwLjA3MS0xLjk3NywxLjc0NC0zLjUyMSwzLjc0MS0zLjQ1M0M3MS4xMzEsNjcuNzU5LDcyLjY5Miw2OS40MTcsNzIuNjIzLDcxLjM5M3oiLz4NCgk8L2c+DQoJPGNpcmNsZSBjbGFzcz0ic3QyNCIgY3g9IjY2LjcyNSIgY3k9IjcwLjI4NyIgcj0iMS4xMzYiLz4NCgk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE0XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyMDYuMjExMyIgeTE9IjEzMC4xMzkxIiB4Mj0iMTY5LjQyOTgiIHkyPSI0Ny41MjY0Ij4NCgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzQwOUVDMyIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjYyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjA2MUJEIi8+DQoJPC9saW5lYXJHcmFkaWVudD4NCgk8cGF0aCBjbGFzcz0ic3QyMyIgZD0iTTIyOC41MDUsNjUuMDFjLTE3LjcyMS0yNi45NzYtMzEuNzYxLTMzLjgzMS0zMS43NjEtMzMuODMxczAuNjQ1LDE5LjY1LDEwLjQ4NCwyOS4xMjgNCgkJYzEuMTI0LDEuMDgzLTExLjc3NC04LjQzMi0xMS43NzQtOC40MzJzLTIuNzU4LDkuMDc2LDMuNTYyLDE5LjUxYy0xLjgzNi0yLjQzOS0zLjA1MS0zLjM2My0zLjA1MS0zLjM2Mw0KCQlzLTExLjkwOCw1LjQ5MS0xNS40MjMsMTMuMTA5Yy0xLjgxNS0zLjQyNi0zLjE3Ni01LjQ0NC0zLjE3Ni01LjQ0NHMtOC4yMzYsMTYuNDM3LTcuMjAxLDM1LjQ5NQ0KCQljMS42ODQsMzAuOTg4LTUuODAzLDQyLjQwNC01LjgwMyw0Mi40MDRzMjAuMDU3LTcuNjk1LDI5LjY3Ni0zMi40NjhjMy45NzQsMTAuNTMzLTAuMTIxLDIxLjYxOS0wLjEyMSwyMS42MTkNCgkJczE2LjIwNi0xMi4xMDksMTkuNjkxLTM0LjE4YzMuODYzLDYuMjMsMi43MjcsMTguNjY0LDIuNzI3LDE4LjY2NHMxMC4zNDQtMTQuNDAyLDEwLjU5Ni0zMC4wODYNCgkJYzQuNzk0LDMuMzQzLDUuMjM1LDE2LjM5OSw1LjIzNSwxNi4zOTlTMjQ3LjUwMiw5My45MjgsMjI4LjUwNSw2NS4wMXoiLz4NCgk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxNzYuNzYwMyIgeTE9IjEwMy4wNjEiIHgyPSIxNTAuNDA2OSIgeTI9IjIxLjk1MzYiPg0KCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMTRCMkRBIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuNDAyOCIgc3R5bGU9InN0b3AtY29sb3I6IzI5N0NDQyIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjUwNzciIHN0eWxlPSJzdG9wLWNvbG9yOiMyNTZGQzUiLz4NCgkJPHN0b3AgIG9mZnNldD0iMC42NDkyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjE2NEJGIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuODE2MiIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4MzUiIHN0eWxlPSJzdG9wLWNvbG9yOiMyMDYxQkQiLz4NCgk8L2xpbmVhckdyYWRpZW50Pg0KCTxwYXRoIGNsYXNzPSJzdDI1IiBkPSJNMjExLjI4Miw0Ni4xNThjLTQuNjMxLTguNjMtMTIuODAzLTE0LjEzLTE5Ljk4Ni0xOC41ODJjLTE3LjkwOS0xMS4xMDUtMjkuNDI3LTEyLjY2NS0yOS40MjctMTIuNjY1DQoJCXMtMTYuNTI4LDMuMDc0LTEzLjY4OSw3LjY3MmMwLjE0NiwwLjIzNiwwLjQ4NywwLjUzNSwwLjk2OCwwLjg3N2MtMTQuNDk4LTYuNjc4LTIyLjcyMiw4LjY3Ny0yMi43MjIsOC42NzcNCgkJYy04LjI4NC0wLjUwMy0xOC4zNzEsMy41NzUtMjEuMzEyLDE0LjQ5OWMtMC4zMDUsMS4xMzQsMy43MTEsMC40OTYsNS43NzcsMC45NDVjMTIuMDc5LDIuNjI2LDIzLjQ1LDguMzIsMjguNjc1LDExLjEzNA0KCQljMTIuMTU0LDYuNTQ4LDE5LjM2NSwxNy40NTEsMjMuNTI4LDI1LjYyOWM1LjAzNyw5Ljg5NCw3LjA5NCwyNy4zMDQsNy4wOTQsMjcuMzA0czEzLjI1My0xOC4yMDUsMTAuMDg2LTI3LjU1Mg0KCQljNS4yNDksMy4yNiw2LjI4NSwxNC44OTEsNi4yODUsMTQuODkxczguODM1LTEzLjgzOCw2LjIyMy0yNS44OTFjNi44MTUsNC4xNTMsNy4wNDIsMTIuNjAxLDcuMDQyLDEyLjYwMXM2LjkzOS05LjYzMSwzLjgwMy0yNS40MjcNCgkJYzYuODU4LDUuNDUzLDguMjkzLDEyLjUxNyw4LjI5MywxMi41MTdTMjE3LjUyNiw1Ny43OTQsMjExLjI4Miw0Ni4xNTh6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"thunderbird,mail\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"thunderbird.desktop\"\nLABEL oc.launch=\"Mail.Thunderbird\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"thunderbird\"\nLABEL oc.displayname=\"Thunderbird\"\nLABEL oc.path=\"/usr/bin/thunderbird\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/mailto\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"thunderbird\"\nENV APPBIN \"/usr/bin/thunderbird\"\nENV APP \"/usr/bin/thunderbird\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/thunderbird/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/thunderbird/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application thunderbird

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/thunderbird.d\n
"},{"location":"applications/thunderbird/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f thunderbird.d -t thunderbird .\n
"},{"location":"applications/thunderbird/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect thunderbird > thunderbird.json\ndocker image save thunderbird -o thunderbird.tar\nctr -n k8s.io images import thunderbird.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @thunderbird.json\n\n
"},{"location":"applications/vice/","title":"vice","text":""},{"location":"applications/vice/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.18.04

"},{"location":"applications/vice/#displayname","title":"Displayname","text":"
Commodore64\n
"},{"location":"applications/vice/#path","title":"Path","text":"
/usr/bin/x64\n
"},{"location":"applications/vice/#file-extensions","title":"File extensions","text":"

\"crt;bin\"

"},{"location":"applications/vice/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/vice/#wm_class","title":"WM_CLASS","text":"
x64.X64\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/vice/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/x64.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/vice/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install  --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\nRUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\nRUN mkdir /usr/lib/vice/C64/cartridge\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\n
"},{"location":"applications/vice/#json-dump","title":"JSON dump","text":"

json source file vice.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\",\n        \"RUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\",\n        \"RUN mkdir /usr/lib/vice/C64/cartridge\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"c64.svg\",\n    \"keyword\": \"x64,vice,commodore,c64\",\n    \"launch\": \"x64.X64\",\n    \"name\": \"vice\",\n    \"displayname\": \"Commodore64\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/x64\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n    \"fileextensions\": \"crt;bin\",\n    \"desktopfile\": \"/usr/share/applications/x64.desktop\",\n    \"usedefaultapplication\": false\n}\n
"},{"location":"applications/vice/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output vice.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vice.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vice.d.3.0.json\n\n
"},{"location":"applications/vice/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\nRUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\nRUN mkdir /usr/lib/vice/C64/cartridge\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\nLABEL oc.icon=\"c64.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIxNDAiPg0KICA8cGF0aCBkPSJNODMsOTcuMTEwOSBMODMsMTI4LjU4MzMgQTYxLDYxIDAgMSwxIDgzLDExLjQxNjcgTDgzLDQyLjg4OTEgQTMyLDMyIDAgMSwwIDgzLDk3LjExMDkiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMjI1NSIgLz4NCiAgPHBvbHlnb24gcG9pbnRzPSI4Myw0MyA4Myw2NyAxMTEsNjcgMTM1LDQzIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDIyNTUiIC8+DQogIDxwb2x5Z29uIHBvaW50cz0iODMsOTcgODMsNzMgMTExLDczIDEzNSw5NyIgc3Ryb2tlPSJub25lIiBmaWxsPSIjZmYwMDAwIiAvPg0KPC9zdmc+\"\nLABEL oc.keyword=\"vice,x64,vice,commodore,c64\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"x64.desktop\"\nLABEL oc.launch=\"x64.X64\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nLABEL oc.name=\"vice\"\nLABEL oc.displayname=\"Commodore64\"\nLABEL oc.path=\"/usr/bin/x64\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"crt;bin\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vice\"\nENV APPBIN \"/usr/bin/x64\"\nENV APP \"/usr/bin/x64\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vice/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vice/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application vice

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vice.d\n
"},{"location":"applications/vice/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f vice.d -t vice .\n
"},{"location":"applications/vice/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect vice > vice.json\ndocker image save vice -o vice.tar\nctr -n k8s.io images import vice.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vice.json\n\n
"},{"location":"applications/vlc/","title":"vlc","text":""},{"location":"applications/vlc/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/vlc/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/vlc/#alpine-packages","title":"Alpine packages","text":"
ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\n
"},{"location":"applications/vlc/#displayname","title":"Displayname","text":"
videolan\n
"},{"location":"applications/vlc/#path","title":"Path","text":"
/usr/bin/vlc\n
"},{"location":"applications/vlc/#mimetype","title":"Mimetype","text":"
video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\n
"},{"location":"applications/vlc/#file-extensions","title":"File extensions","text":"

\"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\"

"},{"location":"applications/vlc/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/vlc/#wm_class","title":"WM_CLASS","text":"
vlc.vlc\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/vlc/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/vlc.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/vlc/#json-dump","title":"JSON dump","text":"

json source file vlc.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office,graphics\",\n    \"apkpackage\": \"ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\",\n    \"icon\": \"circle_vlc.svg\",\n    \"keyword\": \"vlc, videolan, video, lan, dvd\",\n    \"launch\": \"vlc.vlc\",\n    \"name\": \"vlc\",\n    \"displayname\": \"videolan\",\n    \"path\": \"/usr/bin/vlc\",\n    \"mimetype\": \"video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\",\n    \"fileextensions\": \"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/vlc.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/vlc/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output vlc.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vlc.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vlc.d.3.0.json\n\n
"},{"location":"applications/vlc/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\nLABEL oc.icon=\"circle_vlc.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQ2FsY3VsYXRvciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlYzU4OSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iNTIwIiB4Mj0iNTIwIiB5MT0iNCIgeTI9IjEwMjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjZSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjUyMC4zMiIgeDI9IjUyMC4zMiIgeTE9Ii0xMzguNDYiIHkyPSIxNDg0LjgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZGE2NCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjM1MTUyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjQ0OTc2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNDkuNTgyIiB4Mj0iNDkuNTgyIiB5MT0iLTQwLjc2NCIgeTI9IjEyMC45MiIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIDMuMjQ1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIuNiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM0ODc1IiB5PSItLjAzNzIiIHdpZHRoPSIxLjA2OTgiIGhlaWdodD0iMS4wNzQ0IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjM5NDk5ODkiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSI1MTEuOCIgY3k9IjUxMS4zNSIgcj0iNDcxLjQ1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDgwOCAuMDI0NDQyIC0uMDI0NDM5IDEuMDgwNiAtMjguODM5IC01My43NDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRhNjQiIHN0b3Atb3BhY2l0eT0iLjA4NTU2MiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjkxMDczIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjE0MzUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCAtLjY3OCkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICA8ZyBpZD0ic2hhZG93IiB0cmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIj48L2c+CiAgPGcgaWQ9ImNpcmNsZSIgdHJhbnNmb3JtPSJtYXRyaXgoLjk5Nzk4IDAgMCAuOTk3OTggLjczMTMxIDIuMTgwNCkiIGZpbGw9InVybCgjZCkiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8cGF0aCBkPSJtOTgzLjI1IDUxMS4zNWMwLTcuOTUtMC4yLTE1Ljg1LTAuNS0yMy41NXEtOC0xODAuMTUtMTM3LjU1LTMwOS44NWMtOTIuMDUtOTItMjAzLjItMTM4LjA1LTMzMy40LTEzOC4wNS0xMzAuMTUgMC0yNDEuMzUgNDYuMDUtMzMzLjM1IDEzOC4wNS05Mi4wNSA5Mi0xMzguMSAyMDMuMi0xMzguMSAzMzMuNCAwIDEzMC4xNSA0Ni4wNSAyNDEuMzUgMTM4LjEgMzMzLjM1IDg2LjE1IDg2LjMgMTg5LjM1IDEzMi4xNSAzMDkuMTUgMTM3LjYgOCAwLjMgMTYgMC41IDI0LjIgMC41IDEzMC4yIDAgMjQxLjM1LTQ2LjEgMzMzLjQtMTM4LjEgOTItOTIgMTM4LjA1LTIwMy4yIDEzOC4wNS0zMzMuMzV6IiBmaWxsPSIjMDAwIiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yNSIvPgogICAgPHBhdGggZD0ibTk4My4yNSA1MTEuMzVjMC03Ljk1LTAuMi0xNS44NS0wLjUtMjMuNTVxLTgtMTgwLjE1LTEzNy41NS0zMDkuODVjLTkyLjA1LTkyLTIwMy4yLTEzOC4wNS0zMzMuNC0xMzguMDUtMTMwLjE1IDAtMjQxLjM1IDQ2LjA1LTMzMy4zNSAxMzguMDUtOTIuMDUgOTItMTM4LjEgMjAzLjItMTM4LjEgMzMzLjQgMCAxMzAuMTUgNDYuMDUgMjQxLjM1IDEzOC4xIDMzMy4zNSA4Ni4xNSA4Ni4zIDE4OS4zNSAxMzIuMTUgMzA5LjE1IDEzNy42IDggMC4zIDE2IDAuNSAyNC4yIDAuNSAxMzAuMiAwIDI0MS4zNS00Ni4xIDMzMy40LTEzOC4xIDkyLTkyIDEzOC4wNS0yMDMuMiAxMzguMDUtMzMzLjM1eiIgZmlsbD0idXJsKCNjKSIvPgogICAgPHBhdGggZD0ibTk4My4yNSA1MTEuMzVjMC03Ljk1LTAuMi0xNS44NS0wLjUtMjMuNTVxLTgtMTgwLjE1LTEzNy41NS0zMDkuODVjLTkyLjA1LTkyLTIwMy4yLTEzOC4wNS0zMzMuNC0xMzguMDUtMTMwLjE1IDAtMjQxLjM1IDQ2LjA1LTMzMy4zNSAxMzguMDUtOTIuMDUgOTItMTM4LjEgMjAzLjItMTM4LjEgMzMzLjQgMCAxMzAuMTUgNDYuMDUgMjQxLjM1IDEzOC4xIDMzMy4zNSA4Ni4xNSA4Ni4zIDE4OS4zNSAxMzIuMTUgMzA5LjE1IDEzNy42IDggMC4zIDE2IDAuNSAyNC4yIDAuNSAxMzAuMiAwIDI0MS4zNS00Ni4xIDMzMy40LTEzOC4xIDkyLTkyIDEzOC4wNS0yMDMuMiAxMzguMDUtMzMzLjM1eiIgZmlsbD0idXJsKCNhKSIgb3BhY2l0eT0iLjIiLz4KICAgPC9nPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCg2LjA1NjIgMCAwIDYuMDU2MiAyMTkuOSAxOTkuODMpIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTQ3Ljk5OCA2My40MzRjMTEuOTUxIDAgMjEuOTU1LTQuMDYxIDIyLjU2MS05LjM2Mi0xLjc3Ny00Ljk4NS0zLjcxNS0xMC40MjEtNS42MTktMTUuNzY0LTEuMzIyIDMuODExLTguNjIzIDYuNDk4LTE2Ljk0MSA2LjQ5OC04LjMxNiAwLTE1LjYxNy0yLjY4OC0xNi45NDEtNi40OTctMS45MDQgNS4zNDItMy44NCAxMC43NzctNS42MTcgMTUuNzYzIDAuNjA0IDUuMzAxIDEwLjYwNiA5LjM2MiAyMi41NTcgOS4zNjJ6bTAtMzMuNTI2YzUuNjE3IDAgMTAuODM2LTEuNzM5IDEyLjM2My00LjQzOS0yLjEwNS01LjkxMy0zLjkxNC0xMC45ODYtNS4wNTctMTQuMTg3LTAuNzU5LTIuMTMzLTQuMjAxLTMuMjQxLTcuMzA2LTMuMjQxcy02LjU0NyAxLjEwOC03LjMwNyAzLjI0MWMtMS4xNDEgMy4yMDEtMi45NDkgOC4yNzQtNS4wNTcgMTQuMTg3IDEuNTI4IDIuNyA2Ljc0OSA0LjQzOSAxMi4zNjQgNC40Mzl6bTQzLjkwNCAzOC40NjUtMTguNzc3LTcuNTYzIDIuMTYyIDYuMDMzYy0wLjEwOSA2LjM5NC0xMi41MjEgMTEuNDg5LTI3LjI4OSAxMS40ODktMTQuNzY2IDAtMjcuMTgtNS4wOTUtMjcuMjg3LTExLjQ4OWwyLjE2LTYuMDMzLTE4Ljc3NSA3LjU2M2MtNS4yNjQgMi4xMjEtNS40ODQgNi4wNDktMC40OSA4LjcyNmwzNS4zMTIgMTguOTM1YzQuOTk0IDIuNjc3IDEzLjE2OCAyLjY3NyAxOC4xNjIgMGwzNS4zMTItMTguOTM1YzQuOTk1LTIuNjc3IDQuNzc0LTYuNjA1LTAuNDktOC43MjZ6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yIi8+CiAgICA8cGF0aCBkPSJtNDcuOTk4IDYxLjYzN2MxMS45NTEgMCAyMS45NTUtNC4wNjEgMjIuNTYxLTkuMzYyLTEuNzc3LTQuOTg1LTMuNzE1LTEwLjQyMS01LjYxOS0xNS43NjQtMS4zMjIgMy44MTEtOC42MjMgNi40OTgtMTYuOTQxIDYuNDk4LTguMzE2IDAtMTUuNjE3LTIuNjg4LTE2Ljk0MS02LjQ5Ny0xLjkwNCA1LjM0Mi0zLjg0IDEwLjc3Ny01LjYxNyAxNS43NjMgMC42MDQgNS4zMDEgMTAuNjA2IDkuMzYyIDIyLjU1NyA5LjM2MnptMC0zMy41MjZjNS42MTcgMCAxMC44MzYtMS43MzkgMTIuMzYzLTQuNDM5LTIuMTA1LTUuOTEzLTMuOTE0LTEwLjk4Ni01LjA1Ny0xNC4xODctMC43NTktMi4xMzMtNC4yMDEtMy4yNDEtNy4zMDYtMy4yNDFzLTYuNTQ3IDEuMTA4LTcuMzA3IDMuMjQxYy0xLjE0MSAzLjIwMS0yLjk0OSA4LjI3NC01LjA1NyAxNC4xODcgMS41MjggMi43IDYuNzQ5IDQuNDM5IDEyLjM2NCA0LjQzOXptNDMuOTA0IDM4LjQ2NS0xOC43NzctNy41NjMgMi4xNjIgNi4wMzNjLTAuMTA5IDYuMzk0LTEyLjUyMSAxMS40ODktMjcuMjg5IDExLjQ4OS0xNC43NjYgMC0yNy4xOC01LjA5NS0yNy4yODctMTEuNDg5bDIuMTYtNi4wMzMtMTguNzc1IDcuNTYzYy01LjI2NCAyLjEyMS01LjQ4NCA2LjA0OS0wLjQ5IDguNzI2bDM1LjMxMiAxOC45MzVjNC45OTQgMi42NzcgMTMuMTY4IDIuNjc3IDE4LjE2MiAwbDM1LjMxMi0xOC45MzVjNC45OTUtMi42NzcgNC43NzQtNi42MDUtMC40OS04LjcyNnoiIGZpbGw9InVybCgjYikiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"vlc,vlc, videolan, video, lan, dvd\"\nLABEL oc.cat=\"utilities,office,graphics\"\nLABEL oc.desktopfile=\"vlc.desktop\"\nLABEL oc.launch=\"vlc.vlc\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"vlc\"\nLABEL oc.displayname=\"videolan\"\nLABEL oc.path=\"/usr/bin/vlc\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\"\nLABEL oc.fileextensions=\"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vlc\"\nENV APPBIN \"/usr/bin/vlc\"\nENV APP \"/usr/bin/vlc\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vlc/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vlc/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application vlc

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vlc.d\n
"},{"location":"applications/vlc/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f vlc.d -t vlc .\n
"},{"location":"applications/vlc/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect vlc > vlc.json\ndocker image save vlc -o vlc.tar\nctr -n k8s.io images import vlc.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vlc.json\n\n
"},{"location":"applications/vmmacos/","title":"vmmacos","text":""},{"location":"applications/vmmacos/#inherite-from","title":"inherite from","text":"

abcdesktop/docker-osx

"},{"location":"applications/vmmacos/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/vmmacos/#wm_class","title":"WM_CLASS","text":"
qemu.Qemu-system-x86_64\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/vmmacos/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN yes | sudo pacman -S xorg-xauth\n
"},{"location":"applications/vmmacos/#json-dump","title":"JSON dump","text":"

json source file vmmacos.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"RUN yes | sudo pacman -S xorg-xauth\"\n    ],\n    \"icon\": \"MacOS_logo.svg\",\n    \"keyword\": \"macos,apple\",\n    \"launch\": \"qemu.Qemu-system-x86_64\",\n    \"name\": \"vmmacos\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"devices\": [\n            \"/dev/kvm\"\n        ],\n        \"mem_limit\": \"16G\"\n    },\n    \"template\": \"abcdesktop/docker-osx\",\n    \"workdir\": \"/home/arch/OSX-KVM\",\n    \"user\": \"arch\",\n    \"home\": \"/home/arch\",\n    \"cmd\": [\n        \"/bin/bash\",\n        \"-c\",\n        \"sudo touch /dev/kvm /dev/snd \\\"${IMAGE_PATH}\\\" \\\"${BOOTDISK}\\\" \\\"${ENV}\\\" 2>/dev/null || true; sudo chown -R $(id -u):$(id -g) /dev/kvm /dev/snd \\\"${IMAGE_PATH}\\\" \\\"${BOOTDISK}\\\" \\\"${ENV}\\\" 2>/dev/null || true     ; [[ \\\"${NOPICKER}\\\" == true ]] && {         sed -i '/^.*InstallMedia.*/d' Launch.sh         && export BOOTDISK=\\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore-nopicker.qcow2}\\\"     ; }     || export BOOTDISK=\\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\"     ; [[ \\\"${GENERATE_UNIQUE}\\\" == true ]] && {         ./Docker-OSX/osx-serial-generator/generate-unique-machine-values.sh             --master-plist-url=\\\"${MASTER_PLIST_URL}\\\"             --count 1             --tsv ./serial.tsv             --bootdisks             --width \\\"${WIDTH:-1920}\\\" -height \\\"${HEIGHT:-1080}\\\"   --output-bootdisk \\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\"             --output-env \\\"${ENV:=/env}\\\" || exit 1 ; }     ; [[ \\\"${GENERATE_SPECIFIC}\\\" == true ]] && {             source \\\"${ENV:=/env}\\\" 2>/dev/null             ; ./Docker-OSX/osx-serial-generator/generate-specific-bootdisk.sh --master-plist-url=\\\"${MASTER_PLIST_URL}\\\" --model \\\"${DEVICE_MODEL}\\\"             --serial \\\"${SERIAL}\\\"             --board-serial \\\"${BOARD_SERIAL}\\\"             --uuid \\\"${UUID}\\\"             --mac-address \\\"${MAC_ADDRESS}\\\" --width \\\"${WIDTH:-1920}\\\"             --height \\\"${HEIGHT:-1080}\\\"             --output-bootdisk \\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\" || exit 1 ; } ; ./abcdesktop_config.sh ;  ./Launch.sh\"\n    ]\n}\n
"},{"location":"applications/vmmacos/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output vmmacos.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmmacos.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmmacos.d.3.0.json\n\n
"},{"location":"applications/vmmacos/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktop/docker-osx:$TAG\nUSER root\nRUN yes | sudo pacman -S xorg-xauth\nLABEL oc.icon=\"MacOS_logo.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQyIDQyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0yMy4wOTEgMTQuMDE4di0wLjM0MmwtMS4wNjMgMC4wNzNjLTAuMzAxIDAuMDE5LTAuNTI3IDAuMDgzLTAuNjc5IDAuMTkxLTAuMTUyIDAuMTA5LTAuMjI4IDAuMjYtMC4yMjggMC40NTMgMCAwLjE4OCAwLjA3NSAwLjMzOCAwLjIyNiAwLjQ0OSAwLjE1IDAuMTEyIDAuMzUyIDAuMTY3IDAuNjA0IDAuMTY3IDAuMTYxIDAgMC4zMTItMC4wMjUgMC40NTEtMC4wNzRzMC4yNjEtMC4xMTggMC4zNjMtMC4yMDZjMC4xMDItMC4wODcgMC4xODItMC4xOTEgMC4yMzktMC4zMTIgMC4wNTgtMC4xMjEgMC4wODctMC4yNTQgMC4wODctMC4zOTl6bS0yLjA5MS0xMy43NjhjLTExLjU3OSAwLTIwLjc1IDkuMTcxLTIwLjc1IDIwLjc1IDAgMTEuNTggOS4xNzEgMjAuNzUgMjAuNzUgMjAuNzVzMjAuNzUtOS4xNyAyMC43NS0yMC43NWMwLTExLjU3OS05LjE3LTIwLjc1LTIwLjc1LTIwLjc1em00LjAyOCAxMi4yOTljMC4wOTgtMC4yNzUgMC4yMzYtMC41MTEgMC40MTUtMC43MDdzMC4zOTQtMC4zNDcgMC42NDYtMC40NTMgMC41MzMtMC4xNTkgMC44NDItMC4xNTljMC4yNzkgMCAwLjUzMSAwLjA0MiAwLjc1NSAwLjEyNSAwLjIyNSAwLjA4MyAwLjQxNyAwLjE5NSAwLjU3OCAwLjMzNnMwLjI4OSAwLjMwNSAwLjM4MyAwLjQ5MyAwLjE1IDAuMzg3IDAuMTY5IDAuNTk2aC0wLjgzM2MtMC4wMjEtMC4xMTUtMC4wNTktMC4yMjMtMC4xMTMtMC4zMjJzLTAuMTI1LTAuMTg1LTAuMjEzLTAuMjU4Yy0wLjA4OS0wLjA3My0wLjE5My0wLjEzLTAuMzEyLTAuMTcxLTAuMTItMC4wNDItMC4yNTQtMC4wNjItMC40MDUtMC4wNjItMC4xNzcgMC0wLjMzOCAwLjAzNi0wLjQ4MSAwLjEwNy0wLjE0NCAwLjA3MS0wLjI2NyAwLjE3Mi0wLjM2OSAwLjMwMnMtMC4xODEgMC4yODktMC4yMzcgMC40NzVjLTAuMDU3IDAuMTg3LTAuMDg1IDAuMzk0LTAuMDg1IDAuNjIyIDAgMC4yMzYgMC4wMjggMC40NDggMC4wODUgMC42MzQgMC4wNTYgMC4xODcgMC4xMzYgMC4zNDQgMC4yNCAwLjQ3MyAwLjEwMyAwLjEyOSAwLjIyOCAwLjIyOCAwLjM3MyAwLjI5NnMwLjMwNSAwLjEwMyAwLjQ3OSAwLjEwM2MwLjI4NSAwIDAuNTE3LTAuMDY3IDAuNjk3LTAuMjAxczAuMjk2LTAuMzMgMC4zNS0wLjU4OGgwLjgzNGMtMC4wMjQgMC4yMjgtMC4wODcgMC40MzYtMC4xODkgMC42MjRzLTAuMjM0IDAuMzQ4LTAuMzk2IDAuNDgxYy0wLjE2MyAwLjEzMy0wLjM1NCAwLjIzNi0wLjU3NCAwLjMwOHMtMC40NjIgMC4xMDktMC43MjUgMC4xMDljLTAuMzEyIDAtMC41OTMtMC4wNTItMC44NDYtMC4xNTUtMC4yNTItMC4xMDMtMC40NjktMC4yNTItMC42NDktMC40NDVzLTAuMzE5LTAuNDI4LTAuNDE3LTAuNzA1LTAuMTQ3LTAuNTg4LTAuMTQ3LTAuOTM1Yy0yZS0zIC0wLjMzOSAwLjA0Ny0wLjY0NyAwLjE0NS0wLjkyM3ptLTExLjg1My0xLjI2MmgwLjgzNHYwLjc0MWgwLjAxNmMwLjA1MS0wLjEyMyAwLjExOC0wLjIzNCAwLjItMC4zMyAwLjA4Mi0wLjA5NyAwLjE3Ni0wLjE3OSAwLjI4NC0wLjI0OCAwLjEwNy0wLjA2OSAwLjIyNi0wLjEyMSAwLjM1NC0wLjE1NyAwLjEyOS0wLjAzNiAwLjI2NS0wLjA1NCAwLjQwNy0wLjA1NCAwLjMwNiAwIDAuNTY1IDAuMDczIDAuNzc1IDAuMjE5IDAuMjExIDAuMTQ2IDAuMzYxIDAuMzU2IDAuNDQ5IDAuNjNoMC4wMjFjMC4wNTYtMC4xMzIgMC4xMy0wLjI1IDAuMjIxLTAuMzU0czAuMTk2LTAuMTk0IDAuMzE0LTAuMjY4IDAuMjQ4LTAuMTMgMC4zODktMC4xNjkgMC4yODktMC4wNTggMC40NDUtMC4wNThjMC4yMTUgMCAwLjQxIDAuMDM0IDAuNTg2IDAuMTAzczAuMzI2IDAuMTY1IDAuNDUxIDAuMjkgMC4yMjEgMC4yNzcgMC4yODggMC40NTUgMC4xMDEgMC4zNzYgMC4xMDEgMC41OTR2Mi45ODFoLTAuODd2LTIuNzcyYzAtMC4yODctMC4wNzQtMC41MS0wLjIyMi0wLjY2Ny0wLjE0Ny0wLjE1Ny0wLjM1OC0wLjIzNi0wLjYzMi0wLjIzNi0wLjEzNCAwLTAuMjU3IDAuMDI0LTAuMzY5IDAuMDcxLTAuMTExIDAuMDQ3LTAuMjA4IDAuMTEzLTAuMjg4IDAuMTk4LTAuMDgxIDAuMDg0LTAuMTQ0IDAuMTg2LTAuMTg5IDAuMzA0LTAuMDQ2IDAuMTE4LTAuMDY5IDAuMjQ3LTAuMDY5IDAuMzg3djIuNzE1aC0wLjg1OHYtMi44NDRjMC0wLjEyNi0wLjAyLTAuMjQtMC4wNTktMC4zNDJzLTAuMDk0LTAuMTg5LTAuMTY3LTAuMjYyYy0wLjA3Mi0wLjA3My0wLjE2MS0wLjEyOC0wLjI2NC0wLjE2Ny0wLjEwNC0wLjAzOS0wLjIyLTAuMDU5LTAuMzQ5LTAuMDU5LTAuMTM0IDAtMC4yNTggMC4wMjUtMC4zNzMgMC4wNzUtMC4xMTQgMC4wNS0wLjIxMiAwLjExOS0wLjI5NCAwLjIwNy0wLjA4MiAwLjA4OS0wLjE0NiAwLjE5My0wLjE5MSAwLjMxNC0wLjA0NCAwLjEyLTAuMTE2IDAuMjUyLTAuMTE2IDAuMzk0djIuNjgzaC0wLjgyNXYtNC4zNzR6bTEuODkzIDIwLjkzOWMtMy44MjUgMC02LjIyNC0yLjY1OC02LjIyNC02LjlzMi4zOTktNi45MDkgNi4yMjQtNi45MDkgNi4yMTUgMi42NjcgNi4yMTUgNi45MDljMCA0LjI0MS0yLjM5IDYuOS02LjIxNSA2Ljl6bTcuMDgyLTE2LjU3NWMtMC4xNDEgMC4wMzYtMC4yODUgMC4wNTQtMC40MzMgMC4wNTQtMC4yMTggMC0wLjQxNy0wLjAzMS0wLjU5OC0wLjA5My0wLjE4Mi0wLjA2Mi0wLjMzNy0wLjE0OS0wLjQ2Ny0wLjI2MnMtMC4yMzItMC4yNDktMC4zMDQtMC40MDljLTAuMDczLTAuMTYtMC4xMDktMC4zMzgtMC4xMDktMC41MzQgMC0wLjM4NCAwLjE0My0wLjY4NCAwLjQyOS0wLjlzMC43LTAuMzQyIDEuMjQzLTAuMzc3bDEuMTgtMC4wNjh2LTAuMzM4YzAtMC4yNTItMC4wOC0wLjQ0NS0wLjI0LTAuNTc2cy0wLjM4Ni0wLjE5Ny0wLjY3OS0wLjE5N2MtMC4xMTggMC0wLjIyOSAwLjAxNS0wLjMzMSAwLjA0NC0wLjEwMiAwLjAzLTAuMTkyIDAuMDcyLTAuMjcgMC4xMjdzLTAuMTQzIDAuMTIxLTAuMTkzIDAuMTk4Yy0wLjA1MSAwLjA3Ni0wLjA4NiAwLjE2Mi0wLjEwNSAwLjI1NmgtMC44MThjNWUtMyAtMC4xOTMgMC4wNTMtMC4zNzIgMC4xNDMtMC41MzZzMC4yMTItMC4zMDYgMC4zNjctMC40MjcgMC4zMzYtMC4yMTUgMC41NDYtMC4yODIgMC40MzgtMC4xMDEgMC42ODUtMC4xMDFjMC4yNjYgMCAwLjUwNyAwLjAzMyAwLjcyMyAwLjEwMXMwLjQwMSAwLjE2MyAwLjU1NCAwLjI4OCAwLjI3MSAwLjI3NSAwLjM1NCAwLjQ1MSAwLjEyNSAwLjM3MyAwLjEyNSAwLjU5djMuMDAxaC0wLjgzM3YtMC43MjloLTAuMDIxYy0wLjA2MiAwLjExOC0wLjE0IDAuMjI1LTAuMjM1IDAuMzItMC4wOTYgMC4wOTUtMC4yMDMgMC4xNzctMC4zMjIgMC4yNDQtMC4xMiAwLjA2Ny0wLjI1IDAuMTE5LTAuMzkxIDAuMTU1em01LjUwMyAxNi41NzVjLTIuOTE3IDAtNC45LTEuNTI4LTUuMDM4LTMuOTI3aDEuODk5YzAuMTQ4IDEuMzcxIDEuNDczIDIuMjc5IDMuMjg4IDIuMjc5IDEuNzQxIDAgMi45OTItMC45MDggMi45OTItMi4xNDkgMC0xLjA3NC0wLjc2LTEuNzIzLTIuNTE5LTIuMTY3bC0xLjcxNC0wLjQyNmMtMi40NjQtMC42MTEtMy41ODQtMS43MzItMy41ODQtMy41NzUgMC0yLjI2OSAxLjk4Mi0zLjg0NCA0LjgwNy0zLjg0NCAyLjc2IDAgNC42ODYgMS41ODQgNC43NiAzLjg2MmgtMS44OGMtMC4xMy0xLjM3MS0xLjI1LTIuMjE0LTIuOTE4LTIuMjE0LTEuNjU4IDAtMi44MDYgMC44NTItMi44MDYgMi4wODQgMCAwLjk3MiAwLjcyMiAxLjU0NyAyLjQ4MiAxLjk5MWwxLjQ0NSAwLjM2MWMyLjc1MSAwLjY2NyAzLjg4MSAxLjc1MSAzLjg4MSAzLjY5Ni0xZS0zIDIuNDgyLTEuOTY0IDQuMDI5LTUuMDk1IDQuMDI5em0tMTIuNTg1LTEyLjEwNmMtMi42MjEgMC00LjI2IDIuMDEtNC4yNiA1LjIwNSAwIDMuMTg2IDEuNjM5IDUuMTk2IDQuMjYgNS4xOTYgMi42MTIgMCA0LjI2LTIuMDEgNC4yNi01LjE5NiAxZS0zIC0zLjE5NS0xLjY0OC01LjIwNS00LjI2LTUuMjA1eiIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"vmmacos,macos,apple\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"qemu.Qemu-system-x86_64\"\nLABEL oc.template=\"abcdesktop/docker-osx\"\nLABEL oc.name=\"vmmacos\"\nLABEL oc.displayname=\"vmmacos\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"devices\\\":[\\\"/dev/kvm\\\"],\\\"mem_limit\\\":\\\"16G\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmmacos\"\nLABEL oc.home=\"/home/arch\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER arch\nCMD [ \"/bin/bash,-c,sudo touch /dev/kvm /dev/snd \"${IMAGE_PATH}\" \"${BOOTDISK}\" \"${ENV}\" 2>/dev/null || true; sudo chown -R $(id -u):$(id -g) /dev/kvm /dev/snd \"${IMAGE_PATH}\" \"${BOOTDISK}\" \"${ENV}\" 2>/dev/null || true     ; [[ \"${NOPICKER}\" == true ]] && {         sed -i '/^.*InstallMedia.*/d' Launch.sh         && export BOOTDISK=\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore-nopicker.qcow2}\"     ; }     || export BOOTDISK=\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\"     ; [[ \"${GENERATE_UNIQUE}\" == true ]] && {         ./Docker-OSX/osx-serial-generator/generate-unique-machine-values.sh             --master-plist-url=\"${MASTER_PLIST_URL}\"             --count 1             --tsv ./serial.tsv             --bootdisks             --width \"${WIDTH:-1920}\" -height \"${HEIGHT:-1080}\"   --output-bootdisk \"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\"             --output-env \"${ENV:=/env}\" || exit 1 ; }     ; [[ \"${GENERATE_SPECIFIC}\" == true ]] && {             source \"${ENV:=/env}\" 2>/dev/null             ; ./Docker-OSX/osx-serial-generator/generate-specific-bootdisk.sh --master-plist-url=\"${MASTER_PLIST_URL}\" --model \"${DEVICE_MODEL}\"             --serial \"${SERIAL}\"             --board-serial \"${BOARD_SERIAL}\"             --uuid \"${UUID}\"             --mac-address \"${MAC_ADDRESS}\" --width \"${WIDTH:-1920}\"             --height \"${HEIGHT:-1080}\"             --output-bootdisk \"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\" || exit 1 ; } ; ./abcdesktop_config.sh ;  ./Launch.sh\" ]\n\n
"},{"location":"applications/vmmacos/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmmacos/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application vmmacos

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmmacos.d\n
"},{"location":"applications/vmmacos/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f vmmacos.d -t vmmacos .\n
"},{"location":"applications/vmmacos/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect vmmacos > vmmacos.json\ndocker image save vmmacos -o vmmacos.tar\nctr -n k8s.io images import vmmacos.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmmacos.json\n\n
"},{"location":"applications/vmrc/","title":"vmrc","text":""},{"location":"applications/vmrc/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/vmrc/#licence","title":"Licence","text":"

** This application is NO FREE. ** You need to build it manually.

"},{"location":"applications/vmrc/#displayname","title":"Displayname","text":"
VMRC\n
"},{"location":"applications/vmrc/#path","title":"Path","text":"
/usr/bin/vmrc\n
"},{"location":"applications/vmrc/#mimetype","title":"Mimetype","text":"
x-scheme-handler/vmrc;\n
"},{"location":"applications/vmrc/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/vmrc/#wm_class","title":"WM_CLASS","text":"
vmrc.Vmrc\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/vmrc/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/vmware-vmrc.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/vmrc/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install  --no-install-recommends --yes libaio1 && apt-get clean\nCOPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\nRUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\nRUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\n
"},{"location":"applications/vmrc/#json-dump","title":"JSON dump","text":"

json source file vmrc.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"licence\": \"non-free\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_vmware.svg\",\n    \"keyword\": \"vmrc,vmware,remote,console\",\n    \"launch\": \"vmrc.Vmrc\",\n    \"name\": \"vmrc\",\n    \"displayname\": \"VMRC\",\n    \"path\": \"/usr/bin/vmrc\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"x-scheme-handler/vmrc;\",\n    \"desktopfile\": \"/usr/share/applications/vmware-vmrc.desktop\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libaio1 && apt-get clean\",\n        \"COPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\",\n        \"RUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\",\n        \"RUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\"\n    ]\n}\n
"},{"location":"applications/vmrc/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output vmrc.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmrc.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmrc.d.3.0.json\n\n
"},{"location":"applications/vmrc/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes libaio1 && apt-get clean\nCOPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\nRUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\nRUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\nLABEL oc.icon=\"circle_vmware.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQXBwLVN0b3JlIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI1MjAiIHgyPSI1MjAuMDMiIHkxPSI0NCIgeTI9Ijk4NS44NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0MjM3IC0uNTQyMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxNWUxZmMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTg2M2VlIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ii0xLjM1NTkiIHgyPSItMS4zNTU5IiB5MT0iLTU5LjExOSIgeTI9IjE5Ni44OCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZlYjQyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTMxMSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI2Mi42NDQiIHgyPSI2Mi42NDQiIHkxPSItMTIzLjEyIiB5Mj0iMTMyLjg4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZThlOGU4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDc1IiB5PSItLjA3NSIgd2lkdGg9IjEuMTUiIGhlaWdodD0iMS4xNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNy45OTk5OTk4Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wNzUiIHk9Ii0uMDc1IiB3aWR0aD0iMS4xNSIgaGVpZ2h0PSIxLjE1IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI3Ljk5OTk5OTgiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM1NiAwIDAgLjA2MzU2IC0uNTQyMzcgLS41NDIzNykiIGQ9Im05NjkuNyAzOTJjLTEuMS00LjM1LTIuMzUtOS0zLjY1LTEzLjYtMi41LTguNzUtNS4zNS0xNy42LTguNDUtMjYuMzUtNi40NS0xOC4yNS0xNC4xNS0zNi4wNS0yMy4xNS01My42NS0zLjgtNy40LTcuOTUtMTQuOTUtMTIuMy0yMi40aC0wLjAyNXEtMzAuNjAxLTUyLjAxLTc2LjMyNS05Ny43NWMtOTIuMTUtOTIuMTUtMjAzLjQ1LTEzOC4yNS0zMzMuOC0xMzguMjVzLTI0MS42IDQ2LjEtMzMzLjc1IDEzOC4yNS0xMzguMjUgMjAzLjQtMTM4LjI1IDMzMy43NSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjhjNjguMDUgNjguMDUgMTQ2LjUgMTEwLjk1IDIzNC45IDEyOC42NSAzMS45NSA2LjQgNjQuNzUgOS41NSA5OC44NSA5LjU1IDEzMC4zNSAwIDI0MS42NS00Ni4wNSAzMzMuOC0xMzguMiA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTctNDMuOTUgMjctOTAuOCAyOS45NS0xNDAuNzUgMC42LTEwLjIgMC45LTIwLjY1IDAuOS0zMS4yNSAwLTQxLjc1LTQuNy04MS42LTE0LjMtMTIweiIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMTUuNjcyIi8+CiA8cGF0aCBkPSJtNjEuMDkxIDI0LjM3M2MtMC4wNjk5MTYtMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDQtMC4yMzE5OS0wLjg2NDQxLTAuMTU4OS0wLjU1NjE1LTAuMzQwMDQtMS4xMTg2LTAuNTM3MDgtMS42NzQ4LTAuNDA5OTYtMS4xNi0wLjg5OTM3LTIuMjkxMy0xLjQ3MTQtMy40MS0wLjI0MTUzLTAuNDcwMzQtMC41MDUzLTAuOTUwMjItMC43ODE3OC0xLjQyMzdoLTAuMDAxNnEtMS45NDUtMy4zMDU3LTQuODUxMi02LjIxMjljLTUuODU3LTUuODU3LTEyLjkzMS04Ljc4NzEtMjEuMjE2LTguNzg3MXMtMTUuMzU2IDIuOTMwMS0yMS4yMTMgOC43ODcxLTguNzg3MSAxMi45MjgtOC43ODcxIDIxLjIxMyAyLjkzMDEgMTUuMzU5IDguNzg3MSAyMS4yMTZjNC4zMjUyIDQuMzI1MiA5LjMxMTUgNy4wNTE5IDE0LjkzIDguMTc2OSAyLjAzMDcgMC40MDY3OCA0LjExNTUgMC42MDY5OSA2LjI4MjkgMC42MDY5OSA4LjI4NSAwIDE1LjM1OS0yLjkyNjkgMjEuMjE2LTguNzgzOSAzLjA4OS0zLjA4OSA1LjM2NDQtNi41MTQ4IDYuODIzMS0xMC4yODQgMS4wODA1LTIuNzkzNCAxLjcxNjEtNS43NzEyIDEuOTAzNi04Ljk0NiAwLjAzODE0LTAuNjQ4MzEgMC4wNTcyLTEuMzEyNSAwLjA1NzItMS45ODYyIDAtMi42NTM2LTAuMjk4NzMtNS4xODY1LTAuOTA4OS03LjYyNzF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTYxIi8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMSAwIDAgLjEgMjguOTM2IDI4LjMxMikiIHN0cm9rZS13aWR0aD0iMTMuMzMzIj4KICA8cGF0aCBkPSJtMTAyLjY0IDE5Ni44OGMxMy4yOTcgMCAyNC0xMC43MDMgMjQtMjR2LTIwOGMwLTEzLjI5Ny0xMC43MDMtMjQtMjQtMjRoLTIwOGMtMTMuMjk3IDAtMjQgMTAuNzAzLTI0IDI0djIwOGMwIDEzLjI5NyAxMC43MDMgMjQgMjQgMjR6bS00MC02NGgtMTI4di0xMjhoMTI4eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBkPSJtMTY2LjY0IDEzMi44OGMxMy4yOTcgMCAyNC0xMC43MDMgMjQtMjR2LTIwOGMwLTEzLjI5Ny0xMC43MDMtMjQtMjQtMjRoLTIwOGMtMTMuMjk3IDAtMjQgMTAuNzAzLTI0IDI0djQwaDE5MnYxMjhoLTEyOHYtNjRoLTY0djEwNGMwIDEzLjI5NyAxMC43MDMgMjQgMjQgMjR6IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGQ9Im0xMDIuNjQgMTk2Ljg4YzEzLjI5NyAwIDI0LTEwLjcwMyAyNC0yNHYtMjA4YzAtMTMuMjk3LTEwLjcwMy0yNC0yNC0yNGgtMjA4Yy0xMy4yOTcgMC0yNCAxMC43MDMtMjQgMjR2MjA4YzAgMTMuMjk3IDEwLjcwMyAyNCAyNCAyNHptLTQwLTY0aC0xMjh2LTEyOGgxMjh6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgPHBhdGggZD0ibTE2Ni42NCAxMzIuODhjMTMuMjk3IDAgMjQtMTAuNzAzIDI0LTI0di0yMDhjMC0xMy4yOTctMTAuNzAzLTI0LTI0LTI0aC0yMDhjLTEzLjI5NyAwLTI0IDEwLjcwMy0yNCAyNHY0MGgxOTJ2MTI4aC0xMjh2LTY0aC02NHYxMDRjMCAxMy4yOTcgMTAuNzAzIDI0IDI0IDI0eiIgZmlsbD0idXJsKCNhKSIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"vmrc,vmrc,vmware,remote,console\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"vmware-vmrc.desktop\"\nLABEL oc.launch=\"vmrc.Vmrc\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"vmrc\"\nLABEL oc.displayname=\"VMRC\"\nLABEL oc.path=\"/usr/bin/vmrc\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"x-scheme-handler/vmrc;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmrc\"\nENV APPBIN \"/usr/bin/vmrc\"\nENV APP \"/usr/bin/vmrc\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vmrc/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmrc/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application vmrc

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmrc.d\n
"},{"location":"applications/vmrc/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f vmrc.d -t vmrc .\n
"},{"location":"applications/vmrc/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect vmrc > vmrc.json\ndocker image save vmrc -o vmrc.tar\nctr -n k8s.io images import vmrc.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmrc.json\n\n
"},{"location":"applications/vmubuntu/","title":"vmubuntu","text":""},{"location":"applications/vmubuntu/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.vm.ubuntu:22.04

"},{"location":"applications/vmubuntu/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/vmubuntu/#wm_class","title":"WM_CLASS","text":"
qemu.Qemu-system-x86_64\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/vmubuntu/#json-dump","title":"JSON dump","text":"

json source file vmubuntu.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"icon\": \"vm-linux-ubuntu.svg\",\n    \"keyword\": \"vm,ubuntu,jammy\",\n    \"launch\": \"qemu.Qemu-system-x86_64\",\n    \"name\": \"vmubuntu\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"devices\": [\n            \"/dev/kvm\"\n        ],\n        \"mem_limit\": \"16G\"\n    },\n    \"template\": \"abcdesktopio/oc.vm.ubuntu:22.04\",\n    \"home\": \"/home/balloon\",\n    \"cmd\": \"/docker-entrypoint.sh\"\n}\n
"},{"location":"applications/vmubuntu/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output vmubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmubuntu.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmubuntu.d.3.0.json\n\n
"},{"location":"applications/vmubuntu/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.vm.ubuntu:22.04\nUSER root\nLABEL oc.icon=\"vm-linux-ubuntu.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+CjxjaXJjbGUgZmlsbD0iI2Y0NzQyMSIgY3k9IjUwIiBjeD0iNTAiIHI9IjQ1Ii8+CjxjaXJjbGUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjguNTUiIGN4PSI1MCIgY3k9IjUwIiByPSIyMS44MjUiLz4KPGcgaWQ9ImZyaWVuZCI+PGNpcmNsZSBmaWxsPSIjZjQ3NDIxIiBjeD0iMTkuNCIgY3k9IjUwIiByPSI4LjQzNzYiLz4KPHBhdGggc3Ryb2tlPSIjZjQ3NDIxIiBzdHJva2Utd2lkdGg9IjMuMjM3OCIgZD0iTTY3LDUwSDc3Ii8+CjxjaXJjbGUgZmlsbD0iI2ZmZmZmZiIgY3g9IjE5LjQiIGN5PSI1MCIgcj0iNi4wMDc0NSIvPjwvZz4KPHVzZSB4bGluazpocmVmPSIjZnJpZW5kIiB0cmFuc2Zvcm09InJvdGF0ZSgxMjAsNTAsNTApIi8+Cjx1c2UgeGxpbms6aHJlZj0iI2ZyaWVuZCIgdHJhbnNmb3JtPSJyb3RhdGUoMjQwLDUwLDUwKSIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"vmubuntu,vm,ubuntu,jammy\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"qemu.Qemu-system-x86_64\"\nLABEL oc.template=\"abcdesktopio/oc.vm.ubuntu:22.04\"\nLABEL oc.name=\"vmubuntu\"\nLABEL oc.displayname=\"vmubuntu\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"devices\\\":[\\\"/dev/kvm\\\"],\\\"mem_limit\\\":\\\"16G\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmubuntu\"\nLABEL oc.home=\"/home/balloon\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vmubuntu/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmubuntu/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application vmubuntu

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmubuntu.d\n
"},{"location":"applications/vmubuntu/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f vmubuntu.d -t vmubuntu .\n
"},{"location":"applications/vmubuntu/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect vmubuntu > vmubuntu.json\ndocker image save vmubuntu -o vmubuntu.tar\nctr -n k8s.io images import vmubuntu.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmubuntu.json\n\n
"},{"location":"applications/vscode/","title":"VSCode","text":""},{"location":"applications/vscode/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/vscode/#arguments","title":"Arguments","text":"

\"--extensions-dir /usr/share/code/extensions --verbose\"

"},{"location":"applications/vscode/#path","title":"Path","text":"
/usr/bin/code\n
"},{"location":"applications/vscode/#mimetype","title":"Mimetype","text":"
text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\n
"},{"location":"applications/vscode/#file-extensions","title":"File extensions","text":"

\"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\"

"},{"location":"applications/vscode/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"c;cpp;py;json;java;md;yml;yaml;\"

"},{"location":"applications/vscode/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/vscode/#wm_class","title":"WM_CLASS","text":"
code.Code\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/vscode/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/code.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/vscode/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\n
"},{"location":"applications/vscode/#json-dump","title":"JSON dump","text":"

json source file vscode.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_visual-studio-code.svg\",\n    \"keyword\": \"ide,vscode,visual studio code,code\",\n    \"launch\": \"code.Code\",\n    \"name\": \"VSCode\",\n    \"path\": \"/usr/bin/code\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktop\": \"code.desktop\",\n    \"host_config\": {\n        \"mem_limit\": \"2G\",\n        \"shm_size\": \"2G\",\n        \"cpu_period\": 200000,\n        \"cpu_quota\": 200000,\n        \"cap_add\": [\n            \"SYS_ADMIN\"\n        ]\n    },\n    \"args\": \"--extensions-dir /usr/share/code/extensions --verbose\",\n    \"mimetype\": \"text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\",\n    \"legacyfileextensions\": \"c;cpp;py;json;java;md;yml;yaml;\",\n    \"fileextensions\": \"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\",\n    \"desktopfile\": \"/usr/share/applications/code.desktop\",\n    \"preruncommands\": [\n        \"RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\\\" > /etc/apt/sources.list.d/teams.list\",\n        \"RUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\",\n        \"RUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\"\n    ],\n    \"quick\": true\n}\n
"},{"location":"applications/vscode/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output vscode.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vscode.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vscode.d.3.0.json\n\n
"},{"location":"applications/vscode/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\nLABEL oc.icon=\"circle_visual-studio-code.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjQwMi43MSIgeDI9IjQwMi43MSIgeTE9IjEzNy44OSIgeTI9IjQ2My4wNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTkxODkgMCAwIC4xOTE4OSAtNDQuNjY0IC0yNS41OTgpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMzIzMjMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNWM1YzVjIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM4My41OCIgeDI9IjM4My41OCIgeTE9IjEzNy44OSIgeTI9IjQ2My4wNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMiAwIDAgLjIgLTQ4IC0yNy45OTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDg5ZDIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMjZiMWYzIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImkiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0LjUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSI4NiIgeDI9IjYzIiB5MT0iMTkuNDU4IiB5Mj0iMzkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwN2FiYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDZjYWYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iODYiIHgyPSI4MyIgeTE9IjIwIiB5Mj0iMjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9Ijg3IiB4Mj0iNjMiIHkxPSI0NiIgeTI9IjI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDgwY2UiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMDA4ZmQ1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ijg2IiB4Mj0iODMiIHkxPSI0NCIgeTI9IjQ0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA5NTkzNyIgeT0iLS4wOTYwNjMiIHdpZHRoPSIxLjE5MTkiIGhlaWdodD0iMS4xOTIxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjk2MTUxODg1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaiIgeD0iLS4wOTU3OTYiIHk9Ii0uMDk2MjA1IiB3aWR0aD0iMS4xOTE2IiBoZWlnaHQ9IjEuMTkyNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS4yNzk0MTc3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4wNiIgeT0iLS4wNiIgd2lkdGg9IjEuMTIiIGhlaWdodD0iMS4xMiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS4zNSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHBhdGggY2xhc3M9InNocDEiIHRyYW5zZm9ybT0ibWF0cml4KC4yIDAgMCAuMiAtNDggLTI3Ljk5NCkiIGQ9Im00MDAgNDUwYzgyLjg0IDAgMTUwLTY3LjE2IDE1MC0xNTBzLTY3LjE2LTE1MC0xNTAtMTUwLTE1MCA2Ny4xNi0xNTAgMTUwIDY3LjE2IDE1MCAxNTAgMTUweiIgZmlsdGVyPSJ1cmwoI2kpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiA8cGF0aCBjbGFzcz0ic2hwMSIgZD0ibTMyIDU4YzE0LjM1OSAwIDI2LTExLjY0MSAyNi0yNnMtMTEuNjQxLTI2LTI2LTI2Yy0xNC4zNTkgMC0yNiAxMS42NDEtMjYgMjZzMTEuNjQxIDI2IDI2IDI2eiIgZmlsbD0idXJsKCNnKSIvPgogPHBhdGggZD0ibTMyIDVjLTE0LjkxMSAwLTI3IDEyLjA4OS0yNyAyN3MxMi4wODkgMjcgMjcgMjdjMTQuOTExIDAgMjctMTIuMDg5IDI3LTI3cy0xMi4wODktMjctMjctMjd6bTAgMmMxMy44MDcgMCAyNSAxMS4xOTMgMjUgMjVzLTExLjE5MyAyNS0yNSAyNWMtMTMuODA3IDAtMjUtMTEuMTkzLTI1LTI1czExLjE5My0yNSAyNS0yNXoiIGZpbHRlcj0idXJsKCNoKSIgb3BhY2l0eT0iLjE1Ii8+CiA8cGF0aCBkPSJtMzIgMi4wMDU5Yy0xNi41NjggMC0zMCAxMy40MzQtMzAgMzAuMDAyIDAgMTYuNTY4IDEzLjQzMiAzMCAzMCAzMHMzMC4wMDItMTMuNDMyIDMwLjAwMi0zMGMwLTE2LjU2OC0xMy40MzQtMzAuMDAyLTMwLjAwMi0zMC4wMDJ6bTAgMy45OTQxYzE0LjM1OSAwIDI2IDExLjY0MSAyNiAyNnMtMTEuNjQxIDI2LTI2IDI2Yy0xNC4zNTkgMC0yNi0xMS42NDEtMjYtMjZzMTEuNjQxLTI2IDI2LTI2eiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIzLjEzNjYiLz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00Ni4wMDEgLjAwMDY4OTcpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogIDxwYXRoIGQ9Im04NS4yMjMgMTYuMDUxYy0wLjM0MjE0IDAuMDM4MTgtMC42NzUwNyAwLjE1NTM4LTEuMDA3OCAwLjM3NSA0LjE3ZS00IDUuMmUtNCAwLjAwMTUgMC4wMDE0IDJlLTMgMmUtMyAtMC4xNDExMyAwLjA3NjY4LTAuMjgxNzcgMC4xNzI4LTAuNDE2MDIgMC4yOTY4OGwtMjEuMzU3IDE5Ljc0Yy0wLjQxNTY4IDAuMzg0MTctMC43MTM2NyAxLjA1NjMtMC4xODk0NSAxLjU1NDdsMS45OTYxIDEuODk4NGMwLjc4NTE1IDAuNzQ2NDcgMS42ODYgMC4wOTkzMSAyLjAzMTItMC4xNzE4OGwxOS43NDYtMTUuMTAydjE0LjcxMWwtMS42MTMzIDEuMjA5Yy0xLjI0MzMgMC45MzE1NyAwLjExMzI2IDYuMjk3OS0wLjIxMjg5IDYuOTg4MyAwLjM2MDMyIDAuMjE5OTEgMC44OTgxIDAuNDUzNzggMS4zNjkxIDAuMzk2NDggMC4xNTA4OS0wLjAxODM1IDAuMzAzNjItMC4wNjA1NCAwLjQ1NTA4LTAuMTM0NzdsNi41NjQ1LTMuMjE4OGMwLjcxNTQ0LTAuMzUwNjUgMS40Mzc1LTAuNjQwNzUgMS40Mzc1LTEuNDM3NXYtMjIuMzE2YzAtMC43OTY3NS0wLjcyMjA2LTEuMDg2OS0xLjQzNzUtMS40Mzc1bC02LjU2NDUtMy4yMTg4Yy0wLjE1MTQ2LTAuMDc0MjMtMC4zMDQxOS0wLjExNjQyLTAuNDU1MDgtMC4xMzQ3Ny0wLjExNzc2LTAuMDE0MzItMC4yMzM2MS0wLjAxMjczLTAuMzQ3NjYgMHoiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjE1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogIDxwYXRoIGQ9Im04NS4yMjIgMTYuMDUxYy0wLjM0MjE0IDAuMDM4MTgtMC42NzUwNyAwLjE1NTM4LTEuMDA3OCAwLjM3NSAwLjUyMDU0IDAuNjQ3OTktMC41MzAyNiA2Ljc0ODMgMC43ODU2IDcuNTc0MmwxLjAyNjkgMC42NDQ1M3YxNC43MTFsLTEuNjEzMSAxLjIwODZjLTEuMjQzMyAwLjkzMTU3IDAuMTEyNTcgNi4yOTc0LTAuMjEzNTggNi45ODc3IDAuMzYwMzIgMC4yMTk5MSAwLjg5ODYgMC40NTQ2NiAxLjM2OTYgMC4zOTczOCAwLjE1MDg5LTAuMDE4MzUgMC4zMDM2Mi0wLjA2MDU0IDAuNDU1MDgtMC4xMzQ3N2w2LjU2NDUtMy4yMTg4YzAuNzE1NDQtMC4zNTA2NSAxLjQzNzUtMC42NDA3NSAxLjQzNzUtMS40Mzc1di0yMi4zMTZjMC0wLjc5Njc1LTAuNzIyMDYtMS4wODY5LTEuNDM3NS0xLjQzNzVsLTYuNTY0NS0zLjIxODhjLTAuMTUxNDYtMC4wNzQyMy0wLjMwNDE5LTAuMTE2NDItMC40NTUwOC0wLjEzNDc3LTAuMTE3NzYtMC4wMTQzMi0wLjIzMzYxLTAuMDEyNzMtMC4zNDc2NiAweiIgZmlsbD0iIzBkOTZkZCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDM2LjQ2NSAyMS4zNTktMTkuNzRjMC45Njk3LTAuODk2MjEgMi4yMjU3LTAuNTc4NDIgMi4yMjU3IDEuMjc1M3Y2LjY0NDFsLTE5Ljc0NiAxNS4xMDJjLTAuMzQ1MjkgMC4yNzExOS0xLjI0NTEgMC45MTg5Mi0yLjAzMDIgMC4xNzI0NWwtMS45OTc3LTEuODk5M2MtMC41MjQyMi0wLjQ5ODQtMC4yMjYzMy0xLjE3MDIgMC4xODkzNS0xLjU1NDR6IiBmaWxsPSJ1cmwoI2YpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogIDxwYXRoIGQ9Im02Mi40NDMgMjcuNTI1IDIxLjM1OSAxOS43NGMwLjk2OTcgMC44OTYyMSAyLjIyNTcgMC41Nzg0MiAyLjIyNTctMS4yNzUzdi02LjY0NDFsLTE5Ljc0Ni0xNS4xMDJjLTAuMzQ1MjktMC4yNzExOS0xLjI0NTEtMC45MTg5Mi0yLjAzMDItMC4xNzI0NWwtMS45OTc3IDEuODk5M2MtMC41MjQyMiAwLjQ5ODQtMC4yMjYzMyAxLjE3MDIgMC4xODkzNSAxLjU1NDR6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDI3LjUyNSAyMS4zNTkgMTkuNzRjMC45Njk3IDAuODk2MjEgMi4yMjU3IDAuNTc4NDIgMi4yMjU3LTEuMjc1M3YtNi42NDQxbC0xOS43NDYtMTUuMTAyYy0wLjM0NTI5LTAuMjcxMTktMS4yNDUxLTAuOTE4OTItMi4wMzAyLTAuMTcyNDVsLTEuOTk3NyAxLjg5OTNjLTAuNTI0MjIgMC40OTg0LTAuMjI2MzMgMS4xNzAyIDAuMTg5MzUgMS41NTQ0eiIgZmlsbD0idXJsKCNkKSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDM2LjQ2NSAyMS4zNTktMTkuNzRjMC45Njk3LTAuODk2MjEgMi4yMjU3LTAuNTc4NDIgMi4yMjU3IDEuMjc1M3Y2LjY0NDFsLTE5Ljc0NiAxNS4xMDJjLTAuMzQ1MjkgMC4yNzExOS0xLjI0NTEgMC45MTg5Mi0yLjAzMDIgMC4xNzI0NWwtMS45OTc3LTEuODk5M2MtMC41MjQyMi0wLjQ5ODQtMC4yMjYzMy0xLjE3MDIgMC4xODkzNS0xLjU1NDR6IiBmaWxsPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgZmlsbCBtYXJrZXJzIi8+CiAgPHBhdGggZD0ibTYyLjQ0MyAyNy41MjUgMjEuMzU5IDE5Ljc0YzAuOTY5NyAwLjg5NjIxIDIuMjI1NyAwLjU3ODQyIDIuMjI1Ny0xLjI3NTN2LTYuNjQ0MWwtMTkuNzQ2LTE1LjEwMmMtMC4zNDUyOS0wLjI3MTE5LTEuMjQ1MS0wLjkxODkyLTIuMDMwMi0wLjE3MjQ1bC0xLjk5NzcgMS44OTkzYy0wLjUyNDIyIDAuNDk4NC0wLjIyNjMzIDEuMTcwMiAwLjE4OTM1IDEuNTU0NHoiIGZpbGw9InVybCgjYykiIG9wYWNpdHk9Ii4xNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"vscode,ide,vscode,visual studio code,code\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"code.desktop\"\nLABEL oc.launch=\"code.Code\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--extensions-dir /usr/share/code/extensions --verbose\"\nLABEL oc.name=\"VSCode\"\nLABEL oc.displayname=\"VSCode\"\nLABEL oc.path=\"/usr/bin/code\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\"\nLABEL oc.fileextensions=\"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\"\nLABEL oc.legacyfileextensions=\"c;cpp;py;json;java;md;yml;yaml;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"2G\\\",\\\"shm_size\\\":\\\"2G\\\",\\\"cpu_period\\\":200000,\\\"cpu_quota\\\":200000,\\\"cap_add\\\":[\\\"SYS_ADMIN\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"VSCode\"\nENV APPBIN \"/usr/bin/code\"\nLABEL oc.args=\"--extensions-dir /usr/share/code/extensions --verbose\"\nENV APP \"/usr/bin/code\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vscode/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vscode/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application VSCode

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/VSCode.d\n
"},{"location":"applications/vscode/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f VSCode.d -t VSCode .\n
"},{"location":"applications/vscode/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect VSCode > VSCode.json\ndocker image save VSCode -o VSCode.tar\nctr -n k8s.io images import VSCode.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @VSCode.json\n\n
"},{"location":"applications/weather/","title":"weather","text":""},{"location":"applications/weather/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/weather/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/weather/#alpine-packages","title":"Alpine packages","text":"
gnome-weather\n
"},{"location":"applications/weather/#path","title":"Path","text":"
/usr/bin/gnome-weather\n
"},{"location":"applications/weather/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/weather/#wm_class","title":"WM_CLASS","text":"
org.gnome.Weather.org.gnome.Weather\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/weather/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Weather.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/weather/#json-dump","title":"JSON dump","text":"

json source file weather.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"gnome-weather\",\n    \"icon\": \"org.gnome.Weather.svg\",\n    \"keyword\": \"weather\",\n    \"launch\": \"org.gnome.Weather.org.gnome.Weather\",\n    \"name\": \"weather\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-weather\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Weather.desktop\"\n}\n
"},{"location":"applications/weather/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output weather.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/weather.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @weather.d.3.0.json\n\n
"},{"location":"applications/weather/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-weather\nLABEL oc.icon=\"org.gnome.Weather.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjQyIi8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZiIgeD0iLS4wNSIgeT0iLS4wNzUiIHdpZHRoPSIxLjEiIGhlaWdodD0iMS4xNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIuNzc3Ii8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZSIgeD0iLS4wOTYiIHk9Ii0uMDk2IiB3aWR0aD0iMS4xOTIiIGhlaWdodD0iMS4xOTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjg4Ii8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZCIgeD0iLS4wOCIgeT0iLS4xMiIgd2lkdGg9IjEuMTYiIGhlaWdodD0iMS4yNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjI0NCIvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgyNi4zNiAtMTEwNy41KSBzY2FsZSgyLjE0MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuOTkiIHgyPSIzOTkuOTkiIHkxPSI1NDUuMTQiIHkyPSI1MTguMTQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgyNi4zNiAtMTEwNy41KSBzY2FsZSgyLjE0MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzdhZGNmYyIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzBhNzllZCIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PGNpcmNsZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODI2LjM2IC0xMTA3LjUpIHNjYWxlKDIuMTQyOSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PGcgc3Ryb2tlLXdpZHRoPSIxLjU3MSI+PGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNiKSIvPjxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9Im5vbmUiLz48L2c+PHBhdGggZD0iTTMyLjQ3OCAyMi4xMTZhMTEuMTQ1IDExLjE0NSAwIDAgMC0xMS4xNDUgMTEuMTQ1IDExLjE0NSAxMS4xNDUgMCAwIDAgLjAxOC41MTIgNi42MzIgNi42MzIgMCAwIDAtNS45OTcgNi41OTVBNi42MzIgNi42MzIgMCAwIDAgMjEuOTg2IDQ3aDIxLjY0MmE5LjAxOCA5LjAxOCAwIDAgMCA5LjAxOC05LjAxOCA5LjAxOCA5LjAxOCAwIDAgMC05LjAxOC05LjAxOCA5LjAxOCA5LjAxOCAwIDAgMC0uODU3LjA0OSAxMS4xNDUgMTEuMTQ1IDAgMCAwLTEwLjI5NC02Ljg5N3oiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjEiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48Y2lyY2xlIGN4PSIyMiIgY3k9IjI4IiByPSIxMSIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48Y2lyY2xlIGN4PSIyMiIgY3k9IjI4IiByPSIxMSIgZmlsbD0iI2ZmZDIwZiIgc3R5bGU9InBhaW50LW9yZGVyOm5vcm1hbCIvPjxwYXRoIGQ9Ik0zMi40NzggMjIuMTE2YTExLjE0NSAxMS4xNDUgMCAwIDAtMTEuMTQ1IDExLjE0NSAxMS4xNDUgMTEuMTQ1IDAgMCAwIC4wMTguNTEyIDYuNjMyIDYuNjMyIDAgMCAwLTUuOTk3IDYuNTk1QTYuNjMyIDYuNjMyIDAgMCAwIDIxLjk4NiA0N2gyMS42NDJhOS4wMTggOS4wMTggMCAwIDAgOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtLjg1Ny4wNDkgMTEuMTQ1IDExLjE0NSAwIDAgMC0xMC4yOTQtNi44OTd6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4xNSIgc3R5bGU9InBhaW50LW9yZGVyOm5vcm1hbCIvPjxwYXRoIGQ9Ik0zMi40NzggMjIuMTE2YTExLjE0NSAxMS4xNDUgMCAwIDAtMTEuMTQ1IDExLjE0NSAxMS4xNDUgMTEuMTQ1IDAgMCAwIC4wMTguNTEyIDYuNjMyIDYuNjMyIDAgMCAwLTUuOTk3IDYuNTk1QTYuNjMyIDYuNjMyIDAgMCAwIDIxLjk4NiA0N2gyMS42NDJhOS4wMTggOS4wMTggMCAwIDAgOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtLjg1Ny4wNDkgMTEuMTQ1IDExLjE0NSAwIDAgMC0xMC4yOTQtNi44OTd6IiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIuODUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48L3N2Zz4=\"\nLABEL oc.keyword=\"weather,weather\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Weather.desktop\"\nLABEL oc.launch=\"org.gnome.Weather.org.gnome.Weather\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"weather\"\nLABEL oc.displayname=\"weather\"\nLABEL oc.path=\"/usr/bin/gnome-weather\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"weather\"\nENV APPBIN \"/usr/bin/gnome-weather\"\nENV APP \"/usr/bin/gnome-weather\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/weather/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/weather/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application weather

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/weather.d\n
"},{"location":"applications/weather/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f weather.d -t weather .\n
"},{"location":"applications/weather/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect weather > weather.json\ndocker image save weather -o weather.tar\nctr -n k8s.io images import weather.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @weather.json\n\n
"},{"location":"applications/whatsdesk/","title":"whatsdesk","text":""},{"location":"applications/whatsdesk/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.20.04

"},{"location":"applications/whatsdesk/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/whatsdesk/#ubuntu-packages","title":"Ubuntu packages","text":"
dbus-x11\n
"},{"location":"applications/whatsdesk/#path","title":"Path","text":"
/opt/whatsdesk/whatsdesk\n
"},{"location":"applications/whatsdesk/#mimetype","title":"Mimetype","text":"
x-scheme-handler/whatsapp;\n
"},{"location":"applications/whatsdesk/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/whatsdesk/#wm_class","title":"WM_CLASS","text":"
whatsdesk.whatsdesk\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/whatsdesk/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/whatsdesk.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/whatsdesk/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/whatsdesk/#json-dump","title":"JSON dump","text":"

json source file whatsdesk.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"debpackage\": \"dbus-x11\",\n    \"icon\": \"whatsapp.svg\",\n    \"keyword\": \"whatsapp,whatsdesk\",\n    \"launch\": \"whatsdesk.whatsdesk\",\n    \"name\": \"whatsdesk\",\n    \"path\": \"/opt/whatsdesk/whatsdesk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.20.04\",\n    \"mimetype\": \"x-scheme-handler/whatsapp;\",\n    \"desktopfile\": \"/usr/share/applications/whatsdesk.desktop\",\n    \"preruncommands\": [\n        \"RUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ]\n}\n
"},{"location":"applications/whatsdesk/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output whatsdesk.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/whatsdesk.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @whatsdesk.d.3.0.json\n\n
"},{"location":"applications/whatsdesk/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.20.04:$TAG\nUSER root\nRUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"whatsapp.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzUuMjE2IDE3NS41NTIiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ijg1LjkxNSIgeDI9Ijg2LjUzNSIgeTE9IjMyLjU2NyIgeTI9IjEzNy4wOTIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM1N2QxNjMiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyM2IzM2EiLz48L2xpbmVhckdyYWRpZW50PjxmaWx0ZXIgaWQ9ImEiIHdpZHRoPSIxLjExNSIgaGVpZ2h0PSIxLjExNCIgeD0iLS4wNTciIHk9Ii0uMDU3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMuNTMxIi8+PC9maWx0ZXI+PC9kZWZzPjxwYXRoIGZpbGw9IiNiM2IzYjMiIGQ9Im01NC41MzIgMTM4LjQ1IDIuMjM1IDEuMzI0YzkuMzg3IDUuNTcxIDIwLjE1IDguNTE4IDMxLjEyNiA4LjUyM2guMDIzYzMzLjcwNyAwIDYxLjEzOS0yNy40MjYgNjEuMTUzLTYxLjEzNS4wMDYtMTYuMzM1LTYuMzQ5LTMxLjY5Ni0xNy44OTUtNDMuMjUxQTYwLjc1IDYwLjc1IDAgMCAwIDg3Ljk0IDI1Ljk4M2MtMzMuNzMzIDAtNjEuMTY2IDI3LjQyMy02MS4xNzggNjEuMTNhNjAuOTggNjAuOTggMCAwIDAgOS4zNDkgMzIuNTM1bDEuNDU1IDIuMzEyLTYuMTc5IDIyLjU1OHptLTQwLjgxMSAyMy41NDRMMjQuMTYgMTIzLjg4Yy02LjQzOC0xMS4xNTQtOS44MjUtMjMuODA4LTkuODIxLTM2Ljc3Mi4wMTctNDAuNTU2IDMzLjAyMS03My41NSA3My41NzgtNzMuNTUgMTkuNjgxLjAxIDM4LjE1NCA3LjY2OSA1Mi4wNDcgMjEuNTcyczIxLjUzNyAzMi4zODMgMjEuNTMgNTIuMDM3Yy0uMDE4IDQwLjU1My0zMy4wMjcgNzMuNTUzLTczLjU3OCA3My41NTNoLS4wMzJjLTEyLjMxMy0uMDA1LTI0LjQxMi0zLjA5NC0zNS4xNTktOC45NTR6bTAgMCIgZmlsdGVyPSJ1cmwoI2EpIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTEyLjk2NiAxNjEuMjM4IDEwLjQzOS0zOC4xMTRhNzMuNDIgNzMuNDIgMCAwIDEtOS44MjEtMzYuNzcyYy4wMTctNDAuNTU2IDMzLjAyMS03My41NSA3My41NzgtNzMuNTUgMTkuNjgxLjAxIDM4LjE1NCA3LjY2OSA1Mi4wNDcgMjEuNTcyczIxLjUzNyAzMi4zODMgMjEuNTMgNTIuMDM3Yy0uMDE4IDQwLjU1My0zMy4wMjcgNzMuNTUzLTczLjU3OCA3My41NTNoLS4wMzJjLTEyLjMxMy0uMDA1LTI0LjQxMi0zLjA5NC0zNS4xNTktOC45NTR6Ii8+PHBhdGggZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDE3ODApIiBkPSJNODcuMTg0IDI1LjIyN2MtMzMuNzMzIDAtNjEuMTY2IDI3LjQyMy02MS4xNzggNjEuMTNhNjAuOTggNjAuOTggMCAwIDAgOS4zNDkgMzIuNTM1bDEuNDU1IDIuMzEyLTYuMTc5IDIyLjU1OSAyMy4xNDYtNi4wNjkgMi4yMzUgMS4zMjRjOS4zODcgNS41NzEgMjAuMTUgOC41MTggMzEuMTI2IDguNTI0aC4wMjNjMzMuNzA3IDAgNjEuMTQtMjcuNDI2IDYxLjE1My02MS4xMzVhNjAuNzUgNjAuNzUgMCAwIDAtMTcuODk1LTQzLjI1MSA2MC43NSA2MC43NSAwIDAgMC00My4yMzUtMTcuOTI5eiIvPjxwYXRoIGZpbGw9InVybCgjYikiIGQ9Ik04Ny4xODQgMjUuMjI3Yy0zMy43MzMgMC02MS4xNjYgMjcuNDIzLTYxLjE3OCA2MS4xM2E2MC45OCA2MC45OCAwIDAgMCA5LjM0OSAzMi41MzVsMS40NTUgMi4zMTMtNi4xNzkgMjIuNTU4IDIzLjE0Ni02LjA2OSAyLjIzNSAxLjMyNGM5LjM4NyA1LjU3MSAyMC4xNSA4LjUxNyAzMS4xMjYgOC41MjNoLjAyM2MzMy43MDcgMCA2MS4xNC0yNy40MjYgNjEuMTUzLTYxLjEzNWE2MC43NSA2MC43NSAwIDAgMC0xNy44OTUtNDMuMjUxIDYwLjc1IDYwLjc1IDAgMCAwLTQzLjIzNS0xNy45Mjh6Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNjguNzcyIDU1LjYwM2MtMS4zNzgtMy4wNjEtMi44MjgtMy4xMjMtNC4xMzctMy4xNzZsLTMuNTI0LS4wNDNjLTEuMjI2IDAtMy4yMTguNDYtNC45MDIgMi4zcy02LjQzNSA2LjI4Ny02LjQzNSAxNS4zMzIgNi41ODggMTcuNzg1IDcuNTA2IDE5LjAxMyAxMi43MTggMjAuMzgxIDMxLjQwNSAyNy43NWMxNS41MjkgNi4xMjQgMTguNjg5IDQuOTA2IDIyLjA2MSA0LjZzMTAuODc3LTQuNDQ3IDEyLjQwOC04Ljc0IDEuNTMyLTcuOTcxIDEuMDczLTguNzQtMS42ODUtMS4yMjYtMy41MjUtMi4xNDYtMTAuODc3LTUuMzY3LTEyLjU2Mi01Ljk4MS0yLjkxLS45MTktNC4xMzcuOTIxLTQuNzQ2IDUuOTc5LTUuODE5IDcuMjA2LTIuMTQ0IDEuMzgxLTMuOTg0LjQ2Mi03Ljc2LTIuODYxLTE0Ljc4NC05LjEyNGMtNS40NjUtNC44NzMtOS4xNTQtMTAuODkxLTEwLjIyOC0xMi43M3MtLjExNC0yLjgzNS44MDgtMy43NTFjLjgyNS0uODI0IDEuODM4LTIuMTQ3IDIuNzU5LTMuMjJzMS4yMjQtMS44NCAxLjgzNi0zLjA2NS4zMDctMi4zMDEtLjE1My0zLjIyLTQuMDMyLTEwLjAxMS01LjY2Ni0xMy42NDciLz48L3N2Zz4=\"\nLABEL oc.keyword=\"whatsdesk,whatsapp,whatsdesk\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"whatsdesk.desktop\"\nLABEL oc.launch=\"whatsdesk.whatsdesk\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.20.04\"\nLABEL oc.name=\"whatsdesk\"\nLABEL oc.displayname=\"whatsdesk\"\nLABEL oc.path=\"/opt/whatsdesk/whatsdesk\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/whatsapp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"whatsdesk\"\nENV APPBIN \"/opt/whatsdesk/whatsdesk\"\nENV APP \"/opt/whatsdesk/whatsdesk\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/whatsdesk/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/whatsdesk/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application whatsdesk

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/whatsdesk.d\n
"},{"location":"applications/whatsdesk/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f whatsdesk.d -t whatsdesk .\n
"},{"location":"applications/whatsdesk/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect whatsdesk > whatsdesk.json\ndocker image save whatsdesk -o whatsdesk.tar\nctr -n k8s.io images import whatsdesk.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @whatsdesk.json\n\n
"},{"location":"applications/winefile-wine/","title":"winefile-wine","text":""},{"location":"applications/winefile-wine/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.wine

"},{"location":"applications/winefile-wine/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/winefile-wine/#alpine-packages","title":"Alpine packages","text":"
wine\n
"},{"location":"applications/winefile-wine/#displayname","title":"Displayname","text":"
Winefile Wine (alpine)\n
"},{"location":"applications/winefile-wine/#path","title":"Path","text":"
/usr/bin/winefile\n
"},{"location":"applications/winefile-wine/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/winefile-wine/#wm_class","title":"WM_CLASS","text":"
winefile.exe.winefile.exe\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/winefile-wine/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
"},{"location":"applications/winefile-wine/#json-dump","title":"JSON dump","text":"

json source file winefile-wine.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n    ],\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"wine\",\n    \"icon\": \"winefile.svg\",\n    \"keyword\": \"wine,winfile,winefile,file,manager\",\n    \"launch\": \"winefile.exe.winefile.exe\",\n    \"name\": \"winefile-wine\",\n    \"displayname\": \"Winefile Wine (alpine)\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/winefile\",\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/winefile-wine/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output winefile-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winefile-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winefile-wine.d.3.0.json\n\n
"},{"location":"applications/winefile-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"winefile.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNDhweCIKICAgaGVpZ2h0PSI0OHB4IgogICBpZD0ic3ZnNDI4OSIKICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40NSIKICAgc29kaXBvZGk6ZG9jYmFzZT0iL2hvbWUvZG9iZXkvUHJvamVjdHMvZ25vbWUtaWNvbi10aGVtZS9zY2FsYWJsZS9hcHBzIgogICBzb2RpcG9kaTpkb2NuYW1lPSJzeXN0ZW0tZmlsZS1tYW5hZ2VyLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MjkxIj4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTE5NTUiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDExOTU3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjYWNjYzY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTE5NTkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izg4OGE4NTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyMTQwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMjIxNDIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjIxNDgiCiAgICAgICAgIG9mZnNldD0iMC41IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDIyMTQ0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjIxNDAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyMzA0NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjE4LjE0MjEzNiIKICAgICAgIHkxPSIzNSIKICAgICAgIHgyPSIxOC4xNDIxMzYiCiAgICAgICB5Mj0iNDIuMDQwNjYxIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyMjEyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDIzMDQyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAsLTEuMDAwMDAxLDEuMTQyODU2LDAsLTg5LjEwMjU5LC0zMS40OTk5OSkiCiAgICAgICBjeD0iNyIKICAgICAgIGN5PSIzOS40NjQ4MDYiCiAgICAgICBmeD0iNyIKICAgICAgIGZ5PSIzOS40NjQ4MDYiCiAgICAgICByPSIzLjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyMTIyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMjIxMjQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDIyMTI2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjIxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyMzA0MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLC0xLjAwMDAwMSwxLjE0Mjg1NiwwLC00MS4xMDI1OSw0NS41MDAwMSkiCiAgICAgICBjeD0iNyIKICAgICAgIGN5PSIzOS40NjQ4MDYiCiAgICAgICBmeD0iNyIKICAgICAgIGZ5PSIzOS40NjQ4MDYiCiAgICAgICByPSIzLjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDc5NTciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDc5NTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RkZGRkOTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3OTYxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3OTUxIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3OTUzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNmQ2ZDA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzk1NSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTU1NzUzO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk5NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOndoaXRlO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNjk5OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6d2hpdGU7c3RvcC1vcGFjaXR5OjAuNDY5OTQ1MzQiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A3MDAxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk4NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjNGM2YzA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A2OTg3IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojODg4YTg1O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk4OSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDExOTU1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk5MSIKICAgICAgIHgxPSIxOS41NzE0MjgiCiAgICAgICB5MT0iMTguMjg1NzE1IgogICAgICAgeDI9IjQwLjEwOTkzNiIKICAgICAgIHkyPSI0Mi43ODIzNzkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njk5NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMDMiCiAgICAgICB4MT0iMjMuNzE0Mjg5IgogICAgICAgeTE9IjE4LjYxODA0NCIKICAgICAgIHgyPSIyMy44NTY4ODQiCiAgICAgICB5Mj0iNi45OTk5OTgxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc5NTciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDI1IgogICAgICAgeDE9IjI1LjAwMDAwMiIKICAgICAgIHkxPSIzMy40NzkwNzMiCiAgICAgICB4Mj0iMjQuNTcyOTIyIgogICAgICAgeTI9IjMxLjM2MzcwMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtNS45NjA0NjRlLTgsMS4wMDAwMDEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3OTUxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAzOSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjI2LjQ4OTg0NyIKICAgICAgIHkxPSIzMi40OTQ5MTkiCiAgICAgICB4Mj0iMjYuMjYyNjkxIgogICAgICAgeTI9IjMwLjk0NTg5NiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTUuMTEyOTcyZS02LC0xMi45OTk5OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5ODUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ5NzQ1IgogICAgICAgeDE9IjE5LjE1MTc3NSIKICAgICAgIHkxPSIxNS45Njk1NDMiCiAgICAgICB4Mj0iNDAuNDg4NjA5IgogICAgICAgeTI9IjMwLjA4ODM5OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTg1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50OTc1MyIKICAgICAgIHgxPSIyNC4yMDI1NDEiCiAgICAgICB5MT0iMjkuOTc5Njk0IgogICAgICAgeDI9IjQwLjIyOTUxMSIKICAgICAgIHkyPSI0MS4wNzE0MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMTQiCiAgICAgaW5rc2NhcGU6Y3g9IjI4LjI1MDg4NiIKICAgICBpbmtzY2FwZTpjeT0iMTkuMTMxOTUzIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBzaG93Z3VpZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMjgwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijk0OSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMjUiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDI5NCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvR1BMLzIuMC8iIC8+CiAgICAgICAgPGRjOnRpdGxlPlN5c3RlbSBGaWxlIE1hbmFnZXI8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlPkp1bHkgMjAwNjwvZGM6ZGF0ZT4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkFuZHJlYXMgTmlsc3NvbjwvZGM6dGl0bGU+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6Y3JlYXRvcj4KICAgICAgICA8ZGM6c291cmNlPmh0dHA6Ly93d3cuZ25vbWUub3JnPC9kYzpzb3VyY2U+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9HUEwvMi4wLyI+CiAgICAgICAgPGNjOnBlcm1pdHMKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjL1JlcHJvZHVjdGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGlzdHJpYnV0aW9uIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvTm90aWNlIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EZXJpdmF0aXZlV29ya3MiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9TaGFyZUFsaWtlIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvU291cmNlQ29kZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPGcKICAgICAgIGlkPSJnMjIxNTAiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjY4NzUsMCwwLDEuNDI4NTcsOCwtMTYuOTk5OTQpIj4KICAgICAgPHJlY3QKICAgICAgICAgeT0iMzUiCiAgICAgICAgIHg9IjAiCiAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgd2lkdGg9IjQiCiAgICAgICAgIGlkPSJyZWN0MjIxMjAiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MjMwNDApO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjEuMjAwMDAwNTc7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgIHk9Ii00MiIKICAgICAgICAgeD0iLTQ4IgogICAgICAgICBoZWlnaHQ9IjciCiAgICAgICAgIHdpZHRoPSI0IgogICAgICAgICBpZD0icmVjdDIyMTM0IgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDIzMDQyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDoxLjIwMDAwMDU3O3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHk9IjM1IgogICAgICAgICB4PSI0IgogICAgICAgICBoZWlnaHQ9IjciCiAgICAgICAgIHdpZHRoPSI0MCIKICAgICAgICAgaWQ9InJlY3QyMjEzOCIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyMzA0NCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MS4yMDAwMDA1NztzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ2OTkxKTtmaWxsLW9wYWNpdHk6MS4wO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNTU1NzUzO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMTQuNTcxNDI5LDYuNSBMIDM0LjU3MTQyOSw2LjUgTCAzOC41LDExIEwgMzguNSwzOS41NzE0MjkgQyAzOC41MTQ3ODIsMzkuOTM2NzQ1IDM3Ljk1ODEzNSw0MC41MTYzNDYgMzcuNDcyOTE3LDQwLjQ1MzA5IEwgMTEuNDI4NTcxLDQwLjQ1MzA5IEMgMTAuOTA0NzYyLDQwLjM5NzI5OCAxMC41MjM4MDksNDAuMDU1NzkyIDEwLjUsMzkuNDI4NTcxIEwgMTAuNSwxMSBMIDE0LjU3MTQyOSw2LjUgeiAiCiAgICAgICBpZD0icGF0aDQzMDciCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIgLz4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDk3NDUpO2ZpbGwtb3BhY2l0eToxLjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2YzZmNmE7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgaWQ9InJlY3Q1MTk3IgogICAgICAgd2lkdGg9IjIwLjk5OTk5NiIKICAgICAgIGhlaWdodD0iMTEuMDAwMDAzIgogICAgICAgeD0iMTQuNDk5OTk4IgogICAgICAgeT0iMTMuNDk5OTk4IgogICAgICAgcng9IjEuMDcxNDI4NSIKICAgICAgIHJ5PSIxLjA3MTQyODUiIC8+CiAgICA8cmVjdAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ5NzUzKTtmaWxsLW9wYWNpdHk6MS4wO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNmM2ZjZhO3N0cm9rZS13aWR0aDowLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NTE5OSIKICAgICAgIHdpZHRoPSIyMC45OTk5OTYiCiAgICAgICBoZWlnaHQ9IjExLjAwMDAwMyIKICAgICAgIHg9IjE0LjUiCiAgICAgICB5PSIyNi40OTk5OTgiCiAgICAgICByeD0iMS4wNzE0Mjg1IgogICAgICAgcnk9IjEuMDcxNDI4NSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7b3BhY2l0eTowLjUiCiAgICAgICBkPSJNIDExLjE0Mjg1NywxMSBMIDM3Ljg1NzE0MywxMC45Mjg1NzEgTCAzNC41LDcgTCAxNSw3IEwgMTEuMTQyODU3LDExIHogIgogICAgICAgaWQ9InBhdGg1MjAzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzAwMyk7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO29wYWNpdHk6MC41IgogICAgICAgZD0iTSAxNC45MjM0MzUsNy40OTk5OTggTCAzNC4yODAzOTEsNy40OTk5OTggTCAzNy40OTk3NDIsMTEuMjQwNTQ2IEwgMzcuNDk5NzQyLDM5LjQ1MDM3NSBMIDExLjUwMDAwMywzOS40OTQzMjQgTCAxMS41MDAwMDMsMTEuMjQwNTQ2IEwgMTQuOTIzNDM1LDcuNDk5OTk4IHogIgogICAgICAgaWQ9InBhdGg2OTkzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIiAvPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzAyNSk7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NzAxNyIKICAgICAgIHdpZHRoPSI3LjAwMDAwNTIiCiAgICAgICBoZWlnaHQ9IjMuMDAwMDA1MiIKICAgICAgIHg9IjIxLjUiCiAgICAgICB5PSIzMS40OTk5OTQiCiAgICAgICByeD0iMS4wNzE0MjgyIgogICAgICAgcnk9IjEuMDcxNDI4OCIgLz4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDcwMzkpO3N0cm9rZS13aWR0aDowLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDcwMzciCiAgICAgICB3aWR0aD0iNy4wMDAwMDUyIgogICAgICAgaGVpZ2h0PSIzLjAwMDAwNTIiCiAgICAgICB4PSIyMS40OTk5OTQiCiAgICAgICB5PSIxNy41IgogICAgICAgcng9IjEuMDcxNDI4MiIKICAgICAgIHJ5PSIxLjA3MTQyODgiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6d2hpdGU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtvcGFjaXR5OjAuNiIKICAgICAgIGQ9Ik0gMTIuNSwxMC41NzE0MjkgTCAzNi41NzE0MjksMTAuNTcxNDI5IgogICAgICAgaWQ9InBhdGg2MDkzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"winefile-wine,wine,winfile,winefile,file,manager\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winefile.exe.winefile.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"winefile-wine\"\nLABEL oc.displayname=\"Winefile Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/winefile\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winefile-wine\"\nENV APPBIN \"/usr/bin/winefile\"\nENV APP \"/usr/bin/winefile\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winefile-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winefile-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application winefile-wine

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winefile-wine.d\n
"},{"location":"applications/winefile-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f winefile-wine.d -t winefile-wine .\n
"},{"location":"applications/winefile-wine/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect winefile-wine > winefile-wine.json\ndocker image save winefile-wine -o winefile-wine.tar\nctr -n k8s.io images import winefile-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winefile-wine.json\n\n
"},{"location":"applications/winemine-wine/","title":"winemine-wine","text":""},{"location":"applications/winemine-wine/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.wine

"},{"location":"applications/winemine-wine/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/winemine-wine/#alpine-packages","title":"Alpine packages","text":"
wine\n
"},{"location":"applications/winemine-wine/#displayname","title":"Displayname","text":"
WineMine Wine (alpine)\n
"},{"location":"applications/winemine-wine/#path","title":"Path","text":"
/usr/bin/winemine\n
"},{"location":"applications/winemine-wine/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/winemine-wine/#wm_class","title":"WM_CLASS","text":"
winemine.exe.winemine.exe\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/winemine-wine/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\n
"},{"location":"applications/winemine-wine/#json-dump","title":"JSON dump","text":"

json source file winemine-wine.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"wine\",\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\"\n    ],\n    \"icon\": \"winemine.svg\",\n    \"keyword\": \"wine,winemine,mine\",\n    \"launch\": \"winemine.exe.winemine.exe\",\n    \"name\": \"winemine-wine\",\n    \"displayname\": \"WineMine Wine (alpine)\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/winemine\",\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/winemine-wine/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output winemine-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winemine-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winemine-wine.d.3.0.json\n\n
"},{"location":"applications/winemine-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"winemine.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4wIgogICB3aWR0aD0iNzBwdCIKICAgaGVpZ2h0PSI3MHB0IgogICBpZD0ic3ZnMiI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiIC8+CiAgPGcKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY2LjYxMywtOTAuNjM3NDkpIgogICAgICAgaWQ9ImcxMDc5NyI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEzMi43NTc4LDMzLjkwOTg4KSIKICAgICAgICAgaWQ9InVzZTQ0NzkiPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjIuMzkxODQsNC4wNzUyNTEpIgogICAgICAgICAgIGlkPSJnMTA3ODkiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gMTguNTk3ODY5LDU4LjQwMDc1OCBMIDkzLjc1NjAxLDU4LjQwMDc1OCBDIDkzLjc2MTAxMSw1OC40MDA3NTggOTMuNzY1MDM4LDU4LjQwNDk4NiA5My43NjUwMzgsNTguNDEwMjQgTCA5My43NjUwMzgsMTMzLjM0NDcxIEMgOTMuNzY1MDM4LDEzMy4zNDk5NiA5My43NjEwMTEsMTMzLjM1NDE5IDkzLjc1NjAxLDEzMy4zNTQxOSBMIDE4LjU5Nzg2OSwxMzMuMzU0MTkgQyAxOC41OTI4NTksMTMzLjM1NDE5IDE4LjU4ODgzLDEzMy4zNDk5NiAxOC41ODg4MywxMzMuMzQ0NzEgTCAxOC41ODg4Myw1OC40MTAyNCBDIDE4LjU4ODgzLDU4LjQwNDk4NiAxOC41OTI4NTksNTguNDAwNzU4IDE4LjU5Nzg2OSw1OC40MDA3NTggeiAiCiAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNmZGZjZmQ7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNiZmE2Yjc7c3Ryb2tlLXdpZHRoOjAuNDc3ODQ1ODU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgICBpZD0icGF0aDEwNzkxIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gOTMuNjM5MDI0LDU4LjQ4NDM0OSBDIDkzLjY0NDAzLDU4LjQ4NDM0OSA5My42NDgwNjEsNTguNDg4NTg0IDkzLjY0ODA2MSw1OC40OTM4NDQgTCA5My42NDgwNjEsMTMzLjU0NDI5IEMgOTMuNjQ4MDYxLDEzMy41NDk1NSA5My42NDQwMywxMzMuNTUzNzggOTMuNjM5MDI0LDEzMy41NTM3OCBMIDE4LjM5NTkxMiwxMzMuNTUzNzggQyAxOC4zOTA5MDYsMTMzLjU1Mzc4IDE4LjM4Njg3NiwxMzMuNTQ5NTUgMTguMzg2ODc2LDEzMy41NDQyOSBMIDkzLjYzOTAyNCw1OC40ODQzNDkgeiAiCiAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiMyNTI1MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNiZmE2Yjc7c3Ryb2tlLXdpZHRoOjAuNDc4NDg1NzM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgICBpZD0icGF0aDEwNzkzIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI2NS43NjA5MDIiCiAgICAgICAgICAgaGVpZ2h0PSI2NS43NjA5MDIiCiAgICAgICAgICAgcnk9IjAuMDA4MTU0MDg0OSIKICAgICAgICAgICB4PSI0NS41ODcxODkiCiAgICAgICAgICAgeT0iNjcuMTcyMjI2IgogICAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6I2IzYjFiYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I2JmYTZiNztzdHJva2Utd2lkdGg6MC40MjEyMTM2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgICBpZD0icmVjdDEwNzk1IiAvPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjg2NCwwLDAsMC41MDg3MjIsNTI4LjY4ODcsLTEwOS4zNzgpIgogICAgICAgICBpZD0iZzgxMTEiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAtNDc5LjY5MjAxLDQyMS43ODc3NSBMIC00NzkuNjkyMDEsNDczLjc4Mzc1IEMgLTQ3Mi44NTAwNiw0NzAuODk2NjIgLTQ2Mi43Mzg3OSw0NjUuMTIzMTYgLTQ2MC45MjA1Nyw0NjQuMDg1MzQgQyAtNDU4LjMxMDIsNDYyLjU5NTM4IC00MzguNjAyMTQsNDUxLjM1MDU5IC00MzguNTcxODcsNDQ4LjMxNzYgQyAtNDM4LjU0MTYsNDQ1LjI4NDYxIC00NTguMDIwMTIsNDMzLjYzNzgzIC00NjAuNjAwMjIsNDMyLjA5NDggQyAtNDYyLjQ0MzUzLDQzMC45OTI0MSAtNDcyLjkxMTg0LDQyNC43MzA5OCAtNDc5LjY5MjAxLDQyMS43ODc3NSB6ICIKICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiMwMDhmMGY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjUzMzAzODtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgaWQ9InBhdGg4MTEzIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjYuODU1NjA4IgogICAgICAgICAgIGhlaWdodD0iMTEzLjIzNTc4IgogICAgICAgICAgIHJ5PSIwLjAwMTA0NDQzOTYiCiAgICAgICAgICAgeD0iLTQ4Ni41NDY4NCIKICAgICAgICAgICB5PSI0MjEuNzk3NjEiCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozLjAzODE4NDE3O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgICBpZD0icmVjdDgxMTUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"winemine-wine,wine,winemine,mine\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"winemine.exe.winemine.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"winemine-wine\"\nLABEL oc.displayname=\"WineMine Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/winemine\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winemine-wine\"\nENV APPBIN \"/usr/bin/winemine\"\nENV APP \"/usr/bin/winemine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winemine-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winemine-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application winemine-wine

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winemine-wine.d\n
"},{"location":"applications/winemine-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f winemine-wine.d -t winemine-wine .\n
"},{"location":"applications/winemine-wine/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect winemine-wine > winemine-wine.json\ndocker image save winemine-wine -o winemine-wine.tar\nctr -n k8s.io images import winemine-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winemine-wine.json\n\n
"},{"location":"applications/winhelp-wine/","title":"winhelp-wine","text":""},{"location":"applications/winhelp-wine/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.wine

"},{"location":"applications/winhelp-wine/#arguments","title":"Arguments","text":"

\"winhelp\"

"},{"location":"applications/winhelp-wine/#displayname","title":"Displayname","text":"
Winhelp Wine\n
"},{"location":"applications/winhelp-wine/#path","title":"Path","text":"
/usr/bin/wine\n
"},{"location":"applications/winhelp-wine/#mimetype","title":"Mimetype","text":"
application/hlp;\n
"},{"location":"applications/winhelp-wine/#file-extensions","title":"File extensions","text":"

\"hlp;\"

"},{"location":"applications/winhelp-wine/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/winhelp-wine/#wm_class","title":"WM_CLASS","text":"
winhlp32.exe.Wine\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/winhelp-wine/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\n
"},{"location":"applications/winhelp-wine/#json-dump","title":"JSON dump","text":"

json source file winhelp-wine.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"args\": \"winhelp\",\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"ENV WINEARCH=win64\",\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n        \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"winhelp.svg\",\n    \"keyword\": \"wine,winhelp,text,hlp,help,wine\",\n    \"launch\": \"winhlp32.exe.Wine\",\n    \"name\": \"winhelp-wine\",\n    \"displayname\": \"Winhelp Wine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"application/hlp;\",\n    \"fileextensions\": \"hlp;\",\n    \"path\": \"/usr/bin/wine\",\n    \"template\": \"abcdesktopio/oc.template.wine\"\n}\n
"},{"location":"applications/winhelp-wine/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output winhelp-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winhelp-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winhelp-wine.d.3.0.json\n\n
"},{"location":"applications/winhelp-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.wine:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\nLABEL oc.icon=\"winhelp.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBDcmVhdGVkIHdpdGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+Cjxzdmcgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA0OCA0OC4wMDAwMDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTM3IiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMGEwZDQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDFhOGQ3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgIDxkYzp0aXRsZS8+CiAgIDwvY2M6V29yaz4KICA8L3JkZjpSREY+CiA8L21ldGFkYXRhPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxwYXRoIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00em0wIDAuNXYwLjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBvcGFjaXR5PSIuMDIiLz4KICA8cGF0aCBkPSJtMSA0My4yNXYwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIG9wYWNpdHk9Ii4wNSIvPgogIDxwYXRoIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgb3BhY2l0eT0iLjEiLz4KIDwvZz4KIDxyZWN0IHRyYW5zZm9ybT0icm90YXRlKC05MCkiIHg9Ii00NyIgeT0iMSIgd2lkdGg9IjQ2IiBoZWlnaHQ9IjQ2IiByeD0iNCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDQ1MzcpIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDMuOTQ5ZS01KSI+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtMTAwNC40KSI+CiAgIDxwYXRoIGQ9Im0xIDEwNDMuNHY0YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtNGMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIG9wYWNpdHk9Ii4xIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEsLTEpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLDEpIj4KICAgPGcgb3BhY2l0eT0iLjEiPjwhLS0gY29sb3I6ICM0MWE4ZDggLS0+CiAgICA8cGF0aCBkPSJtMjQgOWMtOC4yODUgMC0xNSA2LjcxNS0xNSAxNXM2LjcxNSAxNSAxNSAxNSAxNS02LjcxNSAxNS0xNS02LjcxNS0xNS0xNS0xNW0wIDZjNC45NjkgMCA5IDQuMDMgOSA5IDAgNC45NjktNC4wMyA5LTkgOS00Ljk2OSAwLTktNC4wMy05LTkgMC00Ljk2OSA0LjAzLTkgOS05Ii8+CiAgICA8cGF0aCBkPSJtMjQgOWMtOC4yODUgMC0xNSA2LjcxNS0xNSAxNSAwIDQuMzk4IDEuOTIyIDguMzIgNC45MzggMTEuMDYtMi40MjYtMi42NjQtMy45MzgtNi4xNzYtMy45MzgtMTAuMDYgMC04LjI4NSA2LjcxNS0xNSAxNS0xNSAzLjg4NyAwIDcuMzk4IDEuNTEyIDEwLjA2IDMuOTM4LTIuNzQyLTMuMDItNi42NjQtNC45MzgtMTEuMDYtNC45MzgiIGZpbGwtb3BhY2l0eT0iLjE0OSIvPgogICAgPHBhdGggZD0ibTM1LjA1IDIzLjg1Yy0wLjE2MjY0IDIuMDYzMy0xLjAzMDMgNC4wNzkzLTIuNjA3OCA1LjY1NjktMy41MTM2IDMuNTEzNi05LjIxMzYgMy41MTQzLTEyLjcyOCAwLTEuNTc2OC0xLjU3NjgtMi40NDQ1LTMuNTk0Mi0yLjYwNzgtNS42NTY5LTAuMTk2NTggMi41MzI5IDAuNjcxMDQgNS4xMzQzIDIuNjA3OCA3LjA3MTEgMy41MTM2IDMuNTEzNiA5LjIxMzYgMy41MTQzIDEyLjcyOCAwIDEuOTM2MS0xLjkzNjEgMi44MDMtNC41MzgyIDIuNjA3OC03LjA3MTEiIGZpbGwtb3BhY2l0eT0iLjE0OSIvPgogICA8L2c+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMSkiPjwhLS0gY29sb3I6ICM0MWE4ZDggLS0+CiAgPHBhdGggZD0ibTI0IDljLTguMjg1IDAtMTUgNi43MTUtMTUgMTVzNi43MTUgMTUgMTUgMTUgMTUtNi43MTUgMTUtMTUtNi43MTUtMTUtMTUtMTVtMCA2YzQuOTY5IDAgOSA0LjAzIDkgOSAwIDQuOTY5LTQuMDMgOS05IDktNC45NjkgMC05LTQuMDMtOS05IDAtNC45NjkgNC4wMy05IDktOSIgZmlsbD0iI2VhNWM1MyIvPgogIDxnIGZpbGw9IiNlZWVjZTAiPgogICA8cGF0aCBkPSJtMTAuMzc1IDE3Ljc4MWMtMC44NjcgMS44OTUtMS4zNzUgNC0xLjM3NSA2LjIxOXMwLjUwOCA0LjMyNCAxLjM3NSA2LjIxOWw1LjI1LTNjLTAuMzgzLTEtMC42MjUtMi4wODItMC42MjUtMy4yMTlzMC4yNDItMi4yMTkgMC42MjUtMy4yMTltLTUuMjUtMyIvPgogICA8cGF0aCBkPSJtMzcuNjI1IDE3Ljc4MS01LjI1IDNjMC4zODMgMSAwLjYyNSAyLjA4MiAwLjYyNSAzLjIxOXMtMC4yNDIgMi4yMTktMC42MjUgMy4yMTlsNS4yNSAzYzAuODY3LTEuODk1IDEuMzc1LTQgMS4zNzUtNi4yMTlzLTAuNTA4LTQuMzI0LTEuMzc1LTYuMjE5Ii8+CiAgIDxwYXRoIGQ9Im0yMC43ODEgMzIuMzc1LTMgNS4yNWMxLjg5NSAwLjg2NyA0IDEuMzc1IDYuMjE5IDEuMzc1czQuMzI0LTAuNTA4IDYuMjE5LTEuMzc1bC0zLTUuMjVjLTEgMC4zODMtMi4wODIgMC42MjUtMy4yMTkgMC42MjVzLTIuMjE5LTAuMjQyLTMuMjE5LTAuNjI1Ii8+CiAgIDxwYXRoIGQ9Im0yNCA5Yy0yLjIxOSAwLTQuMzI0IDAuNTA4LTYuMjE5IDEuMzc1bDMgNS4yNWMxLTAuMzgzIDIuMDgyLTAuNjI1IDMuMjE5LTAuNjI1czIuMjE5IDAuMjQyIDMuMjE5IDAuNjI1bDMtNS4yNWMtMS44OTUtMC44NjctNC0xLjM3NS02LjIxOS0xLjM3NSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0zMi45NzkgMjMuNDI0YTkgOSAwIDAgMSAtOC45Nzg1IDguNTc2MiA5IDkgMCAwIDEgLTguOTc4NSAtOC40MjM4IDkgOSAwIDAgMCAtMC4wMjE0ODQgMC40MjM4MyA5IDkgMCAwIDAgOSA5IDkgOSAwIDAgMCA5IC05IDkgOSAwIDAgMCAtMC4wMjE0ODQgLTAuNTc2MTd6IiBvcGFjaXR5PSIuMSIgc3Ryb2tlLXdpZHRoPSIuOTk4MjciLz4KIDxwYXRoIGQ9Ik0gMjQgOCBBIDE1IDE1IDAgMCAwIDkgMjMgQSAxNSAxNSAwIDAgMCA5LjAxOTUzMTIgMjMuNTg1OTM4IEEgMTUgMTUgMCAwIDEgMjQgOSBBIDE1IDE1IDAgMCAxIDM4Ljk4MDQ2OSAyMy40MTQwNjIgQSAxNSAxNSAwIDAgMCAzOSAyMyBBIDE1IDE1IDAgMCAwIDI0IDggeiAiIG9wYWNpdHk9Ii4xIiBzdHJva2Utd2lkdGg9IjQuMjYyMyIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"winhelp-wine,wine,winhelp,text,hlp,help,wine\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winhlp32.exe.Wine\"\nLABEL oc.template=\"abcdesktopio/oc.template.wine\"\nENV ARGS=\"winhelp\"\nLABEL oc.name=\"winhelp-wine\"\nLABEL oc.displayname=\"Winhelp Wine\"\nLABEL oc.path=\"/usr/bin/wine\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/hlp;\"\nLABEL oc.fileextensions=\"hlp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winhelp-wine\"\nENV APPBIN \"/usr/bin/wine\"\nLABEL oc.args=\"winhelp\"\nENV APP \"/usr/bin/wine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winhelp-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winhelp-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application winhelp-wine

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winhelp-wine.d\n
"},{"location":"applications/winhelp-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f winhelp-wine.d -t winhelp-wine .\n
"},{"location":"applications/winhelp-wine/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect winhelp-wine > winhelp-wine.json\ndocker image save winhelp-wine -o winhelp-wine.tar\nctr -n k8s.io images import winhelp-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winhelp-wine.json\n\n
"},{"location":"applications/winscp-wine/","title":"winscp-wine","text":""},{"location":"applications/winscp-wine/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.wine

"},{"location":"applications/winscp-wine/#arguments","title":"Arguments","text":"

\"/composer/bin/winscp.exe\"

"},{"location":"applications/winscp-wine/#displayname","title":"Displayname","text":"
WinSCP\n
"},{"location":"applications/winscp-wine/#path","title":"Path","text":"
/usr/bin/wine\n
"},{"location":"applications/winscp-wine/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/winscp-wine/#wm_class","title":"WM_CLASS","text":"
winscp.exe.Wine\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/winscp-wine/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\n
"},{"location":"applications/winscp-wine/#json-dump","title":"JSON dump","text":"

json source file winscp-wine.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"template\": \"abcdesktopio/oc.template.wine\",\n    \"preruncommands\": [\n        \"ENV WINEARCH=win64\",\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n        \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\"\n    ],\n    \"args\": \"/composer/bin/winscp.exe\",\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"icon\": \"winscp.svg\",\n    \"keyword\": \"wine,scp,sftp\",\n    \"launch\": \"winscp.exe.Wine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"winscp-wine\",\n    \"displayname\": \"WinSCP\",\n    \"path\": \"/usr/bin/wine\"\n}\n
"},{"location":"applications/winscp-wine/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output winscp-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winscp-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winscp-wine.d.3.0.json\n\n
"},{"location":"applications/winscp-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.wine:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\nLABEL oc.icon=\"winscp.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMjAgMjAiCiAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiCiAgIHN0cm9rZS1saW5lam9pbj0icm91bmQiCiAgIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIKICAgaWQ9InN2ZzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJJRE8yLUtBS1VDSE8uc3ZnIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExMiI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczEwIiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlkPSJuYW1lZHZpZXc4IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIyMy42IgogICAgIGlua3NjYXBlOmN4PSI4LjkyMzgyNjMiCiAgICAgaW5rc2NhcGU6Y3k9IjguOTk0NTA1NyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTkiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii05IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIgLz4KICA8IS0tU2hhY2tsZS0tPgogIDwhLS1Cb2R5LS0+CiAgPHJlY3QKICAgICB4PSI1IgogICAgIHk9IjEuMjUwMDAwMSIKICAgICB3aWR0aD0iMTAiCiAgICAgaGVpZ2h0PSIxNSIKICAgICByeD0iNSIKICAgICByeT0iNSIKICAgICBpZD0icmVjdDQiCiAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgwODA4MDtzdHJva2Utd2lkdGg6Mi41IiAvPgogIDxyZWN0CiAgICAgeD0iMi41IgogICAgIHk9IjcuNSIKICAgICB3aWR0aD0iMTUiCiAgICAgaGVpZ2h0PSIxMi41IgogICAgIHJ4PSIxLjI1IgogICAgIHJ5PSIxLjI1IgogICAgIHN0eWxlPSJmaWxsOiM5NmM0ODk7ZmlsbC1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q2LTgtOCIgLz4KICA8cGF0aAogICAgIHN0eWxlPSJmaWxsOiMxMDg4MTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgZD0ibSAzLjc1LDcuNTAwMDAwMiAxMi41LDAgYyAwLjM0NjI1LDAgMC42NTg3NSwwLjEzOTM3NSAwLjg4NDY4NywwLjM2NTMxMjUgTCAyLjg2NTMxMjUsMTkuNjM0Njg3IEMgMi42MzkzNzUsMTkuNDA4NzUgMi41LDE5LjA5NjI1IDIuNSwxOC43NSBsIDAsLTkuOTk5OTk5OCBjIDAsLTAuNjkyNSAwLjU1NzUsLTEuMjUgMS4yNSwtMS4yNSB6IgogICAgIGlkPSJyZWN0Ni0wIgogICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJzc2Njc3NzIiAvPgogIDxwYXRoCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmIgogICAgIGQ9Im0gNi41LDEyLjc1IDMuNSwwIEwgOC41LDExLjI1IDEwLDkuNzQ5OTk5NyAxNC4yNSwxNCAxMCwxOC4yNSBsIC0xLjUsLTEuNSAxLjUsLTEuNSAtMy41LDAgbSAwLC0yLjUiCiAgICAgaWQ9InBhdGg4IiAvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"winscp-wine,wine,scp,sftp\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winscp.exe.Wine\"\nLABEL oc.template=\"abcdesktopio/oc.template.wine\"\nENV ARGS=\"/composer/bin/winscp.exe\"\nLABEL oc.name=\"winscp-wine\"\nLABEL oc.displayname=\"WinSCP\"\nLABEL oc.path=\"/usr/bin/wine\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winscp-wine\"\nENV APPBIN \"/usr/bin/wine\"\nLABEL oc.args=\"/composer/bin/winscp.exe\"\nENV APP \"/usr/bin/wine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winscp-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winscp-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application winscp-wine

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winscp-wine.d\n
"},{"location":"applications/winscp-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f winscp-wine.d -t winscp-wine .\n
"},{"location":"applications/winscp-wine/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect winscp-wine > winscp-wine.json\ndocker image save winscp-wine -o winscp-wine.tar\nctr -n k8s.io images import winscp-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winscp-wine.json\n\n
"},{"location":"applications/wireshark/","title":"wireshark","text":""},{"location":"applications/wireshark/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/wireshark/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/wireshark/#alpine-packages","title":"Alpine packages","text":"
wireshark\n
"},{"location":"applications/wireshark/#displayname","title":"Displayname","text":"
wireshark (alpine)\n
"},{"location":"applications/wireshark/#path","title":"Path","text":"
/usr/bin/wireshark\n
"},{"location":"applications/wireshark/#mimetype","title":"Mimetype","text":"
application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\n
"},{"location":"applications/wireshark/#file-extensions","title":"File extensions","text":"

\"cap,pcap\"

"},{"location":"applications/wireshark/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"cap\"

"},{"location":"applications/wireshark/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/wireshark/#wm_class","title":"WM_CLASS","text":"
wireshark.Wireshark\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/wireshark/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.wireshark.Wireshark.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/wireshark/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV QT_XCB_NO_MITSHM=1\n
"},{"location":"applications/wireshark/#json-dump","title":"JSON dump","text":"

json source file wireshark.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"ENV QT_XCB_NO_MITSHM=1\"\n    ],\n    \"apkpackage\": \"wireshark\",\n    \"icon\": \"wireshark.svg\",\n    \"keyword\": \"capture,network,analyzer\",\n    \"launch\": \"wireshark.Wireshark\",\n    \"name\": \"wireshark\",\n    \"displayname\": \"wireshark (alpine)\",\n    \"path\": \"/usr/bin/wireshark\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"desktopfile\": \"/usr/share/applications/org.wireshark.Wireshark.desktop\",\n    \"mimetype\": \"application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\",\n    \"fileextensions\": \"cap,pcap\",\n    \"legacyfileextensions\": \"cap\"\n}\n
"},{"location":"applications/wireshark/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output wireshark.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/wireshark.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @wireshark.d.3.0.json\n\n
"},{"location":"applications/wireshark/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nENV QT_XCB_NO_MITSHM=1\nRUN apk add --no-cache --update wireshark\nLABEL oc.icon=\"wireshark.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iOTkuOTk2MzYxIgogICBoZWlnaHQ9Ijk5Ljg0MTkyNyIKICAgaWQ9InN2ZzEzMTUiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDQiCiAgIHNvZGlwb2RpOmRvY25hbWU9IndzaWNvbi5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIyMzAuNDEiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSIyMzAuNDEiCiAgIHZlcnNpb249IjEuMCI+CiAgPGRlZnMKICAgICBpZD0iZGVmczEzMTciPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzOTUzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTU1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkOGQ4ZDg7c3RvcC1vcGFjaXR5OjAuODE5NjcyMTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzk1NyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMDEwOTI4OTYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTAwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC43NDIyNjgwMzsiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDM1MDIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMjc4MzUwNTA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AzNTA0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjAzMiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MGIyZTc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDIwMzQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjA0MCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTY3OWE3O3N0b3Atb3BhY2l0eTowLjkzODE0NDMzOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMzIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNzcwIgogICAgICAgY3g9IjE4Ni44Njg1IgogICAgICAgY3k9IjMxOS42MjQ2OSIKICAgICAgIGZ4PSIxODYuODY4NSIKICAgICAgIGZ5PSIzMTkuNjI0NjkiCiAgICAgICByPSI0OS45OTgxOCIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC45OTg0NTYsMCwwLjUwMTI1NCkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzUwMCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1MDYiCiAgICAgICB4MT0iMTY4Ljg4NDkzIgogICAgICAgeTE9IjI4My4zNjIxOCIKICAgICAgIHgyPSIxNzMuNjM4ODQiCiAgICAgICB5Mj0iMzE3LjQzODIzIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDIzNjg0LDAsMCwxLC00LjM4Njg5MiwtMSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM5NTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzOTUxIgogICAgICAgeDE9IjE3MS40ODYzNiIKICAgICAgIHkxPSIyNzguNzUxMTMiCiAgICAgICB4Mj0iMTcxLjY5NjgyIgogICAgICAgeTI9IjI4Ni41Mzc3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwNDcwNSwwLDAsMS4zMDc3MDksLTAuNjc4MDc5LC04NS43MzMxNSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM5NTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMzMwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDA0NzA1LDAsMCwxLjMwNzcwOSwtMC42NzgwNzksLTg1LjczMzE1KSIKICAgICAgIHgxPSIxNzEuNDg2MzYiCiAgICAgICB5MT0iMjc4Ljc1MTEzIgogICAgICAgeDI9IjE3Mi4wNjg2MiIKICAgICAgIHkyPSIyODkuODcwMjQiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIyLjAwNzgyMjUiCiAgICAgaW5rc2NhcGU6Y3g9IjE2OS4yNzkzNCIKICAgICBpbmtzY2FwZTpjeT0iMzUuNDY0NTg0IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9Ijg5MyIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3MzMiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjgzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSItMTMiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMTMyMCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEzMy44NzY4LC0yNzQuNjQxOCkiPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50Mjc3MCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOmJsYWNrO3N0cm9rZS13aWR0aDo0LjU1Mzk5OTk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDU4MTEiCiAgICAgICB3aWR0aD0iOTUuNDQyMzYiCiAgICAgICBoZWlnaHQ9Ijk1LjI4NzkyNiIKICAgICAgIHg9IjEzNi4xNTM4MiIKICAgICAgIHk9IjI3Ni45MTg3OSIKICAgICAgIHJ4PSIxMCIKICAgICAgIHJ5PSIxMCIKICAgICAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvZ2VyYWxkL2RldmVsL3dzd2ViL2ltYWdlL3dzaWNvbjI1Ni5wbmciCiAgICAgICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMjMwLjQxIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjIzMC40MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpibGFjaztzdHJva2Utd2lkdGg6NC4yOTcyMzY5MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAxMzYuODgwNDUsMzQ3LjM2MjE4IEwgMTYwLjg4MDQ1LDM0Ny4zNjIxOCBDIDE2MC44ODA0NSwzNDcuMzYyMTggMTY0LjY2MzY1LDI5OS4xNzQ0OSAyMDYuNzMxODMsMjk4LjUxMDggQyAxOTMuMTYxNDYsMzE5Ljc0ODY4IDIwNS44ODA0NSwzNDcuMzYyMTggMjA1Ljg4MDQ1LDM0Ny4zNjIxOCBMIDIzMC44ODA0NSwzNDcuMzYyMTgiCiAgICAgICBpZD0icGF0aDEzMjgiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSIvaG9tZS9nZXJhbGQvZGV2ZWwvd3N3ZWIvaW1hZ2Uvd3NpY29uMjAwLnBuZyIKICAgICAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIxODAuMDA5OTkiCiAgICAgICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMTgwLjAwOTk5IiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMzMwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAxNDEsMjc3LjM2MjE4IEMgMTQ4LjQzMzU4LDI3NS44NDQ2NSAyMTcuNDEwMjEsMjc1LjM2MjE4IDIyNiwyNzcuMzYyMTggQyAyMzQuMDMxMzksMjc5LjIzMjE2IDIwNCwzMDUuMzYyMTggMTg0LDMwNS4zNjIxOCBDIDE2NCwzMDUuMzYyMTggMTMzLjQ1NzYzLDI3OC45MDE5MiAxNDEsMjc3LjM2MjE4IHogIgogICAgICAgaWQ9InJlY3QzMDcwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjenp6IiAvPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp3aGl0ZTtmaWxsLW9wYWNpdHk6MC4wMTA5Mjg5NDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NTcwNSIKICAgICAgIHdpZHRoPSIxIgogICAgICAgaGVpZ2h0PSIwIgogICAgICAgeD0iMTU3IgogICAgICAgeT0iMjg1LjM2MjE4IgogICAgICAgcng9IjguOTQ5NjkzNyIKICAgICAgIHJ5PSIwIiAvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"wireshark,capture,network,analyzer\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.wireshark.Wireshark.desktop\"\nLABEL oc.launch=\"wireshark.Wireshark\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"wireshark\"\nLABEL oc.displayname=\"wireshark (alpine)\"\nLABEL oc.path=\"/usr/bin/wireshark\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\"\nLABEL oc.fileextensions=\"cap,pcap\"\nLABEL oc.legacyfileextensions=\"cap\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"wireshark\"\nENV APPBIN \"/usr/bin/wireshark\"\nENV APP \"/usr/bin/wireshark\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/wireshark/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/wireshark/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application wireshark

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/wireshark.d\n
"},{"location":"applications/wireshark/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f wireshark.d -t wireshark .\n
"},{"location":"applications/wireshark/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect wireshark > wireshark.json\ndocker image save wireshark -o wireshark.tar\nctr -n k8s.io images import wireshark.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @wireshark.json\n\n
"},{"location":"applications/writer/","title":"writer","text":""},{"location":"applications/writer/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.libreoffice

"},{"location":"applications/writer/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/writer/#alpine-packages","title":"Alpine packages","text":"
libreoffice-gnome\n
"},{"location":"applications/writer/#arguments","title":"Arguments","text":"

\"--writer\"

"},{"location":"applications/writer/#displayname","title":"Displayname","text":"
Writer alpine\n
"},{"location":"applications/writer/#path","title":"Path","text":"
/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/writer/#uniquerunkey","title":"uniquerunkey","text":"

\"libreoffice\"

"},{"location":"applications/writer/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/writer/#mimetype","title":"Mimetype","text":"
application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\n
"},{"location":"applications/writer/#file-extensions","title":"File extensions","text":"

\"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\"

"},{"location":"applications/writer/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"odf;ott;fodt;uot\"

"},{"location":"applications/writer/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/writer/#wm_class","title":"WM_CLASS","text":"
libreoffice.libreoffice-writer\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/writer/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/libreoffice-writer.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/writer/#json-dump","title":"JSON dump","text":"

json source file writer.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_writer.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-writer\",\n    \"name\": \"writer\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"displayname\": \"Writer alpine\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"args\": \"--writer\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\",\n    \"legacyfileextensions\": \"odf;ott;fodt;uot\",\n    \"fileextensions\": \"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-writer.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/writer/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output writer.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/writer.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @writer.d.3.0.json\n\n
"},{"location":"applications/writer/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_writer.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSIzNDUiIHgyPSIzNDUiIHkxPSIxMTczIiB5Mj0iMTE3OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjEyNSAwIDAgMi4xMzc0IC03MDIuMTIgLTI0ODcuOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iMjI5LjUzIiB4Mj0iMjI5LjUzIiB5MT0iLTU4MS42NCIgeTI9Ii01NzguNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xMjUgMCAwIDIgLTQ0MC43NSAxMTgxLjMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2M2JiZWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYWFkY2Y3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9IjIxNy4yOSIgeDI9IjIxNy4yOSIgeTE9Ii03ODcuODQiIHkyPSItNzYzLjg0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTY4MyAwIDAgMi4zMjMzIC00MzguODcgMTgzMC42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAzNjlhMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwNDdmYzYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJnIiB4MT0iMzIuMDIiIHgyPSIzMi4wMiIgeTE9IjIuMDQzIiB5Mj0iNjIuMDQ1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkMmYzZmMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJmYWZlIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZjhmYyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDIuOTg4NmUtOCAtMS45MjY1ZS04IC0xIDgwLjQ1MyA0MC4xOTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImwiIHg9Ii0uMDU2MzY0IiB5PSItLjA2NDEzOCIgd2lkdGg9IjEuMTEyNyIgaGVpZ2h0PSIxLjEyODMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzc1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9InVybCgjZykiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbC1vcGFjaXR5PSIwIi8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZikiLz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMSkiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjI1Ij4KICA8cGF0aCBkPSJtMTYgMTd2M2gxMXYtM3ptMTQgMHYxNGgxOXYtN2MtMy0zLTUtNC05LjUtN3ptLTE0IDV2My4wNDc5bDExLTAuMDQ3OTR2LTMuMDQ3OXptMCA1djMuMDQ3OWwxMS0wLjA0Nzk0di0zLjA0Nzl6bTAgNnYzbDMzLTAuMDQ3OTR2LTN6bTAgNXYzbDMzLTAuMDQ3OTR2LTN6bTAgNXYzaDI0di0zeiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz4KICA8cGF0aCBkPSJtMzEgMThoOC41YzMuNSAwIDguNSA0IDguNSA2djZoLTE3eiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz4KICA8cGF0aCBkPSJtNDAuOTE3IDI3LjIxMi00LjkxNy02LjIxMjEtNSA3LjYwNjF2MS4zOTM5aDE3di0xLjM5MzlsLTMuNTQxMy00LjE4MTh6IiBjb2xvcj0iIzAwMDAwMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxKSI+CiAgPHBhdGggZD0ibTE2IDE3djNoMTF2LTN6bTE0IDB2MTRoMTl2LTdjLTMtMy01LTQtOS41LTd6bS0xNCA1djMuMDQ3OWwxMS0wLjA0Nzk0di0zLjA0Nzl6bTAgNXYzLjA0NzlsMTEtMC4wNDc5NHYtMy4wNDc5em0wIDZ2M2wzMy0wLjA0Nzk0di0zem0wIDV2M2wzMy0wLjA0Nzk0di0zem0wIDV2M2gyNHYtM3oiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2opIi8+CiAgPHBhdGggZD0ibTMxIDE4aDguNWMzLjUgMCA4LjUgNCA4LjUgNnY2aC0xN3oiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2kpIi8+CiAgPHBhdGggZD0ibTQwLjkxNyAyNy4yMTItNC45MTctNi4yMTIxLTUgNy42MDYxdjEuMzkzOWgxN3YtMS4zOTM5bC0zLjU0MTMtNC4xODE4eiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjaCkiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KIDxwYXRoIGQ9Im01Ni44OTYgMjkuODk2LTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAgMjIuNzkxIDIyLjc5MXoiIGZpbGw9InVybCgjZSkiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"writer,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-writer.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-writer\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--writer\"\nLABEL oc.name=\"writer\"\nLABEL oc.displayname=\"Writer alpine\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\"\nLABEL oc.fileextensions=\"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\"\nLABEL oc.legacyfileextensions=\"odf;ott;fodt;uot\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"writer\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--writer\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/writer/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/writer/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application writer

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/writer.d\n
"},{"location":"applications/writer/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f writer.d -t writer .\n
"},{"location":"applications/writer/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect writer > writer.json\ndocker image save writer -o writer.tar\nctr -n k8s.io images import writer.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @writer.json\n\n
"},{"location":"applications/xclock/","title":"xclock","text":""},{"location":"applications/xclock/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.minimal

"},{"location":"applications/xclock/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/xclock/#alpine-packages","title":"Alpine packages","text":"
xclock\n
"},{"location":"applications/xclock/#displayname","title":"Displayname","text":"
Xclock\n
"},{"location":"applications/xclock/#path","title":"Path","text":"
/usr/bin/xclock\n
"},{"location":"applications/xclock/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/xclock/#wm_class","title":"WM_CLASS","text":"
xclock.XClock\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/xclock/#json-dump","title":"JSON dump","text":"

json source file xclock.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"containerengine\": \"ephemeral_container\",\n    \"apkpackage\": \"xclock\",\n    \"icon\": \"xclock.svg\",\n    \"keyword\": \"clock,xclock,time\",\n    \"launch\": \"xclock.XClock\",\n    \"name\": \"xclock\",\n    \"displayname\": \"Xclock\",\n    \"path\": \"/usr/bin/xclock\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.minimal\",\n    \"args\": \"\",\n    \"quick\": true\n}\n
"},{"location":"applications/xclock/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output xclock.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xclock.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xclock.d.3.0.json\n\n
"},{"location":"applications/xclock/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update xclock\nLABEL oc.icon=\"xclock.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJhIiBjeD0iNjMuMTI1IiBjeT0iNjMuMjA4IiByPSI2My4yMDg1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9Ii45MjM4Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iMCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjMuMTI1IiBjeT0iNjMuMjA4IiByPSI2My4yMDgiIGZpbGw9InVybCgjYSkiIG9wYWNpdHk9Ii42MiIvPgogIDxjaXJjbGUgY3g9IjYyLjEyNSIgY3k9IjYxLjg3NSIgcj0iNjEuNjI1IiBmaWxsPSIjMEQzMTdEIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMjA5LjA5OTYiIHgyPSIyMDkuMDk5NiIgeTE9Ii0xMDYuMjEiIHkyPSItMjIzLjQ2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMWM3M2Q5Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNlNWY4ZmYiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjaXJjbGUgY3g9IjYxLjUiIGN5PSI2MS43NSIgcj0iNTkuMjUiIGZpbGw9InVybCgjYikiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIyMDYuOTEwMiIgeDI9IjIwNi45MTAyIiB5MT0iLTEwNy40MjY4IiB5Mj0iLTIxOS40ODIyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii41MTEiIHN0b3AtY29sb3I9IiMxZjdhZDQiLz4KICAgIDxzdG9wIG9mZnNldD0iLjU2NjMiIHN0b3AtY29sb3I9IiMyNTdlZDUiLz4KICAgIDxzdG9wIG9mZnNldD0iLjYzNzEiIHN0b3AtY29sb3I9IiMzNDg4ZDkiLz4KICAgIDxzdG9wIG9mZnNldD0iLjcxNjMiIHN0b3AtY29sb3I9IiM0Zjk4ZGUiLz4KICAgIDxzdG9wIG9mZnNldD0iLjgwMTciIHN0b3AtY29sb3I9IiM3M2IwZTYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjg5MTkiIHN0b3AtY29sb3I9IiNhMmNlZjEiLz4KICAgIDxzdG9wIG9mZnNldD0iLjk4NDkiIHN0b3AtY29sb3I9IiNkYmYyZmQiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2U1ZjhmZiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNjKSIgZD0iTTExMy44NyAzOS4xMDYgMTAzIDQwcy0zNi4yNTggNzctNDEuNjI1IDc3QzMwLjEwMiAxMTcgNC43NSA5MS42NDggNC43NSA2MC4zNzVTMzAuMTAyIDMuNzUgNjEuMzc1IDMuNzVjMjMuNzUxIDAgNDQuMDg3IDE0LjYyMyA1Mi40OTUgMzUuMzU2eiIvPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjIwOS40MzI2IiBjeT0iLTE2NS4xMjYiIHI9IjUzLjAwMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iLjk1MDUiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzI0NTBhMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjEuODMzIiBjeT0iNjIuMTY2IiByPSI1My4wMDEiIGZpbGw9InVybCgjZCkiLz4KICA8Y2lyY2xlIGN4PSI2MS42MjUiIGN5PSI2MS44NzUiIHI9IjUxLjM3NSIgZmlsbD0iI0EyRDJGRiIvPgogIDxkZWZzPgogICAgPGNpcmNsZSBpZD0iZSIgY3g9IjYxLjYyNSIgY3k9IjYxLjg3NSIgcj0iNTEuMzc1Ii8+CiAgPC9kZWZzPgogIDxjbGlwUGF0aCBpZD0iZyI+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNlIiBvdmVyZmxvdz0idmlzaWJsZSIvPgogIDwvY2xpcFBhdGg+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMjA5LjIyNDYiIHgyPSIyMDkuMjI0NiIgeTE9Ii0xMTYuMjEiIHkyPSItMjE3LjIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4xNDc4IiBzdG9wLWNvbG9yPSIjZTFmMWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4yMzYzIiBzdG9wLWNvbG9yPSIjZDRlYmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4zNTA1IiBzdG9wLWNvbG9yPSIjZTNmMmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii41MjY0IiBzdG9wLWNvbG9yPSIjZjNmOWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii43MjYyIiBzdG9wLWNvbG9yPSIjZmNmZWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmYiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjaXJjbGUgY3g9IjYxLjYyNSIgY3k9IjYzLjg3NSIgcj0iNTEuMzc1IiBmaWxsPSJ1cmwoI2YpIiBjbGlwLXBhdGg9InVybCgjZykiLz4KICA8ZGVmcz4KICAgIDxjaXJjbGUgaWQ9ImgiIGN4PSI2MS42MjUiIGN5PSI2MS44NzUiIHI9IjUxLjM3NSIvPgogIDwvZGVmcz4KICA8Y2xpcFBhdGggaWQ9ImoiPgogICAgPHVzZSB4bGluazpocmVmPSIjaCIgb3ZlcmZsb3c9InZpc2libGUiLz4KICA8L2NsaXBQYXRoPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjIwNi42NDA2IiB4Mj0iMjA2LjY0MDYiIHkxPSItMTE2LjIxIiB5Mj0iLTIxNy4yMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMTQzNSIgc3RvcC1jb2xvcj0iI2VkZjdmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMjgwMiIgc3RvcC1jb2xvcj0iI2UwZjJmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMzA2MyIgc3RvcC1jb2xvcj0iI2UzZjNmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNDk0MiIgc3RvcC1jb2xvcj0iI2YzZmFmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNzA3NiIgc3RvcC1jb2xvcj0iI2ZjZmVmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2kpIiBkPSJNMTA3LjgzMyA0MS45MTcgNjMuNSA2Mi41bC0xLjg3NSA1Mi43NWMtMjguMzczIDAtNTEuMzc1LTIzLjAwMS01MS4zNzUtNTEuMzc1UzMzLjI1MiAxMi41IDYxLjYyNSAxMi41YzIwLjkyOCAwIDM4LjE5NyAxMS40NjUgNDYuMjA4IDI5LjQxN3oiIGNsaXAtcGF0aD0idXJsKCNqKSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iayIgeDE9IjIxOC40NzY2IiB4Mj0iMjE4LjQ3NjYiIHkxPSItMTIwLjM1MzUiIHkyPSItMTk2LjcxNTIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNrKSIgZD0iTTcwLjg3NyAxOS4xNjhjLS42MiAwLTEuMTI2LS41MDYtMS4xMjYtMS4xMjZzLjUwNi0xLjEyNiAxLjEyNi0xLjEyNmMuNjE5IDAgMS4xMjYuNTA2IDEuMTI2IDEuMTI2cy0uNTA3IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibCIgeDE9IjIxMy42NDI2IiB4Mj0iMjEzLjY0MjYiIHkxPSItMTIwLjI0OCIgeTI9Ii0xOTYuNDc3MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2wpIiBkPSJNNjYuMDQ0IDE4LjU4MmMtLjYyMSAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjMgMC0uNjIxLjUwNC0xLjEyNSAxLjEyNS0xLjEyNS42MTkgMCAxLjEyMy41MDQgMS4xMjMgMS4xMjUgMCAuNjE5LS41MDQgMS4xMjMtMS4xMjMgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJtIiB4MT0iMjIzLjA1ODYiIHgyPSIyMjMuMDU4NiIgeTE9Ii0xMjAuNTg2OSIgeTI9Ii0xOTYuOTgxNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI20pIiBkPSJNNzUuNDYgMjAuNDZjLS42MiAwLTEuMTI3LS41MDYtMS4xMjctMS4xMjZzLjUwNy0xLjEyNiAxLjEyNy0xLjEyNmMuNjE5IDAgMS4xMjYuNTA3IDEuMTI2IDEuMTI2IDAgLjYyLS41MDcgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJuIiB4MT0iMjI3LjIyNjYiIHgyPSIyMjcuMjI2NiIgeTE9Ii0xMjAuODgxOCIgeTI9Ii0xOTcuMjQzNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI24pIiBkPSJNNzkuNjI4IDIyLjA4NGMtLjYyIDAtMS4xMjctLjUwNS0xLjEyNy0xLjEyNXMuNTA3LTEuMTI3IDEuMTI3LTEuMTI3IDEuMTI1LjUwNyAxLjEyNSAxLjEyNy0uNTA1IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibyIgeDE9IjIzNS41MTg2IiB4Mj0iMjM1LjUxODYiIHkxPSItMTIxLjcxNzgiIHkyPSItMTk4LjAxMzMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNvKSIgZD0iTTg3LjkxOSAyNi42NjdjLS42MiAwLTEuMTI2LS41MDUtMS4xMjYtMS4xMjYgMC0uNjE5LjUwNi0xLjEyNCAxLjEyNi0xLjEyNC42MjEgMCAxLjEyNi41MDUgMS4xMjYgMS4xMjQgMCAuNjIxLS41MDUgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJwIiB4MT0iMjQyLjYwMTYiIHgyPSIyNDIuNjAxNiIgeTE9Ii0xMjIuODkyNiIgeTI9Ii0xOTkuMTg4MSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3ApIiBkPSJNOTUuMDAyIDMzLjEyNmMtLjYxOSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjUgMC0uNjIuNTA2LTEuMTI1IDEuMTI1LTEuMTI1czEuMTI1LjUwNSAxLjEyNSAxLjEyNWMwIC42MTktLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InEiIHgxPSIyNDUuNTYwNSIgeDI9IjI0NS41NjA1IiB5MT0iLTEyMy41NTU3IiB5Mj0iLTE5OS44Njc3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjcSkiIGQ9Ik05Ny45NiAzNi43OTJjLS42MTkgMC0xLjEyNS0uNTA2LTEuMTI1LTEuMTI1IDAtLjYyLjUwNi0xLjEyNSAxLjEyNS0xLjEyNS42MiAwIDEuMTI2LjUwNiAxLjEyNiAxLjEyNSAwIC42Mi0uNTA2IDEuMTI1LTEuMTI2IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iciIgeDE9IjI1MC40MzY1IiB4Mj0iMjUwLjQzNjUiIHkxPSItMTI1LjA4MTEiIHkyPSItMjAxLjM3NjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNyKSIgZD0iTTEwMi44MzYgNDUuMTY3Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI0IDAtLjYyMi41MDQtMS4xMjYgMS4xMjQtMS4xMjYuNjIxIDAgMS4xMjYuNTA0IDEuMTI2IDEuMTI2IDAgLjYyLS41MDUgMS4xMjQtMS4xMjYgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJzIiB4MT0iMjUyLjE0MzYiIHgyPSIyNTIuMTQzNiIgeTE9Ii0xMjUuODcwMSIgeTI9Ii0yMDIuMTE1OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3MpIiBkPSJNMTA0LjU0NSA0OS40MTdjLS42MjIgMC0xLjEyNi0uNTA0LTEuMTI2LTEuMTI1IDAtLjYyLjUwNC0xLjEyNCAxLjEyNi0xLjEyNC42MiAwIDEuMTI0LjUwNCAxLjEyNCAxLjEyNHMtLjUwNCAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InQiIHgxPSIyNTMuMTQzNiIgeDI9IjI1My4xNDM2IiB5MT0iLTEyNi42MjExIiB5Mj0iLTIwMi45NDk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjdCkiIGQ9Ik0xMDUuNTQ1IDUzLjcwOGMtLjYyMiAwLTEuMTI2LS41MDQtMS4xMjYtMS4xMjUgMC0uNjIyLjUwNC0xLjEyNiAxLjEyNi0xLjEyNi42MiAwIDEuMTI0LjUwNCAxLjEyNCAxLjEyNiAwIC42MjEtLjUwNCAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InUiIHgxPSIyNTQuMTAxNiIgeDI9IjI1NC4xMDE2IiB5MT0iLTEyNy41MzUyIiB5Mj0iLTIwMy43OTc1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjdSkiIGQ9Ik0xMDYuNTAzIDU4LjU4M2MtLjYyMiAwLTEuMTI3LS41MDQtMS4xMjctMS4xMjVzLjUwNS0xLjEyNSAxLjEyNy0xLjEyNWMuNjIgMCAxLjEyNC41MDQgMS4xMjQgMS4xMjVzLS41MDQgMS4xMjUtMS4xMjQgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJ2IiB4MT0iMjU0LjAxOTUiIHgyPSIyNTQuMDE5NSIgeTE9Ii0xMjkuMjY2NiIgeTI9Ii0yMDUuNTI4OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3YpIiBkPSJNMTA2LjQyIDY4LjA4NGMtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA1LTEuMTI0IDEuMTI1LTEuMTI0IDEuMTI0LjUwNCAxLjEyNCAxLjEyNC0uNTA0IDEuMTI1LTEuMTI0IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0idyIgeDE9IjI1My4xODU1IiB4Mj0iMjUzLjE4NTUiIHkxPSItMTMwLjA3MDMiIHkyPSItMjA2LjM5ODgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCN3KSIgZD0iTTEwNS41ODUgNzIuNzFjLS42MiAwLTEuMTI0LS41MDUtMS4xMjQtMS4xMjcgMC0uNjIuNTA0LTEuMTI0IDEuMTI0LTEuMTI0LjYyMiAwIDEuMTI2LjUwNCAxLjEyNiAxLjEyNCAwIC42MjItLjUwNCAxLjEyNy0xLjEyNiAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IngiIHgxPSIyNTIuMDE5NSIgeDI9IjI1Mi4wMTk1IiB5MT0iLTEzMC45MzI2IiB5Mj0iLTIwNy4yNjExIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjeCkiIGQ9Ik0xMDQuNDE4IDc3LjQ2Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI2IDAtLjYyLjUwNC0xLjEyNSAxLjEyNC0xLjEyNS42MjIgMCAxLjEyNy41MDUgMS4xMjcgMS4xMjUgMCAuNjIyLS41MDUgMS4xMjYtMS4xMjcgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJ5IiB4MT0iMjUwLjAxOTUiIHgyPSIyNTAuMDE5NSIgeTE9Ii0xMzEuNzI0NiIgeTI9Ii0yMDguMDIwMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3kpIiBkPSJNMTAyLjQxOSA4MS43MDljLS42MiAwLTEuMTI0LS41MDQtMS4xMjQtMS4xMjQgMC0uNjIyLjUwNC0xLjEyNiAxLjEyNC0xLjEyNi42MjIgMCAxLjEyNi41MDQgMS4xMjYgMS4xMjYgMCAuNjItLjUwNCAxLjEyNC0xLjEyNiAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InoiIHgxPSIyNDUuNTU4NiIgeDI9IjI0NS41NTg2IiB5MT0iLTEzMy4yMTQ4IiB5Mj0iLTIwOS41NDM0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjeikiIGQ9Ik05Ny45NTkgOTAuMDQyYy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNXMuNTA2LTEuMTI2IDEuMTI1LTEuMTI2Yy42MiAwIDEuMTI2LjUwNyAxLjEyNiAxLjEyNnMtLjUwNiAxLjEyNS0xLjEyNiAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkEiIHgxPSIyNDIuNTE4NiIgeDI9IjI0Mi41MTg2IiB5MT0iLTEzMy45MDcyIiB5Mj0iLTIxMC4yMDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjQSkiIGQ9Ik05NC45MTkgOTMuNzA4Yy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNSAwLS42Mi41MDYtMS4xMjUgMS4xMjUtMS4xMjVzMS4xMjUuNTA1IDEuMTI1IDEuMTI1YzAgLjYxOS0uNTA2IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iQiIgeDE9IjIzOS4yMjg1IiB4Mj0iMjM5LjIyODUiIHkxPSItMTM0LjUwNDkiIHkyPSItMjEwLjgwMDQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNCKSIgZD0iTTkxLjYyOSA5N2MtLjYyIDAtMS4xMjYtLjUwNi0xLjEyNi0xLjEyNXMuNTA2LTEuMTI1IDEuMTI2LTEuMTI1Yy42MTkgMCAxLjEyNS41MDYgMS4xMjUgMS4xMjVTOTIuMjQ4IDk3IDkxLjYyOSA5N3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkMiIHgxPSIyMzUuNjAzNSIgeDI9IjIzNS42MDM1IiB5MT0iLTEzNS4wODY5IiB5Mj0iLTIxMS4zNDkyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjQykiIGQ9Ik04OC4wMDIgMTAwLjA0Yy0uNjE5IDAtMS4xMjMtLjUwNC0xLjEyMy0xLjEyMyAwLS42Mi41MDQtMS4xMjYgMS4xMjMtMS4xMjYuNjIgMCAxLjEyNi41MDYgMS4xMjYgMS4xMjYgMCAuNjE5LS41MDYgMS4xMjMtMS4xMjYgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJEIiB4MT0iMjI3LjE0MjYiIHgyPSIyMjcuMTQyNiIgeTE9Ii0xMzUuODc3IiB5Mj0iLTIxMi4yMDU2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjRCkiIGQ9Ik03OS41NDUgMTA0LjcwOWMtLjYyMiAwLTEuMTI3LS41MDUtMS4xMjctMS4xMjcgMC0uNjE5LjUwNS0xLjEyNCAxLjEyNy0xLjEyNC42MTkgMCAxLjEyNC41MDUgMS4xMjQgMS4xMjQgMCAuNjIyLS41MDUgMS4xMjctMS4xMjQgMS4xMjd6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJFIiB4MT0iMjIyLjk3NjYiIHgyPSIyMjIuOTc2NiIgeTE9Ii0xMzYuMjE2OCIgeTI9Ii0yMTIuNTQ1NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI0UpIiBkPSJNNzUuMzc3IDEwNi41ODRjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjcgMC0uNjIuNTA1LTEuMTI0IDEuMTI1LTEuMTI0czEuMTI0LjUwNCAxLjEyNCAxLjEyNGMwIC42MjItLjUwNCAxLjEyNy0xLjEyNCAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkYiIHgxPSIyMTguMTg0NiIgeDI9IjIxOC4xODQ2IiB5MT0iLTEzNi40Njk3IiB5Mj0iLTIxMi43MzIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNGKSIgZD0iTTcwLjU4NSAxMDcuNjI1Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI0cy41MDQtMS4xMjUgMS4xMjQtMS4xMjUgMS4xMjQuNTA1IDEuMTI0IDEuMTI1LS41MDQgMS4xMjQtMS4xMjQgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJHIiB4MT0iMjEzLjY4NTUiIHgyPSIyMTMuNjg1NSIgeTE9Ii0xMzYuNjM2NyIgeTI9Ii0yMTIuODk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjRykiIGQ9Ik02Ni4wODYgMTA4LjU0MmMtLjYyIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNSAwLS42Mi41MDUtMS4xMjQgMS4xMjUtMS4xMjRzMS4xMjQuNTA0IDEuMTI0IDEuMTI0YzAgLjYyMS0uNTA0IDEuMTI1LTEuMTI0IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iSCIgeDE9IjE5OS4xNDE2IiB4Mj0iMTk5LjE0MTYiIHkxPSItMTIwLjM1MzUiIHkyPSItMTk2LjY2NTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNIKSIgZD0iTTUxLjU0MiAxOS4xNjdjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjVzLjUwNS0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNS41MDUgMS4xMjUgMS4xMjUtLjUwNCAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkkiIHgxPSIyMDMuOTc0NiIgeDI9IjIwMy45NzQ2IiB5MT0iLTEyMC4yNDgiIHkyPSItMTk2LjQ3NzIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNJKSIgZD0iTTU2LjM3NiAxOC41ODJjLS42MjEgMC0xLjEyNi0uNTAzLTEuMTI2LTEuMTI0cy41MDUtMS4xMjQgMS4xMjYtMS4xMjQgMS4xMjQuNTAzIDEuMTI0IDEuMTI0LS41MDMgMS4xMjQtMS4xMjQgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJKIiB4MT0iMTk0LjU1ODYiIHgyPSIxOTQuNTU4NiIgeTE9Ii0xMjAuNTg5OCIgeTI9Ii0xOTYuODUyMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI0opIiBkPSJNNDYuOTU5IDIwLjQ1OGMtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA0LTEuMTI1IDEuMTI1LTEuMTI1Yy42MiAwIDEuMTI1LjUwNSAxLjEyNSAxLjEyNXMtLjUwNSAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IksiIHgxPSIxOTAuMzkyNiIgeDI9IjE5MC4zOTI2IiB5MT0iLTEyMC44ODQ4IiB5Mj0iLTE5Ny4xODAzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjSykiIGQ9Ik00Mi43OTIgMjIuMDg0Yy0uNjE5IDAtMS4xMjQtLjUwNS0xLjEyNC0xLjEyNiAwLS42Mi41MDQtMS4xMjQgMS4xMjQtMS4xMjQuNjIyIDAgMS4xMjYuNTA0IDEuMTI2IDEuMTI0IDAgLjYyMS0uNTA1IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iTCIgeDE9IjE4Mi4wOTk2IiB4Mj0iMTgyLjA5OTYiIHkxPSItMTIxLjcxNjgiIHkyPSItMTk4LjAxMjMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNMKSIgZD0iTTM0LjUgMjYuNjY3Yy0uNjIxIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNXMuNTA0LTEuMTI1IDEuMTI1LTEuMTI1IDEuMTI1LjUwNCAxLjEyNSAxLjEyNS0uNTA0IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iTSIgeDE9IjE3NS4wMTU2IiB4Mj0iMTc1LjAxNTYiIHkxPSItMTIyLjg4MzgiIHkyPSItMTk5LjIyODkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNNKSIgZD0iTTI3LjQxNyAzMy4xMjZjLS42MjEgMC0xLjEyNi0uNTA2LTEuMTI2LTEuMTI2IDAtLjYyMS41MDYtMS4xMjUgMS4xMjYtMS4xMjVzMS4xMjUuNTA0IDEuMTI1IDEuMTI1LS41MDQgMS4xMjYtMS4xMjUgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJOIiB4MT0iMTc4LjU3ODEiIHgyPSIxNzguNTc4MSIgeTE9Ii0xMjIuMjYzMiIgeTI9Ii0xOTguNTkxOCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI04pIiBkPSJNMzAuOTc5IDI5LjY4OWMtLjYyMSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjZzLjUwNC0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNC41MDQgMS4xMjQgMS4xMjUtLjUwMyAxLjEyNi0xLjEyNCAxLjEyNnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9Ik8iIHgxPSIxNzIuMDU3NiIgeDI9IjE3Mi4wNTc2IiB5MT0iLTEyMy41NTQ3IiB5Mj0iLTE5OS44NjY3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjTykiIGQ9Ik0yNC40NTcgMzYuNzkyYy0uNjE5IDAtMS4xMjMtLjUwNC0xLjEyMy0xLjEyNXMuNTA0LTEuMTI1IDEuMTIzLTEuMTI1Yy42MjEgMCAxLjEyNS41MDQgMS4xMjUgMS4xMjVzLS41MDQgMS4xMjUtMS4xMjUgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJQIiB4MT0iMTY3LjE4MzYiIHgyPSIxNjcuMTgzNiIgeTE9Ii0xMjUuMDc3MSIgeTI9Ii0yMDEuMzg5MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1ApIiBkPSJNMTkuNTgzIDQ1LjE2N2MtLjYyIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNiAwLS42Mi41MDUtMS4xMjUgMS4xMjUtMS4xMjUuNjIyIDAgMS4xMjYuNTA1IDEuMTI2IDEuMTI1LS4wMDEuNjIyLS41MDUgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJRIiB4MT0iMTY1LjQ3NDYiIHgyPSIxNjUuNDc0NiIgeTE9Ii0xMjUuODU5NCIgeTI9Ii0yMDIuMTM4MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1EpIiBkPSJNMTcuODc1IDQ5LjQxN2MtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA1LTEuMTI1IDEuMTI1LTEuMTI1UzE5IDQ3LjY3MiAxOSA0OC4yOTJjLS4wMDEuNjItLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlIiIHgxPSIxNjQuNDc0NiIgeDI9IjE2NC40NzQ2IiB5MT0iLTEyNi42NTMzIiB5Mj0iLTIwMi44OTkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNSKSIgZD0iTTE2Ljg3NSA1My43MDhjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjVzLjUwNS0xLjEyMyAxLjEyNS0xLjEyMyAxLjEyNC41MDMgMS4xMjQgMS4xMjMtLjUwMyAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlMiIHgxPSIxNjMuNTE2NiIgeDI9IjE2My41MTY2IiB5MT0iLTEyNy41MjA1IiB5Mj0iLTIwMy44MTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNTKSIgZD0iTTE1LjkxNyA1OC41ODRjLS42MjEgMC0xLjEyNC0uNTA2LTEuMTI0LTEuMTI2IDAtLjYyMS41MDMtMS4xMjQgMS4xMjQtMS4xMjRzMS4xMjQuNTAzIDEuMTI0IDEuMTI0YzAgLjYyLS41MDQgMS4xMjYtMS4xMjQgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJUIiB4MT0iMTYzLjU5OTYiIHgyPSIxNjMuNTk5NiIgeTE9Ii0xMjkuMjY1NiIgeTI9Ii0yMDUuNTI3OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1QpIiBkPSJNMTYgNjguMDgzYy0uNjE5IDAtMS4xMjQtLjUwNS0xLjEyNC0xLjEyNCAwLS42MjEuNTA0LTEuMTI1IDEuMTI0LTEuMTI1LjYyMSAwIDEuMTI1LjUwNCAxLjEyNSAxLjEyNSAwIC42MTktLjUwNCAxLjEyNC0xLjEyNSAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlUiIHgxPSIxNjQuNDMyNiIgeDI9IjE2NC40MzI2IiB5MT0iLTEzMC4wNTA4IiB5Mj0iLTIwNi40MTI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjVSkiIGQ9Ik0xNi44MzMgNzIuNzExYy0uNjIgMC0xLjEyNi0uNTA3LTEuMTI2LTEuMTI2IDAtLjYyLjUwNi0xLjEyNiAxLjEyNi0xLjEyNnMxLjEyNi41MDYgMS4xMjYgMS4xMjZjMCAuNjE5LS41MDYgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJWIiB4MT0iMTY1LjU5OTYiIHgyPSIxNjUuNTk5NiIgeTE9Ii0xMzAuOTMyNiIgeTI9Ii0yMDcuMjYxMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1YpIiBkPSJNMTggNzcuNDZjLS42MiAwLTEuMTI3LS41MDctMS4xMjctMS4xMjcgMC0uNjE5LjUwNy0xLjEyNCAxLjEyNy0xLjEyNHMxLjEyNi41MDUgMS4xMjYgMS4xMjRjMCAuNjItLjUwNiAxLjEyNy0xLjEyNiAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlciIHgxPSIxNjcuNTk5NiIgeDI9IjE2Ny41OTk2IiB5MT0iLTEzMS43MjQ2IiB5Mj0iLTIwOC4wMjAxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjVykiIGQ9Ik0xOS45OTkgODEuNzA5Yy0uNjIgMC0xLjEyNS0uNTA0LTEuMTI1LTEuMTI1IDAtLjYyLjUwNS0xLjEyNSAxLjEyNS0xLjEyNS42MjEgMCAxLjEyNy41MDUgMS4xMjcgMS4xMjUgMCAuNjIxLS41MDYgMS4xMjUtMS4xMjcgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJYIiB4MT0iMTcyLjA1ODYiIHgyPSIxNzIuMDU4NiIgeTE9Ii0xMzMuMTg5NSIgeTI9Ii0yMDkuNTUxMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1gpIiBkPSJNMjQuNDU4IDkwLjA0M2MtLjYxOSAwLTEuMTI0LS41MDUtMS4xMjQtMS4xMjZzLjUwNS0xLjEyNiAxLjEyNC0xLjEyNmMuNjIxIDAgMS4xMjYuNTA1IDEuMTI2IDEuMTI2cy0uNTA1IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iWSIgeDE9IjE3NS4wOTk2IiB4Mj0iMTc1LjA5OTYiIHkxPSItMTMzLjg3OTkiIHkyPSItMjEwLjIwODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNZKSIgZD0iTTI3LjUgOTMuNzA4Yy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNSAwLS42MjEuNTA2LTEuMTI2IDEuMTI1LTEuMTI2czEuMTI1LjUwNSAxLjEyNSAxLjEyNmMwIC42MTktLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IloiIHgxPSIxNzguMzg5NiIgeDI9IjE3OC4zODk2IiB5MT0iLTEzNC41MDQ5IiB5Mj0iLTIxMC44MDA0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjWikiIGQ9Ik0zMC43OSA5N2MtLjYxOSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjVzLjUwNi0xLjEyNSAxLjEyNS0xLjEyNWMuNjIgMCAxLjEyNS41MDYgMS4xMjUgMS4xMjVTMzEuNDEgOTcgMzAuNzkgOTd6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhYSIgeDE9IjE4Mi4wMTU2IiB4Mj0iMTgyLjAxNTYiIHkxPSItMTM1LjA4NjkiIHkyPSItMjExLjM0OTIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhYSkiIGQ9Ik0zNC40MTcgMTAwLjA0Yy0uNjIgMC0xLjEyNS0uNTA0LTEuMTI1LTEuMTIzIDAtLjYyLjUwNi0xLjEyNiAxLjEyNS0xLjEyNnMxLjEyNC41MDYgMS4xMjQgMS4xMjZjMCAuNjE5LS41MDQgMS4xMjMtMS4xMjQgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhYiIgeDE9IjE5MC40NzQ2IiB4Mj0iMTkwLjQ3NDYiIHkxPSItMTM1Ljg3NyIgeTI9Ii0yMTIuMjA1NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FiKSIgZD0iTTQyLjg3NSAxMDQuNzA5Yy0uNjIgMC0xLjEyNC0uNTA1LTEuMTI0LTEuMTI3IDAtLjYxOS41MDQtMS4xMjQgMS4xMjQtMS4xMjRzMS4xMjQuNTA1IDEuMTI0IDEuMTI0YzAgLjYyMi0uNTA0IDEuMTI3LTEuMTI0IDEuMTI3eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYWMiIHgxPSIxOTQuNjQwNiIgeDI9IjE5NC42NDA2IiB5MT0iLTEzNi4yMTY4IiB5Mj0iLTIxMi41NDU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWMpIiBkPSJNNDcuMDQyIDEwNi41ODRjLS42MjIgMC0xLjEyNi0uNTA1LTEuMTI2LTEuMTI3IDAtLjYyLjUwNC0xLjEyNCAxLjEyNi0xLjEyNC42MiAwIDEuMTI1LjUwNCAxLjEyNSAxLjEyNCAwIC42MjItLjUwNCAxLjEyNy0xLjEyNSAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFkIiB4MT0iMTk5LjQzMzYiIHgyPSIxOTkuNDMzNiIgeTE9Ii0xMzYuNDY5NyIgeTI9Ii0yMTIuNzMyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWQpIiBkPSJNNTEuODM0IDEwNy42MjVjLS42MiAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjRzLjUwNC0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNS41MDUgMS4xMjUgMS4xMjUtLjUwNCAxLjEyNC0xLjEyNSAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFlIiB4MT0iMjAzLjkzMzYiIHgyPSIyMDMuOTMzNiIgeTE9Ii0xMzYuNjM2NyIgeTI9Ii0yMTIuODk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWUpIiBkPSJNNTYuMzM0IDEwOC41NDJjLS42MiAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjUgMC0uNjIuNTA0LTEuMTI0IDEuMTI1LTEuMTI0czEuMTI1LjUwNCAxLjEyNSAxLjEyNGMtLjAwMS42MjEtLjUwNSAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFmIiB4MT0iMjA5LjQ3NDYiIHgyPSIyMDkuNDc0NiIgeTE9Ii0xMTYuMjEiIHkyPSItMjEzLjIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWYpIiBkPSJNNjAuODc0IDExMS4yNXYtOC42MjZoMi4wMDF2OC42MjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhZyIgeDE9IjIwOS40NzM2IiB4Mj0iMjA5LjQ3MzYiIHkxPSItMTE1Ljc2MzciIHkyPSItMjE2LjUwMzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhZykiIGQ9Ik02MC44NzQgMjEuNDU4VjEyLjVoMnY4Ljk1OHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFoIiB4MT0iMjU0LjMwNzYiIHgyPSIyNTQuMzA3NiIgeTE9Ii0xMTYuMjEwNCIgeTI9Ii0yMTMuMjEwNCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FoKSIgZD0iTTEwMi4zOTUgNjMuMTA0di0yLjAwMWg4LjYyNnYyLjAwMXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFpIiB4MT0iMTY0LjY0MDYiIHgyPSIxNjQuNjQwNiIgeTE9Ii0xMTYuMjEwNCIgeTI9Ii0yMTMuMjEwNCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FpKSIgZD0iTTEyLjcyOCA2My4xMDR2LTJoOC42MjZ2MnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFqIiB4MT0iMjA5LjM4OTYiIHgyPSIyMDkuMzg5NSIgeTE9Ii0xMTUuNDYwNCIgeTI9Ii0yMTMuNzA5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FqKSIgZD0ibTI2LjM1OSA0Mi4zOTMuODY3LTEuNTE5LTcuNzU0LTQuNDM1LS44NjggMS41MTcuMzI2LjE4OCA3LjQyOSA0LjI0OXpNMzYuNDIzIDE5LjUzbC4xODkuMzI0IDQuMjgxIDcuNDA4IDEuNTE2LS44NzUtNC40NzItNy43MzItMS41MTQuODc1em0wIDg0Ljg0Mi4zMjQuMTg3IDEuMTk0LjY4MyA0LjQzNC03Ljc1Ny0xLjUxOS0uODY4LTQuNDMzIDcuNzU1ek0xOC42MzYgODUuOTA2bC4xODguMzI2LjY4NyAxLjE5IDcuNzM1LTQuNDc0LS44NzgtMS41MTQtNy43MzIgNC40NzJ6bTc4LjU4MS00My41MTQgNy43NTgtNC40MzQtLjg3MS0xLjUxOS03Ljc1NCA0LjQzNi4xODcuMzI1LjY4IDEuMTkyek04Mi42ODYgMjcuMjY1bDQuNDY5LTcuNzM3LTEuNTE4LS44NzQtNC40NjggNy43MzMuMzI0LjE5IDEuMTkzLjY4OHptLTEuNDg0IDcwLjIxOS4xODcuMzI2IDQuMjQ1IDcuNDMgMS41MjEtLjg2OC00LjQzNC03Ljc1Ny0xLjUxOS44Njl6bTE1LjEzLTE0LjUzNC4zMjIuMTg4IDcuNDA4IDQuMjg0Ljg4MS0xLjUxNy03LjczNy00LjQ3MS0uODc0IDEuNTE2eiIvPgogIDxwYXRoIGQ9Ik02MC42MTMgMzAuODc2di04LjIyOGgtLjY0OGMtLjE3NS4zNTQtLjQ3My43MTktLjg5NCAxLjA5Ni0uNDIxLjM3Ni0uOTEzLjY5Ny0xLjQ3Ni45NjF2Ljk3M2MuMzEzLS4xMTYuNjY2LS4yODkgMS4wNTktLjUyLjM5My0uMjMxLjcxMS0uNDYyLjk1My0uNjkzdjYuNDExaDEuMDA2em00LjI3MS0xLjUxMmMuMTcyLS4xODEuNTYtLjUyNCAxLjE2My0xLjAzMS43MjMtLjYxMSAxLjI0LTEuMDkyIDEuNTUxLTEuNDQyLjMxMi0uMzUuNTM0LS42ODQuNjY4LTEgLjEzNS0uMzE3LjIwMS0uNjM5LjIwMS0uOTY3IDAtLjY0NS0uMjI5LTEuMTg1LS42ODgtMS42MjEtLjQ1OC0uNDM2LTEuMDgtLjY1NC0xLjg2Ny0uNjU0LS43NzggMC0xLjM5OC4yMDItMS44NjEuNjA2LS40NjIuNDA1LS43MjkuOTkyLS43OTkgMS43NjRsMS4wMzQuMTA2Yy4wMDMtLjUxNS4xNTEtLjkxNy40NDEtMS4yMDguMjkxLS4yOTEuNjc4LS40MzYgMS4xNjMtLjQzNi40NTggMCAuODMuMTM3IDEuMTE0LjQxMS4yODUuMjc0LjQyOC42MS40MjggMS4wMDkgMCAuMzgtLjE1Ni43ODMtLjQ2OSAxLjIxLS4zMTMuNDI3LS45MTUgMS4wMDUtMS44MDYgMS43MzUtLjU3NC40Ny0xLjAxMy44ODMtMS4zMTYgMS4yNDEtLjMwNC4zNTctLjUyNS43MjEtLjY2MyAxLjA5LS4wODYuMjI0LS4xMjUuNDU3LS4xMTcuNjk5aDUuNDE3di0uOTY3aC00LjAxOWMuMTEyLS4xODIuMjU0LS4zNjQuNDI1LS41NDV6bTE3LjE1My4zOTJ2Ni40MTFoMS4wMDZ2LTguMjI4aC0uNjQ4Yy0uMTc2LjM1NC0uNDc0LjcxOS0uODk1IDEuMDk2LS40MjIuMzc2LS45MTMuNjk3LTEuNDc2Ljk2MXYuOTczYy4zMTMtLjExNi42NjYtLjI4OSAxLjA2LS41Mi4zOTMtLjIzMS43MTEtLjQ2Mi45NTMtLjY5M3ptMTQuMjYyIDE4LjA5aC00LjAyYy4xMTItLjE4My4yNTQtLjM2NC40MjYtLjU0NS4xNzEtLjE4MS41NTktLjUyNCAxLjE2Mi0xLjAzMS43MjMtLjYxMSAxLjI0LTEuMDkyIDEuNTUxLTEuNDQycy41MzQtLjY4NC42NjgtMWMuMTM1LS4zMTcuMjAxLS42MzkuMjAxLS45NjcgMC0uNjQ1LS4yMjktMS4xODUtLjY4OC0xLjYyMS0uNDU4LS40MzYtMS4wOC0uNjU0LTEuODY3LS42NTQtLjc3OCAwLTEuMzk4LjIwMi0xLjg2MS42MDYtLjQ2MS40MDUtLjcyOS45OTItLjc5OSAxLjc2NGwxLjAzNC4xMDZjLjAwMy0uNTE1LjE1MS0uOTE3LjQ0MS0xLjIwOHMuNjc5LS40MzYgMS4xNjMtLjQzNmMuNDU4IDAgLjgzLjEzNyAxLjExNS40MTEuMjg1LjI3NC40MjguNjEuNDI4IDEuMDA5IDAgLjM4LS4xNTcuNzgzLS40NzEgMS4yMS0uMzEzLjQyNy0uOTE0IDEuMDA1LTEuODA1IDEuNzM1LS41NzQuNDctMS4wMTMuODgzLTEuMzE2IDEuMjQxLS4zMDQuMzU3LS41MjUuNzIxLS42NjIgMS4wOS0uMDg2LjIyNC0uMTI1LjQ1Ny0uMTE3LjY5OWg1LjQxNnYtLjk2N3ptMy45MjIgMTQuMjQ3Yy0uMjctLjM1Mi0uNjQ2LS41ODQtMS4xMy0uNjk2LjM3Mi0uMTcxLjY1NC0uNDAyLjg0NS0uNjkzLjE4OS0uMjkxLjI4NS0uNjEzLjI4NS0uOTY3IDAtLjM3My0uMS0uNzI1LS4zLTEuMDU3LS4xOTktLjMzMi0uNDg3LS41OTMtLjg2My0uNzg1cy0uNzg4LS4yODgtMS4yMzUtLjI4OGMtLjY0OCAwLTEuMTkuMTg2LTEuNjI3LjU1Ni0uNDM2LjM3MS0uNzE1Ljg5NC0uODM4IDEuNTY4bDEuMDA2LjE3OWMuMDc0LS40OTIuMjQyLS44NjEuNTAzLTEuMTA3cy41ODctLjM2OS45NzktLjM2OWMuMzk1IDAgLjcxOC4xMjEuOTY3LjM2M3MuMzc0LjU0OC4zNzQuOTE3YzAgLjQ2Ni0uMTcxLjgxMS0uNTE0IDEuMDM0cy0uNzI5LjMzNS0xLjE1Ny4zMzVjLS4wNDEgMC0uMDk1LS4wMDQtLjE2Mi0uMDExbC0uMTEyLjg4M2MuMjgzLS4wNzQuNTIxLS4xMTEuNzExLS4xMTEuNDY1IDAgLjg1LjE1IDEuMTUuNDUuMzAzLjMuNDUzLjY4MS40NTMgMS4xNDMgMCAuNDg0LS4xNjIuODkxLS40ODggMS4yMTlzLS43MjcuNDkyLTEuMTk5LjQ5MmMtLjM5OCAwLS43MzctLjEyNy0xLjAxNS0uMzc4LS4yNzgtLjI1MS0uNDc1LS42NjItLjU5LTEuMjMybC0xLjAwNy4xMzRjLjA2OC42ODIuMzM5IDEuMjM4LjgxNCAxLjY2Ni40NzUuNDI5IDEuMDcyLjY0MyAxLjc5MS42NDMuNzk3IDAgMS40NTctLjI0OCAxLjk3OS0uNzQ2LjUyMS0uNDk3Ljc4My0xLjEwNC43ODMtMS44MTktLjAwMS0uNTMtLjEzNi0uOTcxLS40MDMtMS4zMjN6bS00LjgyNSAxNC4wMDRoLS44MjJsLTMuNzM4IDUuMzExdi45MjJoMy41NTV2MS45NjJoMS4wMDZWODIuMzNoMS4xMDZ2LS45MjJoLTEuMTA2di01LjMxMXptLTEuMDA2IDUuMzFoLTIuNTY2bDIuNTY2LTMuNjk1djMuNjk1em0tMTIuNzg2IDkuMDM0Yy0uNTQgMC0xLjA1Ny4xNzItMS41NDguNTE1bC40NDEtMi4yMDJoMy4yNzF2LS45NjFoLTQuMDc1bC0uNzk0IDQuMjA5Ljk0NS4xMjNjLjE0OC0uMjM1LjM1NC0uNDI2LjYxNC0uNTc0LjI2MS0uMTQ2LjU1NC0uMjIxLjg3OC0uMjIxLjUyMSAwIC45NDMuMTY2IDEuMjY2LjQ5OHMuNDgzLjc4NS40ODMgMS4zNThjMCAuNjA0LS4xNjcgMS4wODgtLjUwMyAxLjQ1M3MtLjc0NS41NDgtMS4yMjkuNTQ4Yy0uNDAyIDAtLjc0Ni0uMTI5LTEuMDMxLS4zODktLjI4NS0uMjU5LS40NjctLjY0Ni0uNTQ1LTEuMTZsLTEuMDU3LjA5Yy4wNjcuNjg5LjMzNyAxLjI0Mi44MDggMS42Ni40NzIuNDE4IDEuMDguNjI2IDEuODI1LjYyNi45MDkgMCAxLjYyNi0uMzMxIDIuMTUxLS45OTUuNDMzLS41NC42NDgtMS4xODIuNjQ4LTEuOTIyIDAtLjc3OS0uMjQ2LTEuNDE2LS43MzctMS45MTItLjQ5Mi0uNDk2LTEuMDk2LS43NDQtMS44MTEtLjc0NHptLTE4Ljk1OSA0LjI4NGMtLjM4NCAwLS43NTEuMDktMS4xMDEuMjY4LS4zNTEuMTgtLjY0Ni40NTMtLjg4OS44MjIuMDA3LS44Mi4xMDItMS40NTEuMjg1LTEuODk1cy40MzMtLjc4MS43NDktMS4wMTJjLjI0Mi0uMTguNTIzLS4yNjkuODQ0LS4yNjkuMzk4IDAgLjczNC4xNDQgMS4wMDYuNDMxLjE2NC4xNzguMjkxLjQ2NS4zOC44NmwxLjAwMS0uMDc4Yy0uMDgyLS42MzgtLjMzLTEuMTM3LS43NDEtMS40OTgtLjQxMi0uMzYxLS45NC0uNTQyLTEuNTg0LS41NDItLjg2NSAwLTEuNTUyLjMxMy0yLjA2My45MzktLjU4NS43MTktLjg3OCAxLjg3LS44NzggMy40NTMgMCAxLjQxNi4yNjUgMi40MzQuNzk0IDMuMDVzMS4yMTMuOTI1IDIuMDUxLjkyNWMuNDkyIDAgLjkzMi0uMTE3IDEuMzE5LS4zNTIuMzg3LS4yMzUuNjkxLS41NzMuOTE0LTEuMDE2LjIyMS0uNDQxLjMzMi0uOTE5LjMzMi0xLjQzNCAwLS43ODItLjIzNS0xLjQyLS43MDctMS45MTQtLjQ3MS0uNDkyLTEuMDQyLS43MzgtMS43MTItLjczOHptLjkzMyA0LjExM2MtLjMwNi4zNDQtLjY3MS41MTUtMS4wOTYuNTE1LS4yOTEgMC0uNTY4LS4wODMtLjgzMy0uMjQ5cy0uNDctLjQwNi0uNjE4LS43MjRjLS4xNDctLjMxNi0uMjIxLS42NDgtLjIyMS0uOTk1IDAtLjUyOS4xNTgtLjk1Ny40NzUtMS4yODMuMzE3LS4zMjUuNzAzLS40ODggMS4xNTctLjQ4OC40NTggMCAuODM4LjE2MyAxLjE0LjQ4OC4zMDIuMzI2LjQ1My43NzMuNDUzIDEuMzQuMDAxLjU4Ny0uMTUyIDEuMDU0LS40NTcgMS4zOTZ6TTQyLjM0OSA4OC4wMDRoNC4wMTRjLS41MTEuNTgyLS45OTIgMS4yOTYtMS40NDUgMi4xNDQtLjQ1My44NDgtLjggMS43MjgtMS4wNDIgMi42NDItLjI0My45MTItLjM2OSAxLjY5MS0uMzggMi4zMzZoMS4wMzRjLjA1Ni0uODE2LjE4NS0xLjU2Ni4zODYtMi4yNTIuMjc5LS45NzMuNjc1LTEuOTIgMS4xODgtMi44NC41MTMtLjkyIDEuMDI5LTEuNjU4IDEuNTUxLTIuMjE0di0uNzgySDQyLjM1di45NjZ6bS04Ljk1MS0xMC4wNTNjLjQwNi0uMTUyLjcwOS0uMzY5LjkwOC0uNjVzLjI5OS0uNjEyLjI5OS0uOTkyYzAtLjU5Ni0uMjE4LTEuMTAyLS42NTQtMS41MThzLTEuMDEyLS42MjMtMS43MjctLjYyM2MtLjcxMiAwLTEuMjgyLjIwMy0xLjcxLjYwOXMtLjY0My45MDctLjY0MyAxLjUwNGMwIC4zOTUuMTAxLjczMy4zMDIgMS4wMTdzLjUxLjUwMS45MjguNjUzYy0uNS4xMzEtLjg4NC4zNzYtMS4xNTQuNzM2LS4yNy4zNTktLjQwNS44MDUtLjQwNSAxLjMzOCAwIC43MTYuMjQ4IDEuMzEzLjc0NCAxLjc5MS40OTYuNDc5IDEuMTQ3LjcxOSAxLjk1Ni43MTlzMS40NjEtLjIzOCAxLjk1Ny0uNzE1Yy40OTYtLjQ3OC43NDMtMS4wNjYuNzQzLTEuNzY3IDAtLjUwNy0uMTMxLS45NDItLjM5NC0xLjMwOHMtLjY0Ny0uNjMtMS4xNS0uNzk0ek0zMC45IDc2LjI0N2MwLS4zNDMuMTI2LS42MzguMzgtLjg4NHMuNTcyLS4zNjguOTU2LS4zNjhjLjM4IDAgLjY5OC4xMjYuOTUzLjM3N3MuMzgzLjU2Mi4zODMuOTMxYzAgLjM1NC0uMTI0LjY1My0uMzcyLjg5N3MtLjU2NS4zNjYtLjk1My4zNjZjLS4zOTkgMC0uNzIzLS4xMjMtLjk3My0uMzY5cy0uMzc0LS41NjItLjM3NC0uOTV6bTIuNTQzIDQuOTk3Yy0uMzEzLjMwOS0uNzA5LjQ2NC0xLjE5LjQ2NC0uMzA5IDAtLjU5OC0uMDczLS44NjYtLjIyMS0uMjY5LS4xNDctLjQ3MS0uMzU0LS42MDYtLjYyNC0uMTM2LS4yNjgtLjIwNC0uNTQ1LS4yMDQtLjgzMiAwLS40Ny4xNTUtLjg2MS40NjctMS4xNzQuMzExLS4zMTMuNzAzLS40NyAxLjE3Ni0uNDcuNDg0IDAgLjg4OC4xNTkgMS4yMS40NzZzLjQ4My43MTcuNDgzIDEuMjAxYzAgLjQ3Ny0uMTU3Ljg3MS0uNDcgMS4xOHpNMzAuNjcgNjEuNTY5YzAtMS4wMDYtLjExNC0xLjc3NS0uMzQ0LTIuMzA2LS4yMjktLjUzMS0uNTY0LS45NC0xLjAwNi0xLjIyNy0uNDQyLS4yODctLjkyOS0uNDMxLTEuNDYyLS40MzEtLjczOCAwLTEuMzUyLjI1My0xLjg0Mi43NnMtLjczNSAxLjE3Ni0uNzM1IDIuMDA3YzAgLjgwNS4yMzUgMS40NTMuNzA0IDEuOTQ1LjQ3LjQ5MiAxLjA0My43MzggMS43MjIuNzM4LjQwNiAwIC43ODQtLjEgMS4xMzItLjI5OS4zNDktLjE5OS42MjQtLjQ1OS44MjUtLjc4LjAwMy4wODkuMDA1LjE1Ny4wMDUuMjAxIDAgLjQxNy0uMDUuODI4LS4xNTEgMS4yM3MtLjIyNi43MjItLjM3NS45NThjLS4xNDkuMjM3LS4zNC40MjYtLjU3My41NjctLjIzMy4xNDMtLjUwNC4yMTMtLjgxMy4yMTMtLjM2MSAwLS42NTgtLjEwMy0uODg5LS4zMDgtLjIzMS0uMjA0LS4zODgtLjUzNS0uNDY5LS45ODlsLS45NjcuMDg5Yy4wODIuNjQ1LjMyNiAxLjE0NS43MzIgMS41LjQwNi4zNTYuOTMuNTM0IDEuNTcuNTM0LjYwNCAwIDEuMTMtLjE2MiAxLjU3OS0uNDg2LjQ0OS0uMzI0Ljc4Ny0uNzk2IDEuMDE1LTEuNDE3LjIyOC0uNjE4LjM0Mi0xLjQ1Mi4zNDItMi40OTl6bS0xLjU2OC4xMDljLS4zLjMyNi0uNjgzLjQ4OS0xLjE0OC40ODktLjQ2MiAwLS44NTEtLjE2My0xLjE2Ni0uNDg5cy0uNDcyLS43NS0uNDcyLTEuMjcxYzAtLjU4Mi4xNjYtMS4wNTUuNDk4LTEuNDIuMzMyLS4zNjUuNzIxLS41NDggMS4xNjgtLjU0OC40MzIgMCAuODAyLjE2OSAxLjEwOS41MDkuMzA4LjMzOS40NjEuNzk3LjQ2MSAxLjM3NXMtLjE1IDEuMDI5LS40NSAxLjM1NXpNMzkuMTE1IDM5LjcyYy0uMjE2LS4zMzMtLjQ5LS41ODgtLjgyMS0uNzY2LS4zMzItLjE3Ny0uNzE4LS4yNjYtMS4xNTctLjI2Ni0uNTk2IDAtMS4wOTEuMTYxLTEuNDg0LjQ4MS0uMzk0LjMyLS42ODkuNzc2LS44ODkgMS4zNjctLjE5OS41OS0uMjk5IDEuMzctLjI5OSAyLjMzOSAwIDEuNTM5LjI3IDIuNjQ5LjgxMSAzLjMzMS40NTEuNTY2IDEuMDcxLjg1IDEuODYxLjg1LjYgMCAxLjA5Ni0uMTYxIDEuNDktLjQ4My4zOTMtLjMyMi42ODgtLjc3OS44ODYtMS4zNy4xOTctLjU5LjI5Ni0xLjM2Ny4yOTYtMi4zMjggMC0uODEzLS4wNjItMS40NTgtLjE4NS0xLjkzN3MtLjI5Mi0uODg0LS41MDktMS4yMTh6bS0uODEzIDUuODM5Yy0uMzE1LjQ0Ny0uNzA0LjY3MS0xLjE2Ni42NzFzLS44NTEtLjIyMy0xLjE2Ni0uNjY4LS40NzItMS4zNC0uNDcyLTIuNjg2LjE3My0yLjI2OC41Mi0yLjc2N2MuMjc2LS4zOTEuNjQ1LS41ODcgMS4xMDctLjU4Ny40NyAwIC44NjIuMjIyIDEuMTc3LjY2NS4zMTQuNDQ0LjQ3MiAxLjM0LjQ3MiAyLjY4OSAwIDEuMzQxLS4xNTcgMi4yMzUtLjQ3MiAyLjY4M3ptLTcuNDItNS4wNTN2Ni40MTFoMS4wMDZ2LTguMjI4aC0uNjQ4Yy0uMTc1LjM1NC0uNDczLjcxOS0uODk0IDEuMDk2LS40MjEuMzc2LS45MTMuNjk3LTEuNDc2Ljk2MXYuOTczYy4zMTMtLjExNi42NjYtLjI4OSAxLjA1OS0uNTIuMzkzLS4yMzEuNzExLS40NjIuOTUzLS42OTN6bTEzLjM5NC0xMS4yNXY2LjQxMWgxLjAwNnYtOC4yMjhoLS42NDhjLS4xNzUuMzU0LS40NzMuNzE5LS44OTQgMS4wOTYtLjQyMS4zNzYtLjkxMy42OTctMS40NzYuOTYxdi45NzNjLjMxMy0uMTE2LjY2Ni0uMjg5IDEuMDU5LS41Mi4zOTMtLjIzMS43MTEtLjQ2Mi45NTMtLjY5M3ptNC45OC0uNzIxYy0uNDIxLjM3Ni0uOTEzLjY5Ny0xLjQ3Ni45NjF2Ljk3M2MuMzEzLS4xMTYuNjY2LS4yODkgMS4wNTktLjUyLjM5My0uMjMxLjcxMS0uNDYyLjk1My0uNjkzdjYuNDExaDEuMDA2di04LjIyOGgtLjY0OGMtLjE3NC4zNTQtLjQ3My43MTktLjg5NCAxLjA5NnoiLz4KICA8cGF0aCBmaWxsPSIjRkY4MDY1IiBkPSJNNjIuOTMgNTQuNjIyYy40OTMuOTg4LjA5MiAyLjE4OS0uODk2IDIuNjgzbC0yLjA4OCAxLjA0MmMtLjk4OC40OTMtMi4xODkuMDkyLTIuNjgzLS44OTZsLTUuMzU5LTEwLjczN2MtLjQ5My0uOTg4LS4wOTItMi4xODkuODk2LTIuNjgzbDIuMDg4LTEuMDQyYy45ODgtLjQ5MyAyLjE4OS0uMDkyIDIuNjgzLjg5Nmw1LjM1OSAxMC43Mzd6Ii8+CiAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRkY4MDY1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTYwLjM3NSA1Ni4zOTYgODQuMjUgMTA0Ljc1Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhayIgeDE9IjEyNi4yMzgzIiB4Mj0iMTI2LjIzODMiIHkxPSItMjA1LjQyMTkiIHkyPSItMjA3Ljk0MTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk3OTYgLS4yMDA4IC0uMjAwOCAtLjk3OTYgLTExMi4wMjkgLTExMy45ODA0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNTI0YWM5Ii8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4wOTU3IiBzdG9wLWNvbG9yPSIjNTg1NWJjIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4yMzUyIiBzdG9wLWNvbG9yPSIjNWQ2MGFmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4zNjgxIiBzdG9wLWNvbG9yPSIjNWY2NGFiIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii43MjUzIiBzdG9wLWNvbG9yPSIjMTkwYzdmIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FrKSIgZD0iTTY5LjAzMyA1OS45OTRjLjE4Ljg3OS0uMzg3IDEuNzM3LTEuMjY2IDEuOTE4bC0yOC41NiA1Ljg4Yy0uODc5LjE4MS0xLjczOC0uMzg3LTEuOTE4LTEuMjY3LS4xOC0uODc5LjM4Ni0xLjczOCAxLjI2NS0xLjkxOGwyOC41Ni01Ljg3OWMuODgtLjE4IDEuNzQuMzg2IDEuOTE5IDEuMjY2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYWwiIHgxPSItMTEzLjk1NzUiIHgyPSItMTEzLjk1NzUiIHkxPSItMTk4LjY2OTQiIHkyPSItMjAxLjg4NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjY1NTIgLS43NTU1IC0uNzU1NSAtLjY1NTIgLS45Nzc0IC0xNzAuNjU5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzUyNGFjOSIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMDk1NyIgc3RvcC1jb2xvcj0iIzU4NTViYyIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMjM1MiIgc3RvcC1jb2xvcj0iIzVkNjBhZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMzY4MSIgc3RvcC1jb2xvcj0iIzVmNjRhYiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNzI1MyIgc3RvcC1jb2xvcj0iIzE5MGM3ZiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhbCkiIGQ9Ik05My4zNzMgMjYuNjE5Yy40MTcuMzYyLjQ2My45OTMuMTAyIDEuNDFMNjAuMDE3IDY3LjE1MmMtLjM2Mi40MTgtLjk5NC40NjMtMS40MTEuMTAybC0uNzU1LS42NTZjLS40MTctLjM2MS0uNDYzLS45OTItLjEwMS0xLjQxbDMzLjQ1OC0zOS4xMjRjLjM2LS40MTguOTkzLS40NjIgMS40MDktLjEwMWwuNzU2LjY1NnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFtIiB4MT0iMjEwLjAwNTkiIHgyPSIyMTAuMDA1OSIgeTE9Ii0xNTkuOTYwNCIgeTI9Ii0xNjguMTQ3NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzhiYTRkNiIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMWIzZWE2Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8Y2lyY2xlIGN4PSI2Mi40MDYiIGN5PSI2MS4yODEiIHI9IjQuNDY5IiBmaWxsPSJ1cmwoI2FtKSIvPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYW4iIGN4PSIyMDguOTY0OCIgY3k9Ii0xNjAuMjUyIiByPSI3LjU2NTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjA1MTUiIHN0b3AtY29sb3I9IiNmNmZhZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjEzNjEiIHN0b3AtY29sb3I9IiNkZWYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjI0MzIiIHN0b3AtY29sb3I9IiNiNWQ5ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjM2ODgiIHN0b3AtY29sb3I9IiM3ZGJkZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjUwODEiIHN0b3AtY29sb3I9IiMzNjk5ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjU3MTQiIHN0b3AtY29sb3I9IiMxNDg3ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjgxMzIiIHN0b3AtY29sb3I9IiMwZjg1ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjk2NyIgc3RvcC1jb2xvcj0iIzMzOTdmZiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjIuMzY1IiBjeT0iNjEuMjkyIiByPSIzLjc1IiBmaWxsPSJ1cmwoI2FuKSIvPgo8L3N2Zz4=\"\nLABEL oc.keyword=\"xclock,clock,xclock,time\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xclock.XClock\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nLABEL oc.name=\"xclock\"\nLABEL oc.displayname=\"Xclock\"\nLABEL oc.path=\"/usr/bin/xclock\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xclock\"\nENV APPBIN \"/usr/bin/xclock\"\nENV APP \"/usr/bin/xclock\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xclock/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xclock/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application xclock

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xclock.d\n
"},{"location":"applications/xclock/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f xclock.d -t xclock .\n
"},{"location":"applications/xclock/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect xclock > xclock.json\ndocker image save xclock -o xclock.tar\nctr -n k8s.io images import xclock.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xclock.json\n\n
"},{"location":"applications/xedit/","title":"xedit","text":""},{"location":"applications/xedit/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.18.04

"},{"location":"applications/xedit/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/xedit/#ubuntu-packages","title":"Ubuntu packages","text":"
x11-apps x11-utils xbitmaps\n
"},{"location":"applications/xedit/#displayname","title":"Displayname","text":"
Xedit\n
"},{"location":"applications/xedit/#path","title":"Path","text":"
/usr/bin/xedit\n
"},{"location":"applications/xedit/#mimetype","title":"Mimetype","text":"
application/text;\n
"},{"location":"applications/xedit/#file-extensions","title":"File extensions","text":"

\"txt;log;md\"

"},{"location":"applications/xedit/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/xedit/#wm_class","title":"WM_CLASS","text":"
xedit.Xedit\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/xedit/#json-dump","title":"JSON dump","text":"

json source file xedit.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"containerengine\": \"ephemeral_container\",\n    \"debpackage\": \"x11-apps x11-utils xbitmaps\",\n    \"icon\": \"circle_xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.18.04\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\": \"txt;log;md\",\n    \"args\": \"\",\n    \"quick\": true\n}\n
"},{"location":"applications/xedit/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output xedit.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xedit.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xedit.d.3.0.json\n\n
"},{"location":"applications/xedit/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps x11-utils xbitmaps && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_xedit.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMC45NzMiIHgyPSIzNi45MzciIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTAyIDAgMCAxLjUwMzcgLTMuOTgyNyAtMy4zNDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyYTJjMmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDI0NjQ5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjMxOS4yMSIgeDI9IjY1Ny42NSIgeTE9IjIzNS4xNSIgeTI9IjI2OS40OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTMyMzUgMCAwIC4xMzA3NSAtMzIuMzc5IDEuMDg3MykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U1NGMxOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZWMzNTAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYsMCwwLDEuMzI3NiwtNTEwLjY0LC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgeD0iLS4wNDk4OTciIHk9Ii0uMDc1MjMyIiB3aWR0aD0iMS4wOTk4IiBoZWlnaHQ9IjEuMTUwNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MzU1MzYwOCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDU1MzE5IiB5PSItLjA2NTU2MyIgd2lkdGg9IjEuMTEwNiIgaGVpZ2h0PSIxLjEzMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTA2MjkxMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5LDAsMCwxLjQ5OTksLTU4MC44MSwtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5IDAgMCAxLjQ5OTkgLTU4MC44MSAtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPHJlY3QgeD0iNjQuOTY1IiB5PSIyOS43OTMiIHdpZHRoPSIuMDY3NDk1IiBoZWlnaHQ9IjAiIGZpbGw9IiMwMDBjZmYiIG9wYWNpdHk9Ii40MDc0MSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuMjU2MyI+CiAgPHBhdGggZD0ibTEyLjkzNCA1Mi45ODIgMTQuNzI0LTE5LjI3NC0xNS4xNTktMjEuMTkyIDkuNzQzMSAwLjAwODEgMTIuMDc5IDE2LjY2My0xOC4wNiAyMy43OTRoLTMuMzI3em0yOC44MTkgMC4wMTM2OC0xMS45OTUtMTYuNjkyIDE4LjIxMS0yMy44MDVoMy4yNDQ3bC0xNC43ODQgMTkuMzY0IDE1LjA2OCAyMS4xMzJ6Ii8+CiAgPHBhdGggZD0ibTMxLjk5NiAxOS44OTJjLTEuMTcxNCAwLTIuNDIyOSAwLjA4OTYtMy41NDk2IDAuMTk2NDYgMi4wMDcyIDIuNTg2MiAzLjY3MjYgNC43NzYyIDUuNTg5NCA3LjI2MzQtMS4wNzU4LTIuMjg3Mi0zLjI4NjktNC40ODA1LTIuNTIyNS01LjYwODQgMC43NTY2NS0xLjExNjYgMi4xNTA4LTAuOTI4NjIgMi4yNTctMC45Mjg2MiAyLjIzNTEgMCA0LjM4NjcgMC4yNDkzOSA2LjM5ODEgMC43MTA5NWwwLjQ3MTQ4LTAuNjQxNDljLTIuNjgyOC0wLjY4MjI4LTUuNTk2Ny0wLjk5MjIxLTguNjQzOS0wLjk5MjIxem0xMi4xMDYgMi4wODcyLTAuNDM0MjYgMC42MTI4OWM2LjE5NzIgMi4zOTc1IDEwLjM4OSA2Ljk3NjggMTAuMzg5IDEyLjIyNSAwIDcuNzI4MS05LjA4NzYgMTMuOTk4LTIwLjI4NiAxMy45OTgtMTEuMTk5IDAtMjAuMjktNi4yNzAzLTIwLjI5LTEzLjk5OCAxZS02IC00LjIwODUgMi42OTYxLTcuOTg2MiA2Ljk2MDYtMTAuNTU0bC0xLjMxMTEtMS45NzM1Yy02LjY4OTYgMi44MDIyLTExLjEzIDcuNzIwNy0xMS4xMyAxMy4zMiAwIDguNzEyMyAxMC43NSAxNS43OCAyMy45OTYgMTUuNzggMTMuMjQ3IDAgMjQtNy4wNjc1IDI0LTE1Ljc4IDAtNS44MDk2LTQuNzgwNy0xMC44OS0xMS44OTUtMTMuNjMxeiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIHN0cm9rZS13aWR0aD0iMS4yNTYzIj4KICA8cGF0aCBkPSJtMTIuOTM0IDUyLjk4MiAxNC43MjQtMTkuMjc0LTE1LjE1OS0yMS4xOTIgOS43NDMxIDAuMDA4MSAxMi4wNzkgMTYuNjYzLTE4LjA2IDIzLjc5NGgtMy4zMjd6bTI4LjgxOSAwLjAxMzY4LTExLjk5NS0xNi42OTIgMTguMjExLTIzLjgwNWgzLjI0NDdsLTE0Ljc4NCAxOS4zNjQgMTUuMDY4IDIxLjEzMnoiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzEuOTk2IDE5Ljg5MmMtMS4xNzE0IDAtMi40MjI5IDAuMDg5Ni0zLjU0OTYgMC4xOTY0NiAyLjAwNzIgMi41ODYyIDMuNjcyNiA0Ljc3NjIgNS41ODk0IDcuMjYzNC0xLjA3NTgtMi4yODcyLTMuMjg2OS00LjQ4MDUtMi41MjI1LTUuNjA4NCAwLjc1NjY1LTEuMTE2NiAyLjE1MDgtMC45Mjg2MiAyLjI1Ny0wLjkyODYyIDIuMjM1MSAwIDQuMzg2NyAwLjI0OTM5IDYuMzk4MSAwLjcxMDk1bDAuNDcxNDgtMC42NDE0OWMtMi42ODI4LTAuNjgyMjgtNS41OTY3LTAuOTkyMjEtOC42NDM5LTAuOTkyMjF6bTEyLjEwNiAyLjA4NzItMC40MzQyNiAwLjYxMjg5YzYuMTk3MiAyLjM5NzUgMTAuMzg5IDYuOTc2OCAxMC4zODkgMTIuMjI1IDAgNy43MjgxLTkuMDg3NiAxMy45OTgtMjAuMjg2IDEzLjk5OC0xMS4xOTkgMC0yMC4yOS02LjI3MDMtMjAuMjktMTMuOTk4IDFlLTYgLTQuMjA4NSAyLjY5NjEtNy45ODYyIDYuOTYwNi0xMC41NTRsLTEuMzExMS0xLjk3MzVjLTYuNjg5NiAyLjgwMjItMTEuMTMgNy43MjA3LTExLjEzIDEzLjMyIDAgOC43MTIzIDEwLjc1IDE1Ljc4IDIzLjk5NiAxNS43OCAxMy4yNDcgMCAyNC03LjA2NzUgMjQtMTUuNzggMC01LjgwOTYtNC43ODA3LTEwLjg5LTExLjg5NS0xMy42MzF6IiBmaWxsPSJ1cmwoI2EpIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xedit,text,notepad,edit,txt,editor,xedit\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xedit.Xedit\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.18.04\"\nLABEL oc.name=\"xedit\"\nLABEL oc.displayname=\"Xedit\"\nLABEL oc.path=\"/usr/bin/xedit\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/text;\"\nLABEL oc.fileextensions=\"txt;log;md\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xedit\"\nENV APPBIN \"/usr/bin/xedit\"\nENV APP \"/usr/bin/xedit\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xedit/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xedit/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application xedit

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xedit.d\n
"},{"location":"applications/xedit/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f xedit.d -t xedit .\n
"},{"location":"applications/xedit/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect xedit > xedit.json\ndocker image save xedit -o xedit.tar\nctr -n k8s.io images import xedit.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xedit.json\n\n
"},{"location":"applications/xeyes/","title":"xeyes","text":""},{"location":"applications/xeyes/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/xeyes/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/xeyes/#alpine-packages","title":"Alpine packages","text":"
xeyes\n
"},{"location":"applications/xeyes/#path","title":"Path","text":"
/usr/bin/xeyes\n
"},{"location":"applications/xeyes/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/xeyes/#wm_class","title":"WM_CLASS","text":"
xeyes.XEyes\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/xeyes/#json-dump","title":"JSON dump","text":"

json source file xeyes.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"xeyes\",\n    \"icon\": \"circle_xfce4-eyes.svg\",\n    \"keyword\": \"eyes\",\n    \"launch\": \"xeyes.XEyes\",\n    \"name\": \"xeyes\",\n    \"path\": \"/usr/bin/xeyes\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"quick\": true\n}\n
"},{"location":"applications/xeyes/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output xeyes.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xeyes.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xeyes.d.3.0.json\n\n
"},{"location":"applications/xeyes/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update xeyes\nLABEL oc.icon=\"circle_xfce4-eyes.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0MSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0N2M0ZTUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDc4YmU1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MzUiIHgxPSIyOS41NjUiIHgyPSIyOS43MjgiIHkxPSIxMS4wNDgiIHkyPSI1My41NTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjN2M3YzciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNTIwIiB4Mj0iNTIwLjAzIiB5MT0iNDQiIHkyPSI5ODUuODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2MzU2IDAgMCAuMDYzNTYgLS41NDIzNyAtLjU0MjM3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzUzNTM1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzZkNmQ2ZCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI4OTEiIHg9Ii0uMTQwMzEiIHk9Ii0uMTQwMzEiIHdpZHRoPSIxLjI4MDYiIGhlaWdodD0iMS4yODA2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjY2NDA5MjUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI4OTUiIHg9Ii0uMTc2NTIiIHk9Ii0uMTc2NTIiIHdpZHRoPSIxLjM1MyIgaGVpZ2h0PSIxLjM1MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS42NjQwOTI1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyOTA3IiB4PSItLjAyODUzIiB5PSItLjA1NTM5NSIgd2lkdGg9IjEuMDU3MSIgaGVpZ2h0PSIxLjExMDgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzM4Mzc1MzgiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MTEiIHg9Ii0uMDM1ODkzIiB5PSItLjA2OTE3IiB3aWR0aD0iMS4wNzE4IiBoZWlnaHQ9IjEuMTM4MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC4zMzgzNzUzOCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MjEiIHgxPSIxMC44NzkiIHgyPSIzMy41MDUiIHkxPSIyOC4yNTYiIHkyPSIyOC4yNTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5MzUiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTI5IiB4MT0iMjQuOTg5IiB4Mj0iNTMuNDU0IiB5MT0iMzQuMDk1IiB5Mj0iMzQuMDk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTM1Ii8+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJyYWRpYWxHcmFkaWVudDk0MyIgY3g9IjIyLjE5MiIgY3k9IjI2LjA2NiIgcj0iNC4wMTQzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTQxIi8+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJyYWRpYWxHcmFkaWVudDk1MSIgY3g9IjQxLjE2OCIgY3k9IjMxLjkwNSIgcj0iNi4yMDM5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTQxIi8+CiA8L2RlZnM+CiA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0MjM3IC0uNTQyMzcpIiBkPSJtOTY5LjcgMzkyYy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTIuNS04Ljc1LTUuMzUtMTcuNi04LjQ1LTI2LjM1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNGgtMC4wMjVxLTMwLjYwMS01Mi4wMS03Ni4zMjUtOTcuNzVjLTkyLjE1LTkyLjE1LTIwMy40NS0xMzguMjUtMzMzLjgtMTM4LjI1cy0yNDEuNiA0Ni4xLTMzMy43NSAxMzguMjUtMTM4LjI1IDIwMy40LTEzOC4yNSAzMzMuNzUgNDYuMSAyNDEuNjUgMTM4LjI1IDMzMy44YzY4LjA1IDY4LjA1IDE0Ni41IDExMC45NSAyMzQuOSAxMjguNjUgMzEuOTUgNi40IDY0Ljc1IDkuNTUgOTguODUgOS41NSAxMzAuMzUgMCAyNDEuNjUtNDYuMDUgMzMzLjgtMTM4LjIgNDguNi00OC42IDg0LjQtMTAyLjUgMTA3LjM1LTE2MS44IDE3LTQzLjk1IDI3LTkwLjggMjkuOTUtMTQwLjc1IDAuNi0xMC4yIDAuOS0yMC42NSAwLjktMzEuMjUgMC00MS43NS00LjctODEuNi0xNC4zLTEyMHoiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY3MiIvPgogPHBhdGggZD0ibTYxLjA5MSAyNC4zNzNjLTAuMDY5OTItMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDQtMC4yMzE5OS0wLjg2NDQxLTAuMTU4OS0wLjU1NjE1LTAuMzQwMDQtMS4xMTg2LTAuNTM3MDgtMS42NzQ4LTAuNDA5OTYtMS4xNi0wLjg5OTM3LTIuMjkxMy0xLjQ3MTQtMy40MS0wLjI0MTUzLTAuNDcwMzQtMC41MDUzLTAuOTUwMjItMC43ODE3OC0xLjQyMzdoLTAuMDAxNnEtMS45NDUtMy4zMDU3LTQuODUxMi02LjIxMjljLTUuODU3LTUuODU3LTEyLjkzMS04Ljc4NzEtMjEuMjE2LTguNzg3MXMtMTUuMzU2IDIuOTMwMS0yMS4yMTMgOC43ODcxLTguNzg3MSAxMi45MjgtOC43ODcxIDIxLjIxMyAyLjkzMDEgMTUuMzU5IDguNzg3MSAyMS4yMTZjNC4zMjUyIDQuMzI1MiA5LjMxMTUgNy4wNTE5IDE0LjkzIDguMTc2OSAyLjAzMDcgMC40MDY3OCA0LjExNTUgMC42MDY5OSA2LjI4MjkgMC42MDY5OSA4LjI4NSAwIDE1LjM1OS0yLjkyNjkgMjEuMjE2LTguNzgzOSAzLjA4OS0zLjA4OSA1LjM2NDQtNi41MTQ4IDYuODIzMS0xMC4yODQgMS4wODA1LTIuNzkzNCAxLjcxNjEtNS43NzEyIDEuOTAzNi04Ljk0NiAwLjAzODE0LTAuNjQ4MzEgMC4wNTcyLTEuMzEyNSAwLjA1NzItMS45ODYyIDAtMi42NTM2LTAuMjk4NzMtNS4xODY1LTAuOTA4OS03LjYyNzF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTYxIi8+CiA8Y2lyY2xlIGN4PSIyMi4xOTIiIGN5PSIyOC45ODYiIHI9IjExLjMxMyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjg5NSkiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjguMjU2IiByPSIxMS4zMTMiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPHBhdGggZD0ibTIyLjE5MiAxNi45NDNhMTEuMzEzIDExLjMxMyAwIDAgMC0xMS4zMTMgMTEuMzEzIDExLjMxMyAxMS4zMTMgMCAwIDAgMC4wMTU2OCAwLjQyNzY2IDExLjMxMyAxMS4zMTMgMCAwIDEgMTEuMjk3LTExLjAxMSAxMS4zMTMgMTEuMzEzIDAgMCAxIDExLjI5NyAxMC44ODUgMTEuMzEzIDExLjMxMyAwIDAgMCAwLjAxNTY4LTAuMzAyMjEgMTEuMzEzIDExLjMxMyAwIDAgMC0xMS4zMTMtMTEuMzEzeiIgZmlsbD0iI2ZmZmZmZiIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjkxMSkiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjYuMDY2IiByPSI0LjAxNDMiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQ5NDMpIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjYuMDY2IiByPSIxLjA5NDgiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9Ii43NSIgc3Ryb2tlLXdpZHRoPSIuNzI5ODciLz4KIDxjaXJjbGUgY3g9IjM5LjIyMiIgY3k9IjM0LjgyNSIgcj0iMTQuMjMyIiBmaWx0ZXI9InVybCgjZmlsdGVyODkxKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSIzOS4yMjIiIGN5PSIzNC4wOTUiIHI9IjE0LjIzMiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDkyOSkiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSI0MS4xNjgiIGN5PSIzMS45MDUiIHI9IjYuMjAzOSIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudDk1MSkiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSI0MS4xNjgiIGN5PSIzMS45MDUiIHI9IjEuODI0NyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iLjc1IiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPHBhdGggZD0ibTM5LjIyMyAxOS44NjJhMTQuMjMyIDE0LjIzMiAwIDAgMC0xNC4yMzIgMTQuMjMyIDE0LjIzMiAxNC4yMzIgMCAwIDAgMC4wMTU2OCAwLjQyNzY2IDE0LjIzMiAxNC4yMzIgMCAwIDEgMTQuMjE3LTEzLjkzIDE0LjIzMiAxNC4yMzIgMCAwIDEgMTQuMjE3IDEzLjgwNSAxNC4yMzIgMTQuMjMyIDAgMCAwIDAuMDE1NjgtMC4zMDIyMSAxNC4yMzIgMTQuMjMyIDAgMCAwLTE0LjIzMi0xNC4yMzJ6IiBmaWxsPSIjZmZmZmZmIiBmaWx0ZXI9InVybCgjZmlsdGVyOTA3KSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xeyes,eyes\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xeyes.XEyes\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"xeyes\"\nLABEL oc.displayname=\"xeyes\"\nLABEL oc.path=\"/usr/bin/xeyes\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xeyes\"\nENV APPBIN \"/usr/bin/xeyes\"\nENV APP \"/usr/bin/xeyes\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xeyes/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xeyes/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application xeyes

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xeyes.d\n
"},{"location":"applications/xeyes/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f xeyes.d -t xeyes .\n
"},{"location":"applications/xeyes/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect xeyes > xeyes.json\ndocker image save xeyes -o xeyes.tar\nctr -n k8s.io images import xeyes.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xeyes.json\n\n
"},{"location":"applications/xman/","title":"xman","text":""},{"location":"applications/xman/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.18.04

"},{"location":"applications/xman/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/xman/#ubuntu-packages","title":"Ubuntu packages","text":"
x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev\n
"},{"location":"applications/xman/#displayname","title":"Displayname","text":"
Xman\n
"},{"location":"applications/xman/#path","title":"Path","text":"
/usr/bin/xman\n
"},{"location":"applications/xman/#mimetype","title":"Mimetype","text":"
application/x-troff;application/x-troff-man;\n
"},{"location":"applications/xman/#file-extensions","title":"File extensions","text":"

\"man;roff\"

"},{"location":"applications/xman/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/xman/#wm_class","title":"WM_CLASS","text":"
topBox.Xman\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/xman/#json-dump","title":"JSON dump","text":"

json source file xman.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"containerengine\": \"ephemeral_container\",\n    \"debpackage\": \"x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev\",\n    \"icon\": \"circle_xorg.svg\",\n    \"keyword\": \"man,xman,help\",\n    \"launch\": \"topBox.Xman\",\n    \"name\": \"xman\",\n    \"displayname\": \"Xman\",\n    \"path\": \"/usr/bin/xman\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.18.04\",\n    \"mimetype\": \"application/x-troff;application/x-troff-man;\",\n    \"fileextensions\": \"man;roff\",\n    \"args\": \"\"\n}\n
"},{"location":"applications/xman/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output xman.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xman.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xman.d.3.0.json\n\n
"},{"location":"applications/xman/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_xorg.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMC45NzMiIHgyPSIzNi45MzciIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTAyIDAgMCAxLjUwMzcgLTMuOTgyNyAtMy4zNDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyYTJjMmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDI0NjQ5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjMxOS4yMSIgeDI9IjY1Ny42NSIgeTE9IjIzNS4xNSIgeTI9IjI2OS40OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTMyMzUgMCAwIC4xMzA3NSAtMzIuMzc5IDEuMDg3MykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U1NGMxOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZWMzNTAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYsMCwwLDEuMzI3NiwtNTEwLjY0LC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgeD0iLS4wNDk4OTciIHk9Ii0uMDc1MjMyIiB3aWR0aD0iMS4wOTk4IiBoZWlnaHQ9IjEuMTUwNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MzU1MzYwOCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDU1MzE5IiB5PSItLjA2NTU2MyIgd2lkdGg9IjEuMTEwNiIgaGVpZ2h0PSIxLjEzMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTA2MjkxMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5LDAsMCwxLjQ5OTksLTU4MC44MSwtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5IDAgMCAxLjQ5OTkgLTU4MC44MSAtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPHJlY3QgeD0iNjQuOTY1IiB5PSIyOS43OTMiIHdpZHRoPSIuMDY3NDk1IiBoZWlnaHQ9IjAiIGZpbGw9IiMwMDBjZmYiIG9wYWNpdHk9Ii40MDc0MSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuMjU2MyI+CiAgPHBhdGggZD0ibTEyLjkzNCA1Mi45ODIgMTQuNzI0LTE5LjI3NC0xNS4xNTktMjEuMTkyIDkuNzQzMSAwLjAwODEgMTIuMDc5IDE2LjY2My0xOC4wNiAyMy43OTRoLTMuMzI3em0yOC44MTkgMC4wMTM2OC0xMS45OTUtMTYuNjkyIDE4LjIxMS0yMy44MDVoMy4yNDQ3bC0xNC43ODQgMTkuMzY0IDE1LjA2OCAyMS4xMzJ6Ii8+CiAgPHBhdGggZD0ibTMxLjk5NiAxOS44OTJjLTEuMTcxNCAwLTIuNDIyOSAwLjA4OTYtMy41NDk2IDAuMTk2NDYgMi4wMDcyIDIuNTg2MiAzLjY3MjYgNC43NzYyIDUuNTg5NCA3LjI2MzQtMS4wNzU4LTIuMjg3Mi0zLjI4NjktNC40ODA1LTIuNTIyNS01LjYwODQgMC43NTY2NS0xLjExNjYgMi4xNTA4LTAuOTI4NjIgMi4yNTctMC45Mjg2MiAyLjIzNTEgMCA0LjM4NjcgMC4yNDkzOSA2LjM5ODEgMC43MTA5NWwwLjQ3MTQ4LTAuNjQxNDljLTIuNjgyOC0wLjY4MjI4LTUuNTk2Ny0wLjk5MjIxLTguNjQzOS0wLjk5MjIxem0xMi4xMDYgMi4wODcyLTAuNDM0MjYgMC42MTI4OWM2LjE5NzIgMi4zOTc1IDEwLjM4OSA2Ljk3NjggMTAuMzg5IDEyLjIyNSAwIDcuNzI4MS05LjA4NzYgMTMuOTk4LTIwLjI4NiAxMy45OTgtMTEuMTk5IDAtMjAuMjktNi4yNzAzLTIwLjI5LTEzLjk5OCAxZS02IC00LjIwODUgMi42OTYxLTcuOTg2MiA2Ljk2MDYtMTAuNTU0bC0xLjMxMTEtMS45NzM1Yy02LjY4OTYgMi44MDIyLTExLjEzIDcuNzIwNy0xMS4xMyAxMy4zMiAwIDguNzEyMyAxMC43NSAxNS43OCAyMy45OTYgMTUuNzggMTMuMjQ3IDAgMjQtNy4wNjc1IDI0LTE1Ljc4IDAtNS44MDk2LTQuNzgwNy0xMC44OS0xMS44OTUtMTMuNjMxeiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIHN0cm9rZS13aWR0aD0iMS4yNTYzIj4KICA8cGF0aCBkPSJtMTIuOTM0IDUyLjk4MiAxNC43MjQtMTkuMjc0LTE1LjE1OS0yMS4xOTIgOS43NDMxIDAuMDA4MSAxMi4wNzkgMTYuNjYzLTE4LjA2IDIzLjc5NGgtMy4zMjd6bTI4LjgxOSAwLjAxMzY4LTExLjk5NS0xNi42OTIgMTguMjExLTIzLjgwNWgzLjI0NDdsLTE0Ljc4NCAxOS4zNjQgMTUuMDY4IDIxLjEzMnoiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzEuOTk2IDE5Ljg5MmMtMS4xNzE0IDAtMi40MjI5IDAuMDg5Ni0zLjU0OTYgMC4xOTY0NiAyLjAwNzIgMi41ODYyIDMuNjcyNiA0Ljc3NjIgNS41ODk0IDcuMjYzNC0xLjA3NTgtMi4yODcyLTMuMjg2OS00LjQ4MDUtMi41MjI1LTUuNjA4NCAwLjc1NjY1LTEuMTE2NiAyLjE1MDgtMC45Mjg2MiAyLjI1Ny0wLjkyODYyIDIuMjM1MSAwIDQuMzg2NyAwLjI0OTM5IDYuMzk4MSAwLjcxMDk1bDAuNDcxNDgtMC42NDE0OWMtMi42ODI4LTAuNjgyMjgtNS41OTY3LTAuOTkyMjEtOC42NDM5LTAuOTkyMjF6bTEyLjEwNiAyLjA4NzItMC40MzQyNiAwLjYxMjg5YzYuMTk3MiAyLjM5NzUgMTAuMzg5IDYuOTc2OCAxMC4zODkgMTIuMjI1IDAgNy43MjgxLTkuMDg3NiAxMy45OTgtMjAuMjg2IDEzLjk5OC0xMS4xOTkgMC0yMC4yOS02LjI3MDMtMjAuMjktMTMuOTk4IDFlLTYgLTQuMjA4NSAyLjY5NjEtNy45ODYyIDYuOTYwNi0xMC41NTRsLTEuMzExMS0xLjk3MzVjLTYuNjg5NiAyLjgwMjItMTEuMTMgNy43MjA3LTExLjEzIDEzLjMyIDAgOC43MTIzIDEwLjc1IDE1Ljc4IDIzLjk5NiAxNS43OCAxMy4yNDcgMCAyNC03LjA2NzUgMjQtMTUuNzggMC01LjgwOTYtNC43ODA3LTEwLjg5LTExLjg5NS0xMy42MzF6IiBmaWxsPSJ1cmwoI2EpIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xman,man,xman,help\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"topBox.Xman\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.18.04\"\nLABEL oc.name=\"xman\"\nLABEL oc.displayname=\"Xman\"\nLABEL oc.path=\"/usr/bin/xman\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-troff;application/x-troff-man;\"\nLABEL oc.fileextensions=\"man;roff\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xman\"\nENV APPBIN \"/usr/bin/xman\"\nENV APP \"/usr/bin/xman\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xman/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xman/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application xman

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xman.d\n
"},{"location":"applications/xman/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f xman.d -t xman .\n
"},{"location":"applications/xman/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect xman > xman.json\ndocker image save xman -o xman.tar\nctr -n k8s.io images import xman.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xman.json\n\n
"},{"location":"applications/xpad/","title":"xpad","text":""},{"location":"applications/xpad/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/xpad/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/xpad/#ubuntu-packages","title":"Ubuntu packages","text":"
xpad\n
"},{"location":"applications/xpad/#displayname","title":"Displayname","text":"
Xpad\n
"},{"location":"applications/xpad/#path","title":"Path","text":"
/usr/bin/xpad\n
"},{"location":"applications/xpad/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/xpad/#wm_class","title":"WM_CLASS","text":"
xpad.xpad\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/xpad/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/xpad.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/xpad/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

COPY composer/init.d/init.xpad /composer/init.d/init.xpad\n
"},{"location":"applications/xpad/#json-dump","title":"JSON dump","text":"

json source file xpad.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"xpad\",\n    \"icon\": \"xpad.svg\",\n    \"keyword\": \"xpad, note, sticky, postit\",\n    \"launch\": \"xpad.xpad\",\n    \"name\": \"xpad\",\n    \"displayname\": \"Xpad\",\n    \"path\": \"/usr/bin/xpad\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"fileextensions\": \"\",\n    \"args\": \"\",\n    \"desktopfile\": \"/usr/share/applications/xpad.desktop\",\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.xpad /composer/init.d/init.xpad\"\n    ]\n}\n
"},{"location":"applications/xpad/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output xpad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xpad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xpad.d.3.0.json\n\n
"},{"location":"applications/xpad/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.xpad /composer/init.d/init.xpad\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends xpad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"xpad.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIFNvZGlwb2RpICgiaHR0cDovL3d3dy5zb2RpcG9kaS5jb20vIikgLS0+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIGlkPSJzdmcxMTQiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIHdpZHRoPSI3NTAiCiAgIGhlaWdodD0iNzUwIgogICBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS9taWtlL0NvZGUveHBhZC9pbWFnZXMvaGljb2xvci9zY2FsYWJsZS9hcHBzLyIKICAgc29kaXBvZGk6ZG9jbmFtZT0ieHBhZC5zdmciCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYiCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTIzIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzMTE2Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA0NjguNzUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iOTM3LjUgOiA0NjguNzUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjQ2OC43NSA6IDMxMi41IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVkZDg4O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDYyMSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY2NTUwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MjIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTciPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZlZTk5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDYxOCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZGQ4ODtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MTkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjciPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2NjZDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEyOCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY1NjcwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMjkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMTkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZjMyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEyMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Q3ZDUwYTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjIiCiAgICAgICB4MT0iNi44NjM1ODg4ZS0wOSIKICAgICAgIHkxPSI4LjAwNzgzNzllLTA5IgogICAgICAgeDI9IjEiCiAgICAgICB5Mj0iOC4wMDc4Mzc5ZS0wOSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjE3IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTI0IgogICAgICAgY3g9IjAuMTEyMTg4MDkiCiAgICAgICBjeT0iLTAuMjA4MTMwOTMiCiAgICAgICBmeD0iMC4xMTIxODgwOSIKICAgICAgIGZ5PSItMC4yMDgxMzA5MyIKICAgICAgIHI9IjEuNTc0MDgiCiAgICAgICBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2MjAiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMjYiCiAgICAgICBjeD0iMS4yMjQ0OCIKICAgICAgIGN5PSIwLjExNjk3NjU5IgogICAgICAgZng9IjEuMjI0NDgiCiAgICAgICBmeT0iMC4xMTY5NzY1OSIKICAgICAgIHI9IjEuNDk2ODciCiAgICAgICBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjciCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ2MTYiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDYyMCIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI0MDIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIgogICAgICAgY3g9IjU4Mi44MDUyNCIKICAgICAgIGN5PSIxOTMuMDU0NCIKICAgICAgIGZ4PSI1ODIuODA1MjQiCiAgICAgICBmeT0iMTkzLjA1NDQiCiAgICAgICByPSI1ODcuNjQwMzgiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ic2NhbGUoMC45MzcwMTk4LDEuMDY3MjEzMykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDYxNyIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI0MDQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIgogICAgICAgY3g9IjE5Ni40Njk1NiIKICAgICAgIGN5PSItMzYuODYzNTg2IgogICAgICAgZng9IjE5Ni40Njk1NiIKICAgICAgIGZ5PSItMzYuODYzNTg2IgogICAgICAgcj0iMTEzMi45ODA1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuMDAyMjkzNiwwLjk5NzcxMTYpIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuNDkyOCIKICAgICBpbmtzY2FwZTpjeD0iNDY4Ljc1IgogICAgIGlua3NjYXBlOmN5PSI0MTkuODYyODEiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI2NDAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNjgwIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNiIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmcxMTQiIC8+CiAgPGcKICAgICBpZD0iZzIzOTgiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NjU0MTY2LDAuMjYwNzExNywtMC4yNjA3MTE3LDAuOTY1NDE2Niw1NS41NzEwNywtMjUxLjkyMDE1KSI+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42NjMwMDIsLTAuMjE2MzUzLDAuMTg3NTksMC41NzQ4NTQsODEuNTUyNiw2MTkuMjY3KSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjYyIKICAgICAgIGlkPSJwYXRoMTI1IgogICAgICAgZD0iTSA5NS42NjkzLDE1Ny4wMjEgTCA0NjMuNTI0LDU3NS45ODcgTCA0NjEuODUyLDE1OC45NSBMIDk1LjY2OTMsMTU3LjAyMSB6IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0MDIpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoxcHQiIC8+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NTgzNjIsLTAuMjg1NTU2LDAuMjg1NTU2LDAuOTU4MzYyLC0xMjAuNDkyLDIwNi4xNzQpIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIgogICAgICAgaWQ9InBhdGgxMTgiCiAgICAgICBkPSJNIDEyNS4zNiwxMjIuMDYgTCAxMjUuMzYsNDcxLjc0OCBDIDEyNS4zNiw1ODguMzExIDI0OC44OTQsNjEwLjE3NSAzNzcuNTUyLDU2OC4zODkgQyAzMjEuNDE1LDY1MS4yNjYgMzU5LjU4NSw4MjEuNDM2IDQ3Ni42OTcsODIxLjQzNiBMIDgyOC4wMzQsODIxLjQzNiBMIDgyOC4wMzQsMTIyLjA2IEwgMTI1LjM2LDEyMi4wNiB6IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0MDQpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxOC43NTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xpad,xpad, note, sticky, postit\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"xpad.desktop\"\nLABEL oc.launch=\"xpad.xpad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"xpad\"\nLABEL oc.displayname=\"Xpad\"\nLABEL oc.path=\"/usr/bin/xpad\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xpad\"\nENV APPBIN \"/usr/bin/xpad\"\nENV APP \"/usr/bin/xpad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xpad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xpad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application xpad

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xpad.d\n
"},{"location":"applications/xpad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f xpad.d -t xpad .\n
"},{"location":"applications/xpad/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect xpad > xpad.json\ndocker image save xpad -o xpad.tar\nctr -n k8s.io images import xpad.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xpad.json\n\n
"},{"location":"applications/xterm/","title":"xterm","text":""},{"location":"applications/xterm/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/xterm/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/xterm/#alpine-packages","title":"Alpine packages","text":"
xterm sudo\n
"},{"location":"applications/xterm/#arguments","title":"Arguments","text":"

\"-xrm 'XTerm*selectToClipboard:true'\"

"},{"location":"applications/xterm/#displayname","title":"Displayname","text":"
Xterm (sudo)\n
"},{"location":"applications/xterm/#path","title":"Path","text":"
/usr/bin/xterm\n
"},{"location":"applications/xterm/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/xterm/#wm_class","title":"WM_CLASS","text":"
xterm.XTerm\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/xterm/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/xterm.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/xterm/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
"},{"location":"applications/xterm/#json-dump","title":"JSON dump","text":"

json source file xterm.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"icon\": \"circle_xterm.svg\",\n    \"apkpackage\": \"xterm sudo\",\n    \"keyword\": \"xterm,shell,cmd\",\n    \"launch\": \"xterm.XTerm\",\n    \"name\": \"xterm\",\n    \"displayname\": \"Xterm (sudo)\",\n    \"path\": \"/usr/bin/xterm\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/xterm.desktop\",\n    \"args\": \"-xrm 'XTerm*selectToClipboard:true'\",\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n    ],\n    \"quick\": true\n}\n
"},{"location":"applications/xterm/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output xterm.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xterm.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xterm.d.3.0.json\n\n
"},{"location":"applications/xterm/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update xterm sudo\nLABEL oc.icon=\"circle_xterm.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iSXRlcm0iIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8bWV0YWRhdGE+CiAgPHJkZjpSREY+CiAgIDxjYzpXb3JrIHJkZjphYm91dD0iIj4KICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgPGRjOnR5cGUgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIvPgogICAgPGRjOnRpdGxlLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJlIiB4PSItLjA0MjY1MSIgeT0iLS4wMzExNDQiIHdpZHRoPSIxLjA4NTMiIGhlaWdodD0iMS4wNjIzIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0LjkzMTA4OTEiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSItNTA2LjQ1IiB4Mj0iLTUwNi40NSIgeTE9Ii0xOS4xMDEiIHkyPSIxMDEzLjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA1ODgyNCAwIDAgLjA1ODgyNCA2MS43OTEgMy4xMjM2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIuNTA3NjkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzRhNGE0YSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MDAwMDAwNiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4NjYiIHgxPSIyNC4zOTYiIHgyPSIyNC4zOTYiIHkxPSIzMy43NzUiIHkyPSIyMi45NDkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzU4ZmYwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNhMGZmMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDg2OCIgeDE9IjQyLjQzNCIgeDI9IjM4LjU5OSIgeTE9Ii0zMy4wMzMiIHkyPSItMzMuMDMzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1OGZmMDAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjY2YwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPG1hc2s+CiAgPGcgaWQ9ImciPgogICA8cGF0aCBkPSJtOTY5Ljc1IDM5Mi4wNWMtMS4xLTQuMzUtMi4zNS05LTMuNjUtMTMuNi0xLTMuNC0yLTYuODUtMy4xNS0xMC41LTEuNi01LjE1LTMuNC0xMC41LTUuMy0xNS44NS02LjQ1LTE4LjI1LTE0LjE1LTM2LjA1LTIzLjE1LTUzLjY1LTMuOC03LjQtNy45NS0xNC45NS0xMi4zLTIyLjQtMjAuMy0zNC41LTQ1LjgtNjcuMi03Ni4zNS05Ny43NS03Mi42LTcyLjYtMTU3LjE1LTExNi42NS0yNTMuNjUtMTMyLjA1LTE2LjI1LTIuNi0zMi44LTQuNC01MC4wNS01LjM1LTkuNy0wLjU1LTE5Ljg1LTAuODUtMzAuMS0wLjg1LTkuMzUgMC0xOC42IDAuMjUtMjcuOSAwLjc1LTExOC4zNSA2LjEtMjIwLjMgNTEuOTUtMzA1Ljg1IDEzNy41cS0xMzguMjUgMTM4LjI1LTEzOC4yNSAzMzMuNzVjMCAxMzAuMzUgNDYuMSAyNDEuNjUgMTM4LjI1IDMzMy44IDU2LjcgNTYuNjUgMTIwLjU1IDk1LjkgMTkxLjEgMTE3LjU1IDM2Ljc1IDExLjI1IDc0LjggMTcuODUgMTE0Ljc1IDE5Ljk1aDAuNGM4LjUgMC40NSAxNi42IDAuNyAyNC41IDAuN2gzYzEwLjMgMCAyMC41LTAuMyAzMC4xLTAuOCAyLjUtMC4xNSA0Ljc1LTAuMyA2Ljk1LTAuNDUgMjAuMi0xLjQ1IDM5LjktNC4wNSA1OC43LTcuNyA3Ljk1LTEuNTUgMTUuOC0zLjMgMjMuNC01LjE1IDgwLjgtMjAuMyAxNTIuMTUtNjEuNiAyMTQuNjUtMTI0LjEgNDguNi00OC42IDg0LjQtMTAyLjUgMTA3LjM1LTE2MS44IDE4LjQ1LTQ3LjY1IDI4LjY1LTk4LjggMzAuNTUtMTUzLjUgMC4yLTYuMDUgMC4zLTEyLjI1IDAuMy0xOC41di0zYy0wLjItNDAuNjUtNC45NS03OS41LTE0LjMtMTE3eiIgZmlsbD0iI2ZmZiIvPgogIDwvZz4KIDwvbWFzaz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHlsZT0icGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIvPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9InVybCgjYikiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiLz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM4MyAwIDAgLjA2MzgzIC0uMDY2NDkyIC0xLjIyNjEpIiBkPSJtMzUwLjg2IDM4OC43NGMtNC45IDAtOS4wOTk2IDEuNzUtMTIuNiA1LjI1LTMuNDUgMy40NS01LjIwMTIgNy42NTA4LTUuMjAxMiAxMi41NTFzMS43NTEyIDkuMTAwOCA1LjIwMTIgMTIuNTUxbDU0LjQ0OSA1NC40NDktNTQuNCA1NC40Yy0zLjUgMy41LTUuMjQ4OCA3LjY5OTYtNS4yOTg4IDEyLjYgMC4wNSA0LjkgMS44IDkuMTAwOCA1LjI1IDEyLjU1MSAzLjUgMy40NSA3LjY5ODggNS4yIDEyLjU0OSA1LjI1IDQuOTUgMCA5LjE1MDQtMS43NSAxMi42NS01LjI1bDYwLjUtNjAuNTUxYzEyLjctMTIuNjUgMTIuNy0yNS4zNTEgMC0zOC4wNTFsLTYwLjU1MS02MC41NDljLTMuNDY2Ny0zLjQ2NjctNy42NDg4LTUuMjAxMi0xMi41NDktNS4yMDEyeiIgZmlsdGVyPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjE1LjY2NyIvPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMCAuMDYzODMgLS4wNjM4MyAwIDY1LjM0NyAtMS4wNzEpIiB4PSI2MzcuNzgiIHk9IjMxNC43OCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjM4MCIgcng9IjIwIiBmaWx0ZXI9InVybCgjZSkiIG9wYWNpdHk9Ii41IiBzdHJva2Utd2lkdGg9IjE1LjY2NyIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxwYXRoIGQ9Im0yMi4zMjkgMjIuOTQ5Yy0wLjMxMjc3IDAtMC41ODA4MiAwLjExMTctMC44MDQyNiAwLjMzNTEtMC4yMjAyMSAwLjIyMDIxLTAuMzMxOTkgMC40ODgzNS0wLjMzMTk5IDAuODAxMTNzMC4xMTE3OCAwLjU4MDkgMC4zMzE5OSAwLjgwMTEzbDMuNDc1NSAzLjQ3NTUtMy40NzIzIDMuNDcyM2MtMC4yMjM0IDAuMjIzNC0wLjMzNTAzIDAuNDkxNDYtMC4zMzgyMiAwLjgwNDI1IDAuMDAzMiAwLjMxMjc3IDAuMTE0ODkgMC41ODA5IDAuMzM1MTEgMC44MDExMyAwLjIyMzQgMC4yMjAyMSAwLjQ5MTQxIDAuMzMxOTEgMC44MDEgMC4zMzUxMSAwLjMxNTk2IDAgMC41ODQwNy0wLjExMTcxIDAuODA3NDUtMC4zMzUxMWwzLjg2MTctMy44NjVjMC44MTA2NC0wLjgwNzQ1IDAuODEwNjQtMS42MTgyIDAtMi40Mjg4bC0zLjg2NS0zLjg2NDhjLTAuMjIxMjgtMC4yMjEyNy0wLjQ4ODIyLTAuMzMxOTktMC44MDEtMC4zMzE5OXoiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ4NjYpIi8+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIHg9IjM5IiB5PSItNDUuMjU1IiB3aWR0aD0iMi41NTMyIiBoZWlnaHQ9IjI0LjI1NSIgcng9IjEuMjc2NiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg2OCkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xterm,xterm,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"xterm.desktop\"\nLABEL oc.launch=\"xterm.XTerm\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nENV ARGS=\"-xrm 'XTerm*selectToClipboard:true'\"\nLABEL oc.name=\"xterm\"\nLABEL oc.displayname=\"Xterm (sudo)\"\nLABEL oc.path=\"/usr/bin/xterm\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xterm\"\nENV APPBIN \"/usr/bin/xterm\"\nLABEL oc.args=\"-xrm 'XTerm*selectToClipboard:true'\"\nENV APP \"/usr/bin/xterm\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xterm/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xterm/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application xterm

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xterm.d\n
"},{"location":"applications/xterm/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f xterm.d -t xterm .\n
"},{"location":"applications/xterm/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect xterm > xterm.json\ndocker image save xterm -o xterm.tar\nctr -n k8s.io images import xterm.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xterm.json\n\n
"},{"location":"applications/youtube/","title":"youtube","text":""},{"location":"applications/youtube/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/youtube/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/youtube/#ubuntu-packages","title":"Ubuntu packages","text":"
firefox\n
"},{"location":"applications/youtube/#arguments","title":"Arguments","text":"

\"-P youtube --class=youtube https://www.youtube.com/\"

"},{"location":"applications/youtube/#displayname","title":"Displayname","text":"
Youtube\n
"},{"location":"applications/youtube/#path","title":"Path","text":"
/usr/bin/firefox\n
"},{"location":"applications/youtube/#mimetype","title":"Mimetype","text":"
text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
"},{"location":"applications/youtube/#file-extensions","title":"File extensions","text":"

\"html;xml;gif\"

"},{"location":"applications/youtube/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"html;xml\"

"},{"location":"applications/youtube/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/youtube/#wm_class","title":"WM_CLASS","text":"
Navigator.youtube\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/youtube/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/firefox.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/youtube/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

COPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\n
"},{"location":"applications/youtube/#json-dump","title":"JSON dump","text":"

json source file

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"firefox\",\n    \"icon\": \"circle_youtube.svg\",\n    \"keyword\": \"youtube,tube\",\n    \"launch\": \"Navigator.youtube\",\n    \"args\": \"-P youtube --class=youtube https://www.youtube.com/\",\n    \"name\": \"youtube\",\n    \"displayname\": \"Youtube\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"2G\",\n        \"shm_size\": \"2G\"\n    },\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/firefox.desktop\",\n    \"preventhomemount\": false,\n    \"quick\": true,\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\"\n    ]\n}\n
"},{"location":"applications/youtube/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output youtube.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/youtube.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @youtube.json\n\n
"},{"location":"applications/youtube/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nCOPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y firefox && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_youtube.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4OTkiIHgxPSItMzkuNjA1IiB4Mj0iLTM5LjYwNSIgeTE9IjU4LjI0NyIgeTI9IjYuOTg3NyIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg3MC41NDMgLjQxOTc1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDAwYzIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTE1MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MzAiIHg9Ii0uMDM4ODgiIHk9Ii0uMDM4ODgiIHdpZHRoPSIxLjA3NzgiIGhlaWdodD0iMS4wNzc4IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjk3MiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmaWx0ZXI5MzApIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIHN0cm9rZS13aWR0aD0iMi4yODgxIiBzdHlsZT0iaXNvbGF0aW9uOmlzb2xhdGU7cGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ4OTkpIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjIuMjg4MSIgc3R5bGU9Imlzb2xhdGlvbjppc29sYXRlO3BhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KIDxpbWFnZSB4PSIxMC41IiB5PSIxOSIgd2lkdGg9IjQzIiBoZWlnaHQ9IjMyIiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplUXVhbGl0eSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDc0FBQUFnQ0FZQUFBQ0xtb0VEQUFBQUNYQklXWE1BQUE3REFBQU93d0hIYjZoa0FBQUEgR1hSRldIUlRiMlowZDJGeVpRQjNkM2N1YVc1cmMyTmhjR1V1YjNKbm0rNDhHZ0FBQWg5SlJFRlVXSVcxbU8yV2hDQUlodCttWnZmKyBiM2VhY24va1c0UllnaTNuY1ByUTdJa1FrUUh0TWpqNmVpWDFBQXpHdWRVMzhnRVdXRExhaW41VEJXQUE4TXJLYTZoejZ6a1BJTzhuIGRiNW1MWjdUTHlEa0JHQVVPcUNFYmdXdEFXdklCR0FSK3MzUSszUFNzZ1I5QS9qSnh6ZHM2N1lDM29GcllFTE9lZnhaQW12WU1RUCsgWnAxUVd2VktyRDR0azBlNndJTE5RTHplWFlXdzh2Zi80TEFzWGFCRklqNXI5Wk9naXdTMkxEdmg4TmxXaTk2Slp3eUxBY0QyRlJ6cyBwZlFwVUkvb1NDUlpDcDg4TlRwRWhxQW5KcUFWT2dmdEJoRnJ5dGlZeEl1aTQxVjU5S0xnZllFT09Tc08zeDl4V0lkamgwRTFiTlFLIGhKMnpjbHlwRVdESnRROGFIWVJDNjM0QmZMQlpsek9hQzR1RTlscDRQOVp5Z3dndzQrSlg2WUl0YmllY1YwUzNXTEE5UW1qZ25KQncgMG5YRjd0ZDlsNURVa3BZdXNTemJNN0FNVzB5S21CaDFyNGlFN2YxeS9ac2xLQ2NZUTFrM0xDVUNUV3VOMkN3SUhObWJoSXl1alB0eCBxalU0WVFsS3NONUZRWXFaZk11R1ZtQUM4UGN6MStoZGJ1WHVZUmR0MmFKRGcwZzRHTWVvRkR5VHVpa1RFbzg4blU1cWxnUWd2WXpHIEZYSG9KeUVMRHUwR1RFZ2k2emd1K251Mk5TdU9UZU1DWTRMcFRxTm90L3pSQTNzSEtpYzE4NHRQNWpodHh5M0xmdkwxQ25zdlpsVnIgUEdKVlhlU2NtWVdlTEZzcmNqREYwd0g5cVNKSHJXN0F2MnNXT1dyMUs3M0d0NFNsTytCYUhhdFdQaXJDNk5VTFd1T214eFd1YWw3NiB2T2dieWRyL1E1cWl4Ujhhbk1NQzBGUlNNZ0FBQUFCSlJVNUVya0pnZ2c9PSAiLz4KIDxwYXRoIGQ9Im0zMi4wMDMgMTkuMTQyYy02LjQ0OTQgMC0xMi40NDUgMC4yMjU1MS0xMy43NzEgMC41MTczMS0wLjg4ODY5IDAuMTk1NDktMS41OTI3IDAuNTY2MDctMi4yMzM3IDEuMTc1Mi0wLjUxMDAxIDAuNDg0Ny0wLjc5MDIzIDAuOTI0NDYtMS4wOTc0IDEuNzIxNC0wLjMzNzI4IDAuODc1MTMtMC41MTU5NCAxLjcwMDEtMC42MzkxIDIuOTQxOS0wLjIzNDg2IDIuMzY4Ny0wLjI3NzExIDMuNTM4MS0wLjI1NjE0IDcuMTA2NyAwLjAxNzggMy4wMzQ1IDAuMDMwNzEgMy4zODc0IDAuMjAyMTUgNS4zMzUxIDAuMTUxOTIgMS43MjU4IDAuMzE3OTMgMi41NDA5IDAuNzI0NDggMy41Njg0IDAuNDQ0NjcgMS4xMjM5IDEuMDYwOSAxLjgyMTggMi4wNTE3IDIuMzIxNiAwLjU5OTg3IDAuMzAyNjQgMS4xMzE4IDAuNDQzNyAyLjIxNDkgMC41ODg4OCAxLjQ3NjkgMC4xOTc5NiAzLjg5MTEgMC4zMDAyIDkuODQxNCAwLjQxNTYgNC43ODg0IDAuMDkyODggMTMuMS0wLjEwNjI2IDE1LjgyMi0wLjM3OTE5IDAuODc4MzctMC4wODgwOCAxLjQyMzMtMC4yMjU0NSAxLjk5NTItMC41MDA5OCAwLjU2NDc3LTAuMjcyMTEgMS4yMzk5LTAuODEyMDggMS41ODIxLTEuMjY1NiAwLjQ5ODY3LTAuNjYxMSAwLjk0MTI1LTEuODI0MyAxLjE2NjUtMy4wNjYyIDAuMDg3Ni0wLjQ4MzA0IDAuMjE5MjUtMS44MzI4IDAuMzI2NDYtMy4zNDg3IDAuMDkxNjEtMS4yOTU4IDAuMDkxNjItNy4yNjQyIDAtOC41NjA3LTAuMTkyOTQtMi43MzAxLTAuMzIzNC0zLjY1MjItMC42NjI5Ni00LjY5NDctMC4zMjk1NC0xLjAxMTctMC42MDYyLTEuNTA5OC0xLjE0MzktMi4wNTc5LTAuNjg2OTQtMC43MDAzNi0xLjM5MTItMS4wODk4LTIuMzUwNS0xLjMwMDgtMS4zMjY1LTAuMjkxNzktNy4zMjItMC41MTczMS0xMy43NzEtMC41MTczMXptLTMuMTkxNyA3LjcxNDRjMC4wNDM1NS0wLjAyOTU0IDguOTc1IDUuMTAzNSA4Ljk3NSA1LjE1OCAwIDAuMDU4MjkgMC4xMDkwNi0wLjAwNTItNC45OTM1IDIuODk3OS0yLjEyODUgMS4yMTEtMy44OTE5IDIuMjExLTMuOTE4NyAyLjIyMjQtMC4wMjY4OCAwLjAxMTM3LTAuMDU4MTMgMC4wMTA1Ny0wLjA2OTA1LTAuMDAxMi0wLjAyODk3LTAuMDMyMjctMC4wMjMxNC0xMC4yNTcgMC4wMDYzLTEwLjI3N3oiIGZpbGw9IiNmZmYiIHN0cm9rZS13aWR0aD0iLjY0Mjg3Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"youtube,youtube,tube\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"firefox.desktop\"\nLABEL oc.launch=\"Navigator.youtube\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"-P youtube --class=youtube https://www.youtube.com/\"\nLABEL oc.name=\"youtube\"\nLABEL oc.displayname=\"Youtube\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"2G\\\",\\\"shm_size\\\":\\\"2G\\\"}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"youtube\"\nENV APPBIN \"/usr/bin/firefox\"\nLABEL oc.args=\"-P youtube --class=youtube https://www.youtube.com/\"\nENV APP \"/usr/bin/firefox\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/youtube/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/youtube/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application youtube

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/youtube.d\n
"},{"location":"applications/youtube/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f youtube.d -t youtube .\n
"},{"location":"applications/youtube/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect youtube > youtube.json\ndocker image save youtube -o youtube.tar\nctr -n k8s.io images import youtube.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @youtube.json\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/","title":"oc.template.alpine.3.17","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#from","title":"from","text":"

inherit abcdesktopio/oc.template.alpine.minimal.3.17

"},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.7\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

file oc.template.alpine.3.17.md is created at Wed Jan 31 2024 13:51:22 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/","title":"oc.template.alpine.3.18","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#from","title":"from","text":"

inherit abcdesktopio/oc.template.alpine.minimal.3.18

"},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.6\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

file oc.template.alpine.3.18.md is created at Wed Jan 31 2024 13:51:24 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/","title":"oc.template.alpine.edge.gtk.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#from","title":"from","text":"

inherit abcdesktopio/oc.template.alpine.edge.gtk

"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update  \\\n   openjdk21 \\\n   mesa-vulkan-swrast \\  \n   faenza-icon-theme-libreoffice \\\n   libreoffice           \\\n   libreoffice-gtk\n\n

file oc.template.alpine.edge.gtk.libreoffice.md is created at Wed Jan 31 2024 14:02:02 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/","title":"oc.template.alpine.edge.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#from","title":"from","text":"

inherit abcdesktopio/oc.template.alpine.edge

"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n        mesa-dri-gallium \\\n        adwaita-icon-theme \\\n        libadwaita\n\n

file oc.template.alpine.edge.gtk.md is created at Wed Jan 31 2024 13:53:07 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.edge/","title":"oc.template.alpine.edge","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#from","title":"from","text":"

inherit abcdesktopio/oc.template.alpine.minimal.edge

"},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

file oc.template.alpine.edge.md is created at Wed Jan 31 2024 13:51:22 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/","title":"oc.template.alpine.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#from","title":"from","text":"

inherite abcdesktopio/oc.template.alpine

"},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.2\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n        mesa-dri-gallium \\\n        adwaita-icon-theme \\\n        libadwaita\n\n

file oc.template.alpine.gtk.md is created at Fri Jun 23 2023 16:35:23 GMT+0000 (Coordinated Universal Time) by make-docs.js

\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n        mesa-dri-gallium \\\n        adwaita-icon-theme \\\n        libadwaita\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/","title":"oc.template.alpine.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#from","title":"from","text":"

inherite abcdesktopio/oc.template.alpine

"},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.2\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update  \\\n   faenza-icon-theme-libreoffice \\\n   libreoffice           \\\n   libreoffice-gtk\n\n

file oc.template.alpine.libreoffice.md is created at Fri Jun 23 2023 16:46:45 GMT+0000 (Coordinated Universal Time) by make-docs.js

\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update  \\\n   faenza-icon-theme-libreoffice \\\n   libreoffice           \\\n   libreoffice-gtk\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine/","title":"oc.template.alpine","text":""},{"location":"applications/abcdesktopio/oc.template.alpine/#from","title":"from","text":"

inherit abcdesktopio/oc.template.alpine.minimal

"},{"location":"applications/abcdesktopio/oc.template.alpine/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.19.1\nPRETTY_NAME=\"Alpine Linux v3.19\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

file oc.template.alpine.md is created at Wed Jan 31 2024 13:51:26 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/","title":"oc.template.alpine.minimal.3.17","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#from","title":"from","text":"

Docker official images alpine:3.17

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.7\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#dockerfile-source-code","title":"DockerFile source code","text":"
\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

file oc.template.alpine.minimal.3.17.md is created at Wed Jan 31 2024 13:43:38 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/","title":"oc.template.alpine.minimal.3.18","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#from","title":"from","text":"

Docker official images alpine:3.18

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.6\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#dockerfile-source-code","title":"DockerFile source code","text":"
\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

file oc.template.alpine.minimal.3.18.md is created at Wed Jan 31 2024 13:43:44 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/","title":"oc.template.alpine.minimal.edge","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#from","title":"from","text":"

Docker official images alpine:edge

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#dockerfile-source-code","title":"DockerFile source code","text":"
\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

file oc.template.alpine.minimal.edge.md is created at Wed Jan 31 2024 13:43:44 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/","title":"oc.template.alpine.minimal","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#from","title":"from","text":"

Docker official images alpine

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.19.1\nPRETTY_NAME=\"Alpine Linux v3.19\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#dockerfile-source-code","title":"DockerFile source code","text":"
\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

file oc.template.alpine.minimal.md is created at Wed Jan 31 2024 13:43:34 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.wine/","title":"oc.template.alpine.wine","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#from","title":"from","text":"

inherit abcdesktopio/oc.template.alpine

"},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.19.1\nPRETTY_NAME=\"Alpine Linux v3.19\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# \n# from https://wiki.alpinelinux.org/wiki/Repositories#Enabling_the_community_repository\n#\n# RUN echo https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/main/ >> /etc/apk/repositories && \\\n#    echo https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/community/ >> /etc/apk/repositories && \\\n#    echo https://dl-cdn.alpinelinux.org/alpine/edge/testing/ >> /etc/apk/repositories \n\n\n#\n# add wine\n#\n# wine packge does not exist on alpine aarch64\n# install only x86_64 architecture\nRUN if [ $(uname -m) == 'aarch64' ]; then echo 'WARNING wine package does not exist on alpine aarch64'; fi\nRUN if [ $(uname -m) == 'x86_64'  ]; then apk add --no-cache --update wine; fi\n\n

file oc.template.alpine.wine.md is created at Wed Jan 31 2024 14:06:58 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.debian.gtk/","title":"oc.template.debian.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#from","title":"from","text":"

inherit abcdesktopio/oc.template.debian

"},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#container-distribution-release","title":"Container distribution release","text":"
PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gir1.2-javascriptcoregtk-4.0        \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     fonts-noto                 \\\n     xfonts-base        \\\n     xfonts-encodings       \\\n     xfonts-scalable        \\\n     xfonts-utils       \\\n     fonts-beng         \\\n     fonts-beng-extra   \\\n     fonts-dejavu-core  \\\n     fonts-deva \\\n     fonts-deva-extra   \\\n     fonts-droid-fallback   \\\n     fonts-freefont-ttf \\\n     fonts-gargi    \\\n     fonts-gubbi    \\\n     fonts-gujr \\\n     fonts-gujr-extra   \\\n     fonts-guru \\\n     fonts-guru-extra   \\\n     fonts-indic    \\\n     fonts-kacst    \\\n     fonts-kacst-one    \\\n     fonts-kalapi   \\\n     fonts-knda \\\n     fonts-lao  \\\n     fonts-lato \\\n     fonts-liberation   \\\n     fonts-liberation2  \\\n     fonts-lklug-sinhala    \\\n     fonts-lohit-beng-assamese  \\\n     fonts-lohit-beng-bengali   \\\n     fonts-lohit-deva   \\\n     fonts-lohit-gujr   \\\n     fonts-lohit-guru   \\\n     fonts-lohit-knda   \\\n     fonts-lohit-mlym   \\\n     fonts-lohit-orya   \\\n     fonts-lohit-taml   \\\n     fonts-lohit-taml-classical \\\n     fonts-lohit-telu   \\\n     fonts-mlym \\\n     fonts-nakula   \\\n     fonts-navilu   \\\n     fonts-noto-cjk \\\n     fonts-noto-color-emoji \\\n     fonts-noto-mono    \\\n     fonts-opensymbol   \\\n     fonts-orya \\\n     fonts-orya-extra   \\\n     fonts-pagul    \\\n     fonts-sahadeva \\\n     fonts-samyak-deva  \\\n     fonts-samyak-gujr  \\\n     fonts-samyak-mlym  \\\n     fonts-samyak-taml  \\\n     fonts-sarai    \\\n     fonts-sil-abyssinica   \\\n     fonts-sil-padauk   \\\n     fonts-smc  \\\n     fonts-smc-anjalioldlipi    \\\n     fonts-smc-chilanka \\\n     fonts-smc-dyuthi   \\\n     fonts-smc-karumbi  \\\n     fonts-smc-keraleeyam   \\\n     fonts-smc-manjari  \\\n     fonts-smc-meera    \\\n     fonts-smc-rachana  \\\n     fonts-smc-raghumalayalamsans   \\\n     fonts-smc-suruma   \\\n     fonts-smc-uroob    \\\n     fonts-taml \\\n     fonts-telu \\\n     fonts-telu-extra   \\\n     fonts-thai-tlwg    \\\n     fonts-tibetan-machine  \\\n     fonts-tlwg-garuda  \\\n     fonts-tlwg-garuda-ttf  \\\n     fonts-tlwg-kinnari \\\n     fonts-tlwg-kinnari-ttf \\\n     fonts-tlwg-laksaman    \\\n     fonts-tlwg-laksaman-ttf    \\\n     fonts-tlwg-loma    \\\n     fonts-tlwg-loma-ttf    \\\n     fonts-tlwg-mono    \\\n     fonts-tlwg-mono-ttf    \\\n     fonts-tlwg-norasi  \\\n     fonts-tlwg-norasi-ttf  \\\n     fonts-tlwg-purisa  \\\n     fonts-tlwg-purisa-ttf  \\\n     fonts-tlwg-sawasdee    \\\n     fonts-tlwg-sawasdee-ttf    \\\n     fonts-tlwg-typewriter  \\\n     fonts-tlwg-typewriter-ttf  \\\n     fonts-tlwg-typist  \\\n     fonts-tlwg-typist-ttf  \\\n     fonts-tlwg-typo    \\\n     fonts-tlwg-typo-ttf    \\\n     fonts-tlwg-umpush  \\\n     fonts-tlwg-umpush-ttf  \\\n     fonts-tlwg-waree   \\\n     fonts-tlwg-waree-ttf   \\\n     fonts-urw-base35   \\\n     fonts-yrsa-rasa    \\\n     && apt-get clean                                   \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

file oc.template.debian.gtk.md is created at Wed Jan 31 2024 13:57:34 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.debian/","title":"oc.template.debian","text":""},{"location":"applications/abcdesktopio/oc.template.debian/#from","title":"from","text":"

inherit abcdesktopio/oc.template.debian.minimal

"},{"location":"applications/abcdesktopio/oc.template.debian/#container-distribution-release","title":"Container distribution release","text":"
PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.debian/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

file oc.template.debian.md is created at Wed Jan 31 2024 13:51:43 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.debian.minimal/","title":"oc.template.debian.minimal","text":""},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#from","title":"from","text":"

Docker official images debian:stable-slim

"},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#container-distribution-release","title":"Container distribution release","text":"
PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#dockerfile-source-code","title":"DockerFile source code","text":"
\nARG BASE_IMAGE=ubuntu:20.04\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg                              \\\n     software-properties-common         \\\n     locales                \\\n     cups-client            \\\n     libpulse0              \\\n     curl               \\\n     xauth              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN curl -sL https://deb.nodesource.com/setup_16.x | bash - \\\n        && apt-get update && \\\n        apt-get install -y --no-install-recommends \\\n        nodejs \\\n        npm \\\n    && apt-get clean \\\n    && rm -rf /var/lib/apt/lists/*\n\n\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

file oc.template.debian.minimal.md is created at Wed Jan 31 2024 13:50:28 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/","title":"oc.template.ubuntu.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.minimal.18.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

file oc.template.ubuntu.18.04.md is created at Wed Jan 31 2024 13:51:46 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/","title":"oc.template.ubuntu.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.minimal.20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

file oc.template.ubuntu.20.04.md is created at Wed Jan 31 2024 13:51:38 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/","title":"oc.template.ubuntu.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#container-distribution-release","title":"Container distribution release","text":"
PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

file oc.template.ubuntu.22.04.md is created at Wed Jan 31 2024 13:51:51 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/","title":"oc.template.ubuntu.gtk.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.18.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gir1.2-javascriptcoregtk-4.0        \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     fonts-noto                 \\\n     xfonts-base        \\\n     xfonts-encodings       \\\n     xfonts-scalable        \\\n     xfonts-utils       \\\n     fonts-beng         \\\n     fonts-beng-extra   \\\n     fonts-dejavu-core  \\\n     fonts-deva \\\n     fonts-deva-extra   \\\n     fonts-droid-fallback   \\\n     fonts-freefont-ttf \\\n     fonts-gargi    \\\n     fonts-gubbi    \\\n     fonts-gujr \\\n     fonts-gujr-extra   \\\n     fonts-guru \\\n     fonts-guru-extra   \\\n     fonts-indic    \\\n     fonts-kacst    \\\n     fonts-kacst-one    \\\n     fonts-kalapi   \\\n     fonts-knda \\\n     fonts-lao  \\\n     fonts-lato \\\n     fonts-liberation   \\\n     fonts-liberation2  \\\n     fonts-lklug-sinhala    \\\n     fonts-lohit-beng-assamese  \\\n     fonts-lohit-beng-bengali   \\\n     fonts-lohit-deva   \\\n     fonts-lohit-gujr   \\\n     fonts-lohit-guru   \\\n     fonts-lohit-knda   \\\n     fonts-lohit-mlym   \\\n     fonts-lohit-orya   \\\n     fonts-lohit-taml   \\\n     fonts-lohit-taml-classical \\\n     fonts-lohit-telu   \\\n     fonts-mlym \\\n     fonts-nakula   \\\n     fonts-navilu   \\\n     fonts-noto-cjk \\\n     fonts-noto-color-emoji \\\n     fonts-noto-mono    \\\n     fonts-opensymbol   \\\n     fonts-orya \\\n     fonts-orya-extra   \\\n     fonts-pagul    \\\n     fonts-sahadeva \\\n     fonts-samyak-deva  \\\n     fonts-samyak-gujr  \\\n     fonts-samyak-mlym  \\\n     fonts-samyak-taml  \\\n     fonts-sarai    \\\n     fonts-sil-abyssinica   \\\n     fonts-sil-padauk   \\\n     fonts-smc  \\\n     fonts-smc-anjalioldlipi    \\\n     fonts-smc-chilanka \\\n     fonts-smc-dyuthi   \\\n     fonts-smc-karumbi  \\\n     fonts-smc-keraleeyam   \\\n     fonts-smc-manjari  \\\n     fonts-smc-meera    \\\n     fonts-smc-rachana  \\\n     fonts-smc-raghumalayalamsans   \\\n     fonts-smc-suruma   \\\n     fonts-smc-uroob    \\\n     fonts-taml \\\n     fonts-telu \\\n     fonts-telu-extra   \\\n     fonts-thai-tlwg    \\\n     fonts-tibetan-machine  \\\n     fonts-tlwg-garuda  \\\n     fonts-tlwg-garuda-ttf  \\\n     fonts-tlwg-kinnari \\\n     fonts-tlwg-kinnari-ttf \\\n     fonts-tlwg-laksaman    \\\n     fonts-tlwg-laksaman-ttf    \\\n     fonts-tlwg-loma    \\\n     fonts-tlwg-loma-ttf    \\\n     fonts-tlwg-mono    \\\n     fonts-tlwg-mono-ttf    \\\n     fonts-tlwg-norasi  \\\n     fonts-tlwg-norasi-ttf  \\\n     fonts-tlwg-purisa  \\\n     fonts-tlwg-purisa-ttf  \\\n     fonts-tlwg-sawasdee    \\\n     fonts-tlwg-sawasdee-ttf    \\\n     fonts-tlwg-typewriter  \\\n     fonts-tlwg-typewriter-ttf  \\\n     fonts-tlwg-typist  \\\n     fonts-tlwg-typist-ttf  \\\n     fonts-tlwg-typo    \\\n     fonts-tlwg-typo-ttf    \\\n     fonts-tlwg-umpush  \\\n     fonts-tlwg-umpush-ttf  \\\n     fonts-tlwg-waree   \\\n     fonts-tlwg-waree-ttf   \\\n     fonts-urw-base35   \\\n     fonts-yrsa-rasa    \\\n     && apt-get clean                                   \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

file oc.template.ubuntu.gtk.18.04.md is created at Wed Jan 31 2024 13:59:21 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/","title":"oc.template.ubuntu.gtk.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gir1.2-javascriptcoregtk-4.0        \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     fonts-noto                 \\\n     xfonts-base        \\\n     xfonts-encodings       \\\n     xfonts-scalable        \\\n     xfonts-utils       \\\n     fonts-beng         \\\n     fonts-beng-extra   \\\n     fonts-dejavu-core  \\\n     fonts-deva \\\n     fonts-deva-extra   \\\n     fonts-droid-fallback   \\\n     fonts-freefont-ttf \\\n     fonts-gargi    \\\n     fonts-gubbi    \\\n     fonts-gujr \\\n     fonts-gujr-extra   \\\n     fonts-guru \\\n     fonts-guru-extra   \\\n     fonts-indic    \\\n     fonts-kacst    \\\n     fonts-kacst-one    \\\n     fonts-kalapi   \\\n     fonts-knda \\\n     fonts-lao  \\\n     fonts-lato \\\n     fonts-liberation   \\\n     fonts-liberation2  \\\n     fonts-lklug-sinhala    \\\n     fonts-lohit-beng-assamese  \\\n     fonts-lohit-beng-bengali   \\\n     fonts-lohit-deva   \\\n     fonts-lohit-gujr   \\\n     fonts-lohit-guru   \\\n     fonts-lohit-knda   \\\n     fonts-lohit-mlym   \\\n     fonts-lohit-orya   \\\n     fonts-lohit-taml   \\\n     fonts-lohit-taml-classical \\\n     fonts-lohit-telu   \\\n     fonts-mlym \\\n     fonts-nakula   \\\n     fonts-navilu   \\\n     fonts-noto-cjk \\\n     fonts-noto-color-emoji \\\n     fonts-noto-mono    \\\n     fonts-opensymbol   \\\n     fonts-orya \\\n     fonts-orya-extra   \\\n     fonts-pagul    \\\n     fonts-sahadeva \\\n     fonts-samyak-deva  \\\n     fonts-samyak-gujr  \\\n     fonts-samyak-mlym  \\\n     fonts-samyak-taml  \\\n     fonts-sarai    \\\n     fonts-sil-abyssinica   \\\n     fonts-sil-padauk   \\\n     fonts-smc  \\\n     fonts-smc-anjalioldlipi    \\\n     fonts-smc-chilanka \\\n     fonts-smc-dyuthi   \\\n     fonts-smc-karumbi  \\\n     fonts-smc-keraleeyam   \\\n     fonts-smc-manjari  \\\n     fonts-smc-meera    \\\n     fonts-smc-rachana  \\\n     fonts-smc-raghumalayalamsans   \\\n     fonts-smc-suruma   \\\n     fonts-smc-uroob    \\\n     fonts-taml \\\n     fonts-telu \\\n     fonts-telu-extra   \\\n     fonts-thai-tlwg    \\\n     fonts-tibetan-machine  \\\n     fonts-tlwg-garuda  \\\n     fonts-tlwg-garuda-ttf  \\\n     fonts-tlwg-kinnari \\\n     fonts-tlwg-kinnari-ttf \\\n     fonts-tlwg-laksaman    \\\n     fonts-tlwg-laksaman-ttf    \\\n     fonts-tlwg-loma    \\\n     fonts-tlwg-loma-ttf    \\\n     fonts-tlwg-mono    \\\n     fonts-tlwg-mono-ttf    \\\n     fonts-tlwg-norasi  \\\n     fonts-tlwg-norasi-ttf  \\\n     fonts-tlwg-purisa  \\\n     fonts-tlwg-purisa-ttf  \\\n     fonts-tlwg-sawasdee    \\\n     fonts-tlwg-sawasdee-ttf    \\\n     fonts-tlwg-typewriter  \\\n     fonts-tlwg-typewriter-ttf  \\\n     fonts-tlwg-typist  \\\n     fonts-tlwg-typist-ttf  \\\n     fonts-tlwg-typo    \\\n     fonts-tlwg-typo-ttf    \\\n     fonts-tlwg-umpush  \\\n     fonts-tlwg-umpush-ttf  \\\n     fonts-tlwg-waree   \\\n     fonts-tlwg-waree-ttf   \\\n     fonts-urw-base35   \\\n     fonts-yrsa-rasa    \\\n     && apt-get clean                                   \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

file oc.template.ubuntu.gtk.20.04.md is created at Wed Jan 31 2024 13:57:49 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/","title":"oc.template.ubuntu.gtk.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.22.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#container-distribution-release","title":"Container distribution release","text":"
PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gir1.2-javascriptcoregtk-4.0        \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     fonts-noto                 \\\n     xfonts-base        \\\n     xfonts-encodings       \\\n     xfonts-scalable        \\\n     xfonts-utils       \\\n     fonts-beng         \\\n     fonts-beng-extra   \\\n     fonts-dejavu-core  \\\n     fonts-deva \\\n     fonts-deva-extra   \\\n     fonts-droid-fallback   \\\n     fonts-freefont-ttf \\\n     fonts-gargi    \\\n     fonts-gubbi    \\\n     fonts-gujr \\\n     fonts-gujr-extra   \\\n     fonts-guru \\\n     fonts-guru-extra   \\\n     fonts-indic    \\\n     fonts-kacst    \\\n     fonts-kacst-one    \\\n     fonts-kalapi   \\\n     fonts-knda \\\n     fonts-lao  \\\n     fonts-lato \\\n     fonts-liberation   \\\n     fonts-liberation2  \\\n     fonts-lklug-sinhala    \\\n     fonts-lohit-beng-assamese  \\\n     fonts-lohit-beng-bengali   \\\n     fonts-lohit-deva   \\\n     fonts-lohit-gujr   \\\n     fonts-lohit-guru   \\\n     fonts-lohit-knda   \\\n     fonts-lohit-mlym   \\\n     fonts-lohit-orya   \\\n     fonts-lohit-taml   \\\n     fonts-lohit-taml-classical \\\n     fonts-lohit-telu   \\\n     fonts-mlym \\\n     fonts-nakula   \\\n     fonts-navilu   \\\n     fonts-noto-cjk \\\n     fonts-noto-color-emoji \\\n     fonts-noto-mono    \\\n     fonts-opensymbol   \\\n     fonts-orya \\\n     fonts-orya-extra   \\\n     fonts-pagul    \\\n     fonts-sahadeva \\\n     fonts-samyak-deva  \\\n     fonts-samyak-gujr  \\\n     fonts-samyak-mlym  \\\n     fonts-samyak-taml  \\\n     fonts-sarai    \\\n     fonts-sil-abyssinica   \\\n     fonts-sil-padauk   \\\n     fonts-smc  \\\n     fonts-smc-anjalioldlipi    \\\n     fonts-smc-chilanka \\\n     fonts-smc-dyuthi   \\\n     fonts-smc-karumbi  \\\n     fonts-smc-keraleeyam   \\\n     fonts-smc-manjari  \\\n     fonts-smc-meera    \\\n     fonts-smc-rachana  \\\n     fonts-smc-raghumalayalamsans   \\\n     fonts-smc-suruma   \\\n     fonts-smc-uroob    \\\n     fonts-taml \\\n     fonts-telu \\\n     fonts-telu-extra   \\\n     fonts-thai-tlwg    \\\n     fonts-tibetan-machine  \\\n     fonts-tlwg-garuda  \\\n     fonts-tlwg-garuda-ttf  \\\n     fonts-tlwg-kinnari \\\n     fonts-tlwg-kinnari-ttf \\\n     fonts-tlwg-laksaman    \\\n     fonts-tlwg-laksaman-ttf    \\\n     fonts-tlwg-loma    \\\n     fonts-tlwg-loma-ttf    \\\n     fonts-tlwg-mono    \\\n     fonts-tlwg-mono-ttf    \\\n     fonts-tlwg-norasi  \\\n     fonts-tlwg-norasi-ttf  \\\n     fonts-tlwg-purisa  \\\n     fonts-tlwg-purisa-ttf  \\\n     fonts-tlwg-sawasdee    \\\n     fonts-tlwg-sawasdee-ttf    \\\n     fonts-tlwg-typewriter  \\\n     fonts-tlwg-typewriter-ttf  \\\n     fonts-tlwg-typist  \\\n     fonts-tlwg-typist-ttf  \\\n     fonts-tlwg-typo    \\\n     fonts-tlwg-typo-ttf    \\\n     fonts-tlwg-umpush  \\\n     fonts-tlwg-umpush-ttf  \\\n     fonts-tlwg-waree   \\\n     fonts-tlwg-waree-ttf   \\\n     fonts-urw-base35   \\\n     fonts-yrsa-rasa    \\\n     && apt-get clean                                   \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

file oc.template.ubuntu.gtk.22.04.md is created at Wed Jan 31 2024 13:57:23 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/","title":"oc.template.ubuntu.gtk.java","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.gtk.20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:$TAG\nMAINTAINER Alexandre DEVELY \nENV DEBIAN_FRONTEND noninteractive\nRUN apt-get update && apt-get install -y --install-recommends \\\n        default-jre \\\n        gsfonts-x11     \\\n    && rm -rf /var/lib/apt/lists/*  \n\n

file oc.template.ubuntu.gtk.java.md is created at Wed Jan 31 2024 14:02:12 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/","title":"oc.template.ubuntu.gtk.language-pack-all","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#from","title":"from","text":"

inherite abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nENV DEBIAN_FRONTEND noninteractive  \n# install help in all languages for gnome\n#RUN apt-get update && apt-get install -y  --no-install-recommends       \\\n#        $(apt-cache search language-pack-gnome | awk '{print $1 }')                \\\n#        && rm -rf /var/lib/apt/lists/*\n#\n#\n#\nRUN apt-get update && apt-get install -y  --no-install-recommends                       \\\n        $(apt-cache search \"language-pack-\" | grep -v \"gnome\" | grep -v \"kde\" | awk '{print $1 }')      \\\n        && apt-get clean                                        \\\n        && rm -rf /var/lib/apt/lists/*\n\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/","title":"oc.template.ubuntu.gtk.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#from","title":"from","text":"

inherite abcdesktopio/oc.template.ubuntu.gtk.20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nENV DEBIAN_FRONTEND noninteractive\n\n# install help in all language\n#RUN DEBIAN_FRONTEND=noninteractive  apt-get update && apt-get install -y  --no-install-recommends       \\\n#        $(apt-cache search language-pack-gnome | awk '{print $1 }')                \\\n#        && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && apt install -y                \\\n    at-spi2-core                        \\\n        libreoffice                         \\\n    libreoffice-gtk3                    \\\n    libreoffice-style-elementary                \\\n    libreoffice-base-drivers                \\\n    libreoffice-sdbc-hsqldb                 \\\n    libghc-hdbc-dev                     \\   \n    && apt-get clean\n\n# install help in all language\n#RUN apt-get update && apt-get install -y  --no-install-recommends  \\\n#   $(apt-cache search libreoffice-help | awk '{print $1 }')    \\\n#   && apt-get clean\n\n# install myspell-dictionary packages when available\n#RUN DEBIAN_FRONTEND=noninteractive  apt-get update && apt-get install -y   \\       \n#        $(apt-cache search myspell-dictionary | awk '{print $1 }')     \\\n#       && rm -rf /var/lib/apt/lists/*\n\n# install hyphen when available\n#RUN apt-get update && apt-get install -y --no-install-recommends           \\       \n#        $(apt-cache search hyphen | awk '{print $1 }')                 \\\n#    && apt-get clean\n\n\n# install ibreoffice-grammarcheck when available\n#RUN apt-get update && apt-get install -y  --no-install-recommends       \\\n#        $(apt-cache search libreoffice-grammarcheck | awk '{print $1 }') \\\n#    && apt-get clean\n\n\n# l10n files are loaded by libreoffice-help packages when available\n#RUN apt-get update && apt-get install -y  --no-install-recommends  \\\n#   $(apt-cache search libreoffice-l10n | awk '{print $1 }')    \\\n#    && apt-get clean\n\n#\n# install xfonts\n# install dbus\nRUN apt-get update && apt-get install -y --no-install-recommends    \\\n        xfonts-base \\\n        dbus-x11    \\\n    && apt-get clean\n\nRUN mkdir -p /run/user/ && chmod 777 /run/user/\n\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/","title":"oc.template.ubuntu.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gir1.2-javascriptcoregtk-4.0        \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     fonts-noto                 \\\n     xfonts-base        \\\n     xfonts-encodings       \\\n     xfonts-scalable        \\\n     xfonts-utils       \\\n     fonts-beng         \\\n     fonts-beng-extra   \\\n     fonts-dejavu-core  \\\n     fonts-deva \\\n     fonts-deva-extra   \\\n     fonts-droid-fallback   \\\n     fonts-freefont-ttf \\\n     fonts-gargi    \\\n     fonts-gubbi    \\\n     fonts-gujr \\\n     fonts-gujr-extra   \\\n     fonts-guru \\\n     fonts-guru-extra   \\\n     fonts-indic    \\\n     fonts-kacst    \\\n     fonts-kacst-one    \\\n     fonts-kalapi   \\\n     fonts-knda \\\n     fonts-lao  \\\n     fonts-lato \\\n     fonts-liberation   \\\n     fonts-liberation2  \\\n     fonts-lklug-sinhala    \\\n     fonts-lohit-beng-assamese  \\\n     fonts-lohit-beng-bengali   \\\n     fonts-lohit-deva   \\\n     fonts-lohit-gujr   \\\n     fonts-lohit-guru   \\\n     fonts-lohit-knda   \\\n     fonts-lohit-mlym   \\\n     fonts-lohit-orya   \\\n     fonts-lohit-taml   \\\n     fonts-lohit-taml-classical \\\n     fonts-lohit-telu   \\\n     fonts-mlym \\\n     fonts-nakula   \\\n     fonts-navilu   \\\n     fonts-noto-cjk \\\n     fonts-noto-color-emoji \\\n     fonts-noto-mono    \\\n     fonts-opensymbol   \\\n     fonts-orya \\\n     fonts-orya-extra   \\\n     fonts-pagul    \\\n     fonts-sahadeva \\\n     fonts-samyak-deva  \\\n     fonts-samyak-gujr  \\\n     fonts-samyak-mlym  \\\n     fonts-samyak-taml  \\\n     fonts-sarai    \\\n     fonts-sil-abyssinica   \\\n     fonts-sil-padauk   \\\n     fonts-smc  \\\n     fonts-smc-anjalioldlipi    \\\n     fonts-smc-chilanka \\\n     fonts-smc-dyuthi   \\\n     fonts-smc-karumbi  \\\n     fonts-smc-keraleeyam   \\\n     fonts-smc-manjari  \\\n     fonts-smc-meera    \\\n     fonts-smc-rachana  \\\n     fonts-smc-raghumalayalamsans   \\\n     fonts-smc-suruma   \\\n     fonts-smc-uroob    \\\n     fonts-taml \\\n     fonts-telu \\\n     fonts-telu-extra   \\\n     fonts-thai-tlwg    \\\n     fonts-tibetan-machine  \\\n     fonts-tlwg-garuda  \\\n     fonts-tlwg-garuda-ttf  \\\n     fonts-tlwg-kinnari \\\n     fonts-tlwg-kinnari-ttf \\\n     fonts-tlwg-laksaman    \\\n     fonts-tlwg-laksaman-ttf    \\\n     fonts-tlwg-loma    \\\n     fonts-tlwg-loma-ttf    \\\n     fonts-tlwg-mono    \\\n     fonts-tlwg-mono-ttf    \\\n     fonts-tlwg-norasi  \\\n     fonts-tlwg-norasi-ttf  \\\n     fonts-tlwg-purisa  \\\n     fonts-tlwg-purisa-ttf  \\\n     fonts-tlwg-sawasdee    \\\n     fonts-tlwg-sawasdee-ttf    \\\n     fonts-tlwg-typewriter  \\\n     fonts-tlwg-typewriter-ttf  \\\n     fonts-tlwg-typist  \\\n     fonts-tlwg-typist-ttf  \\\n     fonts-tlwg-typo    \\\n     fonts-tlwg-typo-ttf    \\\n     fonts-tlwg-umpush  \\\n     fonts-tlwg-umpush-ttf  \\\n     fonts-tlwg-waree   \\\n     fonts-tlwg-waree-ttf   \\\n     fonts-urw-base35   \\\n     fonts-yrsa-rasa    \\\n     && apt-get clean                                   \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

file oc.template.ubuntu.gtk.md is created at Wed Jan 31 2024 13:57:46 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/","title":"oc.template.ubuntu.minimal.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#from","title":"from","text":"

Docker official images ubuntu:18.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

file oc.template.ubuntu.minimal.18.04.md is created at Wed Jan 31 2024 13:46:40 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/","title":"oc.template.ubuntu.minimal.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#from","title":"from","text":"

Docker official images ubuntu:20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

file oc.template.ubuntu.minimal.20.04.md is created at Wed Jan 31 2024 13:47:38 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/","title":"oc.template.ubuntu.minimal.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#from","title":"from","text":"

Docker official images ubuntu:22.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#container-distribution-release","title":"Container distribution release","text":"
PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

file oc.template.ubuntu.minimal.22.04.md is created at Wed Jan 31 2024 13:47:17 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/","title":"oc.template.ubuntu.nvidia.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#from","title":"from","text":"

inherit nvidia/cuda:12.0.0-base-ubuntu20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

file oc.template.ubuntu.nvidia.20.04.md is created at Wed Jan 31 2024 13:46:51 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/","title":"oc.template.ubuntu.nvidia.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#from","title":"from","text":"

inherit nvidia/cuda:12.0.0-base-ubuntu22.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#container-distribution-release","title":"Container distribution release","text":"
PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

file oc.template.ubuntu.nvidia.22.04.md is created at Wed Jan 31 2024 13:46:36 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/","title":"oc.template.ubuntu.wine","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:$TAG\nMAINTAINER Alexandre DEVELY \n\n# install wget\nRUN apt-get update && apt-get install --no-install-recommends --yes \\\n       wget                             \\\n       && apt-get clean\n\n\n# set arch to i386\nRUN if [ $(dpkg --print-architecture) == 'amd64' ]; then dpkg --add-architecture i386; fi\n\n# only to use wine repo\n# RUN wget -qO - https://dl.winehq.org/wine-builds/winehq.key | apt-key add -\n# RUN apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ focal main'\n\n\n# tools for winetricks\n# Uses the following non-POSIX system tools:\n# - wine is used to execute Win32 apps except on Cygwin.\n# - ar, cabextract, unrar, unzip, and 7z are needed by some verbs.\n# - aria2c, wget, curl, or fetch is needed for downloading.\n# - fuseiso, archivemount (Linux), or hdiutil (macOS) is used to mount .iso images.\n# - perl is used to munge steam config files.\n# - pkexec, sudo, or kdesu (gksu/gksudo/kdesudo are deprecated upstream but also still supported)\n#   are used to mount .iso images if the user cached them with -k option.\n# - sha256sum, sha256, or shasum (OSX 10.5 does not support these, 10.6+ is required)\n# - torify is used with option \"--torify\" if sites are blocked in single countries.\n# - xdg-open (if present) or open (for OS X) is used to open download pages\n#   for the user when downloads cannot be fully automated.\n# - xz is used by some verbs to decompress tar archives.\n# - zenity is needed by the GUI, though it can limp along somewhat with kdialog/xmessage.\n\n\n#RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes aria2 \\\n#    apt-get clean \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes binutils \\\n#    apt-get clean \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes cabextract fuseiso p7zip-full policykit-1 && \\\n#    apt-get clean     \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes fuseiso && \\\n#    apt-get clean  \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes  p7zip-full policykit-1 && \\\n#    apt-get clean  \n\n# RUN apt-get update && \\\n#     apt-get install --no-install-recommends --yes  policykit-1 && \\\n#    apt-get clean  \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes tor unrar unzip xdg-utils xz-utils zenity && \\\n#    apt-get clean \n\n# gir1.2-gtk-3.0:i386 gir1.2-pango-1.0:i386 used by crossover\n\n# add for 20.04\n# apt-get install --no-install-recommends --yes libgcc-s1:i386 && \\\n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes aptitude libnss-mdns:i386 libsdl2-2.0-0 libsdl2-2.0-0:i386 gir1.2-gtk-3.0:i386 gir1.2-pango-1.0:i386 && \\\n#    apt-get clean \n\n# add dns support for 32 apps running on 64 bits\n#RUN apt-get update && apt-get install -y   \\\n#   libnss-mdns-i386            \\\n#   libnss-mdns             \\ \n#   wine-stable &&          \\\n#   apt-get clean       \n\n# RUN wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/amd64/libfaudio0_19.07-0~bionic_amd64.deb   &&  \\\n#     dpkg -i libfaudio0_19.07-0~bionic_amd64.deb                                           &&  \\\n#    rm libfaudio0_19.07-0~bionic_amd64.deb\n\n#RUN wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/i386/libfaudio0_19.07-0~bionic_i386.deb  &&  \\\n#    dpkg -i libfaudio0_19.07-0~bionic_i386.deb                                             &&  \\\n#    rm libfaudio0_19.07-0~bionic_i386.deb\n\n\n###\n#RUN mkdir -p /composer/.cache\n#RUN mkdir -p /composer/.cache/wine && \\\n#   wget  -O  /composer/.cache/wine/wine-gecko-2.47.1-x86.msi http://dl.winehq.org/wine/wine-gecko/2.47.1/wine-gecko-2.47.1-x86.msi && \\\n#   wget  -O  /composer/.cache/wine/wine-gecko-2.47.1-x86_64.msi http://dl.winehq.org/wine/wine-gecko/2.47.1/wine-gecko-2.47.1-x86_64.msi && \\\n#   wget  -O  /composer/.cache/wine/wine-mono-4.9.4.msi https://dl.winehq.org/wine/wine-mono/4.9.4/wine-mono-4.9.4.msi      \n##\n\nRUN mkdir -p /composer/.cache/fontconfig\n# COPY composer/.cache/fontconfig /composer/.cache/fontconfig\n\nRUN apt-get update && \\\n    apt-get install --yes wine && \\\n    apt-get clean\n\n# add xrdb for playonlinux\n# xrdb is in x11-xserver-utils\nRUN apt-get update && \\\n    apt-get install --no-install-recommends --yes libpython3.6 playonlinux x11-xserver-utils && \\\n    apt-get clean\n\n\nRUN apt-get update && \\\n    apt-get install --no-install-recommends --yes mono-runtime winetricks && \\\n    apt-get clean\n\nCOPY composer/updatereg.py              /composer\nCOPY composer/init.d/init.wine      /composer/init.d/init.wine\nCOPY composer/init.d/_init.wine         /composer/init.d/_init.wine\nRUN  mkdir /composer/.wine /composer/bin && chmod 777 /composer/.wine /composer/bin\n\n# Set for each app \nENV WINEPREFIX=/composer/.wine\n#ENV WINEARCH win32\n\n

file oc.template.ubuntu.wine.md is created at Wed Jan 31 2024 14:06:00 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/","title":"oc.template.ubuntu.wine.mswindow","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.wine

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG} \n\nENV DEBIAN_FRONTEND noninteractive \nRUN apt-get update && \\\n    apt-get install --install-recommends -y \\\n    xterm \\\n    wget \\\n    netcat \\\n    file \\\n    winbind \\\n    gettext \\ \n    libgettextpo-dev \\\n    && rm -rf /var/lib/apt/lists/*  \n\n# set arch to i386\nRUN dpkg --add-architecture i386\n\n# install play\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    libosmesa6:i386 \\\n        libnss-mdns \\\n    libnss-mdns:i386 \\\n    libncurses5:i386 \\\n    libodbc1:i386 \\\n    libxext6:i386 \\\n    libxi6:i386 \\\n    libfreetype6:i386 \\\n    libx11-6:i386 \\\n    libz1:i386 \\\n    libcups2:i386 \\\n    liblcms2-2:i386 \\\n    libglu1-mesa:i386 \\\n    libxcursor1:i386 \\\n    libxrandr2:i386 \\\n    libxml2:i386 \\\n    libgl1-mesa-dri:i386 \\\n    libgl1-mesa-glx:i386 \\\n    && rm -rf /var/lib/apt/lists/*\n\n# add source play on linux \nRUN apt-get update && \\\n   wget https://www.playonlinux.com/script_files/PlayOnLinux/4.3.4/PlayOnLinux_4.3.4.deb && \\\n   apt-get install --allow-downgrades -y ./PlayOnLinux_4.3.4.deb && \\\n   rm PlayOnLinux_4.3.4.deb && \\\n   rm -rf /var/lib/apt/lists/*\n\n

file oc.template.ubuntu.wine.mswindow.md is created at Wed Jan 31 2024 14:08:19 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"cheatsheets/bash/","title":"Bash scripting","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#getting-started","title":"Getting started","text":"

{: .-three-column}

","tags":["Featured"]},{"location":"cheatsheets/bash/#example","title":"Example","text":"
#!/usr/bin/env bash\n\nNAME=\"John\"\necho \"Hello $NAME!\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#variables","title":"Variables","text":"
NAME=\"John\"\necho $NAME\necho \"$NAME\"\necho \"${NAME}!\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#string-quotes","title":"String quotes","text":"
NAME=\"John\"\necho \"Hi $NAME\"  #=> Hi John\necho 'Hi $NAME'  #=> Hi $NAME\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#shell-execution","title":"Shell execution","text":"
echo \"I'm in $(pwd)\"\necho \"I'm in `pwd`\"\n# Same\n

See Command substitution

","tags":["Featured"]},{"location":"cheatsheets/bash/#conditional-execution","title":"Conditional execution","text":"
git commit && git push\ngit commit || echo \"Commit failed\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#functions","title":"Functions","text":"

{: id='functions-example'}

get_name() {\n  echo \"John\"\n}\n\necho \"You are $(get_name)\"\n

See: Functions

","tags":["Featured"]},{"location":"cheatsheets/bash/#conditionals","title":"Conditionals","text":"

{: id='conditionals-example'}

if [[ -z \"$string\" ]]; then\n  echo \"String is empty\"\nelif [[ -n \"$string\" ]]; then\n  echo \"String is not empty\"\nfi\n

See: Conditionals

","tags":["Featured"]},{"location":"cheatsheets/bash/#strict-mode","title":"Strict mode","text":"
set -euo pipefail\nIFS=$'\\n\\t'\n

See: Unofficial bash strict mode

","tags":["Featured"]},{"location":"cheatsheets/bash/#brace-expansion","title":"Brace expansion","text":"
echo {A,B}.js\n

| {A,B} | Same as A B | | {A,B}.js | Same as A.js B.js | | {1..5} | Same as 1 2 3 4 5 |

See: Brace expansion

","tags":["Featured"]},{"location":"cheatsheets/bash/#parameter-expansions","title":"Parameter expansions","text":"

{: .-three-column}

","tags":["Featured"]},{"location":"cheatsheets/bash/#basics","title":"Basics","text":"
name=\"John\"\necho ${name}\necho ${name/J/j}    #=> \"john\" (substitution)\necho ${name:0:2}    #=> \"Jo\" (slicing)\necho ${name::2}     #=> \"Jo\" (slicing)\necho ${name::-1}    #=> \"Joh\" (slicing)\necho ${name:(-1)}   #=> \"n\" (slicing from right)\necho ${name:(-2):1} #=> \"h\" (slicing from right)\necho ${food:-Cake}  #=> $food or \"Cake\"\n
length=2\necho ${name:0:length}  #=> \"Jo\"\n

See: Parameter expansion

STR=\"/path/to/foo.cpp\"\necho ${STR%.cpp}    # /path/to/foo\necho ${STR%.cpp}.o  # /path/to/foo.o\n\necho ${STR##*.}     # cpp (extension)\necho ${STR##*/}     # foo.cpp (basepath)\n\necho ${STR#*/}      # path/to/foo.cpp\necho ${STR##*/}     # foo.cpp\n\necho ${STR/foo/bar} # /path/to/bar.cpp\n
STR=\"Hello world\"\necho ${STR:6:5}   # \"world\"\necho ${STR:-5:5}  # \"world\"\n
SRC=\"/path/to/foo.cpp\"\nBASE=${SRC##*/}   #=> \"foo.cpp\" (basepath)\nDIR=${SRC%$BASE}  #=> \"/path/to/\" (dirpath)\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#substitution","title":"Substitution","text":"Code Description ${FOO%suffix} Remove suffix ${FOO#prefix} Remove prefix --- --- ${FOO%%suffix} Remove long suffix ${FOO##prefix} Remove long prefix --- --- ${FOO/from/to} Replace first match ${FOO//from/to} Replace all --- --- ${FOO/%from/to} Replace suffix ${FOO/#from/to} Replace prefix","tags":["Featured"]},{"location":"cheatsheets/bash/#comments","title":"Comments","text":"
# Single line comment\n
: '\nThis is a\nmulti line\ncomment\n'\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#substrings","title":"Substrings","text":"

| ${FOO:0:3} | Substring (position, length) | | ${FOO:-3:3} | Substring from the right |

","tags":["Featured"]},{"location":"cheatsheets/bash/#length","title":"Length","text":"

| ${#FOO} | Length of $FOO |

","tags":["Featured"]},{"location":"cheatsheets/bash/#manipulation","title":"Manipulation","text":"
STR=\"HELLO WORLD!\"\necho ${STR,}   #=> \"hELLO WORLD!\" (lowercase 1st letter)\necho ${STR,,}  #=> \"hello world!\" (all lowercase)\n\nSTR=\"hello world!\"\necho ${STR^}   #=> \"Hello world!\" (uppercase 1st letter)\necho ${STR^^}  #=> \"HELLO WORLD!\" (all uppercase)\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#default-values","title":"Default values","text":"

| ${FOO:-val} | $FOO, or val if not set | | ${FOO:=val} | Set $FOO to val if not set | | ${FOO:+val} | val if $FOO is set | | ${FOO:?message} | Show error message and exit if $FOO is not set |

The : is optional (eg, ${FOO=word} works)

","tags":["Featured"]},{"location":"cheatsheets/bash/#loops","title":"Loops","text":"

{: .-three-column}

","tags":["Featured"]},{"location":"cheatsheets/bash/#basic-for-loop","title":"Basic for loop","text":"
for i in /etc/rc.*; do\n  echo $i\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#c-like-for-loop","title":"C-like for loop","text":"
for ((i = 0 ; i < 100 ; i++)); do\n  echo $i\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#ranges","title":"Ranges","text":"
for i in {1..5}; do\n    echo \"Welcome $i\"\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#with-step-size","title":"With step size","text":"
for i in {5..50..5}; do\n    echo \"Welcome $i\"\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#reading-lines","title":"Reading lines","text":"
cat file.txt | while read line; do\n  echo $line\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#forever","title":"Forever","text":"
while true; do\n  \u00b7\u00b7\u00b7\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#functions_1","title":"Functions","text":"

{: .-three-column}

","tags":["Featured"]},{"location":"cheatsheets/bash/#defining-functions","title":"Defining functions","text":"
myfunc() {\n    echo \"hello $1\"\n}\n
# Same as above (alternate syntax)\nfunction myfunc() {\n    echo \"hello $1\"\n}\n
myfunc \"John\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#returning-values","title":"Returning values","text":"
myfunc() {\n    local myresult='some value'\n    echo $myresult\n}\n
result=\"$(myfunc)\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#raising-errors","title":"Raising errors","text":"
myfunc() {\n  return 1\n}\n
if myfunc; then\n  echo \"success\"\nelse\n  echo \"failure\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#arguments","title":"Arguments","text":"Expression Description $# Number of arguments $* All arguments $@ All arguments, starting from first $1 First argument $_ Last argument of the previous command

See Special parameters.

","tags":["Featured"]},{"location":"cheatsheets/bash/#conditionals_1","title":"Conditionals","text":"

{: .-three-column}

","tags":["Featured"]},{"location":"cheatsheets/bash/#conditions","title":"Conditions","text":"

Note that [[ is actually a command/program that returns either 0 (true) or 1 (false). Any program that obeys the same logic (like all base utils, such as grep(1) or ping(1)) can be used as condition, see examples.

Condition Description [[ -z STRING ]] Empty string [[ -n STRING ]] Not empty string [[ STRING == STRING ]] Equal [[ STRING != STRING ]] Not Equal --- --- [[ NUM -eq NUM ]] Equal [[ NUM -ne NUM ]] Not equal [[ NUM -lt NUM ]] Less than [[ NUM -le NUM ]] Less than or equal [[ NUM -gt NUM ]] Greater than [[ NUM -ge NUM ]] Greater than or equal --- --- [[ STRING =~ STRING ]] Regexp --- --- (( NUM < NUM )) Numeric conditions Condition Description [[ -o noclobber ]] If OPTIONNAME is enabled --- --- [[ ! EXPR ]] Not [[ X ]] && [[ Y ]] And [[ X ]] || [[ Y ]] Or","tags":["Featured"]},{"location":"cheatsheets/bash/#file-conditions","title":"File conditions","text":"Condition Description [[ -e FILE ]] Exists [[ -r FILE ]] Readable [[ -h FILE ]] Symlink [[ -d FILE ]] Directory [[ -w FILE ]] Writable [[ -s FILE ]] Size is > 0 bytes [[ -f FILE ]] File [[ -x FILE ]] Executable --- --- [[ FILE1 -nt FILE2 ]] 1 is more recent than 2 [[ FILE1 -ot FILE2 ]] 2 is more recent than 1 [[ FILE1 -ef FILE2 ]] Same files","tags":["Featured"]},{"location":"cheatsheets/bash/#example_1","title":"Example","text":"
# String\nif [[ -z \"$string\" ]]; then\n  echo \"String is empty\"\nelif [[ -n \"$string\" ]]; then\n  echo \"String is not empty\"\nfi\n
# Combinations\nif [[ X ]] && [[ Y ]]; then\n  ...\nfi\n
# Equal\nif [[ \"$A\" == \"$B\" ]]\n
# Regex\nif [[ \"A\" =~ . ]]\n
if (( $a < $b )); then\n   echo \"$a is smaller than $b\"\nfi\n
if [[ -e \"file.txt\" ]]; then\n  echo \"file exists\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#arrays","title":"Arrays","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#defining-arrays","title":"Defining arrays","text":"
Fruits=('Apple' 'Banana' 'Orange')\n
Fruits[0]=\"Apple\"\nFruits[1]=\"Banana\"\nFruits[2]=\"Orange\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#working-with-arrays","title":"Working with arrays","text":"
echo ${Fruits[0]}           # Element #0\necho ${Fruits[@]}           # All elements, space-separated\necho ${#Fruits[@]}          # Number of elements\necho ${#Fruits}             # String length of the 1st element\necho ${#Fruits[3]}          # String length of the Nth element\necho ${Fruits[@]:3:2}       # Range (from position 3, length 2)\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#operations","title":"Operations","text":"
Fruits=(\"${Fruits[@]}\" \"Watermelon\")    # Push\nFruits+=('Watermelon')                  # Also Push\nFruits=( ${Fruits[@]/Ap*/} )            # Remove by regex match\nunset Fruits[2]                         # Remove one item\nFruits=(\"${Fruits[@]}\")                 # Duplicate\nFruits=(\"${Fruits[@]}\" \"${Veggies[@]}\") # Concatenate\nlines=(`cat \"logfile\"`)                 # Read from file\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#iteration","title":"Iteration","text":"
for i in \"${arrayName[@]}\"; do\n  echo $i\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#dictionaries","title":"Dictionaries","text":"

{: .-three-column}

","tags":["Featured"]},{"location":"cheatsheets/bash/#defining","title":"Defining","text":"
declare -A sounds\n
sounds[dog]=\"bark\"\nsounds[cow]=\"moo\"\nsounds[bird]=\"tweet\"\nsounds[wolf]=\"howl\"\n

Declares sound as a Dictionary object (aka associative array).

","tags":["Featured"]},{"location":"cheatsheets/bash/#working-with-dictionaries","title":"Working with dictionaries","text":"
echo ${sounds[dog]} # Dog's sound\necho ${sounds[@]}   # All values\necho ${!sounds[@]}  # All keys\necho ${#sounds[@]}  # Number of elements\nunset sounds[dog]   # Delete dog\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#iteration_1","title":"Iteration","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#iterate-over-values","title":"Iterate over values","text":"
for val in \"${sounds[@]}\"; do\n  echo $val\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#iterate-over-keys","title":"Iterate over keys","text":"
for key in \"${!sounds[@]}\"; do\n  echo $key\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#options","title":"Options","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#options_1","title":"Options","text":"
set -o noclobber  # Avoid overlay files (echo \"hi\" > foo)\nset -o errexit    # Used to exit upon error, avoiding cascading errors\nset -o pipefail   # Unveils hidden failures\nset -o nounset    # Exposes unset variables\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#glob-options","title":"Glob options","text":"
shopt -s nullglob    # Non-matching globs are removed  ('*.foo' => '')\nshopt -s failglob    # Non-matching globs throw errors\nshopt -s nocaseglob  # Case insensitive globs\nshopt -s dotglob     # Wildcards match dotfiles (\"*.sh\" => \".foo.sh\")\nshopt -s globstar    # Allow ** for recursive matches ('lib/**/*.rb' => 'lib/a/b/c.rb')\n

Set GLOBIGNORE as a colon-separated list of patterns to be removed from glob matches.

","tags":["Featured"]},{"location":"cheatsheets/bash/#history","title":"History","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#commands","title":"Commands","text":"

| history | Show history | | shopt -s histverify | Don't execute expanded result immediately |

","tags":["Featured"]},{"location":"cheatsheets/bash/#expansions","title":"Expansions","text":"

| !$ | Expand last parameter of most recent command | | !* | Expand all parameters of most recent command | | !-n | Expand nth most recent command | | !n | Expand nth command in history | | !<command> | Expand most recent invocation of command <command> |

","tags":["Featured"]},{"location":"cheatsheets/bash/#operations_1","title":"Operations","text":"

| !! | Execute last command again | | !!:s/<FROM>/<TO>/ | Replace first occurrence of <FROM> to <TO> in most recent command | | !!:gs/<FROM>/<TO>/ | Replace all occurrences of <FROM> to <TO> in most recent command | | !$:t | Expand only basename from last parameter of most recent command | | !$:h | Expand only directory from last parameter of most recent command |

!! and !$ can be replaced with any valid expansion.

","tags":["Featured"]},{"location":"cheatsheets/bash/#slices","title":"Slices","text":"

| !!:n | Expand only nth token from most recent command (command is 0; first argument is 1) | | !^ | Expand first argument from most recent command | | !$ | Expand last token from most recent command | | !!:n-m | Expand range of tokens from most recent command | | !!:n-$ | Expand nth token to last from most recent command |

!! can be replaced with any valid expansion i.e. !cat, !-2, !42, etc.

","tags":["Featured"]},{"location":"cheatsheets/bash/#miscellaneous","title":"Miscellaneous","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#numeric-calculations","title":"Numeric calculations","text":"
$((a + 200))      # Add 200 to $a\n
$((RANDOM%=200))  # Random number 0..200\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#subshells","title":"Subshells","text":"
(cd somedir; echo \"I'm now in $PWD\")\npwd # still in first directory\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#redirection","title":"Redirection","text":"
python hello.py > output.txt   # stdout to (file)\npython hello.py >> output.txt  # stdout to (file), append\npython hello.py 2> error.log   # stderr to (file)\npython hello.py 2>&1           # stderr to stdout\npython hello.py 2>/dev/null    # stderr to (null)\npython hello.py &>/dev/null    # stdout and stderr to (null)\n
python hello.py < foo.txt      # feed foo.txt to stdin for python\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#inspecting-commands","title":"Inspecting commands","text":"
command -V cd\n#=> \"cd is a function/alias/whatever\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#trap-errors","title":"Trap errors","text":"
trap 'echo Error at about $LINENO' ERR\n

or

traperr() {\n  echo \"ERROR: ${BASH_SOURCE[1]} at about ${BASH_LINENO[0]}\"\n}\n\nset -o errtrace\ntrap traperr ERR\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#caseswitch","title":"Case/switch","text":"
case \"$1\" in\n  start | up)\n    vagrant up\n    ;;\n\n  *)\n    echo \"Usage: $0 {start|stop|ssh}\"\n    ;;\nesac\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#source-relative","title":"Source relative","text":"
source \"${0%/*}/../share/foo.sh\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#printf","title":"printf","text":"
printf \"Hello %s, I'm %s\" Sven Olga\n#=> \"Hello Sven, I'm Olga\n\nprintf \"1 + 1 = %d\" 2\n#=> \"1 + 1 = 2\"\n\nprintf \"This is how you print a float: %f\" 2\n#=> \"This is how you print a float: 2.000000\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#directory-of-script","title":"Directory of script","text":"
DIR=\"${0%/*}\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#getting-options","title":"Getting options","text":"
while [[ \"$1\" =~ ^- && ! \"$1\" == \"--\" ]]; do case $1 in\n  -V | --version )\n    echo $version\n    exit\n    ;;\n  -s | --string )\n    shift; string=$1\n    ;;\n  -f | --flag )\n    flag=1\n    ;;\nesac; shift; done\nif [[ \"$1\" == '--' ]]; then shift; fi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#heredoc","title":"Heredoc","text":"
cat <<END\nhello world\nEND\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#reading-input","title":"Reading input","text":"
echo -n \"Proceed? [y/n]: \"\nread ans\necho $ans\n
read -n 1 ans    # Just one character\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#special-variables","title":"Special variables","text":"

| $? | Exit status of last task | | $! | PID of last background task | | $$ | PID of shell | | $0 | Filename of the shell script |

See Special parameters.

","tags":["Featured"]},{"location":"cheatsheets/bash/#go-to-previous-directory","title":"Go to previous directory","text":"
pwd # /home/user/foo\ncd bar/\npwd # /home/user/foo/bar\ncd -\npwd # /home/user/foo\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#check-for-commands-result","title":"Check for command's result","text":"
if ping -c 1 google.com; then\n  echo \"It appears you have a working internet connection\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#grep-check","title":"Grep check","text":"
if grep -q 'foo' ~/.bash_history; then\n  echo \"You appear to have typed 'foo' in the past\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#also-see","title":"Also see","text":"

{: .-one-column}

","tags":["Featured"]},{"location":"cheatsheets/docker/","title":"Docker scripting cheatsheets","text":""},{"location":"cheatsheets/docker/#common-docker-commands","title":"Common Docker commands","text":""},{"location":"cheatsheets/docker/#update-all-images","title":"update all images","text":"
docker images |grep -v REPOSITORY|awk '{print $1}'|xargs -L1 docker pull\n
"},{"location":"cheatsheets/docker/#remove-exited-container","title":"Remove exited container","text":"
docker rm `docker ps -a -q -f \"status=exited\"`\n
"},{"location":"cheatsheets/docker/#remove-dangling-images","title":"Remove dangling images","text":"
docker rmi `docker images -q --filter \"dangling=true\"`\n
"},{"location":"cheatsheets/macos/","title":"Macos","text":"

Docker For Mac embeds a hypervisor (based on xhyve), a Linux distribution which runs on LinuxKit and filesystem & network sharing that is much more Mac native. Docker For Mac is a Mac native application in /Applications.

At installation time, it creates symlinks in /usr/local/bin for docker and docker-compose, to the commands in the application bundle, in /Applications/Docker.app/Contents/Resources/bin.

To install dockerd on MacOS/X, use Docker for Desktop. Get Docker for MacOS on the docker website docker-for-mac

To get a shell to the LinuxKit docker-desktop, run the docker command

docker run -it --rm --privileged --pid=host justincormack/nsenter1\n

more info: https://github.com/justincormack/nsenter1

"},{"location":"common/acl/","title":"Define access control list for application","text":""},{"location":"common/acl/#goals","title":"Goals","text":""},{"location":"common/acl/#requirements","title":"Requirements","text":""},{"location":"common/acl/#update-applistjson-file","title":"Update applist.json file","text":"

To restrict access to applications using authentication label, you need to define an acl entry in the application dictionary object.

    \"acl\": { \"permit\": [ \"tag\" ] },\n

For example using the application xedit

all is a special label for everything. The xedit application can be run for all tags.

{\n    \"acl\": { \"permit\": [ \"all\" ] },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"x11-apps\",\n    \"icon\": \"xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\":\"txt;log;md\"\n}\n

To restrict access to applications using authentication label, you have to define label using rules during authentification step, and define label to the application.

"},{"location":"common/acl/#define-authenticated-label-using-rules","title":"Define authenticated label using rules","text":"

You can read the chapter authentification-rules to define some autenticated labels.

Update the od.config file, to add a label mylocal if the source ip address is in local network 192.168.0.0/16

authmanagers: {\n 'external': {},\n 'explicit': {},\n 'implicit': {\n   'providers': {\n     'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous',\n        'policies': { \n          'acl'   : { 'permit': [ 'all' ] }, \n            'rules' : \n                { 'rule-net-home': {  \n                    'conditions' : [ { 'network': '192.168.0.0/16', 'expected' : True } ],\n                    'expected'   : True,\n                    'label'      : 'localnet'\n                   } \n                } \n        } \n     } \n    } \n  } \n} \n\n

Restart the pyos service

kubectl delete pod -l run-pyos-od -n abcdesktop\n

When your services are restarted, launch your web browser

Login to your abcdesktop service and choose anonymous authentication

Check the label set during the authentication process

Goto the menu option at the right up corner, choose Settings | User | Session

You should read the label localnet in the Anonymous user information.

"},{"location":"common/acl/#define-the-acl-label-to-the-application","title":"Define the acl label to the application","text":"

You can read the chapter Build your own application image , if your are building user docker abcdsktop application image for the first time.

"},{"location":"common/acl/#create-a-xeditjson-file","title":"Create a xedit.json file","text":"

Create a edit.json file with the content :

{\n    \"acl\": { \"permit\": [ \"localhost\", \"localnet\"  ] },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"x11-apps\",\n    \"icon\": \"xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\":\"txt;log;md\"\n}\n

To build your new image, download the make.js script file. make.js is located in the oc.apps repository. Look at https://github.com/abcdesktopio/oc.apps if you can't download this file.

Make sure that you have installed nodejs

To install make.js command

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/make.js\n

Create icons directory

mkdir -p icons\ncurl --output icons/xedit.svg https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/xedit.svg \n

Run the make command

node make.js -f xedit.json Dockerfile\n

You should read on standard output

myArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nopening file xedit.json\napplist.json entries: 1\nmyArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nBuilding file Dockerfile as output\n{\n  acl: { permit: [ 'all' ] },\n  cat: 'utilities',\n  debpackage: 'x11-apps',\n  icon: 'xedit.svg',\n  keyword: 'text,notepad,edit,txt,editor,xedit',\n  launch: 'xedit.Xedit',\n  name: 'xedit',\n  displayname: 'Xedit',\n  path: '/usr/bin/xedit',\n  template: 'abcdesktopio/oc.template.gtk',\n  mimetype: 'application/text;',\n  fileextensions: 'txt;log;md'\n}\nBuilding xedit.Xedit\n

Look at the new Dockerfile, and build the new docker image for xedit

docker build -t xedit.d .\n

You should read on standard output

[+] Building 13.0s (11/11) FINISHED                                                                                                                                                                     \n => [internal] load build definition from Dockerfile                                                                                                                                               0.0s\n => => transferring dockerfile: 2.01kB                                                                                                                                                             0.0s\n => [internal] load .dockerignore                                                                                                                                                                  0.0s\n => => transferring context: 2B                                                                                                                                                                    0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:dev                                                                                                                        2.3s\n => [auth] abcdesktopio/oc.template.gtk:pull token for registry-1.docker.io                                                                                                                        0.0s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79                                                                  0.4s\n => => resolve docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79                                                                  0.0s\n => => sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79 3.88kB / 3.88kB                                                                                                     0.0s\n => => sha256:fe01ec1c214baf8b3e86255ac7dbca3157be4932ae19dfe07bbcf7d8c8839b07 7.80kB / 7.80kB                                                                                                     0.0s\n => [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps && apt-get clean                                                               8.7s\n => [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections                                                                                                       0.4s\n => [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                                                                                               0.3s \n => [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                                                                                               0.3s \n => [6/6] WORKDIR /home/balloon                                                                                                                                                                    0.0s \n => exporting to image                                                                                                                                                                             0.3s \n => => exporting layers                                                                                                                                                                            0.3s \n => => writing image sha256:0b7cb908c88bf6301eb0555e558e99436e40bd5604e7ffebd12f137e9b5f9878                                                                                                       0.0s\n => => naming to docker.io/library/xedit.d  \n

Then look at the acl label

docker inspect xedit.d | grep oc.acl\n
                \"oc.acl\": \"{\\\"permit\\\":[\\\"localhost\\\",\\\"localnet\\\"]}\",\n                \"oc.acl\": \"{\\\"permit\\\":[\\\"localhost\\\",\\\"localnet\\\"]}\",\n

The acl is stringified json object.

"},{"location":"common/acl/#run-the-xedit-application-from-your-local-network","title":"Run the xedit application from your local network","text":"

The xedit application is listed only if your are connected from a local network matching the previous rules.

Look for the application xedit, using the quick launch search text area on the bottom right corner. Insert the first character of xedit :

Launch the xedit application

"},{"location":"common/acl/#run-the-application-from-another-source-ip-address-or-update-the-acl-application","title":"Run the application from another source IP address or update the acl application","text":""},{"location":"common/acl/#update-acl-of-xedit-application","title":"Update acl of xedit application","text":"

To update the acl of xedit application, edit the edit.json file with the content, and set nowhere tag in acl array :

{\n    \"acl\": { \"permit\": [ \"nowhere\"  ] },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"x11-apps\",\n    \"icon\": \"xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\":\"txt;log;md\"\n}\n

Then, rebuild Dockerfile and the docker image of the xedit application

node make.js -f xedit.json Dockerfile\ndocker build -t xedit.d .\n
% node make.js -f xedit.json Dockerfile\nmyArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nopening file xedit.json\napplist.json entries: 1\nmyArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nBuilding file Dockerfile as output\n{\n  acl: { permit: [ 'nowhere' ] },\n  cat: 'utilities',\n  debpackage: 'x11-apps',\n  icon: 'xedit.svg',\n  keyword: 'text,notepad,edit,txt,editor,xedit',\n  launch: 'xedit.Xedit',\n  name: 'xedit',\n  displayname: 'Xedit',\n  path: '/usr/bin/xedit',\n  template: 'abcdesktopio/oc.template.gtk',\n  mimetype: 'application/text;',\n  fileextensions: 'txt;log;md'\n}\nBuilding xedit.Xedit\n\n% docker build -t xedit.d .\n[+] Building 1.5s (11/11) FINISHED                                                                                                                                                                      \n => [internal] load build definition from Dockerfile                                                                                                                                               0.0s\n => => transferring dockerfile: 4.19kB                                                                                                                                                             0.0s\n => [internal] load .dockerignore                                                                                                                                                                  0.0s\n => => transferring context: 2B                                                                                                                                                                    0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:dev                                                                                                                        1.4s\n => [auth] abcdesktopio/oc.template.gtk:pull token for registry-1.docker.io                                                                                                                        0.0s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79                                                                  0.0s\n => CACHED [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps && apt-get clean                                                        0.0s\n => CACHED [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections                                                                                                0.0s\n => CACHED [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                                                                                        0.0s\n => CACHED [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                                                                                        0.0s\n => CACHED [6/6] WORKDIR /home/balloon                                                                                                                                                             0.0s\n => exporting to image                                                                                                                                                                             0.0s\n => => exporting layers                                                                                                                                                                            0.0s\n => => writing image sha256:640a4dd66b03420c4128e2fcd920dc5749cc5b687abc62b68e52f3c562943903                                                                                                       0.0s\n => => naming to docker.io/library/xedit.d       \n

Launch your web browser, and log in to your abcdesktop service

Check that xedit is not found and not listed.

The new acl does not allow the xedit application to be run and show. You can now define your own rules, add set the access control list to your applications.

"},{"location":"common/custom-wallpaper/","title":"Customize default wallpaper","text":""},{"location":"common/custom-wallpaper/#requirements","title":"Requirements","text":""},{"location":"common/custom-wallpaper/#goals","title":"Goals","text":""},{"location":"common/custom-wallpaper/#change-odconfig-file","title":"Change od.config file","text":"

To update the default wallpaper file, add a ENV variable in the desktop.envlocal dictionary.

desktop.envlocal :  {   'DISPLAY'               : ':0.0',\n                        'USER'                  : 'balloon',\n                        'LOGNAME'               : 'balloon',\n                        'LIBOVERLAY_SCROLLBAR'  : '0',\n                        'UBUNTU_MENUPROXY'      : '0',\n                        'HOME'                  : '/home/balloon',\n                          'SET_DEFAULT_WALLPAPER' : 'welcometoabcdesktop.png'\n                    } \n

"},{"location":"common/custom-wallpaper/#update-ocuser-image-to-add-your-own-wallpaper","title":"Update oc.user image to add your own wallpaper","text":""},{"location":"common/custom-wallpaper/#find-a-new-wallpaper-image","title":"Find a new wallpaper image","text":""},{"location":"common/custom-wallpaper/#create-a-new-ocuser-image","title":"Create a new oc.user image","text":"

Not For a development environment, add the TAG dev

FROM abcdesktopio/oc.user.18.04:dev \nUSER root\nCOPY silas-baisch-unsplash.jpg /composer/wallpapers\nUSER balloon\n

To build the new docker image, run the command line

docker build -t abcdesktopio/oc.user.18.04 .\n

You should read on the standard output :

Sending build context to Docker daemon  3.184MB\nStep 1/4 : FROM abcdesktopio/oc.user.18.04:dev\n ---> 61bfdb4e71d4\nStep 2/4 : USER root\n ---> Using cache\n ---> c1aa17b9999c\nStep 3/4 : COPY silas-baisch-unsplash.jpg /composer/wallpapers\n ---> 73c786ecca04\nStep 4/4 : USER balloon\n ---> Running in 1e0ad794c0cb\nRemoving intermediate container 1e0ad794c0cb\n ---> a0b12a183b47\nSuccessfully built a0b12a183b47\nSuccessfully tagged abcdesktopio/oc.user.18.04:dev\n
"},{"location":"common/custom-wallpaper/#change-odconfig-file_1","title":"Change od.config file","text":"

To update the default wallpaper file, add a ENV variable in the desktop.envlocal dictionary.

desktop.envlocal :  {   'DISPLAY'               : ':0.0',\n                        'USER'                  : 'balloon',\n                        'LOGNAME'               : 'balloon',\n                        'LIBOVERLAY_SCROLLBAR'  : '0',\n                        'UBUNTU_MENUPROXY'      : '0',\n                        'HOME'                  : '/home/balloon',\n                          'SET_DEFAULT_WALLPAPER' : 'silas-baisch-unsplash.jpg'\n                    } \n

"},{"location":"common/debug_application/","title":"How to debug containerised application","text":""},{"location":"common/debug_application/#requirements","title":"Requirements","text":""},{"location":"common/debug_application/#goals","title":"Goals","text":""},{"location":"common/debug_application/#read-log-from-web-interface","title":"Read log from web interface","text":"

Start an containerised application, I choose 2048 application, for example.

Using the web browser, choose Settings in the menu.

Choose Tasks to list all running containers

Choose Logs to read the stdout log file of an application

This application write on stdout

Error setting cipher RC4\n40F7D1D5D07F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:349:Global default library context, Algorithm (RC4 : 37), Properties ()\nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n
"},{"location":"common/debug_application/#read-log-from-daemon-interface-optionnal","title":"Read log from daemon interface (optionnal)","text":"

You will read the sample stdout line, using a docker logs command, open a shell on you host.

In a shell on your host, look for the container id of the 2048 containerised application

$ docker ps -a|grep 2048\n01579054a1f6   abcdesktopio/ubuntu-2048.d:3.0   \"/composer/appli-doc\u2026\"   21 minutes ago     Up 21 minutes                                                                   anonymous-ubuntu-2048-37830ad00d9f473aa4d0c7872089c6b8\n

Read the log file form the docker logs command

$ docker logs 01579054a1f6\n

You should read on output the same lines written on the web interface

Error setting cipher RC4\n40F7D1D5D07F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:349:Global default library context, Algorithm (RC4 : 37), Properties ()\nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n
"},{"location":"common/debug_application/#read-log-files-from-an-application-using-the-redirected-stderr-and-stdout","title":"Read log files from an application using the redirected stderr and stdout","text":"

The main log files are lastcmd.log lastcmdenv.log and $APPBIN.log:

By default, with all abcdesktop templates, applications redirect stderr to stdout and pipe to a tee.

${APP} ${ARGS} \"${APPARGS}\" 2>&1 | tee /tmp/$BASENAME_APP.log\n

By default, the /tmp volume is shared with all containers. So to debug and read log applications, you can run a webshell to have an access to stdout and stderr content.

The var $BASENAME_APP is the name of your application

BASENAME_APP=$(basename \"$APPBIN\")\n

and APPBIN is path to the binary

Example with the 2048-qt application

APPBIN=/usr/games/2048-qt\n

The /tmp directory, you can read the log file '/tmp/2048-qt.log'. Look at the /tmp directory

balloon:~$ ls -la /tmp/\ntotal 20\ndrwxrwxrwt 5 root    root     260 Dec  1 09:58 .\ndrwxr-xr-x 1 root    root    4096 Dec  1 09:55 ..\n-rw-r--r-- 1 balloon balloon  102 Dec  1 09:58 2048-qt.log\nsrwxrwxrwx 1 root    root       0 Dec  1 09:55 .cups.sock\n-rw-r--r-- 1 balloon balloon    0 Dec  1 09:57 gnome-2048.log\n-rw-r--r-- 1 balloon balloon 1175 Dec  1 09:58 lastcmdenv.log\n-rw-r--r-- 1 balloon balloon  437 Dec  1 09:58 lastcmd.log\ndrwx------ 2 balloon balloon   60 Dec  1 09:55 pulse-jkzlygT9Y7lT\nsrwxrwxrwx 1 balloon balloon    0 Dec  1 09:55 .pulse.sock\ndrwx------ 2 balloon balloon   40 Dec  1 09:58 runtime-balloon\n-r--r--r-- 1 balloon balloon   11 Dec  1 09:55 .X0-lock\ndrwxrwxrwt 2 root    root      60 Dec  1 09:55 .X11-unix\nsrw------- 1 balloon balloon    0 Dec  1 09:55 .x11vnc\nballoon:~$\n

The files are /tmp/lastcmd.log, /tmp/lastcmdenv.log and /tmp/2048-qt.log.

Dump the /tmp/2048-qt.log, with a cat command cat /tmp/2048-qt.log. Replace /tmp/2048-qt.log by your own application (binary) if you choose another application.

You can run all bash commands inside the webshell.

balloon:~$ cat /tmp/2048-qt.log \nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n

Dump the /composer/appli-docker-entrypoint.sh result in /tmp/lastcmd.log, with a cat command cat /tmp/lastcmd.log.

balloon:~$ cat /tmp/lastcmd.log \nAPP=/usr/bin/gnome-2048\nARGS=\nAPPARGS=\nrun previous init overlay stack\nrun init app if exists\nBASENAME_APP=gnome-2048\nxauth add :0.0 MIT-MAGIC-COOKIE-1 55dd9838e9404e3b13b635153365d3\nsetting pulseaudio cookie\nend of app exit_code=0\n

Dump all environment variables in file /tmp/lastcmdenv.log.

balloon:/tmp$ cat /tmp/lastcmdenv.log \nBUSER=balloon\nSENDCUTTEXT=enabled\nPARENT_ID=2eecb67f5408c2552e7ee78b4fa2c9a419e9af9557c12c4d2f9f5c4fd1af70f4\nAPPBIN=/usr/games/2048-qt\nHOSTNAME=c477d8983486\nLANGUAGE=en_US\nSTDOUT_LOGFILE=/tmp/lastcmd.log\nLC_ADDRESS=en_US.UTF-8\nCUPS_SERVER=/tmp/.cups.sock\nLIBOVERLAY_SCROLLBAR=0\nLC_MONETARY=en_US.UTF-8\nPULSEAUDIO_COOKIE=17de4db317fbf10624911dbe28c528bd\nPWD=/home/balloon\nLOGNAME=balloon\nXAUTH_KEY=55dd9838e9404e3b13b635153365d3\nTZ=Europe/Paris\nHOME=/home/balloon\nLC_PAPER=en_US.UTF-8\nLANG=en_US.UTF-8\nACCEPTCUTTEXT=enabled\nAPP=/usr/games/2048-qt\nAPPNAME=ubuntu-2048\nDEBCONF_FRONTEND=noninteractive\nSET_DEFAULT_WALLPAPER=welcometoabcdesktop.png\nTERM=linux\nLC_IDENTIFICATION=en_US.UTF-8\nUSER=balloon\nDISPLAY=:0.0\nSHLVL=1\nLC_TELEPHONE=en_US.UTF-8\nLC_MEASUREMENT=en_US.UTF-8\nUBUNTU_MENUPROXY=0\nSTDOUT_ENVLOGFILE=/tmp/lastcmdenv.log\nBROADCAST_COOKIE=b7bc93457df5aa6bedb5ad2fe972268fa268bf3439b4024c\nLC_TIME=en_US.UTF-8\nLC_ALL=en_US.UTF-8\nPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nPULSE_SERVER=/tmp/.pulse.sock\nLC_NUMERIC=en_US.UTF-8\n

We describe how to read the environment variables, the stdout file and the stderr file, to get some information and error for a containerised application.

In next chapter we will start an application from a fresh ubuntu image, to get more details.

"},{"location":"common/firefox-extension/","title":"Mozilla Firefox clipboard extension","text":""},{"location":"common/firefox-extension/#install-firefox-extension-file","title":"Install Firefox Extension file","text":""},{"location":"common/firefox-extension/#download-the-mozilla-firefox-clipboard-extension-for-abcdesktop","title":"Download the Mozilla Firefox clipboard extension for abcdesktop","text":"
  1. Download the firefox clipboard extension abcdesktop_clipboard_helper.xpi and press Continue to Installation button.

  2. Choose Add as a response to the question Add abcdesktop Clipboad Helper ?

  3. Press OKay, Got it to confirm the abcdesktop Clipboad helper insallation

"},{"location":"common/firefox-extension/#use-fully-qualified-domain-name-filter","title":"Use fully qualified domain name filter","text":"

Firefox clipboard extension runs ONLY if the hostname contains desktop string.

The URL must matches *://*desktop*/*\" to run the clipboard extension.

"},{"location":"common/firefox-extension/#run-firefox-clipboard-extension-for-abcdesktop","title":"Run firefox clipboard extension for abcdesktop","text":"

Firefox clipboard extension syncs only text data, binary data like images are not yet supported.

"},{"location":"common/flash-firefox-esr/","title":"How to build and run abcdesktop firefox-esr image to run flash application","text":"

Adobe no longer supports Flash Player after December 31, 2020 and blocked Flash content from running in Flash Player beginning January 12, 2021.

Lot of applications need to be rewrite, this can take time to rewrite application using HTML5.

Abcdesktop can be use to run Abode Flash application, using Firefox ESR web browser.

Firefox Extended Support Release (ESR) is an official version of Firefox developed for large organizations like universities and businesses that need to set up and maintain Firefox on a large scale. Firefox ESR does not come with the latest features but it has the latest security and stability fixes.

"},{"location":"common/flash-firefox-esr/#goals","title":"Goals","text":""},{"location":"common/flash-firefox-esr/#requirements","title":"Requirements","text":""},{"location":"common/flash-firefox-esr/#edit-the-mmscfg-file","title":"Edit the mms.cfg file","text":"

Edit the mms.cfg file, and add your own website url

EOLUninstallDisable=1\nSilentAutoUpdateEnable=0\nAutoUpdateDisable=1\nEnableAllowList=1\nAllowListURLPattern=*://*.adobe.com\nAllowListURLPattern=https://*.abcdesktop.io\n

Add the a new line and replace https://www.domain.comby your own web site

AllowListURLPattern=https://www.domain.com\n
"},{"location":"common/flash-firefox-esr/#create-file-firefox-esrd","title":"Create file firefox-esr.d","text":"

Create a Dockerfile firefox-esr.d

FROM abcdesktopio/firefox-esr.d\nUSER 0\nCOPY mms.cfg /etc/adobe/mms.cfg\nUSER balloon\n
"},{"location":"common/flash-firefox-esr/#build-the-new-firefox-esr-abcdesktop-image","title":"Build the new firefox-esr abcdesktop image","text":"

Run the docker build command

docker build -t firefox-esr.d -f firefox-esr.d .\n
"},{"location":"common/flash-firefox-esr/#run-the-firefox-esr-application","title":"Run the firefox-esr application","text":""},{"location":"common/flash-firefox-esr/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

Using you web browser, log in to your abcdesktop service

Look at the twice firefox icon for Firefox and Firefox-esr application.

Start the application Firefox-esr

Open you own flash website, or go to https://www.abcdesktop.io/flash sample web site

Click to the Run Adobe Flash plugins

And Allow the Adobe Flash to run

Great, you can run the Adobe Flash plugins.

"},{"location":"common/non-free-applications/","title":"Install non-free applications","text":""},{"location":"common/non-free-applications/#install-and-build-citrix-receiver-for-abcdesktop","title":"Install and build Citrix Receiver for abcdesktop","text":"

Citrix Workspace App or Citrix Receiver does not exist in official debian repository. You need to download the deb package from the www.citrix.com website manually.

git clone https://github.com/abcdesktopio/oc.apps.git\n
cd oc.apps\ncp ~/Download/icaclient_13.10.0.20_amd64.deb icaclient_amd64.deb \n
docker build --build-arg TAG=dev -t abcdesktopio/citrix.d:dev -f citrix.d .\n
Sending build context to Docker daemon  29.13MB\nStep 1/28 : ARG TAG=dev\nStep 2/28 : FROM abcdesktopio/oc.template.gtk.18.04:$TAG\n ---> c66ccd2edc52\nStep 3/28 : COPY icaclient_amd64.deb /tmp/icaclient_amd64.deb\n ---> Using cache\n ---> de6a2bcaa7c0\nStep 4/28 : RUN apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb\n ---> Using cache\n ---> 87e1ce530e44\nStep 5/28 : ENV BUSER balloon\n ---> Using cache\n ---> e4f474a17688\nStep 6/28 : LABEL oc.icon=\"icaclient.svg\"\n ---> Using cache\n ---> c6b12ecd898c\nStep 7/28 : LABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTouMiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiB4PSItNTkiIHk9Ii02MCIgcng9IjI4IiByeT0iMjgiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCBzdHlsZT0iZmlsbDojNGY0ZjRmIiB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHg9Ii01OCIgeT0iLTYwIiByeD0iMjgiIHJ5PSIyOCIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMSwtMSwwLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5Oi4yIiBkPSJtMzIgMTFhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMTE3MmMtMTAuOTMzMjI0IDAuMTA0NTM5LTE5LjgwODYgOS4wMzA5Ny0xOS44MDg2IDE5Ljk4ODI4IDAgMTEuMDIyMDA2IDguOTc3OTk0IDIwIDIwIDIwIDEwLjk1NDY3OCAwIDE5Ljg3OTUyNC04Ljg3MTE4IDE5Ljk4ODI4Mi0xOS44MDA3ODJhMiAyIDAgMCAwIDAuMDExNzE4IC0wLjE5OTIxOCAyIDIgMCAwIDAgLTIgLTIgMiAyIDAgMCAwIC0yIDJjMCA4Ljg2MDI0Ni03LjEzOTc1NCAxNi0xNiAxNnMtMTYtNy4xMzk3NTQtMTYtMTYgNy4xMzk3NTQtMTYgMTYtMTZhMiAyIDAgMCAwIDIgLTIgMiAyIDAgMCAwIC0yIC0yem0wIDhhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMDc4Yy02LjUxNTM3NCAwLjEwNDEyNi0xMS44MDg2IDUuNDUzMDUyLTExLjgwODYgMTEuOTkyMiAwIDYuNjAzNzI4IDUuMzk2MjcyIDEyIDEyIDEyIDYuNTM2NDUyIDAgMTEuODc5ODgtNS4yODkxMTIgMTEuOTg4MjgyLTExLjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDQuNDQxOTY4LTMuNTU4MDMyIDgtOCA4cy04LTMuNTU4MDMyLTgtOCAzLjU1ODAzMi04IDgtOGEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGE0IDQgMCAwIDAgLTQgNCA0IDQgMCAwIDAgNCA0IDQgNCAwIDAgMCA0IC00IDQgNCAwIDAgMCAtNCAtNHoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOiNmZmZmZmYiIGQ9Im0zMiAxMGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAxMTcyYy0xMC45MzMyMjQgMC4xMDQ1MzktMTkuODA4NiA5LjAzMDk3LTE5LjgwODYgMTkuOTg4MjggMCAxMS4wMjIwMDYgOC45Nzc5OTQgMjAgMjAgMjAgMTAuOTU0Njc4IDAgMTkuODc5NTI0LTguODcxMTggMTkuOTg4MjgyLTE5LjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDguODYwMjQ2LTcuMTM5NzU0IDE2LTE2IDE2cy0xNi03LjEzOTc1NC0xNi0xNiA3LjEzOTc1NC0xNiAxNi0xNmEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAwNzhjLTYuNTE1Mzc0IDAuMTA0MTI2LTExLjgwODYgNS40NTMwNTItMTEuODA4NiAxMS45OTIyIDAgNi42MDM3MjggNS4zOTYyNzIgMTIgMTIgMTIgNi41MzY0NTIgMCAxMS44Nzk4OC01LjI4OTExMiAxMS45ODgyODItMTEuODAwNzgyYTIgMiAwIDAgMCAwLjAxMTcxOCAtMC4xOTkyMTggMiAyIDAgMCAwIC0yIC0yIDIgMiAwIDAgMCAtMiAyYzAgNC40NDE5NjgtMy41NTgwMzIgOC04IDhzLTgtMy41NTgwMzItOC04IDMuNTU4MDMyLTggOC04YTIgMiAwIDAgMCAyIC0yIDIgMiAwIDAgMCAtMiAtMnptMCA4YTQgNCAwIDAgMCAtNCA0IDQgNCAwIDAgMCA0IDQgNCA0IDAgMCAwIDQgLTQgNCA0IDAgMCAwIC00IC00eiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6LjE7ZmlsbDojZmZmZmZmIiBkPSJtMzIgMmMtMTUuNTEyIDAtMjggMTIuNDg4LTI4IDI4IDAgMC4xMTM0NSAwLjAxMTI4MDUgMC4yMjQxMTMgMC4wMTc1NzgxIDAuMzM1OTM4IDAuMzUxNTQzMi0xNS4yMDE3NTcgMTIuNjkzMTQ5OS0yNy4zMzU5MzggMjcuOTgyNDIxOS0yNy4zMzU5MzhzMjcuNjMwODc5IDEyLjEzNDE4MSAyNy45ODI0MjIgMjcuMzM1OTM4YzAuMDA2Mjk4LTAuMTExODI1IDAuMDE3NTc4LTAuMjIyNDg4IDAuMDE3NTc4LTAuMzM1OTM4IDAtMTUuNTEyLTEyLjQ4OC0yOC0yOC0yOHoiLz4KPC9zdmc+Cg==\"\n ---> Using cache\n ---> cb5821f26574\nStep 8/28 : LABEL oc.keyword=\"ica,citrix,icaclient,\"\n ---> Using cache\n ---> 841fc5293542\nStep 9/28 : LABEL oc.cat=\"office\"\n ---> Using cache\n ---> b02b64fab112\nStep 10/28 : LABEL oc.desktopfile=\"wfica.desktop\"\n ---> Using cache\n ---> d8929c453992\nStep 11/28 : LABEL oc.launch=\"Wfica.Wfica\"\n ---> Using cache\n ---> 3c0001542ee6\nStep 12/28 : LABEL oc.template=\"abcdesktopio/oc.template.gtk.18.04\"\n ---> Using cache\n ---> c48014944a74\nStep 13/28 : ENV ARGS=\"-icaroot /opt/Citrix/ICAClient\"\n ---> Using cache\n ---> d242eb681417\nStep 14/28 : LABEL oc.name=\"citrix\"\n ---> Using cache\n ---> fee77a4b23d6\nStep 15/28 : LABEL oc.displayname=\"citrix-client\"\n ---> Using cache\n ---> 1fb6f9642a9f\nStep 16/28 : LABEL oc.path=\"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 0cba59460d1a\nStep 17/28 : LABEL oc.type=app\n ---> Using cache\n ---> a14be19dc259\nStep 18/28 : LABEL oc.showinview=\"dock\"\n ---> Using cache\n ---> 9ee26ab86b1d\nStep 19/28 : LABEL oc.mimetype=\"application/x-ica;\"\n ---> Using cache\n ---> 5536706365ef\nStep 20/28 : RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi\n ---> Using cache\n ---> 49a06d7adf22\nStep 21/28 : RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi\n ---> Using cache\n ---> 5090828ce15e\nStep 22/28 : WORKDIR /home/balloon\n ---> Using cache\n ---> ac6821413e1f\nStep 23/28 : USER balloon\n ---> Using cache\n ---> 7cbea5e541e8\nStep 24/28 : ENV APPNAME \"citrix\"\n ---> Using cache\n ---> a6662e5e1ea4\nStep 25/28 : ENV APPBIN \"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 475f164cc974\nStep 26/28 : LABEL oc.args=\"-icaroot /opt/Citrix/ICAClient\"\n ---> Using cache\n ---> b085c5a7c97d\nStep 27/28 : ENV APP \"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 534994e86953\nStep 28/28 : LABEL oc.usedefaultapplication=true\n ---> Using cache\n ---> 5cd6ea7a4228\nSuccessfully built 5cd6ea7a4228\nSuccessfully tagged abcdesktopio/citrix.d:dev\n
"},{"location":"common/shm/","title":"IPC and pod","text":"

Does a pod can share memory between his container ? Does Posix shared memory work with containers ? Does System V shared memory work with containers ?

Let's have a look !

There are two ways to use shared memory in Linux: System V and POSIX.

"},{"location":"common/shm/#requirements","title":"Requirements","text":""},{"location":"common/shm/#install-the-bash-and-yaml-files","title":"Install the bash and yaml files","text":"

To install the bash and yaml files, run the command

git clone https://github.com/abcdesktopio/podshmtest.git\ncd podshmtest\n
"},{"location":"common/shm/#shared-memory","title":"Shared memory","text":""},{"location":"common/shm/#system-v-shared-memory","title":"System V shared memory","text":"

Goal: Test System V shared memory between two containers inside the same pod

This test creates two containers a sender and a receiver. The sender writes a string in a share memory and the receiver read the string.

The test is successful if there is no system error and the strings are equals.

The string MemContents stored in the shared memory is : This is the way the world ends...

    int exit_code = -1;\n    // ftok to generate unique key \n    key_t key = ftok(\"/shared/shmfile\",65);\n    // shmget returns an identifier in shmid \n    int shmid = shmget(key,1024,0666|IPC_CREAT);\n    // shmat to attach to shared memory \n    char *str = (char*) shmat(shmid,(void*)0,0);\n    strcpy( str, MemContents );\n    //detach from shared memory  \n    exit_code = shmdt(str);\n
    // ftok to generate unique key \n    key_t key = ftok(\"/shared/shmfile\",65);\n    // shmget returns an identifier in shmid \n    int shmid = shmget(key,1024,0666|IPC_CREAT);\n    // shmat to attach to shared memory \n    char *str = (char*) shmat(shmid,(void*)0,0);\n    printf(\"%s\\n\",str);\n    cmp_code = strcmp( str, MemContents );\n    //detach from shared memory  \n    exit_code = shmdt(str);\n

To run the System V tests

"},{"location":"common/shm/#run-a-shared-memory-test-access-using-a-shared-path","title":"Run a shared memory test access using a shared path","text":"

In this yaml file, sender and receiver containers share a file. This file is /shared/me and it is the first parameter to ftok system V call.

apiVersion: v1\nkind: Pod\nmetadata:\n  name: podsysvsendershmtest\nspec:\n  shareProcessNamespace: true\n  restartPolicy : Never\n  volumes:\n    - name: shared \n      emptyDir: {}\n  containers:\n    - name: sender\n      imagePullPolicy: IfNotPresent\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/shared/me\"\n    - name: receiver\n      imagePullPolicy: IfNotPresent\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/shared/me\"\n

The env var FTOK_PATH set the first parameter to ftok system V call.

Run the test

# this test result is success\n./runtest.sh podsendershared_success.yaml\n

You can read the same string from sender to receive container.

This test is OK.

pod/podsysvsendershmtest created\npod/podsysvsendershmtest condition met\n**** Start sender ****\nsender starts\nidentity of the file named FTOK_PATH=/shared/me\nsending success This is the way the world ends...\n**** Read on receiver **** \nreceive starts\nidentity of the file named FTOK_PATH=/shared/me\nread This is the way the world ends...\n
"},{"location":"common/shm/#run-a-shared-memory-test-access-without-shared-path","title":"Run a shared memory test access without shared path","text":"

In this yaml file, sender and receiver do not share file. /dummy filename is the first parameter to ftok system V call.

apiVersion: v1\nkind: Pod\nmetadata:\n  name: podsysvsendershmtest\nspec:\n  shareProcessNamespace: true\n  restartPolicy : Never\n  volumes:\n    - name: shared \n      emptyDir: {}\n  containers:\n    - name: sender\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/dummy\"\n    - name: receiver\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/dummy\"\n

The env var FTOK_PATH set the first parameter to ftok system V call.

Run the test

# this test result is failed\n./runtest.sh podsendershared_failed.yaml\n

You can read that the sender write a string. The receiver does not read this string.

This test is KO.

pod \"podsysvsendershmtest\" deleted\npod/podsysvsendershmtest created\npod/podsysvsendershmtest condition met\n**** Start sender ****\nsender starts\nidentity of the file named FTOK_PATH=/dummy\nsending success This is the way the world ends...\n**** Read on receiver **** \nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\n...\n^C\ncommand terminated with exit code 130\n

The ftok() function uses the identity of the file named by the given pathname (which must refer to an existing, accessible file) The file named by the given pathname must be shared by using a volume between containers

"},{"location":"common/shm/#posix-shared-memory","title":"POSIX shared memory","text":"

Goal: Test Posix shared memory between two containers inside the same pod

The source code is from inter-process communication in Linux: Shared storage Learn how processes synchronize with each other in Linux . The author is Marty Kalin

This test creates two containers a sender and a receiver to read a shared memory in /dev/shm, it uses a semaphore as a mutex (lock) by waiting for writer to increment it.

The string MemContents stored in the shared memory is : This is the way the world ends...

  int fd = shm_open(BackingFile,      /* name from smem.h */\n                    O_RDWR | O_CREAT, /* read/write, create if needed */\n                    AccessPerms);     /* access permissions (0644) */\n  if (fd < 0) report_and_exit(\"Can't open shared mem segment...\");\n\n  ftruncate(fd, ByteSize); /* get the bytes */\n\n  caddr_t memptr = mmap(NULL,       /* let system pick where to put segment */\n                        ByteSize,   /* how many bytes */\n                        PROT_READ | PROT_WRITE, /* access protections */\n                        MAP_SHARED, /* mapping visible to other processes */\n                        fd,         /* file descriptor */\n                        0);         /* offset: start at 1st byte */\n  if ((caddr_t) -1  == memptr) report_and_exit(\"Can't get segment...\");\n\n  fprintf(stderr, \"shared mem address: %p [0..%d]\\n\", memptr, ByteSize - 1);\n  fprintf(stderr, \"backing file:       /dev/shm%s\\n\", BackingFile );\n\n  /* semahore code to lock the shared mem */\n  sem_t* semptr = sem_open(SemaphoreName, /* name */\n                           O_CREAT,       /* create the semaphore */\n                           AccessPerms,   /* protection perms */\n                           0);            /* initial value */\n  if (semptr == (void*) -1) report_and_exit(\"sem_open\");\n\n  strcpy(memptr, MemContents); /* copy some ASCII bytes to the segment */\n\n  /* increment the semaphore so that memreader can read */\n  if (sem_post(semptr) < 0) report_and_exit(\"sem_post\");\n\n  sleep(12); /* give reader a chance */\n\n  /* clean up */\n  munmap(memptr, ByteSize); /* unmap the storage */\n  close(fd);\n  sem_close(semptr);\n  shm_unlink(BackingFile); /* unlink from the backing file */\n\n
  int fd = shm_open(BackingFile, O_RDWR, AccessPerms);  /* empty to begin */\n  if (fd < 0) report_and_exit(\"Can't get file descriptor...\");\n\n  /* get a pointer to memory */\n  caddr_t memptr = mmap(NULL,       /* let system pick where to put segment */\n                        ByteSize,   /* how many bytes */\n                        PROT_READ | PROT_WRITE, /* access protections */\n                        MAP_SHARED, /* mapping visible to other processes */\n                        fd,         /* file descriptor */\n                        0);         /* offset: start at 1st byte */\n  if ((caddr_t) -1 == memptr) report_and_exit(\"Can't access segment...\");\n\n  /* create a semaphore for mutual exclusion */\n  sem_t* semptr = sem_open(SemaphoreName, /* name */\n                           O_CREAT,       /* create the semaphore */\n                           AccessPerms,   /* protection perms */\n                           0);            /* initial value */\n  if (semptr == (void*) -1) report_and_exit(\"sem_open\");\n\n  /* use semaphore as a mutex (lock) by waiting for writer to increment it */\n  if (!sem_wait(semptr)) { /* wait until semaphore != 0 */\n    int i;\n    for (i = 0; i < strlen(MemContents); i++)\n      write(STDOUT_FILENO, memptr + i, 1); /* one byte at a time */\n    sem_post(semptr);\n  }\n\n  /* cleanup */\n  munmap(memptr, ByteSize);\n  close(fd);\n  sem_close(semptr);\n  unlink(BackingFile);\n

To run the POSIX test

kubectl create -f podposixshm.yaml \npod/podposixshm created\n

The podposixshm pod status must be Completed

kubectl get pods podposixshm  \nNAME          READY   STATUS      RESTARTS   AGE\npodposixshm   0/2     Completed   0          27s\n

The podposixshm sender log file should be :

kubectl logs pod/podposixshm sender\nshared mem address: 0x7fc0ea582000 [0..511]\nbacking file:       /dev/shm/shMemEx\n

The pod/podposixshm receiver log file should be :

kubectl logs pod/podposixshm receiver\nThis is the way the world ends...\n

Delete the podposixshm pod

kubectl delete pods podposixshm \npod \"podposixshm\" deleted\n
"},{"location":"common/shm/#read-the-shared-memory-default-limit","title":"Read the shared memory default limit","text":"

On a pod, we can see that the default size of /dev/shm is 64MB, when running the df /dev/shm command.

kubectl run -it --image alpine:edge shmtest -- sh\nIf you don't see a command prompt, try pressing enter.\n
df /dev/shm\nFilesystem           1K-blocks      Used Available Use% Mounted on\nshm                      65536     65536         0 100% /dev/shm\n

A dd command confirm this limit. it will throw an exception when it reaches 64MB: \u201cNo space left on device\u201d.

Run the dd command

dd if=/dev/zero of=/dev/shm/test\ndd: error writing '/dev/shm/test': No space left on device\n131073+0 records in\n131072+0 records out\n

Run the df /dev/shm command

df /dev/shm\nFilesystem           1K-blocks      Used Available Use% Mounted on\nshm                      65536     65536         0 100% /dev/shm\n

Delete the shmtest pod

kubectl delete pods shmtest\npod \"shmtest\" deleted\n

The default size is 64 MB.

"},{"location":"common/shm/#increase-the-shared-memory-default-limit","title":"Increase the shared memory default limit","text":"

Create a updateshm.yaml file with the yaml content

apiVersion: v1\nkind: Pod\nmetadata:\n  labels:\n    run: updateshm\n  name: updateshm\nspec:\n  volumes:                          \n    - name: volumeshm\n      emptyDir:\n        medium: Memory\n  containers:\n  - image: alpine:edge\n    name: updateshm\n    args: \n      - 1d \n    command: \n      - /bin/sleep\n    volumeMounts:                 \n        - mountPath: /dev/shm\n          name: volumeshm\n  dnsPolicy: ClusterFirst\n  restartPolicy: Never\n

Create the new pod updateshm

kubectl apply -f updateshm.yaml \npod/updateshm created\n

Execute a df /dev/shm command inside this pods to read the size of /dev/shm

kubectl exec updateshm -- df /dev/shm\nFilesystem           1K-blocks      Used Available Use% Mounted on\ntmpfs                 16176264         0  16176264   0% /dev/shm\n

The size of /dev/shm is 16176264 of 1K blocks. The new default size is 16 GB.

To set a fixed limit use the sizeLimit in the spec.volumes

apiVersion: v1\nkind: Pod\nmetadata:\n  labels:\n    run: updateshm512\n  name: updateshm512\nspec:\n  volumes:                          \n    - name: updateshm512\n      emptyDir:\n        medium: Memory\n        sizeLimit: 512Mi\n  containers:\n  - image: alpine:edge\n    name: updateshm\n    args: \n      - 1d \n    command: \n      - /bin/sleep\n    volumeMounts:                 \n        - mountPath: /dev/shm\n          name: updateshm512\n  dnsPolicy: ClusterFirst\n  restartPolicy: Never\n
"},{"location":"common/upload_and_download_files/","title":"Upload and Download files in your desktop","text":""},{"location":"common/upload_and_download_files/#goals","title":"Goals","text":""},{"location":"common/upload_and_download_files/#upload-file-in-your-desktop","title":"Upload file in your desktop","text":"

To upload file into your local storage, just use a drag & drop, from your device to you adcdesktop

Then, start the filemanager, your new file is located in your home directory

"},{"location":"common/upload_and_download_files/#download-file-from-your-desktop","title":"Download file from your desktop","text":"

To download file from your abcdesktop to you local storage, just start the file manager.

Choose your file and using the right mouse button, choose the menu option Download for Desktop as describe :

The file is downloaded by your web browser

The file is located in your Downloads directory

Great, you have uploaded and downloaded files with your abcdesktop, you can now use abcdesktop.io applications to edit all your files.

"},{"location":"common/1.0/abcdesktop.bastion/","title":"Setup guide to use abcdesktop.io as bastion service","text":""},{"location":"common/1.0/abcdesktop.bastion/#design","title":"Design","text":"

The goal of this setup guide is to install abcdesktio.io as a bastion service, with only one virtual machine

"},{"location":"common/1.0/abcdesktop.bastion/#script-and-vagrant-file","title":"script and vagrant file","text":""},{"location":"common/1.0/abcdesktop.bastion/#get-script-and-vagrant-file","title":"get script and vagrant file","text":"

To get the installation script and the vagrant file, run the command

git clone https://github.com/abcdesktopio/vagrant.git\n
"},{"location":"common/1.0/abcdesktop.bastion/#start-vagrant-file-to-run-the-kmaster-vm","title":"start vagrant file to run the kmaster vm","text":"

Run the command to run the vagrant file

$ cd vagrant\n$ VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant up\n

This vagrant file defines a vm kmaster :

kmaster.vm.box = \"hashicorp/bionic64\"\nkmaster.vm.hostname = \"kmaster.example.com\"\n# By default, Vagrant uses a netmask of 255.255.255.0\n# config.vm.network :hostonly, \"10.11.12.13\", :netmask => \"255.255.0.0\"\nkmaster.vm.network \"private_network\", ip: \"172.42.42.100\"\nkmaster.vm.network \"private_network\", ip: \"10.9.1.100\", virtualbox__intnet: true\nkmaster.vm.network \"private_network\", ip: \"192.168.29.100\", virtualbox__intnet: true\nkmaster.vm.network \"forwarded_port\", guest: 30443, host: 30443\nkmaster.vm.provider \"virtualbox\" do |v|\n  v.name = \"kmaster\"\n  v.memory = 4096\n  v.cpus = 4\nend\nkmaster.vm.provision \"shell\", path: \"abcdesktop_kubernetes_bastion.sh\"\n

It forward the host tcp port 30443 to guest port 30443 ( mapped as a host port in kubernetes )

All networks are defined as private_network to make it simplest as possible.

"},{"location":"common/1.0/abcdesktop.bastion/#abcdesktop_kubernetes_bastionsh-description","title":"abcdesktop_kubernetes_bastion.sh description","text":"

abcdesktop_kubernetes_bastion.sh takes more than eight minutes to install all services, from an ubuntu bionic 64 hashicorp/bionic64 :

Read step by step the abcdesktop_kubernetes_bastion.sh content to get more details.

You can read the vagrant stdout file as example abcdesktop kubernetes bastion install log file

"},{"location":"common/1.0/abcdesktop.bastion/#login-to-get-a-ssh-into-the-kmaster-vm","title":"login to get a ssh into the kmaster vm","text":"
VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n

List kube-system pods and abcdesktop pods

To run kubectl commands inside the master virtual machine

export KUBECONFIG=/etc/kubernetes/admin.conf \n
vagrant@kmaster:~$ kubectl get pods -n kube-system\nNAME                              READY   STATUS    RESTARTS   AGE\ncoredns-64897985d-4d57p           1/1     Running   0          11h\ncoredns-64897985d-qtmkq           1/1     Running   0          11h\netcd-kmaster                      1/1     Running   0          11h\nkube-apiserver-kmaster            1/1     Running   0          11h\nkube-controller-manager-kmaster   1/1     Running   0          11h\nkube-flannel-ds-gskrs             1/1     Running   0          11h\nkube-proxy-c566l                  1/1     Running   0          11h\nkube-scheduler-kmaster            1/1     Running   0          11h\n
vagrant@kmaster:~$ kubectl get pods -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-pt2j6           1/1     Running   0          11h\ndaemonset-pyos-zqpf7            1/1     Running   0          11h\nmemcached-od-78578c879-kstcl    1/1     Running   0          11h\nmongodb-od-5c68794bb8-wf6sm     1/1     Running   0          11h\nopenldap-od-558f7959d5-vhbln    1/1     Running   0          11h\nspeedtest-od-7b66cc656b-fh97g   1/1     Running   0          11h\n
"},{"location":"common/1.0/abcdesktop.bastion/#login-as-a-user","title":"Login as a user","text":""},{"location":"common/1.0/abcdesktop.bastion/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

Open your web browser to

http://[your-ip-hostname]:30443/\n

Replace [your-ip-hostname] by the host node IP address

You should get the web page

"},{"location":"common/1.0/abcdesktop.bastion/#log-in-as","title":"Log in as","text":"

abcdesktop adds an OpenLDAP server for testing LDAP applications, i.e. unit tests. The ldap server is used to authenticate user. To get more informations about the OpenLDAP server and the account detail, read ldap server

Login Accounts Login Password Hubert J. Farnsworth professor Philip J. Fry fry Hermes Conrad hermes Turanga Leela leela Bender Bending Rodr\u00edguez bende

Use the credentials, to login

"},{"location":"common/1.0/abcdesktop.bastion/#get-the-default-desktop","title":"Get the default desktop","text":"

After the login, you should get the default desktop.

"},{"location":"common/1.0/abcdesktop.bastion/#run-a-web-shell-process","title":"Run a web shell process","text":"

To start a shell, insert webshell as keywords in the search text area :

"},{"location":"common/1.0/abcdesktop.bastion/#run-ifconfig-command-to-list-network-interfaces","title":"Run ifconfig command to list network interfaces","text":"

In the web shell, run the command

$ ifconfig -a\n

This command shows the network interfaces net1 and net2 with the associated ip address

"},{"location":"common/1.0/abcdesktop.bastion/#tag-and-rules","title":"Tag and rules","text":"
VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
vagrant@kmaster:~$ sudo bash\n
"},{"location":"common/1.0/abcdesktop.bastion/#config-file-abcdesktopyaml","title":"Config file abcdesktop.yaml","text":"

Open the abcdesktop.yaml configuration file, and look at ldapconfig

    ldapconfig : { 'planet': {  'default'       : True,\n                                'ldap_timeout'  : 15,\n                                'ldap_protocol' : 'ldap',\n                                'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                                'servers'       : [ 'openldap.abcdesktop.svc.cluster.local' ],\n                                'secure'        : False,\n                                'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n                                'policies': {\n                                    'acls': None,\n                                    'rules' : {\n                                        'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',   'expected' : True  } ], 'expected' : True, 'label': 'shipcrew'   },\n                                        'rule-test': { 'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com', 'expected' : True  } ], 'expected' : True, 'label': 'adminstaff' } } } } }\n
"},{"location":"common/1.0/abcdesktop.bastion/#rules-description","title":"Rules description","text":"

In the abcdesktop.yaml configuration file, and look at the desktop.policies and the network option

 desktop.policies: {\n        'rules': {\n            'network': {\n                'shipcrew': {\n                    'annotations' : {\n                        'k8s.v1.cni.cncf.io/networks': '[ {\"name\":\"macvlan-conf-eth3\"}, { \"name\":\"macvlan-conf-eth2\", \"default-route\": [\"10.9.1.100\"] } ]'\n                    }\n                }\n            }\n        },\n        'acls' : {} }\n

If a pod as the 'shipcrew' tag, then add the network annotations

[ \n    {   \"name\": \"macvlan-conf-eth3\"}, \n    {   \"name\": \"macvlan-conf-eth2\", \"default-route\": [\"10.9.1.100\"] }\n]\n
"},{"location":"common/1.0/abcdesktop.bastion/#list-pods-and-labels-in-abcdesktop-namespace","title":"List pods and labels in abcdesktop namespace","text":"

To list pod in the abcdesktop namespace, run the command

export KUBECONFIG=/etc/kubernetes/admin.conf \nkubectl get pods -n abcdesktop \n
root@kmaster:~# export KUBECONFIG=/etc/kubernetes/admin.conf \nroot@kmaster:~# kubectl get pods -n abcdesktop\nNAME                                       READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-5dzjc                      1/1     Running   0          151m\ndaemonset-pyos-szs8h                       1/1     Running   0          151m\nfry-02579a7f-a464-4cdb-bb79-5d4d4a844308   3/3     Running   0          86m\nmemcached-od-78578c879-vx26h               1/1     Running   0          151m\nmongodb-od-6568f85897-tgfjb                1/1     Running   0          151m\nopenldap-od-558f7959d5-qz2kg               1/1     Running   0          151m\nspeedtest-od-76d578578d-rl8k8              1/1     Running   0          151m\n
"},{"location":"common/1.0/abcdesktop.bastion/#describe-pods-fry","title":"Describe pods fry","text":"

Run the command

kubectl describe pods YOUR_POD\n

Replace YOUR_POD by your pod

root@kmaster:~# kubectl describe pods fry-02579a7f-a464-4cdb-bb79-5d4d4a844308 -n abcdesktop\nName:         fry-02579a7f-a464-4cdb-bb79-5d4d4a844308\nNamespace:    abcdesktop\nPriority:     0\nNode:         kmaster/10.0.2.15\nStart Time:   Mon, 31 Jan 2022 16:14:16 +0000\nLabels:       access_provider=planet\n              access_userid=FRY\n              access_username=philip_j__fry\n              broadcast_cookie=f7ee45615acce9c5fbed2607d35471264d6c6c14b5cd5778\n              domain=desktop\n              netpol/ocuser=true\n              pulseaudio_cookie=f7cfdfb7b4227e816f3ad59f9d122fac49674a1a60455951\n              shipcrew=true\n              type=x11server\n              xauthkey=ad9e3675cb184db9b6c9eee4852a94est-od-76d578578d-rl8k8\n

The label shipcrew=true is set

Annotations:  k8s.v1.cni.cncf.io/network-status:\n                [{\n                    \"name\": \"cbr0\",\n                    \"interface\": \"eth0\",\n                    \"ips\": [\n                        \"10.244.0.12\"\n                    ],\n                    \"mac\": \"06:17:a7:0c:24:9b\",\n                    \"default\": true,\n                    \"dns\": {}\n                },{\n                    \"name\": \"abcdesktop/macvlan-conf-eth3\",\n                    \"interface\": \"net1\",\n                    \"ips\": [\n                        \"192.168.29.12\"\n                    ],\n                    \"mac\": \"3a:db:a1:33:53:72\",\n                    \"dns\": {}\n                },{\n                    \"name\": \"abcdesktop/macvlan-conf-eth2\",\n                    \"interface\": \"net2\",\n                    \"ips\": [\n                        \"10.9.1.12\"\n                    ],\n                    \"mac\": \"86:eb:43:fe:db:e7\",\n                    \"dns\": {}\n                }]\n

The Annotations k8s.v1.cni.cncf.io/network-status describes the network interfaces inside the pod.

"},{"location":"common/1.0/abcdesktop.bastion/#look-at-the-pre-installed-network-rules","title":"Look at the pre installed network rules","text":"

Run the command

kubectl get net-attach-def -n abcdesktop\n
root@kmaster:~#  kubectl get net-attach-def -n abcdesktop\nNAME                AGE\nmacvlan-conf-eth2   154m\nmacvlan-conf-eth3   154m\n

Get more details about macvlan-conf-eth3

root@kmaster:~# kubectl describe net-attach-def macvlan-conf-eth3 -n abcdesktop\nName:         macvlan-conf-eth3\nNamespace:    abcdesktop\nLabels:       <none>\nAnnotations:  <none>\nAPI Version:  k8s.cni.cncf.io/v1\nKind:         NetworkAttachmentDefinition\nMetadata:\n  Creation Timestamp:  2022-01-31T15:10:38Z\n  Generation:          1\n  Managed Fields:\n    API Version:  k8s.cni.cncf.io/v1\n    Fields Type:  FieldsV1\n    fieldsV1:\n      f:metadata:\n        f:annotations:\n          .:\n          f:kubectl.kubernetes.io/last-applied-configuration:\n      f:spec:\n        .:\n        f:config:\n    Manager:         kubectl-client-side-apply\n    Operation:       Update\n    Time:            2022-01-31T15:10:38Z\n  Resource Version:  1008\n  UID:               a5b0d3a0-52c4-42da-887b-8de73cff2b1c\nSpec:\n  Config:  { \"cniVersion\": \"0.3.0\", \"type\": \"macvlan\", \"master\": \"eth3\", \"mode\": \"bridge\", \"ipam\": { \"type\": \"host-local\", \"subnet\": \"192.168.29.0/24\", \"rangeStart\": \"192.168.29.10\", \"rangeEnd\": \"192.168.29.99\", \"gateway\": \"192.168.29.100\" } }\nEvents:    <none>\n

macvlan-conf-eth3 is used by the user's pod.

"},{"location":"common/1.0/abcdesktop.bastion/#list-multi-policy","title":"List multi-policy","text":"

To list multi-policy, run the command

kubectl get multi-policy -n abcdesktop\n
root@kmaster:~# kubectl get multi-policy -n abcdesktop\nNAME                  AGE\nmnp-permit-shipcrew   3h\n

And get description about the policy mnp-permit-shipcrew

apiVersion: k8s.cni.cncf.io/v1beta1\nkind: MultiNetworkPolicy\nmetadata:\n  name: mnp-permit-shipcrew\n  namespace: abcdesktop \n  annotations:\n    k8s.v1.cni.cncf.io/policy-for: macvlan-conf-eth3\nspec:\n  podSelector:\n    matchLabels:\n      shipcrew: 'true' \n  policyTypes:\n  - Egress\n  egress:\n  - to:\n    - ipBlock: \n        cidr: 192.168.55.21/32\n    - ipBlock:\n        cidr: 192.168.55.22/32\n    ports:\n      - protocol: TCP\n        port: 22\n

If a pod in the abcdesktop namespace, contains a label shipcrew: 'true' set the iptables to permit egress to host 192.168.55.21/32 and 192.168.55.22/32 using protocol TCP destination port 22.

"},{"location":"common/1.0/abcdesktop.bastion/#dump-the-generated-by-iptables-in-varlibmulti-networkpolicyiptables","title":"dump the generated by iptables in /var/lib/multi-networkpolicy/iptables/","text":"
VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
vagrant@kmaster:~$ sudo bash\n
root@kmaster:~# ls /var/lib/multi-networkpolicy/iptables/\nafe82680-77b4-4bac-ad2b-8be9488402fb\n

A new afe82680-77b4-4bac-ad2b-8be9488402fb exists

root@kmaster:~# cat /var/lib/multi-networkpolicy/iptables/afe82680-77b4-4bac-ad2b-8be9488402fb/current.iptables \n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*mangle\n:PREROUTING ACCEPT [441:57462]\n:INPUT ACCEPT [441:57462]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [370:150632]\n:POSTROUTING ACCEPT [367:150476]\nCOMMIT\n# Completed on Mon Jan 31 16:16:22 2022\n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*filter\n:INPUT ACCEPT [0:0]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [0:0]\n:MULTI-0-EGRESS - [0:0]\n:MULTI-0-EGRESS-0-PORTS - [0:0]\n:MULTI-0-EGRESS-0-TO - [0:0]\n:MULTI-EGRESS - [0:0]\n:MULTI-INGRESS - [0:0]\n-A INPUT -i net2 -j MULTI-INGRESS\n-A INPUT -i net1 -j MULTI-INGRESS\n-A OUTPUT -o net2 -j MULTI-EGRESS\n-A OUTPUT -o net1 -j MULTI-EGRESS\n-A MULTI-0-EGRESS -j MARK --set-xmark 0x0/0x30000\n-A MULTI-0-EGRESS -j MULTI-0-EGRESS-0-PORTS\n-A MULTI-0-EGRESS -j MULTI-0-EGRESS-0-TO\n-A MULTI-0-EGRESS -m mark --mark 0x30000/0x30000 -j RETURN\n-A MULTI-0-EGRESS -j DROP\n-A MULTI-0-EGRESS-0-PORTS -o net1 -p tcp -m tcp --dport 22 -j MARK --set-xmark 0x10000/0x10000\n-A MULTI-0-EGRESS-0-TO -d 192.168.55.21/32 -o net1 -j MARK --set-xmark 0x20000/0x20000\n-A MULTI-0-EGRESS-0-TO -d 192.168.55.22/32 -o net1 -j MARK --set-xmark 0x20000/0x20000\n-A MULTI-EGRESS -o net1 -m comment --comment \"policy:mnp-permit-shipcrew net-attach-def:abcdesktop/macvlan-conf-eth3\" -j MULTI-0-EGRESS\nCOMMIT\n# Completed on Mon Jan 31 16:16:22 2022\n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*nat\n
"},{"location":"common/1.0/abcdesktop.bastion/#add-some-applications-to-your-desktop","title":"Add some applications to your desktop","text":"

For abcdesktop a desktop application is a container image. To add an application you just need to pull an container image.

VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
vagrant@kmaster:~$ sudo bash\n
root@kmaster:~# docker images\nREPOSITORY                                                  TAG       IMAGE ID       CREATED         SIZE\nabcdesktopio/oc.pyos                                        dev       6bd8b8d33b73   19 hours ago    1.17GB\nrancher/mirrored-flannelcni-flannel                         v0.16.3   8cb5de74f107   3 days ago      59.7MB\nmemcached                                                   latest    fa6cf68061c2   5 days ago      89.1MB\nk8s.gcr.io/kube-apiserver                                   v1.23.3   f40be0088a83   6 days ago      135MB\nk8s.gcr.io/kube-controller-manager                          v1.23.3   b07520cd7ab7   6 days ago      125MB\nk8s.gcr.io/kube-scheduler                                   v1.23.3   99a3486be4f2   6 days ago      53.5MB\nk8s.gcr.io/kube-proxy                                       v1.23.3   9b7cc9982109   6 days ago      112MB\nabcdesktopio/oc.user.18.04                                  latest    52176672cf2e   7 days ago      1.79GB\nabcdesktopio/oc.user.ssh.18.04                              dev       52176672cf2e   7 days ago      1.79GB\nghcr.io/k8snetworkplumbingwg/multi-networkpolicy-iptables   latest    54838d8bbd14   10 days ago     408MB\nrancher/mirrored-flannelcni-flannel-cni-plugin              v1.0.1    ac40ce625740   12 days ago     8.1MB\nabcdesktopio/oc.nginx                                       dev       fe71c8621ef2   12 days ago     506MB\nabcdesktopio/oc.pulseaudio.18.04                            dev       d44997a46969   2 months ago    170MB\nabcdesktopio/oc.pulseaudio.18.04                            latest    d44997a46969   2 months ago    170MB\nk8s.gcr.io/etcd                                             3.5.1-0   25f8c7f3da61   3 months ago    293MB\nghcr.io/k8snetworkplumbingwg/multus-cni                     stable    e6cafb5d5aa1   3 months ago    290MB\nk8s.gcr.io/coredns/coredns                                  v1.8.6    a4ca41631cc7   3 months ago    46.8MB\nabcdesktopio/oc.cupsd.18.04                                 dev       095105a59722   4 months ago    745MB\nabcdesktopio/oc.cupsd.18.04                                 latest    095105a59722   4 months ago    745MB\nk8s.gcr.io/pause                                            3.6       6270bb605e12   5 months ago    683kB\nrroemhild/test-openldap                                     latest    c6b1bec361ca   10 months ago   144MB\nabcdesktopio/oc.mongo                                       latest    802219537d3b   12 months ago   493MB\nabcdesktopio/oc.speedtest                                   dev       298a391cfb5b   3 years ago     355MB\n

To add an application like Firefox, run the docker pull command :

root@kmaster:~# docker pull abcdesktopio/firefox.d:dev\n
docker pull abcdesktopio/firefox.d:dev\ndev: Pulling from abcdesktopio/firefox.d\n7b1a6ab2e44d: Already exists \n2371f0a6d5ec: Already exists \nb55247ebc792: Already exists \n38b40dedf719: Already exists \na609cdbac5b4: Already exists \nf2e98da86f69: Already exists \n8589cdafb8d3: Already exists \nf110041cad0c: Already exists \n8d2557b365eb: Already exists \n0de73c57e07d: Already exists \n165ea38f2f53: Already exists \n66b43fff8150: Already exists \nccc0386d04e3: Already exists \n26d822b9fccb: Already exists \nd489c5be8f43: Already exists \nc342009660e3: Already exists \ne2006e25f603: Already exists \n612638393a03: Already exists \ndae51e73d8bc: Already exists \n07243e67b561: Pull complete \n2ee8a212fe21: Pull complete \n19e557a0567c: Pull complete \nff417f05521e: Pull complete \n539fd422158e: Pull complete \nef5cf2280d59: Pull complete \n24d2ecc0cc9a: Pull complete \n9dc58ab20296: Pull complete \naba0cc69761b: Pull complete \nDigest: sha256:454657f20f7a09d45dc8ac4f4d3263360480c15f69bece280dd06b8d1647ad7f\nStatus: Downloaded newer image for abcdesktopio/firefox.d:dev\ndocker.io/abcdesktopio/firefox.d:dev\n
"},{"location":"common/1.0/abcdesktop.bastion/#reload-the-web-browser-page","title":"Reload the web browser page","text":""},{"location":"common/1.0/abcdesktop.bastion/#connect-your-local-abcdesktop_1","title":"Connect your local abcdesktop","text":"

Reload or open your web browser

http://[your-ip-hostname]:30443/\n

Firefox is added to your desktop dock. Start Firefox application

No rule has be defined to allow http request from your pod to a web site

All http requests are denied

The firefox application inherits from the pod's the network rules.

"},{"location":"common/1.0/abcdesktop.bastion/#troubleshooting","title":"Troubleshooting","text":"

If you choose to use VMware instead of VirtualBox hypervisor

"},{"location":"common/1.0/abcdesktop.bastion/#notes-about-the-macvlan-driver","title":"Notes about the macvlan driver :","text":"

Macvlan allows you to configure sub-interfaces of a parent, physical Ethernet interface, each with its own unique MAC address, and consequently its own IP address. Applications, VMs and containers can then bind to a specific sub-interface to connect directly to the physical network, using their own MAC and IP address.

"},{"location":"common/1.0/abcdesktop.bastion/#macvlan-driver-on-vswitch-vmware","title":"macvlan driver on vSwitch VMware","text":"

The security policy of a virtual switch includes a MAC address changes option. This option allows virtual machines to receive frames with a Mac Address that is different from the one configured in the VMX.

When the Mac address changes option is set to Accept, ESXi accepts requests to change the effective MAC address of a virtual machine to a different address than the initial MAC address.

Set the Mac address changes option is set to Accept

"},{"location":"common/1.0/docker_macvlan/","title":"Using docker network for an application","text":""},{"location":"common/1.0/docker_macvlan/#requirements","title":"Requirements","text":""},{"location":"common/1.0/docker_macvlan/#goals","title":"Goals","text":""},{"location":"common/1.0/docker_macvlan/#architecture","title":"Architecture","text":"

When abcdesktop create a docker container, abcdesktop can set a dedicated network for this container.

"},{"location":"common/1.0/docker_macvlan/#create-a-dedicated-network-for-your-application","title":"Create a dedicated network for your application","text":"

On your worker nodes :

You have to choose a nework driver for example

network driver macvlan ipvlan docker-sriov-plugin

Only the name of the network is used by abcdesktop.

Create a network with macvlan or ipvlan driver

In these two examples :

"},{"location":"common/1.0/docker_macvlan/#example-with-macvlan","title":"Example with macvlan :","text":"

Create a network abcnetfirefox with the driver macvlan and bridge the network interface eno1 with the vlan 123

docker network create --label type=oc.app -d macvlan --subnet=192.168.8.0/24 --gateway=192.168.8.254 --ip-range=192.168.8.0/27 -o parent=eno1.123 abcnetfirefox\n
"},{"location":"common/1.0/docker_macvlan/#example-with-ipvlan-ipvlan_model2","title":"Example with ipvlan ipvlan_mode=l2 :","text":"

Create a network abcnetfirefox with the driver ipvlan with ipvlan_mode=l2 option and bridge the network interface eno1 with the vlan 123.

docker network create --label type=oc.app -d ipvlan  -o ipvlan_mode=l2 --subnet=192.168.8.0/24 --gateway=192.168.8.254 --ip-range=192.168.8.0/27 -o parent=eno1.123 abcnetfirefox\n
"},{"location":"common/1.0/docker_macvlan/#test-your-new-network-macvlan-or-ipvlan","title":"Test your new network (macvlan or ipvlan):","text":"

Make sure that's you can reach the default gateway and the dns server for container. In this example, just start a busybox to :

export GATEWAY=192.168.8.254\ndocker run --rm --network abcnetfirefox busybox ping $GATEWAY\n# Google\u2019s public DNS server 8.8.8.8 is added\ndocker run --rm --network abcnetfirefox --dns 8.8.8.8 busybox ping www.google.com\n
"},{"location":"common/1.0/docker_macvlan/#applications-rules","title":"Applications rules","text":"

Update your applist.json file and add a specific rule into the firefox application description

git clone https://github.com/abcdesktopio/oc.apps.git\ncd oc.apps\n

Specific rules entry example

\"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": false, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } },\n

In this example, if the current user token contains the tag label internet when the firefox application use abcnetfirefox and the dns 8.8.8.8

"},{"location":"common/1.0/docker_macvlan/#edit-the-applistjson-file","title":"Edit the applist.json file","text":"

Edit the applist.json file, and add rules to the application firefox for example

The new firefox dictionary with rules :

{\n    \"cat\": \"office\",\n    \"preruncommands\": [ \"RUN DEBIAN_FRONTEND=noninteractive echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes ttf-mscorefonts-installer ttf-bitstream-vera ttf-dejavu ttf-xfree86-nonfree && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes winbind firefox $(apt-cache search firefox-locale | awk '{print $1 }') && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes flashplugin-installer ubuntu-restricted-extras libavc1394-0 && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libasound2-plugins libgail-common libgtk2.0-bin chromium-codecs-ffmpeg-extra gstreamer1.0-libav gstreamer1.0-plugins-ugly gstreamer1.0-vaapi libavcodec-extra && apt-get clean\",\n                        \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n                        \"COPY policies.json /usr/lib/firefox/distribution\",\n                        \"COPY /ntlm_auth /usr/bin/ntlm_auth.abcdesktop\",\n                        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.abcdesktop\",\n                        \"ENV NSS_SDB_USE_CACHE=yes\" ],\n    \"debpackage\": \"\",\n    \"icon\": \"firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.Firefox\",\n    \"name\": \"Firefox\",\n    \"displayname\": \"Firefox\",\n    \"showinview\": \"dock\",\n    \"splash\": \"enable\",\n    \"mem_limit\": \"16gb\",\n    \"oomkilldisable\": true,\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\":\"/usr/share/applications/firefox.desktop\",\n    \"shm_size\": \"2gb\",\n    \"usedefaultapplication\": true,\n    \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": false, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } }\n}\n

Save your changes, and run make dockerfile, next docker build

Build and update your new firefox application

# create the Dockerfile firefox.d \nmake dockerfile\n\n# build the new image\ndocker build -f firefox.d -t firefox.d .\n

Check that the oc.rules label in new firefox.d image

docker inspect firefox.d \n

The oc.rules label is a string json formated

\"oc.rules\": \"{\\\"homedir\\\":{\\\"default\\\":true,\\\"ship\\\":true},\\\"network\\\":{\\\"default\\\":false,\\\"internet\\\":{\\\"name\\\":\\\"abcnetfirefox\\\",\\\"dns\\\":[\\\"8.8.8.8\\\"]}}}\"\n
"},{"location":"common/1.0/docker_macvlan/#add-tag-the-user-auth","title":"Add tag the user auth","text":"

Add a tag internet to the user auth provider

"},{"location":"common/1.0/docker_macvlan/#update-authprovider-in-odconfig-file","title":"Update authprovider in od.config file","text":"

Update the ldapconfig for planet with the new policies dict

  'policies': { 'acls': None, \n              'rules'   : { 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True  } ],\n              'expected' : True, \n              'label': 'internet' },\n

The complete ldapconfig for planet is

ldapconfig : { 'planet': {    'default'       : True,\n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ '192.168.7.69' ],\n                        'secure'        : False,\n                        'auth_protocol' : { 'ntlm': True, 'cntlm': False, 'kerberos': False, 'citrix': False},\n                        'citrix_all_regions' : 'Hello, {{ domain }}\\\\{{ user }}:{{ password }}',  \n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n\n                        'policies': { 'acls': None, \n             'rules'    : { 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True  } ], 'expected' : True, 'label': 'internet' } \n      } } } }\n

Restart your kubernetes pyos pod, to reload new the od.config configuration file.

"},{"location":"common/1.0/docker_macvlan/#use-the-philip-j-fry-user-context","title":"Use the Philip J. Fry user context.","text":"

Open a web browser, go to the abcdesktop login page.

Login Accounts

Login Password Philip J. Fry. fry Hubert J. Farnsworth professor

Note: the user Philip J. Fry is member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

Note: the user Hubert J. Farnsworth is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

Login as the Philip J. Fry user account.

During the user login process, pyos tag the user authentification with the 'label': 'internet'

Start the new application firefox, the docker network for this application use the abcnetfirefox

Run the command

docker network inspect abcnetfirefox\n

abcdesktop start a new container \"Name\": \"philip-j--fry-firefox-d2c22d9912fc4a489a1224237af9a3e0\" and bind the abcnetfirefox to user container.

[\n    {\n        \"Name\": \"abcnetfirefox\",\n        \"Id\": \"69c5ac0996226654635377458c044675114d5feb742a8a56d8a228180829d9cd\",\n        \"Created\": \"2021-02-05T16:24:41.781733948+01:00\",\n        \"Scope\": \"local\",\n        \"Driver\": \"macvlan\",\n        \"EnableIPv6\": false,\n        \"IPAM\": {\n            \"Driver\": \"default\",\n            \"Options\": {},\n            \"Config\": [\n                {\n                    \"Subnet\": \"192.168.8.0/24\",\n                    \"Gateway\": \"192.168.8.254\"\n                }\n            ]\n        },\n        \"Internal\": false,\n        \"Attachable\": false,\n        \"Ingress\": false,\n        \"ConfigFrom\": {\n            \"Network\": \"\"\n        },\n        \"ConfigOnly\": false,\n        \"Containers\": {\n            \"05f88ee41055b209e7599a455705088cf633f6458313508ce867d13b8d39014a\": {\n                \"Name\": \"philip-j--fry-firefox-d2c22d9912fc4a489a1224237af9a3e0\",\n                \"EndpointID\": \"ae0271ed73aa5478ac364444b29342278b82bc710bd4e4eeb64a51d7eeec4d9c\",\n                \"MacAddress\": \"02:42:a1:69:d0:82\",\n                \"IPv4Address\": \"192.168.8.1/24\",\n                \"IPv6Address\": \"\"\n            }\n        },\n        \"Options\": {\n            \"parent\": \"eno1.106\"\n        },\n        \"Labels\": {\n            \"type\": \"oc.app\"\n        }\n    }\n]\n

Close the firefox application.

Logoff, to remove the user pod Philip J. Fry.

"},{"location":"common/1.0/docker_macvlan/#use-the-hubert-j-farnsworth-user-context","title":"Use the `Hubert J. Farnsworth user context.","text":"

Login as the Hubert J. Farnsworth user account.

Note: the user Hubert J. Farnsworth is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

Start the new application firefox, the docker network for this application do NOT use the abcnetfirefox

Run the command

docker network inspect abcnetfirefox\n

abcnetfirefox description :

docker network inspect abcnetfirefox\n[\n    {\n        \"Name\": \"abcnetfirefox\",\n        \"Id\": \"69c5ac0996226654635377458c044675114d5feb742a8a56d8a228180829d9cd\",\n        \"Created\": \"2021-02-05T16:24:41.781733948+01:00\",\n        \"Scope\": \"local\",\n        \"Driver\": \"macvlan\",\n        \"EnableIPv6\": false,\n        \"IPAM\": {\n            \"Driver\": \"default\",\n            \"Options\": {},\n            \"Config\": [\n                {\n                    \"Subnet\": \"192.168.8.0/24\",\n                    \"Gateway\": \"192.168.8.254\"\n                }\n            ]\n        },\n        \"Internal\": false,\n        \"Attachable\": false,\n        \"Ingress\": false,\n        \"ConfigFrom\": {\n            \"Network\": \"\"\n        },\n        \"ConfigOnly\": false,\n        \"Containers\": {},\n        \"Options\": {\n            \"parent\": \"eno1.106\"\n        },\n        \"Labels\": {\n            \"type\": \"oc.app\"\n        }\n    }\n]\n

The new firefox container doesn't use the docker network abcnetfirefox, because the Hubert J. Farnsworth user account is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

The network is disabled by default.

Inspect the Hubert J. Farnsworth firefox container

        \"NetworkSettings\": {\n            \"Bridge\": \"\",\n            \"SandboxID\": \"\",\n            \"HairpinMode\": false,\n            \"LinkLocalIPv6Address\": \"\",\n            \"LinkLocalIPv6PrefixLen\": 0,\n            \"Ports\": {},\n            \"SandboxKey\": \"\",\n            \"SecondaryIPAddresses\": null,\n            \"SecondaryIPv6Addresses\": null,\n            \"EndpointID\": \"\",\n            \"Gateway\": \"\",\n            \"GlobalIPv6Address\": \"\",\n            \"GlobalIPv6PrefixLen\": 0,\n            \"IPAddress\": \"\",\n            \"IPPrefixLen\": 0,\n            \"IPv6Gateway\": \"\",\n            \"MacAddress\": \"\",\n            \"Networks\": {}\n        }\n

The network access is disable for this application

\"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": false, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } }\n

In this case, only users with the label tag internet, can bind the network name abcnetfirefox.

"},{"location":"common/1.0/docker_macvlan/#enable-network-for-hubert-j-farnsworth","title":"Enable network for Hubert J. Farnsworth","text":"

Update the application firefox rules

Now it's time to permit network access to

Update the applist.json file :

Specific rules entry example

\"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": true, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } },\n

The new firefox dictionary with network rules set with \"default\": true :

{\n    \"cat\": \"office\",\n    \"preruncommands\": [ \"RUN DEBIAN_FRONTEND=noninteractive echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes ttf-mscorefonts-installer ttf-bitstream-vera ttf-dejavu ttf-xfree86-nonfree && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes winbind firefox $(apt-cache search firefox-locale | awk '{print $1 }') && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes flashplugin-installer ubuntu-restricted-extras libavc1394-0 && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libasound2-plugins libgail-common libgtk2.0-bin chromium-codecs-ffmpeg-extra gstreamer1.0-libav gstreamer1.0-plugins-ugly gstreamer1.0-vaapi libavcodec-extra && apt-get clean\",\n                        \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n                        \"COPY policies.json /usr/lib/firefox/distribution\",\n                        \"COPY /ntlm_auth /usr/bin/ntlm_auth.abcdesktop\",\n                        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.abcdesktop\",\n                        \"ENV NSS_SDB_USE_CACHE=yes\" ],\n    \"debpackage\": \"\",\n    \"icon\": \"firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.Firefox\",\n    \"name\": \"Firefox\",\n    \"displayname\": \"Firefox\",\n    \"showinview\": \"dock\",\n    \"splash\": \"enable\",\n    \"mem_limit\": \"16gb\",\n    \"oomkilldisable\": true,\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\":\"/usr/share/applications/firefox.desktop\",\n    \"shm_size\": \"2gb\",\n    \"usedefaultapplication\": true,\n    \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": true, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } }\n}\n

Save your changes, and run make dockerfile, next docker build

Build and update your new firefox application

# create the Dockerfile firefox.d \nmake dockerfile\n\n# build the new image\ndocker build -f firefox.d -t firefox.d .\n

Check that the oc.rules label in new firefox.d image

docker inspect firefox.d \n

The oc.rules label is a string json formated

 \"oc.rules\": \"{\\\"homedir\\\":{\\\"default\\\":true,\\\"ship\\\":true},\\\"network\\\":{\\\"default\\\":true,\\\"internet\\\":{\\\"name\\\":\\\"abcnetfirefox\\\",\\\"dns\\\":[\\\"8.8.8.8\\\"]}}}\",\n

Request the abcdesktop core service to update the application cache data

Replace MY_FQDN by your own hostname

export MY_FQDN=localhost\ncurl http://$MY_FQDN/API/manager/buildapplist \n

You do not need to logoff the Hubert J. Farnsworth, just close Firefox application and start it again. The new firefox container use the default network.

Now default user has a network access, and member of cn=ship_crew,ou=people,dc=planetexpress,dc=com use the abcnetfirefox network.

"},{"location":"common/1.0/docker_macvlan/#webhook-events-create-and-destroy-application","title":"Webhook events create and destroy application","text":"

A rule support a specific bash command to notify external security equipment like firewalls, by sending create and destroy events.

\"rules\": {  \"homedir\": { \"default\": false, \"ship\": true }, \n                \"network\": { \"default\": false, \n                    \"ship\": { \"name\": \"abcnetfirefox\", \n                                \"dns\": [ \"8.8.8.8\" ], \n                                \"webhook\": { \n                                    \"create\": \"/usr/bin/curl 'http://firewall.domain.local/update?action=create&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\", \n                                    \"destroy\": \"/usr/bin/curl 'http://firewall.domain.local/update?action=destroy&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\" \n                                } \n                    }\n                }\n}\n
/usr/bin/curl 'http://firewall.domain.local/update?action=create&key={{ key }}&name={{ name }}&ip={{ container_ip }}\n
/usr/bin/curl 'http://firewall.domain.local/update?action=destroy&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\n

Each {{ $label }} is a mustached value.

Label name description example container_ip container ip addr 192.168.8.130 provider authentification provider name planet providertype authentification provider type ldap userid authentification provider user id fry name username Philip J. Fry sha_id sha of the container image sha256%3A5c754563b357bfde4a3762728c686fe0001d10e43835b9468d5218e663b844e8 id name of the application image abcdesktopio/firefox-esr.d:dev launch WM_CLASS of the X11 application Navigator.Firefox icon icon file name firefox.svg keyword docker image label keywords firefox mozilla web internet cat docker image label category office displayname docker image label displayname Firefox-esr path binary path of the application /usr/bin/firefox-esr desktopfile desktop filename of the application firefox.desktop executablefilename binary file name of the application \u00a0firefox-esr locale user current locale settings en_US"},{"location":"common/1.0/docker_macvlan/#events","title":"Events :","text":""},{"location":"common/1.0/docker_macvlan/#create-event","title":"create event:","text":"

The control plane pyos replace the mustached url string /usr/bin/curl 'http://firewall.domain.local/update?action=create&name={{ name }}&ip={{ container_ip }}' as /usr/bin/curl 'http://firewall.domain.local/update?action=create&name=Philip%20J.%20Fry&ip=192.168.8.130'

"},{"location":"common/1.0/docker_macvlan/#destroy-event","title":"destroy event:","text":"

The control plane pyos replace the mustached url string /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&name={{ name }}&ip={{ container_ip }}' as /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&name=Philip%20J.%20Fry&ip=192.168.8.130'

"},{"location":"common/1.0/docker_macvlan/#desktopwebhook-options-in-odconfig-file","title":"desktop.webhook options in od.config file","text":""},{"location":"common/1.0/docker_macvlan/#url-encoding-parameters","title":"url encoding parameters","text":"

To encode url parameters use the option desktop.webhookencodeparams. Set desktop.webhookencodeparams to True to encode label name. The default value is False

"},{"location":"common/1.0/docker_macvlan/#additional-dict-datas","title":"additional dict datas","text":"

Additional datas can be set using the desktop.webhookdict option in od.config file

desktop.webhookdict: { \n        'api_key': 'supersecret', \n        'firewall_manage_ip': '161.105.208.129'  \n}\n

The command line

/usr/bin/curl 'http://{{ firewall_manage_ip }}/update?action=destroy&key={{ api_key }}&name={{ name }}&ip={{ container_ip }}'\n

becomes

/usr/bin/curl 'http://161.105.208.129/update?action=destroy&key=supersecret&name={{ name }}&ip={{ container_ip }}'\n
"},{"location":"common/1.0/update_frontend_image/","title":"Update and custom front end image","text":""},{"location":"common/1.0/update_frontend_image/#requirements","title":"Requirements","text":""},{"location":"common/1.0/update_frontend_image/#goals","title":"Goals","text":""},{"location":"common/1.0/update_frontend_image/#build-images","title":"Build images","text":"

Build image process from abcdesktopio docker registry to your private registry

"},{"location":"common/1.0/update_frontend_image/#update-ocnginx-image","title":"Update oc.nginx image","text":"

Goal :

Only the name of the network is used by abcdesktop.

"},{"location":"common/1.0/update_frontend_image/#clone-default-webmodules","title":"Clone default webmodules","text":"
git clone https://github.com/abcdesktopio/webModules.git\n
"},{"location":"common/1.0/update_frontend_image/#locate-project-and-ui-files","title":"Locate project and ui files","text":""},{"location":"common/1.0/update_frontend_image/#update-uijson-file","title":"Update ui.json file","text":"

Update your ui.json file. ui.json is located in var/webModules/transpile/config directory.

# cd var/webModules/transpile/config\nvar/webModules/transpile/config# ls -la\ntotal 204\ndrwxrwxr-x   1 root root   4096 Feb  1 15:14 .\ndrwxr-xr-x   1 root root   4096 Feb  1 15:14 ..\n-rw-rw-r--   1 root root     34 Feb  1 15:14 .cache.json\n-rw-rw-r--   1 root root   2215 Feb  1 15:11 modules.json\n-rw-rw-r--   1 root root   1044 Feb  1 15:11 ui.json\n

ui.json is a json dictionary file

The main entry is name, name is the project name:

entry default value example name abcdesktop.io acmedesktop.io
{\n  \"name\": \"abcdesktop.io\",\n  \"colors\": [\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\"\n}\n
"},{"location":"common/1.0/update_frontend_image/#colors-dictionary-entries","title":"Colors dictionary entries","text":"entry default value example @primary #474B55 #474B55 @secondatry #2D2D2D #2D2D2D @tertiary #6EC6F0 #6EC6F0"},{"location":"common/1.0/update_frontend_image/#create-a-new-dockerfile-to-build-changes","title":"Create a new Dockerfile to build changes","text":""},{"location":"common/1.0/update_frontend_image/#update-the-uijson-with-your-own-values","title":"Update the ui.json with your own values","text":"

Change for example the name to

\"name\": \"acmedesktop.io\"\n

and the

@tertiary \"value\": \"#00BCD4\"\n

Example

{\n  \"name\": \"acmedesktop.io\",\n  \"colors\": [\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#00FCD4\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\"\n}\n
"},{"location":"common/1.0/update_frontend_image/#write-your-dockerfile","title":"Write your Dockerfile","text":"
FROM abcdesktopio/oc.nginx:builder as builder\n\n# copy data files\nCOPY --from=abcdesktopio/oc.nginx:dev var/webModules /var/webModules\n# copy updated file ui.json \nCOPY ui.json /var/webModules/transpile/config/ui.json\n# run makefile \nRUN cd /var/webModules && make css\n\n\n# --- START Build image ---\nFROM abcdesktopio/oc.nginx\n\n# COPY generated web site from builder container\nCOPY --from=builder var/webModules /var/webModules\n
"},{"location":"common/1.0/update_frontend_image/#docker-build","title":"Docker build","text":"

Run the docker build command to build the new oc.nginx:acme image

docker build -t oc.nginx:acme .\n
Sending build context to Docker daemon  258.3MB\nStep 1/6 : FROM abcdesktopio/oc.nginx:builder as builder\n ---> b04ba79c6b97\nStep 2/6 : COPY --from=abcdesktopio/oc.nginx var/webModules /var/webModules\n ---> Using cache\n ---> 3c16ce97b6b5\nStep 3/6 : COPY ui.json /var/webModules/transpile/config/ui.json\n ---> Using cache\n ---> 3c8e48730bb0\nStep 4/6 : RUN cd /var/webModules && make css\n ---> Running in b9660fb676b2\nBuild css: 1.005s\nTotal duration: 1.007s\nRemoving intermediate container b9660fb676b2\n ---> febdb98ad1aa\nStep 5/6 : FROM abcdesktopio/oc.nginx\n ---> 2b311b600a4e\nStep 6/6 : COPY --from=builder var/webModules /var/webModules\n ---> Using cache\n ---> c9545d07f825\nSuccessfully built c9545d07f825\nSuccessfully tagged oc.nginx:acme\n

Run the docker images command to read the new oc.nginx image

docker images \n\nREPOSITORY                   TAG       IMAGE ID       CREATED             SIZE\noc.nginx                     acme      4de1755b60d7   About an hour ago   746MB\n
"},{"location":"common/1.0/update_frontend_image/#update-the-dockercompose-or-the-abcdesktopyaml-file","title":"Update the dockercompose or the abcdesktop.yaml file","text":"

Update the dockercompose or the abcdesktop.yaml file to replace the default abcdesktopio/oc.nginx by the new image oc.nginx:acme name.

version: '3'\nservices:\n  pyos:\n    depends_on:\n      - memcached\n      - mongodb\n    image: 'abcdesktopio/oc.pyos'\n    networks:\n      - netback\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n  speedtest:\n    image: 'abcdesktopio/oc.speedtest'\n    networks:\n      - netuser\n  nginx:\n    depends_on:\n      - memcached\n      - pyos\n    image: 'oc.nginx:acme'\n    ports:\n      - '80:80'\n      - '443:443'\n    networks:\n      - netuser\n      - netback\n  memcached:\n    image: memcached\n    networks:\n      - netback\n  mongodb:\n    image: mongo\n    networks:\n      - netback\nnetworks:\n  netuser:\n    driver: bridge\n  netback:\n    internal: true\n

The run the docker-compose up, and start you web browser. You can read the new project name at the home page.

We define the new tertiary color as #00FCD4 in dict { \"name\": \"@tertiary\", \"value\": \"#00FCD4\" }

Old tertiary color has been replace by #00FCD4.

"},{"location":"common/3.0/createcontainerisedapplicationdebug/","title":"How to create containerised application from scratch for troubleshooting","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#requirements","title":"Requirements","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#goals","title":"Goals","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#create-an-application-using-a-new-container","title":"Create an application using a new container","text":"

We are starting a new containerised application from a fresh ubuntu:20.04 image and bind the X11 socket to use the pod DISPLAY.

We start a new container one as root, and another one as current user hermes

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-abcdesktop-session","title":"Start a new abcdesktop session","text":"

Open a web browser and go to abcdesktop service url

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#login-in-as-hermes","title":"Login in as hermes","text":"

In the example we use LDAP authentification.

The login is Hermes Conrad, the password is hermes

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-hermess-pod-variables-name-uid-xauth_key","title":"Get hermes's pod variables: name, uid, XAUTH_KEY","text":"

Get a shell to your host. All next command use a host shell.

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-name","title":"Get the hermes's pod name","text":"

To read the hermes pod name, MIT-MAGIC-COOKIE-1, and uid

kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.name}' -n abcdesktop\n

We save this value in the pod variable, for next usage

POD=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.name}' -n abcdesktop)\necho $POD\n

You should read on stdout

hermes-da0ca3c8-48ba-4736-85a9-d3fd2c85f009\n

We save this value in the $POD for a next usage.

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-xauth_key","title":"Get the hermes's XAUTH_KEY","text":"

The release 3.0 need the MIT-MAGIC-COOKIE-1 to reach the x11 DISPLAY.

Run the command echo $XAUTH_KEY to read the $XAUTH_KEY value inside the hermes's pod

export XAUTH_KEY=$(kubectl exec -n abcdesktop -it $POD -- bash -c 'echo $XAUTH_KEY')\n
Defaulted container \"x-planet-hermes\" out of: x-planet-hermes, c-planet-hermes, f-planet-hermes, o-planet-hermes, hermes-conrad-xterm-9e2589dc0da0473da8e33d3ab98abedc (ephem), i-planet-hermes (init)\n

The XAUTH_KEY variable is exported for a next usage.

echo $XAUTH_KEY\n306908f8e4d4768c7595ce5ad53479\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-uid","title":"Get the hermes's pod uid","text":"
kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.uid}' -n abcdesktop\n

We save this value in the PODUID exported variable, for next usage

export PODUID=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.uid}' -n abcdesktop)\n
echo $PODUID\nc6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#inspect-the-hermess-pod-to-look-for-binding-volume-mapping","title":"Inspect the Hermes's pod to look for Binding volume mapping","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#list-files-in-varlibkubeletpodspoduid","title":"List files in /var/lib/kubelet/pods/$PODUID","text":"

The default kubelet's pod directory is /var/lib/kubelet/pods/. If you change it during the installation process replace /var/lib/kubelet/pods/ by your own directory.

ls -la /var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket\n
ls -la /var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket\ntotal 4\ndrwxrwxrwt 2 root root   60 Dec  8 19:43 .\ndrwxr-xr-x 9 root root 4096 Dec  8 19:43 ..\nsrwxrwxrwx 1 1051 2051    0 Dec  8 19:43 X0\n

X0 is a file unix socket, we will bind the X0 socket in the next podapp.

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-home-hermes-volume-location","title":"Get the hermes's pod home-hermes volume location","text":"
kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].spec.volumes[?(@.name==\"home-hermes\")].hostPath.path}' -n abcdesktop\n

Description of this query

We save this value in the PODHOME exported variable, for next usage

export PODHOME=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].spec.volumes[?(@.name==\"home-hermes\")].hostPath.path}' -n abcdesktop)\n

Check the value with a echo

echo $PODHOME\n/tmp/hermes-conrad\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-container-from-ubuntu2004","title":"Start a new container from ubuntu:20.04","text":"

Now we've got the all volumes path and XAUTH_KEY, let's start a new container with mounted volume

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#create-container-in-the-pod-sandbox-with-config-file","title":"Create container in the pod sandbox with config file","text":"

We use envsubst to replace variable content in a template yaml file.

Some systems have gettext with envsubst preinstalled. However, if it is missing, you can install it using a package manager. For macOS you can use homebrew:

brew install gettext

The variables ${PODUID}, ${PODHOME} and ${XAUTH_KEY} are exported.

Make sure to use export, otherwise your variables are considered shell variables and might not be accessible to envsubst

Create a file podapp.template.yaml

apiVersion: v1\nkind: Pod\nmetadata:\n  name: podapp\n  namespace: abcdesktop\nspec:\n  volumes:\n  - name: x11socket\n    hostPath:\n      # x11 directory location on host ${PODUID}\n      path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # home directory location on host\n      path: ${PODHOME}\n      # this field is optional\n      type: Directory\n  containers:\n  - name: abccontainer\n    image: ubuntu:20.04\n    command: [\"/bin/sleep\"]\n    args: [\"1d\"]\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n    env:\n    - name: XAUTH_KEY\n      value: ${XAUTH_KEY}\n

Run the envsubst command to replace ${PODUID}, ${PODHOME} and ${XAUTH_KEY}

envsubst < podapp.template.yaml > podapp.yaml \n

Dump the podapp.yaml file content, and check that the volumes are set with the new values.

# cat podapp.yaml \n
apiVersion: v1\nkind: Pod\nmetadata:\n  name: podapp\n  namespace: abcdesktop\nspec:\n  volumes:\n  - name: x11socket\n    hostPath:\n      # directory location on host\n      path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # directory location on host\n      path: /tmp/hermes-conrad\n      # this field is optional\n      type: Directory\n  containers:\n  - name: abccontainer\n    image: ubuntu:20.04\n    command: /bin/sleep 1d\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n

Create the application pod

kubectl apply -f podapp.yaml \npod/podapp created\n

Check that your pod podapp is Running

kubectl get pods podapp  -n abcdesktop\nNAME     READY   STATUS    RESTARTS   AGE\npodapp   1/1     Running   0          32s\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-a-shell-in-podapp","title":"Get a shell in podapp","text":"

You get a shell command inside the container.

kubectl exec -it podapp  -n abcdesktop -- bash \n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#for-release-30-set-the-mit-magic-cookie-1","title":"for release 3.0 set the MIT-MAGIC-COOKIE-1","text":"
apt-get update && apt-get install -y xauth\n
export DISPLAY=:0.0\necho $XAUTH_KEY\nxauth add $DISPLAY MIT-MAGIC-COOKIE-1 $XAUTH_KEY\n

You can read on stdout

root@podapp:/# export DISPLAY=:0.0\nroot@podapp:/# echo $XAUTH_KEY\n306908f8e4d4768c7595ce5ad53479\nroot@podapp:/# xauth add $DISPLAY MIT-MAGIC-COOKIE-1 $XAUTH_KEY\nxauth:  file /root/.Xauthority does not exist\nroot@podapp:/#\n

The file /root/.Xauthority does not exist, it has been created.

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#install-your-x11-applications","title":"Install your X11 applications","text":"

For example, I choose to install the x11-apps package

Replace x11-apps by your own application

apt-get install -y x11-apps\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-your-x11-application","title":"Start your X11 application","text":"

To start the X11 application, just run it. Your DISPLAY is set to :0.0, (for release 3.0, you've already added the MIT-MAGIC-COOKIE-1).

But remember you a running a container as root, and all commands are running as root inside the container.

Start xedit

xedit\n

Go back to your web browser.

A new x11 window xedit should be present on your display

xedit doesn't write any error message in the bash container.

You've get a shell inside a container to run and start any application. You can also install and start any others applications.

To clean the running pod podapp

kubectl delete pods podapp -n abcdesktop \n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-container-from-ubuntu2004-as-hermes","title":"Start a new container from ubuntu:20.04 as hermes","text":"

To start a new container from ubuntu:20.04 as hermes, we have to add the localaccount secret volume to the previous container

Read the securityContext from the hermes pod

export PODRUNASUSER=$(kubectl get pods -l=access_userid=hermes -o json  -n abcdesktop | jq -r '.items[0].spec.securityContext.runAsUser')\nexport PODRUNASGROUP=$(kubectl get pods -l=access_userid=hermes -o json  -n abcdesktop | jq -r '.items[0].spec.securityContext.runAsGroup')\n

Check the uidNumber and the gidNumber values

echo PODRUNASUSER:$PODRUNASUSER PODRUNASGROUP:$PODRUNASGROUP\nPODRUNASUSER:1051 PODRUNASGROUP:2051\n

Create a file hermespodapp.template.yaml

apiVersion: v1\nkind: Pod\nmetadata:\n  name: hermespodapp\n  namespace: abcdesktop\nspec:\n  securityContext:\n    runAsUser: ${PODRUNASUSER}\n    runAsGroup: ${PODRUNASGROUP}\n  volumes:\n  - name: x11socket\n    hostPath:\n      # x11 directory location on host ${PODUID}\n      path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # home directory location on host\n      path: ${PODHOME}\n      # this field is optional\n      type: Directory\n  - name: localaccount\n    hostPath:\n      # localaccount directory location on host\n      path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~secret/auth-localaccount-hermes\n      # this field is optional\n      type: Directory\n  containers:\n  - name: hermescontainer\n    image: ubuntu:20.04\n    command: [\"/bin/sleep\"]\n    args: [\"1d\"]\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n    - mountPath: /var/secrets/abcdesktop/localaccount\n      name: localaccount\n    env:\n    - name: XAUTH_KEY\n      value: ${XAUTH_KEY}\n

Create your hermespodapp.yaml file from the previous template

envsubst < hermespodapp.template.yaml > hermespodapp.yaml \n

Look at your hermespodapp.yaml

cat hermespodapp.yaml \n
apiVersion: v1\nkind: Pod\nmetadata:\n  name: hermespodapp\n  namespace: abcdesktop\nspec:\n  securityContext:\n    runAsUser: 1051\n    runAsGroup: 2051\n  volumes:\n  - name: x11socket\n    hostPath:\n      # x11 directory location on host c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf\n      path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # home directory location on host\n      path: /tmp/hermes-conrad\n      # this field is optional\n      type: Directory\n  - name: localaccount\n    hostPath:\n      # localaccount directory location on host\n      path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~secret/auth-localaccount-hermes\n      # this field is optional\n      type: Directory\n  containers:\n  - name: hermescontainer\n    image: ubuntu:20.04\n    command: [\"/bin/sleep\"]\n    args: [\"1d\"]\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n    - mountPath: /var/secrets/abcdesktop/localaccount\n      name: localaccount\n    env:\n    - name: XAUTH_KEY\n      value: 306908f8e4d4768c7595ce5ad53479\n

Create the hermespodapp

kubectl apply -f hermespodapp.yaml \npod/hermespodapp created\n

To install the x11 application package, we need a root access to the pod/hermespodapp. We use runc to get a rooted shell.

Read the containerID of the pod hermespodapp

CONTAINER=$(kubectl -n abcdesktop  get pod hermespodapp -o jsonpath=\"{.status.containerStatuses[].containerID}\" |sed 's/.*\\/\\///')\n

Get the shell with runc command

runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 $CONTAINER bash\ngroups: cannot find name for group ID 2051\nroot@hermespodapp:/# \n

This is correct group ID 2051 does not exit. Let's patch your file system with hermes credentials

rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nrm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nrm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nrm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\n

Now your files are updated. You can exit, and reopen a bash to your container

root@hermespodapp:/# exit\n
# runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 $CONTAINER bash\nroot@hermespodapp:/# \n

The error message does not appear anymore.

Install your X11 applications as root

apt-get update && apt-get install -y x11-apps\n

Quit the root session

exit\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-your-x11-application-as-hermes","title":"Start your X11 application as hermes","text":"

Start a new session to the pod hermespodapp

kubectl -n abcdesktop exec -it hermespodapp -- bash \n

You get a shell prompt as as hermes. Check the hermes homedirectory and id number

hermes@hermespodapp:/$\nhermes@hermespodapp:/$ cd\nhermes@hermespodapp:~$ pwd\n/home/hermes\nhermes@hermespodapp:~$ id \nuid=1051(hermes) gid=2051(hermes) groups=2051(hermes)\n

Export the var DISPLAY and start the edit application. You don't need to create the .Xauthority file. /home/hermes is already mounted as a volume.

hermes@hermespodapp:~$ export DISPLAY=:0.0\nhermes@hermespodapp:~$ xedit &\n[1] 699\n

This process is running as hermes :

hermes@hermespodapp:~$ ps -ef\nUID          PID    PPID  C STIME TTY          TIME CMD\nhermes         1       0  0 15:57 ?        00:00:00 /bin/sleep 1d\nhermes       690       0  0 16:47 pts/0    00:00:00 bash\nhermes       699     690  0 16:48 pts/0    00:00:00 xedit\nhermes       700     690  0 16:49 pts/0    00:00:00 ps -ef\n

Go back to your web browser.

A new x11 window xedit should be present on your display

The name of the edit window is the name of your pod (hermespodapp).

To clean the running pod hermespodapp

kubectl delete -f hermespodapp.yaml \n

You have created a pod to run an X11 application as a user in LDAP Directory. You get a root shell inside the pod, to patch, update or install other applications.

"},{"location":"common/3.0/mount_nfs_tag/","title":"Define rules to mount a nfs volume inside user pod","text":"

Only supported in abcdesktop release 3.0

An nfs volume allows an existing NFS (Network File System) share to be mounted into a Pod. NFS volume can be pre-populated with data, and can be shared between pods. NFS can be mounted by multiple writers simultaneously.

You must have your own NFS server running with the share exported before you can use it.

"},{"location":"common/3.0/mount_nfs_tag/#update-the-odconfig-file","title":"Update the od.config file","text":"

Update the od.config to add

"},{"location":"common/3.0/mount_nfs_tag/#add-a-label-in-the-auth-provider","title":"Add a label in the auth provider","text":"

In this example, we add a label nfsuser as a condition to mount nfs resource

In the auth provider add a dummy condition or a memberOf condition. All types of conditions are supported, the goal is only to get a label.

Update the od.config file and look for the default ldapconfig dictionnary

"},{"location":"common/3.0/mount_nfs_tag/#add-a-dummy-condition","title":"Add a dummy condition","text":"
ldapconfig : { \n  'planet': {  \n    'default'       : True,\n    'ldap_timeout'  : 15,\n    'ldap_basedn'   : 'dc=planetexpress,dc=com',\n    'users_ou'      : 'ou=people,dc=planetexpress,dc=com',\n    'servers'       : [ 'ldap://openldap.abcdesktop.svc.cluster.local:30389' ],\n    'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n    'policies': { \n       'acls': None, \n       'rules' : { \n          'rule-dummy': { \n             'conditions' : [ { 'boolean': True, 'expected' : True  } ],\n             'expected' : True,\n             'label': 'nfsuser' } } } } } }\n
"},{"location":"common/3.0/mount_nfs_tag/#or-add-a-memberof-condition","title":"Or Add a memberOf condition","text":"
ldapconfig : { \n  'planet': {  \n    'default'       : True,\n    'ldap_timeout'  : 15,\n    'ldap_basedn'   : 'dc=planetexpress,dc=com',\n    'users_ou'      : 'ou=people,dc=planetexpress,dc=com',\n    'servers'       : [ 'ldap://openldap.abcdesktop.svc.cluster.local:30389' ],\n    'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n    'policies': { \n       'acls': None, \n       'rules' : { \n          'rule-nfsuser':  { \n              'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com',   'expected' : True  } ],\n              'expected' : True, \n              'label': 'nfsuser' } } } } }\n
"},{"location":"common/3.0/mount_nfs_tag/#add-a-rule-in-the-desktoppolicies","title":"Add a rule in the desktop.policies","text":"

In this example, we define entries :

The mount command become like:

mount -t nfs 192.168.7.101:/volume1/isostore /mnt/iso\n

Update the desktop.policies dictionnary and add a new key rules. In the new rules define a new entry nfsuser.

The name of the entry MUST match a user label tag, else the mount point is not created.

In this example the label is defined as nfsuser, but you can set differents values. Then set nfs descriptions as you can read in kubernetes nfs volume

desktop.policies: {  \n'acls' : {},\n'rules': { \n  'volumes': { \n    'nfsuser': {\n      'type': 'nfs', \n      'name': 'isostore', \n      'server': '192.168.7.101',\n      'path': '/volume1/isostore',\n      'mountPath': '/mnt/iso',\n      'readOnly': True } } } } \n
"},{"location":"common/3.0/mount_nfs_tag/#apply-the-new-odconfig-file","title":"Apply the new od.config file","text":"

Save your local changes in od.config, and update the new configmap abcdesktop-config

kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create --from-file=od.config -n abcdesktop\n
"},{"location":"common/3.0/mount_nfs_tag/#restart-pyos","title":"Restart pyos","text":"

Restart pyos pods

kubectl delete pod -l run=pyos-od -n abcdesktop\n
pod \"pyos-od-5586b88767-64jwt\" deleted\n
"},{"location":"common/3.0/mount_nfs_tag/#create-a-new-desktop-for-hermes-conrad-and-list-nfs-files","title":"Create a new desktop for Hermes Conrad and list nfs files","text":"

Open the url http://localhost:30443, in your web browser, to start a simple user's pod.

http://localhost:30443\n

You can define many rules from LDAP groups. To get more informations about rules, read the authentification rules section

"},{"location":"common/3.0/multiplegroupsfeature/","title":"The multiple groups features for RFC 2307 support","text":"

Let talk about a common features with multiple groups and user securityContext on pods

"},{"location":"common/3.0/multiplegroupsfeature/#context","title":"context","text":""},{"location":"common/3.0/multiplegroupsfeature/#goal","title":"Goal","text":""},{"location":"common/3.0/multiplegroupsfeature/#check-the-kubernetes-supplementalgroups-support","title":"Check the kubernetessupplementalGroups support","text":"

Let's create a yaml file to define pod with securityContext and supplementalGroups

apiVersion: v1\nkind: Pod\nmetadata:\n  name: security-context-supplementalgroups-demo\nspec:\n  securityContext:\n    runAsUser: 1000\n    runAsGroup: 3000\n    supplementalGroups: [2000,4000,5000,6000]\n  volumes:\n  - name: sec-ctx-vol\n    emptyDir: {}\n  containers:\n  - name: sec-ctx-demo\n    image: busybox:1.28\n    command: [ \"sh\", \"-c\", \"sleep 1h\" ]\n    volumeMounts:\n    - name: sec-ctx-vol\n      mountPath: /data/demo\n    securityContext:\n      allowPrivilegeEscalation: false\n

Create the pod security-context-supplementalgroups-demo

$ kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/security-context-supplementalgroups-demo.yaml\n

The pod is created

pod/security-context-supplementalgroups-demo created\n

Test the id command, you get the list uid=1000 gid=3000 groups=2000,4000,5000,6000

$ kubectl exec -it pod/security-context-supplementalgroups-demo -- id\nuid=1000 gid=3000 groups=2000,4000,5000,6000\n

Run the group command inside the pod

$ kubectl exec -it pod/security-context-supplementalgroups-demo -- groups\n

The result exit with code 1. The groups do not exist in /etc/group

 3000groups: unknown ID 3000\n 2000groups: unknown ID 2000\n 4000groups: unknown ID 4000\n 5000groups: unknown ID 5000\n 6000groups: unknown ID 6000\n command terminated with exit code 1\n

This is what you want to do with abcdesktop, the id numbers are replaced by strings. The uid, gid and supplementalgroups are read from posixAccount and posixGroup in the directory service.

"},{"location":"common/3.0/multiplegroupsfeature/#read-specsecuritycontext-from-a-pod","title":"Read .spec.securityContext from a pod","text":"

kubectl command to read .spec.securityContext

kubectl get pod/security-context-supplementalgroups-demo -o json | jq '.spec.securityContext' \n

You read as output

{\n  \"runAsGroup\": 3000,\n  \"runAsUser\": 1000,\n  \"supplementalGroups\": [\n    2000,\n    4000,\n    5000,\n    6000\n  ]\n}\n
"},{"location":"common/3.0/multiplegroupsfeature/#accounts-description","title":"Accounts description","text":"

The complete ldif file can be downloaded at the end of this page.

The ldif set :

Create a posixAccount : cn=hermes,ou=people,dc=planetexpress,dc=com - gidNumber: 1036 - uid: hermes - uidNumber: 1035

Create a posixGroup for hermes : cn=hermes,ou=groups,dc=planetexpress,dc=com

Create a posixGroup : cn=accountant,ou=groups,dc=planetexpress,dc=com

Create a posixGroup cn=humans,ou=groups,dc=planetexpress,dc=com

"},{"location":"common/3.0/multiplegroupsfeature/#login-to-abcdesktop","title":"Login to abcdesktop","text":"

Login to abcdesktop as Hermes Conrad account

Inside the user pod, the unix group file contains :

cat /etc/group\n
hermes:x:1036:\nhumans:x:20467:hermes,fry\naccountant:x:18430:hermes\n

This is correct.

The user's pod is defined with a securityContext

In this example you can replace hermes-d1411d93-8922-4c33-81d7-3c085f381a27 by your own pod's name

kubectl get pods hermes-d1411d93-8922-4c33-81d7-3c085f381a27 -n abcdesktop -o json| jq '.spec.securityContext'  \n

You can read on stdout

{\n  \"runAsGroup\": 1036,\n  \"runAsUser\": 1035,\n  \"supplementalGroups\": [\n    20467,\n    18430\n  ]\n}\n

This is correct. supplementalGroups defines the others groups from LDAP for DN:cn=hermes,ou=groups,dc=planetexpress,dc=com

Inside the user pod run the id command

hermes:~$ id\nuid=1035(hermes) gid=1036(hermes) groups=1036(hermes),18430(accountant),20467(humans)\nhermes:~$ groups\nhermes accountant humans\nhermes:~$\n

This is correct.

"},{"location":"common/3.0/multiplegroupsfeature/#create-new-file-on-host","title":"Create new file on host","text":"

The default home directory in od.config is a volume hostPath set to /tmp

desktop.homedirectorytype: 'hostPath' \ndesktop.hostPathRoot: '/tmp'\n

On your host server, get a shell with as root account, create a file humansfile with restricted access to member of humans group.

cd /mnt/hermes-conrad\necho 'hello' > humansfile\nchown 0:20467 humansfile\nchmod 070 humansfile \n

Check the owner and group of the new file humansfile

ls -la humansfile\n----rwx--- 1 root 20467 6 nov.  23 17:16 humansfile\n

Check inside the user pod check that hermes account can write data in the new file humansfile.

This is correct hermes is member of humans group.

hermes:~$ ls -la humansfile \n=======\n- memberUid: `hermes`\n\nInside the user pod, the unix group file contains : \n\n```bash\ncat /etc/group\n
hermes:x:1036:\nhumans:x:20467:hermes,fry\naccountant:x:18430:hermes\n

This is correct.

The user's pod is defined with a securityContext

'securityContext': {\n  'runAsUser': 1035,\n  'runAsGroup': 1036,\n  'supplementalGroups': [20467, 18430] \n}\n

This is correct. supplementalGroups defines the others groups from LDAP

Inside the user pod run the id command

hermes:~$ id\nuid=1035(hermes) gid=1036(hermes) groups=1036(hermes),18430(accountant),20467(humans)\nhermes:~$ groups\nhermes accountant humans\nhermes:~$\n

This is correct.

"},{"location":"common/3.0/multiplegroupsfeature/#create-new-file-on-host_1","title":"Create new file on host","text":"

The default home directory in od.config is a volume hostPath set to /tmp

desktop.homedirectorytype: 'hostPath' \ndesktop.hostPathRoot: '/tmp'\n

On your host server, using a root account, create a file humansfile with restricted access to member of humans group.

cd /mnt/hermes-conrad\necho 'hello' > humansfile\nchown 0:20467 humansfile\nchmod 070 humansfile \n

Check the owner and group

ls -la humansfile\n----rwx--- 1 root 20467 6 nov.  23 17:16 humansfile\n

Check inside the user pod check that hermes account can to write data in file humansfile, because hermes is member of humans group.

hermes:~$ ls -la humansfile \n>>>>>>> 612b52bcffb502a9d934c0cbba40a43d553fc731\n----rwx--- 1 root humans 6 Nov 23 16:16 humansfile\nhermes:~$ echo 'hello from hermes' >> humansfile \nhermes:~$ more humansfile \nhello\nhello from hermes\n<<<<<<< HEAD\nhermes:~$ \n

This is correct.

We describe a common features with multiple groups and user securityContext on pods and abcdesktop support multiple groups with posixGroup define in RFC2307.

"},{"location":"common/3.0/multiplegroupsfeature/#ldap-ldif-dump","title":"LDAP ldif dump","text":"

To get more details about the ldif and ldap datas, you can download the ldif file planetexpress.

version: 1\n=======\nhermes:~$ \n

This is correct.

We describe a common features with multiple groups and user securityContext on pods and abcdesktop support multiple groups with posixGroup define in RFC2307.

"},{"location":"common/3.0/multiplegroupsfeature/#ldif-dump","title":"ldif dump","text":"

To get more details about the ldif and ldap datas, you can download the ldif file planetexpress.

version: 1\n>>>>>>> 612b52bcffb502a9d934c0cbba40a43d553fc731\n\ndn: dc=planetexpress,dc=com\nobjectClass: dcObject\nobjectClass: organization\nobjectClass: top\ndc: planetexpress\no: Planet Express, Inc.\n\ndn: ou=people,dc=planetexpress,dc=com\nobjectClass: organizationalUnit\nobjectClass: top\nou: people\ndescription: Planet Express crew\n\ndn: cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com\nobjectClass: inetOrgPerson\nobjectClass: organizationalPerson\nobjectClass: person\nobjectClass: posixAccount\nobjectClass: top\ncn: Hermes Conrad\ngidNumber: 1036\nhomeDirectory: /home/hermes\nsn: Conrad\nuid: hermes\nuidNumber: 1035\ndescription: Human\nemployeeType: Accountant\nemployeeType: Bureaucrat\ngivenName: Hermes\nmail: hermes@planetexpress.com\nou: Office Management\n\ndn: ou=groups,dc=planetexpress,dc=com\nobjectClass: organizationalUnit\nobjectClass: top\nou: groups\n\ndn: cn=fry,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: fry\ngidNumber: 1025\nmemberUid: fry\n\ndn: cn=humans,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: humans\ngidNumber: 20467\nmemberUid: fry\nmemberUid: hermes\n\ndn: cn=hermes,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: hermes\ngidNumber: 1036\n\ndn: cn=accountant,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: accountant\ngidNumber: 18430\nmemberUid: hermes\n
"},{"location":"common/3.0/update_frontend_image/","title":"Update and custom frontend web page","text":"

abcdesktop uses a front HTML web site and X11 Linux application. So, to get a new graphic design, you have to define it twice in HTML (CSS) files and in X11 config.

"},{"location":"common/3.0/update_frontend_image/#requirements","title":"Requirements","text":""},{"location":"common/3.0/update_frontend_image/#goals","title":"Goals","text":""},{"location":"common/3.0/update_frontend_image/#configure-odconfig-to-use-the-new-color","title":"Configure od.config to use the new color","text":"

In the od.config, add the env var ABCDESKTOP_BG_COLOR

desktop.envlocal :  {\n  'X11LISTEN':'tcp', \n  'WEBSOCKIFY_HEARTBEAT':'30',\n  'TURN_PROTOCOL': 'tcp',\n  'ABCDESKTOP_BG_COLOR': \u2018#18974c\u2019 }\n

Then update the config map abcdesktop-config and restart deployment pyos-od

kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\nkubectl rollout restart deployment pyos-od -n abcdesktop\n

You should read on stdout

configmap/abcdesktop-config replaced\ndeployment.apps/pyos-od restarted\n
"},{"location":"common/3.0/update_frontend_image/#create-new-image-for-abcdesktop-ocnginx","title":"Create new image for abcdesktop oc.nginx","text":""},{"location":"common/3.0/update_frontend_image/#download-uijson-file","title":"Download ui.json file","text":"

Download the ui.json file. ui.json is located in webModules/transpile/config directory of webModules abcdesktop's repository.

mkdir build\ncd build\nwget https://raw.githubusercontent.com/abcdesktopio/webModules/3.2/transpile/config/ui.json\n

ui.json is a json dictionary file

The main entres are :

entry default value example name abcdesktop.io acmedesktop.io projectNameSplitedHTML <span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>b</span><span id='projectNameSplitedStagec'>c</span><span id='projectNameSplitedStaged'>desktop</span><span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>
{\n  \"name\": \"abcdesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>b</span><span id='projectNameSplitedStagec'>c</span><span id='projectNameSplitedStaged'>desktop</span>\",\n  \"colors\": [\n    {\n      \"name\": \"@x11bgcolor\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@quaternary\",\n      \"value\": \"#1E1E1E\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\",\n  \"urlusermanual\":  \"https://www.abcdesktop.io/\",\n  \"urlusersupport\": \"https://www.abcdesktop.io/\",\n  \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
"},{"location":"common/3.0/update_frontend_image/#update-the-uijson-with-your-own-values","title":"Update the ui.json with your own values","text":"

Change for example the name of the project, and projectNameSplitedHTML to

  \"name\": \"acmedesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>\",\n

An change the color x11bgcolor

entry name new color value @x11bgcolor #18974c

You should use the same value for ABCDESKTOP_BG_COLOR and for @x11bgcolor.

Example

{\n  \"name\": \"acmedesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>\",\n   \"colors\": [\n    {\n      \"name\": \"@x11bgcolor\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#18974C\"\n    },\n    {\n      \"name\": \"@quaternary\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\",\n  \"urlusermanual\":  \"https://www.abcdesktop.io/\",\n  \"urlusersupport\": \"https://www.abcdesktop.io/\",\n  \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
"},{"location":"common/3.0/update_frontend_image/#create-a-new-dockerfile-to-build-changes","title":"Create a new Dockerfile to build changes","text":""},{"location":"common/3.0/update_frontend_image/#write-your-dockerfile-to-build-the-new-image","title":"Write your Dockerfile to build the new image","text":"

Dockerfile

#\n# --- update oc.nginx:builder image start here ---\n# use the abcdesktopio/oc.nginx:builder\n# oc.nginx:builder contains Makefile and tools like nodejs, lessc need to update the ui.json file\n# oc.nginx:builder source https://raw.githubusercontent.com/abcdesktopio/oc.nginx/main/Dockerfile.builder          \n\n#######\nFROM abcdesktopio/oc.nginx:builder as builder\n# copy data files /var/webModules\nCOPY --from=abcdesktopio/oc.nginx:3.2 var/webModules /var/webModules\n# copy updated file ui.json with your own custom values\nCOPY ui.json /var/webModules/transpile/config/\n\n# run makefile\n# make dev (for dev)\n# make prod (for prod)\nRUN cd /var/webModules && make dev\n# make version to update the version number from .git commit\nRUN cd /var/webModules && ./mkversion.sh\n\n#######\n#\n# --- oc.nginx image start here ---\n#\nFROM abcdesktopio/oc.nginx:3.2\n# COPY updated files from builder container to oc.nginx\nCOPY --from=builder var/webModules /var/webModules\nRUN cat /var/webModules/index.html\n
"},{"location":"common/3.0/update_frontend_image/#docker-build","title":"Docker build","text":"

Run the docker build command to build the new oc.nginx:acme image

docker build -t oc.nginx:acme .\n
# docker build -t oc.nginx:acme .\nSending build context to Docker daemon  21.88MB\nStep 1/8 : FROM abcdesktopio/oc.nginx:builder as builder\nbuilder: Pulling from abcdesktopio/oc.nginx\neaead16dc43b: Pull complete \n2b469c68b643: Pull complete \n5cee1fa1576f: Pull complete \n359c5b0dcf0a: Pull complete \nDigest: sha256:b9b2c232a885405df39e146d7ac02f3da034a5addc78c00faca59e2d8934ec5b\nStatus: Downloaded newer image for abcdesktopio/oc.nginx:builder\n ---> ef7e71c277b9\nStep 2/8 : COPY --from=abcdesktopio/oc.nginx:3.2 var/webModules /var/webModules\n3.0: Pulling from abcdesktopio/oc.nginx\neaead16dc43b: Already exists \nd78e49ae48aa: Pull complete \n5a1b3cde12da: Pull complete \nd46852e47788: Pull complete \n301ba448a167: Pull complete \ne352a410ea9e: Pull complete \n6478c15f8c14: Pull complete \n52697000c467: Pull complete \n4f346a00bc16: Pull complete \n9d4bc434c5bb: Pull complete \nDigest: sha256:d8692b633b221654899d8dbe7987330f878364d7288ec5628f7aa47152ce4ea6\nStatus: Downloaded newer image for abcdesktopio/oc.nginx:3.2\n\n ---> c5a084901830\nStep 3/8 : COPY ui.json /var/webModules/transpile/config/\n ---> cbb23fb8634e\nStep 4/8 : RUN cd /var/webModules && make prod\n ---> Running in 976ee31ac5db\ncreate html page /var/webModules/demo.html\ncreate html page /var/webModules/index.session.mustache.html\ncreate html page /var/webModules/app.html\ncreate html page /var/webModules/app.session.mustache.html\ncreate html page /var/webModules/index.html\ncreate html page /var/webModules/description.html\nApply userInterface conf: 1.355s\nTransform and copy js files:\nBuild svg: 2.034s\nBuild css: 2.041s\n[...]\nTotal duration copy and transform: 10.430s\nWriting /var/webModules/app.js\nWriting /var/webModules/index.html: 0.975ms\nWriting /var/webModules/app.html: 0.855ms\nWriting /var/webModules/index.session.mustache.html: 0.781ms\nBuild app.js file: 11.362s\nremove out dir base /var/webModules/build: 9.129ms\nTotal duration: 12.752s\nRemoving intermediate container 976ee31ac5db\n ---> 784902ce50c1\nStep 5/8 : FROM abcdesktopio/oc.nginx:3.2\n ---> c77f6c5ca8a1\nStep 6/8 : COPY --from=builder var/webModules /var/webModules\n ---> 68474a5ee2d5\nStep 7/8 : RUN cat /var/webModules/index.html\n ---> Running in ddb958078b50\n [...]\nRemoving intermediate container ddb958078b50\n ---> f02e3c57ec7e\nStep 8/8 : LABEL name=\"frontend acmedesktop base image\"       maintainer=\"acmedesktop\"       version=\"3.0\"\n ---> Running in da5363dcf434\nRemoving intermediate container da5363dcf434\n ---> b5449d85393f\nSuccessfully built b5449d85393f\nSuccessfully tagged oc.nginx:acme\n

Run the docker images command to read the new oc.nginx image

docker images \n\nREPOSITORY              TAG       IMAGE ID       CREATED         SIZE\noc.nginx                acme      b5449d85393f   2 minutes ago   685MB\n
"},{"location":"common/3.0/update_frontend_image/#save-the-container-image-to-a-file","title":"Save the container image to a file","text":"
docker image save oc.nginx:acme -o oc.nginx.acme\n
"},{"location":"common/3.0/update_frontend_image/#import-the-file-ocnginxacme-in-k8sio-namespace-for-containerd","title":"Import the file oc.nginx.acme in k8s.io namespace for containerd","text":"

The oc.nginx.acme not is listed in the k8s.io namespace.

Run the ctr command line to import oc.nginx.acme

ctr -n k8s.io images import oc.nginx.acme \nunpacking docker.io/library/oc.nginx:acme (sha256:5c3debc775894d079fa61be7f8217be0ecc7b2e7c47f0318bc1c94921c278e14)...done\n

Check that your new image is listed

ctr -n k8s.io images ls |grep oc.nginx:acme\ndocker.io/library/oc.nginx:acme                                                                                                  application/vnd.docker.distribution.manifest.v2+json      sha256:5c3debc775894d079fa61be7f8217be0ecc7b2e7c47f0318bc1c94921c278e14 384.9 MiB linux/amd64                                                                                                                        io.cri-containerd.image=managed \n
"},{"location":"common/3.0/update_frontend_image/#update-abcdesktopyaml-file","title":"Update abcdesktop.yaml` file","text":"

Update your own abcdesktop.yaml file to replace the default image abcdesktopio/oc.nginx:3.0 by the new container image oc.nginx:acme name.

 containers:\n      - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:3.2\n

Replace :

 containers:\n      - name: nginx\n        image: oc.nginx:acme\n

Apply the new abcdesktop.yaml file

kubectl apply -f abcdesktop.yaml \n

The deployment.apps/nginx-od is configured

clusterrole.rbac.authorization.k8s.io/pyos-role unchanged\nclusterrolebinding.rbac.authorization.k8s.io/pyos-rbac unchanged\nserviceaccount/pyos-serviceaccount unchanged\nstorageclass.storage.k8s.io/storage-local-abcdesktop unchanged\nconfigmap/nginx-config unchanged\ndeployment.apps/memcached-od unchanged\nsecret/mongodb-secret configured\ndeployment.apps/mongodb-od unchanged\ndeployment.apps/nginx-od configured\ndeployment.apps/speedtest-od unchanged\ndeployment.apps/nginx-od configured\nendpoints/desktop unchanged\nservice/desktop unchanged\nservice/memcached unchanged\nservice/mongodb unchanged\nservice/speedtest unchanged\nservice/nginx unchanged\nservice/pyos unchanged\ndeployment.apps/openldap-od unchanged\nservice/openldap unchanged\n

Start you web browser. You can read the new project name at the home page. After login you get the new color.

You have updated the html web page for abcdesktop release 3.X

"},{"location":"core/memcached/","title":"Memcached","text":"

The memcached container comes from the public docker registry. This service is attend to the netback network.

memcached store pods and containers message during the create process.

"},{"location":"core/memcached/#create-desktop","title":"create desktop","text":""},{"location":"core/memcached/#create-desktop-message","title":"create desktop message","text":"

Messages stored into memcache

status user message OK 'Looking for your desktop' OK 'Looking for your desktop done' OK 'Building desktop' OK 'Starting network services, it will take a while...' OK 'Network services started.' OK 'Starting desktop graphical service %ds / %d' % (nCount,nCountMax) OK 'Starting desktop spawner service %ds / %d' % (nCount,nCountMax) OK 'Desktop services are ready after %d s' Error 'createDesktop error - myOrchestrator.createDesktop %s'"},{"location":"core/mongodb/","title":"Mongodb","text":"

Mongodb is an open-source document database that provides high performance, high availability, and automatic scaling.

The mongodb container comes from the public docker registry. This service is attend to the netback network.

"},{"location":"core/mongodb/#collections","title":"Collections","text":"

abcdesktop.io uses the colections mongodb to store

"},{"location":"core/mongodb/#dock-state","title":"dock state","text":"
[ \n    \"keyboard\",\n    \"frontendjs.filemanager\",\n    \"Mail.Thunderbird\",\n    \"libreoffice.libreoffice-calc\",\n    \"libreoffice.libreoffice-writer\",\n    \"Navigator.Firefox\",\n    \"gimp.Gimp\",\n    \"gnome-terminal.Gnome-terminal\"\n]\n
"},{"location":"core/mongodb/#loginhistory","title":"loginHistory","text":"

The object's format is :

{\n \"picture\":\"https://scontent.xx.fbcdn.net/v/t1.0-1/p480x480/1452008_10202217750222019_1258804247_n.jpg?oh=a96b2290e63e1e81525ede1a5b073853&oe=59184A75\",\n \"sub\":\"10208942501856324\",\n \"ipaddr\":\"181.125.208.3, 10.255.0.3\",\n \"provider\":\"facebook\",\n \"date\":\"2017-01-12 11:19:57.946554\",\n \"useragent\":\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36\",\n \"_id\":\"5877665d0790160b0d59efd0\",\n \"name\":\"Alexandre Devely\"}\n
"},{"location":"core/mongodb/#method","title":"method","text":"

The method getCollection, is a ligth way to get a collection on the fron-end side.

For exemple this method is use by whoami.js to obtain the login's history using the key 'loginHistory'.

 getCollection('loginHistory', function(msg) {\n            if (msg.status === 200) {\n                var history = msg.result;\n                loginHistory = history;\n                buildHtmlTable(history);\n            }\n        })\n
"},{"location":"core/nginx/","title":"Nginx oc.nginx","text":"

Nginx is used as a reverse proxy server for HTTP, HTTPS protocols, as well as a load balancer, HTTP cache, and a web server (origin server).

"},{"location":"core/nginx/#nginx-routing","title":"Nginx routing","text":""},{"location":"core/nginx/#nginx-configuration","title":"Nginx Configuration","text":""},{"location":"core/nginx/#web-site","title":"web site","text":"

The static files (html, css, js) are stored in the local /var/webModules directory.

"},{"location":"core/nginx/#main-reverse-proxy","title":"main reverse proxy","text":""},{"location":"core/nginx/#lua-scripts","title":"LUA scripts","text":"

The /etc/nginx/get.targetmap.lua read the jwt_token and return the ip address or the pod's fqdn, using the jwt_desktop_signing_public_key and the jwt_desktop_payload_private_key

It uses a targetmap (dict) as first cache level.

lua_shared_dict targetmap 1m;\n

Read the lua script get.targetmap.lua to get details jwt token data and payload encryption.

"},{"location":"core/ocuser/","title":"The POD User","text":"

After the login process, if no associated pod is all ready running, a new user pod is started. This pod starts at least a container with the graphical image.

"},{"location":"core/ocuser/#inside-the-pod-user","title":"Inside the POD User","text":"

The pod user runs by default a container with the graphical image : the oc.user.18.04.

A pod can also runs sound container image, and a printer container. These options are defined in the od.config configuration file [ section desktop.soundimage and desktop.printerimage].

"},{"location":"core/ocuser/#processes-running-inside-the-user-container","title":"Processes running inside the user container","text":"

All processes are running as the user named balloon, because none of theme need to run as root.

The userid and the guid are 4096.

"},{"location":"core/ocuser/#supervisord","title":"Supervisord","text":"

Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems. All process running inside the user container, are started by supervisord.

/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf\n

Supervisor is the parent of all running process

docker-entrypoi---supervisord-+-Xvnc\n                              |-node---10*[{node}]\n                              |-4*[nodejs---10*[{nodejs}]]\n                              |-nodejs---6*[{nodejs}]\n                              |-nodejs-+-bash---pstree\n                              |        `-11*[{nodejs}]\n                              |-openbox\n                              `-xsettingsd\n
"},{"location":"core/ocuser/#tigervnc-xvnc","title":"TigerVNC Xvnc","text":"

TigerVNC is a high-performance, platform-neutral implementation of VNC (Virtual Network Computing), a client/server application that allows users to launch and interact with graphical applications on remote machines. TigerVNC provides the levels of performance necessary to run 3D and video applications, and it attempts to maintain a common look and feel and re-use components, where possible, across the various platforms that it supports. TigerVNC also provides extensions for advanced authentication methods and TLS encryption.

Starts parameters

command=Xvnc :0 -geometry 3840x2160 -SendPrimary=0 -depth 24 -rfbunixpath /tmp/.x11vnc -pn -rfbauth /composer/run/.vnc/passwd```\n

The default DISPLAY is :0. Xvnc listen on unix socket file /tmp/.x11vnc.

"},{"location":"core/ocuser/#openbox","title":"Openbox","text":"

Openbox is the window manager, it supports extensive standards support.

Openbox is patched with few line to send SIG_USR1 and SIG_USR2 messages to internal spawner service. This patch is only required to send message (Create/Close) to the abcdesktop.io web front.

This patch add notification when X11/window change :

The notify patch send signals SIGUSR1 and SIGUSR2 to a process (pid)

#define SIG_MANAGED_WINDOW   SIGUSR1\n#define SIG_UNMANAGED_WINDOW SIGUSR2\n

Openbox is started by supervisord using the command :

command=/usr/bin/openbox --sm-disable --config-file /etc/X11/openbox/rc.xml --startup /composer/openbox/autostart.sh\n
"},{"location":"core/ocuser/#ws-tcp-bridge","title":"ws-tcp-bridge","text":"

ws-tcp-bridge A websocket to tcp proxy server, using nodejs which bridges websockets and tcp servers in either direction.

ws-tcp-bridge is started by supervisord using the command :

/composer/node/ws-tcp-bridge/ws-tcp-bridge --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc\n
"},{"location":"core/ocuser/#spawner-servicejs","title":"Spawner-service.js","text":"

spawner-service.js is a daemon written in nodejs, this daemon listen for messages on the tcp port 8001. spawner-service offers methods to interact with the container and the X11 server :

spawner-service.js is started by supervisord using the command :

command=nodejs /composer/node/spawner-service/spawner-service.js\n
"},{"location":"core/ocuser/#printer-servicejs","title":"Printer-service.js","text":"

Printer-service.js waits for a file in /home/balloon/.printer-queue directory. Printer-service.js use broadcastevent to notify the web browser to download new files to print. Printer-service.js is started by supervisord using the command :

command=nodejs /composer/node/printer-service/printer-service.js\n
"},{"location":"core/ocuser/#broadcast-servicejs","title":"Broadcast-service.js","text":"

Broadcast-service.js allows to broadcast messages between all user sharing the same session.

Broadcast-service.js is started by supervisord using the command :

command=nodejs /composer/node/broadcast-service/broadcast-service.js\n
"},{"location":"core/ocuser/#file-servicejs","title":"File-service.js","text":"

File-service.js is a upload/download service to tranfert files between the browser and the user home directory. File-service.js supports the HTTP method POST to uploadFile and GET to respond data file. File-service.js is used for printer-service.js to download PDF printed files. File-service.js use the tcp port 8080.

http.createServer(function(req, res) {\n  if (req.method === 'POST') {\n    uploadFile( req, res );\n  } \n  else if (req.method === 'GET') {\n        respondFile( req, res );\n  }\n}).listen(8080, function() {\n  console.log('Listening for requests');\n});\n

File-service.js is started by supervisord using the command :

command=nodejs /composer/node/file-service/file-service.js\n
"},{"location":"core/ocuser/#pulseaudio","title":"Pulseaudio","text":"

PulseAudio is a sound system for POSIX, and is a proxy for sound applications. It allows you to do advanced operations on your sound data as it passes between applications. Pulseaudio is use as server to forward sound between X11 applications and the user browser. It supports also virtual local sound.

file etc/pulse/default.pa

load-module module-native-protocol-unix\nload-module module-always-sink\nload-module module-native-protocol-tcp\n

Pulseaudio is started by supervisord using the command :

command=/usr/bin/pulseaudio\n
"},{"location":"core/ocuser/#xsettingsd","title":"Xsettingsd","text":"

Xsettingsd is a daemon that implements the XSETTINGS specification. Xsettingsd is use to run GTK+ applications, to configure things such as themes, font antialiasing/hinting, and UI sound effects without we using the GNOME desktop environment. Xsettingsd set the default GTK theme and color pallette:

Net/ThemeName \"Numix-Flatstudio\"\nNet/IconThemeName \"Numix-Light\"\nGtk/ColorPalette \"black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90\"\n

Xsettingsd is started by supervisord using the command.

command=/usr/bin/xsettingsd -c /home/balloon/.xsettings\n
"},{"location":"core/ocuser/#build-the-user-container-image","title":"Build the user container image","text":"

The image oc.user.XX.YY is based from the oc.software.XX.YY witch came from oc.ubuntu.XX.YY. For example : * The image oc.user.18.04 is based from the oc.software.18.04 witch came from oc.ubuntu.18.04. * The image oc.user.20.04 is based from the oc.software.20.04 witch came from oc.ubuntu.20.04. * The image oc.user.21.04 is based from the oc.software.21.04 witch came from oc.ubuntu.21.04.

+-------------------+\n| oc.user.18.04     |       (abcdesktop.io custom software component)\n+---------+---------+\n          |\n+---------+---------+\n| oc.software.18.04 |       (abcdesktop.io ubuntu software component)\n+---------+---------+\n          |\n+---------+---------+\n| oc.ubuntu.18.04   |       (abcdesktop.io ubuntu service)\n+-------------------+\n          |\n+---------+---------+\n|   ubuntu:18.04    |   (official ubuntu images from dockerhub)\n+-------------------+\n

To build the image oc.user container from scratch, you need to build there 3 images. Build oc.ubuntu.18.04 first, next oc.software.18.04, and finish by oc.user.18.04. This is done by the Makefile command.

docker build -t oc.ubuntu.18.04 -f oc.ubuntu.18.04 .\ndocker build -t oc.software.18.04 -f oc.software.18.04 .\ndocker build -t oc.user.18.04   -f oc.user.18.04 .\n

To do it automaticly, clone composer/dockerbuild and run the Makefile

git clone https://github.com/abcdesktopio/oc.user.git \nmake\n
"},{"location":"core/ocuser/#dockerfile-ocubuntuxxyy","title":"Dockerfile oc.ubuntu.XX.YY.","text":"

oc.ubuntu.XX.YY is a Dockerfile, it starts 'FROM ubuntu:XX.YY' and installs core services and libs:

"},{"location":"core/ocuser/#dockerfile-ocsoftwarexxyy","title":"Dockerfile oc.software.XX.YY","text":"

oc.software.XX.YY is a Dockerfile, it starts 'FROM oc.ubuntu.XX.YY' and installs software components:

"},{"location":"core/ocuser/#dockerfile-ocuserxxyy","title":"Dockerfile oc.user.XX.YY","text":"

oc.user.XX.YY is a Dockerfile, it starts 'FROM oc.software.XX.YY' and installs user software components:

"},{"location":"core/ocuser/#install-nodejs-dev","title":"Install nodejs dev","text":"
# Add nodejs service\nRUN cd /composer/node/broadcast-service && npm install  \nRUN cd /composer/node/file-service      && npm install\nRUN cd /composer/node/printer-service   && npm install\nRUN cd /composer/node/spawner-service   && npm install  \\\nRUN cd /composer/node/spawner-service/node_modules/geoip-lite && npm run-script updatedb\nRUN cd /composer/node/angular-filemanager-nodejs-bridge && npm install \nRUN cd /composer/node/livesound-service && npm install\n
"},{"location":"core/ocuser/#create-the-balloon-user","title":"Create the balloon user","text":"
RUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"core/ocuser/#change-default-permission-to-run-cupsd","title":"Change default permission to run cupsd","text":"
# change acces right for printer support\nRUN addgroup $BUSER lpadmin\nRUN mkdir /var/run/cups \nRUN     chown -R $BUSER:$BUSER /var/spool/cups            && \\\n        chown -R $BUSER:$BUSER /var/spool/cups-pdf      && \\\n        chown -R $BUSER:$BUSER /var/log/cups                && \\\n        chown -R $BUSER:$BUSER /var/cache/cups          && \\\n        chown -R $BUSER:$BUSER /etc/cups/printers.conf  && \\\n        chown -R $BUSER:$BUSER /var/run/cups/\n
"},{"location":"core/ocuser/#set-the-exposed-tcp-port","title":"Set the exposed tcp port","text":"

Datas to these tcp ports are routed by nginx

PULSEAUDIO_HTTP_PORT                4714\nWS_TCP_BRIDGE_SERVICE_TCP_PORT      6081\nRESERVED_FOR_NEXT_VERSION           29780\nXTERM_TCP_PORT                      29781\nFILE_SERVICE_TCP_PORT               29783\nBROADCAST_SERVICE_TCP_PORT          29784\nRESERVED FOR CUPSD                  29785\nSPAWNER_SERVICE_TCP_PORT            29786\n
"},{"location":"core/pyos/","title":"pyos","text":"

oc.pyos is the application server for abcdesktop.io. oc.pyos is the abcdesktop control plane that configures and shuts down user desktops. This repository oc.pyos is the container of pyos. os.py is python script based on cherrypy framework and listen tcp port 8000. os.py daemon waits for json request from the javascript web client scripts, and implements methods :

"},{"location":"core/speedtest/","title":"SpeedTest","text":"

The speedtest container comes from the public docker registry.

"},{"location":"core/speedtest/#libretest-speedtest","title":"LibreTest SpeedTest","text":"

LibreSpeed/SpeedTest is a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers. LibreSpeed/SpeedTest works with no Flash, no Java, no Websocket.

"},{"location":"services/file-service/","title":"File service v1.0.0","text":""},{"location":"services/file-service/#file-service","title":"File service v1.0.0","text":"

Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

A sample API

Base URLs:

"},{"location":"services/file-service/#file-service-default","title":"Default","text":""},{"location":"services/file-service/#get__","title":"get__","text":"

GET /

Get file from the home directory

Example responses

403 Response

"},{"location":"services/file-service/#get__-responses","title":"Responses","text":"Status Meaning Description Schema 403 Forbidden none Inline 404 Not Found none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#get__-responseschema","title":"Response Schema","text":"

Status Code 403

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 404

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 500

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data any false none none This operation does not require authentication"},{"location":"services/file-service/#post__","title":"post__","text":"

POST /

Upload a file at a given path

Body parameter

Example responses

200 Response

"},{"location":"services/file-service/#post__-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 403 Forbidden none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#post__-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 403

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 500

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/file-service/#delete__","title":"delete__","text":"

DELETE /

Remove a given file wich is present in home directory

Body parameter

{\n  \"myFilename\": \"string\"\n}\n
"},{"location":"services/file-service/#delete__-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb myFilename body string true none

Example responses

200 Response

"},{"location":"services/file-service/#delete__-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 400 Bad Request none Inline 403 Forbidden none Inline 404 Not Found none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#delete__-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 400

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 403

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 404

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 500

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data strin false none none This operation does not require authentication"},{"location":"services/file-service/#get__directory_list","title":"get__directory_list","text":"

GET /directory/list

List files in a given directory

"},{"location":"services/file-service/#get__directory_list-parameters","title":"Parameters","text":"Name In Type Required Description directoryName query string true none"},{"location":"services/file-service/#get__directory_list-responses","title":"Responses","text":"Status Meaning Description Schema default Default Default response None This operation does not require authentication"},{"location":"services/spawner-service/","title":"Spawner service v1.0.0","text":""},{"location":"services/spawner-service/#spawner-service","title":"Spawner service v1.0.0","text":"

Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

A sample API

Base URLs:

"},{"location":"services/spawner-service/#spawner-service-default","title":"Default","text":""},{"location":"services/spawner-service/#get__version","title":"get__version","text":"

GET /version

Get User container version

Example responses

200 Response

{\n  \"date\": null,\n  \"commit\": \"string\",\n  \"version\": \"string\"\n}\n
"},{"location":"services/spawner-service/#get__version-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__version-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb date Date false none none \u00bb commit string false none none \u00bb version string false none none

Status Code 404

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__launch","title":"post__launch","text":"

POST /launch

Used to run builtin application process

Body parameter

{\n  \"command\": \"string\",\n  \"args\": [\n    \"string\"\n  ]\n}\n
"},{"location":"services/spawner-service/#post__launch-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb command body string true none \u00bb args body [string] false none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": {}\n}\n
"},{"location":"services/spawner-service/#post__launch-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none launch 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setaudioquality","title":"post__setAudioQuality","text":"

POST /setAudioQuality

Set the audio quality

Body parameter

{\n  \"sink\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setaudioquality-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb sink body string true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": {}\n}\n
"},{"location":"services/spawner-service/#post__setaudioquality-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none processResult 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__playaudiosample","title":"post__playAudioSample","text":"

POST /playAudioSample

Play a sample audio

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": {}\n}\n
"},{"location":"services/spawner-service/#post__playaudiosample-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none processResult 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#put__configurepulse","title":"put__configurePulse","text":"

PUT /configurePulse

Configure pulse audio for Janus

Body parameter

{\n  \"destinationIp\": \"string\",\n  \"port\": \"string\"\n}\n
"},{"location":"services/spawner-service/#put__configurepulse-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb destinationIp body string true none \u00bb port body string true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#put__configurepulse-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__broadcastwindowslist","title":"post__broadcastwindowslist","text":"

POST /broadcastwindowslist

Emit a broadcast with window list as data

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__broadcastwindowslist-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__clipboardsync","title":"post__clipboardsync","text":"

POST /clipboardsync

Synchronize X11 and gtk clipboard

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__clipboardsync-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setdesktop","title":"post__setDesktop","text":"

POST /setDesktop

Store a data as json file in desktop

Body parameter

{\n  \"key\": \"string\",\n  \"value\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setdesktop-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb key body string true none \u00bb value body string true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setdesktop-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__getdesktop","title":"get__getDesktop","text":"

GET /getDesktop

Get a data stored as json file

"},{"location":"services/spawner-service/#get__getdesktop-parameters","title":"Parameters","text":"Name In Type Required Description key query string true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": {}\n}\n
"},{"location":"services/spawner-service/#get__getdesktop-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getdesktop-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data object false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getmimeforfile","title":"get__getmimeforfile","text":"

GET /getmimeforfile

Get a mime for a given filename

"},{"location":"services/spawner-service/#get__getmimeforfile-parameters","title":"Parameters","text":"Name In Type Required Description filename query string true none

Example responses

200 Response

{\n  \"data\": {}\n}\n
"},{"location":"services/spawner-service/#get__getmimeforfile-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none MIME 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__filesearch","title":"get__filesearch","text":"

GET /filesearch

Used for list files by dock

"},{"location":"services/spawner-service/#get__filesearch-parameters","title":"Parameters","text":"Name In Type Required Description maxfile query integer false none keywords query string true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": [\n    {\n      \"file\": \"string\",\n      \"mime\": \"string\"\n    }\n  ]\n}\n
"},{"location":"services/spawner-service/#get__filesearch-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__filesearch-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [object] false none none \u00bb\u00bb file string false none none \u00bb\u00bb mime string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__generatedesktopfiles","title":"post__generateDesktopFiles","text":"

POST /generateDesktopFiles

Build desktop files to run containerized applications

Body parameter

{\n  \"list\": [\n    {\n      \"mimetype\": \"string\",\n      \"path\": \"string\",\n      \"executablefilename\": \"string\",\n      \"icon\": \"string\",\n      \"name\": \"string\",\n      \"launch\": \"string\"\n    }\n  ]\n}\n
"},{"location":"services/spawner-service/#post__generatedesktopfiles-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb list body [object] true none \u00bb\u00bb mimetype body string false none \u00bb\u00bb path body string false none \u00bb\u00bb executablefilename body string false none \u00bb\u00bb icon body string false none \u00bb\u00bb name body string false none \u00bb\u00bb launch body string false none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__generatedesktopfiles-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__getappforfile","title":"get__getappforfile","text":"

GET /getappforfile

Allow to get the app necessary

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": [\n    {\n      \"command\": \"string\",\n      \"args\": \"string\"\n    }\n  ]\n}\n
"},{"location":"services/spawner-service/#get__getappforfile-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none AppForFile 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__about","title":"get__about","text":"

GET /about

Get system informations

Example responses

200 Response

{\n  \"hostname\": \"string\",\n  \"ipaddr\": \"string\",\n  \"plateform\": \"string\",\n  \"arch\": \"string\",\n  \"release\": \"string\",\n  \"cpu\": \"string\",\n  \"clientipaddr\": \"string\",\n  \"country\": \"string\",\n  \"language\": \"string\",\n  \"build\": \"string\",\n  \"POD_NAMESPACE\": \"string\",\n  \"POD_NAME\": \"string\",\n  \"NODE_NAME\": \"string\",\n  \"POD_IP\": \"string\",\n  \"KUBERNETES_SERVICE_HOST\": \"string\"\n}\n
"},{"location":"services/spawner-service/#get__about-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__about-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb hostname string false none none \u00bb ipaddr string false none none \u00bb plateform string false none none \u00bb arch string false none none \u00bb release string false none none \u00bb cpu string false none none \u00bb clientipaddr string false none none \u00bb country string false none none \u00bb language string false none none \u00bb build string false none none \u00bb POD_NAMESPACE string false none none \u00bb POD_NAME string false none none \u00bb NODE_NAME string false none none \u00bb POD_IP string false none none \u00bb KUBERNETES_SERVICE_HOST string false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getsettings","title":"get__getSettings","text":"

GET /getSettings

Get configuration for settings window

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": [\n    {\n      \"tab\": \"string\",\n      \"enabled\": true\n    }\n  ]\n}\n
"},{"location":"services/spawner-service/#get__getsettings-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getsettings-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [any] false none none \u00bb\u00bb tab string false none none \u00bb\u00bb enabled boolean false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__setbackgroundcolor","title":"post__setBackgroundColor","text":"

POST /setBackgroundColor

Change the background color

Body parameter

{\n  \"color\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundcolor-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb color body string true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundcolor-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setbackgroundimage","title":"post__setBackgroundImage","text":"

POST /setBackgroundImage

Set the background image

Body parameter

{\n  \"imgName\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundimage-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb imgName body string true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": {\n    \"color\": \"string\",\n    \"subData\": {\n      \"code\": 0,\n      \"data\": \"string\"\n    }\n  }\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundimage-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#post__setbackgroundimage-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data object false none none \u00bb\u00bb color string false none none \u00bb\u00bb subData Success false none All operations completed with success \u00bb\u00bb\u00bb code integer false none none \u00bb\u00bb\u00bb data string false none none

Status Code 404

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__setdefaultimage","title":"post__setDefaultImage","text":"

POST /setDefaultImage

Set the default image as background

Example responses

200 Response

"},{"location":"services/spawner-service/#post__setdefaultimage-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#post__setdefaultimage-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 404

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getwindowslist","title":"get__getwindowslist","text":"

GET /getwindowslist

Get window list

Example responses

200 Response

"},{"location":"services/spawner-service/#get__getwindowslist-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getwindowslist-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [any] false none none \u00bb\u00bb id integer false none none \u00bb\u00bb pid integer false none none \u00bb\u00bb wm_class string false none none \u00bb\u00bb title string false none none \u00bb\u00bb machine_name string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__activatewindows","title":"post__activatewindows","text":"

POST /activatewindows

Activate windows

Body parameter

{\n  \"windowsid\": [\n    0\n  ]\n}\n
"},{"location":"services/spawner-service/#post__activatewindows-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb windowsid body [integer] true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__activatewindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__closewindows","title":"post__closewindows","text":"

POST /closewindows

Close windows

Body parameter

{\n  \"windowsid\": [\n    0\n  ]\n}\n
"},{"location":"services/spawner-service/#post__closewindows-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb windowsid body [integer] true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__closewindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__placeallwindows","title":"post__placeAllWindows","text":"

POST /placeAllWindows

Place and resize all windows

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__placeallwindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#schemas","title":"Schemas","text":""},{"location":"services/spawner-service/#tocS_InternalError","title":"InternalError","text":"
{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n\n
"},{"location":"services/spawner-service/#properties","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data string false none none"},{"location":"services/spawner-service/#tocS_Success","title":"Success","text":"
{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n\n

All operations completed with success

"},{"location":"services/spawner-service/#properties_1","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data string false none none"},{"location":"services/spawner-service/#tocS_processResult","title":"processResult","text":"
{\n  \"code\": 0,\n  \"data\": {}\n}\n\n
"},{"location":"services/spawner-service/#properties_2","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data object false none none"},{"location":"services/spawner-service/#tocS_launch","title":"launch","text":"
{\n  \"code\": 0,\n  \"data\": {}\n}\n\n
"},{"location":"services/spawner-service/#properties_3","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data object false none none"},{"location":"services/spawner-service/#tocS_MIME","title":"MIME","text":"
{\n  \"data\": {}\n}\n\n
"},{"location":"services/spawner-service/#properties_4","title":"Properties","text":"Name Type Required Restrictions Description data object false none none"},{"location":"services/spawner-service/#tocS_AppForFile","title":"AppForFile","text":"
{\n  \"code\": 0,\n  \"data\": [\n    {\n      \"command\": \"string\",\n      \"args\": \"string\"\n    }\n  ]\n}\n\n
"},{"location":"services/spawner-service/#properties_5","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data [object] false none none \u00bb command string false none none \u00bb args string false none none"},{"location":"setup/kubernetes_flexvolume/","title":"CIFS Flexvolume Plugin for Kubernetes","text":"

Driver for CIFS (SMB, Samba, Windows Share) network filesystems as Kubernetes volumes.

abcdesktop team is not the authors of the CIFS Flexvolume Plugin for kubernetes. This file is an update from the original source file https://raw.githubusercontent.com/fstab/cifs/. The original source code is https://github.com/fstab/cifs The author is Fabian St\u00e4ber. The update is part for abcdesktop.io

This article is just an update from Fabian St\u00e4ber work.

"},{"location":"setup/kubernetes_flexvolume/#background","title":"Background","text":"

Docker containers running in Kubernetes have an ephemeral file system: Once a container is terminated, all files are gone. In order to store persistent data in Kubernetes, you need to mount a Persistent Volume into your container. Kubernetes has built-in support for network filesystems found in the most common cloud providers, like Amazon's EBS, Microsoft's Azure disk, etc. However, some cloud hosting services, like the Hetzner cloud, provide network storage using the CIFS (SMB, Samba, Windows Share) protocol, which is not natively supported in Kubernetes.

Fortunately, Kubernetes provides Flexvolume, which is a plugin mechanism enabling users to write their own drivers. There are a few flexvolume drivers for CIFS out there, but for different reasons none of them seemed to work for me. So Fabian St\u00e4ber wrote this driver.

"},{"location":"setup/kubernetes_flexvolume/#installing","title":"Installing","text":"

The flexvolume plugin is a single shell script named cifs. This shell script must be available on the Kubernetes master and on each of the Kubernetes nodes. By default, Kubernetes searches for third party volume plugins in /usr/libexec/kubernetes/kubelet-plugins/volume/exec/.

The plugin directory can be configured with the kubelet's --volume-plugin-dir parameter, run ps aux | grep kubelet to learn the location of the plugin directory on your system (see [#1][9]). The cifs script must be located in a subdirectory named abcdesktop~cifs/. The directory name abcdesktop~cifs/ will be mapped to the Flexvolume driver name abcdesktop/cifs.

On the Kubernetes master and on each Kubernetes node run the following commands:

VOLUME_PLUGIN_DIR=\"/usr/libexec/kubernetes/kubelet-plugins/volume/exec\"\nmkdir -p \"$VOLUME_PLUGIN_DIR/abcdesktop~cifs\"\ncd \"$VOLUME_PLUGIN_DIR/abcdesktop~cifs\"\ncurl -L -O https://raw.githubusercontent.com/abcdesktop/cifs/main/cifs\nchmod 755 cifs\n

The cifs script requires a few executables to be available on each host system:

apt-get install cifs-utils jq util-linux coreutils\n\n

To check if the installation was successful, run the following command:

VOLUME_PLUGIN_DIR=\"/usr/libexec/kubernetes/kubelet-plugins/volume/exec\"\n$VOLUME_PLUGIN_DIR/abcdestkop~cifs/cifs init\n\n

It should output a JSON string containing \"status\": \"Success\". This command is also run by Kubernetes itself when the cifs plugin is detected on the file system.

"},{"location":"setup/kubernetes_flexvolume/#update-your-odconfig-file","title":"Update your od.config file","text":"

In this example, we use a Microsoft Active Directory as a LDAP Server.

CIFS is supported with kubernetes configuration, CIFS is not supported in docker non-cluster mode

Add a new policy to add a label TAG during the user's authentification process.

\n# Add an explicit authmanagers\nauthmanagers: { \n    'explicit': {\n        'show_domains': True,\n        'default_domain': 'AD',\n        'providers': {\n          'AD': { \n            'config_ref': 'adconfig', \n            'enabled': True\n           }\n        }\n    }\n}\n\n\n# add the configuration reference for adconfig\nadconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                       'servers'       : [ '192.168.7.12' ],\n                       'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                       'policies'      : { 'acls': None,\n                                           'rules' : { 'rule-domainuser' : {\n                                                  'conditions' : [ { 'primarygroupid': '513', 'expected' : True  } ],\n                                                  'expected'   : True,\n                                                  'label'      : 'domainuser' } \n} } } } } } }\n\n

In this example :

Then in the same od.config file, add rules to the desktop object to match this label domainuser

desktop.policies: { 'rules': { 'volumes': { 'domainuser':  { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } } },\n                        'acls' : {} }\n\n

In this example :

"},{"location":"setup/kubernetes_flexvolume/#testing","title":"Testing","text":""},{"location":"setup/kubernetes_flexvolume/#apply-new-configuration-file","title":"Apply new configuration file","text":"
kubectl apply -f abcdesktop.yml\n

Open you abcdesktop website and fill the authentation form with your Microsoft Active Direcotry Service or Samba server credentials.

Run authentification on the Microsoft Active Direcotry Service or on your Samba server

Start the File Manager application. In this example, the homeDir is set to U:, the mount entry become the letter U.

Click on the homeDir to read the CIFS ressource data. In this example, the shared ressource //192.168.7.101/alex contains a file ```NAS-file.ods'

"},{"location":"setup/kubernetes_flexvolume/#troubleshooting","title":"Troubleshooting","text":"

Logs files are stored in host directory /var/log/abcdesktop/cifs

# ls -la /var/log/abcdesktop/cifs\ntotal 36\ndrwxr-xr-x 2 root root 4096 janv. 28 16:39 .\ndrwxr-xr-x 3 root root 4096 d\u00e9c.   1 12:00 ..\n-rw-r--r-- 1 root root  288 janv. 28 16:39 alex.log\n-rw-r--r-- 1 root root  832 janv. 28 16:39 cifs.log\n-rw-r--r-- 1 root root 1264 d\u00e9c.   1 14:25 error.alex.json\n-rw-r--r-- 1 root root  834 d\u00e9c.   1 14:25 error.alex.log\n-rw-r--r-- 1 root root   50 janv. 28 16:39 mount.counter\n-rw-r--r-- 1 root root   44 d\u00e9c.  22 12:20 umount.counter\n

Check the file sAMAccountName.log, cifs.log

If there is an error, look at the error.$sAMAccountName.json and error.$sAMAccountName.log

Example

-rw-r--r-- 1 root root 1264 d\u00e9c.   1 14:25 error.alex.json\n-rw-r--r-- 1 root root  834 d\u00e9c.   1 14:25 error.alex.log\n

Run mount command

mount

In this example :

# mount | grep 192.168.7.101\n//192.168.7.101/alex on /var/lib/kubelet/pods/b7530cc0-6903-458a-a133-d8a8450e3af4/volumes/abcdesktop~cifs/flexvol-cifs-homedir-alex type cifs (rw,relatime,vers=1.0,cache=strict,username=alex,uid=4096,forceuid,gid=4096,forcegid,addr=192.168.7.101,soft,unix,posixpaths,serverino,mapposix,acl,rsize=1048576,wsize=1048576,bsize=1048576,echo_interval=60,actimeo=1)\n

Check that the kubernetes secrets exist

kubectl get secrets -n abcdesktop\nNAME                                  TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload           Opaque                                2      65d\nabcdesktopjwtdesktopsigning           Opaque                                2      65d\nabcdesktopjwtusersigning              Opaque                                2      65d\nauth-cifs-alex-flexvol-cifs-homedir   abcdesktop/cifs                       4      10m\nauth-ldif-alex                        abcdesktop/ldif                       11     10m\n
"},{"location":"setup/kubernetes_networkpolicies/","title":"Setup Network policy","text":""},{"location":"setup/kubernetes_networkpolicies/#network-policy-group","title":"Network Policy group","text":"

File need to be written

"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"abcdesktop.io is a cloud native desktop service built on and for Kubernetes.","text":"

abcdesktop.io is a cloud native desktop service built on and for Kubernetes. abcdesktop.io is also a complete work environment accessible from a simple HTML 5 web browser, without any installation. Like serverless does, desktopless computing allocates desktop resources on demand. Each user\u2019s application runs as a container to reduce attack surface.

abcdeskop.io is an open source and free solution that offers seamless access to secure desktops and applications on any device, follow the https://github.com/abcdesktopio links.

This flexible working environment simplifies usage like

"},{"location":"#quick-online-preview","title":"Quick online preview","text":"

You can discover abcdesktop.io desktopless services on the demo website. https://demo.abcdesktop.io instance is a quick example to illustrate how the abcdesktop.io project works. Your desktopless is ready to run for 10 minutes, and will be terminated by the garbage collector after 10 minutes. It requires an OpenID Connect provider to sign-in like (Google, Facebook, Github). The security policy for Internet network prevents requests from your abcdesktop being allowed. Printer service (using cups) and sound service (using pulseaudio) inside the kubernetes pods are enabled.

To reach the demo website, follow the link https://demo.abcdesktop.io

"},{"location":"#abcdesktopio-a-container-vdi-service","title":"abcdesktop.io:\u00a0a container VDI service","text":"

abcdesktop.io provides a way to run graphics software securely isolated in a container, and use a web browser HTML5 as display device. Because containers are lightweight and run without the extra load of an operating system, you can run many graphical applications on a single kernel or even on a kubernetes cluster.

"},{"location":"#quick-installation-for-kubernetes","title":"Quick installation for kubernetes","text":"

You can watch the youtube video sample. This video describes the Quick installation process.

Download and extract the latest release automatically (Linux or macOS) or read the step by step installation process abcdesktop for kubernetes

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh | sh -\n
"},{"location":"#adopters","title":"Adopters","text":"

Here are some of the organizations we know are using abcdesktop.io. If you\u2019re using Abcdesktop and aren\u2019t on this list, please submit a pull request!

Adopters Name Description Public applications repository Embl The European Molecular Biology Laboratory is an intergovernmental organization dedicated to molecular biology research and is supported by 28 member states, one prospect state, and one associate member state https://git.embl.de/ysun/abcdesktop-apps/ Orange Telecommunications operator and digital service provider. Orange serves 287 million customers, individuals, professionals, and large companies Orange uses common public and private business applications"},{"location":"#features","title":"Features","text":""},{"location":"#applications","title":"Applications","text":""},{"location":"#supported-web-browser-html","title":"Supported web browser HTML","text":"

abcdesktop.io uses many modern web technologies. However these are the minimum versions we are currently aware of:

"},{"location":"#copy-and-paste-features","title":"Copy and Paste features","text":"

To fully use copy and paste features, from your local device to your abcdesktop (and vice versa), choose Chrome, Chromium or Microsoft Edge Chromium. The copy and paste feature is also supported on Firefox with a dedicated abcdesktop extension.

Web browser Clipboard sync Chrome Yes, built in support Chromium Yes, built in support Microsoft Edge Chromium Yes, built in support Firefox Yes, install the dedicated abcdesktop extension Safari No, the clipboard access is not allowed by the user agent or the platform in the current context, possibly because the user denied permission"},{"location":"#not-supported-web-browser","title":"Not supported web browser","text":"

abcdesktop.io does NOT support Microsoft Internet Explorer from version 1.x to 11.x. If you need a Microsoft web browser use Microsoft Edge. Edge is based on the Chromium open-source project. Chromium forms the basis of Google Chrome, so the new Edge feels very similar to Google Chrome.

"},{"location":"#release-history","title":"Release history","text":"Release Status Date Requirements Applications \u00a0Documentation 1.1 deprecated 09/15/2021 dockerd for personnal use and kubernetes An application is a docker container removed 2.9 deprecated 29/08/2022 require kubernetes < 1.24 and dockerd as container engine An application is a pod or a docker container removed 3.0 deprecated 09/03/2022 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container Release 3.1 stable 10/03/2023 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container, change PVC and PV support Release 3.2 stable 01/02/2024 kubernetes >= 1.24, all container engine An application is a pod or an ephemeral container, WebRTC sound support Release"},{"location":"#github-repositories","title":"Github repositories","text":"

abcdesktop has 42 repositories available. Follow the code on GitHub https://github.com/abcdesktopio to get the source code.

"},{"location":"adopters/","title":"Adopters","text":"

Here are some of the organizations we know are using abcdesktop.io.

Adopters Name Description Public applications repository Embl The European Molecular Biology Laboratory is an intergovernmental organization dedicated to molecular biology research and is supported by 28 member states, one prospect state, and one associate member state https://git.embl.de/ysun/abcdesktop-apps/ Orange Telecommunications operator and digital service provider. Orange serves 287 million customers, individuals, professionals, and large companies Orange uses common public and private business applications

If you\u2019re using Abcdesktop and aren\u2019t on this list, please submit a pull request to add entry in this list.

"},{"location":"applicationsformat/","title":"Application image format","text":"

abcdesktop.io uses OCI container image format and add some labels to describe the application. Labels add metadata to the container image.

"},{"location":"applicationsformat/#requirements","title":"Requirements","text":""},{"location":"applicationsformat/#labels","title":"Labels","text":"

Docker images applications for abcdesktop use docker's LABELS as metadata. To select only abcdesktop applications from standard docker images, all abcdesktop's applications must have a label 'oc.type' set to the value 'app'.

LABEL oc.type=app\n
"},{"location":"applicationsformat/#label-descriptions","title":"Label descriptions","text":"Label name Type Description Sample oc.icon string icon filename use by the web interface for the application, MUST suffix in .svg format writer.svg oc.icondata string icon file SVG data uuencoded PD94b...C9zdmc+Cg== oc.keyword string keywords use by the web application search engine separated by comma(,) firefox,mozilla,web,internet oc.desktopfile string .desktop gnome file name /usr/share/applications/firefox.desktop oc.cat string category use by the web application store, choose one value of the default list [ 'office', 'games', 'graphics', 'development', 'utilities', 'education' ] office oc.launch string X11 Windows Class name. It MUST be unique use the command 'wmctrl -lx' to can the right name oc.template string Template name to use FROM in the DockerFile oc.template.gtk.firefox oc.path string Path to the application binary /usr/bin/firefox oc.args string arguments added to the command --open oc.name string Name of the application Firefox oc.displayname string Display Name show by Web interface Firefox oc.type string Always set to the value 'app' app oc.mimetype string MimeType supported by the application separated by semicolon(;) text/html;text/xml;application/xml;application/rss+xml;video/webm oc.showinview string Set to the dock to add this app in dock dock oc.fileextensions string Supported extensions file, separated by semicolon(;) htm;html;xml;gif oc.legacyfileextensions string Legacy file extensions, separated by semicolon(;) htm;html;xml oc.host_config dict dictionary of resources (see resources details) { 'shm_size': '1g' }

Example for Firefox application

LABEL oc.icon=\"firefox.svg\"\nLABEL oc.keyword=\"firefox,mozilla,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.launch=\"Navigator.Firefox\"\nLABEL oc.template=\"oc.template.gtk.firefox\"\nLABEL oc.name=\"Firefox\"\nLABEL oc.displayname=\"Firefox\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\n
"},{"location":"applicationsformat/#host_config-resource-description","title":"host_config resource description","text":"

host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

For example you can set low cpu and memory values to an application like the great X11 xeyes.

{   \n    \"mem_limit\":  \"32M\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n

Read the dedicated chapter for resource description, to get more informations on host_config

"},{"location":"applicationsformat/#inspect-an-abcdesktop-docker-images","title":"Inspect an abcdesktop docker images","text":"

To download an abcdesktop docker image, run the command

docker pull abcdesktopio/firefox.d\n

To inspect the labels in the docker image, run docker inspect

docker inspect abcdesktopio/firefox.d:latest\n

Read the labels section :

\"Labels\": {\n                \"architecture\": \"x86_64\",\n                \"oc.cat\": \"office\",\n                \"oc.desktopfile\": \"firefox.desktop\",\n                \"oc.displayname\": \"Firefox\",\n                \"oc.fileextensions\": \"htm;html;xml;gif\",\n                \"oc.icon\": \"firefox.svg\",\n                \"oc.icondata\": \"PD94b.. CUT HERE ...C9zdmc+Cg==\",\n                \"oc.keyword\": \"firefox,mozilla,web,internet\",\n                \"oc.launch\": \"Navigator.Firefox\",\n                \"oc.legacyfileextensions\": \"htm;html;xml\",\n                \"oc.mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n                \"oc.name\": \"Firefox\",\n                \"oc.path\": \"/usr/bin/firefox\",\n                \"oc.showinview\": \"dock\",\n                \"oc.template\": \"oc.template.gtk.firefox\",\n                \"oc.type\": \"app\",\n                \"oc.usedefaultapplication\": \"true\",\n                \"release\": \"5\",\n                \"vcs-ref\": \"master\",\n                \"vcs-type\": \"git\",\n                \"version\": \"1.2\"\n }\n
"},{"location":"applicationsformat/#the-inheritance-of-the-images","title":"The inheritance of the images","text":"

All abcdesktop applications use by default the oc.template.gtk images name.

"},{"location":"applicationsformat/#the-inheritance-of-the-classes","title":"The inheritance of the classes.","text":"

By default, oc.templace.gtk is the main image for all applications. For example oc.template.gtk.firefox use the oc.template.gtk image. oc.template.gtk.firefox.acme use the oc.template.gtk.firefox.

+------------------------------+\n|oc.template.gtk.firefox.acme  |\n+---------------+--------------+\n                |\n                |\n+---------------+--------------+\n|oc.template.gtk.firefox       |\n+---------------+--------------+\n                |\n                |\n+---------------+--------------+\n|oc.template.gtk               |\n+---------------+--------------+\n
"},{"location":"architecture/","title":"Architecture in docker mode","text":""},{"location":"architecture/#abcdesktop-workflow-with-ldap-auth","title":"abcdesktop workflow (with LDAP Auth)","text":"
  1. User login, get a user JWT
  2. Create a user POD (or a container) and retrieve a Desktop JWT
  3. Run, the user is connected to his own POD (or container)

    • All JWT are signed with RSA keys.
    • All JWT payload are encrypted with RSA keys
"},{"location":"architecture/#services-infrastructure","title":"Services Infrastructure","text":"

The service infrastructure is based on :

The user creates a pod user

"},{"location":"architecture/#roles-summary","title":"Roles summary","text":""},{"location":"architecture/#pyos","title":"pyos","text":"

pyos is the core abcdesktop service act as a control plane. Pyos is a stateless services, Pyos's roles are :

When a new user is authenticated, a dedicated user container is created. When the user starts an application (like LibreOffice for example) a dedicated application container is created.

"},{"location":"architecture/#nginx","title":"nginx","text":"

nginx container act as web server and websocket reverse proxy.

"},{"location":"architecture/#mongo","title":"mongo","text":"

mongo is used by pyos to store user profil informations. The profil informations are :

"},{"location":"architecture/#memcached","title":"memcached","text":"

memcache stores progress text message information during login process. memcache datas are set and get only by the control plane.

"},{"location":"architecture/#ocuser","title":"oc.user","text":"

oc.user is the name of the user's container image. oc.user runs the X11 graphical service. oc.user is based on ubuntu distribution.

"},{"location":"architecture/#applications","title":"applications","text":"

All applications are containers or pods, and share a graphical socket with the user's container

"},{"location":"buildapplications.wine/","title":"Build abcdesktop docker image for Microsoft Windows using Wine","text":""},{"location":"buildapplications.wine/#requirements","title":"Requirements","text":"

abcdesktop can run Microsoft Windows applications using Wine.

"},{"location":"buildapplications.wine/#wine-embedded-in-octemplategtkwine-image","title":"wine embedded in oc.template.gtk.wine image","text":"

To run Windows applications abcdesktop use wine. A dedicated image template source is ready to use as source of others Windows applications. This template is named abcdesktopio/oc.template.gtk.wine.

Start pulling this template image, if you don't have already done in the previous exercice :

docker pull abcdesktopio/oc.template.gtk.wine\n

This image embeded the architecture format win32 win64. By default the WINEARCH is set to win32. The playonlinux package is all ready installed.

"},{"location":"buildapplications.wine/#change-the-odconfig-configuration-file","title":"Change the od.config configuration file","text":""},{"location":"buildapplications.wine/#the-homedirectorytype-option","title":"The homedirectorytype option","text":"

To share the home directory /home/balloonvolume data between containers, set the desktop.homedirectorytype to 'volume' in your od.config file.

Edit your own od.config file as described in the chapter Edit your configuration file in docker mode, and make sure that desktop.homedirectorytype is set to 'volume'

desktop.homedirectorytype: 'volume' \n

If need, run the docker-compose restart command in your abcdesktop directory where the od.config and the docker-compose.yml are located.

docker-compose restart\n
"},{"location":"buildapplications.wine/#build-a-new-windows-putty-inside-a-docker-container","title":"Build a new windows putty inside a docker container","text":"

In this exercice we are going to install and run putty.exe for Windows inside a docker container for abcdesktop.

PuTTY is an SSH and telnet client, developed originally by Simon Tatham for the Microsoft Windows platform.

Start an abcdesktop session. You can use an authenticated session using an authentication provider external or explicit, or you can do this exercice using Anonymous Authentification also know as the authentication provider implicit.

In this exercice we choose an Anonymous authentification, DO NOT CLOSE YOUR WEB BROWSER, you should not be able de reconnect with the same user context, and have to restart this exercice again.

Login using the Anonymous authentification provider.

Click on the menu and choose settings options

On the Settings dialog box, choose System option

Choose the User container tabs, and select the hostname value.

Copy this value into your clipboard. The hostname use the docker containerid value.

Keep your web browser open, and open a terminal shell on your server, to run docker shell commmand.

Run the docker inspect -f \"{{ .HostConfig.Binds }}\" and add your CONTAINER ID as parameter.

CONTAINER_ID=5719b77d3f2a\ndocker inspect -f \"{{ .HostConfig.Binds }}\" $CONTAINER_ID\n

where CONTAINER_ID is your own containerid value.

For example

docker inspect -f \"{{ .HostConfig.Binds }}\" 5719b77d3f2a\n

You should read the volume name starting by the prefix tmp- with your uuid value, and a second volume name starting by the prefix home- with your uuid:

[tmp-57be1e5b-0b14-4c05-ae79-75e9a03c77be:/tmp home-57be1e5b-0b14-4c05-ae79-75e9a03c77be:/home/balloon]\n

We are using the /tmp volume and the /home/balloon volume of your container.

If your are using an anonymous authentification, the name of your container id is formated as an uuid, for example a32deda7-324f-4ee4-9e51-51c1aaf66bcf. The name of the tmp volume is tmp-a32deda7-324f-4ee4-9e51-51c1aaf66bcf and the name of tmp volume is home-a32deda7-324f-4ee4-9e51-51c1aaf66bcf

If your are using an LDAP authentification, the name of your container id is a string equal to the username, for example hermes. The name of the tmp volume is tmp-hermes and the name of tmp volume is home-hermes.

Replace in the command the string TMP_VOLUMENAME by your own tmp volume name.

Replace in the command the string HOME_VOLUMENAME by your own home volume name.

docker run -it -v TMP_VOLUMENAME:/tmp  -v HOME_VOLUMENAME:/home/balloon --user balloon abcdesktopio/oc.template.gtk.wine bash\n

For example with an anonymous user:

docker run -it -v tmp-a32deda7-324f-4ee4-9e51-51c1aaf66bcf:/tmp -v home-a32deda7-324f-4ee4-9e51-51c1aaf66bcf:/home/balloon --user balloon abcdesktopio/oc.template.gtk.wine bash \n

Great, you have started a new docker container. The oc.user container and your new container is sharing the same volume mounted as /tmp. You get a prompt inside the new docker container.

To run a command as administrator (user \"root\"), use \"sudo <command>\".\nSee \"man sudo_root\" for details.\n\nballoon@721263d5dece:~$ \n

Init the wine directory

wineboot --init\n

After few seconds you should read on the standard error

0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0014:err:ole:get_local_server_stream Failed: 80004002\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0012:err:ole:get_local_server_stream Failed: 80004002\nCould not find Wine Gecko. HTML rendering will be disabled.\nCould not find Wine Gecko. HTML rendering will be disabled.\nwine: configuration in L\"/composer/.wine\" has been updated.\n

And now download putty.exe from the web site https://www.putty.org/.

In this example, we use the 64 bits binary format

balloon@8e48719ae72f:~$ wget https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\n

Start the putty.exe with wine, with the command wine putty.exe

balloon@5719b77d3f2a:~$ wine putty.exe\n

After few seconds you should read on the standard error

0009:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.\n

The wine prefix is WINEPREFIX=/composer/.wine, all files used by wine are stored in /composer/.wine directory.

On abcdesktop display, wine is starting the application putty, after few seconds, Putty is running :

You can use this Putty Windows application to connect to another host using ssh or telnet protocol.

The application Putty is opened and is running in the background. At the right corner, write in the search bar the keyword shell Click on the Web Shell icon, a new Terminal WebShell is now opened :

Run the command to list each X11 windows and get the WMClass name.

wmctrl -lx \n

Read the WM_CLASS of the Putty Wine application: putty.exe.Wine

Then exit the web shell and quit on the Putty application. Wine has created a configuration directory in the default directory /composer/.wine.

"},{"location":"buildapplications.wine/#build-the-new-puttyd-image-for-abcdesktop","title":"Build the new putty.d image for abcdesktop","text":"

In this chapter we are going to build a new docker image for abcdesktop

The new image is the putty.

Create a directory named build, and create a directory icons inside build

mkdir build\nmkdir build/icons\ncd build\n

To build your own json file.

Create a json file named applist.json, inside build directory, and add the content to the json file.

[\n{\n    \"template\": \"abcdesktopio/oc.template.gtk.wine\",\n    \"preruncommands\": [ \n        \"ENV WINEARCH=win64\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\" ],\n    \"args\": \"/composer/bin/putty.exe\",\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"icon\": \"putty.svg\",\n    \"keyword\": \"putty,ssh,terminal\",\n    \"launch\": \"putty.exe.Wine\",\n    \"name\": \"putty-wine\",\n    \"displayname\": \"Putty Wine\",\n    \"path\": \"/usr/bin/wine\"\n}\n]\n

To fill the data inside the json file :

name Type Data cat string utilities icon string putty.svg keyword string putty,ssh,terminal launch string putty.exe.Wine name string putty path string /usr/bin/wine args string /composer/bin/putty.exe template string abcdesktopio/oc.template.gtk.wine

You can read the following help lines.

Save the putty icon file on SVG format to the icons directory.

wget -O icons/putty.svg https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/putty.svg\n
"},{"location":"buildapplications.wine/#build-putty-your-from-applistjson","title":"Build putty your from applist.json","text":"

To build your new image, download the make.js script file. make.js is located in the oc.apps repository. Look at https://github.com/abcdesktopio/oc.apps if you can not download this file.

Save make.js it to you build directory. make.js is a nodejs JavaScript file. Node.js\u00ae is a JavaScript runtime built on Chrome's V8 JavaScript.

If you don't have already nodejs installed on your system, go to the website nodejs download website and follow the instructions to install nodejs.

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/make.js\n

In the build directory, you should have

drwxr-xr-x   5 devuser  staff   160 Mar 11 15:15 .\ndrwxr-xr-x+ 31 devuser  staff   992 Mar 11 15:15 ..\n-rw-r--r--   1 devuser  staff   497 Mar 11 15:15 applist.json\ndrwxr-xr-x   3 devuser  staff    96 Mar 11 15:02 icons\n-rw-r--r--   1 devuser  staff  6112 Mar 11 15:12 make.js\n\n./icons:\ntotal 8\ndrwxr-xr-x  3 devuser  staff    96 Mar 11 15:02 .\ndrwxr-xr-x  5 devuser  staff   160 Mar 11 15:15 ..\n-rw-r--r--  1 devuser  staff  1909 Oct 31  2015 putty.svg\n

Run the command make.js

node make.js\n

make.js build a new DockerFile for putty application. Remember, all application images use container images.

You should get the output

{\n  template: 'abcdesktopio/oc.template.gtk.wine',\n  preruncommands: [\n    'ENV WINEARCH=win64',\n    'USER $BUSER',\n    'RUN wineboot --init',\n    'RUN echo disable > $WINEPREFIX/.update-timestamp', \n    'RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe'\n  ],\n  args: '/composer/bin/putty.exe',\n  cat: 'utilities',\n  debpackage: '',\n  icon: 'putty.svg',\n  keyword: 'putty,ssh,terminal',\n  launch: 'putty.exe.Wine',\n  name: 'putty-wine',\n  displayname: 'Putty Wine',\n  path: '/usr/bin/wine'\n}\n

The new files putty-wine.d has been generated :

Read the content of the Dockerfile putty-wine.d. List all labels, and confirm that the icon file is uuencoded format. Uuencoding is a form of binary-to-text encoding.

Now it's time to build your putty app. Run the command docker build command.

docker build  --build-arg TAG=latest -f putty-wine.d -t putty-wine.d .\n

You should read on the standard ouput

[+] Building 21.6s (10/10) FINISHED                                                                                      \n => [internal] load build definition from putty-wine.d                                                              0.0s\n => => transferring dockerfile: 12.46kB                                                                             0.0s\n => [internal] load .dockerignore                                                                                   0.0s\n => => transferring context: 2B                                                                                     0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk.wine:dev                                    0.0s\n => CACHED [1/6] FROM docker.io/abcdesktopio/oc.template.gtk.wine:dev                                               0.0s\n => [2/6] RUN wineboot --init                                                                                      10.9s\n => [3/6] RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe             0.6s \n => [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                9.2s \n => [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                0.4s \n => [6/6] WORKDIR /home/balloon                                                                                     0.0s \n => exporting to image                                                                                              0.4s \n => => exporting layers                                                                                             0.3s \n => => writing image sha256:2cbe019726e67ecb83af74e944ff932705086e632ab4a57dec719be5e7e654cd                        0.0s \n => => naming to docker.io/library/putty-wine.d                                                                     0.0s\n

Now, your new image is ready to run.

"},{"location":"buildapplications.wine/#run-your-putty-for-abcdesktop","title":"Run your putty for abcdesktop","text":"

The API server does not know that you have built your new 2048 application. You have to send a message to the API server, to update the API Server images cache list.

Using your web browser or a curl command, call a http request to notify the API Server

http://localhost/API/manager/buildapplist\n

This http request return a json object, with all docker images details :

Reloead your web browser connected on the abcdesktop website, and log your again as anonymous.

In the search area, type putty. Click on the Putty Application.

Wine is starting your Putty application :

Great, you have build a abcdesktop image for Putty, build the application image Putty. You can push this image to your own private docker registry.

"},{"location":"buildapplications.wine/#optional-add-a-persistant-userreg-and-systemreg-windows-registry-files","title":"Optional add a persistant user.reg and system.reg windows registry files","text":"

This is a quick and dirty solution, but it works fine

Your wine configuration is stored in /composer/.wine, and by default user.reg and system.reg are located in the WINEPREFIX directory. The user.reg and system.reg files build when wine starts.

To make a copy of fresh running putty-wine.d image. Start your putty-wine.d image and using a shell located the new user.reg and system.reg files

docker ps -a | grep putty-wine\n65d95f4e7717   putty-wine.d:latest                               \"/composer/appli-doc\u2026\"   16 seconds ago   Up 15 seconds                                                                                                    anonymous-putty-wine-7877d100de0b4363ad24240d67032c8c\n

Then copy files using the docker cp command

CONTAINERID=65d95f4e7717\ndocker cp $CONTAINERID:/composer/.wine/user.reg .\ndocker cp $CONTAINERID:/composer/.wine/system.reg .\n

Add them to your default putty-wine.d image using applist.json file :

[\n{\n    \"template\": \"abcdesktopio/oc.template.gtk.wine\",\n    \"preruncommands\": [ \n        \"ENV WINEARCH=win64\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n        \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine\" ],\n    \"args\": \"/composer/bin/putty.exe\",\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"icon\": \"putty.svg\",\n    \"keyword\": \"putty,ssh,terminal\",\n    \"launch\": \"putty.exe.Wine\",\n    \"name\": \"putty-wine\",\n    \"displayname\": \"Putty Wine\",\n    \"path\": \"/usr/bin/wine\"\n}\n]\n

Rebuild your Dockerfile

node make.js\n
{\n  template: 'abcdesktopio/oc.template.gtk.wine',\n  preruncommands: [\n    'ENV WINEARCH=win64',\n    'USER $BUSER',\n    'RUN wineboot --init',\n    'RUN wget -O /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe',\n    'RUN echo disable > $WINEPREFIX/.update-timestamp',\n    'COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine'\n  ],\n  args: '/composer/bin/putty.exe',\n  cat: 'utilities',\n  debpackage: '',\n  icon: 'putty.svg',\n  keyword: 'putty,ssh,terminal',\n  launch: 'putty.exe.Wine',\n  name: 'putty-wine',\n  displayname: 'Putty Wine',\n  path: '/usr/bin/wine'\n}\nBuilding putty.exe.Wine\n

Run the command docker build command.

docker build  --build-arg TAG=latest -f putty-wine.d -t putty-wine.d .\n

Now your wine keep your registry's updates.

"},{"location":"buildapplicationsgnulinux/","title":"Build your own application image","text":"

abcdesktop use docker image format with some labels to describe the application.

"},{"location":"buildapplicationsgnulinux/#requirements","title":"Requirements","text":""},{"location":"buildapplicationsgnulinux/#build-your-own-application-image_1","title":"Build your own application image","text":"

In this chapter we are going to build a new docker image for abcdesktop

The new image is the game 2048.

Create a directory named build, and create a directory icons inside build

mkdir build\nmkdir build/icons\ncd build\n

To build your own image create first a json file.

Create a json file named applist.json, inside build directory, and add the content to the json file.

[\n  {\n    \"cat\": \"games\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"2048_logo.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048\",\n    \"displayname\": \"2048\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  }\n]\n

To fill the data inside the json file :

name Type Data cat string games debpackage string 2048-qt icon string 2048_logo.svg keyword string 2048 launch string 2048-qt.2048-qt name string 2048 path string /usr/games/2048-qt template string abcdesktopio/oc.template.gtk

You can read the following help lines, or fill the json missing value by yourself.

Save the 2048 icon file on SVG format to the icons directory. You should have this file in the icons directory as the output of the ls icons command :

2048_logo.svg\n
"},{"location":"buildapplicationsgnulinux/#build-your-new-image-2048","title":"Build your new image 2048","text":"

To build your new image, download the make.js script file. make.js is located in the oc.apps repository. Look at https://github.com/abcdesktopio/oc.apps if you can not download this file.

Save make.js it to you build directory. make.js is a nodejs JavaScript file. Node.js\u00ae is a JavaScript runtime built on Chrome's V8 JavaScript.

If you don't have already nodejs installed on your system, go to the website nodejs download website and follow the instructions to install nodejs.

In the build directory, you should have

drwxr-xr-x   5 devuser  staff   160 Mar 11 15:15 .\ndrwxr-xr-x+ 31 devuser  staff   992 Mar 11 15:15 ..\n-rw-r--r--   1 devuser  staff   265 Mar 11 15:15 applist.json\ndrwxr-xr-x   3 devuser  staff    96 Mar 11 15:02 img\n-rw-r--r--   1 devuser  staff  8036 Mar 11 15:12 make.js\n\n./img:\ntotal 8\ndrwxr-xr-x  3 devuser  staff    96 Mar 11 15:02 .\ndrwxr-xr-x  5 devuser  staff   160 Mar 11 15:15 ..\n-rw-r--r--  1 devuser  staff  1909 Oct 31  2015 2048_logo.svg\n

Run the command make.js

node make.js\n

make.js build a new DockerFile for the 2048 application. Remember, all application images use container images.

You should get the output

{\n  cat: 'games',\n  debpackage: '2048-qt',\n  icon: '2048_logo.svg',\n  keyword: '2048',\n  launch: '2048-qt.2048-qt',\n  name: '2048',\n  displayname: '2048',\n  path: '/usr/games/2048-qt',\n  template: 'abcdesktopio/oc.template.gtk'\n}\nBuilding 2048-qt.2048-qt\n{\n  cat: 'games',\n  debpackage: '2048-qt',\n  icon: '2048_logo.svg',\n  keyword: '2048',\n  launch: '2048-qt.2048-qt',\n  name: '2048',\n  displayname: '2048',\n  path: '/usr/games/2048-qt',\n  template: 'abcdesktopio/oc.template.gtk'\n}\nBuilding documentation 2048-qt.2048-qt\n        - '2048'   : '2048.md'\n

The new files 2048.d and 2048.md have been generated :

Read the content of the Dockerfile 2048.d. List all labels, and confirm that the icon file is uuencoded format. Uuencoding is a form of binary-to-text encoding.

Now it's time to build your 2048 app. Run the command docker build command.

docker build  --build-arg TAG=latest -f 2048.d -t 2048.d .\n

You should read the output :

[+] Building 32.0s (10/10) FINISHED                                                                                                                                                                 \n => [internal] load build definition from 2048.d                                                                                                                                               0.0s\n => => transferring dockerfile: 33B                                                                                                                                                            0.0s\n => [internal] load .dockerignore                                                                                                                                                              0.0s\n => => transferring context: 2B                                                                                                                                                                0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:latest                                                                                                                 1.4s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:latest@sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb                                                           0.4s\n => => resolve docker.io/abcdesktopio/oc.template.gtk:latest@sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb                                                           0.0s\n => => sha256:f3c98362fb80f5edde423b895422fc183e2728257de1d4352c4f70c7b43835fb 4.50kB / 4.50kB                                                                                                 0.0s\n => => sha256:f3c3f03bd0b5cda9f56703a4ba1b9d96d5ff2be3c03bee1831ce30dc98bb3b62 8.93kB / 8.93kB                                                                                                 0.0s\n => [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends 2048-qt && apt-get clean                                                           27.5s\n => [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections                                                                                                   0.5s\n => [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                                                                                           0.5s \n => [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                                                                                           0.4s \n => [6/6] WORKDIR /home/balloon                                                                                                                                                                0.0s \n => exporting to image                                                                                                                                                                         1.1s \n => => exporting layers                                                                                                                                                                        1.1s \n => => writing image sha256:a861af06b7f0dfa19fcde19ee8848bfee65807f852b082d9314e68676966895a                                                                                                   0.0s\n => => naming to docker.io/library/2048.d\n

Check that your image is ready on your system:

Run the docker images command

docker images\n

You should read on the stdout more lines, only 2048.d is listed here :

REPOSITORY                           TAG                                                     IMAGE ID       CREATED              SIZE\n2048.d                               latest                                                  a861af06b7f0   About a minute ago   1.17GB\n

The total image size of 2048.d is 1.17GB.

The 2048.d does not use 1.17GB, but only the difference between the 2048 image and the source image abcdesktopio/oc.template.gtk.

"},{"location":"buildapplicationsgnulinux/#update-the-cache-application-list","title":"Update the cache application list","text":"

The API server receives a new image event from docker. To run the new applications just refresh you web browser page.

"},{"location":"buildapplicationsgnulinux/#run-your-new-application","title":"Run your new application","text":"

Return to your abcdesktop website http://localhost and log in as Anonymous.

At the right corner, write in the search bar the keyword 2048

Click on the 2048 icon, and start your first abcdesktop application :

Great it's a good job, you have build your own abcdesktop 2048 application.

Now you can spent a lot of time to reach the 2048 score. Have fun !

"},{"location":"buildapplicationsgnulinux/#get-launch-and-path-values","title":"Get launch and path values","text":"

To get the X11 class name of the 2048 game, we need to install it on a Linux host. You can use abcdesktop as a Linux host or choose your own.

If you want to use abcdesktop as a GNU/Linux host

Open the url http://localhost, in your web browser, to start a simple abcdesktop container. You will use this container to install the 2048 application and fill the missing values launch and path.

http://localhost\n

You should see the abcdesktop.io home page.

Press the Connect with Anonymous access, have look

At the right corner, write in the search bar the keyword shell

Click on the Web Shell icon, a new Terminal WebShell is now opened :

Run the command

sudo apt-get update \n

The default password is lmdpocpetit ( if your admin did not change it, otherwise ask to the administrator )

Run the installation command

sudo apt-get install -y 2048-qt \n

You should read the output, during the installation process

On Ubuntu, the games are installed in a dedicated directory /usr/games.

Read the file list of the 2048-qt Ubuntu package

/usr/games/2048-qt\n/usr/share/applications/2048-qt.desktop\n/usr/share/doc/2048-qt/changelog.Debian.gz\n/usr/share/doc/2048-qt/copyright\n/usr/share/man/man6/2048-qt.6.gz\n/usr/share/menu/2048-qt\n/usr/share/pixmaps/2048-qt.xpm\n

Start the 2048 game binary 2048-qt in background.

/usr/games/2048-qt & \n

The new 2048 window is opening in the background. You can minimise the shell window to play to the 2048 game, but this is not the goal of this chapter. To show the shell window again, click on the shell icon on the upper right corner.

Run the command to list each X11 windows and get the WMClass name.

wmctrl -lx \n

wmctrl is a command that can be used to interact with an X Window manager, and can query the window manager for information, and it can request that certain window management actions be taken.

Great, look at the third value, this is what we are looking for :

You can now close your web browser and fill your json file, by yourself

"},{"location":"buildapplicationsgnulinux/#gimp","title":"GIMP","text":"

The applist.json is a array of application object. Add a new application object in the array, and fill the value for the new application.

By yourself, you have to run this exercice again, for the Gimp application. Gimp is Gnu Image Manipulation Program.

New applist.json data, and build your own Gimp abcdesktop.io application.

[\n  {\n    \"cat\": \"games\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"2048_logo.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048\",\n    \"displayname\": \"2048\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  },\n  {\n    \"cat\": \"\",\n    \"debpackage\": \"\",\n    \"icon\": \"\",\n    \"keyword\": \"\",\n    \"launch\": \"t\",\n    \"name\": \"\",\n    \"displayname\": \"\",\n    \"path\": \"\",\n    \"template\": \"\"\n  }\n\n]\n

You should get data entries like:

[\n  {\n    \"cat\": \"games\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"2048_logo.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048\",\n    \"displayname\": \"2048\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  },\n  {\n    \"cat\": \"graphics\",\n    \"debpackage\": \"gimp\",\n    \"icon\": \"gimp.svg\",\n    \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"gimp.Gimp\",\n    \"name\": \"Gimp\",\n    \"path\": \"/usr/bin/gimp\",\n    \"template\": \"abcdesktopio/oc.template.gtk\"\n  }\n\n]\n
"},{"location":"buildapplicationsgnulinux/#add-mimetype-fileextensions-and-desktopfile-entries","title":"Add MimeType, FileExtensions and desktopfile entries","text":"

abcdesktop support MimeType, File Extensions and Desktop Entry Specification entries from Gnome.

    \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n    \"fileextensions\": \"dds\",\n    \"legacyfileextensions\":\"dds\",\n    \"desktopfile\":\"/usr/share/applications/gimp.desktop\"\n

These entries allow user to use the file manager choice Open with and Open with Other Application

and list Recommended Applications

The Gimp Json data shows

{\n    \"cat\": \"graphics\",\n    \"debpackage\": \"gimp\",\n    \"icon\": \"gimp.svg\",\n    \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"gimp.Gimp\",\n    \"name\": \"Gimp\",\n    \"path\": \"/usr/bin/gimp\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n    \"fileextensions\": \"dds\",\n    \"legacyfileextensions\":\"dds\",\n    \"desktopfile\":\"/usr/share/applications/gimp.desktop\"\n}\n

Have a look to the complete applist.json file. abcdesktop applist.json contains description to build all default abcdesktop applications.

"},{"location":"buildapplicationsgnulinux/#using-the-alpine-docker-image","title":"Using the Alpine Docker image","text":""},{"location":"buildapplicationsgnulinux/#musl-memory","title":"musl memory","text":"

musl versus glibc

"},{"location":"changelog/","title":"abcdesktop change log","text":"

Logs of all notable changes made to abcdesktop.io

"},{"location":"changelog/#commits-on-jun-22-2023","title":"Commits on Jun 22, 2023","text":""},{"location":"changelog/#ocuser-heartbeat","title":"oc.user heartbeat","text":""},{"location":"changelog/#commits-on-jun-16-2023","title":"Commits on Jun 16, 2023","text":""},{"location":"changelog/#ocuser-ocpyos-change-default-namespace","title":"oc.user, oc.pyos change default namespace","text":""},{"location":"changelog/#commits-on-jun-9-2023","title":"Commits on Jun 9, 2023","text":""},{"location":"changelog/#ocpyos-clusterrole-and-role","title":"oc.pyos: ClusterRole and role","text":""},{"location":"changelog/#commits-on-may-24-2023","title":"Commits on May 24, 2023","text":""},{"location":"changelog/#add-new-label-role-for-each-core-service","title":"add new label role for each core service","text":""},{"location":"changelog/#commits-on-may-17-2023","title":"Commits on May 17, 2023","text":""},{"location":"changelog/#replace-daemonset-by-deployment","title":"Replace daemonset by deployment","text":"

-- replace daemonset by deployment for oc.nginx and oc.pyos pods https://github.com/abcdesktopio/oc.user/commit/f498e2ab2a5f0af5525a16b5d108c8a1a1f22442

"},{"location":"faq/","title":"FAQ","text":"

List of questions and answers relating to abcdesktop.io

A Kubernetes Cloud provider can be Amazon EKS, DigitalOcean DOKS, Azur AKS, Google GKE, or any of others cloud provider with a Kubernetes service.

"},{"location":"faq/#networking","title":"Networking","text":"

This list of questions and answers is relating network, talking about

"},{"location":"faq/#how-can-i-reach-my-new-service-on-a-kubernetes-cloud-provider","title":"How can I reach my new service on a Kubernetes cloud provider ?","text":"

I was attempting to deploy the ABCDesktop (kubernetes-version-3.0) for testing my setup with a few of my own desktop applications. Everything worked fine when tested locally in my Ubuntu (22.04) machine. I then thought to deploy the setup in a Kubernetes cloud provider with 3 nodes cluster. How can I reach my new hosted service on a Kubernetes cloud provider (Amazon EKS, Digital Ocean, Azur AKS, Google GKE) ?

We use the kubectl port-forward to the nginx pod

NGINX_POD_NAME=$(kubectl get pods -l run=nginx-od -o jsonpath={.items..metadata.name} -n abcdesktop)\nkubectl port-forward $NGINX_POD_NAME --address 0.0.0.0 80:80 -n abcdesktop\n

Then open your web browser to reach the http://localhost

Then open your web browser, you get the home page, login using LDAP auth or Anonymous auth.

Then login, and you get a pod user.

For the first time, you may get a timeout error, if container images can't be downloaded in less than 180 seconds on the worker node.

"},{"location":"faq/#how-can-i-expose-my-new-service-with-an-external-ip-address","title":"How can I expose my new service with an external IP address ?","text":"

I was attempting to deploy the abcesktop (kubernetes-version-3.0) for testing my setup with a few of my own desktop applications. Everything worked fine when tested locally in my Ubuntu (22.04) machine. I then thought to deploy the setup in a Kubernetes cloud provider with 3 nodes cluster. How can I expose my new service with an external IP address ?

To expose the service with an external IP address, we need to update the nginx service type. The default type on your own desktop is type: NodePort, the nginx service type on a Kubernetes cloud provider becomes type: LoadBalancer.

Delete the previous abcdesktop's nginx service

kubectl delete service nginx -n abcdesktop\n

Create a new nginx service yaml file named nginx-lb.yaml The new nginx service type is LoadBalancer

kind: Service\napiVersion: v1\nmetadata:\n  name: nginx\n  namespace: abcdesktop\nspec:\n  type: LoadBalancer\n  selector:\n    run: nginx-od\n  ports:\n  - protocol: TCP\n    port: 80\n    targetPort: 80\n    name: http\n

Apply the nginx service type LoadBalancer

kubectl apply -f nginx-lb.yaml\nservice/nginx created\n

Wait for an EXTERNAL-IP from you kubernetes cloud provider

kubectl get service nginx -n abcdesktop\nNAME    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE\nnginx   LoadBalancer   10.245.105.75   <pending>     80:31581/TCP   64s\n

You get the EXTERNAL-IP for your LoadBalancer

kubectl get service nginx -n abcdesktop\nNAME        TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)           AGE\nnginx       LoadBalancer   10.245.172.53    161.35.246.4   80:30443/TCP      2m36s\n

In case, the LoadBalancer service returns the EXTERNAL-IP 161.35.246.4 Then open your web browser to reach this EXTERNAL-IP 161.35.246.4.

Login using Philip J. Fry

And you should get the fry desktop

"},{"location":"faq/#how-can-i-expose-my-new-service-with-ingress-controller","title":"How can I expose my new service with Ingress Controller ?","text":"

A Kubernetes Ingress Controller acts as a reverse proxy.

In the Ingress, define a path to the abcdesktop's nginx service.

apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: ingress-demo\n  namespace: abcdesktop\nspec:\n  rules:\n    - host: demo.digital.pepins.net\n      http:\n        paths:\n          - path: /\n            pathType: Prefix\n            backend:\n              service:\n                name: nginx\n                port:\n                  number: 80\n  ingressClassName: nginx\n

The request path: / is proxyfied to service named nginx in abcdesktop namespace.

"},{"location":"faq/#how-to-prevent-the-connection-from-closing-after-60-seconds-of-inactivity","title":"How to prevent the connection from closing after 60 seconds of inactivity ?","text":"

My desktop is disconnected after 60 seconds of inactivity, and the message \"Your abcdesktop session has been disconnected. Please reload this page\" appears.

The message Your abcdesktop session has been disconnected. Please reload this page appears when the websockify websocket is disconnected.

Add an heartbeat value to send a ping to the client every INTERVAL seconds

Edit the od.config file, add to the desktop.envlocal option 'WEBSOCKIFY_HEARTBEAT':'30'

desktop.envlocal: { 'WEBSOCKIFY_HEARTBEAT':'30', 'LIBOVERLAY_SCROLLBAR':'0', 'UBUNTU_MENUPROXY':'0', 'X11LISTEN':'tcp' }\n

In this case, the command /usr/bin/websockify sends a ping to the client every 30 seconds. This command runs in the user's pod.

Update the configmap abcdesktop-config

kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n

Restart the pyos pod

kubectl delete pods -l run=pyos-od -n abcdesktop\n

To get more informations how to Keepalive in websockets

Timeout is a main feature to preserve from unnecessary network bandwidth.

"},{"location":"faq/#how-to-prevent-the-connection-from-closing-after-60-seconds-of-inactivity-with-an-ingress-controller","title":"How to prevent the connection from closing after 60 seconds of inactivity with an Ingress Controller ?","text":"

My desktop is disconnected after 60 seconds of inactivity, and the message Your abcdesktop session has been disconnected. Please reload this page appears.

To prevent the connection from closing after 60 seconds of inactivity through Ingress Controller, make sure the Ingress Controller isn't configured to automatically terminate long connections. The default value nginx's ingress controller is 60 seconds.

Update the default values for nginx.ingress.kubernetes.io/proxy-read-timeout and nginx.ingress.kubernetes.io/proxy-send-timeout annotations to more than 60 seconds.

apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: ingress-demo\n  namespace: abcdesktop\n  annotations:\n    nginx.ingress.kubernetes.io/proxy-read-timeout: \"3600\"\n    nginx.ingress.kubernetes.io/proxy-send-timeout: \"3600\"\nspec:\n  rules:\n    - host: demo.digital.pepins.net\n      http:\n        paths:\n          - path: /\n            pathType: Prefix\n            backend:\n              service:\n                name: nginx\n                port:\n                  number: 80\n  ingressClassName: nginx\n
"},{"location":"faq/#applications","title":"Applications","text":"

This list of questions and answers is relating abcdesktop's applications, talking about

"},{"location":"faq/#how-to-delete-all-applications","title":"How to delete all applications ?","text":"

To delete all applications use the images endpoint, replace localhost:30443 by your own datas

curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images/\n

It returns a json list of all deleted applications

[\"abcdesktopio/2048-alpine.d:3.0\", \"abcdesktopio/2048-ubuntu.d:3.0\", \"abcdesktopio/apachedirectorystudio.d:3.0\", \"abcdesktopio/astromenace.d:3.0\", \"abcdesktopio/base.d:3.0\", \"abcdesktopio/beekeeperstudio.d:3.0\", \"abcdesktopio/blender.d:3.0\", \"abcdesktopio/bless.d:3.0\", \"abcdesktopio/blobby.d:3.0\", \"abcdesktopio/boxes.d:3.0\", \"abcdesktopio/calculator.d:3.0\", \"abcdesktopio/chess.d:3.0\", \"abcdesktopio/chimerax.d:dev\", \"abcdesktopio/chrome.d:3.0\", \"abcdesktopio/chromium.d:3.0\", \"abcdesktopio/citrix.d:3.0\", \"abcdesktopio/cloudfoundry.d:3.0\", \"abcdesktopio/cmd.exe.d:3.0\", \"abcdesktopio/corsix-th.d:3.0\", \"abcdesktopio/cuda.d:dev\"]\n
"},{"location":"faq/#how-to-add-an-application","title":"How to add an application ?","text":"

To add an application : - get the json file of an application - push the json file to the abcdesktop's images endpoint

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine.d.3.0.json\n

The first start will pull the 2048 image, so it can take a while.

"},{"location":"faq/#how-to-get-the-json-file-of-a-containerized-application","title":"How to get the json file of a containerized application ?","text":"

To get the json file of a containerized application, you can use docker command or crictl command

docker inspect abcdesktopio/2048-alpine.d:3.0 > 2048-alpine.json\n
crictl inspecti abcdesktopio/2048-alpine.d:3.0 > 2048-alpine.json\n
"},{"location":"faq/#my-application-doesnt-start-how-to-get-log-files","title":"My application doesn't start. How to get log files ?","text":"

Open the webshell and read the logs files.

The log files are /tmp/lastcmd.log, /tmp/lastcmdenv.log and /tmp/NAME OF THE APPLICATION.log.

"},{"location":"guiappsoddocker/","title":"GUI application with containers","text":""},{"location":"guiappsoddocker/#other-related-projets-about-vdi-and-containers","title":"Other related projets about VDI and containers","text":"

A lot of different projets already exists using containers as a VDI. I just write list of projets, you can explore them :

"},{"location":"guiappsoddocker/#x11-window-system-architecture","title":"X11 window system architecture","text":"

In a *nix system a GUI application has the role of \u201cX client\u201d. Each time it redraws its content a sequence of graphics commands is encoded into the X protocol using a library (usually Xlib) and transmitted into the X11 socket. At the other end an X server reads such commands from the socket and renders them onto a display. [ source HW accelerated GUI apps on Docker]

"},{"location":"guiappsoddocker/#containerizing-a-gui-app","title":"Containerizing a GUI app","text":"

Taking a look at the X window system architecture it\u2019s clear that in order to make our containerized GUI apps capable of drawing on a screen we need to give it write access to the X11 socket, and we need an X server to consume and render the graphics commands onto a display.

We can approach this problem from three angles:

"},{"location":"guiappsoddocker/#all-in-one-container","title":"All in one container","text":""},{"location":"guiappsoddocker/#separated-container","title":"Separated container","text":""},{"location":"guiappsoddocker/#abcdesktop-choices","title":"abcdesktop choices","text":"

To guarantee isolation, abcdesktop/io.io run X11 server and X11 client in separated container. X11 server and X11 client share the socket as unix file socket on a dedicated external shared volume.

Local is best, thus server and application need to run on the same node, if it can.

"},{"location":"guiappsoddocker/#html5-web-browser-as-remote-display","title":"HTML5 Web Browser as remote DISPLAY","text":"

The Web Browser does not support X11 protocol. We need a graphical desktop system to paint the virtual DISPLAY in a <canvas> HTML element.

"},{"location":"guiappsoddocker/#replace-x11-server-from-xorg-by-a-xvnc","title":"Replace X11 Server from X.org, by a Xvnc.","text":"

Xvnc is the X VNC (Virtual Network Computing) server. It is based on a standard X server, but it has a virtual screen rather than a physical one. X applications display themselves on it as if they were using a normal X display, but they can only be accessed via a VNC. So Xvnc is really two servers in one. To the applications it is an X server, and to the remote VNC users it is a VNC server.

"},{"location":"guiappsoddocker/#convert-vnc-tcp-socket-in-to-a-websocket","title":"Convert VNC TCP socket in to a WebSocket","text":"

The web browser does not support VNC (RFB Protocol) and the TCP socket natively. We need to translate TCP socket, into a WebSocket. This can be done using :

"},{"location":"guiappsoddocker/#use-a-vnc-javascript-client","title":"Use a VNC Javascript client","text":"

The web browser receives the RFB protocol in the WebSocket and then paints the data into a canvas.

"},{"location":"overview/","title":"abcdesktop overview","text":"

abcdesktop is based on kubernetes, from the abcdesktop infrastructure to the user applications. At the login page, the user chooses a login provider and authenticates himself, then abcdesktop engine creates a pod for this user.

"},{"location":"overview/#abcdesktop-applications","title":"abcdesktop applications","text":"

An application can run as ephemeral container or as pod.

"},{"location":"overview/#abcdesktop-design","title":"abcdesktop design","text":""},{"location":"overview/#abcdesktop-services","title":"abcdesktop services","text":""},{"location":"overview/#abcdesktop-pod-user","title":"abcdesktop pod user","text":""},{"location":"overview/#applications","title":"applications","text":""},{"location":"rdgp/","title":"Rdgp","text":"

Privacy Notice: protecting your personal data

The changes to the French and European regulation on the protection of personal data come into force on 25 May 2018.

If you want to interact with abcdesktop via www.abcdesktop.io and other corporate sites, personal data will be collected about you in order to process your request and/or send you the desired information.

In this case, abcdesktop is committed to the protection, confidentiality and security of personal data.

This Privacy Notice provides information on how abcdesktop, and its potential subcontractors or partners, process your personal data in this context.

This document may be supplemented by specific information in the case of a specific service where appropriate (e.g. shareholders club) or in a commercial context. If you are an abcdesktop customer, you will also find a dedicated personal data protection policy on the website demo.abcdesktop.io.

Why does abcdesktop process your personal data collected on abcdesktop.io and on its corporate websites? On demo.abcdesktop.io, you can ask a question or receive specific abcdesktop information (for example a press release). abcdesktop processes the personal data collected via the contact forms in place for these purposes. Some websites may require additional information which is processed specifically to enable access to a private or dedicated space, such as shareholders club.

We only process your personal data once we have your consent in the context of you request.

Your data is only kept for the length of time needed to fulfil your request. This takes into account your unsubscription to certain newsletters or sending out press releases.

What types of data are processed? abcdesktop may be required to process your personal data which we collect directly via the online form. It includes identity data, such as your name, surname, email address and sometimes your telephone number and postal address if necessary.

Who can see your data? Data collected about you is intended for abcdesktop\u2019s internal services and if any, service providers. In the case of a legal procedure, processed data may also be communicated to the relevant authorities.

Is your data processed outside the European Union? The data collected may be processed outside the European Union if deemed necessary and according to the nature of your request. In this case, abcdesktop will take all necessary steps to protect your data.

What are your rights? You have the right to withdraw your consent and stop any future use of your data. You can exercise your right to obtain information and access to the data, to rectify them in case of inaccurate data related to you and to delete the data when conditions are fulfilled.

How can you contact the Data Protection Officer? If you wish to exercise your rights over your data, you can write to the following address along with proof of identity:

Orange Sa Attention: Data Protection Officer (DPO) 78 rue Olivier de Serres 75505 Paris Cedex 15

Possibility to make a request to the Data protection authority, the CNIL in France: If your interaction with abcdesktop is not satisfactory, you can also lodge a complaint with the Commission Nationale de l\u2019Informatique et des Libert\u00e9s (CNIL), which is the regulatory authority in charge of personal data protection in France.

How is your data secured? Orange ensures your data remains secure and confidential, including certain processing carried out by subprocessor.

For this purpose, the appropriate technical and organisational measures are in place to prevent the loss, misuse, alteration and deletion of your personal data. These measures are adapted according to the level of sensitivity of this processed data and the level of risk that the processing or implementation of it presents.

Modification of the personal data protection notice This Privacy Notice is subject to change.

"},{"location":"requirements/","title":"Requirements","text":""},{"location":"requirements/#prerequisites-for-setup-abcdesktop","title":"Prerequisites for setup abcdesktop","text":""},{"location":"requirements/#release-3x-stable","title":"Release 3.X [ stable ]","text":""},{"location":"requirements/#supported-architectures","title":"Supported Architectures","text":"

Our images support only architectures x86-64. The architectures supported by this image is:

Architecture Tag x86-64 amd64-latest

arm-64 is in progress.

"},{"location":"requirements/#gnulinux","title":"GNU/Linux","text":"

The recommended distrubution is Ubuntu 22.04.2 LTS

"},{"location":"requirements/#macosx","title":"MacOS/X","text":"

Use Docker Desktop with kubernetes, https://www.docker.com/products/docker-desktop/

"},{"location":"requirements/#microsoft-windows","title":"Microsoft Windows","text":"

Use Docker Desktop with kubernetes, https://www.docker.com/products/docker-desktop/

"},{"location":"runapplications.wine/","title":"Run docker image for Windows using Wine","text":""},{"location":"runapplications.wine/#requirements","title":"Requirements","text":""},{"location":"runapplications.wine/#winehq","title":"WineHQ","text":"

Wine (originally an acronym for \"Wine Is Not an Emulator\") is a compatibility layer capable of running Windows applications on several POSIX-compliant operating systems, such as Linux, macOS, & BSD. Instead of simulating internal Windows logic like a virtual machine or emulator, Wine translates Windows API calls into POSIX calls on-the-fly, eliminating the performance and memory penalties of other methods and allowing you to cleanly integrate Windows applications into your desktop.

To run Windows applications abcdesktop.io use WineHQ. A dedicated image template source is ready to use as source of others Windows applications. This image template is named abcdesktopio/oc.template.gtk.wine.50

Start pulling this template image :

docker pull abcdesktopio/oc.template.gtk.wine\n

Look at the Dockerfile to build the abcdesktopio/oc.template.gtk.wine on the https://hub.docker.com/ web site.

For a better support, we are using the 32 bits library, as i386 libs on GNU/Linux. Your can read in the Dockerfile, how the abcdesktopio/oc.template.gtk.wine is created.

Dockerfile information :

dpkg --add-architecture i386 aptitude install -y wine

"},{"location":"runapplications.wine/#run-notepadexe-for-windows-in-a-docker-container","title":"Run notepad.exe for Windows in a Docker container","text":"

In this chapter we are going to run notepad.exe for Windows inside a docker container for abcdesktop.io.

Start an abcdesktop session. You can use an authenticated session using an authentication provider external or explicit, or you can do this exercice using Anonymous Authentification also know as the authentication provider implicit.

In this chapter we choose an Anonymous, DO NOT CLOSE YOUR WEB BROWSER, you should not be able de reconnect with the same user context, and have to restart this exercice at the begining, else you can choose to configure abcdesktop with ldap authentification.

Login using the Anonymous authentification provider.

Keep your web browser open, then on your host, open a terminal shell window and run the command

docker ps --filter ancestor=abcdesktopio/oc.user.18.04\n

The option --filter ancestor=abcdesktopio/oc.user.18.04 ask to filter only container with the image ancestor set with value abcdesktopio/oc.user.18.04 You should read the container with the image named abcdesktopio/oc.user.18.04

docker ps --filter ancestor=abcdesktopio/oc.user.18.04\nCONTAINER ID   IMAGE                        COMMAND                  CREATED         STATUS         PORTS                                                            NAMES\n86df3ff126ac   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   3 minutes ago   Up 3 minutes   4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp  g-5f4300d2-7c8e-43c6-89ab-f85bd8b68138\n

Read the values CONTAINER ID and NAMES

In this example, the CONTAINER ID is 86df3ff126ac and the NAME is g-5f4300d2-7c8e-43c6-89ab-f85bd8b68138.

We are using the /tmp volume of this CONTAINER ID 86df3ff126ac

Using an anonymous authnetification, the name of your container id is an UUID, for example 57be1e5b-0b14-4c05-ae79-75e9a03c77be. The name of the tmp volume is tmp-57be1e5b-0b14-4c05-ae79-75e9a03c77be

Run a docker inspect -f \"{{ .HostConfig.Binds }}\" and add your CONTAINER ID as parameter.

docker inspect -f \"{{ .HostConfig.Binds }}\" CONTAINER_ID\n

For example

docker inspect -f \"{{ .HostConfig.Binds }}\" 86df3ff126ac\n

You should read the volume name starting by tmp- with your uuid concatened

[tmp-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/tmp home-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/home/balloon]\n

Note: if your are using an LDAP authentification, the name of your container id is the username, for example hermes. The name of the tmp volume is tmp-hermes

Now, start a new docker container with the same HostConfig.Bings as your oc.user container. The -v parameter is the first entry of the result in the previous command docker inspect -f \"{{ .HostConfig.Binds }}\"

docker run -it -v TMP_VOLUMENAME:/tmp  --user balloon abcdesktopio/oc.template.gtk.wine bash\n

For example with an Anonymous user:

docker run -it -v  tmp-5f4300d2-7c8e-43c6-89ab-f85bd8b68138:/tmp --user balloon abcdesktopio/oc.template.gtk.wine bash \n

Great, you have started a new docker container. The oc.user containter and your new container are sharing the same volume mounted as /tmp. You get a prompt inside the new docker container.

To run a command as administrator (user \"root\"), use \"sudo <command>\".\nSee \"man sudo_root\" for details.\n\nballoon@8684ae888f74:~$\n

And now start the notepad.exe with wine

balloon@8684ae888f74:/$ wine notepad\n

After few seconds you should read on the standard error

balloon@8684ae888f74:/$  wine notepad\n0015:err:clipboard:convert_selection Timed out waiting for SelectionNotify event\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0014:err:ole:get_local_server_stream Failed: 80004002\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}\n0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}\n0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002\n0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002\n0012:err:ole:get_local_server_stream Failed: 80004002\nCould not find Wine Gecko. HTML rendering will be disabled.\nwine: configuration in L\"/composer/.wine\" has been updated.\n

And the notepad window should be open inside your Web browser

This Windows application is running inside a docker container on abcdesktop.io desktop.

In the Terminal shell press CTRL+C to stop the wine notepad process, then type exit to quit your shell in container.

^C0032:fixme:console:CONSOLE_DefaultHandler Terminating process 8 on event 0\nballoon@4c4d806557dc:~$ exit\nexit\n

It's time to build your own abcdesktop application image. Read the next chapter Build abcdesktop.io docker image for Windows using Wine.

"},{"location":"1.0/features/","title":"abcdesktop release 1.0","text":"

The abcdesktop release 1.0 has started in May 2015

"},{"location":"1.0/config/authentification-rules/","title":"Authentification rules configuration","text":"

All auth providers support rules configuration

A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )

"},{"location":"1.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"

A rule is a dictionary object with :

Example :

To test if the user source IP address is equal to 8.8.8.1/32

'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n
"},{"location":"1.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"

conditions is a list of condition. All condition are always tested, as a logical AND. The result must be equal to the expected value.

"},{"location":"1.0/config/authentification-rules/#examples","title":"Examples:","text":""},{"location":"1.0/config/authentification-rules/#example-true-and-true-expected-true","title":"Example (TRUE and TRUE) expected TRUE:","text":"

To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnet80'\n}\n

Add the labels 'shipcrewandnet80', if the 'expected' value is True

"},{"location":"1.0/config/authentification-rules/#example-true-and-true-expected-false","title":"Example (TRUE and TRUE) expected FALSE:","text":"

To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : False,\n    'label': 'noshipcrewandnet80'\n}\n

Add the labels 'noshipcrewandnonet80', if the 'expected' value is False

"},{"location":"1.0/config/authentification-rules/#example-true-and-false-expected-true","title":"Example (TRUE and FALSE) expected TRUE:","text":"

To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : False } ], \n    'expected' : True,\n    'label': 'noshipcrewandnet80'\n}\n

Add the labels 'noshipcrewandnet80', if the 'expected' value is True

"},{"location":"1.0/config/authentification-rules/#example-false-and-true-expected-true","title":"Example (FALSE and TRUE) expected TRUE:","text":"

To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : False },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnonet80'\n}\n

Add the labels 'shipcrewandnonet80', if the 'expected' value is True

"},{"location":"1.0/config/authentification-rules/#the-condition-value","title":"The condition value","text":"name description example boolean always true or false 'boolean' : 'true' httpheader test a HTTP header value 'httpheader': memberOf test if the LDAP user object is member of group 'memberOf': [ 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'] network test if the client user IP Address is in a network subnet 'network': [ '1.2.3.4/24'] primarygroupid test if the LDAP user object has a attibute primaryGroupID and is equal to value 'primarygroupid': '513'"},{"location":"1.0/config/authentification-rules/#condition-boolean","title":"condition boolean","text":"

This condition is a dummy condition; Only use to force a label or to disable a test.

'boolean': boolean\n

The commun usage is

'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : True,\n                 'label': 'dummy'\n}\n

or alway False

'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : False,\n                 'label': 'dummy'\n}\n
"},{"location":"1.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"

This condition is test if a HTTP Header value is equal to a string.

'httpheader': dict\n

example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'

\n 'rule-httpheader': { \n        'conditions' : [ \n            {   'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n                'expected' : True  } ],\n        'expected' : True,\n        'label': 'chromemaxosx112' }\n\n
"},{"location":"1.0/config/authentification-rules/#condition-network","title":"condition network","text":"

This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.

'network': string\n

example

To test if the user source IP address is equal to 8.8.8.1/32

'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n

To test if the user source IP address is in the subnet 10.0.0.0/8

'rule-localnet': { \n    'conditions' : [   { 'network': '10.0.0.0/8', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'localnet' }\n

To test if the user source IP address is NOT in the subnet 192.168.0.0/24

'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : False } ],\n                         'expected' : True,\n                         'label': 'no192168net' }\n

same as

'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : True } ],\n                         'expected' : False,\n                         'label': 'no192168net' }\n
"},{"location":"1.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"

To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork a separated rule.

'policies': {\n    'acl' : {},\n    'rules' : { \n          'rule-privatenetwork-10': {   'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-fe80':{  'conditions' : [ { 'network': 'fe80::/10',     'expected' : True } ], \n                                                'expected'   : True, \n                                                'label': 'privatenetwork' }\n    }\n}                       \n
"},{"location":"1.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"

This condition test if the user is a member of a LDAP Distinguished Name.

'memberOf': string\n
 'rule-sample': { 'conditions':  [ \n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewgrp'\n}\n
"},{"location":"1.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"

This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.

'primarygroupid': string\n

To check is a user is memberof a DOMAIN\\USER the primary group id is 513

'rule-domainuser': {    'conditions':  [ { 'primarygroupid': '513', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'domainuser'\n}\n

However, if the user needed to be seen as a Domain Admin for POSIX, the PrimaryGroupID is 512, the RID for that group.

'rule-posixdomainadmin': {  'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'posixdomainadmin'\n}\n

The Enterprise Admins group, 519, is also used to grant this level in POSIX.

'rule-enterpriseadmin': {   'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'enterpriseadmin'\n}\n
"},{"location":"1.0/config/authentification/","title":"Authentification","text":""},{"location":"1.0/config/authentification/#configuration-file","title":"Configuration file","text":"

The authentification configuration is set in the od.config file. In this chapter you will need to update the od.config configuration file. This update differs depending on the configuration docker mode or kubernetes mode.

Read the Update your configuration file and apply the new configuration file section to make change in od.config file for docker, or edit the abcdesktop.yaml file for kubernetes cluster.

"},{"location":"1.0/config/authentification/#the-dictionary-authmanagers","title":"The dictionary authmanagers","text":"

The authmanagers is defined as a dictionnary object :

authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

The od.config defines 3 kinds of entries in the authmanagers object :

"},{"location":"1.0/config/authentification/#related-authmanagers","title":"Related authmanagers","text":"authmanagers type Description external OAuth 2.0 Authentification explicit LDAP, LDAPS and Active Directory Authentification implicit Anonymous Authentification"},{"location":"1.0/config/authentification/#hands-on","title":"Hands-on","text":""},{"location":"1.0/config/authentification/#requirements","title":"Requirements","text":"

You should have read the hands-on :

"},{"location":"1.0/config/authentification/#change-authmanagers-configuration","title":"Change authmanagers configuration","text":"

Edit your od.config pyos configuration file, and set the value to the authmanagers dictionnay with empty values for implicit, explicit, and external, as describe :

authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

Save your new od.config file.

The config file od.config has changed and od.py running inside the container should restart. If it doesn't, restart your docker-compose to ake sure that the od.py the your new od.config file.

docker-compose restart

Start your web browser and open the URL http://localhost

The Web home page should only show the title abcdesktop.io. There is no authmanagers available.

Great you can now add some value to authenticate your users.

"},{"location":"1.0/config/authentification/#authmanagers-implicit","title":"authmanagers implicit:","text":"

implicit is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers implicit Section.

"},{"location":"1.0/config/authentification/#authmanagers-explicit","title":"authmanagers explicit:","text":"

explicit is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers explicit Section.

"},{"location":"1.0/config/authentification/#authmanagers-external","title":"authmanagers external:","text":"

external is the easyest configuration mode, and is used as 'Anonymous' authentification. Read the authmanagers external Section.

"},{"location":"1.0/config/authentification/#authmanagers-configuration-sample","title":"Authmanagers configuration sample","text":"

In the authmanagers implicit section, authmanagers explicit section, and authmanagers external section, you have learned how to defined the providers. You can set a complete authmanagers dictionnary as described for example :

authmanagers: {\n  'external': {\n    'providers': {\n      'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'client_id':     'XXXXXXX', \n        'client_secret': 'YYYYYYY', \n        'dialog_url': 'https://www.facebook.com/dialog/oauth?client_id={client_id}&redirect_uri={callback_url}&response_type=code',\n        'auth_url': 'https://graph.facebook.com/v2.3/oauth/access_token?code={code}&redirect_uri={callback_url}&client_id={client_id}&client_secret={client_secret}',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?access_token={access_token}&fields=picture.width(400),name',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        }\n      },\n      'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'client_id':      'AAAAAAAA', \n        'client_secret':  'BBBBBBBB',\n        'dialog_url': 'https://api.orange.com/oauth/v2/authorize?client_id={client_id}&redirect_uri={callback_url}&scope=openid+profile+offline_access&response_type=code&prompt=login+consent&state={callba\nck_url}',\n        'auth_url': 'https://api.orange.com/openidconnect/fr/v1/token?code={code}&redirect_uri={callback_url}&grant_type=authorization_code', \n        'userinfo_url': 'https://api.orange.com/openidconnect/v1/userinfo',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n      },\n      'mobileorange': { \n        'displayname': 'Mobile Connect', \n        'enabled': False,\n        'client_id':     'CCCCCCCC', \n        'client_secret': 'DDDDDDDD',\n        'basic_auth': True,\n        'dialog_url': 'https://api.orange.com/oauth/v2/authorize?client_id={client_id}&redirect_uri={callback_url}&scope=openid+profile&response_type=code&prompt=login+consent&state=&state={callback_url}'\n,\n        'auth_url': 'https://api.orange.com/oauth/v2/token?code={code}&redirect_uri={callback_url}&grant_type=authorization_code', \n        'userinfo_url': 'https://api.orange.com/oauth/v2/authorize',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n      },\n      'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id':     'EEEEEEEE.apps.googleusercontent.com', \n        'client_secret': 'FFFFFFFF',\n        'scope': 'https://www.googleapis.com/auth/userinfo.email',\n        'dialog_url': 'https://accounts.google.com/o/oauth2/v2/auth?client_id={client_id}&redirect_uri={callback_url}&response_type=code&scope={scope}',\n        'auth_url': 'https://oauth2.googleapis.com/token?code={code}&grant_type=authorization_code&redirect_uri={callback_url}&scope={scope}&client_id={client_id}&client_secret={client_secret}',\n        'userinfo_url': 'https://openidconnect.googleapis.com/v1/userinfo?access_token={access_token}',\n        'callback_url': 'https://host.domain.com/API/auth/oauth?manager={manager.name}&provider={name}'\n      }\n    }\n  },\n  'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n  }}\n\n\nadconfig : { 'AD': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                        'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                        'domain'        : 'AD',\n                        'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                             'servers'  : [ '192.168.1.12', '192.168.1.13'  ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                             'query_dcs'    : True\n}}\n
"},{"location":"1.0/config/authexplicit-activedirectory/","title":"Authentification explicit for Microsoft Active Directory services","text":""},{"location":"1.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

For example :

'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}"},{"location":"1.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"

The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN and defined in the config_ref with the exact same value.

Providers :

The provider is formated as a dictionnary

{ 'AD': { 'config_ref': 'adconfig', 'enabled': True } }

Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

The adconfig is a dictionnary. For example :

adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n

If this example, the Microsoft Active Directory value are set to :

Variable name Value for example USERDOMAINADUSERDNSDOMAINAD.DOMAIN.LOCAL

For Active Directory authmanagers, replace the variable name with your own value.

Variable name Type Description Example default boolean Use this domain as default domain True ldap_basedn string LDAP Base Distinguished Names DC=ad,DC=domain,DC=localldap_fqdn string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.localdomain_fqdn string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCALservers list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]kerberos_realm string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL

The explicit authentification is support LDAP and LDAPS bind.

The Microsoft Active Directory value are set to :

Variable name Value USERDOMAINADUSERDNSDOMAINAD.DOMAIN.LOCAL

For Active Directory authmanagers, replace the variable name with your own value.

Variable name Description Example ldap_basedn Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=localldap_fqdn Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.localdomain_fqdn Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCALservers Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]kerberos_realm Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL"},{"location":"1.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"

The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)

"},{"location":"1.0/config/authexplicit-activedirectory/#site","title":"Site","text":"

This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.

Variable name Type Defautl value site_subnetdn string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') )site_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=subnet)site_attrs list ['cn', 'siteObject', 'location']"},{"location":"1.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"

This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location is the join key to match local printer for the user.

Variable name Type Defautl value printer_printerdn string OU=Applications + config.get('basedn')printer_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=printQueue)site_attrs list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]

Great, you have check how the explicit Authentification configuration works.

"},{"location":"1.0/config/authexplicit-ldap/","title":"Authentification explicit for LDAP Directory Services","text":""},{"location":"1.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

For example :

'explicit': {\n    'show_domains': True,\n    'providers': {\n      'LDAP': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n}\n

In this example, ldapconfig dict must have a key LDAP

Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string not used by ldap, only used by Active Directory providers dictionnary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}"},{"location":"1.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"

The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set with the same value in providers configuration and config_ref.

Providers :

The provider is formated as a dictionnary

{ 'planet': { 'config_ref': 'ldapconfig', 'enabled': True } }

Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

The ldapconfig is a dictionnary.

For example :

ldapconfig : { 'planet': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ '192.168.8.195' ],\n                        'secure'        : False,\n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n           }}\n\n}\n
"},{"location":"1.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default boolean Use this domain as default domain True ldap_protocol string protocol type. ldap or ldaps for LDAP directory services ldaptls_require_cert boolean The default value is False. tls_require_cert apply only if ldap_protocol is set to ldaps. Allow LDAPS connection if the ldaps server hostname does not match CommonName peer certificate. In production, set this value to True This will disable the ldap option call : ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) False basedn string LDAP Base Distinguished Names ou=people,dc=planetexpress,dc=comservers list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. [ '192.168.1.12', '192.168.1.13' ] IP Address or FQDN values scope LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope being one of SCOPE_BASE (to search the object itself), SCOPE_ONELEVEL (to search the object\u2019s immediate children), or SCOPE_SUBTREE (to search the object and all its descendants). ldap.SCOPE_SUBTREEtimeout integer ldap time out in second 10 exec_timeout integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos auth credentials. the exec timeout is used to run external command line. 10 users_ou string Users Organisation Unit ou=people,dc=planetexpress,dc=comattrs list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s))group_filter string LDAP filter to find group object (&(objectClass=Group)(cn=%s))group_attrs string LDAP filter to find group object (&(objectClass=Group)(cn=%s))"},{"location":"1.0/config/authexplicit-ldap/#hands-on-configure-auth-using-an-openldap-for-docker","title":"Hands-on : Configure Auth using an OpenLDAP for Docker","text":""},{"location":"1.0/config/authexplicit-ldap/#requirements","title":"Requirements","text":"

You should have all read and done the hands-on :

"},{"location":"1.0/config/authexplicit-ldap/#openldap-docker-image-for-testing","title":"OpenLDAP Docker Image for testing","text":"

To configure abcdesktop.io to use an explicit authentification, we need a directory service. We use an OpenLDAP Docker Image for testing with provioned values.

Read the OpenLDAP Docker Image for testing documentation on the url abcdesktop OpenLDAP Docker Image for testing

"},{"location":"1.0/config/authexplicit-ldap/#update-the-docker-composeyml-file","title":"Update the docker-compose.yml file","text":"

Update the docker-compose.yml file to add an ldap as directory server

The specific openldap section is describe as a service. The new complete docker-compose.yml file is now :

version: '3'\nservices:\n  pyos:\n    depends_on:\n      - memcached\n      - mongodb\n    image: 'abcdesktopio/oc.pyos'\n    networks:\n      - netback\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n      - /Users/alexandredevely/src/abcdesktop/od.config:/var/pyos/od.config\n  speedtest:\n    image: 'abcdesktopio/oc.speedtest'\n    networks:\n      - netuser\n  nginx:\n    depends_on:\n      - memcached\n      - pyos\n    image: 'abcdesktopio/oc.nginx'\n    ports:\n      - '80:80'\n      - '443:443'\n    networks:\n      - netuser\n      - netback\n  memcached:\n    image: memcached\n    networks:\n      - netback\n  mongodb:\n    image: mongo\n    networks:\n      - netback\n  openldap:\n    image: abcdesktopio/oc.openldap\n    networks:\n      - netback\nnetworks:\n  netuser:\n    driver: bridge\n  netback:\n    internal: true\n
"},{"location":"1.0/config/authexplicit-ldap/#update-the-odconfig-configuration-file","title":"Update the od.config configuration file","text":"

Update the od.config configuration file.

Add the explicit entry to the dictionary authmanagers.

authmanagers: {\n  'external': {\n  },\n  'explicit': {\n    'show_domains': True,\n    'providers': {\n      'planet': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n  }}\n\n\n

Note: the config_ref is ldapconfig.

Add a new dictionnary object named ldapconfig to the configuration file. These values come from the LDAP structure of OpenLDAP Docker Image for testing

ldapconfig : { 'planet': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ 'openldap' ],\n                        'secure'        : False,\n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n           }}\n

Note: the server name is the name of the service entry

Save your new od.config file.

The config file od.config has changed and od.py running inside the container should restart. If it doesn't, restart your docker-compose to make sure that the od.py the your new od.config file.

docker-compose restart

Open the URL:http://localhost

The authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

"},{"location":"1.0/config/authexplicit-ldap/#the-ldap-structure-of-openldap-docker-image-for-testing","title":"The LDAP structure of OpenLDAP Docker Image for testing","text":""},{"location":"1.0/config/authexplicit-ldap/#basedn","title":"BaseDN","text":"

The basedn is dc=planetexpress,dc=com

"},{"location":"1.0/config/authexplicit-ldap/#admin-account","title":"admin account","text":"

The admin account is described as

Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"1.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":""},{"location":"1.0/config/authexplicit-ldap/#users","title":"Users","text":""},{"location":"1.0/config/authexplicit-ldap/#cnhubert-j-farnsworthoupeopledcplanetexpressdccom","title":"cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hubert J. Farnsworth sn Farnsworth description Human displayName Professor Farnsworth employeeType Owner employeeType Founder givenName Hubert jpegPhoto JPEG-Photo (630x507 Pixel, 26780 Bytes) mail professor@planetexpress.com mail hubert@planetexpress.com ou Office Management title Professor uid professor userPassword professor"},{"location":"1.0/config/authexplicit-ldap/#cnphilip-j-fryoupeopledcplanetexpressdccom","title":"cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry"},{"location":"1.0/config/authexplicit-ldap/#cnjohn-a-zoidbergoupeopledcplanetexpressdccom","title":"cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn John A. Zoidberg sn Zoidberg description Decapodian displayName Zoidberg employeeType Doctor givenName John jpegPhoto JPEG-Photo (343x280 Pixel, 26438 Bytes) mail zoidberg@planetexpress.com ou Staff title Ph. D. uid zoidberg userPassword zoidberg"},{"location":"1.0/config/authexplicit-ldap/#cnhermes-conradoupeopledcplanetexpressdccom","title":"cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hermes Conrad sn Conrad description Human employeeType Bureaucrat employeeType Accountant givenName Hermes mail hermes@planetexpress.com ou Office Management uid hermes userPassword hermes"},{"location":"1.0/config/authexplicit-ldap/#cnturanga-leelaoupeopledcplanetexpressdccom","title":"cn=Turanga Leela,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Turanga Leela sn Turanga description Mutant employeeType Captain employeeType Pilot givenName Leela jpegPhoto JPEG-Photo (429x350 Pixel, 26526 Bytes) mail leela@planetexpress.com ou Delivering Crew uid leela userPassword leela"},{"location":"1.0/config/authexplicit-ldap/#groups","title":"Groups","text":""},{"location":"1.0/config/authexplicit-ldap/#cnadmin_staffoupeopledcplanetexpressdccom","title":"cn=admin_staff,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn admin_staff member cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com member cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com"},{"location":"1.0/config/authexplicit-ldap/#cnship_crewoupeopledcplanetexpressdccom","title":"cn=ship_crew,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn ship_crew member cn=Turanga Leela,ou=people,dc=planetexpress,dc=com member cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com member cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"},{"location":"1.0/config/authexplicit-ldap/#insert-the-user-credentials","title":"Insert the user credentials","text":"

Start your web browser and open the URL http://localhost

The Web home page contains the new input values Login and Password to authenticate this user.

You can use for example on user of the list above.

Credentials Value Login Turanga Leela Password leela

Insert the login credentials :

Turanga Leela as login and leela as password, then click on the Sign in button.

Look at the top of the sreen. The user name is Turanga Leela:

"},{"location":"1.0/config/authexplicit-ldap/#applications-remainted","title":"Applications remainted","text":"

Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :

I like this amazing project abcdesktop.io\n

Do not save your file and just close your web browser.

Start your web browser again, and open the same URL http://localhost, and log in with the same account: Turanga Leela as login and leela as password, then click on the Sign in button.

The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io

All applications are maintained.

Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.

"},{"location":"1.0/config/authexplicit/","title":"Authentification explicit","text":""},{"location":"1.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit:","text":"

explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

The explicit authentification support the directory services ldap, ldaps, and Microsoft Active Directory.

Configuration sample for Microsoft Active Directory

For example :

'explicit': {\n    'show_domains': True,\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n
"},{"location":"1.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"

If the authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

"},{"location":"1.0/config/authexplicit/#ldap-authmanagers","title":"LDAP authmanagers :","text":"

Read the specific chapter on LDAP LDAP and LDAPS explicit authmanagers

"},{"location":"1.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"

Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers

Great, you have check how the explicit Authentification configuration works.

"},{"location":"1.0/config/authexternal/","title":"Authentification external","text":""},{"location":"1.0/config/authexternal/#requirements","title":"Requirements","text":"

To use external Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.

"},{"location":"1.0/config/authexternal/#library","title":"Library","text":"

abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.

"},{"location":"1.0/config/authexternal/#authmanagers-external","title":"authmanagers external:","text":"

external authentification use OAuth 2.0 authenticaton.

The external authentification configuration is defined as a dictionary object and contains a list of external provider.

Sample providers entry using the Google OAuth 2.0 authentification service.

'external': {\n    'providers': {\n    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n}\n

The variable values client_id and client_secret have been set to obfuscate value 'XXX'. The FQDN is refered to the public server FQDN.

Variable name Type Description Sample displayname string Display Name show in Web front Googleenabled boolean LDAP Base Distinguished Names Trueclient_id string client id XXX-YYY.apps.googleusercontent.comclient_secret string client secret XXXscope list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ]userinfo_url string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix string redirect URL https://hostname.domain.local/API/auth/oauthredirect_uri_querystring string URL query string manager=external&provider=googleauthorization_base_url string callback URL https://accounts.google.com/o/oauth2/v2/authtoken_url string token URL https://oauth2.googleapis.com/token

The complete redirect url concats the two values redirect_uri_prefix and redirect_uri_querystring.

"},{"location":"1.0/config/authexternal/#orange-oauth-20","title":"Orange OAuth 2.0","text":"

Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.

"},{"location":"1.0/config/authexternal/#orange-application","title":"Orange Application","text":"

Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section

'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'openid', 'form_filling' ],\n        'client_id': 'XXX',\n        'client_secret': 'YYY',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=orange',\n        'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n        'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n        'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n      }\n
"},{"location":"1.0/config/authexternal/#facebook-oauth-20","title":"Facebook OAuth 2.0","text":"

Facebook's OAuth is supported for authentication.

"},{"location":"1.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"

Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API

'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'XXX', \n        'client_secret': 'YYY', \n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        }\n
"},{"location":"1.0/config/authexternal/#google-oauth-20","title":"Google OAuth 2.0","text":"

Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.

"},{"location":"1.0/config/authexternal/#google-application","title":"Google Application","text":"

Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]

'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n

Great, you have check how the implicit Authentification configuration works.

"},{"location":"1.0/config/authimplicit/","title":"Authentification implicit","text":""},{"location":"1.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit:","text":"

implicit is the easyest configuration mode, and is used as 'Anonymous' authentification.

The provider is defined as a dictionnary object and contains an anononymous provider.

anononymous provider always permit authentification, and create a uuid as userid. anononymous provider is used to skip the authentification process in a demonstration mode.

'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n

anononymous provider always permit authentification, and create a uuid as userid.

Set in your configuration file the authmanagers dictionnary as described

authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { \n     'providers': {\n         'anonymous': {\n           'displayname': 'Anonymous',\n           'caption': 'Anonymous',\n           'userid': 'anonymous',\n           'username': 'Anonymous'\n      } \n   }\n}\n

Update your configuration file and apply the new configuration file

Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :

Press the Sign-In Anonymously button.

Then, choose the settings in the menu at the upper right corner

Choose the System in the settings control panel.

Then choose User containers

This screen show you the hostname.

You can read the hostname. In the example the hostname is f097ab7aac57, from the container id.

Using a shell, run the command docker ps -a

docker ps -a\n

Find a running container with the containerid previously identified.

In this example the containerid is f097ab7aac57

f097ab7aac57   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   8 minutes ago    Up 8 minutes               4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp   g-06b686a5-c98d-4889-b73d-3455f692e6c2\n

Run the command docker inspect CONTAINERID, replace the string CONTAINERID with your container id value.

For example docker inspect f097ab7aac57

docker inspect f097ab7aac57\n

Locate the Mounts description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and

 \"Mounts\": [\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/tmp\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            },\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/home/balloon\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            }\n        ],\n\n

When the anonymous container is removed, the anonymous home directory is deleted.

Great, you have check how the implicit Authentification configuration works.

"},{"location":"1.0/config/balloon/","title":"balloon user entry in od.config","text":"

balloon is the default generic user.

The balloon user is created inside the oc.user container

The default values are

balloon Default Values nameballoonuid4096gid4096homedirectory/home/balloon

If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"1.0/config/controllers/","title":"Controllers","text":""},{"location":"1.0/config/controllers/#controllers_1","title":"Controllers","text":"

abcdesktop.io use a Model\u2013view\u2013controller (usually known as MVC) is a software design pattern commonly used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.

Controller Description AccountingController accounting data json and ebnf format AuthController authenticate user ComposerController CRUD main services (like createDesktop, runApplication) CoreController get configuration and user message info ManagerController manage pyos PrinterController CRUD printer object StoreController CRUD key value data UserController retrieve user information"},{"location":"1.0/config/controllers/#access-permission","title":"Access Permission","text":"

The AccountingController and ManagerController access is protected with a source ip address filter. The access control filter is defined in a dictionary. Each dictionary entry use the controller name and with an entry permitip. The permitip is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]. If permitip is not set or the controller name is not set, all ip source address are allowed the send a request to the controller.

The controllers dictionnary is defined in the od.config file. By default the configuration permit private network defined in rfc1918 and rfc4193. Get more information about the private network.

By default others controllers access is enabled, without ip restriction.

    controllers : { \n        'AccountingController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'AuthController' :      { 'permitip': None },\n        'ComposerController' :  { 'permitip': None },\n        'CoreController' :      { 'permitip': None },\n        'ManagerController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'PrinterController' :   { 'permitip': None },\n        'StoreController' :     { 'permitip': None },\n        'UserController' :      { 'permitip': None }\n    } \n

If the source ip address is not allowed, the response is a HTTP status code 403 Forbidden

{\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
"},{"location":"1.0/config/editconfig/","title":"Edit pyos core service configuration file","text":"

Update the Pyos core service configuration file depends, if your are running abcdesktop.io on native Docker (Non-Cluster Host) or in Kubernetes mode.

This chapter 'Edit Pyos configuration file', apply only for native Docker (Non-Cluster Host), read the dedicated chapter if you are running abcdesktop.io with a kubernetes cluster.

"},{"location":"1.0/config/editconfig/#edit-pyos-code-service-configuration-file-in-docker-mode","title":"Edit Pyos code service configuration file in docker mode","text":""},{"location":"1.0/config/editconfig/#requirements","title":"Requirements","text":""},{"location":"1.0/config/editconfig/#download-sample-configuration-file","title":"Download sample configuration file","text":"

Create a directotry named abcdesktop in your home directory.

cd\nmkdir -p abcdesktop\n

To edit you configuration file in abcdesktop.io docker mode, download the sample configuration file and save it as od.config where docker-compose.yml file is located.

Download sample configuration file od.config then rename the od.config.reference file as od.config

"},{"location":"1.0/config/editconfig/#stop-your-docker-compose","title":"Stop your docker-compose","text":"
 docker-compose down\n

You should read on the standart output

Removing open_nginx_1     ... done\nRemoving open_pyos_1      ... done\nRemoving open_memcached_1 ... done\nRemoving open_speedtest_1 ... done\nRemoving open_mongodb_1   ... done\nNetwork netuser is external, skipping\nNetwork netback is external, skipping\n
"},{"location":"1.0/config/editconfig/#edit-your-docker-composeyml","title":"Edit your docker-compose.yml","text":"

Edit your docker-compose.yml to add a volumes entry to pyos services

Example : My working directory is /home/alex/abcdesktop

Add the new entry in volumes

 volumes:\n      - /home/alex/abcdesktop/od.config:/var/pyos/od.config\n

For example, the docker-compose.yml contains

version: '3'\nservices:\n  pyos:\n    depends_on:\n      - memcached\n      - mongodb\n    image: 'abcdesktopio/oc.pyos'\n    networks:\n      - netback\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n      - /home/alex/abcdesktop/od.config:/var/pyos/od.config\n  speedtest:\n    image: 'abcdesktopio/oc.speedtest'\n    networks:\n      - netuser\n  nginx:\n    depends_on:\n      - memcached\n      - pyos\n    image: 'abcdesktopio/oc.nginx'\n    ports:\n      - '80:80'\n      - '443:443'\n    networks:\n      - netuser\n      - netback\n  memcached:\n    image: memcached\n    networks:\n      - netback\n  mongodb:\n    image: mongo\n    networks:\n      - netback\nnetworks:\n  netuser:\n    driver: bridge\n  netback:\n    internal: true\n
"},{"location":"1.0/config/editconfig/#edit-your-configuration-file","title":"Edit your configuration file","text":"

Now, it's time to make a change in your od.config file.

Download the od.config file and save it to your abcdesktop local directory.

To make change, edit your own od.config file

vim od.config \n

Change the defaultbackgroundcolors in the desktop options.

Locate the line desktop.defaultbackgroundcolors and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'

desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF',  '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n

Save your local oc.config file.

Run your docker-compose

To restart your docker-compose, run the command

 docker-compose up\n

When the od.config change, od.py reload this configuration file automatically.

You should read at the standard ouput of docker-compose

Starting abcdesktop_speedtest_1 ... done\nStarting abcdesktop_mongodb_1   ... done\nStarting abcdesktop_memcached_1 ... done\nStarting abcdesktop_openldap_1  ... done\nStarting abcdesktop_pyos_1      ... done\nStarting abcdesktop_nginx_1     ... done\n[ lines cut here ]\n
"},{"location":"1.0/config/editconfig/#check-that-the-new-colors-are-painted-in-front","title":"Check that the new colors are painted in front :","text":"

Open the url http://localhost, in your web browser, to start a simple abcdesktop.io container.

http://localhost\n

You should see the abcdesktop.io home page.

Press the Sign-in Anonymously, have look

At the right top corner, click on the menu and choose Settings, then click on Screen Colors

Choose your colors and you should have it as background color :

Great, you can easily update your configuration file od.config. We will make some changes during the next exercices.

"},{"location":"1.0/config/frontjs/","title":"dock configuration in od.config","text":""},{"location":"1.0/config/frontjs/#menu-setting","title":"Menu Setting","text":"

The menu can be changed using the dictionnary object menuconfig

menuconfig : {\n    'settings'  : True, \n    'appstore'  : True, \n    'screenshot'    : True, \n    'download'  : True, \n    'logout'        : True, \n    'disconnect'    : True \n}\n
"},{"location":"1.0/config/frontjs/#default-dock-config","title":"default dock config","text":"

The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock option is a dictionnary read by the front web as a json object.

docker entry Descriptions filemanager FileManager application terminal Terminal application webshell HTML 5, terminal application based on xterm.js webshorcut Web browser url launch inside the container
dock : {       \n    'filemanager':  {       'args': None,\n                            'showinview': u'dock',\n                            'name': u'FileManager',\n                            'keyword': u'files,file manager',\n                            'launch': u'nautilus.Nautilus',\n                            'displayname': u'FileManager',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,office',\n                            'id': u'filemanager.d',\n                            'icon': u'pantheon-files-icons.svg' },\n    'terminal':     {       'args': '',\n                            'name': u'TerminalBuiltin',\n                            'keyword': u'terminal,shell,bash,builtin,pantheon',\n                            'launch': u'qterminal.qterminal',\n                            'displayname': u'Terminal Builtin',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,development',\n                            'id': u'terminalbuiltin.d',\n                            'hideindock': True,\n                            'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n    'webshell':     {       'name': u'WebShell',\n                            'keyword': u'terminal,shell,webshell,bash',\n                            'launch': u'frontendjs.webshell',\n                            'displayname': u'Web Shell',\n                            'execmode': u'frontendjs',\n                            'cat': u'utilities,development',\n                            'id': u'webshell.d',\n                            'icon': u'webshell.svg' }\n}\n
"},{"location":"1.0/config/frontjs/#additional-applications","title":"Additional applications","text":"

This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' } add

'webshortcut':  {   'name': u'xlogo',\n                    'showinview': u'dock',\n                    'keyword': u'xlogo',\n                    'execmode': u'builtin',\n                    'launch': u'/usr/bin/xlogo',\n                    'displayname': u'xlogo',\n                    'execmode': u'builtin',\n                    'cat': u'utilities',\n                    'id': u'xlogo.d',\n                    'icon': u'xlogo.svg',\n                    'hideindock': False,\n                    'args': '' \n}\n
"},{"location":"1.0/config/host_config/","title":"host_config resource description","text":"

host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

The same host_config format is reused in a multiple configuration files. host_config is present in applist.json file to build application image, and in od.config to set default running values in desktop and in application.

For example you can set low cpu and memory values to an application like the great X11 xeyes.

{   \n    \"mem_limit\":  \"32M\", \n    \"shm_size\":   \"OM\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n
"},{"location":"1.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period int The length of a CPU period in microseconds. cpu_quota int Microseconds of CPU time that the container can get in a CPU period. cpu_shares int CPU shares relative weight. cpuset_cpus str CPUs in which to allow execution 0 3 0 1 . cpuset_mems str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules list A list of cgroup rules to apply to the container. device_read_bps bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops IO per second Limit read rate from a device. device_write_bps bytes per second Limit write rate from a device. device_write_iops IO per second Limit write rate from a device. devices list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode str Set the IPC mode for the container. mem_limit float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation float or str Memory soft limit mem_swappiness int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable bool Whether to disable OOM killer. oom_score_adj int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size str or int Size of /dev/shm e.g. 1G. cap_add list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}for example to permit the call ptrace: SYS_PTRACE, trace arbitrary processes using ptrace, and SYS_ADMIN, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop list of str Drop kernel capabilities. dns list Set custom DNS servers. dns_opt list Additional options to be added to the container\u2019s resolv.conf file dns_search list DNS search domains. extra_hosts dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add list List of additional group names and/or IDs that the container process will run as. isolation str Isolation technology to use. Default: None. pid_mode str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged bool Give extended privileges to this container. security_opt list A list of string values to customize labels for MLS systems such as SELinux. storage_opt dict Storage driver options per container as a key value mapping. sysctls dict Kernel parameters to set in the container. ulimits list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode str Sets the UTS namespace mode for the container. Supported values are: host runtime str Runtime to use with this container. network_mode str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"1.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"1.0/config/host_config/#auto_remove","title":"auto_remove","text":"

The auto_remove is use to remove or not remove an abcdesktop container application or desktop.

For example, when an application container is exited, do we need to remove the container, by running the docker rm command ?

By default the auto_remove is True. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False. Set this value to False only to troubleshoot an application.

In production this value MUST be set to True

"},{"location":"1.0/config/host_config/#cpu_period-cpu_quota","title":"cpu_periodcpu_quota","text":"

cpu_period Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.

cpu-quota impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.

"},{"location":"1.0/config/host_config/#privileged","title":"privileged","text":"

The privileged option runs a user container in privileged mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.

"},{"location":"1.0/config/host_config/#ipc_mode","title":"ipc_mode","text":"

The ipc_mode value is a string, the default value is 'shareable'. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.

value description '' Use daemon default. 'none' Own private IPC namespace. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system IPC namespace.

If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"1.0/config/host_config/#security_opt","title":"security_opt","text":"

The securityopt option allow to set the security_opt default value for a docker application container. security_opt is the docker parameter.

Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.

Syscall Description acct Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT. add_key Prevent containers from using the kernel keyring, which is not namespaced. bpf Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN. clock_adjtime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clock_settime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clone Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN for CLONE_* flags, except CLONE_USERNS. create_module Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE. delete_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. finit_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. get_kernel_syms Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. init_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. ioperm Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. iopl Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. kcmp Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. kexec_file_load Sister syscall of kexec_load that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT. kexec_load Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT. keyctl Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN. mbind Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. mount Deny mounting, already gated by CAP_SYS_ADMIN. move_pages Syscall that modifies kernel memory and NUMA settings. name_to_handle_at Sister syscall to open_by_handle_at. Already gated by CAP_DAC_READ_SEARCH. nfsservctl Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH. perf_event_open Tracing/profiling syscall, which could leak a lot of information on the host. personality Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root Deny pivot_root, should be privileged operation. process_vm_readv Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. process_vm_writev Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. ptrace Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE, because it could leak a lot of information on the host. query_module Deny manipulation and functions on kernel modules. Obsolete. quotactl Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN. reboot Don't let containers reboot the host. Also gated by CAP_SYS_BOOT. request_key Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. setns Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN. settimeofday Time/date is not namespaced. Also gated by CAP_SYS_TIME. stime Time/date is not namespaced. Also gated by CAP_SYS_TIME. swapon Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. swapoff Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. sysfs Obsolete syscall. _sysctl Obsolete, replaced by /proc/sys. umount Should be a privileged operation. Also gated by CAP_SYS_ADMIN. umount2 Should be a privileged operation. Also gated by CAP_SYS_ADMIN. unshare Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN, with the exception of unshare --user. uselib Older syscall related to shared libraries, unused for a long time. userfaultfd Userspace page fault handling, largely needed for process migration. ustat Obsolete syscall. vm86 In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN. vm86old In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN.

Read security_opt from the docker website.

"},{"location":"1.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilities cap_addcap_drop","text":"

This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :

securityContext:\n      capabilities:\n        desktop.capabilities\n

For example

    { \n        'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n    }\n

Permit a container to call ptrace:

Read the docker run command informations Docker run reference

By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.

Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.

Further reference information is available on the capabilities(7) - Linux man page

Set this value only to troubleshoot an application.

In production this value MUST be set to an empty dict {}

"},{"location":"1.0/config/jira/","title":"JIRA configuration","text":"

abcdesktop.io support JIRA

"},{"location":"1.0/config/jira/#jira-option","title":"JIRA option","text":"

In od.config add the jira option. jira option is a dictionary with the entries :

entry sample value \u00a0\u00a0 url https://domainexample.atlassian.net/ project_id ABCD username account@domain.local apikey XXXXXXXXXXXXXXXXXXXX

And fill the dictionary

jira : { \n            'url':          'https://domainexample.atlassian.net/',\n            'project_id':   'ABCD',\n            'username':     'account@domain.local',\n            'apikey' :      'XXXXXXXXXXXXXXXXXXXX' }\n

Then apply the new configuration file od.config by retrasting the daemon.

When jira option is set, a new icon issue appears at the top.

Click on the issue icon, a new window is appear.

Fill Summary and Your Report values

Then press the Send button. A notification message appears on the left top corner.

Log into your jira server, and check your backlog

Great you added a new issue tracking.

"},{"location":"1.0/config/language/","title":"Language entry in od.config","text":"

The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US

"},{"location":"1.0/config/language/#language-in-abcdesktopio-ocuser","title":"Language in abcdesktop.io oc.user","text":"

The language list must match with the oc.user local packages all ready installed.

If the language is not found, the default value is set to en_US

The oc.user.18.04 is built-in with the default language package :

apt-get install -y \\\n    language-pack-en \\\n    language-pack-fr \\\n    && locale-gen    \\\n    && apt-get clean\n

The full supported language list is set by default

language : [  'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n

This list must match with the Accept-Language request HTTP header.

"},{"location":"1.0/config/language/#language-in-abcdesktopio-applications","title":"Language in abcdesktop.io Applications","text":"

abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language request HTTP header. If the language is not found, the default value is set to en_US.

Hands-on:

Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.

"},{"location":"1.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language to en_US :","text":"

The launch LibreOffice Writer. The menu is set to en_US LibreOffice Writer use English/US en_US language.

"},{"location":"1.0/config/language/#set-the-web-browsers-default-language-to-fr_fr","title":"Set the web browser's default language to fr_FR :","text":"

You can keep the same abcdesktop.io users session, you do not need to logout.

The launch LibreOffice Writer. The menu is set to fr_FR LibreOffice Writer use French fr_FRlanguage.

Great you have change the language settings of applications running inside an abcdesktop docker container

"},{"location":"1.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"1.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"

By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.

Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:

sudo vi /etc/rsyslog.conf\n

Uncomment the following lines and save file :

module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n

"},{"location":"1.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"

Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:

sudo systemctl restart rsyslog\n

"},{"location":"1.0/config/logging/","title":"Logging configuration in od.config","text":"

The logging configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.

logging dict use the python logging module logging module

The syslog and graylog protocol messaging are supported too.

The default features for each handlers are :

handler Features console log message using a logging.StreamHandler to the stream: ext://sys.stdout formated as standard cherrypy_console log message using a logging.StreamHandler to the stream: ext://sys.stdout formatted as access cherrypy_access log message using a logging.StreamHandler to the file stream logs/access.log formatted as access cherrypy_trace log message using a logging.StreamHandler to the stream: logs/trace.log formatted as standard

Sub modules used by od.py can log information too.

Sub module Default Values docker.utils.config{ 'level': 'INFO' },urllib3.connectionpool{ 'level': 'ERROR'},

The logging sample configuration :

#              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
"},{"location":"1.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"1.0/config/stack/#stackmode","title":"stack.mode","text":"

stack.mode describes how abcdesktop.io can manage user's containers and application.

stack.mode Description standalone Use a dockerd only, this is for personal usage kubernetes Use a kubernetes services"},{"location":"1.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"

stack.kubernetesdefaultdomain is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes.

The default value is abcdesktop.svc.cluster.local

If option value mongodb or memcached are set, the values are NOT overridden, and keep unchanged.

If option value mongodb or memcached are set to None (by default), then stack.kubernetesdefaultdomain is used to complete the FQDN of mongodb and memcached servers name. This value is concatenated to the server hostname.

Hostname FQDN mongodbmongodb.abcdesktop.svc.cluster.localmemcachedmemcached.abcdesktop.svc.cluster.local

The dns resolution need a running core-dnsis the namespace kube-system

stack.kubernetesdefaultdomain is used also if desktop.desktopuseinternalfqdn: True

The pod name FQDN is built using the $podid.desktop.$stack.kubernetesdefaultdomain

For example, by default :

c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local

"},{"location":"1.0/config/syslog/","title":"Syslog configuration in od.config","text":""},{"location":"1.0/config/syslog/#add-syslog-server-support","title":"Add syslog server support","text":"
   'filters': [ 'odcontext' ],\n

syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.

syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.

"},{"location":"1.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"

Those running linux can simply modify their syslog configuration file following linux syslog config steps

For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :

docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
[2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
"},{"location":"1.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"

To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)

"},{"location":"1.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"

In handlers entry add the following lines:

        ,\n        'syslog': {\n          'class': 'logging.handlers.SysLogHandler',\n          'filters': [ 'odcontext' ],\n          'formatter': 'syslog',\n          'socktype': 2,\n          'address' : [ '192.168.0.52', 514 ]\n        }\n

Replace 192.168.0.52 ip address by your local IP Addresse.

You can get your local IP address using the following command:

hostname -I | cut -d ' ' -f1\n
"},{"location":"1.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"

In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog' handler in handlers list:

        '': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'INFO'\n        }\n\n       'cherrypy.error': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'ERROR',\n          'propagate': False\n        }\n
"},{"location":"1.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"
#              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    },\n    'syslog': {\n       'class': 'logging.handlers.SysLogHandler',\n       'filters': [ 'odcontext' ],\n       'formatter': 'syslog',\n       'socktype': 2,\n       'address' : [ '192.168.0.52', 514 ]\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
"},{"location":"1.0/config/syslog/#restart-pods","title":"Restart Pods","text":"

To restart Pods, we will delete and recreate all pods

"},{"location":"1.0/config/syslog/#delete-pods","title":"Delete pods","text":"

To delete pods, execute the following command:

kubectl delete -f abcdesktop.yaml\n
"},{"location":"1.0/config/syslog/#create-pods","title":"Create pods","text":"

To create pods, execute the following command:

kubectl create -f abcdesktop.yaml\n
"},{"location":"1.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"

At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:

tail /var/log/syslog\n

If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.

"},{"location":"1.0/config/webrtc/","title":"Sound server configuration","text":"

By default abcdesktop use the module-http-protocol-tcp from pulseaudio sound server to send wav data to the web browser

"},{"location":"1.0/config/webrtc/#pulseaudio-http-stream-by-default","title":"pulseaudio http stream (by default)","text":"

By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)

In terminal webshell run the command :

pactl -s /tmp/.pulse.sock list short modules\n
balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
"},{"location":"1.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"

To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)

abcdesktop update the pulseaudio configuration, and add module-rtp-send. The module-rtp-send pusleaudio send to the destination_ip (in this example 1.2.3.4)

pactl -s /tmp/.pulse.sock list short modules\n
balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0       module-augment-properties\n1       module-null-sink        sink_name=rtp  format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2       module-native-protocol-unix     auth-group=balloon socket=/tmp/.pulse.sock\n3       module-always-sink\n4       module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n

The sink_name is rtp, and the source for the module-rtp-send is rtp.monitor.

The default source is rtp.monitor

Source #\n        State: RUNNING\n        Name: rtp.monitor\n        Description: Monitor of RTP Multicast Sink\n        Driver: module-null-sink.c\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Owner Module: 5\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Base Volume: 65536 / 100% / 0.00 dB\n        Monitor of Sink: rtp\n        Latency: 0 usec, configured 160000 usec\n        Flags: DECIBEL_VOLUME LATENCY \n        Properties:\n                device.description = \"Monitor of RTP Multicast Sink\"\n                device.class = \"monitor\"\n                device.icon_name = \"audio-input-microphone\"\n        Formats:\n                pcm\n

The default output is

\nSource Output #0\n        Driver: module-rtp-send.c\n        Owner Module: 9\n        Client: n/a\n        Source: 4\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n        Corked: no\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Buffer Latency: 0 usec\n        Source Latency: 0 usec\n        Resample method: n/a\n        Properties:\n                media.name = \"RTP Monitor Stream\"\n                rtp.source = \"0.0.0.0\"\n                rtp.destination = \"1.2.3.4\"\n                rtp.mtu = \"1280\"\n                rtp.port = \"5119\"\n                rtp.ttl = \"1\"\n

By default, the format is pcm

Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n

To change the default format update the values in od.config file.

 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n

To get the 'audiopt' and 'audiortpmap' values, read the web pages

"},{"location":"1.0/config/webrtc/#requirements","title":"Requirements","text":""},{"location":"1.0/config/webrtc/#install-a-janus-server","title":"Install a janus server","text":""},{"location":"1.0/config/webrtc/#install-janus","title":"Install janus","text":"

Install a janus service from meetecho.com on a server

apt-get install janus\n
"},{"location":"1.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"

Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.

certificates: {\n    cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n    cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n    cert_pwd = \"secretpassphrase\"\n}\n
"},{"location":"1.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"

Update the od.config file, for example :

# WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
"},{"location":"1.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"

webrtc.enable is a boolean. The default value is False. Set this value to True to enable webrtc services for pulseaudio.

"},{"location":"1.0/config/webrtc/#webrtcserver","title":"webrtc.server","text":"

webrtc.server is a dict. The default value is None. Set all dictionnary values to enable webrtc access for pulseaudio and for the web browser client.

The hostip value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.

'hostip': '1.2.3.4'\n

The host value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn. This fqdn is used by the web browser.

webrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
"},{"location":"1.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"1.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"

The http request path is /API/manager

Path Params Response type /API/manager/buildapplist None Json object /API/manager/updateactivedirectorysite None Json object /API/manager/garbagecollector expirein=, force=False Json object"},{"location":"1.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"

buildapplist ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps. abcdesktop.io

Params Type Description None None None

example :

curl http://localhost/API/manager/buildapplist\n

Return the complete array if json images objects ready to run.

{\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
"},{"location":"1.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None

example :

curl http://localhost/API/manager/updateactivedirectorysite\n
"},{"location":"1.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein integer number in seconds since the container create date time force boolean garbage the container even if a user is connected

example :

curl \"http://localhost/API/manager/garbagecollector?expirein=9473\"\ncurl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"\n
"},{"location":"1.0/setup/k8smacosinstallation/","title":"MacOS/X Kubernetes","text":""},{"location":"1.0/setup/k8smacosinstallation/#enable-kubernetes-on-macosx","title":"Enable Kubernetes on MacOS/X","text":"

Click on the Docker icon in MacOS/X menu bar.

Then choose Preferences...

The following window should appear :

Choose Kubernetes, then check the Enable Kubernetes

Kubernetes stay in Starting state during few minutes. Please wait to download all container images and for kubernetes installation process.

On the bottom you should read next Docker Running Kubernetes Running

Great, you have installed Kubernetes on MacOS/X.

"},{"location":"1.0/setup/k8smacosinstallation/#run-the-new-kubectl-command","title":"Run the new kubectl command","text":"

Open a Terminal, then run the command kubectl version

% kubectl version\nClient Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:16:51Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"darwin/amd64\"}\nServer Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:07:57Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"linux/amd64\"}\n

Run the command kubectl get pods

% kubectl get pods\nNo resources found.\n

Great, the kubectl command works. It's time to deploy abcdesktop.io

"},{"location":"1.0/setup/k8swindows10installation/","title":"Windows 10 Kubernetes Installation","text":""},{"location":"1.0/setup/k8swindows10installation/#enable-kubernetes-on-windows-10","title":"Enable Kubernetes on Windows 10","text":"

Click on the Docker Desktop icon in the windows tray.

The following menu should appear, choose Settings :

The following window should appear :

Choose Kubernetes, then check the Enable Kubernetes

Press the Apply and Restart button. Please wait to download all container images and for kubernetes installation process.

On the bottom you should read next Docker Running and Kubernetes Running.

Great, you have installed Kubernetes on Windows 10.

"},{"location":"1.0/setup/k8swindows10installation/#run-the-new-kubectl-command","title":"Run the new kubectl command","text":"

Open a Terminal cmd.exe, then run the command kubectl version

Client Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:16:51Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"windows/amd64\"}\nServer Version: version.Info{Major:\"1\", Minor:\"15\", GitVersion:\"v1.15.5\", GitCommit:\"20c265fef0741dd71a66480e35bd69f18351daea\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T19:07:57Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"linux/amd64\"}\n

Run the command kubectl get pods

kubectl get pods\nNo resources found.\n

Great, the kubectl command works. It's time to deploy abcdesktop.io

"},{"location":"1.0/setup/kubernetes_secure_etcd/","title":"Secure Etcd secrets database","text":"

This chapter is optional you can skip it if you think that's your kubernetes etcd database access is secured.

Etcd secrets database is the place where all k8s secrets are stored. By default secrets are stored in plain text. If an attacker can access Etcd database, he know then all your secrets.

To secure secrets, we will crypt them at API server level. All secrets will be stored encrypted in Etcd and then be uncrypted at API server level when accessed by Kubernetes.

"},{"location":"1.0/setup/kubernetes_secure_etcd/#availbale-encryption-providers","title":"Availbale Encryption Providers","text":"

Here are officials available encryption providers (Kubernetes Official page ):

Providers for Kubernetes encryption at restNameEncryptionStrengthSpeedKey LengthOther ConsiderationsidentityNoneN/AN/AN/AResources written as-is without encryption. When set as the first provider, the resource will be decrypted as new values are written.aescbcAES-CBC with PKCS#7 paddingStrongestFast32-byteThe recommended choice for encryption at rest but may be slightly slower than secretbox.secretboxXSalsa20 and Poly1305StrongFaster32-byteA newer standard and may not be considered acceptable in environments that require high levels of review.aesgcmAES-GCM with random nonceMust be rotated every 200k writesFastest16, 24, or 32-byteIs not recommended for use except when an automated key rotation scheme is implemented.kmsUses envelope encryption scheme: Data is encrypted by data encryption keys (DEKs) using AES-CBC with PKCS#7 padding, DEKs are encrypted by key encryption keys (KEKs) according to configuration in Key Management Service (KMS)StrongestFast32-bytesThe recommended choice for using a third party tool for key management. Simplifies key rotation, with a new DEK generated for each encryption, and KEK rotation controlled by the user.

aesgcm provider seem's a bit complex to be used. kms provider needs to use a dedicated container and will not work out of the box. For abcdesktop we will use aescbc provider

"},{"location":"1.0/setup/kubernetes_secure_etcd/#aescbc-encryption-configuration","title":"aescbc encryption configuration","text":""},{"location":"1.0/setup/kubernetes_secure_etcd/#create-configuration-directory","title":"create configuration directory","text":"

In /etc/kubernetes directory, create a directory named aescbc:

sudo mkdir /etc/kubernetes/aescbc\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#create-configuration-file","title":"Create configuration file","text":"

Create aescbc yaml configuration file:

sudo vi /etc/kubernetes/aescbc/encrypt_config.yaml\n
apiVersion: apiserver.config.k8s.io/v1\nkind: EncryptionConfiguration\nresources:\n  - resources:\n    - secrets\n    providers:\n    - aescbc:\n        keys:\n        - name: key1\n          secret: vKZm8oL19mucMS8qKXW4P9wSpab5H7LrLtOOPUUcvQk=\n    - identity: {}\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#change-secret-key","title":"Change secret key","text":"

Secret key can be generated using the following command:

head -c 32 /dev/urandom | base64\n

In encrypt_config.yaml, replace secret for key1 in aescbc.keys section

"},{"location":"1.0/setup/kubernetes_secure_etcd/#change-rights-on-directory-and-file","title":"Change rights on directory and file","text":"

As the encryption key is also the key that will uncrypt Etcd, we will try to protect it as much as possible by changing rights on directory and file:

sudo chmod -R 600 /etc/kubernetes/aescbc\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#configure-kubernetes-api-server","title":"Configure Kubernetes Api Server","text":"

Encryption will be done at Kubernetes Api Server level. We will now configure this server to crypt secrets

"},{"location":"1.0/setup/kubernetes_secure_etcd/#configure-kube-apiserveryaml","title":"configure kube-apiserver.yaml","text":"

Edit kube-apiserver.yaml configuration file:

vim /etc/kubernetes/manifests/kube-apiserver.yaml\n

In spec.containers.command section add:

    - --encryption-provider-config=/etc/kubernetes/aescbc/encrypt_config.yaml\n

In spec.containers.volumeMounts section add:

    - mountPath: /etc/kubernetes/aescbc\n      name: aescbc-config\n      readOnly: true\n

In spec.volumes section add:

  - hostPath:\n      path: /etc/kubernetes/aescbc\n      type: DirectoryOrCreate\n    name: aescbc-config\n

save the file

"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-api-server","title":"verify api server","text":"

When saving file, Kubernetes will detect changes and restart Api Server. This can be verified using the following command:

kubectl -n kube-system get pods\n
NAME                             READY   STATUS    RESTARTS   AGE\ncoredns-66bff467f8-69b8r         1/1     Running   0          21h\ncoredns-66bff467f8-74j9n         1/1     Running   0          21h\netcd-cube05                      1/1     Running   0          21h\nkube-apiserver-cube05            1/1     Running   0          6s\nkube-controller-manager-cube05   1/1     Running   1          21h\nkube-flannel-ds-amd64-p9xhq      1/1     Running   0          20h\nkube-proxy-8xk5g                 1/1     Running   0          21h\nkube-scheduler-cube05            1/1     Running   1          21h\n

At this state, all created secrets will be crypted in etcd

"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secrets-encryption","title":"Verify secrets encryption","text":""},{"location":"1.0/setup/kubernetes_secure_etcd/#create-a-secret","title":"Create a secret","text":"
kubectl create secret generic secret1 -n default --from-literal=mykey=mydata\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secret-creation","title":"Verify secret creation","text":"
sudo kubectl -n default describe secret secret1\n
Name:         secret1\nNamespace:    default\nLabels:       <none>\nAnnotations:  <none>\n\nType:  Opaque\n\nData\n====\nmykey:  6 bytes\n
"},{"location":"1.0/setup/kubernetes_secure_etcd/#verify-secret-encryption","title":"Verify secret encryption","text":"

To verify secret encryption we will install etcd client package

apt-get install etcd-client\n

Run the following command:

ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \\\n--cert=/etc/kubernetes/pki/etcd/ca.crt --key=/etc/kubernetes/pki/etcd/ca.key \\\n--endpoints=https://localhost:2379 get /registry/secrets/default/secret1\n

Output will appear with the following text k8s:enc:aescbc:v1:key1: followed by binary values.

Secrets are now encoded with aescbc v1 provider using key1

"},{"location":"1.0/setup/novnc/","title":"Use noVNC as VNC Client","text":""},{"location":"1.0/setup/novnc/#requirements","title":"Requirements","text":"

AbcDeskopio use the amazing projet noVNC. noVNC is a VNC client JavaScript library. Before you start using noVNC get some information about it:

"},{"location":"1.0/setup/novnc/#novnc-description","title":"noVNC description","text":"

noVNC is an open source VNC client. noVNC is both a VNC client JavaScript library as well as an application built on top of that library. noVNC runs well in any modern browser including mobile browsers (iOS and Android). Many companies, projects and products have integrated noVNC including OpenStack, OpenNebula, LibVNCServer, and ThinLinc. See the Projects and Companies wiki page for a more complete list with additional info and links.

"},{"location":"1.0/setup/novnc/#browser-requirements","title":"Browser Requirements","text":"

noVNC uses many modern web technologies so a formal requirement list is not available. However these are the minimum versions we are currently aware of:

"},{"location":"1.0/setup/novnc/#features","title":"Features","text":""},{"location":"1.0/setup/novnc/#create-a-shared-volume-myshared","title":"Create a shared volume myshared","text":"

Before creating containers, we need a shared volume, to share data and unix socket between containers. Run the docker volume create command.

docker volume create myshared \n
"},{"location":"1.0/setup/novnc/#start-the-first-container-myx11server","title":"Start the first container myx11server","text":"

Start the first graphical container named myx11server and forward the tcp port 6081 to the 6081 container tcp port.

Note: We do not need the default 5900 VNC tcp port any more.

docker run -it -v myshared:/tmp --name myx11server -p 6081:6081 ubuntu:latest bash\n\n

You should see a prompt like :

root@6de36e574877:/#\n

Install the package wget Install the library files for tigervnc.

Package list:

Those packages are used by tigervnc. We need to install them.

apt-get update\napt-get install -y wget\napt-get install -y libx11-6 xkb-data x11-xkb-utils xauth libfile-readbackwards-perl netbase libaudit1 libbsd0 libgcrypt20 libgl1 libgnutls30 libjpeg8 libpam0g libpixman-1-0 libselinux1 libstdc++6 libsystemd0 libunwind8 libxau6 libxdmcp6 libxfont2 zlib1g libgl1-mesa-dri xfonts-base x11-xserver-utils xfonts-100dpi xfonts-scalable \n

Download the last tigervnc X11 graphics server from the bintray.com web site

 wget \"https://bintray.com/tigervnc/stable/download_file?file_path=tigervnc-1.10.1.x86_64.tar.gz\" -O tigervnc-1.10.1.x86_64.tar.gz\n

Untar the tigervnc-1.10.1.x86_64.tar.gz file in the container's root file system

cd /\ntar -xvf tigervnc-1.10.1.x86_64.tar.gz\ncp -r /tigervnc-1.10.1.x86_64/usr/* /usr/\n

Start the tigervnc release 1.10. The tigervnc release 1.10 support the option rfbunixpath used by ws-tcp-bridge in next section

Xvnc :0 -rfbunixpath /tmp/.x11vnc -SecurityTypes=none &\n

You should read the output

Xvnc TigerVNC 1.10.0 - built Dec 20 2019 07:12:07\nCopyright (C) 1999-2019 TigerVNC Team and many others (see README.rst)\nSee https://www.tigervnc.org for information on TigerVNC.\nUnderlying X server release 12001000, The X.Org Foundation\n\n\nTue Mar  3 11:05:48 2020\n vncext:      VNC extension running!\n vncext:      Listening for VNC connections on /tmp/.x11vnc (mode 0600)\n vncext:      created VNC server for screen 0\n

Check that the Xvnc TigerVNC release is 1.10.0.

Great, you have installed an X11 server inside a docker container, and the Xvnc server is listening for VNC connections on /tmp/.x11vnc.

"},{"location":"1.0/setup/novnc/#install-the-ws-tcp-bridge","title":"Install the ws-tcp-bridge","text":"

ws-tcp-bridge translate websocket to tcp and have to listen on websocket tcp port 6081 and forward to local unix socket unix:/tmp/.x11vnc.

ws-tcp-bridge is a nodejs server, then we need to install nodejs and npm.

Before, install the package gcc g++ make curl

apt-get install -y gcc g++ make curl \n

Install nodejs and npm

curl -sL https://deb.nodesource.com/setup_13.x | bash -\n
apt-get install -y nodejs\n

Install ws-tcp-bridge

npm install ws-tcp-bridge -g\n

Start ws-tcp-bridge with the parameters --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc in background

Add the & at the end of the command line to run this process in background

/usr/bin/ws-tcp-bridge --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc &\n

You should read on the standard output

proxy mode ws -> tcp\nforwarding port 6081 to unix:/tmp/.x11vnc\n

Great, ws-tcp-bridge is running and forward websocket to Xvnc unix socket

"},{"location":"1.0/setup/novnc/#get-the-ip-address-on-your-first-container-myx11server","title":"Get the ip address on your first container myx11server","text":"

On the container myx11server, to get the container local IP Address, install the package net-tools package

apt-get install -y net-tools\n

And run the ifconfig command

ifconfig eth0\neth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500\n        inet 172.17.0.2 netmask 255.255.0.0  broadcast 172.17.255.255\n        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)\n        RX packets 65149  bytes 95569807 (95.5 MB)\n        RX errors 0  dropped 0  overruns 0  frame 0\n        TX packets 20880  bytes 1159982 (1.1 MB)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n

Write here the ip address of your container myx11server:

IP Address of myx11server _ . . _ .

"},{"location":"1.0/setup/novnc/#create-a-new-container-webserver","title":"Create a new container webserver","text":"

Open a new shell window and start a new docker container named mywebserver, forward the tcp port 80 to the container tcp port 80.

docker run -it --name mywebserver -p 80:80 ubuntu:latest\n

You should see a prompt like:

root@96df62a73e4f:/# \n

Install nginx webserver, run the command

apt-get update\napt-get install -y nginx-extras\n

Install the git and vim package, run the command

apt-get install -y git vim\n

Clone the novnc git on github.com, inside the nginx's root directory.

cd /var/www/html\ngit clone https://github.com/novnc/noVNC.git\n

You should read on the standart output

Cloning into 'noVNC'...\nremote: Enumerating objects: 26, done.\nremote: Counting objects: 100% (26/26), done.\nremote: Compressing objects: 100% (21/21), done.\nremote: Total 10395 (delta 8), reused 13 (delta 5), pack-reused 10369\nReceiving objects: 100% (10395/10395), 9.01 MiB | 7.15 MiB/s, done.\nResolving deltas: 100% (7310/7310), done.\n

Start the nginx web server

nginx\n

The web server nginx is running in backgound.

Great, nginx web server is running, now we need to configure the proxy pass rule with the myx11server container's ip address.

"},{"location":"1.0/setup/novnc/#check-that-the-container-webserver-can-ping-the-container-myx11server","title":"Check that the container webserver can ping the container myx11server","text":"

Install the ping command, run the command

apt-get install -y iputils-ping\n

Get the myx11server container's ip address write before and replace xxx.xxx.xxx.xxx with the myx11server container's ip address

ping -c 5 xxx.xxx.xxx.xxx\n

In this example, i replace xxx.xxx.xxx.xxx by 172.17.0.2

ping -c 5 172.17.0.2\nPING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.\n64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.108 ms\n64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.365 ms\n64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.206 ms\n64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.181 ms\n64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.206 ms\n\n--- 172.17.0.2 ping statistics ---\n5 packets transmitted, 5 received, 0% packet loss, time 4074ms\nrtt min/avg/max/mdev = 0.108/0.213/0.365/0.084 ms\n

The container webserver should receive package from the myx11server container

"},{"location":"1.0/setup/novnc/#edit-the-nginx-configuration-file","title":"Edit the nginx configuration file","text":"

Edit the nginx configuration file /etc/nginx/sites-enabled/default with the vim editor.

vim /etc/nginx/sites-enabled/default\n

In the server section, after the line location you should found :

    location / {\n        # First attempt to serve request as file, then\n        # as directory, then fall back to displaying a 404.\n        try_files $uri $uri/ =404;\n    }\n

Add a /websockify route to proxyfied the websocket http request to your myx11server container.

    location = /websockify {\n        proxy_buffering              off;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header Upgrade         $http_upgrade;\n        proxy_set_header Connection      \"upgrade\";\n        proxy_pass                       http://XXX.XXX.XXX.XXX:6081/;\n    }\n

You have to replace the line

proxy_pass       http://XXX.XXX.XXX.XXX:6081/;\n

by the ip address of your myx11server container, for example replace http://XXX.XXX.XXX.XXX:6081/ with http://172.17.0.2:6081/

proxy_pass       http://172.17.0.2:6081/;\n

The complete server section in the nginx file is for example

server {\n    listen 80 default_server;\n    listen [::]:80 default_server;\n\n    # SSL configuration\n    #\n    # listen 443 ssl default_server;\n    # listen [::]:443 ssl default_server;\n    #\n    # Note: You should disable gzip for SSL traffic.\n    # See: https://bugs.debian.org/773332\n    #\n    # Read up on ssl_ciphers to ensure a secure configuration.\n    # See: https://bugs.debian.org/765782\n    #\n    # Self signed certs generated by the ssl-cert package\n    # Don't use them in a production server!\n    #\n    # include snippets/snakeoil.conf;\n\n    root /var/www/html;\n\n    # Add index.php to the list if you are using PHP\n    index index.html index.htm index.nginx-debian.html;\n\n    server_name _;\n\n    location / {\n        # First attempt to serve request as file, then\n        # as directory, then fall back to displaying a 404.\n        try_files $uri $uri/ =404;\n    }\n\n    location = /websockify {\n        proxy_buffering              off;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header Upgrade         $http_upgrade;\n        proxy_set_header Connection      \"upgrade\";\n        proxy_pass           http://172.17.0.2:6081/; # change this line \n    }\n\n\n    # pass PHP scripts to FastCGI server\n    #\n    #location ~ \\.php$ {\n    #   include snippets/fastcgi-php.conf;\n    #\n    #   # With php-fpm (or other unix sockets):\n    #   fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;\n    #   # With php-cgi (or other tcp sockets):\n    #   fastcgi_pass 127.0.0.1:9000;\n    #}\n\n    # deny access to .htaccess files, if Apache's document root\n    # concurs with nginx's one\n    #\n    #location ~ /\\.ht {\n    #   deny all;\n    #}\n}\n

Now, it's time to reload your nginx configuration, by running the command

nginx -s reload\n
"},{"location":"1.0/setup/novnc/#connect-to-your-nginx-website","title":"Connect to your nginx website","text":"

Run a web browser like Google Chrome or Firefox and go to your nginx website. If you run the nginx website on a separated host replace the name with your hostname or his ip address.

Go to the URL http://localhost or the ip address of your own server

In this exercice in use localhost in the screenshot because all containers are running on my desktop, you may have to replace localhost by ip address, or the fully qualified domain name of your own server.

http://localhost\n

or

http://YOUR_SERVER_IP_ADDRESS\n

You should read the Welcome to nginx! message in your web browser

Go to the noVNC URL http://localhost/noVNC/vnc.html

http://localhost/noVNC/vnc.html\n

Remember, remplace localhost by your fully qualified domain name if need

You should read the Welcome to nginx! message in your web browser

To change the connection settings, click on the settings icon and choose Advanced You have to fill the WebSocket properties as follow:

Then, press the Connect Button

"},{"location":"1.0/setup/novnc/#install-libreoffice-as-a-docker-application","title":"Install libreoffice as a docker application","text":"

On your host, where your container myx11server is running. Open a new shell window and start a new docker container named mylibreoffice.

docker run -it -v myshared:/tmp --name mylibreoffice ubuntu:latest\n

You should see a prompt like :

root@96df62a73e4f:/# \n

To install libreoffice application, run the install libreoffice command in your mylibreoffice container.

apt-get update\napt-get install -y libreoffice\n

Run the soffice command to start Libreoffice

export DISPLAY=:0.0\nsoffice --writer\n

You should read the output

(soffice:7412): dbind-WARNING **: 16:32:03.928: Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-HN3KrNpoAq: Connection refused\n

On the web browser, the application Libreoffice Writer should appear.

Type some text data like 'Hello, I am running inside a docker container'

"},{"location":"1.0/setup/novnc/#install-the-windows-manager-openbox-on-your-myx11server-container","title":"Install the windows manager openbox on your myx11server container","text":"

To move, resize, close, the windows applications, we need a windows manager. abcdesktop is the windows manager. OpenBox is a lightweight, powerful, and highly configurable stacking window manager with extensive standards support.

Run the install openbox command in your myx11server container.

apt-get install -y openbox\n

Set the DISPLAY environment variable to :0.0 and start openbox in background

export DISPLAY=:0.0\nopenbox &\n

Now, you can move the Libreoffice windows. All windows are decorated.

Great you have installed the novnc gateway, and you just need a HTML Web browser to use a Libreoffice

"},{"location":"1.0/setup/retrieve_all_images/","title":"Get all applications for abcdesktop","text":"

Lot of application are ready to use for abcdesktop. All applications are opensource.

You can download the image list from the applist file, or run the command the pull command where $APP is the name of your application.

docker pull abcdesktopio/$APP.d\n

for example to download libreoffice calc, run the command

docker pull abcdesktopio/calc.d\n

Read the list of all applications on the application list page

"},{"location":"1.0/setup/uninstalldockermode/","title":"Uninstall abcdesktop.io for non-cluster hosts","text":""},{"location":"1.0/setup/uninstalldockermode/#commands-to-uninstall-abcdesktopio","title":"Commands to uninstall abcdesktop.io","text":"

Go to the abcdesktop directory (where the docker-compose.yml is located), and run the bash commands :

echo \"starting abcdesktop uninstall commands\"\ndocker-compose -p abcdesktop down\necho \"stop and remove abcdesktop services\"\ndocker-compose rm -s -v -f\necho \"remove all abcdesktop user container\"\ndocker ps --filter \"label=type=x11server\" -q | xargs docker stop\ndocker ps --filter \"label=type=x11server\" -q | xargs docker rm\necho \"remove all abcdesktop images\"\ndocker images --filter=reference='abcdesktopio/*:*' --format \"{{.Repository}}:{{.Tag}}\"  | xargs docker rmi\necho \"remove all user volumes\"\ndocker volume ls -f label=type=x11server -q | xargs docker volume rm\necho \"abcdesktop is uninstalled\"\n

Great, you have uninstalled abcdesktop in non-cluster hosts.

"},{"location":"1.0/setup/vnc/","title":"abcdesktop.io from scratch","text":"

The goal of this chapter is to learn how abcdesktop.io works. You should not repeat the process in production, but prefer use a Dockerfile and the docker build command.

"},{"location":"1.0/setup/vnc/#requirements","title":"Requirements","text":""},{"location":"1.0/setup/vnc/#create-a-shared-volume-myshared","title":"Create a shared volume myshared","text":"

Before creating containers, we need a shared volume, to share data and unix socket between containers. Run the docker volume create command.

docker volume create myshared \n
"},{"location":"1.0/setup/vnc/#start-the-first-container-myx11server","title":"Start the first container myx11server","text":"

Start the first graphical container named myx11server, forward the tcp port 5900 to the container.

docker run -it -v myshared:/tmp --name myx11server -p 5900:5900 ubuntu:latest bash\n\n

You should see a prompt like :

root@6de36e574877:/#\n

Install the X11 graphics server tigervnc

apt-get update\napt-get install -y tigervnc-standalone-server tigervnc-xorg-extension\n

Start the X11 graphics server tigervnc

 Xvnc :0 -SecurityTypes=none &\n

You should read the output

Xvnc TigerVNC 1.7.0 - built Dec  5 2017 09:25:01\nCopyright (C) 1999-2016 TigerVNC Team and many others (see README.txt)\nSee http://www.tigervnc.org for information on TigerVNC.\nUnderlying X server release 11905000, The X.Org Foundation\n\n\nMon Mar  2 11:43:56 2020\n vncext:      VNC extension running!\n vncext:      Listening for VNC connections on all interface(s), port 5900\n vncext:      created VNC server for screen 0\n

Great, you have installed an X11 server inside a docker container, and the Xvnc server is listening for VNC connections on the tcp port 5900. Keep this container running.

We will use the host tcp port 5900 to connect VNC Client.

"},{"location":"1.0/setup/vnc/#use-vnc-client-to-connect-to-your-first-container-myx11server","title":"Use VNC client to connect to your first container myx11server","text":"

From your host or from another host, install a VNC client. You can use your prefered VNC Client for your operating system or the RealVNC's VNC Viewer. You can download the RealVNC's VNC Client, by following the link https://www.realvnc.com/fr/connect/download/viewer/

Run the VNC Viewer, and set the hostname where the container myx11server is running. In the following example.

Here I am using VNC Viewer on Mac OS/X and I did set the hostname to localhost.

This is a getting started guide to understand how abcdesktop works, so we did not set a password to protect the VNC access. This is not the best practices guide for production installations. As we did not set a password to protect the VNC access, you have to confirm the uncrypted connection warning dialog box and then press the Continue button.

This is just an example to understand how abcdesktop works, so we did not set a password to protect the VNC access.

You need to confirm the uncrypted connection warning dialog box. Press the Continue button.

A black screen should appear :

Keep this VNC Client running, we will use this display to show our applications later.

"},{"location":"1.0/setup/vnc/#install-an-x11-application-as-a-docker-application","title":"Install an x11 application as a docker application","text":"

On your host, where your container myx11server is running. Open a new shell window and start a new docker container named myapp. The myapp container access to the volume myshared and mount it to /tmp.

docker run -it -v myshared:/tmp --name myapp ubuntu:latest\n

You should see a prompt like :

root@96df62a73e4f:/# \n

To install standart application like xedit, xman or xeyes, install the package x11-apps.

Run those commands in your myx11server container.

apt-get update\napt-get install -y x11-apps\n

Set the DISPLAY environment variable to :0.0 and then start the xedit command.

export DISPLAY=:0.0\nxedit\n

On the VNC Viewer, the application xedit should appear.

Great, you can run a X11 application inside a dedicated docker container, and use your myx11server as DISPLAY. But you can't move, resize or close the xedit window.

"},{"location":"1.0/setup/vnc/#install-the-windows-manager-openbox-on-your-myx11server-container","title":"Install the windows manager openbox on your myx11server container","text":"

To move, resize, close, the windows applications, we need a windows manager. abcdesktop use the windows manager openbox. OpenBox is a lightweight, powerful, and highly configurable stacking window manager with extensive standards support.

Run the install openbox command in your myx11server container.

apt-get install -y openbox\n

Set the DISPLAY environment variable to :0.0 and then start openbox.

export DISPLAY=:0.0\nopenbox\n

The Openbox message appear to the sdterr

Openbox-Message: Unable to find a valid menu file \"/var/lib/openbox/debian-menu.xml\"\n

Now, you can move the window xedit. The windows are decorated.

"},{"location":"1.0/setup/vnc/#remove-the-myapp-container","title":"Remove the myapp container","text":"

Activate the window shell with your myapp running container, and press CTRL+C

root@9abc7da524a5:/# xedit \n^C\nroot@9abc7da524a5:/# exit\nexit\n

You can remove your docker container, to clean up your environment

docker rm myapp\n
"},{"location":"1.0/setup/vnc/#install-another-x11-application-as-a-docker-application","title":"Install another x11 application as a docker application","text":"

On your host, where your container myx11server is running, open a new shell window and start a new docker container named myapp.

docker run -it -v myshared:/tmp --name myfirefox ubuntu:latest\n

You should see a prompt like :

root@96df62a73e4f:/# \n

To install firefox application, run the install firefox command in your myfirefox container.

apt-get update\napt-get install -y firefox\n

Run the firefox command

export DISPLAY=:0.0\nfirefox\n

You should read the output

\n(firefox:1831): LIBDBUSMENU-GLIB-WARNING **: 14:42:14.737: Unable to get session bus: Failed to execute child process ?dbus-launch? (No such file or directory)\n

On the VNC Viewer, the application firefox should appear.

Check that firefox works and go to your favorite web site.

"},{"location":"1.0/setup/vnc/#clean-your-setup","title":"Clean your setup","text":"

To clean your work space, stop the running containers myapp myfirefox myx11server, then remove them. We also need to remove the shared volume myshared

Run the commands :

docker stop myfirefox myx11server\ndocker rm myfirefox myx11server\ndocker volume rm myshared\n\n

Keep the docker images ubuntu, we will use it in the next chapter

"},{"location":"1.0/setup/vnc/#next-chapter","title":"Next chapter","text":"

In the next chapter, we will replace the VNC Client by a web browser.

"},{"location":"2.0/features/","title":"abcdesktop release 2.0","text":"

The abcdesktop release 2.0 has started in May 2020

"},{"location":"2.0/config/authentification-rules/","title":"Authentification rules configuration","text":"

All auth providers support rules configuration

A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )

"},{"location":"2.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"

A rule is a dictionary object with :

Example :

To test if the user source IP address is equal to 8.8.8.1/32

'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n
"},{"location":"2.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"

conditions is a list of condition. All condition are always tested, as a logical AND. The result must be equal to the expected value.

"},{"location":"2.0/config/authentification-rules/#examples","title":"Examples:","text":""},{"location":"2.0/config/authentification-rules/#example-true-and-true-expected-true","title":"Example (TRUE and TRUE) expected TRUE:","text":"

To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnet80'\n}\n

Add the labels 'shipcrewandnet80', if the 'expected' value is True

"},{"location":"2.0/config/authentification-rules/#example-true-and-true-expected-false","title":"Example (TRUE and TRUE) expected FALSE:","text":"

To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : False,\n    'label': 'noshipcrewandnet80'\n}\n

Add the labels 'noshipcrewandnonet80', if the 'expected' value is False

"},{"location":"2.0/config/authentification-rules/#example-true-and-false-expected-true","title":"Example (TRUE and FALSE) expected TRUE:","text":"

To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : False } ], \n    'expected' : True,\n    'label': 'noshipcrewandnet80'\n}\n

Add the labels 'noshipcrewandnet80', if the 'expected' value is True

"},{"location":"2.0/config/authentification-rules/#example-false-and-true-expected-true","title":"Example (FALSE and TRUE) expected TRUE:","text":"

To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : False },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnonet80'\n}\n

Add the labels 'shipcrewandnonet80', if the 'expected' value is True

"},{"location":"2.0/config/authentification-rules/#the-condition-value","title":"The condition value","text":"name description example boolean always true or false 'boolean' : 'true' httpheader test a HTTP header value 'httpheader': memberOf test if the LDAP user object is member of group 'memberOf': [ 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'] network test if the client user IP Address is in a network subnet 'network': [ '1.2.3.4/24'] primarygroupid test if the LDAP user object has a attibute primaryGroupID and is equal to value 'primarygroupid': '513'"},{"location":"2.0/config/authentification-rules/#condition-boolean","title":"condition boolean","text":"

This condition is a dummy condition; Only use to force a label or to disable a test.

'boolean': boolean\n

The commun usage is

'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : True,\n                 'label': 'dummy'\n}\n

or alway False

'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : False,\n                 'label': 'dummy'\n}\n
"},{"location":"2.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"

This condition is test if a HTTP Header value is equal to a string.

'httpheader': dict\n

example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'

\n 'rule-httpheader': { \n        'conditions' : [ \n            {   'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n                'expected' : True  } ],\n        'expected' : True,\n        'label': 'chromemaxosx112' }\n\n
"},{"location":"2.0/config/authentification-rules/#condition-network","title":"condition network","text":"

This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.

'network': string\n

example

To test if the user source IP address is equal to 8.8.8.1/32

'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n

To test if the user source IP address is in the subnet 10.0.0.0/8

'rule-localnet': { \n    'conditions' : [   { 'network': '10.0.0.0/8', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'localnet' }\n

To test if the user source IP address is NOT in the subnet 192.168.0.0/24

'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : False } ],\n                         'expected' : True,\n                         'label': 'no192168net' }\n

same as

'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : True } ],\n                         'expected' : False,\n                         'label': 'no192168net' }\n
"},{"location":"2.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"

To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork a separated rule.

'policies': {\n    'acl' : {},\n    'rules' : { \n          'rule-privatenetwork-10': {   'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-fe80':{  'conditions' : [ { 'network': 'fe80::/10',     'expected' : True } ], \n                                                'expected'   : True, \n                                                'label': 'privatenetwork' }\n    }\n}                       \n
"},{"location":"2.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"

This condition test if the user is a member of a LDAP Distinguished Name.

'memberOf': string\n
 'rule-sample': { 'conditions':  [ \n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewgrp'\n}\n
"},{"location":"2.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"

This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.

'primarygroupid': string\n

To check is a user is memberof a DOMAIN\\USER the primary group id is 513

'rule-domainuser': {    'conditions':  [ { 'primarygroupid': '513', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'domainuser'\n}\n

However, if the user needed to be seen as a Domain Admin for POSIX, the PrimaryGroupID is 512, the RID for that group.

'rule-posixdomainadmin': {  'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'posixdomainadmin'\n}\n

The Enterprise Admins group, 519, is also used to grant this level in POSIX.

'rule-enterpriseadmin': {   'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'enterpriseadmin'\n}\n
"},{"location":"2.0/config/authexplicit-activedirectory/","title":"Authentification explicit for Microsoft Active Directory services","text":""},{"location":"2.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

For example :

'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}"},{"location":"2.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"

The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN and defined in the config_ref with the exact same value.

Providers :

The provider is formated as a dictionnary

{ 'AD': { 'config_ref': 'adconfig', 'enabled': True } }

Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

The adconfig is a dictionnary. For example :

adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n

If this example, the Microsoft Active Directory value are set to :

Variable name Value for example USERDOMAINADUSERDNSDOMAINAD.DOMAIN.LOCAL

For Active Directory authmanagers, replace the variable name with your own value.

Variable name Type Description Example default boolean Use this domain as default domain True ldap_basedn string LDAP Base Distinguished Names DC=ad,DC=domain,DC=localldap_fqdn string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.localdomain_fqdn string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCALservers list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]kerberos_realm string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL

The explicit authentification is support LDAP and LDAPS bind.

The Microsoft Active Directory value are set to :

Variable name Value USERDOMAINADUSERDNSDOMAINAD.DOMAIN.LOCAL

For Active Directory authmanagers, replace the variable name with your own value.

Variable name Description Example ldap_basedn Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=localldap_fqdn Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.localdomain_fqdn Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCALservers Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]kerberos_realm Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL"},{"location":"2.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"

The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)

"},{"location":"2.0/config/authexplicit-activedirectory/#site","title":"Site","text":"

This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.

Variable name Type Defautl value site_subnetdn string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') )site_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=subnet)site_attrs list ['cn', 'siteObject', 'location']"},{"location":"2.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"

This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location is the join key to match local printer for the user.

Variable name Type Defautl value printer_printerdn string OU=Applications + config.get('basedn')printer_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=printQueue)site_attrs list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]

Great, you have check how the explicit Authentification configuration works.

"},{"location":"2.0/config/authexplicit-ldap/","title":"Authentification explicit for LDAP Directory Services","text":""},{"location":"2.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

explicit authentification use a directory service. A bind operation is used to authenticate clients to the directory server, to establish an authorisation identity that will be used for subsequent operations processed on that connection.

The explicit authentification configuration is defined as a dictionary object and contains an explicit provider.

For example :

'explicit': {\n    'providers': {\n      'LDAP': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n}\n

In this example, ldapconfig dict must have a key LDAP

Variable name Type Description default_domain string set the default domain name, if user does not prefix the login by domain\\s. default_domain is only used by Active Directory provider providers dictionary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}"},{"location":"2.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"

The provider authentification configuration is defined as a dictionary object and must contain a key name. The key name must be set with the same value in provider configuration and config_ref.

The provider is formatted as a dictionary. Example for a provider defined as planet

 { 'planet': {  \n            'config_ref': 'ldapconfig',  \n            'enabled': True  \n        }\n }\n
Variable name Type Description config_ref string For increased readability , the configuration is defined in a dedicated and separated dictionary as (key,value) 'config_ref': 'planet', where key is config_ref and value is the dictionary variable name. enable boolean True to enable or False to disable the provider configuration

The ldapconfig is a dictionary.

For example :

ldapconfig : { \n  'planet': {    \n    'default'       : True, \n    'ldap_timeout'  : 15,\n    'ldap_protocol' : 'ldap',\n    'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n    'servers'       : [ 'ldap://192.168.8.195' ],\n    'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' } \n  } \n } \n}\n
"},{"location":"2.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default boolean Use this ldap configuration as default (if more than one ldap auth provider is defined) True auth_only boolean Do not run ldap queries, only use to run authentication False auth_type string authentification protocol to bind the ldap server. Values can be 'KERBEROS', 'NTLM' or 'SIMPLE' The default value is 'SIMPLE' basedn string LDAP base Distinguished Name ou=people,dc=planetexpress,dc=comservers list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. This entry must be prefixed by the protocol ldap or ldaps for each server [ 'ldap://192.168.1.12', 'ldaps://192.168.1.13' ] LDAP server address IP Address or FQDN value scope LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope being one of SCOPE_BASE (to search the object itself), SCOPE_ONELEVEL (to search the object\u2019s immediate children), or SCOPE_SUBTREE (to search the object and all its descendants). ldap.SCOPE_SUBTREEtimeout integer ldap time out in second 10 exec_timeout integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos keytab file the exec timeout is used to run external command line. 10 users_ou string Users Organisation Unit ou=people,dc=planetexpress,dc=comattrs list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s))group_filter string LDAP filter to find group object (&(objectClass=Group)(cn=%s))group_attrs string LDAP filter to find group object (&(objectClass=Group)(cn=%s))serviceaccount dictionary entries to defined service account credentials formatted like { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' } or { 'login': 'file://config/serviceaccount/login', 'password': 'file://config/serviceaccount/passwd' }"},{"location":"2.0/config/authexplicit-ldap/#ldap-service-account","title":"ldap service account","text":"

Ldap service account permits service account binding. A service account can be defined using clear text login and password data, or as file reference login and password starting by file://.

The file reference file:// for login and password is used to read kubernetes secret file data.

"},{"location":"2.0/config/authexplicit-ldap/#configure-auth-using-the-openldap-container","title":"Configure Auth using the OpenLDAP container","text":""},{"location":"2.0/config/authexplicit-ldap/#openldap-container-for-testing","title":"OpenLDAP container for testing","text":"

To configure abcdesktop to use an explicit authentification, we need a directory service. We use an OpenLDAP container for testing with provisioned values. docker-test-openldap from rroemhild works fine ans id very useful.

Read the OpenLDAP container for testing documentation on the url abcdesktop OpenLDAP Docker Image for testing

"},{"location":"2.0/config/authexplicit-ldap/#update-the-odconfig-configuration-file","title":"Update the od.config configuration file","text":"

Update the od.config configuration file.

Add the explicit entry to the dictionary authmanagers.

authmanagers: {\n  'external': {\n  },\n  'explicit': {\n    'show_domains': True,\n    'providers': {\n      'planet': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n  }}      \n

Note: the config_ref is ldapconfig.

Add a new dictionary object named ldapconfig to the configuration file. These values come from the LDAP structure of OpenLDAP Docker Image for testing

ldapconfig : { 'planet': {    \n                        'default'       : True, \n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ 'ldap://openldap' ] }}\n

Save your new od.config file.

Open the URL:http://localhost:30443

The authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

"},{"location":"2.0/config/authexplicit-ldap/#the-ldap-structure-of-openldap-container-for-testing","title":"The LDAP structure of OpenLDAP container for testing","text":""},{"location":"2.0/config/authexplicit-ldap/#basedn","title":"BaseDN","text":"

The basedn is dc=planetexpress,dc=com

"},{"location":"2.0/config/authexplicit-ldap/#admin-account","title":"admin account","text":"

The admin account is described as

Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"2.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":""},{"location":"2.0/config/authexplicit-ldap/#users","title":"Users","text":""},{"location":"2.0/config/authexplicit-ldap/#cnhubert-j-farnsworthoupeopledcplanetexpressdccom","title":"cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hubert J. Farnsworth sn Farnsworth description Human displayName Professor Farnsworth employeeType Owner employeeType Founder givenName Hubert jpegPhoto JPEG-Photo (630x507 Pixel, 26780 Bytes) mail professor@planetexpress.com mail hubert@planetexpress.com ou Office Management title Professor uid professor userPassword professor"},{"location":"2.0/config/authexplicit-ldap/#cnphilip-j-fryoupeopledcplanetexpressdccom","title":"cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry"},{"location":"2.0/config/authexplicit-ldap/#cnjohn-a-zoidbergoupeopledcplanetexpressdccom","title":"cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn John A. Zoidberg sn Zoidberg description Decapodian displayName Zoidberg employeeType Doctor givenName John jpegPhoto JPEG-Photo (343x280 Pixel, 26438 Bytes) mail zoidberg@planetexpress.com ou Staff title Ph. D. uid zoidberg userPassword zoidberg"},{"location":"2.0/config/authexplicit-ldap/#cnhermes-conradoupeopledcplanetexpressdccom","title":"cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hermes Conrad sn Conrad description Human employeeType Bureaucrat employeeType Accountant givenName Hermes mail hermes@planetexpress.com ou Office Management uid hermes userPassword hermes"},{"location":"2.0/config/authexplicit-ldap/#cnturanga-leelaoupeopledcplanetexpressdccom","title":"cn=Turanga Leela,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Turanga Leela sn Turanga description Mutant employeeType Captain employeeType Pilot givenName Leela jpegPhoto JPEG-Photo (429x350 Pixel, 26526 Bytes) mail leela@planetexpress.com ou Delivering Crew uid leela userPassword leela"},{"location":"2.0/config/authexplicit-ldap/#groups","title":"Groups","text":""},{"location":"2.0/config/authexplicit-ldap/#cnadmin_staffoupeopledcplanetexpressdccom","title":"cn=admin_staff,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn admin_staff member cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com member cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com"},{"location":"2.0/config/authexplicit-ldap/#cnship_crewoupeopledcplanetexpressdccom","title":"cn=ship_crew,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn ship_crew member cn=Turanga Leela,ou=people,dc=planetexpress,dc=com member cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com member cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"},{"location":"2.0/config/authexplicit-ldap/#insert-the-user-credentials","title":"Insert the user credentials","text":"

Start your web browser and open the URL http://localhost

The Web home page contains the new input values Login and Password to authenticate this user.

You can use for example on user of the list above.

Credentials Value Login Turanga Leela Password leela

Insert the login credentials :

Turanga Leela as login and leela as password, then click on the Sign in button.

Look at the top of the sreen. The user name is Turanga Leela:

"},{"location":"2.0/config/authexplicit-ldap/#applications-remainted","title":"Applications remainted","text":"

Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :

I like this amazing project abcdesktop.io\n

Do not save your file and just close your web browser.

Start your web browser again, and open the same URL http://localhost, and log in with the same account: Turanga Leela as login and leela as password, then click on the Sign in button.

The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io

All applications are maintained.

Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.

"},{"location":"2.0/config/authexplicit/","title":"Authentification explicit","text":""},{"location":"2.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit:","text":"

explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

The explicit authentification configuration is defined as a dictionary object and contains an explicit provider.

The explicit provider support the directory services ldap, ldaps, and Microsoft Active Directory, and SIMPLE, NTLM and KERBEROS protocols.

Configuration sample for Microsoft Active Directory with KERBEROS protocol :

'explicit': {\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'auth_type'     : 'KERBEROS'\n                       'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                       'servers'       : [ 'ldap://192.168.7.12' ],\n                       'kerberos_realm': 'AD.DOMAIN.LOCAL' } } }\n
"},{"location":"2.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"

If the authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

"},{"location":"2.0/config/authexplicit/#ldap-authmanagers","title":"LDAP authmanagers :","text":"

Read the specific chapter on LDAP explicit authmanagers

"},{"location":"2.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"

Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers

Great, you have check how the explicit Authentification configuration works.

"},{"location":"2.0/config/authexternal/","title":"Authentification external","text":""},{"location":"2.0/config/authexternal/#requirements","title":"Requirements","text":"

To use external Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.

"},{"location":"2.0/config/authexternal/#library","title":"Library","text":"

abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.

"},{"location":"2.0/config/authexternal/#authmanagers-external","title":"authmanagers external:","text":"

external authentification use OAuth 2.0 authenticaton.

The external authentification configuration is defined as a dictionary object and contains a list of external provider.

Sample providers entry using the Google OAuth 2.0 authentification service.

'external': {\n    'providers': {\n    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n}\n

The variable values client_id and client_secret have been set to obfuscate value 'XXX'. The FQDN is refered to the public server FQDN.

Variable name Type Description Sample displayname string Display Name show in Web front Googleenabled boolean LDAP Base Distinguished Names Trueclient_id string client id XXX-YYY.apps.googleusercontent.comclient_secret string client secret XXXscope list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ]userinfo_url string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix string redirect URL https://hostname.domain.local/API/auth/oauthredirect_uri_querystring string URL query string manager=external&provider=googleauthorization_base_url string callback URL https://accounts.google.com/o/oauth2/v2/authtoken_url string token URL https://oauth2.googleapis.com/token

The complete redirect url concats the two values redirect_uri_prefix and redirect_uri_querystring.

"},{"location":"2.0/config/authexternal/#orange-oauth-20","title":"Orange OAuth 2.0","text":"

Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.

"},{"location":"2.0/config/authexternal/#orange-application","title":"Orange Application","text":"

Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section

'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'openid', 'form_filling' ],\n        'client_id': 'XXX',\n        'client_secret': 'YYY',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=orange',\n        'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n        'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n        'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n      }\n
"},{"location":"2.0/config/authexternal/#facebook-oauth-20","title":"Facebook OAuth 2.0","text":"

Facebook's OAuth is supported for authentication.

"},{"location":"2.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"

Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API

'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'XXX', \n        'client_secret': 'YYY', \n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        }\n
"},{"location":"2.0/config/authexternal/#google-oauth-20","title":"Google OAuth 2.0","text":"

Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.

"},{"location":"2.0/config/authexternal/#google-application","title":"Google Application","text":"

Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]

'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'XXX-YYY.apps.googleusercontent.com', \n        'client_secret': 'XXX',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://host.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token'\n    }\n

Great, you have check how the implicit Authentification configuration works.

"},{"location":"2.0/config/authimplicit/","title":"Authentification implicit","text":""},{"location":"2.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit:","text":"

implicit is the easiest configuration mode, and is used as 'Anonymous' authentification.

The provider is defined as a dictionary object and contains an anonymous provider.

anonymous provider always permits authentification, and create a uuid as userid. anonymous provider is used to skip the authentification process in a demonstration mode.

'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n

anonymous provider always permit authentification, and create a uuid as userid.

Set in your configuration file the authmanagers dictionary as described

authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { \n     'providers': {\n         'anonymous': {\n           'displayname': 'Anonymous',\n           'caption': 'Anonymous',\n           'userid': 'anonymous',\n           'username': 'Anonymous'\n      } \n   }\n}\n

Update your configuration file and apply the new configuration file

Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :

Select the Sign-In Anonymously button.

Then, choose the settings in the menu at the upper right corner

Choose the System in the settings control panel.

Then choose User containers

This screen show you the hostname.

You can read the hostname. In the example the hostname is f097ab7aac57, from the container id.

Using a shell, run the command

kubectl get pods -n abcdesktop \n

Find a running container with the containerid previously identified.

In this example the containerid is f097ab7aac57

f097ab7aac57   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   8 minutes ago    Up 8 minutes               4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp   g-06b686a5-c98d-4889-b73d-3455f692e6c2\n

Run the command docker inspect CONTAINERID, replace the string CONTAINERID with your container id value.

For example docker inspect f097ab7aac57

docker inspect f097ab7aac57\n

Locate the Mounts description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and

 \"Mounts\": [\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/tmp\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            },\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/home/balloon\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            }\n        ],\n\n

When an anonymous user close his session, the anonymous home directory is deleted.

Great, you have check how the implicit Authentification configuration works.

"},{"location":"2.0/config/authmetaexplicit/","title":"Authentification metaexplicit for Microsoft Active Directory services with trust relationships","text":""},{"location":"2.0/config/authmetaexplicit/#authmanagers-metaexplicit-object","title":"authmanagers metaexplicit object","text":"

The metaexplicit authentification manager contains only one provider. The provider must be defined as metadirectory.

'metaexplicit': {\n    'providers': {\n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True\n       }\n}\n
Variable name Type Description providers dictionary { 'metadirectory': { 'config_ref': 'coporateconfig', 'enabled': True }}"},{"location":"2.0/config/authmetaexplicit/#metadirectory-provider-configuration","title":"metadirectory provider configuration","text":"

The metadirectory provider is defined as a dictionnary object and must contain key name. The key name must be set as the name of a dictionaryin the config_ref.

A metadirectory provider must contain a ldap attribut to describe the original DOMAIN and sAMaccountName. The ldap attribut is defined as join_key_ldapattribut.

coporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } } \n

Pyos binds the metadirectory ldap server with serviceaccount credentials Pyos read the ldap attribut description value to get the user's trusted domain.

For example :

description: AD\\john\n

Then pyos look for provider AD configuration and process authentification on domain AD

The metadirectory accounts can be disabled. The ldap attribut userAccountControl is not read on metaDirectory provider. The account can have the bit UF_ACCOUNT_DISABLE set or not.

A service account must defined for a metadirectory provider. The service account is used to bind the metadirectory.

"},{"location":"2.0/config/authmetaexplicit/#complete-example-with-a-metadirectory-provider-and-active-directory-user-domain","title":"Complete example with a metadirectory provider and active directory user domain","text":"

The user's domain mane is AD. The meta domain name is CORPORATE. The meta domain use a dedicated attribut join_key_ldapattribut

authmanagers: {\n  #\n  # define the meta explicit manager\n  # This is the trusted external forest for the followed domain\n  #\n  'metaexplicit': {\n    'providers': {\n      # define the metadirectory provider\n      # only one metadirectory provider is supported \n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True } \n    }\n  },\n\n  #        \n  # define the Active Directory provider for each DOMAIN\n  # define two domains in two disctinct forest with a trust relationship \n  # \n  'explicit': { \n    # define an Active Directory provider AD \n    'AD': {  'config_ref': 'adconfig', 'enabled': True },\n    # define an Active Directory provider ANOTHER\n    'ANOTHER': { 'config_ref': 'anotherconfig', 'enabled': True }  \n  }\n} # end of authmanagers\n\n# In this example ldap attribut's description contains AD\\myuser or ANOTHER\\myuser \ncoporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } }\n\n\n# \n# define the first DOMAIN AD\n# The adconfig ref for domain AD\n#\nadconfig : { 'AD': {  'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                      'domain'        : 'AD',\n                      'auth_type'     : 'NTLM',\n                      'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                      'servers'       : [ 'ldap://192.168.7.12' ] } }\n\n#\n# define the second DOMAIN ANOTHER\n# The anotherconfig ref for domain ANOTHER\n#\nanotherconfig : { 'ANOTHER': {\n                      'ldap_basedn'   : 'DC=another,DC=super,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.another.super.local',\n                      'domain'        : 'ANOTHER',\n                      'auth_type'     : 'KERBEROS',\n                      'domain_fqdn'   : 'ANOTHER.SUPER.LOCAL',\n                      'servers'       : [ 'ldap://192.168.10.12' ],\n                      'kerberos_realm': 'AD.SUPER.LOCAL' } }\n
"},{"location":"2.0/config/authmetaexplicit/#metadirectorysupport","title":"metadirectorysupport","text":"

metadirectory support the foreign security principal (FSP) to query security principal in the trusted external forest. These objects are created in the foreign security principals container of the domain. metadirectory support isMemberOf on foreign security principal.

The user's SID of domain 'AD' or 'ANOTHER' is NOT read. A new ldap bind is done using the trusted domain on metadirectory provider and not unsing the service account.

The ldap query is build : ( \"search_base={q.basedn}, search_scope={q.scope}, search_filter={filter}\" )

To get more information about foreign security principal (FSP), read :

"},{"location":"2.0/config/balloon/","title":"balloon user entry in od.config","text":"

balloon is the default generic user.

The balloon user is created inside the oc.user container

The default values are

balloon Default Values nameballoonuid4096gid4096homedirectory/home/balloon

If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"2.0/config/controllers/","title":"Controllers","text":""},{"location":"2.0/config/controllers/#controllers_1","title":"Controllers","text":"

abcdesktop.io use a Model\u2013view\u2013controller (usually known as MVC) is a software design pattern commonly used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.

Controller Description AccountingController accounting data json and ebnf format AuthController authenticate user ComposerController CRUD main services (like createDesktop, runApplication) CoreController get configuration and user message info ManagerController manage pyos PrinterController CRUD printer object StoreController CRUD key value data UserController retrieve user information"},{"location":"2.0/config/controllers/#access-permission","title":"Access Permission","text":"

The AccountingController and ManagerController access is protected with a source ip address filter. The access control filter is defined in a dictionary. Each dictionary entry use the controller name and with an entry permitip. The permitip is a list of subnet, for example [ '10.0.0.0/8', '172.16.0.0/12' ]. If permitip is not set or the controller name is not set, all ip source address are allowed the send a request to the controller.

The controllers dictionnary is defined in the od.config file. By default the configuration permit private network defined in rfc1918 and rfc4193. Get more information about the private network.

By default others controllers access is enabled, without ip restriction.

    controllers : { \n        'AccountingController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'AuthController' :      { 'permitip': None },\n        'ComposerController' :  { 'permitip': None },\n        'CoreController' :      { 'permitip': None },\n        'ManagerController': \n            { \n                'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n            },\n        'PrinterController' :   { 'permitip': None },\n        'StoreController' :     { 'permitip': None },\n        'UserController' :      { 'permitip': None }\n    } \n

If the source ip address is not allowed, the response is a HTTP status code 403 Forbidden

{\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
"},{"location":"2.0/config/desktop/","title":"desktop options in od.config","text":"

The od.config contains options to describe how the oc.user and applications containers have to be created. Options differ if abcdesktop.io is running in docker mode or in kubernetes mode.

"},{"location":"2.0/config/desktop/#desktopoptions","title":"desktop.options","text":"

All desktop options are defined in od.config file. Desktop options start with the prefix desktop., then add the name of the option.

Option name Type Sample desktop.usex11unixsocket boolean True desktop.defaultbackgroundcolors list [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ] desktop.homedirectorytype string 'volume' desktop.remotehomedirectorytype list [] desktop.persistentvolumeclaim string None desktop.allowPrivilegeEscalation boolean False desktop.securityopt list [ 'no-new-privileges', 'seccomp=unconfined' ] desktop.imagePullSecret string None desktop.image string 'abcdesktopio/oc.user.18.04:latest' desktop.imageprinter string 'abcdesktopio/oc.cupsd.18.04:latest' desktop.useprintercontainer boolean False desktop.soundimage string 'abcdesktopio/oc.pulseaudio.18.04' desktop.usesoundcontainer boolean False desktop.usecontainerimage boolean False desktop.initcontainerimage string 'abcdesktopio/oc.busybox' desktop.envlocal dictionary { 'DISPLAY': ':0.0', 'USER': 'balloon', 'LIBOVERLAY_SCROLLBAR': '0', 'UBUNTU_MENUPROXY': '0', 'HOME': '/home/balloon', 'LOGNAME': 'balloon' }desktop.nodeselector dictionary {}desktop.username string 'balloon' desktop.userid integer 4096 desktop.groupid integer 4096 desktop.userhomedirectory string '/home/balloon'desktop.useinternalfqdn boolean False desktop.uselocaltime boolean False desktop.host_config dictionary { 'auto_remove' : True, 'ipc_mode' : 'shareable', 'network_mode' : 'container', 'shm_size' : '128M', 'mem_limit' : '512M', 'cpu_period' : 100000, 'cpu_quota' : 150000, 'security_opt' : [ 'seccomp=unconfined' ] }desktop.application_config dictionary { 'auto_remove' : True, 'ipc_mode' : 'shareable', 'pid_mode' : True, 'network_mode' : 'container', 'shm_size' : '512M', 'mem_limit' : '2G', 'cpu_period' : 200000, 'cpu_quota' : 150000, 'security_opt' : [ 'seccomp=unconfined' ] }desktop.policies dictionary { 'rules':{}, 'max_app_counter':5 }desktop.webhookdict dictionary { 'firewall': '192.168.7.1' }"},{"location":"2.0/config/desktop/#desktopusex11unixsocket","title":"desktop.usex11unixsocket","text":"

The desktop.usex11unixsocket force the X11 server to use local unix socket. The name of the X11 unix socket is /tmp/.X11-unix/X0

You can disable this features, but you have to replace the default TigerVNC by another X11 Server and a VNC Server. You can choose (x.org + x11vnc) for example, but you need more CPU ressource than TigerVNC.

TigerVNC does not support to listen on TCP Port. TigerVNC is a X11 and a VNC Server.

Set the desktop.usex11unixsocket value to True in most case, and this should not be changed.

"},{"location":"2.0/config/desktop/#desktopshareipcnamespace","title":"desktop.shareipcnamespace","text":"

The type of desktop.shareipcnamespace is a string. The default value is 'shareable' This option permit user contain to share the ipc namespace with application

Value Description '' Use daemon\u2019s default. 'none' Own private IPC namespace, with /dev/shm not mounted. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system\u2019s IPC namespace.

If not specified, daemon default is used, which can either be 'private' or 'shareable', depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues.

Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built (typically C/OpenMPI, C++/using boost libraries) high performance applications for scientific computing and financial services industries.

If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using \"shareable\" mode for the main (i.e. \u201cdonor\u201d) container, and containers can access \"container:\".

Default value desktop.shareipcnamespace : 'shareable'

"},{"location":"2.0/config/desktop/#desktophomedirectory","title":"desktop.homedirectory","text":"

This option describes how the default home directory for user user ballon should be created :

"},{"location":"2.0/config/desktop/#desktoppersistentvolumeclaim","title":"desktop.persistentvolumeclaim","text":"

This value is only avalaible in kubernetes mode.

desktop.persistentvolumeclaim is the name of the Persistent Volume Claim if the desktop.homedirectory is set to 'persistentVolumeClaim'. The PVC (Persistent Volume Claim) must exist.

Run the kubectl get pvc command to list the persistent volume claim

NAME                                   STATUS   VOLUME                     CAPACITY   ACCESS MODES   STORAGECLASS           AGE\nabcdesktop-pvc                        Bound    abcdesktop-pv             5Gi        RWO            abcdesktop-standard   170d\n
"},{"location":"2.0/config/desktop/#desktopremotehomedirectorytype","title":"desktop.remotehomedirectorytype","text":"

desktop.remotehomedirectorytype is a list of string. Each string describe if the remount access to a directory is allowed. example [ 'cifs', 'webdav' ]

For each entry in the desktop.remotehomedirectorytype list, abcdesktop.io try to mount the remote file system using data from the implicit auth provider.

If desktop.remotehomedirectorytype contains 'cifs' and if the authentification provider get homeDrive and homeDirectory attributs then abcdesktop request the kubernetes abcdesktop/CIFS Driver to mount the remote filesystem. The user find a mount point named homeDrive value, and mounted to homeDirectory.

"},{"location":"2.0/config/desktop/#desktopallowprivilegeescalation","title":"desktop.allowPrivilegeEscalation","text":"

The desktop.allowPrivilegeEscalation option allow a user to run a sudo command. The execve system call can grant a newly-started program privileges that its parent did not have, such as the setuid or setgid Linux flags.

The default value is False You should only set desktop.allowPrivilegeEscalation to run sudo command.

In production this value MUST be set to False

"},{"location":"2.0/config/desktop/#desktopdefaultbackgroundcolors","title":"desktop.defaultbackgroundcolors","text":"

The desktop.defaultbackgroundcolors allow you to change the default background color.

The default value is a list of string [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]

The desktop.defaultbackgroundcolors length can contain up to 8 entries. To see the color

Open the url http://localhost, in your web browser, to start a simple abcdesktop.io container.

http://localhost\n

You should see the abcdesktop.io home page.

Press the Connect with Anonymous access, have look

At the right top corner, click on the menu and choose Settings, then click on Screen Colors

You should see the default background colors, for example :

"},{"location":"2.0/config/desktop/#desktopimagepullsecret","title":"desktop.imagePullSecret","text":"

The desktop.imagePullSecret is the name of the secret used by Kubernetes to access to the private registry. The type of desktop.imagePullSecret is a string. This option is only available in Kubernetes mode, and anly used if you need to store the abcdesktop docker image on a private registry.

kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=https://index.docker.io/v1/ --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=registry.mydomain.local:443 --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
"},{"location":"2.0/config/desktop/#desktopimage","title":"desktop.image","text":"

The desktop.image is the name of the X11 server container The default value is abcdesktopio/oc.user.18.04

"},{"location":"2.0/config/desktop/#desktopprinterimage","title":"desktop.printerimage","text":"

The desktop.printerimage is the name of the printer container The default value is abcdesktopio.oc.cupds.18.04

"},{"location":"2.0/config/desktop/#desktopuseprintercontainer","title":"desktop.useprintercontainer","text":"

The desktop.useprintercontainer is boolean, to use printer cupsd service as an separated container. This value is only available in kubernetes mode. The default value is False.

"},{"location":"2.0/config/desktop/#desktopsoundimage","title":"desktop.soundimage","text":"

The desktop.soundimage is the name of the sound container image The default value is abcdesktopio/oc.pulseaudio.18.04

"},{"location":"2.0/config/desktop/#desktopusesoundcontainer","title":"desktop.usesoundcontainer","text":"

The desktop.usesoundcontainer is boolean, to use pulseaudio service as a separated container. This value is only available in kubernetes mode. The default value is False.

"},{"location":"2.0/config/desktop/#desktopuseinitcontainer","title":"desktop.useinitcontainer","text":"

The desktop.useinitcontainer is boolean, to use init container. The default value is False. The code call the desktop.initcontainercommand list .

The initcontainerimage is a busybox shell, for example to make sure that the home directory belongs to user balloon.

/home/balloon must belong to balloon default user and balloon default group.

"},{"location":"2.0/config/desktop/#desktopinitcontainercommand","title":"desktop.initcontainercommand","text":"

The desktop.initcontainercommand runs the command at init container. The default value is None, the default type is list.

desktop.initcontainercommand example :

desktop.initcontainercommand : [ 'sh', '-c', 'chown 4096:4096 /home/balloon' ]\n

This option is used when presistent volume data mount a nfs storage. The uid and gid of /home/balloon must be set to the default value of (balloon:balloon) (4096:4096).

"},{"location":"2.0/config/desktop/#desktopinitcontainerimage","title":"desktop.initcontainerimage","text":"

The desktop.initcontainerimage is the name of the init container image. The default value is busybox.

"},{"location":"2.0/config/desktop/#desktopenvlocal","title":"desktop.envlocal","text":"

desktop.envlocal is a dictionary. desktop.envlocal contains a (key,value) added as environment variables to oc.user.

The default value is :

{ \n        'DISPLAY': ':0.0', \n        'USER': 'balloon', \n        'LIBOVERLAY_SCROLLBAR': '0',\n        'WINEARCH': 'win32',\n        'UBUNTU_MENUPROXY': '0',\n        'HOME': '/home/balloon',\n        'LOGNAME': 'balloon',\n        'PULSE_SERVER: '/tmp/.pulse.sock', \n        'CUPS_SERVER': '/tmp/.cups.sock' \n}\n

Add 'CUPS_SERVER: '/tmp/.cups.sock' only if desktop.useprintercontainer is True. Add 'PULSE_SERVER: '/tmp/.pulse.sock' only if desktop.usesoundcontainer is True.

"},{"location":"2.0/config/desktop/#desktopnodeselector","title":"desktop.nodeselector","text":"

desktop.nodeselector is a dictionary. This option permits to assign user pods to nodes. It specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). The most common usage is one key-value pair.

{ 'disktype': 'ssd' }\n
"},{"location":"2.0/config/desktop/#desktopusername","title":"desktop.username","text":"

desktop.username describes the balloon user created inside the oc.user container. The type of desktop.username is string. The default value is 'balloon'.

If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n

Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

"},{"location":"2.0/config/desktop/#desktopuserid","title":"desktop.userid","text":"

desktop.userid describes the uid of the user created inside the oc.user container. The type of desktop.userid is integer. The default value is 4096.

If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

ENV BUSER balloon\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n

Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

"},{"location":"2.0/config/desktop/#desktopgroupid","title":"desktop.groupid","text":"

desktop.groupid describes the gid of the user created inside the oc.user container. The type of desktop.userid is integer. The default value is 4096.

If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

RUN groupadd --gid 4096 $BUSER\n

Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

"},{"location":"2.0/config/desktop/#desktopuserhomedirectory","title":"desktop.userhomedirectory","text":"

desktop.userhomedirectory describes the homedirectory of the user created inside the oc.user container. The type of desktop.userhomedirectory is string. The default value is /home/balloon.

If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n

Read the dedicated page on balloon to gaet more information about user balloon, uid, and gid.

"},{"location":"2.0/config/desktop/#desktopuselocaltime","title":"desktop.uselocaltime","text":"

The desktop.uselocaltime is boolean, to use host value of /etc/localtime. The default value is False. If desktop.uselocaltime is True, this add a volume mapping from host file /etc/localtime to container file /etc/localtime.

"},{"location":"2.0/config/desktop/#desktoppolicies","title":"desktop.policies","text":"

The desktop.policies is a dictionary.

Entry Description max_app_counter limit applications counter, without checking the docker container status rules rules dictionary 'rules': { 'volumes': { 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } }acl allow or denied desktop creation

Example

desktop.policies: { 'rules':\n    { 'volumes': \n        { 'domainuser':  \n            { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' },\n            'Mygroupteam':  { 'type': 'cifs', 'name': 'toto', 'unc': '//192.168.7.101/team', 'volumename': 'team' } \n            } \n        },\n      'acls' : {},\n      'max_app_counter' : 4  }\n
"},{"location":"2.0/config/desktop/#desktopapplication_config","title":"desktop.application_config","text":"

Default application host_config dictionary, maps the dictionary as arguments from docker API create_host_config

Define how the application can be run, read host_config description page to get more informations

"},{"location":"2.0/config/desktop/#desktophost_config","title":"desktop.host_config","text":"

Default desktop oc.user host_config dictionary, maps the dictionary as arguments from docker API create_host_config

Define how the oc.user container can be run, read host_config description page to get more informations

"},{"location":"2.0/config/desktop/#desktopwebhookdict","title":"desktop.webhookdict","text":"

desktop.webhookdict is a dictionary to add key/value to the command create and destroy in rules objects.

"},{"location":"2.0/config/desktop/#experimental-features","title":"Experimental features","text":""},{"location":"2.0/config/desktop/#desktopdesktopuseinternalfqdn","title":"desktop.desktopuseinternalfqdn","text":"

WARNING desktop.desktopuseinternalfqdn is an experimental feature, keep this value to False in production

desktop.desktopuseinternalfqdn describes the content of the payload data in the JWT Desktop Token. The default value is False.

Nginx front end act as a reverse proxy. This reverse proxy use the FQDN of the user's pod to route http request. If this value is set to False the payload data in the JWT Desktop Token contains the IP Address of the user Pod. If this value is set to True the payload data in the JWT Desktop Token contains the FQDN of the user Pod.

If you CAN NOT add endpoint_pod_names in the coredns configuration, you MUST set desktop.desktopuseinternalfqdn to False. This choice is less secure.

To set desktop.desktopuseinternalfqdn to True value, you have to update the coredns ConfigMap.

kind: ConfigMap\napiVersion: v1\nmetadata:\n  name: coredns\n  namespace: kube-system\ndata:\n  Corefile: |\n    .:53 {\n        log\n        errors\n        health\n        ready\n        kubernetes cluster.local in-addr.arpa ip6.arpa {\n           endpoint_pod_names\n           pods insecure\n           fallthrough in-addr.arpa ip6.arpa\n           transfer to * \n           ttl 30\n        }\n        prometheus :9153\n        forward . /etc/resolv.conf\n        cache 30\n        loop\n        reload\n        loadbalance\n    }\n
"},{"location":"2.0/config/editconfig/","title":"How to edit pyos core service configuration file","text":"

The pyos core service configuration file name is od.config

"},{"location":"2.0/config/editconfig/#edit-your-configuration-file","title":"Edit your configuration file","text":"

If the od.config file does not exist, download the default od.config file and save it as od.config to your abcdesktop local directory.

To make change, edit your own od.config file

vim od.config \n
"},{"location":"2.0/config/editconfig/#make-changes","title":"Make changes","text":"

Change the defaultbackgroundcolors option in the desktop options.

Locate the line desktop.defaultbackgroundcolors and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'

desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF',  '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n

Save your local file od.config.

"},{"location":"2.0/config/editconfig/#apply-changes","title":"Apply changes","text":"

To apply changes, you can replace the abcdesktop-config

kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

Or you can also use the replace command kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run | kubectl replace -n abcdesktop -f -

"},{"location":"2.0/config/editconfig/#restart-pyos-pods","title":"Restart pyos pods","text":"
kubectl delete pods -l run=pyos-od -n abcdesktop\npod \"pyos-od-6fc597d444-qgzhc\" deleted\n
"},{"location":"2.0/config/editconfig/#check-your-changes","title":"Check your changes","text":"

To check that the new colours are presents in front, open the url http://localhost:30443, in your web browser, to start a simple abcdesktop.io container.

http://localhost:30443\n

You should see the abcdesktop.io home page.

Press the Sign-in Anonymously, have look

At the right top corner, click on the menu and choose Settings, then click on Screen Colors

Choose your colour and you should have it as background colour :

Great, you can easily update your configuration file od.config.

"},{"location":"2.0/config/frontjs/","title":"dock configuration in od.config","text":""},{"location":"2.0/config/frontjs/#menu-setting","title":"Menu Setting","text":"

The menu can be changed using the dictionnary object menuconfig

menuconfig : {\n    'settings'  : True, \n    'appstore'  : True, \n    'screenshot'    : True, \n    'download'  : True, \n    'logout'        : True, \n    'disconnect'    : True \n}\n
"},{"location":"2.0/config/frontjs/#default-dock-config","title":"default dock config","text":"

The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock option is a dictionnary read by the front web as a json object.

docker entry Descriptions filemanager FileManager application terminal Terminal application webshell HTML 5, terminal application based on xterm.js webshorcut Web browser url launch inside the container
dock : {       \n    'filemanager':  {       'args': None,\n                            'showinview': u'dock',\n                            'name': u'FileManager',\n                            'keyword': u'files,file manager',\n                            'launch': u'nautilus.Nautilus',\n                            'displayname': u'FileManager',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,office',\n                            'id': u'filemanager.d',\n                            'icon': u'pantheon-files-icons.svg' },\n    'terminal':     {       'args': '',\n                            'name': u'TerminalBuiltin',\n                            'keyword': u'terminal,shell,bash,builtin,pantheon',\n                            'launch': u'qterminal.qterminal',\n                            'displayname': u'Terminal Builtin',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,development',\n                            'id': u'terminalbuiltin.d',\n                            'hideindock': True,\n                            'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n    'webshell':     {       'name': u'WebShell',\n                            'keyword': u'terminal,shell,webshell,bash',\n                            'launch': u'frontendjs.webshell',\n                            'displayname': u'Web Shell',\n                            'execmode': u'frontendjs',\n                            'cat': u'utilities,development',\n                            'id': u'webshell.d',\n                            'icon': u'webshell.svg' }\n}\n
"},{"location":"2.0/config/frontjs/#additional-applications","title":"Additional applications","text":"

This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' } add

'webshortcut':  {   'name': u'xlogo',\n                    'showinview': u'dock',\n                    'keyword': u'xlogo',\n                    'execmode': u'builtin',\n                    'launch': u'/usr/bin/xlogo',\n                    'displayname': u'xlogo',\n                    'execmode': u'builtin',\n                    'cat': u'utilities',\n                    'id': u'xlogo.d',\n                    'icon': u'xlogo.svg',\n                    'hideindock': False,\n                    'args': '' \n}\n
"},{"location":"2.0/config/host_config/","title":"host_config resource description","text":"

host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

The same host_config format is reused in a multiple configuration files. host_config is present in applist.json file to build application image, and in od.config to set default running values in desktop and in application.

For example you can set low cpu and memory values to an application like the great X11 xeyes.

{   \n    \"mem_limit\":  \"32M\", \n    \"shm_size\":   \"OM\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n
"},{"location":"2.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period int The length of a CPU period in microseconds. cpu_quota int Microseconds of CPU time that the container can get in a CPU period. cpu_shares int CPU shares relative weight. cpuset_cpus str CPUs in which to allow execution 0 3 0 1 . cpuset_mems str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules list A list of cgroup rules to apply to the container. device_read_bps bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops IO per second Limit read rate from a device. device_write_bps bytes per second Limit write rate from a device. device_write_iops IO per second Limit write rate from a device. devices list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode str Set the IPC mode for the container. mem_limit float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation float or str Memory soft limit mem_swappiness int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable bool Whether to disable OOM killer. oom_score_adj int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size str or int Size of /dev/shm e.g. 1G. cap_add list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}for example to permit the call ptrace: SYS_PTRACE, trace arbitrary processes using ptrace, and SYS_ADMIN, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop list of str Drop kernel capabilities. dns list Set custom DNS servers. dns_opt list Additional options to be added to the container\u2019s resolv.conf file dns_search list DNS search domains. extra_hosts dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add list List of additional group names and/or IDs that the container process will run as. isolation str Isolation technology to use. Default: None. pid_mode str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged bool Give extended privileges to this container. security_opt list A list of string values to customize labels for MLS systems such as SELinux. storage_opt dict Storage driver options per container as a key value mapping. sysctls dict Kernel parameters to set in the container. ulimits list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode str Sets the UTS namespace mode for the container. Supported values are: host runtime str Runtime to use with this container. network_mode str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"2.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"2.0/config/host_config/#auto_remove","title":"auto_remove","text":"

The auto_remove is use to remove or not remove an abcdesktop container application or desktop.

For example, when an application container is exited, do we need to remove the container, by running the docker rm command ?

By default the auto_remove is True. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False. Set this value to False only to troubleshoot an application.

In production this value MUST be set to True

"},{"location":"2.0/config/host_config/#cpu_period-cpu_quota","title":"cpu_periodcpu_quota","text":"

cpu_period Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.

cpu-quota impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.

"},{"location":"2.0/config/host_config/#privileged","title":"privileged","text":"

The privileged option runs a user container in privileged mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.

"},{"location":"2.0/config/host_config/#ipc_mode","title":"ipc_mode","text":"

The ipc_mode value is a string, the default value is 'shareable'. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.

value description '' Use daemon default. 'none' Own private IPC namespace. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system IPC namespace.

If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"2.0/config/host_config/#security_opt","title":"security_opt","text":"

The securityopt option allow to set the security_opt default value for a docker application container. security_opt is the docker parameter.

Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.

Syscall Description acct Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT. add_key Prevent containers from using the kernel keyring, which is not namespaced. bpf Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN. clock_adjtime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clock_settime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clone Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN for CLONE_* flags, except CLONE_USERNS. create_module Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE. delete_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. finit_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. get_kernel_syms Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. init_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. ioperm Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. iopl Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. kcmp Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. kexec_file_load Sister syscall of kexec_load that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT. kexec_load Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT. keyctl Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN. mbind Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. mount Deny mounting, already gated by CAP_SYS_ADMIN. move_pages Syscall that modifies kernel memory and NUMA settings. name_to_handle_at Sister syscall to open_by_handle_at. Already gated by CAP_DAC_READ_SEARCH. nfsservctl Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH. perf_event_open Tracing/profiling syscall, which could leak a lot of information on the host. personality Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root Deny pivot_root, should be privileged operation. process_vm_readv Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. process_vm_writev Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. ptrace Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE, because it could leak a lot of information on the host. query_module Deny manipulation and functions on kernel modules. Obsolete. quotactl Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN. reboot Don't let containers reboot the host. Also gated by CAP_SYS_BOOT. request_key Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. setns Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN. settimeofday Time/date is not namespaced. Also gated by CAP_SYS_TIME. stime Time/date is not namespaced. Also gated by CAP_SYS_TIME. swapon Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. swapoff Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. sysfs Obsolete syscall. _sysctl Obsolete, replaced by /proc/sys. umount Should be a privileged operation. Also gated by CAP_SYS_ADMIN. umount2 Should be a privileged operation. Also gated by CAP_SYS_ADMIN. unshare Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN, with the exception of unshare --user. uselib Older syscall related to shared libraries, unused for a long time. userfaultfd Userspace page fault handling, largely needed for process migration. ustat Obsolete syscall. vm86 In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN. vm86old In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN.

Read security_opt from the docker website.

"},{"location":"2.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilities cap_addcap_drop","text":"

This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :

securityContext:\n      capabilities:\n        desktop.capabilities\n

For example

    { \n        'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n    }\n

Permit a container to call ptrace:

Read the docker run command informations Docker run reference

By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.

Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.

Further reference information is available on the capabilities(7) - Linux man page

Set this value only to troubleshoot an application.

In production this value MUST be set to an empty dict {}

"},{"location":"2.0/config/jira/","title":"JIRA configuration","text":"

abcdesktop.io support JIRA

"},{"location":"2.0/config/jira/#jira-option","title":"JIRA option","text":"

In od.config add the jira option. jira option is a dictionary with the entries :

entry sample value \u00a0\u00a0 url https://domainexample.atlassian.net/ project_id ABCD username account@domain.local apikey XXXXXXXXXXXXXXXXXXXX

And fill the dictionary

jira : { \n            'url':          'https://domainexample.atlassian.net/',\n            'project_id':   'ABCD',\n            'username':     'account@domain.local',\n            'apikey' :      'XXXXXXXXXXXXXXXXXXXX' }\n

Then apply the new configuration file od.config by retrasting the daemon.

When jira option is set, a new icon issue appears at the top.

Click on the issue icon, a new window is appear.

Fill Summary and Your Report values

Then press the Send button. A notification message appears on the left top corner.

Log into your jira server, and check your backlog

Great you added a new issue tracking.

"},{"location":"2.0/config/language/","title":"Language entry in od.config","text":"

The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US

"},{"location":"2.0/config/language/#language-in-abcdesktopio-ocuser","title":"Language in abcdesktop.io oc.user","text":"

The language list must match with the oc.user local packages all ready installed.

If the language is not found, the default value is set to en_US

The oc.user.18.04 is built-in with the default language package :

apt-get install -y \\\n    language-pack-en \\\n    language-pack-fr \\\n    && locale-gen    \\\n    && apt-get clean\n

The full supported language list is set by default

language : [  'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n

This list must match with the Accept-Language request HTTP header.

"},{"location":"2.0/config/language/#language-in-abcdesktopio-applications","title":"Language in abcdesktop.io Applications","text":"

abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language request HTTP header. If the language is not found, the default value is set to en_US.

Hands-on:

Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.

"},{"location":"2.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language to en_US :","text":"

The launch LibreOffice Writer. The menu is set to en_US LibreOffice Writer use English/US en_US language.

"},{"location":"2.0/config/language/#set-the-web-browsers-default-language-to-fr_fr","title":"Set the web browser's default language to fr_FR :","text":"

You can keep the same abcdesktop.io users session, you do not need to logout.

The launch LibreOffice Writer. The menu is set to fr_FR LibreOffice Writer use French fr_FRlanguage.

Great you have change the language settings of applications running inside an abcdesktop docker container

"},{"location":"2.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"2.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"

By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.

Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:

sudo vi /etc/rsyslog.conf\n

Uncomment the following lines and save file :

module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n

"},{"location":"2.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"

Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:

sudo systemctl restart rsyslog\n

"},{"location":"2.0/config/logging/","title":"Logging configuration in od.config","text":"

The logging configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.

logging dict use the python logging module logging module

The syslog and graylog protocol messaging are supported too.

The default features for each handlers are :

handler Features console log message using a logging.StreamHandler to the stream: ext://sys.stdout formated as standard cherrypy_console log message using a logging.StreamHandler to the stream: ext://sys.stdout formatted as access cherrypy_access log message using a logging.StreamHandler to the file stream logs/access.log formatted as access cherrypy_trace log message using a logging.StreamHandler to the stream: logs/trace.log formatted as standard

Sub modules used by od.py can log information too.

Sub module Default Values docker.utils.config{ 'level': 'INFO' },urllib3.connectionpool{ 'level': 'ERROR'},

The logging sample configuration :

#              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
"},{"location":"2.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"2.0/config/stack/#stackmode","title":"stack.mode","text":"

stack.mode describes how abcdesktop.io can manage user's containers and application.

stack.mode Description standalone Use a dockerd only, this is for personal usage kubernetes Use a kubernetes services"},{"location":"2.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"

stack.kubernetesdefaultdomain is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes.

The default value is abcdesktop.svc.cluster.local

If option value mongodb or memcached are set, the values are NOT overridden, and keep unchanged.

If option value mongodb or memcached are set to None (by default), then stack.kubernetesdefaultdomain is used to complete the FQDN of mongodb and memcached servers name. This value is concatenated to the server hostname.

Hostname FQDN mongodbmongodb.abcdesktop.svc.cluster.localmemcachedmemcached.abcdesktop.svc.cluster.local

The dns resolution need a running core-dnsis the namespace kube-system

stack.kubernetesdefaultdomain is used also if desktop.desktopuseinternalfqdn: True

The pod name FQDN is built using the $podid.desktop.$stack.kubernetesdefaultdomain

For example, by default :

c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local

"},{"location":"2.0/config/syslog/","title":"Syslog configuration in od.config","text":""},{"location":"2.0/config/syslog/#add-syslog-server-support","title":"Add syslog server support","text":"
   'filters': [ 'odcontext' ],\n

syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.

syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.

"},{"location":"2.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"

Those running linux can simply modify their syslog configuration file following linux syslog config steps

For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :

docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
[2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
"},{"location":"2.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"

To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)

"},{"location":"2.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"

In handlers entry add the following lines:

        ,\n        'syslog': {\n          'class': 'logging.handlers.SysLogHandler',\n          'filters': [ 'odcontext' ],\n          'formatter': 'syslog',\n          'socktype': 2,\n          'address' : [ '192.168.0.52', 514 ]\n        }\n

Replace 192.168.0.52 ip address by your local IP Addresse.

You can get your local IP address using the following command:

hostname -I | cut -d ' ' -f1\n
"},{"location":"2.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"

In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog' handler in handlers list:

        '': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'INFO'\n        }\n\n       'cherrypy.error': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'ERROR',\n          'propagate': False\n        }\n
"},{"location":"2.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"
#              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    },\n    'syslog': {\n       'class': 'logging.handlers.SysLogHandler',\n       'filters': [ 'odcontext' ],\n       'formatter': 'syslog',\n       'socktype': 2,\n       'address' : [ '192.168.0.52', 514 ]\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
"},{"location":"2.0/config/syslog/#restart-pods","title":"Restart Pods","text":"

To restart Pods, we will delete and recreate all pods

"},{"location":"2.0/config/syslog/#delete-pods","title":"Delete pods","text":"

To delete pods, execute the following command:

kubectl delete -f abcdesktop.yaml\n
"},{"location":"2.0/config/syslog/#create-pods","title":"Create pods","text":"

To create pods, execute the following command:

kubectl create -f abcdesktop.yaml\n
"},{"location":"2.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"

At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:

tail /var/log/syslog\n

If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.

"},{"location":"2.0/config/webrtc/","title":"Sound server configuration","text":"

By default abcdesktop use the module-http-protocol-tcp from pulseaudio sound server to send wav data to the web browser

"},{"location":"2.0/config/webrtc/#pulseaudio-http-stream-by-default","title":"pulseaudio http stream (by default)","text":"

By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)

In terminal webshell run the command :

pactl -s /tmp/.pulse.sock list short modules\n
balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
"},{"location":"2.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"

To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)

abcdesktop update the pulseaudio configuration, and add module-rtp-send. The module-rtp-send pusleaudio send to the destination_ip (in this example 1.2.3.4)

pactl -s /tmp/.pulse.sock list short modules\n
balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0       module-augment-properties\n1       module-null-sink        sink_name=rtp  format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2       module-native-protocol-unix     auth-group=balloon socket=/tmp/.pulse.sock\n3       module-always-sink\n4       module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n

The sink_name is rtp, and the source for the module-rtp-send is rtp.monitor.

The default source is rtp.monitor

Source #\n        State: RUNNING\n        Name: rtp.monitor\n        Description: Monitor of RTP Multicast Sink\n        Driver: module-null-sink.c\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Owner Module: 5\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Base Volume: 65536 / 100% / 0.00 dB\n        Monitor of Sink: rtp\n        Latency: 0 usec, configured 160000 usec\n        Flags: DECIBEL_VOLUME LATENCY \n        Properties:\n                device.description = \"Monitor of RTP Multicast Sink\"\n                device.class = \"monitor\"\n                device.icon_name = \"audio-input-microphone\"\n        Formats:\n                pcm\n

The default output is

\nSource Output #0\n        Driver: module-rtp-send.c\n        Owner Module: 9\n        Client: n/a\n        Source: 4\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n        Corked: no\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Buffer Latency: 0 usec\n        Source Latency: 0 usec\n        Resample method: n/a\n        Properties:\n                media.name = \"RTP Monitor Stream\"\n                rtp.source = \"0.0.0.0\"\n                rtp.destination = \"1.2.3.4\"\n                rtp.mtu = \"1280\"\n                rtp.port = \"5119\"\n                rtp.ttl = \"1\"\n

By default, the format is pcm

Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n

To change the default format update the values in od.config file.

 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n

To get the 'audiopt' and 'audiortpmap' values, read the web pages

"},{"location":"2.0/config/webrtc/#requirements","title":"Requirements","text":""},{"location":"2.0/config/webrtc/#install-a-janus-server","title":"Install a janus server","text":""},{"location":"2.0/config/webrtc/#install-janus","title":"Install janus","text":"

Install a janus service from meetecho.com on a server

apt-get install janus\n
"},{"location":"2.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"

Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.

certificates: {\n    cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n    cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n    cert_pwd = \"secretpassphrase\"\n}\n
"},{"location":"2.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"

Update the od.config file, for example :

# WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
"},{"location":"2.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"

webrtc.enable is a boolean. The default value is False. Set this value to True to enable webrtc services for pulseaudio.

"},{"location":"2.0/config/webrtc/#webrtcserver","title":"webrtc.server","text":"

webrtc.server is a dict. The default value is None. Set all dictionnary values to enable webrtc access for pulseaudio and for the web browser client.

The hostip value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.

'hostip': '1.2.3.4'\n

The host value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn. This fqdn is used by the web browser.

webrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
"},{"location":"2.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"2.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"

The http request path is /API/manager

Path Params Response type /API/manager/buildapplist None Json object /API/manager/updateactivedirectorysite None Json object /API/manager/garbagecollector expirein=, force=False Json object"},{"location":"2.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"

buildapplist ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps. abcdesktop.io

Params Type Description None None None

example :

curl http://localhost/API/manager/buildapplist\n

Return the complete array if json images objects ready to run.

{\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
"},{"location":"2.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None

example :

curl http://localhost/API/manager/updateactivedirectorysite\n
"},{"location":"2.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein integer number in seconds since the container create date time force boolean garbage the container even if a user is connected

example :

curl \"http://localhost/API/manager/garbagecollector?expirein=9473\"\ncurl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"\n
"},{"location":"3.0/features/","title":"abcdesktop release 3.0","text":"

The abcdesktop release 3.0 has started in May 2022

"},{"location":"3.0/features/#architecture-abcdesktop-30","title":"Architecture abcdesktop 3.0","text":"

In release 3.0, the abcdesktop control plane uses only Kubernetes API. It doesn't depend to dockerd.

"},{"location":"3.0/features/#auth-service","title":"Auth service","text":"

Auth service supports LDAP Posix Account

"},{"location":"3.0/features/#user-pod","title":"User pod","text":""},{"location":"3.0/features/#applications","title":"Applications","text":"

Application can run as :

"},{"location":"3.0/features/#volumes","title":"Volumes","text":""},{"location":"3.0/features/#users-home-directories","title":"User's home directories","text":"

Define volumes to retain user's home directory files. User's home directory can be mounted as hostPath on each worker node or as persistentVolumeClaim. Get more informations about the persistentVolume and persistentVolumeClaim to retain user datas.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/","title":"application runtime Ephemeral container and Pod","text":"

An abcdesktop application can run as a kubernetes ephemeral container or as a pod.

An ephemeral container can access to share memory shm with the X11 server. An ephemeral container run always on the same node as the user pod, where the graphical container 'X11 server' is running. An ephemeral container does not prevent cpu and memory resource limits.

A pod can't access to share memory with the X11 server. An kubernetes pod can run on separated node from the user's pod node. For a pod, you can specify resource limits.

To describe the difference between ephemeral-container and pod-application, we use the game 2048, one instance come from alpine based on gtk, the second one come from ubuntu based on qt

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#requirements","title":"Requirements","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#start-a-shell-to-your-abcdesktop-server","title":"Start a shell to your abcdesktop server","text":"

Get a shell to your abcdestkop server.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#download-2048-alpine-and-2048-ubuntu-json-files","title":"Download 2048-alpine and 2048-ubuntu json files","text":"

Open a shell to your abcdesktop server

curl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl --output 2048-ubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d.3.0.json\n

Check that the json files are downloaded

$ ls -la *.json\n-rw-r--r-- 1 root root 29183 Dec 28 16:24 2048-alpine.d.3.0.json\n-rw-r--r-- 1 root root 29099 Dec 28 16:24 2048-ubuntu.d.3.0.json\n

Look at the label oc.containerengine for each json file

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#read-the-label-occontainerengine-for-2048-alpine","title":"Read the label oc.containerengine for 2048-alpine","text":"
cat 2048-alpine.d.3.0.json | jq -r '.[0].Config.Labels.\"oc.containerengine\"'\n

The response is ephemeral_container

ephemeral_container\n

This application 2048-alpine will start as an ephemeral_container

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#read-the-label-occontainerengine-for-2048-alpine_1","title":"Read the label oc.containerengine for 2048-alpine","text":"
cat 2048-ubuntu.d.3.0.json | jq -r '.[0].Config.Labels.\"oc.containerengine\"'\n

The response is pod_application

pod_application\n

This application 2048-ubuntu will start as a pod_application, it's a pod.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#put-2048-alpine-and-2048-ubuntu-applications-to-your-abcdesktop-service","title":"PUT 2048-alpine and 2048-ubuntu applications to your abcdesktop service","text":"
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-ubuntu.d.3.0.json\n

Each curl command returns a complete json document.

Wait for the pull pod are Ready

kubectl wait --for=condition=Ready pods --selector=type=pod_application --timeout=-1s -n abcdesktop\n

Wait for condition met

pod/pull-2048-alpine-install-4280c633e777dceb3f529f208b442c0dff891 condition met\npod/pull-2048-ubuntu-install-ee652f4ff381655768bcc09d54a9b62ab7684 condition met\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

Using a web browser, open the abcdesktop service url. If your are running abcdesktop on your local device, the url should be :

http://localhost:30443\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#choose-to-login-as-hermes","title":"Choose to login as hermes","text":"

Login in as the user Hermes Conrad

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#your-desktop-is-created","title":"Your desktop is created","text":"

Your desktop is created. By default your dock is empty.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#look-for-2048","title":"Look for 2048","text":"

In the search text area, write the keyword 2048

The two applications appear in the search result applications area.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#start-each-2048-application","title":"Start each 2048 application","text":"

Start 2048-ubuntu and 2048-alpine application

2048-ubuntu and 2048-alpine applications start. The application 2048-alpine can start quickly than the application 2048-ubuntu.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#lets-have-a-look-on-your-server-side","title":"Let's have a look on your server side","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#get-pod-application","title":"Get pod application","text":"

Get the running pod using kubectl get pods -n abcdesktop

kubectl get pods -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nhermes-app-2048-ubuntu-4dd6f    1/1     Running   0          8s\nhermes-db906                    4/4     Running   0          100s\nmemcached-od-57c57c4f9d-92fs2   1/1     Running   0          38m\nmongodb-od-f69ff6b5b-v6ztc      1/1     Running   0          38m\nnginx-od-58f86c4dc8-8n9lf       1/1     Running   0          25m\nopenldap-od-d66d66bf4-84lg8     1/1     Running   0          38m\npyos-od-5586b88767-gsdl8        1/1     Running   0          14m\nspeedtest-od-6c59bdff75-n6s66   1/1     Running   0          38m\n

The application 2048-ubuntu is listed as a pod. The application 2048-ubuntu is a pod. The prefix is the $userid-app for example hermes-app-2048-ubuntu-4dd6f, followed by the application name 2048-ubuntu and a uuid.

The application 2048-alpine is not a pod.

The application 2048-alpine is listed as an ephemeral container, inside the user pod hermes-db906

kubectl get pods hermes-db906  -o json -n abcdesktop | jq -r \".status.ephemeralContainerStatuses\"\n

The application 2048-alpine.d is listed in the .status.ephemeralContainerStatuses

[\n  {\n    \"containerID\": \"containerd://eb5c1c4c19e5581dfd6a7290f46b63ce073b318bc1f9980bd3e37153cb66e44b\",\n    \"image\": \"docker.io/abcdesktopio/2048-alpine.d:3.0\",\n    \"imageID\": \"docker.io/abcdesktopio/2048-alpine.d@sha256:2c3c46c22689b8f91cbd5ebd4d5f80c95bc5ba9b1e23f13aebb54121d2f6d590\",\n    \"lastState\": {},\n    \"name\": \"hermes-conrad-2048-alpine-1eef4\",\n    \"ready\": false,\n    \"restartCount\": 0,\n    \"state\": {\n      \"terminated\": {\n        \"containerID\": \"containerd://eb5c1c4c19e5581dfd6a7290f46b63ce073b318bc1f9980bd3e37153cb66e44b\",\n        \"exitCode\": 0,\n        \"finishedAt\": \"2023-05-17T14:38:13Z\",\n        \"reason\": \"Completed\",\n        \"startedAt\": \"2023-05-17T14:37:00Z\"\n      }\n    }\n  }\n]\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#ephemeral-container-versus-pod-application","title":"Ephemeral container versus Pod application","text":"

An ephemeral container can access to share memory shm with the X11 server. An ephemeral container run always on the same node as the X11 server.

A pod can't access to share memory with the X11 server. An Kubernetes pod can run on a separated node from the X11 server.

If your application need to share memory with X11 server, when you have to set the oc.containerengine label to ephemeral_container.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#compare-kubernetes-ephemeral-container-and-pod","title":"Compare kubernetes ephemeral container and pod","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#kubernetes-ephemeral-container","title":"Kubernetes ephemeral container","text":"

Use an ephemeral container to start an application have some advantages and some disadvantages.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#advantages","title":"advantages","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#disadvantages","title":"disadvantages","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#kubernetes-pod","title":"Kubernetes Pod","text":"

Use a kubernetes pod to start an application have some advantages and some disadvantages.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#advantages_1","title":"advantages","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#disadvantages_1","title":"disadvantages","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting","title":"Troubleshooting","text":""},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting-badshmseg-error","title":"Troubleshooting BadShmSeg error","text":"

If you configure 2048-alpine with gtk to start as a pod and not as an ephemeral container, you will get the BadShmSeg error

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#install-the-application-2048-alpine-with-error","title":"Install the application 2048-alpine-with-error","text":"
curl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-with-error.d.3.0.json\n2048-alpine-with-error.d.3.0.json\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#put-2048-alpine-with-error-applications-to-your-abcdesktop-service","title":"PUT 2048-alpine-with-error applications to your abcdesktop service","text":"
curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048-alpine-with-error.d.3.0.json\n

Wait for the pulled pod are Ready

kubectl wait --for=condition=Ready pods --selector=type=pod_application_pull --timeout=-1s -n abcdesktop\n

Wait for condition met

pod/pull-2048-alpine-with-error-install-935509a58088531ae57756 condition met\n

Login to your abcdesktop service

Using a web browser, open the abcdesktop service url. If your are running abcdesktop on your local device, the url should be :

http://localhost:30443\n
"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#choose-to-login-as-hermes_1","title":"Choose to login as hermes","text":"

Login in as the user Hermes Conrad

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#your-desktop-is-created_1","title":"Your desktop is created","text":"

Your desktop is created. By default your dock is empty.

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#look-for-2048_1","title":"Look for 2048","text":"

In the search text area, write the keyword 2048

The three applications appear in the search result applications area.

Start the 2048 (alpine gtk with error) application. It uses shared segment with X Window System, it must run as an ephemeral container, but as a pod it fails. The application starts but exit after few seconds, the content of the application does not appear.

In the abcdesktop menu, choose Settings |\u00a0Tasks.

Then select the Logs button. The error was 'BadShmSeg (invalid shared segment parameter)'.

(org.gnome.TwentyFortyEight:36): Gdk-WARNING **: 10:14:26.185: The program 'org.gnome.TwentyFortyEight' received an X Window System error.\nThis probably reflects a bug in the program.\nThe error was 'BadShmSeg (invalid shared segment parameter)'.\n(Details: serial 820 error_code 128 request_code 131 (MIT-SHM) minor_code 3)\n(Note to programmers: normally, X errors are reported asynchronously;\nthat is, you will receive the error a while after causing it.\nTo debug your program, run it with the GDK_SYNCHRONIZE environment\nvariable to change this behavior. You can then get a meaningful\nbacktrace from your debugger if you break on the gdk_x_error() function.)\n

If you are running QT application, you can disable the X11 MIT Shared Memory Extension support. The MIT-SHM is an extension to the X server which allows faster transactions by using shared memory. Container isolation blocks it. Qt applications can be forced not to use the extension, by setting the variable QT_X11_NO_MITSHM value to 1.

QT_X11_NO_MITSHM=1 \n

Note your can also use QT_XCB_NO_MITSHM value to 1

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting-chromium-application","title":"Troubleshooting chromium application","text":"

For chromium application disabled shm-usage with the parameters --disable-dev-shm-usage

"},{"location":"3.0/application/applicationruntime_ephemeralcontainer_pod/#troubleshooting-cannot-open-display-or-could-not-connect-to-display-error","title":"Troubleshooting cannot open display or could not connect to display error","text":"

When you start an application the log file write cannot open display error

kubectl logs hermes-app-2048-ubuntu-c7360cd025d04813ad5e0af74b6df4ba  -n abcdesktop \n
qt.qpa.xcb: could not connect to display 172.17.0.10:0\nqt.qpa.plugin: Could not load the Qt platform plugin \"xcb\" in \"\" even though it was found.\nThis application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.\n\nAvailable platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.\n

Using the web shell inside an abcdesktop session, start netstat -a command line

The result should show that the process Xvnc is listening on tcp port number 6000

hermes:~$ netstat  -anp\nActive Internet connections (servers and established)\nProto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    \ntcp        0      0 0.0.0.0:6000            0.0.0.0:*               LISTEN      82/Xvnc               \n

If Xvnc is not listening on tcp port number 6000

Update od.config to make Xvnc listen on tcp port number 6000

Open your od.config file, and look at the desktop.envlocal option.

Add 'X11LISTEN': 'tcp' to the dictionary :

desktop.envlocal :  {   'DISPLAY'               : ':0.0',\n                        'SET_DEFAULT_WALLPAPER' : 'welcometoabcdesktop.png',\n                        'X11LISTEN'             : 'tcp' }\n

Save your local od.config file.

To apply changes, you can replace the abcdesktop-config

kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

Then restart pyos pod

kubectl delete pod -l run=pyos-od -n abcdesktop\n

You should read on stdout

pod \"pyos-od-5586b88767-mrf28\" deleted\n
"},{"location":"3.0/application/createsampleapplication/","title":"Create a sample application in release 3.0","text":""},{"location":"3.0/application/createsampleapplication/#requirements","title":"Requirements","text":""},{"location":"3.0/application/createsampleapplication/#goals","title":"Goals","text":""},{"location":"3.0/application/createsampleapplication/#git-clone-application-repository","title":"git clone application repository","text":"

The abcdesktop application repository is https://github.com/abcdesktopio/oc.apps

git clone https://github.com/abcdesktopio/oc.apps.git\ncd oc.apps\n

And install nodejs packages for oc.apps

npm install\n
"},{"location":"3.0/application/createsampleapplication/#create-a-samplejson-file","title":"Create a sample.json file","text":"

abcdesktop uses a json file description to build an application.

Create a sample.json file

{\n  \"tag\": \"3.0\",\n  \"acl\": { \"permit\": [ \"all\" ] },\n  \"cat\": \"development\",\n  \"icon\": \"small.svg\",\n  \"apkpackage\": \"xterm\",\n  \"keyword\": \"xterm,shell,cmd\",\n  \"launch\": \"xterm.XTerm\",\n  \"name\": \"Xterm\",\n  \"path\": \"/usr/bin/xterm\",\n  \"rules\": { \"homedir\": { \"default\": true } },\n  \"template\": \"abcdesktopio/oc.template.alpine.minimal\"\n}\n
"},{"location":"3.0/application/createsampleapplication/#make-a-dockerfile-from-the-samplejson-file","title":"make a Dockerfile from the sample.json file","text":"

make.js is a command line for abcdesktop. make.js read a json file and create a Dockerfile

The make.js options are :

npm i argparse npm notice created a lockfile as package-lock.json. You should commit this file. + argparse@2.0.1 added 1 package and audited 1 package in 0.837s found 0 vulnerabilities

node make.js -r 3.0 -d True  -f sample.json\n

Your read on stdout.

Namespace(dockerfile='True', release='3.0', applicationfile='sample.json')\nBuilding image for release=3.0\nRead database json file=sample.json\nOnly one file option to force output to dockerfile=True\nopening file sample.json\napplist.json entries: 1\n{ tag: '3.0',\n  acl: { permit: [ 'all' ] },\n  cat: 'development',\n  icon: 'small.svg',\n  apkpackage: 'xterm',\n  keyword: 'xterm,shell,cmd',\n  launch: 'xterm.XTerm',\n  name: 'Xterm',\n  path: '/usr/bin/xterm',\n  rules: { homedir: { default: true } },\n  template: 'abcdesktopio/oc.template.alpine.minimal' }\nBuilding xterm.XTerm\n

Read the Dockerfile

cat Dockerfile\n
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=3.0\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update xterm\nENV BUSER balloon\nLABEL oc.icon=\"small.svg\"\nLABEL oc.icondata=\"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xterm,xterm,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"xterm.XTerm\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nLABEL oc.name=\"Xterm\"\nLABEL oc.displayname=\"Xterm\"\nLABEL oc.path=\"/usr/bin/xterm\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"Xterm\"\nENV APPBIN \"/usr/bin/xterm\"\nENV APP \"/usr/bin/xterm\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nUSER balloon\nCMD [\"/composer/appli-docker-entrypoint.sh\"]\nWORKDIR /home/balloon\n
"},{"location":"3.0/application/createsampleapplication/#build-the-abcsample30-from-dockerfile","title":"build the abcsample:3.0 from Dockerfile","text":"
docker build -t abcsample:3.0 .\n
Sending build context to Docker daemon  44.21MB\nStep 1/29 : ARG TAG=3.0\nStep 2/29 : FROM abcdesktopio/oc.template.alpine.minimal:$TAG\n ---> 8528ff0674c7\nStep 3/29 : USER root\n ---> Using cache\n ---> 10372fb6f76c\nStep 4/29 : RUN apk add --no-cache --update xterm\n ---> Using cache\n ---> f222db3926f1\nStep 5/29 : LABEL oc.icon=\"small.svg\"\n ---> Running in 3303dde31f46\nRemoving intermediate container 3303dde31f46\n ---> 2cb2fac76cbd\nStep 6/29 : LABEL oc.icondata=\"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\"\n ---> Running in 65170013c043\nRemoving intermediate container 65170013c043\n ---> 52af61054ac3\nStep 7/29 : LABEL oc.keyword=\"xterm,xterm,shell,cmd\"\n ---> Running in ad13bedc4b0a\nRemoving intermediate container ad13bedc4b0a\n ---> 5bde38f46888\nStep 8/29 : LABEL oc.cat=\"development\"\n ---> Running in 238c24528439\nRemoving intermediate container 238c24528439\n ---> 886ede105940\nStep 9/29 : LABEL oc.launch=\"xterm.XTerm\"\n ---> Running in 1b2c45e68c29\nRemoving intermediate container 1b2c45e68c29\n ---> cf827822a393\nStep 10/29 : LABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\n ---> Running in 8adfa795a837\nRemoving intermediate container 8adfa795a837\n ---> 5e17811c5290\nStep 11/29 : LABEL oc.name=\"Xterm\"\n ---> Running in e2ed34859ca2\nRemoving intermediate container e2ed34859ca2\n ---> e3ed08726ea1\nStep 12/29 : LABEL oc.displayname=\"Xterm\"\n ---> Running in 636fa338c00f\nRemoving intermediate container 636fa338c00f\n ---> 0c756bf8c322\nStep 13/29 : LABEL oc.path=\"/usr/bin/xterm\"\n ---> Running in 2a7355d27588\nRemoving intermediate container 2a7355d27588\n ---> 06ae4c2fdaa7\nStep 14/29 : LABEL oc.type=app\n ---> Running in 0c6f5f1c9d07\nRemoving intermediate container 0c6f5f1c9d07\n ---> 4bd3f1462669\nStep 15/29 : LABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\n ---> Running in 1d836f666a9e\nRemoving intermediate container 1d836f666a9e\n ---> 28ed74393046\nStep 16/29 : LABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\n ---> Running in 3489fb9b8571\nRemoving intermediate container 3489fb9b8571\n ---> 902caf61d44f\nStep 17/29 : RUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi\n ---> Running in 0de74bad43c7\nRemoving intermediate container 0de74bad43c7\n ---> 720830424aeb\nStep 18/29 : RUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi\n ---> Running in 47b9a1b745e1\nRemoving intermediate container 47b9a1b745e1\n ---> 9f63628f1cb5\nStep 19/29 : ENV APPNAME \"Xterm\"\n ---> Running in d175a1ece669\nRemoving intermediate container d175a1ece669\n ---> 150c4cfe4aa3\nStep 20/29 : ENV APPBIN \"/usr/bin/xterm\"\n ---> Running in 997fee55d34e\nRemoving intermediate container 997fee55d34e\n ---> 425ac1a6e205\nStep 21/29 : ENV APP \"/usr/bin/xterm\"\n ---> Running in 53dd44a513fd\nRemoving intermediate container 53dd44a513fd\n ---> 7df215f71bec\nStep 22/29 : USER root\n ---> Running in 003691cdc4f2\nRemoving intermediate container 003691cdc4f2\n ---> 0af1892ae7ad\nStep 23/29 : RUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\n ---> Running in 47d3dff0120d\nRemoving intermediate container 47d3dff0120d\n ---> bd4bc4ebf2cf\nStep 24/29 : RUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\n ---> Running in 91dfbff4d2d2\nRemoving intermediate container 91dfbff4d2d2\n ---> 230d75aceb20\nStep 25/29 : RUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\n ---> Running in 4e0d720f0cfd\nRemoving intermediate container 4e0d720f0cfd\n ---> 2545327438db\nStep 26/29 : RUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\n ---> Running in 37770cba900b\nRemoving intermediate container 37770cba900b\n ---> 06ba8e872dfb\nStep 27/29 : RUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\n ---> Running in 88f16a8cbe63\nRemoving intermediate container 88f16a8cbe63\n ---> 7464bca775cd\nStep 28/29 : USER balloon\n ---> Running in b7ac37070372\nRemoving intermediate container b7ac37070372\n ---> e476af17dfbd\nStep 29/29 : CMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n ---> Running in 05b3b17a1c8c\nRemoving intermediate container 05b3b17a1c8c\n ---> e96d24e8088e\nSuccessfully built e96d24e8088e\nSuccessfully tagged abcsample:3.0\n
"},{"location":"3.0/application/createsampleapplication/#export-and-import-abcsample30","title":"export and import abcsample:3.0","text":"

abcdesktop is designed to use a private or public image registry. A registry is a mandatory service to manage kubernetes cluster with some nodes.

In this case, we suppose we don't have a registry, and we use the same host to build and run application. We need to offer the registry service manually, and copy container image.

Export the image to OCI image format

docker save abcsample:3.0 -o abcsample.tar\n

Import abcsample into the namespace k8s.io using ctr

ctr -n k8s.io images import abcsample.tar\n
unpacking docker.io/library/abcsample:3.0 (sha256:5ea681ec0e79928c15d9972f0ae3adfc197d55bfd27cd6cde8381a523c8ae8c0)...done\n
"},{"location":"3.0/application/createsampleapplication/#put-abcsample30-in-to-abcdesktop","title":"put abcsample:3.0 in to abcdesktop","text":"

Export the abcsample:3.0 image to OCI format

docker image inspect abcsample:3.0 > abcsample.json\n

Import the abcsample.json into abcdesktop endpoint /API/manager/image

curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @abcsample.json \n

Return a json document

[\n  {\n    \"home\": null,\n    \"cmd\": [\n      \"/composer/appli-docker-entrypoint.sh\"\n    ],\n    \"sha_id\": \"sha256:e96d24e8088ead49f0899498a377de88cf6b8b55f042bfe5dee4cfe385d71fe2\",\n    \"id\": \"abcsample:3.0\",\n    \"rules\": {\n      \"homedir\": {\n        \"default\": true\n      }\n    },\n    \"acl\": {\n      \"permit\": [\n        \"all\"\n      ]\n    },\n    \"launch\": \"xterm.XTerm\",\n    \"name\": \"Xterm\",\n    \"icon\": \"small.svg\",\n    \"icondata\": \"PHN2ZyB2ZXJzaW9uPSIxLjEiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJncmVlbiIvPjwvc3ZnPgo=\",\n    \"keyword\": \"xterm,xterm,shell,cmd\",\n    \"uniquerunkey\": null,\n    \"cat\": \"development\",\n    \"args\": null,\n    \"execmode\": null,\n    \"security_opt\": null,\n    \"showinview\": null,\n    \"displayname\": \"Xterm\",\n    \"mimetype\": [],\n    \"path\": \"/usr/bin/xterm\",\n    \"desktopfile\": null,\n    \"executablefilename\": \"xterm\",\n    \"usedefaultapplication\": null,\n    \"fileextensions\": [],\n    \"legacyfileextensions\": [],\n    \"host_config\": {},\n    \"secrets_requirement\": null,\n    \"run_inside_pod\": false,\n    \"image_pull_policy\": \"IfNotPresent\",\n    \"image_pull_secrets\": null\n  }\n]\n
"},{"location":"3.0/application/createsampleapplication/#run-the-new-application","title":"Run the new application","text":"

Open a web browser and go to abcdesktop service url.

Open a new abcdesktop session.

Look for your new application xterm

Start your new application xterm

The icon of then new application xterm is a green rect. It appears in the dock.

Logoff to free ressources.

You have created your own abcdesktop application, import the image, and start it. To get more details, look at the applist.json it describe all json applications for abcdesktop.

"},{"location":"3.0/application/createsampleapplication/#rebuild-all-images","title":"Rebuild all images","text":"

To rebuild all application in applist.json, run node make.js -r 3.0

node make.js -r 3.0\n

This command has create new '.d' files.

$ ls *.d\nls *.d\nalpine-2048.d            calculator.d    drawio.d               flare.d          hyper.d       kturtle.d       octave.d        remotedesktopmanager.d  terminal.d     winefile-wine.d  youtube.d\napachedirectorystudio.d  chess.d         edge.d                 frozen-bubble.d  impress.d     leocad.d        onlyoffice.d    rhythmbox.d             terminalpod.d  winemine-wine.d\nastromenace.d            chrome.d        elementary.terminal.d  gcompris.d       inkscape.d    librecad.d      openshift.d     robots.d                tetravex.d     winhelp-wine.d\natom.d                   chromium.d      eog.d                  gedit.d          kalzium.d     mahjongg.d      pinta.d         shotcut.d               thunderbird.d  winscp-wine.d\nbase.d                   citrix.d        evince.d               gelemental.d     kdiamond.d    math.d          planner.d       stellarium.d            ubuntu-2048.d  wireshark.d\nbeekeeperstudio.d        cloudfoundry.d  evolution.d            geogebra.d       kgeography.d  mathwar.d       postman.d       step.d                  vice.d         writer.d\nblender.d                cntlm.d         file-roller.d          gimagereader.d   kigo.d        minecraft.d     putty-unix.d    stress.d                vlc.d          xedit.d\nbless.d                  corsix-th.d     filelight.d            gimp.d           klickety.d    mines.d         putty-wine.d    sublime-text.d          vmmacos.d      xeyes.d\nblobby.d                 dia.d           filezilla.d            gnumeric.d       klotski.d     nautilus.d      qelectrotech.d  supertux2.d             vmrc.d         xman.d\nbrackets.d               doom.d          firefox-esr.d          golly.d          konsole.d     notepad-wine.d  remarkable.d    swell-foop.d            vmubuntu.d     xpad.d\ncalc.d                   draw.d          firefox.d              gretl.d          ksquares.d    notepadqq.d     remmina.d       teams.d                 vscode.d       xterm.d\n

Each .d file is a Dockerfile

Run make to build all applications (it can take more than 2 hours)

make\n
"},{"location":"3.0/config/authentification-rules/","title":"Authentification rules configuration","text":"

All auth providers support rules configuration

A rule take some parameters and set label to the auth user. All labels are stored inside the JWT Auth token. The labels are use to define a container execution context. For example to set a dedicated network for firefox application ( read the how-to )

"},{"location":"3.0/config/authentification-rules/#the-rule-object","title":"The rule object","text":"

A rule is a dictionary object with :

Example :

To test if the user source IP address is equal to 8.8.8.1/32

'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n
"},{"location":"3.0/config/authentification-rules/#the-conditions-object","title":"The conditions object","text":"

conditions is a list of condition. All condition are always tested, as a logical AND. The result must be equal to the expected value.

"},{"location":"3.0/config/authentification-rules/#examples","title":"Examples:","text":""},{"location":"3.0/config/authentification-rules/#example-true-and-true-expected-true","title":"Example (TRUE and TRUE) expected TRUE:","text":"

To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnet80'\n}\n

Add the labels 'shipcrewandnet80', if the 'expected' value is True

"},{"location":"3.0/config/authentification-rules/#example-true-and-true-expected-false","title":"Example (TRUE and TRUE) expected FALSE:","text":"

To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : False,\n    'label': 'noshipcrewandnet80'\n}\n

Add the labels 'noshipcrewandnonet80', if the 'expected' value is False

"},{"location":"3.0/config/authentification-rules/#example-true-and-false-expected-true","title":"Example (TRUE and FALSE) expected TRUE:","text":"

To test if the user source IP address is in the subnet to 80.0.0.0/8 AND is NOT a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : True },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : False } ], \n    'expected' : True,\n    'label': 'noshipcrewandnet80'\n}\n

Add the labels 'noshipcrewandnet80', if the 'expected' value is True

"},{"location":"3.0/config/authentification-rules/#example-false-and-true-expected-true","title":"Example (FALSE and TRUE) expected TRUE:","text":"

To test if the user source IP address is NOT in the subnet to 80.0.0.0/8 AND is a memberOf ldap group DN 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'

 'rule-sample': { 'conditions':  [ \n    { 'network': '80.0.0.0/8', 'expected' : False },\n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewandnonet80'\n}\n

Add the labels 'shipcrewandnonet80', if the 'expected' value is True

"},{"location":"3.0/config/authentification-rules/#the-condition-value","title":"The condition value","text":"name description example boolean always true or false 'boolean' : 'true' httpheader test a HTTP header value 'httpheader': memberOf test if the LDAP user object is member of group 'memberOf': [ 'cn=ship_crew,ou=people,dc=planetexpress,dc=com'] network test if the client user IP Address is in a network subnet 'network': [ '1.2.3.4/24'] primarygroupid test if the LDAP user object has a attibute primaryGroupID and is equal to value 'primarygroupid': '513'"},{"location":"3.0/config/authentification-rules/#condition-boolean","title":"condition boolean","text":"

This condition is a dummy condition; Only use to force a label or to disable a test.

'boolean': boolean\n

The commun usage is

'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : True,\n                 'label': 'dummy'\n}\n

or alway False

'rule-dummy': { 'conditions':  [  { 'boolean': True, 'expected' : True  } ],\n                   'expected' : False,\n                 'label': 'dummy'\n}\n
"},{"location":"3.0/config/authentification-rules/#condition-httpheader","title":"condition httpheader","text":"

This condition is test if a HTTP Header value is equal to a string.

'httpheader': dict\n

example : if the 'User-Agent' is equal to 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' then add the label 'chromemaxosx112'

\n 'rule-httpheader': { \n        'conditions' : [ \n            {   'httpheader': { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' }, \n                'expected' : True  } ],\n        'expected' : True,\n        'label': 'chromemaxosx112' }\n\n
"},{"location":"3.0/config/authentification-rules/#condition-network","title":"condition network","text":"

This condition is test if the client source ip address is in a subnet. IPv4 and IPv6 are supported.

'network': string\n

example

To test if the user source IP address is equal to 8.8.8.1/32

'rule-home': { \n    'conditions' : [   { 'network': '8.8.8.1/32', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'homeipsource' }\n

To test if the user source IP address is in the subnet 10.0.0.0/8

'rule-localnet': { \n    'conditions' : [   { 'network': '10.0.0.0/8', 'expected' : True } ],\n                         'expected' : True,\n                         'label': 'localnet' }\n

To test if the user source IP address is NOT in the subnet 192.168.0.0/24

'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : False } ],\n                         'expected' : True,\n                         'label': 'no192168net' }\n

same as

'rule-localnet': { \n    'conditions' : [   { 'network': '192.168.0.0/24', 'expected' : True } ],\n                         'expected' : False,\n                         'label': 'no192168net' }\n
"},{"location":"3.0/config/authentification-rules/#ipv4-and-ipv6-subnets-support","title":"IPv4 and IPv6 subnets support","text":"

To support private ip addresses subnet in the rfc 1918 and rfc 3927, write separated rules. Both IPv6 and IPv4 addresses are supported. You can share the same label privatenetwork a separated rule.

'policies': {\n    'acl' : {},\n    'rules' : { \n          'rule-privatenetwork-10': {   'conditions' : [ { 'network': '10.0.0.0/8', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-172': {'conditions' : [ { 'network': '172.16.0.0/12', 'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-192': {'conditions' : [ { 'network': '192.168.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'Rule-privatenetwork-169': {'conditions' : [ { 'network': '169.254.0.0/16',     'expected' : True } ], \n                                            'expected'   : True, \n                                            'label': 'privatenetwork' },\n          'rule-privatenetwork-fe80':{  'conditions' : [ { 'network': 'fe80::/10',     'expected' : True } ], \n                                                'expected'   : True, \n                                                'label': 'privatenetwork' }\n    }\n}                       \n
"},{"location":"3.0/config/authentification-rules/#condition-memberof","title":"condition memberof","text":"

This condition test if the user is a member of a LDAP Distinguished Name.

'memberOf': string\n
 'rule-sample': { 'conditions':  [ \n    { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',  'expected' : True } ], \n    'expected' : True,\n    'label': 'shipcrewgrp'\n}\n
"},{"location":"3.0/config/authentification-rules/#condition-primarygroupid","title":"condition primarygroupid","text":"

This test is only used with Microsoft Active Directory. primarygroupid test if the user attibute primaryGroupID is equal to a string.

'primarygroupid': string\n

To check is a user is memberof a DOMAIN\\USER the primary group id is 513

'rule-domainuser': {    'conditions':  [ { 'primarygroupid': '513', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'domainuser'\n}\n

However, if the user needed to be seen as a Domain Admin for POSIX, the PrimaryGroupID is 512, the RID for that group.

'rule-posixdomainadmin': {  'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'posixdomainadmin'\n}\n

The Enterprise Admins group, 519, is also used to grant this level in POSIX.

'rule-enterpriseadmin': {   'conditions':  [ { 'primarygroupid': '519', 'expected' : True } ],\n                            'expected' : True,\n                            'label': 'enterpriseadmin'\n}\n
"},{"location":"3.0/config/authentification/","title":"Authentification","text":""},{"location":"3.0/config/authentification/#configuration-file","title":"Configuration file","text":"

The authentification configuration is set in the od.config file. In this chapter you will need to update the od.config configuration file. This update differs depending on the configuration docker mode or kubernetes mode.

Read the Update your configuration file and apply the new configuration file section to make change in od.config file for kubernetes cluster.

"},{"location":"3.0/config/authentification/#the-dictionary-authmanagers","title":"The dictionary authmanagers","text":"

The authmanagers is defined as a dictionary object :

authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

The od.config defines four kinds of entries in the authmanagers object :

"},{"location":"3.0/config/authentification/#related-authmanagers","title":"Related authmanagers","text":"authmanagers type Description external For OAuth 2.0 authentification metaexplicit For Microsoft Active Directory Trusted relationship, with support of Foreign Security Principals and Special Identities explicit For LDAP, LDAPS, Active Directory Authentification, and Kerberos authentification implicit For anonymous authentification, for an always True Authentification, and SSL-client certificat"},{"location":"3.0/config/authentification/#hands-on","title":"Hands-on","text":""},{"location":"3.0/config/authentification/#requirements","title":"Requirements","text":"

You should have read the hands-on :

"},{"location":"3.0/config/authentification/#change-authmanagers-configuration","title":"Change authmanagers configuration","text":"

Edit your od.config pyos configuration file, and set the value to the authmanagers dictionary with empty values for implicit, explicit, and external, as describe :

authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { }\n}\n

Save your new od.config file, and restart the pyos pod

Start your web browser and open the URL http://localhost:30443

The Web home page should only show the title abcdesktop.io. There is no authmanagers available.

Great you can now add some value to authenticate your users.

"},{"location":"3.0/config/authentification/#authmanagers-implicit","title":"authmanagers implicit:","text":"

implicit is the easiest configuration mode, and is used to run Anonymous authentification (always True). Read the authmanagers implicit Section.

"},{"location":"3.0/config/authentification/#authmanagers-explicit","title":"authmanagers explicit:","text":"

explicit is defined to use a directory service like LDAP. Read the authmanagers explicit Section.

"},{"location":"3.0/config/authentification/#authmanagers-metaexplicit","title":"authmanagers metaexplicit:","text":"

metaexplicit offers a support to Microsoft Active Directory Trusted relationship, with support of Foreign Security Principals and Special Identities. Read the authmanagers explicit Section.

"},{"location":"3.0/config/authentification/#authmanagers-external","title":"authmanagers external:","text":"

external use external OAuth 2.0 authentication, for example Google OAuth 2.0, or Github OAuth 2.0 Read the authmanagers external Section.

"},{"location":"3.0/config/authentification/#authmanagers-sample","title":"authmanagers sample","text":"

In the authmanagers implicit section, authmanagers explicit section, and authmanagers external section, you have learned how to defined the providers.

You can set a complete authmanagers dictionary as described with external, explicit and implicit

authmanagers: {\n   'external': {\n    'providers': {\n      'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      },\n      'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx', \n        'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        },\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      },\n      'github': {\n        'displayname': 'Github',\n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'read:user' ], \n        'client_id': 'xxxx',\n        'client_secret': 'xxxx',\n        'redirect_uri_prefix' : 'https://www.mydomain.com/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=github',\n        'authorization_base_url': 'https://github.com/login/oauth/authorize',\n        'token_url': 'https://github.com/login/oauth/access_token',\n        'userinfo_url': 'https://api.github.com/user',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n    }\n  },\n  'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n    }\n  },\n  'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n  }}\n\n\nadconfig : { \n  'AD': { \n      'default' : True, \n      'ldap_timeout': 15,\n      'ldap_basedn': 'DC=ad,DC=domain,DC=local',\n      'ldap_fqdn': '_ldap._tcp.ad.domain.local',\n      'domain': 'AD',\n      'auth_type': 'KERBEROS',\n      'domain_fqdn': 'AD.DOMAIN.LOCAL',\n      'krb5_conf': '/etc/krb5.conf',\n      'servers'    :  [ 'ldap://192.168.7.12' ],\n      'kerberos_realm': 'AD.DOMAIN.LOCAL',\n      'serviceaccount': { 'login': 'svcaccount', 'password':'account' },\n     'auth_protocol' : { \n            'ntlm': True, \n            'cntlm': False, \n            'kerberos': True, \n            'citrix': False, \n            'localaccount': True },\n     'query_dcs' : False } } }\n
"},{"location":"3.0/config/authexplicit-activedirectory/","title":"Authentification explicit for Microsoft Active Directory services","text":""},{"location":"3.0/config/authexplicit-activedirectory/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

For example :

'explicit': {\n    'show_domains': True,\n    'default_domain': 'AD',\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string Default domain name prefix if the user format does not containthe domain prefix like DOMAIN\\USER. If the user login value is USER, the login is prefixed with the default_domain\\USER providers dictionnary { 'AD': { 'config_ref': 'adconfig', 'enabled': True }}"},{"location":"3.0/config/authexplicit-activedirectory/#providers-configuration","title":"providers configuration","text":"

The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set as the USERDOMAIN and defined in the config_ref with the exact same value.

Providers :

The provider is formated as a dictionnary

{ 'AD': { 'config_ref': 'adconfig', 'enabled': True } }

Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

The adconfig is a dictionnary. For example :

adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n

If this example, the Microsoft Active Directory value are set to :

Variable name Value for example USERDOMAINADUSERDNSDOMAINAD.DOMAIN.LOCAL

For Active Directory authmanagers, replace the variable name with your own value.

Variable name Type Description Example default boolean Use this domain as default domain True ldap_basedn string LDAP Base Distinguished Names DC=ad,DC=domain,DC=localldap_fqdn string _ldap._tcp.Domain_Name _ldap._tcp.ad.domain.localdomain_fqdn string domain FQDN (also know as Domain_Name) AD.DOMAIN.LOCALservers list of string list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]kerberos_realm string Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL

The explicit authentification is support LDAP and LDAPS bind.

The Microsoft Active Directory value are set to :

Variable name Value USERDOMAINADUSERDNSDOMAINAD.DOMAIN.LOCAL

For Active Directory authmanagers, replace the variable name with your own value.

Variable name Description Example ldap_basedn Replace ldap_basedn with your LDAP Base Distinguished Names DC=ad,DC=domain,DC=localldap_fqdn Replace ldap_fqdn with the _ldap._tcp fqdn _ldap._tcp.ad.domain.localdomain_fqdn Replace domain_fqdn with domain FQDN value AD.DOMAIN.LOCALservers Replace servers with list of the Active Director servers [ '192.168.1.12', '192.168.1.13' ]kerberos_realm Replace kerberos_realm wih your kerberos realm (in UPPER CASE) AD.DOMAIN.LOCAL"},{"location":"3.0/config/authexplicit-activedirectory/#service-account","title":"Service Account","text":"

The service account is use when od.py starts. It runs query to the Active Directory service to read the subnet and location from the sites in 'CN=Subnets,CN=Sites,CN=Configuration,' + BASE_DN , (for example CN=Subnets,CN=Sites,CN=Configuration,DC=example,DC=com)

"},{"location":"3.0/config/authexplicit-activedirectory/#site","title":"Site","text":"

This features is only available if a service account is defined. Site is used to locate a user from his ip adress. The attributs location and subnet are cached in memory.

Variable name Type Defautl value site_subnetdn string CN=Subnets,CN=Sites,CN=Configuration, + config.get('basedn') )site_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=subnet)site_attrs list ['cn', 'siteObject', 'location']"},{"location":"3.0/config/authexplicit-activedirectory/#printers","title":"Printers","text":"

This features is only available if a service account is defined. Printers are used to list printer available in the current user's site. The site is identified using the user's ip address. location is the join key to match local printer for the user.

Variable name Type Defautl value printer_printerdn string OU=Applications + config.get('basedn')printer_scope ldap python ldap.SCOPE_SUBTREE read Python ldap reference for more details site_filter string (objectClass=printQueue)site_attrs list [ 'cn', 'uNCName', 'location', 'driverName', 'driverVersion', 'name', 'portName', 'printColor', 'printerName', 'printLanguage', 'printSharename', 'serverName', 'shortServerName', 'url', 'printMediaReady', 'printBinNames', 'printMediaSupported', 'printOrientationsSupported' ]

Great, you have check how the explicit Authentification configuration works.

"},{"location":"3.0/config/authexplicit-ldap/","title":"Authentification explicit for LDAP Directory Services","text":""},{"location":"3.0/config/authexplicit-ldap/#authmanagers-explicit-object","title":"authmanagers explicit object","text":"

explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

For example :

'explicit': {\n    'show_domains': True,\n    'providers': {\n      'LDAP': { \n        'config_ref': 'ldapconfig', \n        'enabled': True\n       }\n}\n

In this example, ldapconfig dict must have a key LDAP

Variable name Type Description show_domains boolean Permit the domain name to be listed in API getclientdata, the default value is False default_domain string not used by ldap, only used by Active Directory providers dictionnary { 'LDAP': { 'config_ref': 'ldapconfig', 'enabled': True }}"},{"location":"3.0/config/authexplicit-ldap/#providers-configuration","title":"providers configuration","text":"

The provider authentification configuration is defined as a dictionnary object and must contain a key name. The key name must be set with the same value in providers configuration and config_ref.

Providers :

The provider is formated as a dictionnary

{ 'planet': { 'config_ref': 'ldapconfig', 'enabled': True } }

Variable name Type Description config_ref string For increased legibility, the USERDOMAIN configuration is defined in a dedicated dictionnary used the key:value 'config_ref': 'adconfig', where key is config_ref and value is the dictionnay variable name. enable boolean enable or disable the domain entry

The ldapconfig is a dictionnary.

For example :

ldapconfig : { 'planet': {    'default'       : True, \n                        'ldap_timeout'  : 15,\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ 'ldap://192.168.8.195' ],\n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' }\n           }}\n\n}\n
"},{"location":"3.0/config/authexplicit-ldap/#ldap-configuration-reference","title":"ldap configuration reference","text":"Variable name Type Description Example default boolean Use this domain as default domain True tls_require_cert boolean The default value is False. tls_require_cert apply only if ldap server URI starts with ldaps. Allow LDAPS connection if the ldaps server hostname does not match CommonName peer certificate. In production, set this value to True This will disable the ldap option call : ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) False basedn string LDAP Base Distinguished Names ou=people,dc=planetexpress,dc=comservers list of string list of LDAP servers (IP Adress or FQDN), if entry does not respond, the next one is used. [ 'ldap://192.168.1.12', 'ldaps://myldap.domain.org' ] IP Address or FQDN values scope LDAP Perform an LDAP search operation, with base as the DN of the entry at which to start the search, scope being one of SCOPE_BASE (to search the object itself), SCOPE_ONELEVEL (to search the object\u2019s immediate children), or SCOPE_SUBTREE (to search the object and all its descendants). ldap.SCOPE_SUBTREEtimeout integer ldap time out in second 10 exec_timeout integer execute time out in seconds, to obtain ntlm_auth credentials, or cntlm auth credentials, or kerberos auth credentials. the exec timeout is used to run external command line. 10 users_ou string Users Organisation Unit ou=people,dc=planetexpress,dc=comattrs list list of default attributs to read in user object. read the Definition of the inetOrgPerson LDAP Object Class filter string LDAP filter to find user object (&(objectClass=inetOrgPerson)(cn=%s))group_filter string LDAP filter to find group object (&(objectClass=Group)(cn=%s))group_attrs string LDAP filter to find group object (&(objectClass=Group)(cn=%s))"},{"location":"3.0/config/authexplicit-ldap/#the-ldap-structure-of-openldap-for-testing","title":"The LDAP structure of openldap for testing","text":"

The authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

"},{"location":"3.0/config/authexplicit-ldap/#basedn","title":"BaseDN","text":"

The basedn is dc=planetexpress,dc=com

"},{"location":"3.0/config/authexplicit-ldap/#admin-account","title":"admin account","text":"

The admin account is described as

Admin Secret cn=admin,dc=planetexpress,dc=com GoodNewsEveryone"},{"location":"3.0/config/authexplicit-ldap/#ou-users","title":"OU Users","text":""},{"location":"3.0/config/authexplicit-ldap/#users","title":"Users","text":""},{"location":"3.0/config/authexplicit-ldap/#cnhubert-j-farnsworthoupeopledcplanetexpressdccom","title":"cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hubert J. Farnsworth sn Farnsworth description Human displayName Professor Farnsworth employeeType Owner employeeType Founder givenName Hubert jpegPhoto JPEG-Photo (630x507 Pixel, 26780 Bytes) mail professor@planetexpress.com mail hubert@planetexpress.com ou Office Management title Professor uid professor userPassword professor"},{"location":"3.0/config/authexplicit-ldap/#cnphilip-j-fryoupeopledcplanetexpressdccom","title":"cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry"},{"location":"3.0/config/authexplicit-ldap/#cnjohn-a-zoidbergoupeopledcplanetexpressdccom","title":"cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn John A. Zoidberg sn Zoidberg description Decapodian displayName Zoidberg employeeType Doctor givenName John jpegPhoto JPEG-Photo (343x280 Pixel, 26438 Bytes) mail zoidberg@planetexpress.com ou Staff title Ph. D. uid zoidberg userPassword zoidberg"},{"location":"3.0/config/authexplicit-ldap/#cnhermes-conradoupeopledcplanetexpressdccom","title":"cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Hermes Conrad sn Conrad description Human employeeType Bureaucrat employeeType Accountant givenName Hermes mail hermes@planetexpress.com ou Office Management uid hermes userPassword hermes"},{"location":"3.0/config/authexplicit-ldap/#cnturanga-leelaoupeopledcplanetexpressdccom","title":"cn=Turanga Leela,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass inetOrgPerson cn Turanga Leela sn Turanga description Mutant employeeType Captain employeeType Pilot givenName Leela jpegPhoto JPEG-Photo (429x350 Pixel, 26526 Bytes) mail leela@planetexpress.com ou Delivering Crew uid leela userPassword leela"},{"location":"3.0/config/authexplicit-ldap/#groups","title":"Groups","text":""},{"location":"3.0/config/authexplicit-ldap/#cnadmin_staffoupeopledcplanetexpressdccom","title":"cn=admin_staff,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn admin_staff member cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com member cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com"},{"location":"3.0/config/authexplicit-ldap/#cnship_crewoupeopledcplanetexpressdccom","title":"cn=ship_crew,ou=people,dc=planetexpress,dc=com","text":"Attribute Value objectClass Group cn ship_crew member cn=Turanga Leela,ou=people,dc=planetexpress,dc=com member cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com member cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"},{"location":"3.0/config/authexplicit-ldap/#insert-the-user-credentials","title":"Insert the user credentials","text":"

Start your web browser and open the URL http://localhost

The Web home page contains the new input values Login and Password to authenticate this user.

You can use for example on user of the list above.

Credentials Value Login Turanga Leela Password leela

Insert the login credentials :

Turanga Leela as login and leela as password, then click on the Sign in button.

Look at the top of the sreen. The user name is Turanga Leela:

"},{"location":"3.0/config/authexplicit-ldap/#applications-remainted","title":"Applications remainted","text":"

Start LibreOffice Writer, and start a new file for your instructor. Type few words for example :

I like this amazing project abcdesktop.io\n

Do not save your file and just close your web browser.

Start your web browser again, and open the same URL http://localhost, and log in with the same account: Turanga Leela as login and leela as password, then click on the Sign in button.

The application LibreOffice Writer is still running and the greeting message I like this amazing project abcdesktop.io

All applications are maintained.

Great, you have check how the explicit Authentification configuration works, install an openldap directory service, and check that all sessions are maintained.

"},{"location":"3.0/config/authexplicit/","title":"Authentification explicit","text":""},{"location":"3.0/config/authexplicit/#authmanagers-explicit","title":"authmanagers explicit:","text":"

explicit authentification use a directory service. The bind operation is used to authenticate clients to the directory server, to establish an authorization identity that will be used for subsequent operations processed on that connection.

The explicit authentification configuration is defined as a dictionnary object and contains an explicit provider.

The explicit authentification support the directory services ldap, ldaps, and Microsoft Active Directory.

Configuration sample for Microsoft Active Directory

For example :

'explicit': {\n    'show_domains': True,\n    'providers': {\n      'AD': { \n        'config_ref': 'adconfig', \n        'enabled': True\n       }\n}\n
adconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn': 'AD.DOMAIN.LOCAL',\n                       'servers'    : [ '192.168.7.12' ],\n                        'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                        'query_dcs' : True,\n                        'wins_servers'  : [ '192.168.1.12' ],\n                        'serviceaccount': { 'login': 'SVCACCOUNT', 'password': 'SVCACCOUNTPASSWORD' }\n     }\n}\n
"},{"location":"3.0/config/authexplicit/#home-page-authentification","title":"Home page authentification","text":"

If the authmanagers explicit is enabled. The Web home page insert the new input values Login and Password to authenticate this user.

"},{"location":"3.0/config/authexplicit/#ldap-authmanagers","title":"LDAP authmanagers :","text":"

Read the specific chapter on LDAP LDAP and LDAPS explicit authmanagers

"},{"location":"3.0/config/authexplicit/#microsoft-active-directory-authmanagers","title":"Microsoft Active Directory authmanagers :","text":"

Microsoft Active Directory is implemented as a LDAP Server, start reading the chapter on LDAP LDAP and LDAPS explicit authmanagers, then read the specific chapter for Microsoft Active Director Microsoft Active Directory explicit authmanagers

Great, you have check how the explicit Authentification configuration works.

"},{"location":"3.0/config/authexternal/","title":"Authentification external","text":""},{"location":"3.0/config/authexternal/#requirements","title":"Requirements","text":"

To use external Authentification OAuth 1.0 and or OAuth 2.0, you need an internet FQDN and a secured web site with https.

"},{"location":"3.0/config/authexternal/#library","title":"Library","text":"

abcdesktop uses requests_oauthlib python module. Requests-OAuthlib uses the Python Requests and OAuthlib libraries for building OAuth1 and OAuth2 clients.

"},{"location":"3.0/config/authexternal/#authmanagers-external","title":"authmanagers external:","text":"

external authentification use OAuth 2.0 authenticaton.

The external authentification configuration is defined as a dictionary object and contains a list of external provider.

Sample providers entry using the Google OAuth 2.0 authentification service.

'external': {\n    'providers': {\n    'google': { \n    'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }   \n   }\n}\n

The variable values client_id and client_secret have been set to obfuscate value 'xxxx'. The FQDN hostname.domain.local is referred to your public server FQDN.

Variable name Type Description Sample displayname string Display Name show in Web front Googleenabled boolean LDAP Base Distinguished Names Trueclient_id string client id XXX-YYY.apps.googleusercontent.comclient_secret string client secret XXXscope list of string scope [ 'https://www.googleapis.com/auth/userinfo.email', 'openid' ]userinfo_url string dialog URL `https://www.googleapis.com/oauth2/v1/userinfo' redirect_uri_prefix string redirect URL https://hostname.domain.local/API/auth/oauthredirect_uri_querystring string URL query string manager=external&provider=googleauthorization_base_url string callback URL https://accounts.google.com/o/oauth2/v2/authtoken_url string token URL https://oauth2.googleapis.com/token

The complete redirect url concats the two values redirect_uri_prefix and redirect_uri_querystring.

"},{"location":"3.0/config/authexternal/#orange-oauth","title":"Orange OAuth","text":"

Orange's OAuth is supported for authentication. This API is based on OpenID Connect, which combines end-user authentication with OAuth2 authorisation.

"},{"location":"3.0/config/authexternal/#orange-application","title":"Orange Application","text":"

Create your Orange Application here https://developer.orange.com/apis and set credentials for Orange Authentification API in the section

 'orange': {       \n        'displayname': 'Orange', \n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'openid', 'form_filling' ],\n        'client_id': 'xxxx',\n        'client_secret': 'xxxx',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=orange',\n        'authorization_base_url': 'https://api.orange.com/openidconnect/fr/v1/authorize',\n        'token_url': 'https://api.orange.com/openidconnect/fr/v1/token', \n        'userinfo_url': 'https://api.orange.com/formfilling/fr/v1/userinfo',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n
"},{"location":"3.0/config/authexternal/#facebook-oauth","title":"Facebook OAuth","text":"

Facebook's OAuth is supported for authentication.

"},{"location":"3.0/config/authexternal/#facebook-application","title":"Facebook Application","text":"

Create your Facebook Application credentials here : https://developers.facebook.com/apps/ and set the credentials for Facebook Authentification API

'facebook': { \n        'displayname': 'Facebook', \n        'enabled': True,\n        'userinfo_auth': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx', \n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=facebook',\n        'authorization_base_url': 'https://www.facebook.com/dialog/oauth',\n        'userinfo_url': 'https://graph.facebook.com/v2.6/me?fields=picture.width(400),name',\n        'token_url': 'https://graph.facebook.com/v2.3/oauth/access_token',\n        'userinfomap': {\n            '*': '*',\n            'picture': 'picture.data.url'\n        },\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n
"},{"location":"3.0/config/authexternal/#google-oauth","title":"Google OAuth","text":"

Google's OAuth is supported for authentication. The client_id is the google's OAuth client ID, and the client_secret is the OAuth client secret.

"},{"location":"3.0/config/authexternal/#google-application","title":"Google Application","text":"

Create your Google credentials here : https://console.developers.google.com/apis/ and set the correct credentials for Google Authentification API in the section [gauth]

'google': { \n        'displayname': 'Google', \n        'enabled': True,\n        'client_id': 'xxxx', \n        'client_secret': 'xxxx',\n        'userinfo_auth': True,\n        'scope': [ 'https://www.googleapis.com/auth/userinfo.email',  'openid' ],\n        'userinfo_url': 'https://www.googleapis.com/oauth2/v1/userinfo',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=google',\n        'authorization_base_url': 'https://accounts.google.com/o/oauth2/v2/auth',\n        'token_url': 'https://oauth2.googleapis.com/token',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n
"},{"location":"3.0/config/authexternal/#github-oauth","title":"Github OAuth","text":"

GitHub's OAuth implementation supports the standard authorization code grant type and the OAuth 2.0 Device Authorization Grant for apps that don't have access to a web browser.

"},{"location":"3.0/config/authexternal/#github-oauth_1","title":"Github OAuth","text":"

Enable other users to authorize your OAuth App. Create your Github credentials here : authorizing-oauth-apps and set the correct credentials for Github Authentification API

'github': {\n        'displayname': 'Github',\n        'enabled': True,\n        'basic_auth': True,\n        'userinfo_auth': True,\n        'scope' : [ 'read:user' ], \n        'client_id': 'xxxx',\n        'client_secret': 'xxxx',\n        'redirect_uri_prefix' : 'https://hostname.domain.local/API/auth/oauth',\n        'redirect_uri_querystring': 'manager=external&provider=github',\n        'authorization_base_url': 'https://github.com/login/oauth/authorize',\n        'token_url': 'https://github.com/login/oauth/access_token',\n        'userinfo_url': 'https://api.github.com/user',\n        'policies': { 'acl'  : { 'permit': [ 'all' ] } }\n      }\n

Great, you have check how the implicit Authentification configuration works.

"},{"location":"3.0/config/authimplicit/","title":"Authentification implicit","text":""},{"location":"3.0/config/authimplicit/#authmanagers-implicit","title":"authmanagers implicit:","text":"

implicit is the easyest configuration mode, and is used as 'Anonymous' authentification.

The provider is defined as a dictionnary object and contains an anononymous provider.

anononymous provider always permit authentification, and create a uuid as userid. anononymous provider is used to skip the authentification process in a demonstration mode.

'implicit': {\n    'providers': {\n      'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous'\n      }     \n    }\n

anononymous provider always permit authentification, and create a uuid as userid.

Set in your configuration file the authmanagers dictionnary as described

authmanagers: {\n  'external': { },\n  'explicit': { },\n  'implicit': { \n     'providers': {\n         'anonymous': {\n           'displayname': 'Anonymous',\n           'caption': 'Anonymous',\n           'userid': 'anonymous',\n           'username': 'Anonymous'\n      } \n   }\n}\n

Update your configuration file and apply the new configuration file

Open a new Web Browser and go to your abcdesktop URL. You should see the login HTML page with the Anonymous button :

Press the Sign-In Anonymously button.

Then, choose the settings in the menu at the upper right corner

Choose the System in the settings control panel.

Then choose User containers

This screen show you the hostname.

You can read the hostname. In the example the hostname is f097ab7aac57, from the container id.

Using a shell, run the command docker ps -a

docker ps -a\n

Find a running container with the containerid previously identified.

In this example the containerid is f097ab7aac57

f097ab7aac57   abcdesktopio/oc.user.18.04   \"/composer/docker-en\u2026\"   8 minutes ago    Up 8 minutes               4714/tcp, 6081/tcp, 29780-29781/tcp, 29783-29784/tcp, 29786/tcp, 55556-55557/tcp   g-06b686a5-c98d-4889-b73d-3455f692e6c2\n

Run the command docker inspect CONTAINERID, replace the string CONTAINERID with your container id value.

For example docker inspect f097ab7aac57

docker inspect f097ab7aac57\n

Locate the Mounts description. User's containers created with an implicit provider anonymous have only one volume type. Anonymous home directory DO NOT USE persistant volume data. Explicit and

 \"Mounts\": [\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"tmp-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/tmp-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/tmp\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            },\n            {\n                \"Type\": \"volume\",\n                \"Name\": \"home-06b686a5-c98d-4889-b73d-3455f692e6c2\",\n                \"Source\": \"/var/lib/docker/volumes/home-06b686a5-c98d-4889-b73d-3455f692e6c2/_data\",\n                \"Destination\": \"/home/balloon\",\n                \"Driver\": \"local\",\n                \"Mode\": \"z\",\n                \"RW\": true,\n                \"Propagation\": \"\"\n            }\n        ],\n\n

When the anonymous container is removed, the anonymous home directory is deleted.

Great, you have check how the implicit Authentification configuration works.

"},{"location":"3.0/config/authmetaexplicit/","title":"Authentification metaexplicit for Microsoft Active Directory services with trust relationships","text":""},{"location":"3.0/config/authmetaexplicit/#authmanagers-metaexplicit-object","title":"authmanagers metaexplicit object","text":"

The metaexplicit authentification manager contains only one provider. The provider must be defined as metadirectory.

'metaexplicit': {\n    'providers': {\n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True\n       }\n}\n
Variable name Type Description providers dictionary { 'metadirectory': { 'config_ref': 'coporateconfig', 'enabled': True }}"},{"location":"3.0/config/authmetaexplicit/#metadirectory-provider-configuration","title":"metadirectory provider configuration","text":"

The metadirectory provider is defined as a dictionnary object and must contain key name. The key name must be set as the name of a dictionaryin the config_ref.

A metadirectory provider must contain a ldap attribut to describe the original DOMAIN and sAMaccountName. The ldap attribut is defined as join_key_ldapattribut.

coporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } } \n

Pyos binds the metadirectory ldap server with serviceaccount credentials Pyos read the ldap attribut description value to get the user's trusted domain.

For example :

description: AD\\john\n

Then pyos look for provider AD configuration and process authentification on domain AD

The metadirectory accounts can be disabled. The ldap attribut userAccountControl is not read on metaDirectory provider. The account can have the bit UF_ACCOUNT_DISABLE set or not.

A service account must defined for a metadirectory provider. The service account is used to bind the metadirectory.

"},{"location":"3.0/config/authmetaexplicit/#complete-example-with-a-metadirectory-provider-and-active-directory-user-domain","title":"Complete example with a metadirectory provider and active directory user domain","text":"

The user's domain mane is AD. The meta domain name is CORPORATE. The meta domain use a dedicated attribut join_key_ldapattribut

authmanagers: {\n  #\n  # define the meta explicit manager\n  # This is the trusted external forest for the followed domain\n  #\n  'metaexplicit': {\n    'providers': {\n      # define the metadirectory provider\n      # only one metadirectory provider is supported \n      'metadirectory': { \n        'config_ref': 'coporateconfig', \n        'enabled': True } \n    }\n  },\n\n  #        \n  # define the Active Directory provider for each DOMAIN\n  # define two domains in two disctinct forest with a trust relationship \n  # \n  'explicit': { \n    # define an Active Directory provider AD \n    'AD': {  'config_ref': 'adconfig', 'enabled': True },\n    # define an Active Directory provider ANOTHER\n    'ANOTHER': { 'config_ref': 'anotherconfig', 'enabled': True }  \n  }\n} # end of authmanagers\n\n# In this example ldap attribut's description contains AD\\myuser or ANOTHER\\myuser \ncoporateconfig : { 'metadirectory': {  \n                    'domain'        : 'CORPORATE',\n                    'ldap_basedn'   : 'DC=foo,DC=corporate,DC=local',\n                    'ldap_fqdn'     : '_ldap._tcp.foo.corporate.local',\n                    'servers'       : [ 'ldap://192.168.9.11', 'ldap://192.168.7.12', 'ldap://192.168.7.13' ],\n                    # join_key_ldapattribut must be defined for a metadirectory provider\n                    'join_key_ldapattribut' : 'description',\n                    'auth_type'  : 'KERBEROS',\n                    'domain_fqdn': 'foo.corporate.local',\n                    'kerberos_realm': 'FOO.CORPORATE.LOCAL',\n                    # serviceaccount must be defined for a metadirectory provider\n                    'serviceaccount': { 'login': 'svcaccount', 'password':'superpass' }\n                 } }\n\n\n# \n# define the first DOMAIN AD\n# The adconfig ref for domain AD\n#\nadconfig : { 'AD': {  'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                      'domain'        : 'AD',\n                      'auth_type'     : 'NTLM',\n                      'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                      'servers'       : [ 'ldap://192.168.7.12' ] } }\n\n#\n# define the second DOMAIN ANOTHER\n# The anotherconfig ref for domain ANOTHER\n#\nanotherconfig : { 'ANOTHER': {\n                      'ldap_basedn'   : 'DC=another,DC=super,DC=local',\n                      'ldap_fqdn'     : '_ldap._tcp.another.super.local',\n                      'domain'        : 'ANOTHER',\n                      'auth_type'     : 'KERBEROS',\n                      'domain_fqdn'   : 'ANOTHER.SUPER.LOCAL',\n                      'servers'       : [ 'ldap://192.168.10.12' ],\n                      'kerberos_realm': 'AD.SUPER.LOCAL' } }\n
"},{"location":"3.0/config/authmetaexplicit/#metadirectorysupport","title":"metadirectorysupport","text":"

metadirectory support the foreign security principal (FSP) to query security principal in the trusted external forest. These objects are created in the foreign security principals container of the domain. metadirectory support isMemberOf on foreign security principal.

The user's SID of domain 'AD' or 'ANOTHER' is NOT read. A new ldap bind is done using the trusted domain on metadirectory provider and not unsing the service account.

The ldap query is build : ( \"search_base={q.basedn}, search_scope={q.scope}, search_filter={filter}\" )

To get more information about foreign security principal (FSP), read :

"},{"location":"3.0/config/balloon/","title":"balloon user entry in od.config","text":"

balloon is the default generic user.

The balloon user is created inside the oc.user container

The default values are

balloon Default Values nameballoonuid4096gid4096homedirectory/home/balloon

If you change this value, you have to rebuild your own oc.user file The script oc.user in Dockerfile oc.user :

ENV BUSER balloon\nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"3.0/config/cloudprovider.loadbalancing/","title":"Use http cloud provider LoadBalancer service","text":""},{"location":"3.0/config/cloudprovider.loadbalancing/#goals","title":"Goals","text":""},{"location":"3.0/config/cloudprovider.loadbalancing/#requirements","title":"Requirements","text":""},{"location":"3.0/config/cloudprovider.loadbalancing/#update-nginx-service-to-use-http-loadbalancer","title":"Update nginx service to use http LoadBalancer","text":"

Replace type: NodePortby type: LoadBalancer into the nginx service

Save this yaml as nginx.service.http.loadbalancer.yaml file name

kind: Service\napiVersion: v1\nmetadata:\n  name: nginx\n  namespace: abcdesktop\nspec:\n  type: LoadBalancer\n  selector:\n    run: nginx-od \n  ports:\n  - protocol: TCP\n    port: 80\n    targetPort: 80\n    name: http\n
# delete the previous nginx service\nkubectl delete service nginx -n abcdektop\n# create the new  nginx service\nkubectl apply -f nginx.service.http.loadbalancer.yaml\n

Wait few minutes to obtain an ip address LoadBalancer from your cloud provider service

kubectl get services -n abcdesktop\nNAME        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE\ndesktop     ClusterIP      None             <none>        <none>            57m\nmemcached   ClusterIP      10.245.247.50    <none>        11211/TCP         57m\nmongodb     ClusterIP      10.245.198.243   <none>        27017/TCP         57m\nnginx       LoadBalancer   10.245.172.53    <pending>     80:30443/TCP      57m\nopenldap    ClusterIP      10.245.109.131   <none>        389/TCP,636/TCP   57m\npyos        ClusterIP      10.245.94.15     <none>        8000/TCP          57m\nspeedtest   ClusterIP      10.245.67.168    <none>        80/TCP            57m\n

You get the EXTERNAL-IP for your LoadBalancer service

kubectl get services -n abcdesktop\nNAME        TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)           AGE\ndesktop     ClusterIP      None             <none>         <none>            61m\nmemcached   ClusterIP      10.245.247.50    <none>         11211/TCP         61m\nmongodb     ClusterIP      10.245.198.243   <none>         27017/TCP         61m\nnginx       LoadBalancer   10.245.172.53    161.35.246.4   80:30443/TCP      61m\nopenldap    ClusterIP      10.245.109.131   <none>         389/TCP,636/TCP   61m\npyos        ClusterIP      10.245.94.15     <none>         8000/TCP          61m\nspeedtest   ClusterIP      10.245.67.168    <none>         80/TCP            61m\n

Open your web browser to reach the abcdesktop service. In this case, the loadbalancing service returns the ip address 161.35.246.4

Login using Philip J. Fry

And you should get the fry desktop

"},{"location":"3.0/config/cloudprovider.loadbalancing/#troubleshooting-with-port-forward","title":"Troubleshooting with port-forward","text":"

Use the kubectl port-forward command and a forwarded local port to help troubleshooting issues.

Get the pod name for nginx

kubectl get pods -l run=nginx-od -n abcdesktop\nNAME                        READY   STATUS    RESTARTS   AGE\nnginx-od-69fb8fd8bb-qg4z2   1/1     Running   0          11h\n

Choose the nginx's pod, to forward local port 80 to nginx 80

kubectl port-forward nginx-od-69fb8fd8bb-qg4z2 --address 0.0.0.0 80:80 -n abcdesktop\nForwarding from 0.0.0.0:80 -> 80\n

Your localhost is listening on 0.0.0.0:80 and forward to the nginx port 80

Then open your web browser http://localhost, you should get the home page, login using LDAP auth or Anonymous auth should work.

Then login, and you get a pod user.

For the first time, you may get a time out error, if all container image can not be downloaded in less than 180 seconds on the worker node.

kubectl get pods -n abcdesktop                                                   \nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-bdcbbcb74-nhd68    1/1     Running   0          11h\nmongodb-od-d46d79476-fmbj5      1/1     Running   0          11h\nnginx-od-69fb8fd8bb-qg4z2       1/1     Running   0          11h\nopenldap-od-795c55f6db-wz7l4    1/1     Running   0          11h\npyos-od-988887859-8kwdx         1/1     Running   0          11h\nspeedtest-od-6b5f8584f5-cs69t   1/1     Running   0          11h\nfry-2cf3a                       4/4     Running   0          4m15s\n

The user fry gets the abcdesktop pod fry-2cf3a

"},{"location":"3.0/config/cloudprovider.loadbalancing/#update-nginx-service-to-use-loadbalancer-service-with-https","title":"Update nginx service to use LoadBalancer service with https","text":"

This example works on digitalocean cloud provider.

First of all, you need to get your loadbalancer-certificate-id

To list available certificates and their IDs, install doctl and run the command

doctl compute certificate list\n

Then define annotations on the abcdesktop nginx service like

  service.beta.kubernetes.io/do-loadbalancer-certificate-id: \"3619b45a-714b-455c-a01a-e92fc8a29cbb\"\n  service.beta.kubernetes.io/do-loadbalancer-protocol: \"https\"\n  service.beta.kubernetes.io/do-loadbalancer-disable-lets-encrypt-dns-records: \"false\"\n

Create a loadbalancing.yaml file, to update the default abcdestkop service/nginx You need to replace service.beta.kubernetes.io/do-loadbalancer-certificate-id with your own certificate value.

---         \nkind: Service \napiVersion: v1\nmetadata:   \n  name: nginx \n  namespace: abcdesktop\n  annotations:\n    service.beta.kubernetes.io/do-loadbalancer-certificate-id: \"3619b45a-714b-455c-a01a-e92fc8a29cbb\"\n    service.beta.kubernetes.io/do-loadbalancer-protocol: \"https\"\n    service.beta.kubernetes.io/do-loadbalancer-disable-lets-encrypt-dns-records: \"false\"\n  labels:\n    abcdesktop/role: nginx\nspec: \n  type: LoadBalancer\n  selector:\n    run: nginx-od\n  ports:\n  - protocol: TCP\n    port: 443\n    targetPort: 80\n    name: https\n---\n

Apply the new loadbalancing.yaml file

kubectl apply -f loadbalancing.yaml\n

You can read

service/nginx configured\n

Check the nginx/services

kubectl get service/nginx -n abcdesktop\n
NAME    TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)         AGE\nnginx   LoadBalancer   10.245.188.146   161.35.246.4    443:32086/TCP   28m\n

Now you can replace http by the secure protocol https

"},{"location":"3.0/config/controllers/","title":"Controllers","text":""},{"location":"3.0/config/controllers/#controllers_1","title":"Controllers","text":"

abcdesktop is based on the Model View Controller (usually known as MVC). This MVC is used for developing user interfaces which divides the related program logic into three interconnected elements. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.

List of all abcdesktop's controllers and the description :

Controller Description AccountingController accounting data json format AuthController authenticate user ComposerController CRUD main services (like createDesktop, createApplication) CoreController get configuration and user message info ManagerController manage service (like add an application) UserController retrieve user information"},{"location":"3.0/config/controllers/#access-permission","title":"Access Permission","text":"

The controllers configuration is a dictionary, and is defined in the pyos's od.config file.

controllers : { \n    'AccountingController': { \n        'apikey': [ 'fPCdPNcCafec4lXm3M' ],\n        'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n    },\n    'ManagerController': { \n        'apikey': [ 'fQDbvjCafec4l', 'KzH23EZjCZSfsd9'],\n        'permitip': [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fd00::/8', '169.254.0.0/16', '127.0.0.0/8' ] \n    },\n    'AuthController' :      { 'permitip': None },\n    'ComposerController' :  { 'permitip': None },\n    'CoreController' :      { 'permitip': None },\n    'UserController' :      { 'permitip': None }\n} \n

By default, AccountingController and ManagerController access are protected by ip source filters. The configuration permits private networks defined in rfc1918 and rfc4193. Get more information about the private network.

By default, others controllers access is enabled, without any restriction.

"},{"location":"3.0/config/controllers/#access-control-filter","title":"Access control filter","text":"

The access control filter configuration is defined in a json dictionary. Each dictionary entry use the controller name and with entries permitip and/or apikey.

If the source ip address is denied, the response is a HTTP status is 403 code 403 Forbidden

{\"status\": 403, \"status_message\": \"403 Forbidden\", \"message\": \"Request forbidden -- authorization will not help\"} \n
"},{"location":"3.0/config/controllers/#curl-http-requests-sample","title":"Curl http requests sample","text":""},{"location":"3.0/config/controllers/#curl-http-request-with-x-api-key","title":"Curl http request with X-API-Key","text":"

Add the http header X-API-Key: fQDbvjCafec4l to the curl command to list images

curl -X GET -H 'X-API-Key: fQDbvjCafec4l' -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images\n

The command returns

{}\n

Add the http header X-API-Key: fQDbvjCafec4l to the curl command to add new application

curl -X POST -H 'X-API-Key: fQDbvjCafec4l'  -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xeyes.d.3.0.json\n

The command returns

[\n {  \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \n    \"path\": \"/usr/bin/xeyes\", \n    \"sha_id\": \"sha256:4ed2e110042b80f1634d8f3ae66b793914db813f53cd88811285448602d7540e\", \n    \"id\": \"abcdesktopio/xeyes.d:3.0\", \n    \"rules\": {}, \n    \"acl\": {\"permit\": [\"all\"]}, \n    \"launch\": \"xeyes.XEyes\", \n    \"name\": \"xeyes\", \n    \"icon\": \"circle_xfce4-eyes.svg\", \n    \"keyword\": \"xeyes,eyes\", \n    \"uniquerunkey\": null, \n    \"cat\": \"utilities\", \n    \"args\": null, \n    \"execmode\": null, \n    \"showinview\": null, \n    \"displayname\": \"xeyes\", \n    \"home\": null, \n    \"desktopfile\": null, \n    \"executeclassname\": null, \n    \"executablefilename\": \"xeyes\", \n    \"usedefaultapplication\": false, \n    \"mimetype\": [], \n    \"fileextensions\": [], \n    \"legacyfileextensions\": [], \n    \"secrets_requirement\": null, \n    \"image_pull_policy\": \"IfNotPresent\", \n    \"image_pull_secrets\": null, \n    \"containerengine\": \"ephemeral_container\", \n    \"securitycontext\": {}\n }\n]\n
"},{"location":"3.0/config/controllers/#curl-http-request-forbidden","title":"Curl http request forbidden","text":"
curl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/images\n

The command returns

{\"status\": 403, \"message\": \"Request forbidden -- authorization will not help\"}\n
"},{"location":"3.0/config/desktop/","title":"desktop options in od.config","text":"

The od.config contains options to describe how the oc.user and applications containers have to be created.

"},{"location":"3.0/config/desktop/#desktopoptions","title":"desktop.options","text":"

All desktop options are defined in od.config file. Desktop options start with the prefix desktop., then add the name of the option.

Option name Type Sample desktop.defaultbackgroundcolors list ['#6EC6F0', '#CD3C14', '#4BB4E6' ] desktop.homedirectorytype string 'hostPath' desktop.remotehomedirectorytype list [] desktop.persistentvolumespec string None desktop.persistentvolumeclaimspec string None desktop.homedirectorytype string 'hostPath' desktop.envlocal dictionary { 'X11LISTEN':'tcp'}desktop.nodeselector dictionary {}desktop.username string 'balloon' desktop.userid integer 4096 desktop.groupid integer 4096 desktop.userhomedirectory string '/home/balloon'desktop.useinternalfqdn boolean False desktop.uselocaltime boolean False desktop.policies dictionary { 'rules':{}, 'max_app_counter':5 }desktop.webhookdict dictionary {}"},{"location":"3.0/config/desktop/#desktophomedirectory","title":"desktop.homedirectory","text":"

This option describes how to create the home directory for the user. The value can be defined as :

To get more information about user's home directory volume, read the volumes chapter

"},{"location":"3.0/config/desktop/#desktopremotehomedirectorytype","title":"desktop.remotehomedirectorytype","text":"

desktop.remotehomedirectorytype is a list of string. Each string describe if the remount access to a directory is allowed. example [ 'cifs', 'webdav' ]

For each entry in the desktop.remotehomedirectorytype list, abcdesktop.io try to mount the remote file system using data from the implicit auth provider.

If desktop.remotehomedirectorytype contains 'cifs' and if the authentification provider get homeDrive and homeDirectory attributs then abcdesktop request the kubernetes abcdesktop/CIFS Driver to mount the remote filesystem. The user find a mount point named homeDrive value, and mounted to homeDirectory.

"},{"location":"3.0/config/desktop/#desktopdefaultbackgroundcolors","title":"desktop.defaultbackgroundcolors","text":"

The desktop.defaultbackgroundcolors allow you to change the default background color.

The default value is a list of string [ '#6EC6F0', '#333333', '#666666', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]

The desktop.defaultbackgroundcolors length can contain up to 8 entries. To see the color

Open the url http://localhost:30443, in your web browser, to start a simple abcdesktop.io container.

http://localhost:30443\n

You should see the abcdesktop.io home page.

Press the Connect with Anonymous access, have look

At the right top corner, click on the menu and choose Settings, then click on Screen Colors

You should see the default background colors, for example :

"},{"location":"3.0/config/desktop/#desktopenvlocal","title":"desktop.envlocal","text":"

desktop.envlocal is a dictionary. desktop.envlocal contains a (key,value) added as environment variables to oc.user.

The default value is :

{ \n  'X11LISTEN': 'tcp'\n}\n
"},{"location":"3.0/config/desktop/#reserved-variables","title":"Reserved variables","text":"Variable Values Description X11LISTENtcp permit X11 to listen on tcp port, default is udpABCDESKTOP_RUN_DIR/var/run/desktop directory to write pid services ABCDESKTOP_LOG_DIR/var/log/desktop directory to write log files services DISABLE_REMOTEIP_FILTERINGdisabled disabled remote ip filtering inside pod user, default is disabled, change to enabled to remove core ip filtering SET_DEFAULT_WALLPAPERmyfile.jpeg name of file to set the user wallpaper, this file must exist in ~/.wallpapersSET_DEFAULT_COLOR#6EC6F0 Value of default colour saved in file ~/.store/currentColorSENDCUTTEXTenabled \u00a0Send clipboard changes to user. Set value to disabled to disable clipboard changes to user web browser. This value is overwrite by label ABCDESKTOP_LABEL_sendcuttext if exist SENDCUTTEXT=${ABCDESKTOP_LABEL_sendcuttext:-$SENDCUTTEXT}. The default value is enabledACCEPTCUTTEXTenabled \u00a0Accept clipboard updates from user. Set value to disabled to disable clipboard changes to user web browser. This value is overwrite by label ABCDESKTOP_LABEL_acceptcuttext if exist ACCEPTCUTTEXT=${ABCDESKTOP_LABEL_acceptcuttext:-$ACCEPTCUTTEXT}. The default value is enabled"},{"location":"3.0/config/desktop/#desktopnodeselector","title":"desktop.nodeselector","text":"

desktop.nodeselector is a dictionary. This option permits to assign user pods to nodes.

It specifies a map of key-value pairs. For the pod to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels (it can have additional labels as well). The most common usage is one key-value pair.

The value must be a string, by example 'true', and matches the labels node value.

desktop.nodeselector:  { 'abcdesktopworker': 'true' }\n

To set a label abcdesktopworker=true to a node

kubectl label node $YOUR_NODE abcdesktopworker=true\n

The commands returns

node/nodesample01 labeled\n

To list all labels on all nodes

kubectl -n abcdesktop get nodes --template '{{range .items}}{{.metadata.labels}}{{\"\\n\"}}{{end}}'\n

The commands returns

map[beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3cp01 kubernetes.io/os:linux node-role.kubernetes.io/control-plane: node.kubernetes.io/exclude-from-external-load-balancers:]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws01 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws02 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\nmap[abcdesktopworker:true beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:abc3ws03 kubernetes.io/os:linux node-role.kubernetes.io/worker:worker]\n

desktop.nodeselector is used as selector by pyos to create user's pods and to pull container's images.

"},{"location":"3.0/config/desktop/#desktopusername","title":"desktop.username","text":"

desktop.username is the name of the default username inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.username is string. The default value is 'balloon'.

"},{"location":"3.0/config/desktop/#desktopuserid","title":"desktop.userid","text":"

desktop.userid describes the uid Number of the default user id number inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.userid is integer. The default value is 4096.

"},{"location":"3.0/config/desktop/#desktopgroupid","title":"desktop.groupid","text":"

desktop.groupid describes the gid Number of the default group id number inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entry The type of desktop.userid is integer. The default value is 4096.

"},{"location":"3.0/config/desktop/#desktopuserhomedirectory","title":"desktop.userhomedirectory","text":"

desktop.userhomedirectory describes the homedirectory of the user created inside the user's pod. If you define a LDAP auth with Posix ObjectClass support, this value is overwrite by the LDAP entrycontainer. The type of desktop.userhomedirectory is string. The default value is /home/balloon.

"},{"location":"3.0/config/desktop/#desktopuselocaltime","title":"desktop.uselocaltime","text":"

The desktop.uselocaltime is boolean, to use host value of /etc/localtime. The default value is False. If desktop.uselocaltime is True, this add a volume mapping from host file /etc/localtime to container file /etc/localtime.

"},{"location":"3.0/config/desktop/#desktoppolicies","title":"desktop.policies","text":"

desktop.policies has a dictionary format.

Entry Description max_app_counter limit applications counter, without checking the docker container status rules rules dictionary 'rules': { 'volumes': { 'domainuser': { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } }acl allow or denied desktop creation

Example

desktop.policies: { \n  'rules': { \n    'volumes': { \n      'domainuser':   { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' },\n      'Mygroupteam':  { 'type': 'cifs', 'name': 'toto', 'unc': '//192.168.7.101/team', 'volumename': 'team' } \n      } \n  },\n  'acls' : {},\n  'max_app_counter' : 4  \n}\n
"},{"location":"3.0/config/desktop/#desktopwebhookdict","title":"desktop.webhookdict","text":"

desktop.webhookdict is a dictionary to add key/value to the command create and destroy in rules objects.

"},{"location":"3.0/config/desktop/#experimental-features","title":"Experimental features","text":""},{"location":"3.0/config/desktop/#desktopdesktopuseinternalfqdn","title":"desktop.desktopuseinternalfqdn","text":"

WARNING desktop.desktopuseinternalfqdn is an experimental feature, keep this value to False in production

desktop.desktopuseinternalfqdn describes the content of the payload data in the JWT Desktop Token. The default value is False.

Nginx front end act as a reverse proxy. This reverse proxy use the FQDN of the user's pod to route http request. If this value is set to False the payload data in the JWT Desktop Token contains the IP Address of the user Pod. If this value is set to True the payload data in the JWT Desktop Token contains the FQDN of the user Pod.

If you CAN NOT add endpoint_pod_names in the coredns configuration, you MUST set desktop.desktopuseinternalfqdn to False. This choice is less secure.

To set desktop.desktopuseinternalfqdn to True value, you have to update the coredns ConfigMap.

kind: ConfigMap\napiVersion: v1\nmetadata:\n  name: coredns\n  namespace: kube-system\ndata:\n  Corefile: |\n    .:53 {\n        log\n        errors\n        health\n        ready\n        kubernetes cluster.local in-addr.arpa ip6.arpa {\n           endpoint_pod_names\n           pods insecure\n           fallthrough in-addr.arpa ip6.arpa\n           transfer to * \n           ttl 30\n        }\n        prometheus :9153\n        forward . /etc/resolv.conf\n        cache 30\n        loop\n        reload\n        loadbalance\n    }\n
"},{"location":"3.0/config/desktop.pod/","title":"desktop.pod","text":"

abcdesktop defines a user desktop as a group of user's containers. This is a main features of abcdesktop. Each container offers a service.

For example

"},{"location":"3.0/config/desktop.pod/#containers-in-the-user-pod","title":"containers in the user pod","text":"

Each service :

"},{"location":"3.0/config/desktop.pod/#default-desktoppod","title":"default desktop.pod","text":"
desktop.pod : { \n  'spec' : {\n    'shareProcessNamespace': True,\n    'shareProcessMemory': True,\n    'shareProcessMemorySize': '256Mi',\n    'securityContext': { \n      'supplementalGroups': [ '{{ supplementalGroups }}' ],\n      'runAsUser': '{{ uidNumber }}',\n      'runAsGroup': '{{ gidNumber }}',\n      'readOnlyRootFilesystem': False, \n      'allowPrivilegeEscalation': True\n    }\n  },  \n  'graphical' : { \n    'image': { 'default': 'abcdesktopio/oc.user.ubuntu:3.0' },\n    'imagePullPolicy': 'IfNotPresent',\n    'enable': True,\n    'acl': { 'permit': [ 'all' ] },\n    'waitportbin': '/composer/node/wait-port/node_modules/.bin/wait-port',\n    'resources': { \n            'requests': { 'memory': \"320Mi\", 'cpu': \"250m\"  }, \n            'limits':   { 'memory': \"1Gi\",   'cpu': \"1000m\" } \n    },\n    'shareProcessNamespace': True,\n    'tcpport': 6081,\n    'secrets_requirement' : [ 'abcdesktop/vnc', 'abcdesktop/kerberos']\n  },\n  'spawner' : { \n    'enable': True,\n    'tcpport': 29786,\n    'waitportbin' : '/composer/node/wait-port/node_modules/.bin/wait-port',\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'broadcast' : { \n    'enable': True,\n    'tcpport': 29784,\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'webshell' : { \n    'enable': True,\n    'tcpport': 29781,\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'printer' : { \n    'image': 'abcdesktopio/oc.cupsd:3.0',\n    'imagePullPolicy': 'IfNotPresent',\n    'enable': True,\n    'tcpport': 681,\n    # cupsd need to start as root\n    'securityContext': { 'runAsUser': 0 },\n    'resources': { \n      'requests': { 'memory': \"64Mi\", 'cpu': \"125m\" },  \n      'limits'  : { 'memory': \"512Mi\",  'cpu': \"500m\" } \n    },\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'printerfile' : { \n    'enable': True,\n    'tcpport': 29782,\n    'acl':  { 'permit': [ 'all' ] } \n  },\n  'filer' : { \n    'image': 'abcdesktopio/oc.filer:3.0',\n    'imagePullPolicy':  'IfNotPresent',\n    'enable': True,\n    'tcpport': 29783,\n    'acl':  { 'permit': [ 'all' ] } \n    },\n  'storage' : { \n    'image': 'k8s.gcr.io/pause:3.8',\n    'imagePullPolicy':  'IfNotPresent',\n    'enable': True,\n    'acl': { 'permit': [ 'all' ] },\n    'resources': { \n      'requests': { 'memory': \"32Mi\",  'cpu': \"100m\" },  \n      'limits'  : { 'memory': \"128Mi\", 'cpu': \"250m\" } \n    }\n  },\n  'sound': { \n    'image': 'abcdesktopio/oc.pulseaudio:3.0',\n    'imagePullPolicy': 'IfNotPresent',\n    'enable': False,\n    'tcpport': 4714,\n    'acl':  { 'permit': [ 'all' ] },\n    'resources': { \n      'requests': { 'memory': \"8Mi\",  'cpu': \"50m\"  },  \n      'limits'  : { 'memory': \"64Mi\", 'cpu': \"250m\" } \n    } \n  },\n  'init': { \n    'image': 'busybox',\n    'enable': True,\n    # 'imagePullSecrets': [ { 'name': name_of_secret } ]\n    'imagePullPolicy': 'IfNotPresent',\n    'securityContext': { 'runAsUser': 0 },\n    'acl':  { 'permit': [ 'all' ] },\n    'command':  [ 'sh', '-c',  'chmod 750 ~ && chown {{ uidNumber }}:{{ gidNumber }} ~ || true' ] \n  },\n  'ephemeral_container': {\n    'enable': True,\n    'securityContext': { \n        'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n        'readOnlyRootFilesystem': False, \n        'allowPrivilegeEscalation': True, \n        'runAsUser':                '{{ uidNumber }}',\n        'runAsGroup':               '{{ gidNumber }}'\n     },\n    'acl':  { 'permit': [ 'all' ] }\n  },\n  'pod_application' : {\n    'enable': True,\n    'securityContext': { \n        'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n        'readOnlyRootFilesystem': False, \n        'allowPrivilegeEscalation': True, \n        'runAsUser':                '{{ uidNumber }}',\n        'runAsGroup':               '{{ gidNumber }}'\n    },\n    # 'imagePullSecrets': [ { 'name': name_of_secret } ]\n    'acl':  { 'permit': [ 'all' ] } } }\n\n
"},{"location":"3.0/config/desktop.pod/#common-options","title":"common options","text":""},{"location":"3.0/config/desktop.pod/#enable","title":"enable","text":"

A container is added to the user pod if 'enable': True

"},{"location":"3.0/config/desktop.pod/#acl","title":"acl","text":"

The container is added to the user pod if acl matches. acl is based on tags and rules. Read the authentification-rules abcdesktop documentation to defined tags.

"},{"location":"3.0/config/desktop.pod/#pullpolicy","title":"pullpolicy","text":"

The image use the kubernetes pull policy values :

Read the pullpolicy kubernetes documentation to get more details.

"},{"location":"3.0/config/desktop.pod/#waitportbin","title":"waitportbin","text":"

waitportbin is a binary command line, embedded inside the container, to check if the container is ready to run. Commonly it uses the tcpport value.

The command is run with parameters :

/composer/node/wait-port/node_modules/.bin/wait-port -t {waitportbintimeout}*1000 {container_ipaddr}:{container_tcpport}\n
"},{"location":"3.0/config/desktop.pod/#waitportbintimeout","title":"waitportbintimeout","text":"

waitportbintimeout is the timeout in seconds to get waitportbin command result.

"},{"location":"3.0/config/desktop.pod/#image","title":"image","text":"

Image describe the container image name ( by default 'image': 'abcdesktopio/oc.user.ubuntu:3.0')

"},{"location":"3.0/config/desktop.pod/#imagepullsecrets","title":"imagePullSecrets","text":"

The imagePullSecret entry is the list of the secret name used by kubernetes to access to the private registry. The type of imagePullSecret is a list. This option is used if you need to store the abcdesktop docker image on your a private registry.

 imagePullSecret : [ { 'name': name_of_secret } ]\n
kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=https://index.docker.io/v1/ --docker-username=XXXXXXX --docker-password=YYYYYYYU\n
kubectl create secret docker-registry abcdesktopregistrysecret --docker-server=registry.mydomain.local:443 --docker-username=XXXXXXX --docker-password=YYYYYYYU\n

The imagePullSecret become in this sample

 imagePullSecret : [ { 'name': 'abcdesktopregistrysecret' } ]\n
"},{"location":"3.0/config/desktop.pod/#resources","title":"resources","text":"

Resources come from the kubernetes resources containers management. Read the resources kubernetes documentation to get more details.

"},{"location":"3.0/config/desktop.pod/#spec-entry","title":"spec entry","text":"

spec entry defines the spec entry for a pod. All kubernetes entries are supported. Some of them are overwrited by abcdesktop.

'spec' : {\n    'shareProcessNamespace': True,\n    'shareProcessMemory': True,\n    'shareProcessMemorySize': '256Mi',\n    'securityContext': { \n      'supplementalGroups': [ '{{ supplementalGroups }}' ],\n      'runAsUser': '{{ uidNumber }}',\n      'runAsGroup': '{{ gidNumber }}',\n      'readOnlyRootFilesystem': False, \n      'allowPrivilegeEscalation': True\n    }\n
"},{"location":"3.0/config/desktop.pod/#init-container","title":"init container","text":"

init container run the init command. It changes access right to the user home directory. The init command runs as root by default with a securityContext 'securityContext': {'runAsUser':0, 'runAsGroup':0 }.

The command support {{ }} values. Values can be

Values are read from the previous ldap authentification.

Example

 'command':  [ 'sh', '-c',  'chmod 755 ~ && chown {{ uidNumber }}:{{ gidNumber }} ~ || true' ]\n
"},{"location":"3.0/config/editconfig/","title":"How to edit pyos core service configuration file","text":"

The pyos core service configuration file name is od.config

"},{"location":"3.0/config/editconfig/#edit-your-configuration-file","title":"Edit your configuration file","text":"

If the od.config file does not exist, download the default od.config file and save it as od.config to your abcdesktop local directory.

To make change, edit your own od.config file

vim od.config \n
"},{"location":"3.0/config/editconfig/#make-changes","title":"Make changes","text":"

Change the defaultbackgroundcolors option in the desktop options.

Locate the line desktop.defaultbackgroundcolors and update the first entries with the values '#FF0000', '#FFFFFF', '#0000FF'

desktop.defaultbackgroundcolors : [ '#FF0000', '#FFFFFF',  '#0000FF', '#CD3C14', '#4BB4E6', '#50BE87', '#A885D8', '#FFB4E6' ]\n

Save your local file od.config.

"},{"location":"3.0/config/editconfig/#apply-changes","title":"Apply changes","text":"

To apply changes, you can replace the abcdesktop-config

kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

Or you can also use the replace command kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run | kubectl replace -n abcdesktop -f -

"},{"location":"3.0/config/editconfig/#restart-pyos-pods","title":"Restart pyos pods","text":"
kubectl delete pods -l run=pyos-od -n abcdesktop\npod \"pyos-od-6fc597d444-qgzhc\" deleted\n
"},{"location":"3.0/config/editconfig/#check-your-changes","title":"Check your changes","text":"

To check that the new colours are presents in front, open the url http://localhost:30443, in your web browser, to start a simple abcdesktop.io container.

http://localhost:30443\n

You should see the abcdesktop.io home page.

Press the Sign-in Anonymously, have look

At the right top corner, click on the menu and choose Settings, then click on Screen Colors

Choose your colour and you should have it as background colour :

Great, you can easily update your configuration file od.config.

"},{"location":"3.0/config/frontjs/","title":"dock configuration in od.config","text":""},{"location":"3.0/config/frontjs/#menu-setting","title":"Menu Setting","text":"

The menu can be changed using the dictionnary object menuconfig

menuconfig : {\n    'settings'  : True, \n    'appstore'  : True, \n    'screenshot'    : True, \n    'download'  : True, \n    'logout'        : True, \n    'disconnect'    : True \n}\n
"},{"location":"3.0/config/frontjs/#default-dock-config","title":"default dock config","text":"

The dock session in od.config file describe the default docker in abcdesktop.io. The default dock value contains the default applications. The dock option is a dictionnary read by the front web as a json object.

docker entry Descriptions filemanager FileManager application terminal Terminal application webshell HTML 5, terminal application based on xterm.js webshorcut Web browser url launch inside the container
dock : {       \n    'filemanager':  {       'args': None,\n                            'showinview': u'dock',\n                            'name': u'FileManager',\n                            'keyword': u'files,file manager',\n                            'launch': u'nautilus.Nautilus',\n                            'displayname': u'FileManager',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,office',\n                            'id': u'filemanager.d',\n                            'icon': u'pantheon-files-icons.svg' },\n    'terminal':     {       'args': '',\n                            'name': u'TerminalBuiltin',\n                            'keyword': u'terminal,shell,bash,builtin,pantheon',\n                            'launch': u'qterminal.qterminal',\n                            'displayname': u'Terminal Builtin',\n                            'execmode': u'builtin',\n                            'cat': u'utilities,development',\n                            'id': u'terminalbuiltin.d',\n                            'hideindock': True,\n                            'icon': u'pantheon-terminal-builtin-icons.svg' },\n\n    'webshell':     {       'name': u'WebShell',\n                            'keyword': u'terminal,shell,webshell,bash',\n                            'launch': u'frontendjs.webshell',\n                            'displayname': u'Web Shell',\n                            'execmode': u'frontendjs',\n                            'cat': u'utilities,development',\n                            'id': u'webshell.d',\n                            'icon': u'webshell.svg' }\n}\n
"},{"location":"3.0/config/frontjs/#additional-applications","title":"Additional applications","text":"

This feature is deprecated. To run embeded application inside the oc.user image container, with specific attribut { 'execmode': 'builtin' } add

'webshortcut':  {   'name': u'xlogo',\n                    'showinview': u'dock',\n                    'keyword': u'xlogo',\n                    'execmode': u'builtin',\n                    'launch': u'/usr/bin/xlogo',\n                    'displayname': u'xlogo',\n                    'execmode': u'builtin',\n                    'cat': u'utilities',\n                    'id': u'xlogo.d',\n                    'icon': u'xlogo.svg',\n                    'hideindock': False,\n                    'args': '' \n}\n
"},{"location":"3.0/config/host_config/","title":"host_config resource description","text":"

host_config resource description allows to change the running context for docker application. host_config is a dictionary and uses the same format in applist.json file and od.config file.

The same host_config format is reused in a multiple configuration files. host_config is present in applist.json file to build application image, and in od.config to set default running values in desktop and in application.

For example you can set low cpu and memory values to an application like the great X11 xeyes.

{   \n    \"mem_limit\":  \"32M\", \n    \"shm_size\":   \"OM\", \n    \"cpu_period\":  50000, \n    \"cpu_quota\":   50000, \n    \"pid_mode\":   false, \n    \"network_mode\": \"none\" \n}\n
"},{"location":"3.0/config/host_config/#host_config-entries","title":"host_config entries","text":"Key name Type Description auto_remove bool enable auto removal of the container on daemon side when the container\u2019s process exits. cpu_period int The length of a CPU period in microseconds. cpu_quota int Microseconds of CPU time that the container can get in a CPU period. cpu_shares int CPU shares relative weight. cpuset_cpus str CPUs in which to allow execution 0 3 0 1 . cpuset_mems str Memory nodes MEMs in which to allow execution 0 3 0 1. Only effective on NUMA systems. device_cgroup_rules list A list of cgroup rules to apply to the container. device_read_bps bytes per second Limit read rate from a device in the form of: [{\u201cPath\u201d: \u201cdevice_path\u201d \u201cRate\u201d: rate}] device_read_iops IO per second Limit read rate from a device. device_write_bps bytes per second Limit write rate from a device. device_write_iops IO per second Limit write rate from a device. devices list Expose host devices to the container as a list of strings in the form ::. For example /dev/sda:/dev/xvda:rwm allows the container to have read write access to the host\u2019s /dev/sda via a node named /dev/xvda inside the container. device_requests list Expose host resources such as GPUs to the container as a list of docker.types.DeviceRequest instances. ipc_mode str Set the IPC mode for the container. mem_limit float or str Memory limit. Accepts float values which represent the memory limit of the created container in bytes or a string with a units identification char 100000b 1000k 128m 1g. mem_reservation float or str Memory soft limit mem_swappiness int Tune a container s memory swappiness behavior. Accepts number between 0 and 100. memswap_limit str or int Maximum amount of memory + swap a container is allowed to consume. oom_kill_disable bool Whether to disable OOM killer. oom_score_adj int An integer value containing the score given to the container in order to tune OOM killer preferences. shm_size str or int Size of /dev/shm e.g. 1G. cap_add list of str Add kernel capabilities. { 'add': [ 'SYS_ADMIN', 'SYS_PTRACE' ]}for example to permit the call ptrace: SYS_PTRACE, trace arbitrary processes using ptrace, and SYS_ADMIN, perform a range of system administration operations. Read the docker run command informations https://docs.docker.com/engine/reference/run/ chapter Runtime privilege and Linux capabilities cap_drop list of str Drop kernel capabilities. dns list Set custom DNS servers. dns_opt list Additional options to be added to the container\u2019s resolv.conf file dns_search list DNS search domains. extra_hosts dict Additional hostnames to resolve inside the container as a mapping of hostname to IP address. group_add list List of additional group names and/or IDs that the container process will run as. isolation str Isolation technology to use. Default: None. pid_mode str or bool If set to hostuse the host PID namespace inside the container. If set to host, use the host PID namespace inside the container. pids_limit int Tune a container\u2019s pids limit. Set -1 for unlimited. privileged bool Give extended privileges to this container. security_opt list A list of string values to customize labels for MLS systems such as SELinux. storage_opt dict Storage driver options per container as a key value mapping. sysctls dict Kernel parameters to set in the container. ulimits list Ulimits to set inside the container as a list of docker.types.Ulimit instances. userns_mode str Sets the user namespace mode for the container when user namespace remapping option is enabled. Supported values are: host uts_mode str Sets the UTS namespace mode for the container. Supported values are: host runtime str Runtime to use with this container. network_mode str One of: bridge Create a new network stack for the container on the bridge network. none No networking for this container. container: Reuse another container\u2019s network stack. host Use the host network stack. This mode is incompatible with port_bindings."},{"location":"3.0/config/host_config/#main-host_config-entries-descriptions","title":"Main host_config entries descriptions","text":""},{"location":"3.0/config/host_config/#auto_remove","title":"auto_remove","text":"

The auto_remove is use to remove or not remove an abcdesktop container application or desktop.

For example, when an application container is exited, do we need to remove the container, by running the docker rm command ?

By default the auto_remove is True. But if you need to keep your application container to post-mortem debugging or to get some value, set this value to False. Set this value to False only to troubleshoot an application.

In production this value MUST be set to True

"},{"location":"3.0/config/host_config/#cpu_period-cpu_quota","title":"cpu_periodcpu_quota","text":"

cpu_period Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100000 microseconds (100 milliseconds). Most users do not change this from the default.

cpu-quota impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling.

"},{"location":"3.0/config/host_config/#privileged","title":"privileged","text":"

The privileged option runs a user container in privileged mode. When the operator executes docker run privileged, docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.allow a user to run a sudo command. The default value is False. You should only set privilege to True for troobleshooting. In production this value MUST be set to False.

"},{"location":"3.0/config/host_config/#ipc_mode","title":"ipc_mode","text":"

The ipc_mode value is a string, the default value is 'shareable'. This option permits user's container to share the ipc namespace with application This option is used by pulseaudio service by default.

value description '' Use daemon default. 'none' Own private IPC namespace. 'private' Own private IPC namespace. 'shareable' Own private IPC namespace, with a possibility to share it with other containers. 'host' Use the host system IPC namespace.

If not specified, daemon default is used, which can either be \"private\" or \"shareable\", depending on the daemon version and configuration. IPC (POSIX/SysV IPC) namespace provides separation of named shared memory segments, semaphores and message queues. Shared memory segments are used to accelerate inter-process communication at memory speed, rather than through pipes or through the network stack. Shared memory is commonly used by databases and custom-built. If these types of applications are broken into multiple containers, you might need to share the IPC mechanisms of the containers, using shareable mode for the main (i.e. donor) container, and container: for other containers."},{"location":"3.0/config/host_config/#security_opt","title":"security_opt","text":"

The securityopt option allow to set the security_opt default value for a docker application container. security_opt is the docker parameter.

Docker's default seccomp profile is a whitelist which specifies the calls that are allowed. The table below lists the significant (but not all) syscalls that are effectively blocked because they are not on the whitelist. The table includes the reason each syscall is blocked rather than white-listed.

Syscall Description acct Accounting syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_PACCT. add_key Prevent containers from using the kernel keyring, which is not namespaced. bpf Deny loading potentially persistent bpf programs into kernel, already gated by CAP_SYS_ADMIN. clock_adjtime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clock_settime Time/date is not namespaced. Also gated by CAP_SYS_TIME. clone Deny cloning new namespaces. Also gated by CAP_SYS_ADMIN for CLONE_* flags, except CLONE_USERNS. create_module Deny manipulation and functions on kernel modules. Obsolete. Also gated by CAP_SYS_MODULE. delete_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. finit_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. get_kernel_syms Deny retrieval of exported kernel and module symbols. Obsolete. get_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. init_module Deny manipulation and functions on kernel modules. Also gated by CAP_SYS_MODULE. ioperm Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. iopl Prevent containers from modifying kernel I/O privilege levels. Already gated by CAP_SYS_RAWIO. kcmp Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. kexec_file_load Sister syscall of kexec_load that does the same thing, slightly different arguments. Also gated by CAP_SYS_BOOT. kexec_load Deny loading a new kernel for later execution. Also gated by CAP_SYS_BOOT. keyctl Prevent containers from using the kernel keyring, which is not namespaced. lookup_dcookie Tracing/profiling syscall, which could leak a lot of information on the host. Also gated by CAP_SYS_ADMIN. mbind Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. mount Deny mounting, already gated by CAP_SYS_ADMIN. move_pages Syscall that modifies kernel memory and NUMA settings. name_to_handle_at Sister syscall to open_by_handle_at. Already gated by CAP_DAC_READ_SEARCH. nfsservctl Deny interaction with the kernel nfs daemon. Obsolete since Linux 3.1. open_by_handle_at Cause of an old container breakout. Also gated by CAP_DAC_READ_SEARCH. perf_event_open Tracing/profiling syscall, which could leak a lot of information on the host. personality Prevent container from enabling BSD emulation. Not inherently dangerous, but poorly tested, potential for a lot of kernel vulns. pivot_root Deny pivot_root, should be privileged operation. process_vm_readv Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. process_vm_writev Restrict process inspection capabilities, already blocked by dropping CAP_SYS_PTRACE. ptrace Tracing/profiling syscall. Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass. Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE, because it could leak a lot of information on the host. query_module Deny manipulation and functions on kernel modules. Obsolete. quotactl Quota syscall which could let containers disable their own resource limits or process accounting. Also gated by CAP_SYS_ADMIN. reboot Don't let containers reboot the host. Also gated by CAP_SYS_BOOT. request_key Prevent containers from using the kernel keyring, which is not namespaced. set_mempolicy Syscall that modifies kernel memory and NUMA settings. Already gated by CAP_SYS_NICE. setns Deny associating a thread with a namespace. Also gated by CAP_SYS_ADMIN. settimeofday Time/date is not namespaced. Also gated by CAP_SYS_TIME. stime Time/date is not namespaced. Also gated by CAP_SYS_TIME. swapon Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. swapoff Deny start/stop swapping to file/device. Also gated by CAP_SYS_ADMIN. sysfs Obsolete syscall. _sysctl Obsolete, replaced by /proc/sys. umount Should be a privileged operation. Also gated by CAP_SYS_ADMIN. umount2 Should be a privileged operation. Also gated by CAP_SYS_ADMIN. unshare Deny cloning new namespaces for processes. Also gated by CAP_SYS_ADMIN, with the exception of unshare --user. uselib Older syscall related to shared libraries, unused for a long time. userfaultfd Userspace page fault handling, largely needed for process migration. ustat Obsolete syscall. vm86 In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN. vm86old In kernel x86 real mode virtual machine. Also gated by CAP_SYS_ADMIN.

Read security_opt from the docker website.

"},{"location":"3.0/config/host_config/#capabilities-cap_add-cap_drop","title":"capabilities cap_addcap_drop","text":"

This value is added to the oc.user docker container, or as securityContext attribut in kubernetes mode :

securityContext:\n      capabilities:\n        desktop.capabilities\n

For example

    { \n        'add': [ \"SYS_ADMIN\", \"SYS_PTRACE\" ]\n    }\n

Permit a container to call ptrace:

Read the docker run command informations Docker run reference

By default, Docker has a default list of capabilities that are kept. The following table lists the Linux capability options which can be added or dropped.

Capability Key Capability Description SETPCAP Modify process capabilities. SYS_MODULE Load and unload kernel modules. SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)). SYS_PACCT Use acct(2), switch process accounting on or off. SYS_ADMIN Perform a range of system administration operations. SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. SYS_RESOURCE Override resource Limits. SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. MKNOD Create special files using mknod(2). AUDIT_WRITE Write records to kernel auditing log. AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. MAC_OVERRIDE Allow MAC configuration or state changes. Implemented for the Smack LSM. MAC_ADMIN Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). NET_ADMIN Perform various network-related operations. SYSLOG Perform privileged syslog(2) operations. CHOWN Make arbitrary changes to file UIDs and GIDs (see chown(2)). NET_RAW Use RAW and PACKET sockets. DAC_OVERRIDE Bypass file read, write, and execute permission checks. FOWNER Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks. FSETID Don't clear set-user-ID and set-group-ID permission bits when a file is modified. KILL Bypass permission checks for sending signals. SETGID Make arbitrary manipulations of process GIDs and supplementary GID list. SETUID Make arbitrary manipulations of process UIDs. LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. NET_BIND_SERVICE Bind a socket to internet domain privileged ports (port numbers less than 1024). NET_BROADCAST Make socket broadcasts, and listen to multicasts. IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). IPC_OWNER Bypass permission checks for operations on System V IPC objects. SYS_CHROOT Use chroot(2), change root directory. SYS_PTRACE Trace arbitrary processes using ptrace(2). SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. LEASE Establish leases on arbitrary files (see fcntl(2)). SETFCAP Set file capabilities. WAKE_ALARM Trigger something that will wake up the system. BLOCK_SUSPEND Employ features that can block system suspend.

Further reference information is available on the capabilities(7) - Linux man page

Set this value only to troubleshoot an application.

In production this value MUST be set to an empty dict {}

"},{"location":"3.0/config/jira/","title":"JIRA configuration","text":"

abcdesktop.io support JIRA

"},{"location":"3.0/config/jira/#jira-option","title":"JIRA option","text":"

In od.config add the jira option. jira option is a dictionary with the entries :

entry sample value \u00a0\u00a0 url https://domainexample.atlassian.net/ project_id ABCD username account@domain.local apikey XXXXXXXXXXXXXXXXXXXX

And fill the dictionary

jira : { \n            'url':          'https://domainexample.atlassian.net/',\n            'project_id':   'ABCD',\n            'username':     'account@domain.local',\n            'apikey' :      'XXXXXXXXXXXXXXXXXXXX' }\n

Then apply the new configuration file od.config by retrasting the daemon.

When jira option is set, a new icon issue appears at the top.

Click on the issue icon, a new window is appear.

Fill Summary and Your Report values

Then press the Send button. A notification message appears on the left top corner.

Log into your jira server, and check your backlog

Great you added a new issue tracking.

"},{"location":"3.0/config/language/","title":"Language entry in od.config","text":"

The language option is a list of string. Each string is formatted as a locale variable. The locale is simply the language/country combination en + US = en_US

"},{"location":"3.0/config/language/#language-in-abcdesktopio-ocuser","title":"Language in abcdesktop.io oc.user","text":"

The language list must match with the oc.user local packages all ready installed.

If the language is not found, the default value is set to en_US

The oc.user.18.04 is built-in with the default language package :

apt-get install -y \\\n    language-pack-en \\\n    language-pack-fr \\\n    && locale-gen    \\\n    && apt-get clean\n

The full supported language list is set by default

language : [  'af_ZA', 'am_ET', 'an_ES', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IN', 'ar_IQ', 'ar_JO', 'ar_KW','ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'as_IN', 'ast_ES', 'az_AZ', 'be_BY', 'bg_BG', 'bn_BD', 'bn_IN', 'bo_CN', 'bo_IN', 'br_FR', 'bs_BA', 'ca_AD', 'ca_ES', 'ca_FR', 'ca_IT', 'crh_UA', 'cs_CZ', 'cy_GB', 'da_DK', 'de_AT', 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU', 'dz_BT', 'el_CY', 'el_GR', 'en_AG', 'en_AU', 'en_BW', 'en_CA', 'en_DK', 'en_GB', 'en_HK', 'en_IE', 'en_IN', 'en_NG', 'en_NZ', 'en_PH', 'en_SG', 'en_US', 'en_ZA', 'en_ZM', 'en_ZW', 'eo', 'eo_US', 'es_AR', 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_CU', 'es_DO', 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_US', 'es_UY', 'es_VE', 'et_EE', 'eu_ES', 'eu_FR', 'fa_IR', 'fi_FI', 'fr_BE', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_LU', 'ga_IE', 'gd_GB', 'gl_ES', 'gu_IN', 'he_IL', 'hi_IN', 'hr_HR', 'hu_HU', 'id_ID', 'is_IS', 'it_CH', 'it_IT', 'ja_JP', 'ka_GE', 'kk_KZ', 'km_KH', 'kn_IN', 'ko_KR', 'ku_TR', 'lt_LT', 'lv_LV', 'mai_IN', 'mk_MK', 'ml_IN', 'mn_MN', 'mr_IN', 'ms_MY', 'my_MM', 'nb_NO', 'nds_DE', 'nds_NL', 'ne_NP', 'nl_AW', 'nl_BE', 'nl_NL', 'nn_NO', 'oc_FR', 'or_IN', 'pa_IN', 'pa_PK', 'pl_PL', 'pt_BR', 'pt_PT', 'ro_RO', 'ru_RU', 'ru_UA', 'si_LK', 'sk_SK', 'sl_SI', 'sq_AL', 'sq_MK', 'sr_ME', 'sr_RS', 'sv_FI', 'sv_SE', 'ta_IN', 'ta_LK', 'te_IN', 'tg_TJ', 'th_TH', 'tr_CY', 'tr_TR', 'ug_CN', 'uk_UA', 'uz_UZ', 'vi_VN', 'xh_ZA', 'zh_CN', 'zh_HK', 'zh_SG', 'zh_TW' ]\n

This list must match with the Accept-Language request HTTP header.

"},{"location":"3.0/config/language/#language-in-abcdesktopio-applications","title":"Language in abcdesktop.io Applications","text":"

abcdesktop.io use the web browser language property to set the application's language. This list must match with the Accept-Language request HTTP header. If the language is not found, the default value is set to en_US.

Hands-on:

Change your web browser language, and run LibreOffice applications. The language setting use the web browser value. During this exercice you can keep the same abcdesktop.io users session.

"},{"location":"3.0/config/language/#set-the-web-browsers-default-language-to-en_us","title":"Set the web browser's default language to en_US :","text":"

The launch LibreOffice Writer. The menu is set to en_US LibreOffice Writer use English/US en_US language.

"},{"location":"3.0/config/language/#set-the-web-browsers-default-language-to-fr_fr","title":"Set the web browser's default language to fr_FR :","text":"

You can keep the same abcdesktop.io users session, you do not need to logout.

The launch LibreOffice Writer. The menu is set to fr_FR LibreOffice Writer use French fr_FRlanguage.

Great you have change the language settings of applications running inside an abcdesktop docker container

"},{"location":"3.0/config/linux_syslog_config/","title":"Linux syslog config","text":""},{"location":"3.0/config/linux_syslog_config/#modify-etcrsyslogconf","title":"Modify /etc/rsyslog.conf","text":"

By default syslog program is configured to log messages received over unix socket files. rsyslog configuration file need to be modified to accept messages over UDP.

Edit /etc/rsyslog.conf file with your prefered linux text editor as sudo ou root:

sudo vi /etc/rsyslog.conf\n

Uncomment the following lines and save file :

module(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n

"},{"location":"3.0/config/linux_syslog_config/#restart-rsyslog","title":"Restart rsyslog","text":"

Now we have enabled rsyslog over UDP on 514 port in config file, we have to restart rsyslog to take new parameters into account. Execute the following command as sudo:

sudo systemctl restart rsyslog\n

"},{"location":"3.0/config/logging/","title":"Logging configuration in od.config","text":"

The logging configuration is a dictionnary object. The logging configuration describes where and how log message information have to been send.

logging dict use the python logging module logging module

The syslog and graylog protocol messaging are supported too.

The default features for each handlers are :

handler Features console log message using a logging.StreamHandler to the stream: ext://sys.stdout formated as standard cherrypy_console log message using a logging.StreamHandler to the stream: ext://sys.stdout formatted as access cherrypy_access log message using a logging.StreamHandler to the file stream logs/access.log formatted as access cherrypy_trace log message using a logging.StreamHandler to the stream: logs/trace.log formatted as standard

Sub modules used by od.py can log information too.

Sub module Default Values docker.utils.config{ 'level': 'INFO' },urllib3.connectionpool{ 'level': 'ERROR'},

The logging sample configuration :

#              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
"},{"location":"3.0/config/networkpolicy/","title":"NetworkPolicy","text":""},{"location":"3.0/config/networkpolicy/#goals","title":"Goals","text":""},{"location":"3.0/config/networkpolicy/#authors","title":"Authors","text":"

jpxavier-oio has designed the network policy for abcdesktop.io

"},{"location":"3.0/config/networkpolicy/#requirements","title":"Requirements","text":""},{"location":"3.0/config/networkpolicy/#networkpolicy-description","title":"NetworkPolicy description","text":"

There are two sorts of isolation defined in abcdesktop : the NetworkPolicy rights and the NetworkPolicy permits.

"},{"location":"3.0/config/networkpolicy/#networkpolicy-example","title":"NetworkPolicy example","text":"

The NetworkPolicy examples describe the network policies for the internal memcached pod and the user's pods.

"},{"location":"3.0/config/networkpolicy/#networkpolicy-rights-and-permits-for-the-memcached","title":"NetworkPolicy rights and permits for the memcached.","text":"

The memcached service is listening on TCP port 11211. The NetworkPolicy for memcached service rights, named memcached-rights, allows pods with label run: memcached-od to expose the TCP port 11211.

apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: memcached-rights\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      run: memcached-od\n  policyTypes:\n  - Ingress\n  ingress:\n  - ports:\n    - protocol: TCP\n      port: 11211\n    from:\n    - podSelector:\n        matchLabels:\n          netpol/memcached: 'true'\n    - namespaceSelector:\n        matchLabels:\n          name: kube-monitor\n      podSelector:\n        matchLabels:\n          netpol/metrics: 'true'\n

The NetworkPolicy for memcached service permits, named memcached-permits, allows all pods with label netpol/memcached: 'true' to reach the TCP port 11211 to pods with label run: memcached-od.

apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: memcached-permits\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      netpol/memcached: 'true'\n  policyTypes:\n  - Egress\n  egress:\n  - ports:\n    - protocol: TCP\n      port: 11211\n    to:\n    - podSelector:\n        matchLabels:\n          run: memcached-od\n---\n
"},{"location":"3.0/config/networkpolicy/#networkpolicy-rights-and-permits-for-the-users-pods","title":"NetworkPolicy rights and permits for the user's pods.","text":"

The ocuser pod is listening on TCP ports :

The network policy for ocuser's pods rights is named ocuser-rights. It allows pods with label type: 'x11server' to expose the previous TCP ports.

The egress network policy allows :

apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: ocuser-rights\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      type: 'x11server'\n  policyTypes:\n  - Ingress\n  - Egress\n  ingress:\n  - from:\n    - podSelector:\n        matchLabels:\n          netpol/ocuser: 'true'\n    ports:\n    - protocol: TCP\n      port: 4714\n    - protocol: TCP\n      port: 6081\n    - protocol: TCP\n      port: 8000\n    - protocol: TCP\n      port: 29780\n    - protocol: TCP\n      port: 29781\n    - protocol: TCP\n      port: 29782\n    - protocol: TCP\n      port: 29783\n    - protocol: TCP\n      port: 29784\n    - protocol: TCP\n      port: 29785\n    # spawner_service_tcp_port\n    - protocol: TCP\n      port: 29786\n  egress:\n  # pod user can run dns query to all kube-system\n  - ports:\n    - protocol: TCP\n      port: 53\n    - protocol: UDP\n      port: 53\n    to:\n    - namespaceSelector:\n        matchLabels:\n          name: kube-system\n      podSelector:\n        matchLabels:\n          k8s-app: kube-dns\n# permit www website from pod user \n  - ports:\n    - protocol: TCP\n      port: 443\n    - protocol: TCP\n      port: 80\n# permit kerberos auth kinit\n  - ports:\n    - protocol: UDP\n      port: 88\n    - protocol: TCP\n      port: 88\n

The network policy for ocuser's pods permits is named ocuser-permits. It allows pods with label netpol/ocuser: 'true' to reach the user's pods services.

apiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: ocuser-permits\n  namespace: abcdesktop\nspec:\n  podSelector:\n    matchLabels:\n      netpol/ocuser: 'true'\n  policyTypes:\n  - Egress\n  egress:\n  - to:\n    - podSelector:\n        matchLabels:\n          type: 'x11server'\n    ports:\n    # default pulseaudio websocket audio without webrtc gateway\n    - protocol: TCP\n      port: 4714\n    # vnc websockify\n    - protocol: TCP\n      port: 6081\n    # reserved\n    - protocol: TCP\n      port: 29780\n    # xterm_tcp_port\n    - protocol: TCP\n      port: 29781\n    # printerfile_service_tcp_port\n    - protocol: TCP\n      port: 29782\n    # file_service_tcp_port\n    - protocol: TCP\n      port: 29783\n    # broadcast_tcp_port \n    - protocol: TCP\n      port: 29784\n    # reserved\n    - protocol: TCP\n      port: 29785\n    # spawner_service_tcp_port\n    - protocol: TCP\n      port: 29786\n
"},{"location":"3.0/config/networkpolicy/#apply-the-default-netpol-defaultyaml-file","title":"Apply the default netpol-default.yaml file","text":"

To apply the network policies run the command :

kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default.yaml\n

The command returns

networkpolicy.networking.k8s.io/abcdesktop-rights created\nnetworkpolicy.networking.k8s.io/memcached-rights created\nnetworkpolicy.networking.k8s.io/memcached-permits created\nnetworkpolicy.networking.k8s.io/mongodb-rights created\nnetworkpolicy.networking.k8s.io/mongodb-permits created\nnetworkpolicy.networking.k8s.io/speedtest-rights created\nnetworkpolicy.networking.k8s.io/speedtest-permits created\nnetworkpolicy.networking.k8s.io/pyos-rights created\nnetworkpolicy.networking.k8s.io/pyos-permits created\nnetworkpolicy.networking.k8s.io/nginx-rights created\nnetworkpolicy.networking.k8s.io/nginx-permits created\nnetworkpolicy.networking.k8s.io/ocuser-rights created\nnetworkpolicy.networking.k8s.io/ocuser-permits created\nnetworkpolicy.networking.k8s.io/authentication-permits created\nnetworkpolicy.networking.k8s.io/ldap-permits created\nnetworkpolicy.networking.k8s.io/ldap-rights created\nnetworkpolicy.networking.k8s.io/smtp-permits created\nnetworkpolicy.networking.k8s.io/https-permits created\nnetworkpolicy.networking.k8s.io/storage-permits created\nnetworkpolicy.networking.k8s.io/coredns-permits created\nnetworkpolicy.networking.k8s.io/apiserver-permits created\nnetworkpolicy.networking.k8s.io/graylog-permits created\n
"},{"location":"3.0/config/networkpolicy/#test-the-network-policies","title":"Test the network policies","text":"
curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n

This http request is denied by the network policy and you should get an error message

You should get an error message, the user's pod can't reach https://pyos.abcdesktop.svc.cluster.local:8000/API.

"},{"location":"3.0/config/networkpolicy/#disable-the-network-policies","title":"Disable the network policies","text":"

To disable the network policies, run the kubectl delete command :

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/netpol-default.yaml\n
curl http://pyos.abcdesktop.svc.cluster.local:8000/API/manager/images\n

You should get a json document as http response

{}\n

You may need to update the netpol-default.yaml file with your own values.

"},{"location":"3.0/config/stack/","title":"stack entry in od.config","text":""},{"location":"3.0/config/stack/#stackmode","title":"stack.mode","text":"

stack.mode describes how abcdesktop.io can manage user's containers and application.

stack.mode Description standalone Use a dockerd only, this is for personal usage kubernetes Use a kubernetes services"},{"location":"3.0/config/stack/#stackkubernetesdefaultdomain","title":"stack.kubernetesdefaultdomain","text":"

stack.kubernetesdefaultdomain is the default domain name configured in kubernetes cluster. This value is type is string and only read if stack.mode is kubernetes.

The default value is abcdesktop.svc.cluster.local

If option value mongodb or memcached are set, the values are NOT overridden, and keep unchanged.

If option value mongodb or memcached are set to None (by default), then stack.kubernetesdefaultdomain is used to complete the FQDN of mongodb and memcached servers name. This value is concatenated to the server hostname.

Hostname FQDN mongodbmongodb.abcdesktop.svc.cluster.localmemcachedmemcached.abcdesktop.svc.cluster.local

The dns resolution need a running core-dnsis the namespace kube-system

stack.kubernetesdefaultdomain is used also if desktop.desktopuseinternalfqdn: True

The pod name FQDN is built using the $podid.desktop.$stack.kubernetesdefaultdomain

For example, by default :

c8c7d38f-7621-40bb-a777-83f41b32733e.desktop.abcdesktop.svc.cluster.local

"},{"location":"3.0/config/sudo-kubernetes/","title":"Sudo kubernetes","text":""},{"location":"3.0/config/sudo-kubernetes/#how-to-get-a-root-access-inside-a-container-running-kubernetes-abcdesktop","title":"How to get a root access inside a container running kubernetes abcdesktop ?","text":"

run the sudo command inside the user kubernetes pods

balloon@43c2ef50-a7b9-4e36-8a9d-8ac3ce80180e:~$ sudo bash\nsudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?\n
"},{"location":"3.0/config/sudo-kubernetes/#edit-the-odconfig-file","title":"Edit the od.config file","text":"

In the securityContext add the entry 'allowPrivilegeEscalation': True

desktop.pod : {\n  'spec'   : {\n    'shareProcessMemorySize': '512Mi',\n    'shareProcessMemory': True,\n    'shareProcessNamespace': True,\n    'securityContext': { \n      'supplementalGroups': [ '{{ supplementalGroups }}' ] ,\n      'readOnlyRootFilesystem': False, \n      'allowPrivilegeEscalation': True, \n      'runAsUser': '{{ uidNumber }}',\n      'runAsGroup': '{{ gidNumber }}',\n      'capabilities': { \n        'add': [ \"SYS_ADMIN\", \"CAP_SYS_ADMIN\", \"CAP_DAC_OVERRIDE\"]\n      }\n    }\n  }\n...\n
"},{"location":"3.0/config/sudo-kubernetes/#update-the-kubernetes-config-with-the-new-abcdesktopyaml","title":"Update the kubernetes config with the new abcdesktop.yaml","text":"
kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
"},{"location":"3.0/config/sudo-kubernetes/#restart-the-pyos-pod","title":"Restart the pyos pod","text":"

Delete the pyos pod

kubectl delete pods -l run=pyos-od  -n abcdesktop\npod \"pyos-od-5586b88767-gsdl8\" deleted\n
  1. Make sure that your user has done a logoff his pod, then login again and run terminal web shell

The default balloon password is lmdpocpetit

balloon@c182dc39-6a00-4869-8b01-2039f37c1eab:~$ sudo bash\n[sudo] password for balloon: \nroot@c182dc39-6a00-4869-8b01-2039f37c1eab:~# id\nuid=0(root) gid=0(root) groups=0(root),105(lpadmin)\nroot@c182dc39-6a00-4869-8b01-2039f37c1eab:~#  \n

After the sudo command, you get a root level inside the shell of the users's pod

In production this value should be set to False

"},{"location":"3.0/config/syslog/","title":"Syslog configuration in od.config","text":""},{"location":"3.0/config/syslog/#add-syslog-server-support","title":"Add syslog server support","text":"
   'filters': [ 'odcontext' ],\n

syslog is a protocol for tracking and logging system messages in Linux. Applications use syslog to export all their error and status messages to the files in the /var/log directory.

syslog uses the client-server model; a client transmits a text message to the server (receiver). The server is commonly called syslogd, syslog daemon, or syslog server. syslog uses the User Datagram Protocol (UDP) port 514 for communication.

"},{"location":"3.0/config/syslog/#start-syslog-container","title":"Start syslog container","text":"

Those running linux can simply modify their syslog configuration file following linux syslog config steps

For others (Windows/Mac) or those that don't want to modify their syslog config, you can simply run the following command :

docker run -it -p 514:514/udp --name syslog-ng balabit/syslog-ng:latest -edv\n
[2020-04-07T12:29:39.485318] Accepting connections; addr='AF_INET(0.0.0.0:514)'\n[2020-04-07T12:29:39.485752] You have a TLS enabled source without a X.509 keypair. Make sure you have tls(key-file() and cert-file()) options, TLS handshake to this source will fail; location='/etc/syslog-ng/syslog-ng.conf:21:2'\n[2020-04-07T12:29:39.485964] Accepting connections; addr='AF_INET(0.0.0.0:6514)'\n[2020-04-07T12:29:39.486179] Accepting connections; addr='AF_INET(0.0.0.0:601)'\n[2020-04-07T12:29:39.486600] Running application hooks; hook='1'\n[2020-04-07T12:29:39.486621] Running application hooks; hook='6'\n[2020-04-07T12:29:39.486674] syslog-ng starting up; version='3.26.1'\n[2020-04-07T12:29:39.486850] Running application hooks; hook='2'\n[2020-04-07T12:39:39.587220] Log statistics; processed='global(payload_reallocs)=0', processed='global(sdata_updates)=0', queued='global(scratch_buffers_bytes)=0', processed='src.internal(s_local#0)=0', stamp='src.internal(s_local#0)=0', processed='destination(d_local)=0', processed='source(s_local)=0', processed='source(s_network)=0', processed='global(msg_clones)=0', processed='center(received)=0', queued='global(scratch_buffers_count)=0', processed='center(queued)=0'\n
"},{"location":"3.0/config/syslog/#modify-logging-entry","title":"Modify logging entry","text":"

To let abcdesktop log events in syslog trought UDP, we will have to modify abcdesktop configuration file to add an handler and 'syslog' entry in general logger and cherrypy.error logger. (syslog formatter is already in sample file)

"},{"location":"3.0/config/syslog/#add-syslog-handler","title":"Add Syslog Handler","text":"

In handlers entry add the following lines:

        ,\n        'syslog': {\n          'class': 'logging.handlers.SysLogHandler',\n          'filters': [ 'odcontext' ],\n          'formatter': 'syslog',\n          'socktype': 2,\n          'address' : [ '192.168.0.52', 514 ]\n        }\n

Replace 192.168.0.52 ip address by your local IP Addresse.

You can get your local IP address using the following command:

hostname -I | cut -d ' ' -f1\n
"},{"location":"3.0/config/syslog/#add-loggers-handlers-entries","title":"Add loggers handlers entries","text":"

In general loggers (key '' in loggers entry) and 'cherrypy.error' add syslog' handler in handlers list:

        '': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'INFO'\n        }\n\n       'cherrypy.error': {\n          'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n          'level': 'ERROR',\n          'propagate': False\n        }\n
"},{"location":"3.0/config/syslog/#resulting-modified-sample-configuration-file","title":"Resulting Modified sample configuration file","text":"
#              \n# logging configuration \n# come from https://docs.python.org/3.8/library/logging.config.html\n# need double %% to escape %\n# \n# graylog https://github.com/severb/graypy\n# use handler class name as\n# graypy.GELFUDPHandler - UDP log forwarding\n# graypy.GELFTCPHandler - TCP log forwarding\n# graypy.GELFTLSHandler - TCP log forwarding with TLS support\n# graypy.GELFHTTPHandler - HTTP log forwarding\n# graypy.GELFRabbitHandler - RabbitMQ log forwarding\n\nlogging: {\n  'version': 1,\n  'disable_existing_loggers': False,\n  'formatters': {\n    'access': {\n      'format': '%%(message)s - user: %%(userid)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'standard': {\n      'format': '%%(asctime)s %%(module)s [%%(levelname)-7s] %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'syslog': {\n      'format': '%%(asctime)s %%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s',\n      'datefmt': '%%Y-%%m-%%d %%H:%%M:%%S'\n    },\n    'graylog': {\n      'format': '%%(levelname)s %%(module)s %%(process)d %%(name)s.%%(funcName)s:%%(userid)s %%(message)s'      \n    }\n  },\n  'filters': {\n    'odcontext': {\n      '()': 'oc.logging.OdContextFilter'\n    }\n  },\n  'handlers': {\n    'console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_console': {\n      'class': 'logging.StreamHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'stream': 'ext://sys.stdout'\n    },\n    'cherrypy_access': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'access',\n      'filename': 'logs/access.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8'\n    },\n    'cherrypy_trace': {\n      'class': 'logging.handlers.RotatingFileHandler',\n      'filters': [ 'odcontext' ],\n      'formatter': 'standard',\n      'filename': 'logs/trace.log',\n      'maxBytes': 10485760,\n      'backupCount': 20,\n      'encoding': 'utf8',\n      'mode': 'w'\n    },\n    'syslog': {\n       'class': 'logging.handlers.SysLogHandler',\n       'filters': [ 'odcontext' ],\n       'formatter': 'syslog',\n       'socktype': 2,\n       'address' : [ '192.168.0.52', 514 ]\n    }\n  },\n  'loggers': {\n    '': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog'  ],\n      'level': 'DEBUG'\n    },\n    'docker.utils.config': {\n      'level': 'INFO'\n    },\n    'urllib3.connectionpool': {\n      'level': 'ERROR'\n    },\n    'cherrypy.access': {\n      'handlers': [ 'cherrypy_access' ],\n      'level': 'INFO',\n      'propagate': False\n    },\n    'cherrypy.error': {\n      'handlers': [ 'console', 'cherrypy_trace', 'syslog' ],\n      'level': 'ERROR',\n      'propagate': False\n    }\n  } }\n
"},{"location":"3.0/config/syslog/#restart-pods","title":"Restart Pods","text":"

To restart Pods, we will delete and recreate all pods

"},{"location":"3.0/config/syslog/#delete-pods","title":"Delete pods","text":"

To delete pods, execute the following command:

kubectl delete -f abcdesktop.yaml\n
"},{"location":"3.0/config/syslog/#create-pods","title":"Create pods","text":"

To create pods, execute the following command:

kubectl create -f abcdesktop.yaml\n
"},{"location":"3.0/config/syslog/#verify-syslogs","title":"Verify syslogs","text":"

At this state, new abcdesktop logging configuration should be applied. We can now verify syslog logs:

tail /var/log/syslog\n

If you see some lines with 'INFO' Level, you probably see abcdesktop logs in syslog ! If not try to do actions in abcdesktop (open session, launch new application, close session) and apply the tail command again.

"},{"location":"3.0/config/volumes/","title":"Define volumes to retain user's home directory files","text":"

To retain user's home directory files, you can define

"},{"location":"3.0/config/volumes/#define-persistentvolume-using-hostpath","title":"Define persistentVolume using hostPath","text":"

In your od.config file, define the new entries desktop.homedirectorytype desktop.persistentvolumespec desktop.persistentvolumeclaimspec

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\n\n# define how to create persistentvolume\ndesktop.persistentvolumespec: {\n            'storageClassName': '',\n            'capacity': { 'storage': '1Gi' },\n            'accessModes': [ 'ReadWriteOnce' ], \n            'hostPath': { 'path': '/mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}' } }\n\n# define how to create persistentvolumeclaim\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': '',\n            'resources': { \n              'requests': { \n                'storage': '1Gi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n

desktop.persistentvolumespec support template values. For example '/mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}'.

The list of all template values can be read at the end of this chapter

The user's home directory inside the pod is located on host to /mnt/abcdesktop_volumes/{{ provider }}/{{ userid }}. The directory is created automatically by kubernetes.

The /mnt/abcdesktop_volumes/ content lists the provider name.

On the host, the new directory is created, where each home directory is located.

Read the new path for 'hostPath' persistent volumes

ls -la /mnt/abcdesktop_volumes/\ntotal 20\ndrwxr-xr-x   5 root root 4096 mai   12 12:40 .\ndrwxr-xr-x 106 root root 4096 mai   11 11:34 ..\ndrwxr-xr-x   3 root root 4096 mai   12 12:40 anonymous\ndrwxr-xr-x   3 root root 4096 mai   12 12:39 github\ndrwxr-xr-x   5 root root 4096 mai   12 12:40 google\n

For provider google, all users are listed.

ls -la /mnt/abcdesktop_volumes/google/\ntotal 20\ndrwxr-xr-x  5 root root 4096 mai   12 12:40 .\ndrwxr-xr-x  5 root root 4096 mai   12 12:40 ..\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:39 103464335761332102620\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:40 112026272437223559761\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:39 114102844260599245242\n

For provider google, list the user home directory for the user 103464335761332102620

ls -la /mnt/abcdesktop_volumes/google/103464335761332102620/\ntotal 76\ndrwxr-x--- 16 2048 2048 4096 mai   12 12:39 .\ndrwxr-xr-x  5 root root 4096 mai   12 12:40 ..\n-rw-------  1 2048 2048   71 mai   12 12:39 .Xauthority\n-rw-rw-r--  1 2048 2048   12 janv. 27 18:36 .Xresources\ndrwxr-x---  3 2048 2048 4096 mai   12 12:39 .cache\ndrwxr-x---  6 2048 2048 4096 mai   12 12:39 .config\ndrwxrwxr-x  3 2048 2048 4096 janv. 27 18:36 .gconf\n-rw-r-----  1 2048 2048    0 mai   12 12:39 .gtk-bookmarks\n-rw-rw-r--  1 2048 2048  564 janv. 27 18:36 .gtkrc-2.0\ndrwxr-x---  3 2048 2048 4096 mai   12 12:39 .local\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 .store\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 .wallpapers\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Desktop\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Documents\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Downloads\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Music\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Pictures\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Public\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Templates\ndrwxr-x---  2 2048 2048 4096 mai   12 12:39 Videos\n
"},{"location":"3.0/config/volumes/#list-of-all-template-values","title":"list of all template values","text":"

The template values can be one of them :

var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale template tag value tag value set by auth rules

Note: hostPath supports file permissions and the pod's init commands chown or chmod can be used. The hostPath can also be a mount point, using nfs.

"},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-storageclassname","title":"Define persistentVolumeClaim using storageClassName","text":"

To define a persistentVolumeClaim, update the od.config file and set

desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: <YOUR_PERSISTENT_VOLULME_CLAIM_SPEC>\n

desktop.persistentvolumeclaimspec is a dictionary. Get more information about PersistentVolume and PersistentVolumeClaim.

For example

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': 'mystorageclass',\n            'resources': { \n              'requests': { \n                'storage': '1Gi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n

Replace mystorageclass by storageclass of your cloud provider

kubectl get storageclass\n

The example output is as follows on the cloud provider aws.

NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE\ngp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false \n

The example output is as follows on the cloud provider digitalocean.

NAME                          PROVISIONER                    RECLAIMPOLICY          Immediate           false                  3h22m\ndo-block-storage (default)    dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-retain       dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\ndo-block-storage-xfs          dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-xfs-retain   dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\n
"},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-csi-driver-nfs","title":"Define persistentVolumeClaim using csi-driver-nfs","text":"

In this example, we use nfs to share user home directory with each worker node

Use the https://github.com/kubernetes-csi/csi-driver-nfs as a csi-driver-nfs with a nfs server as backend.

"},{"location":"3.0/config/volumes/#on-the-nfs-server","title":"On the nfs server","text":"

On the nfs server, create an export with the no_root_squash option

For example export /volume1/pods

/volume1/pods        192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
"},{"location":"3.0/config/volumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs","text":"

Run the install install-driver.sh command from kubernetes-csi/csi-driver-nfs GitHub repository.

curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n

Create a storage class file nfs-csi-sc-ds01.yaml,

Content of the default nfs-csi-sc-ds01.yaml

apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n  server: 192.168.7.101\n  share: /volume1/pods\n  mountPermissions: \"0755\"\n  # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n  # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n  # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n  - nfsvers=3\n
kubectl apply -f nfs-csi-sc-ds01.yaml\n

You read the response on stdout

storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n

Check the storage class nfs-csi-sc-ds01

kubectl get sc\nNAME                 PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE\nnfs-csi-sc-ds01      nfs.csi.k8s.io   Delete          Immediate           false                  18m\n
"},{"location":"3.0/config/volumes/#update-the-odconfig-file","title":"Update the od.config file","text":"

In your od.config file, define the entry desktop.persistentvolumeclaimspec

The PersistentVolume and PersistentVolumeClaim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': 'nfs-csi-sc-ds01',\n            'resources': { \n              'requests': { \n                'storage': '500Mi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n

Update the new config file and restart pyos pod

kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n
"},{"location":"3.0/config/volumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

Login as user (Philip J. Fry, fry)

The new desktop for Philip J. Fry is created.

Start the web shell command using the search bar

Using the web shell application start the df command

The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32

"},{"location":"3.0/config/volumes/#list-the-persistentvolume-and-persistentvolumeclaim","title":"List the PersistentVolume and PersistentVolumeClaim","text":"

List the new PersistentVolume

kubectl get pv \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS      REASON   AGE\npvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32   25Mi       RWO            Delete           Bound    abcdesktop/planet-fry-9372f   nfs-csi-sc-ds01            3m\n

List the new PersistentVolumeClaim

kubectl get pvc -n abcdesktop \nNAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE\nplanet-fry-9372f   Bound    pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32   25Mi       RWO            nfs-csi-sc-ds01   5m7s\n

Get the PersistentVolumeClaim's description

kubectl describe pvc planet-fry-9372f -n abcdesktop \nName:          planet-fry-9372f\nNamespace:     abcdesktop\nStorageClass:  nfs-csi-sc-ds01\nStatus:        Bound\nVolume:        pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32\nLabels:        access_provider=planet\n               access_providertype=ldap\n               access_userid=fry\nAnnotations:   pv.kubernetes.io/bind-completed: yes\n               pv.kubernetes.io/bound-by-controller: yes\n               volume.beta.kubernetes.io/storage-provisioner: nfs.csi.k8s.io\n               volume.kubernetes.io/storage-provisioner: nfs.csi.k8s.io\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      25Mi\nAccess Modes:  RWO\nVolumeMode:    Filesystem\nUsed By:       fry-87066\nEvents:\n  Type    Reason                 Age              From                                                        Message\n  ----    ------                 ----             ----                                                        -------\n  Normal  ExternalProvisioning   7m (x2 over 7m)  persistentvolume-controller                                 Waiting for a volume to be created either by the external provisioner 'nfs.csi.k8s.io' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.\n  Normal  Provisioning           7m               nfs.csi.k8s.io_kadmin_1c28f3c9-91ee-4aa0-b991-8c17c46133d3  External provisioner is provisioning volume for claim \"abcdesktop/planet-fry-9372f\"\n  Normal  ProvisioningSucceeded  7m               nfs.csi.k8s.io_kadmin_1c28f3c9-91ee-4aa0-b991-8c17c46133d3  Successfully provisioned volume pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32\n
"},{"location":"3.0/config/volumes/#set-quota-for-user-homedir","title":"Set quota for user homedir","text":"

Steps : - Define posixAccount in the ldap directory service - Define quota on the nfs server

The user fry has a posixAccount description in the embedded directory service cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com

Attribute Value objectClass inetOrgPerson cn Philip J. Fry sn Fry description Human displayName Fry employeeType Delivery boy givenName Philip jpegPhoto JPEG-Photo (429x350 Pixel, 22132 Bytes) mail fry@planetexpress.com ou Delivering Crew uid fry userPassword fry uidNumber 1049 gidNumber 2049 \u00a0homeDirectory: \u00a0/home/fry

On the nfs server, define a quota for uid fry. In this case, I use truenas as nfs server.

Create the fry user with the same attribute and value.

On the Storage |\u00a0Pools |\u00a0User Quotas, define a quota for the user fry

Set the quota value for fry

"},{"location":"3.0/config/volumes/#login-to-your-abcdesktop-service_1","title":"Login to your abcdesktop service","text":"

Delete previous pvc and pv for the fry user, if need.

Login as user (Philip J. Fry, fry)

The new desktop for Philip J. Fry is created.

Start the web shell command using the search bar

Using the web shell application start the dd commands

Run a dd command to reach the quota value (50 MiB is this case).

dd if=/dev/urandom of=quota-test-file\ndd: writing to 'quota-test-file': Disk quota exceeded\n1127945+0 records in\n1127944+0 records out\n577507328 bytes (578 MB, 551 MiB) copied, 14.6404 s, 39.4 MB/s\n

You should get the error Disk quota exceeded. The size of quota-test-file is over a the quota limit.

50 MB is 52,428,800 Bytes

ls -la quota-test-file \n-rw-r----- 1 fry fry 58720256 Aug 25 15:16 quota-test-file\n

The user should not be able to create new file

dd if=/dev/zero of=quota-test-file2\ndd: failed to open 'quota-test-file2': Disk quota exceeded\n

The nfs server has returned an error if the user tries to create more than 50 MiB.

"},{"location":"3.0/config/volumes/#define-persistentvolumeclaim-using-k8s-csi-s3","title":"Define persistentVolumeClaim using k8s-csi-s3","text":"

In this example, we use s3 to share user home directory with each worker node

Use the https://github.com/yandex-cloud/k8s-csi-s3 as a CSI for S3 with minio as backend.

Follow https://github.com/yandex-cloud/k8s-csi-s3 setup guide and test with the sample pod to make sure that fuse mounts the S3 file system.

"},{"location":"3.0/config/volumes/#update-storageclassyaml-file","title":"Update storageclass.yaml file","text":"
---\nkind: StorageClass\napiVersion: storage.k8s.io/v1\nmetadata:\n  name: csi-s3\nprovisioner: ru.yandex.s3.csi\nparameters:\n  mounter: geesefs \n  # you can set mount options here, for example limit memory cache size (recommended)\n  options: \"--memory-limit 1000 --dir-mode 0777 --file-mode 0666 --setuid 0\"\n  # to use an existing bucket, specify it here:\n  # bucket: abcdesktop\n  csi.storage.k8s.io/provisioner-secret-name: csi-s3-secret\n  csi.storage.k8s.io/provisioner-secret-namespace: kube-system\n  csi.storage.k8s.io/controller-publish-secret-name: csi-s3-secret\n  csi.storage.k8s.io/controller-publish-secret-namespace: kube-system\n  csi.storage.k8s.io/node-stage-secret-name: csi-s3-secret\n  csi.storage.k8s.io/node-stage-secret-namespace: kube-system\n  csi.storage.k8s.io/node-publish-secret-name: csi-s3-secret\n  csi.storage.k8s.io/node-publish-secret-namespace: kube-system\n

Update the csi-s3 storage class to add --setuid 0 as options

kubectl delete sc csi-s3\nkubectl create -f storageclass.yaml\n
"},{"location":"3.0/config/volumes/#update-odconfig","title":"Update od.config","text":"

In your od.config file, define the entry desktop.persistentvolumeclaimspec

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaimspec: {\n            'storageClassName': 'csi-s3',\n            'resources': { \n              'requests': { \n                'storage': '1Gi'\n              } \n            },\n            'accessModes': [ 'ReadWriteOnce' ] }\n
"},{"location":"3.0/config/volumes/#init-command-options-has-no-file-permissions-support","title":"init command options has no file permissions support","text":"

By default the storageclass use mounter: geesefs. geesefs does not store file permissions and the init commands chown or chmod exit with no zero value, then the pod does not start. All files belongs to root, but with correct permissions options: \"--memory-limit 1000 --dir-mode 0777 --file-mode 0666 --setuid 0\".

Update the 'init' in desktop.pod dict

'init': { \n    'image': 'busybox',\n    'enable': True,\n    'pullpolicy':  'IfNotPresent',\n    'securityContext': {\n        'runAsUser':   0,\n        'runAsGroup':  0 \n    },\n    'acl':  { 'permit': [ 'all' ] },\n    'command':  [ 'sh', '-c',  'chown {{ uidNumber }}:{{ gidNumber }} ~ || true && chmod 750 ~ || true' ] \n  }\n

Apply the new configuration file and restart pyos pods

kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n

Login to abcdestkop service using your web browser.

List the persistent volumes

kubectl get pv\nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                             STORAGECLASS               REASON   AGE\npvc-81a65ed9-b98e-462c-86c6-36c89c3d4f1b   1Gi        RWO            Delete           Bound    abcdesktop/github-12896316-96cb5                  csi-s3                              2m46s\n

List the persistent volume claims

# kubectl get pvc -n abcdesktop\nNAME                                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE\ngithub-12896316-96cb5                  Bound    pvc-81a65ed9-b98e-462c-86c6-36c89c3d4f1b   1Gi        RWO            csi-s3                     2m21s\n
"},{"location":"3.0/config/webrtc/","title":"Sound server configuration","text":"

By default abcdesktop use the module-http-protocol-tcp from pulseaudio sound server to send wav data to the web browser

"},{"location":"3.0/config/webrtc/#pulseaudio-http-stream-by-default","title":"pulseaudio http stream (by default)","text":"

By default, abcdesktop uses the pulseaudio http stream and play wave data (poor sound quality but works in https only)

In terminal webshell run the command :

pactl -s /tmp/.pulse.sock list short modules\n
balloon@bac345323f37:/var/log/desktop$ pactl -s /tmp/.pulse.sock list short modules\n0 module-augment-properties\n1 module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 rate=11025'\"\n2 module-null-sink sink_name=s16_1_22050 format=s16be channels=1 rate=22050 sink_properties=\"device.description='default format=s16be c=1 rate=22050'\"\n3 module-null-sink sink_name=s16_1_44100 format=s16be channels=1 rate=44100 sink_properties=\"device.description='default format=s16be c=1 rate=44100'\"\n4 module-null-sink sink_name=ulaw8_1_8000 format=ulaw channels=1 rate=8000 sink_properties=\"device.description='default format=ulaw c=1 rate=8000'\"\n5 module-null-sink sink_name=rtp format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n6 module-native-protocol-unix auth-group=balloon socket=/tmp/.pulse.sock\n7 module-http-protocol-tcp listen=172.21.0.5\n8 module-always-sink\n
"},{"location":"3.0/config/webrtc/#webrtc-gateway-enable","title":"webrtc gateway enable","text":"

To get a better sound quality, you can use a webrtc gateway and send a rtp stream to the webrtc gateway. abcdesktop plays sound using the web browser webrtc stack (good sound quality)

abcdesktop update the pulseaudio configuration, and add module-rtp-send. The module-rtp-send pusleaudio send to the destination_ip (in this example 1.2.3.4)

pactl -s /tmp/.pulse.sock list short modules\n
balloon@414e3db9-60d8-4f92-a356-a3a74833990c:~$ pactl -s /tmp/.pulse.sock list short modules\n0       module-augment-properties\n1       module-null-sink        sink_name=rtp  format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink'\"\n2       module-native-protocol-unix     auth-group=balloon socket=/tmp/.pulse.sock\n3       module-always-sink\n4       module-rtp-send source=rtp.monitor destination_ip=1.2.3.4 port=5119 channels=1 format=alaw\n

The sink_name is rtp, and the source for the module-rtp-send is rtp.monitor.

The default source is rtp.monitor

Source #\n        State: RUNNING\n        Name: rtp.monitor\n        Description: Monitor of RTP Multicast Sink\n        Driver: module-null-sink.c\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Owner Module: 5\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Base Volume: 65536 / 100% / 0.00 dB\n        Monitor of Sink: rtp\n        Latency: 0 usec, configured 160000 usec\n        Flags: DECIBEL_VOLUME LATENCY \n        Properties:\n                device.description = \"Monitor of RTP Multicast Sink\"\n                device.class = \"monitor\"\n                device.icon_name = \"audio-input-microphone\"\n        Formats:\n                pcm\n

The default output is

\nSource Output #0\n        Driver: module-rtp-send.c\n        Owner Module: 9\n        Client: n/a\n        Source: 4\n        Sample Specification: aLaw 1ch 8000Hz\n        Channel Map: mono\n        Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n        Corked: no\n        Mute: no\n        Volume: mono: 65536 / 100% / 0.00 dB\n                balance 0.00\n        Buffer Latency: 0 usec\n        Source Latency: 0 usec\n        Resample method: n/a\n        Properties:\n                media.name = \"RTP Monitor Stream\"\n                rtp.source = \"0.0.0.0\"\n                rtp.destination = \"1.2.3.4\"\n                rtp.mtu = \"1280\"\n                rtp.port = \"5119\"\n                rtp.ttl = \"1\"\n

By default, the format is pcm

Format: pcm, format.sample_format = \"\\\"aLaw\\\"\"  format.rate = \"8000\"  format.channels = \"1\"  format.channel_map = \"\\\"mono\\\"\"\n

To change the default format update the values in od.config file.

 'audiopt': 8,\n 'audiortpmap': 'PCMA/8000',\n

To get the 'audiopt' and 'audiortpmap' values, read the web pages

"},{"location":"3.0/config/webrtc/#requirements","title":"Requirements","text":""},{"location":"3.0/config/webrtc/#install-a-janus-server","title":"Install a janus server","text":""},{"location":"3.0/config/webrtc/#install-janus","title":"Install janus","text":"

Install a janus service from meetecho.com on a server

apt-get install janus\n
"},{"location":"3.0/config/webrtc/#add-x509-certificats","title":"Add X509 certificats","text":"

Add X509 certificats in your janus.jcfg configuration. Certificate and key to use for DTLS (and passphrase if needed). If missing, Janus will autogenerate a self-signed certificate to use. Notice that self-signed certificates are fine for the purpose of WebRTC DTLS connectivity, for the time being, at least until Identity Providers are standardized and implemented in browsers.

certificates: {\n    cert_pem = \"/etc/ssl/certs/ssl-cert-snakeoil.pem\"\n    cert_key = \"/etc/ssl/private/ssl-cert-snakeoil.key\"\n    cert_pwd = \"secretpassphrase\"\n}\n
"},{"location":"3.0/config/webrtc/#add-the-webrtc-entry-in-odconfig","title":"add the webrtc entry in od.config","text":"

Update the od.config file, for example :

# WebRTC Janus config\nwebrtc.enable : True\nwebrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
"},{"location":"3.0/config/webrtc/#webrtcenable","title":"webrtc.enable","text":"

webrtc.enable is a boolean. The default value is False. Set this value to True to enable webrtc services for pulseaudio.

"},{"location":"3.0/config/webrtc/#webrtcserver","title":"webrtc.server","text":"

webrtc.server is a dict. The default value is None. Set all dictionnary values to enable webrtc access for pulseaudio and for the web browser client.

The hostip value, is used by pluse audio to configure the rtp stream. This value must be an ip address (do not set the fqdn). This can be an internal ip address, and is only to configure pulseaudio module and describe how to send stream data to reach the webrtc gateway.

'hostip': '1.2.3.4'\n

The host value, is used by the browser to reach the webrtc gateway and get the rtp stream. This value must(should) be a fqdn. This fqdn is used by the web browser.

webrtc.server : {   'janus.domain.local' : { 'schema' : 'http',\n                                          'host': 'janus.domain.local',\n                                          'hostip': '1.2.3.4',\n                                          'port': 8088,\n                                          'audiopt': 8,\n                                          'audiortpmap': 'PCMA/8000',\n                                          'apisecret': 'janusrocks',\n                                          'adminkey': 'supersecret',\n                                          'startport': 5100 } }\n
"},{"location":"3.0/config/controllers/manager/","title":"ManagerController","text":""},{"location":"3.0/config/controllers/manager/#http-request","title":"HTTP Request","text":"

The http request path is /API/manager

Path Params Response type /API/manager/buildapplist None Json object /API/manager/updateactivedirectorysite None Json object /API/manager/garbagecollector expirein=, force=False Json object"},{"location":"3.0/config/controllers/manager/#buildapplist","title":"buildapplist","text":"

buildapplist ask pyos to list all abcdesktop.io docker image. Each docker image must have the specified label type=apps. abcdesktop.io

Params Type Description None None None

example :

curl http://localhost/API/manager/buildapplist\n

Return the complete array if json images objects ready to run.

\n{\"abcdesktopio/writer.d:latest\": {\"id\": \"abcdesktopio/writer.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-writer\", \"name\": \"Writer\", \"icon\": \"libreoffice-writer.svg\", \"keyword\": \"libre office writer,office,writer\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--writer\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Writer\", \"mimetype\": [\"application/vnd.oasis.opendocument.text\", \"application/vnd.oasis.opendocument.text-template\", \"application/vnd.oasis.opendocument.text-web\", \"application/vnd.oasis.opendocument.text-master\", \"application/vnd.oasis.opendocument.text-master-template\", \"application/vnd.sun.xml.writer\", \"application/vnd.sun.xml.writer.template\", \"application/vnd.sun.xml.writer.global\", \"application/msword\", \"application/vnd.ms-word\", \"application/x-doc\", \"application/x-hwp\", \"application/rtf\", \"text/rtf\", \"application/vnd.wordperfect\", \"application/wordperfect\", \"application/vnd.lotus-wordpro\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-word.document.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\", \"application/vnd.ms-word.template.macroenabled.12\", \"application/vnd.stardivision.writer-global\", \"application/x-extension-txt\", \"application/x-t602\", \"application/vnd.oasis.opendocument.text-flat-xml\", \"application/x-fictionbook+xml\", \"application/macwriteii\", \"application/x-aportisdoc\", \"application/prs.plucker\", \"application/vnd.palm\", \"application/clarisworks\", \"application/x-sony-bbeb\", \"application/x-abiword\", \"application/x-iwork-pages-sffpages\", \"application/x-mswrite\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-writer.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"sxw\", \"stw\", \"doc\", \"dot\", \"wps\", \"rtf\", \"602\", \"wpd\", \"docx\", \"docm\", \"dotx\", \"dotm\", \"abw\", \"zabw\", \"pages\", \"dummy\", \"lrf\", \"cwk\", \"hqx\", \"fb2\", \"mw\", \"mcw\", \"mwd\", \"pdb\", \"wn\"], \"legacyfileextensions\": [\"odf\", \"ott\", \"fodt\", \"uot\"]}, \"abcdesktopio/math.d:latest\": {\"id\": \"abcdesktopio/math.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-math\", \"name\": \"Math\", \"icon\": \"libreoffice-math.svg\", \"keyword\": \"libre office math,office,math\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--math\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Math\", \"mimetype\": [\"application/vnd.oasis.opendocument.formula\", \"application/vnd.sun.xml.math\", \"application/vnd.oasis.opendocument.formula-template\", \"text/mathml\", \"application/mathml+xml\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-math.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odf\", \"odc\"], \"legacyfileextensions\": [\"odf\", \"odc\"]}, \"abcdesktopio/impress.d:latest\": {\"id\": \"abcdesktopio/impress.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-impress\", \"name\": \"Impress\", \"icon\": \"libreoffice-impress.svg\", \"keyword\": \"libre office impress,office,impress\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--impress\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Impress\", \"mimetype\": [\"application/vnd.oasis.opendocument.presentation\", \"application/vnd.oasis.opendocument.presentation-template\", \"application/vnd.sun.xml.impress\", \"application/vnd.sun.xml.impress.template\", \"application/mspowerpoint\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint.presentation.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.template\", \"application/vnd.ms-powerpoint.template.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.presentationml.slide\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\", \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\", \"application/vnd.oasis.opendocument.presentation-flat-xml\", \"application/x-iwork-keynote-sffkey\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-impress.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odp\", \"pot\", \"potm\", \"potx\", \"pps\", \"ppsx\", \"ppt\", \"pptx\", \"pptm\"], \"legacyfileextensions\": [\"odp\"]}, \"abcdesktopio/calc.d:latest\": {\"id\": \"abcdesktopio/calc.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-calc\", \"name\": \"Calc\", \"icon\": \"libreoffice-calc.svg\", \"keyword\": \"libre office calc,office,calc\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"office\", \"args\": \"--calc\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": \"dock\", \"displayname\": \"Calc\", \"mimetype\": [\"application/vnd.oasis.opendocument.spreadsheet\", \"application/vnd.oasis.opendocument.spreadsheet-template\", \"application/vnd.sun.xml.calc\", \"application/vnd.sun.xml.calc.template\", \"application/msexcel\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/vnd.ms-excel.sheet.macroenabled.12\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\", \"application/vnd.ms-excel.template.macroenabled.12\", \"application/vnd.ms-excel.sheet.binary.macroenabled.12\", \"text/csv\", \"application/x-dbf\", \"text/spreadsheet\", \"application/csv\", \"application/excel\", \"application/tab-separated-values\", \"application/vnd.lotus-1-2-3\", \"application/vnd.oasis.opendocument.chart\", \"application/vnd.oasis.opendocument.chart-template\", \"application/x-dbase\", \"application/x-dos_ms_excel\", \"application/x-excel\", \"application/x-msexcel\", \"application/x-ms-excel\", \"application/x-quattropro\", \"application/x-123\", \"text/comma-separated-values\", \"text/tab-separated-values\", \"text/x-comma-separated-values\", \"text/x-csv\", \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\", \"application/vnd.ms-works\", \"application/x-iwork-numbers-sffnumbers\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-calc.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"ods\", \"ots\", \"sxc\", \"stc\", \"fods\", \"uos\", \"uof\", \"xml\", \"xlsx\", \"xlsm\", \"xltm\", \"xltx\", \"xlsb\", \"xls\", \"xlm\", \"xlc\", \"xlw\", \"xlk\", \"xlt\", \"dif\", \"dbf\", \"htm\", \"html\", \"wk1\", \"wks\", \"123\", \"wb2\", \"rtf\", \"slk\", \"sylk\", \"csv\", \"numbers\", \"dummy\", \"cwk\", \"wps\", \"wk3\", \"wq1\", \"wq2\"], \"legacyfileextensions\": [\"ods\", \"ots\", \"csv\"]}, \"abcdesktopio/base.d:latest\": {\"id\": \"abcdesktopio/base.d:latest\", \"rules\": null, \"acl\": null, \"launch\": \"libreoffice.libreoffice-base\", \"name\": \"Base\", \"icon\": \"libreoffice-base.svg\", \"keyword\": \"libre office base,office,base\", \"uniquerunkey\": \"libreoffice\", \"cat\": \"development\", \"args\": \"--base\", \"execmode\": null, \"memory\": null, \"shm_size\": null, \"oomkilldisable\": null, \"showinview\": null, \"displayname\": \"Base\", \"mimetype\": [\"application/vnd.oasis.opendocument.database\", \"application/vnd.sun.xml.base\"], \"path\": \"/usr/lib/libreoffice/program/soffice\", \"desktopfile\": \"libreoffice-base.desktop\", \"executablefilename\": \"soffice\", \"usedefaultapplication\": true, \"fileextensions\": [\"odb\"], \"legacyfileextensions\": [\"odb\"]}}\n\n
"},{"location":"3.0/config/controllers/manager/#updateactivedirectorysite","title":"updateactivedirectorysite","text":"Params Type Description None None None

example :

curl http://localhost/API/manager/updateactivedirectorysite

"},{"location":"3.0/config/controllers/manager/#garbagecollector","title":"garbagecollector","text":"Params Type Description expirein integer number in seconds since the container create date time force boolean garbage the container even if a user is connected

example :

curl \"http://localhost/API/manager/garbagecollector?expirein=9473\" curl \"http://localhost/API/manager/garbagecollector?expirein=9473&force=True\"

"},{"location":"3.0/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.0/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"

To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.

"},{"location":"3.0/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204-step-by-step","title":"Install Kubernetes on Ubuntu 22.04 (Step by Step)","text":"

These commands install the latest Kubernetes on a single node Ubuntu 22.04

"},{"location":"3.0/setup/k8slinuxinstallation/#step-0-disable-swap","title":"Step 0: Disable swap","text":"

Execute command swapoff to disable swap.

swapoff -a\n

Load the overlay and br_netfilter kernel modules

modprobe overlay\nmodprobe br_netfilter\n

Create the containerd.conf to load modules

cat >>/etc/modules-load.d/containerd.conf <<EOF\noverlay\nbr_netfilter\nEOF\n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-1-install-containerdio-from-docker-repository","title":"Step 1: Install containerd.io from docker repository","text":"

Install the containerd utility and required packages on node by running the following command as sudo in a Terminal :

Install common packages

apt-get install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates\n

Add source

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg\nadd-apt-repository \"deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\"\n

You will be prompted with a Y/n option in order to proceed with the installation.

apt update\napt install -y containerd.io\n

containerd.io will then be installed on your system.

"},{"location":"3.0/setup/k8slinuxinstallation/#step-2-configure-containerdio","title":"Step 2: Configure containerd.io","text":"

Configure containerd to use systemd as cgroup.

containerd config default > /etc/containerd/config.toml\nsed -i 's/SystemdCgroup \\= false/SystemdCgroup \\= true/g' /etc/containerd/config.toml\n

Enable the containerd utility by running the following command :

systemctl restart containerd\nsystemctl enable containerd\n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-3-add-the-kubernetes-signing-key","title":"Step 3: Add the Kubernetes signing key","text":"

Run the following command in order to get the Kubernetes signing key:

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - \n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-4-add-xenial-kubernetes-repository","title":"Step 4: Add Xenial Kubernetes Repository","text":"

Run the following commands in order to add the Xenial Kubernetes repository:

echo \"deb https://apt.kubernetes.io/ kubernetes-xenial main\" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list \napt-get update\n
"},{"location":"3.0/setup/k8slinuxinstallation/#step-5-install-kubernetes","title":"Step 5: Install Kubernetes","text":"

Create kubernetes.conf for sysctl.d

cat >>/etc/sysctl.d/kubernetes.conf <<EOF\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1\nEOF\n

Reload your system sysctl changes

sysctl --system\n

Install the packages kubelet kubeadm kubectl

apt install -y kubelet kubeadm kubectl\n

K8s utilities will then be installed on your system.

You can check the version number of kubeadm and also verify the installation through the following command:

 kubeadm version -o yaml\n
clientVersion:\n  buildDate: \"2022-10-12T10:55:36Z\"\n  compiler: gc\n  gitCommit: 434bfd82814af038ad94d62ebe59b133fcb50506\n  gitTreeState: clean\n  gitVersion: v1.25.3\n  goVersion: go1.19.2\n  major: \"1\"\n  minor: \"25\"\n  platform: linux/amd64\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"

abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.

The abcdesktop infrastructure is using the contianers :

Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.0 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.0 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.0/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

You need to have a

You can run the Quick installation process or choose the Manually installation step by step

"},{"location":"3.0/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

Quick installation can be run on Linux or macOS operation system.

Download and extract the latest release automatically (Linux or macOS):

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.0.sh | bash\n

The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

"},{"location":"3.0/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

"},{"location":"3.0/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.0/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

We will create the abcdesktop namespace and set it as default :

kubectl create namespace abcdesktop\n

You should read on the standard output

namespace/abcdesktop created\n

Option : To use the namespace abcdestkop as default namespace kubectl config set-context $(kubectl config current-context) --namespace=abcdesktop

All kubectl commands will be executed with abcdesktop namespace. This will avoid to add \"-n abcdesktop\" to all commands.

"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

The following commands will let you create all necessary keys :

openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

Then, create the kubernetes secrets from the new key files:

kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

You should read on the standard output :

secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n

Only if you use a private registry or if the abcdesktop registry is private Create Secret to allow kubernetes to download abcdesktop images from docker registry. For this part you need to change docker-username and docker-password by credentials provided by project owner. If you don't have this values, you will have to build abcdesktop images by yourself.

change docker.json path if need /root/.docker/config.json kubectl create secret generic abcdesktopregistrysecret --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson -n abcdesktop

"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

You can verify secrets creation with the following command :

kubectl get secrets -n abcdesktop\n

You should read on the standard output :

NAME                           TYPE                                  DATA   AGE\ndefault-token-5zknd            kubernetes.io/service-account-token   3      6m6s\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"

Create a pod user to make sure that Kubernetes will find the docker images at startup time.

kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser.yaml\n

You should read on stdout

pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n

You can wait for user pod is Ready, this while take a while, for container images are downloading.

kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5  -n abcdesktop --timeout=-1s\n
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n

You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5. This container images are downloaded.

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser.yaml\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"

Download the od.config file. This is the main file for pyos control plane.

curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.0 --output od.config\n

Create the config map abcdesktop-config in the abcdesktop namespace

kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

You should read on sdtout

configmap/abcdesktop-config created\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"

abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

Run the command line

kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.0.yaml\n

You should read on the standard output

clusterrole.rbac.authorization.k8s.io/pyos-role created\nclusterrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

kubectl get pods -n abcdesktop\n

You should read on the standard output

NAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-57c57c4f9d-92fs2   1/1     Running   0          59m\nmongodb-od-f69ff6b5b-v6ztc      1/1     Running   0          59m\nnginx-od-58f86c4dc8-8n9lf       1/1     Running   0          59m\nopenldap-od-d66d66bf4-84lg8     1/1     Running   0          59m\npyos-od-5586b88767-6gdtk        1/1     Running   0          59m\nspeedtest-od-6c59bdff75-n6s66   1/1     Running   0          59m\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

Open your navigator to http://[your-ip-hostname]:30443/

abcdesktop homepage should be available :

Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

Great you have installed abcdesktop.io in Kubernetes mode. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the chapter add kubernetes contain

"},{"location":"3.0/setup/kubernetes_abcdesktop/#troubleshoot","title":"Troubleshoot","text":"

All kubernetes resources can be inspected to get more informations.

First list elements you want to verify, in the following case, we will inspect pods :

kubectl get pods -n abcdesktop\n
NAME                            READY   STATUS             RESTARTS   AGE\nnginx-od-db69c45fb-qnd4n        1/1     Running            0          92s\npyos-od-5586b88767-6gdtk        1/1     Running            0          92s\nmemcached-od-db69c45fb-mqt4n    1/1     Running            0          92s\nmongodb-od-ff874fcb5-sm6f7      1/1     Running            0          92s\nspeedtest-od-55c58fdd69-5znpr   0/1     ImagePullBackOff   0          92s\n

As we can see, status is \"ImagePullBackOff\" for speedtest-od pod. We will then ask kubernetes to describe the pod with the following command :

kubectl describe pod speedtest-od-55c58fdd69-t99ck -n abcdesktop

In this case, the important information part is at the end (it's not always the case, you can also look at \"Conditions:\" section) :

    Events:\n      Type     Reason   Age                    From             Message\n      ----     ------   ----                   ----             -------\n      Warning  Failed   7m6s (x4837 over 18h)  kubelet, cube05  Error: ImagePullBackOff\n      Normal   BackOff  2m9s (x4860 over 18h)  kubelet, cube05  Back-off pulling image \"registry.mydomain.local:443/oc.speedtest\"\n

As we can see, in this case, Kubernetes had a problem to pull oc.speedtest image from registry.

"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-the-deployments","title":"Verify the deployments","text":"
kubectl get deployment -n abcdesktop\n

You should read on the standard output

NAME           READY   UP-TO-DATE   AVAILABLE   AGE\nmemcached-od   1/1     1            1           10m\nmongodb-od     1/1     1            1           10m\nnginx-od       1/1     1            1           4m26s\nopenldap-od    1/1     1            1           10m\npyos-od        1/1     1            1           3m2s\nspeedtest-od   1/1     1            1           10m\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-service-ports","title":"Verify service ports","text":"
kubectl get services -n abcdesktop\n

You should read on the standard output

NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE\ndesktop     ClusterIP   None             <none>        <none>            11m\nmemcached   ClusterIP   10.107.106.62    <none>        11211/TCP         11m\nmongodb     ClusterIP   10.96.113.246    <none>        27017/TCP         11m\nnginx       NodePort    10.100.253.228   <none>        80:30443/TCP      11m\nopenldap    ClusterIP   10.105.69.239    <none>        389/TCP,636/TCP   11m\npyos        ClusterIP   10.98.97.186     <none>        8000/TCP          11m\nspeedtest   ClusterIP   10.109.48.166    <none>        80/TCP            11m\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-cluster-roles","title":"Verify cluster roles","text":"

cluster roles are disable by default

kubectl describe ClusterRole pyos-role -n abcdesktop\n

You should read on the standard output

Name:         pyos-role\nLabels:       <none>\nAnnotations:  <none>\nPolicyRule:\n  Resources                 Non-Resource URLs  Resource Names  Verbs\n  ---------                 -----------------  --------------  -----\n  pods/ephemeralcontainers  []                 []              [create get list watch update patch delete]\n  pods/exec                 []                 []              [create get list watch update patch delete]\n  persistentvolumes         []                 []              [get list create delete]\n  persistentvolumeclaims    []                 []              [get list update create delete]\n  configmaps                []                 []              [get list watch create update patch delete]\n  pods                      []                 []              [get list watch create update patch delete]\n  secrets                   []                 []              [get list watch create update patch delete]\n  events                    []                 []              [get list watch]\n  pods/log                  []                 []              [get list watch]\n  endpoints                 []                 []              [get list]\n  nodes                     []                 []              [get watch list]\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#verify-cluster-role-bindind","title":"Verify Cluster Role Bindind","text":"

cluster roles Bindind are disable by default

kubectl describe ClusterRoleBinding pyos-rbac -n abcdesktop\n

You should read on the standard output

Name:         pyos-rbac\nLabels:       <none>\nAnnotations:  <none>\nRole:\n  Kind:  ClusterRole\n  Name:  pyos-role\nSubjects:\n  Kind            Name                 Namespace\n  ----            ----                 ---------\n  ServiceAccount  pyos-serviceaccount  abcdesktop\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#read-pyos-logs","title":"Read pyos logs","text":"
kubectl logs -l run=pyos-od -n abcdesktop --follow -n abcdesktop\n

You should read on the standard output

2023-05-17 13:29:08 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:18 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:28 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:38 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:48 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:29:58 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:08 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:18 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:28 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:38 od [INFO   ] __main__.trace_request:anonymous /healthz\n2023-05-17 13:30:48 od [INFO   ] __main__.trace_request:anonymous /healthz\n
"},{"location":"3.0/setup/kubernetes_abcdesktop/#rollout-deployment","title":"Rollout deployment","text":"

To rollout restart the abcdesktop deployment

kubectl rollout restart deployment -n abcdesktop\n

You should read on the standard output

deployment.apps/memcached-od restarted\ndeployment.apps/mongodb-od restarted\ndeployment.apps/nginx-od restarted\ndeployment.apps/openldap-od restarted\ndeployment.apps/pyos-od restarted\ndeployment.apps/speedtest-od restarted\n

Check the pods status

kubectl get pods -n abcdesktop\n

You should read on the standard output

NAME                            READY   STATUS        RESTARTS   AGE\nmemcached-od-64c56f9458-jcf9x   1/1     Running       0          32s\nmongodb-od-5b5cc9946d-q7fph     1/1     Running       0          32s\nnginx-od-58bdf79df4-skjsn       1/1     Running       0          32s\nopenldap-od-6dcc5d7f8b-g8gvj    1/1     Running       0          32s\npyos-od-784bd7b5c5-tdzxx        1/1     Running       0          32s\nspeedtest-od-5ff99b6579-st9jx   1/1     Running       0          32s\n
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

Quick installation can be run on Linux or macOS operation system.

Download and execute the pullapps-3.0.sh script :

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.0.sh | bash\n

This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

Now reconnect to your abcdesktop.

Open your navigator to http://[your-ip-hostname]:30443/

http://localhost:30443/\n

The new applications are installed, and ready to run.

"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

Add new application, require to send an application json document to the control-plane pyos.

"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/conf/tree/main/apps

curl https://raw.githubusercontent.com/abcdesktopio/conf/main/apps/2048.d.3.0.json --output 2048.json\n

The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

Send the 2048.json file to the images REST API

curl -X PUT -H 'Content-Type: text/javascript' http://[your-ip-hostname]:30443/API/manager/image -d @2048.json\n

The response is the json document.

[{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GETcurl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/imagePUTcurl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.jsonPOSTcurl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.jsonDELETEcurl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

kubectl get pods -n abcdesktop\n

The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

Then the pod STATUS become Running during 42 seconds.

NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

This pod is created to ask Kubernetes for pulling the container image.

"},{"location":"3.0/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

Now reconnect to your abcdesktop.

Open your navigator to http://[your-ip-hostname]:30443/

http://localhost:30443/\n

The new applications are installed, and ready to run.

"},{"location":"3.0/setup/kubernetesmode/","title":"Setup kubernetes for GNU/Linux","text":"

This section apply only to configure kubernetes for GNU/Linux.

abcdesktop.io support docker mode and kubernetes mode. In this section we will study how abcdesktop.io is working in kubernetes mode. The abcdesktop.io kubernetes mode is recommended for enterprise use, all user containers can be distributed on different hosts.

"},{"location":"3.0/setup/kubernetesmode/#requirements","title":"Requirements","text":"

Linux Requierements

"},{"location":"3.0/setup/kubernetesmode/#installation","title":"Installation","text":"

The following commands will let you prepare kubernetes on one node. In this case, all applications run on a single node. It's recommended to start with a single node.

"},{"location":"3.0/setup/kubernetesmode/#kubernetes-master-node","title":"Kubernetes Master Node","text":""},{"location":"3.0/setup/kubernetesmode/#step-1-disable-swap-memory-if-running","title":"Step 1: Disable swap memory (if running)","text":"

You need to disable swap memory on nodes as Kubernetes does not perform properly on a system that is using swap memory. Run the following command in order to disable swap memory.

swapoff -a\n

If you have some swaps in /etc/fstab, just comment them out. swapoff -a will disable all swaps temporarily.

systemctl mask dev-zram1.swap\nCreated symlink /etc/systemd/system/dev-zram1.swap \u2192 /dev/null.\n
"},{"location":"3.0/setup/kubernetesmode/#step-2-init-kubernetes","title":"Step 2: init kubernetes","text":"

Run the following command as sudo on the master node:

kubeadm init --pod-network-cidr=10.244.0.0/16\n

The process might take a minute or more depending on your internet connection.

To be able to manage your kubernetes server, you need to run the following commands as a regular user:

mkdir -p $HOME/.kube\ncp -i /etc/kubernetes/admin.conf $HOME/.kube/config\nchown $(id -u):$(id -g) $HOME/.kube/config\n
"},{"location":"3.0/setup/kubernetesmode/#step-3-permit-schedule","title":"Step 3: Permit Schedule","text":"

Taints are Kubernetes flags to prevent Pod Scheduling. Remove the taints on the master so that you can schedule pods on it.

kubectl taint node `hostname` node-role.kubernetes.io/control-plane:NoSchedule-\n

It should return the following string.

node/<your-hostname> untainted\n

Taints are Kubernetes flags to prevent Pod Scheduling.

Confirm that you now have a node in your cluster with the following command.

kubectl get nodes -o wide\n

It should return something like the following.

NAME      STATUS     ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME\nhostname  NotReady   control-plane   3m17s   v1.25.3   192.168.7.187   <none>        Ubuntu 22.04.1 LTS   5.15.0-52-generic   containerd://1.6.9\n
"},{"location":"3.0/setup/kubernetesmode/#step-4-deploy-flannel-through-the-master-node","title":"Step 4: Deploy flannel through the master node","text":"

A pod network is a medium of communication between the nodes of a network. We are deploying flannel network on our cluster through the following command:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml\n

It should return the following strings.

namespace/kube-flannel created\nclusterrole.rbac.authorization.k8s.io/flannel created\nclusterrolebinding.rbac.authorization.k8s.io/flannel created\nserviceaccount/flannel created\nconfigmap/kube-flannel-cfg created\ndaemonset.apps/kube-flannel-ds created\n
"},{"location":"3.0/setup/kubernetesmode/#check-node-status","title":"Check node status","text":"

Now when you see the status of the nodes, you will see that the master-node is ready :

kubectl get nodes -o wide\n
NAME      STATUS   ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME\nHostname  Ready    control-plane   4m12s   v1.25.3   192.168.7.187   <none>        Ubuntu 22.04.1 LTS   5.15.0-52-generic   containerd://1.6.9\n

At this step, there is no more Taints and your node is Ready.

Next step, continue with the setup abcdesktop for kubernetes.

"},{"location":"3.0/setup/requirements/","title":"Requirements","text":""},{"location":"3.0/setup/requirements/#prerequisites-for-abcdesktop-setup-in-release-3x","title":"Prerequisites for abcdesktop setup in release 3.x","text":""},{"location":"3.0/setup/requirements/#release-3x","title":"Release 3.x","text":"
$ kubectl version --output=yaml\n
serverVersion:\n  buildDate: \"2022-05-24T12:18:48Z\"\n  compiler: gc\n  gitCommit: 3ddd0f45aa91e2f30c70734b175631bec5b5825a\n  gitTreeState: clean\n  gitVersion: v1.24.1\n  goVersion: go1.18.2\n  major: \"1\"\n  minor: \"24\"\n  platform: linux/amd64\n
"},{"location":"3.0/setup/requirements/#microk8s-support","title":"microk8s support","text":"

microk8s is supported in abcdesktop release 3.0. The reverse proxy service need to enable dns service.

"},{"location":"3.0/setup/requirements/#microk8s-kubectl-version","title":"microk8s kubectl version","text":"
$ microk8s kubectl version --output=yaml\nclientVersion:\n  buildDate: \"2022-09-28T14:42:45Z\"\n  compiler: gc\n  gitCommit: 949b88ddc8b8cc540684c90c176f92ac9676e07c\n  gitTreeState: clean\n  gitVersion: v1.24.6-2+949b88ddc8b8cc\n  goVersion: go1.18.5\n  major: \"1\"\n  minor: 24+\n  platform: linux/amd64\nkustomizeVersion: v4.5.4\nserverVersion:\n  buildDate: \"2022-09-28T14:40:13Z\"\n  compiler: gc\n  gitCommit: 949b88ddc8b8cc540684c90c176f92ac9676e07c\n  gitTreeState: clean\n  gitVersion: v1.24.6-2+949b88ddc8b8cc\n  goVersion: go1.18.5\n  major: \"1\"\n  minor: 24+\n  platform: linux/amd64\n
"},{"location":"3.0/setup/requirements/#enable-dns-add-one-to-microk8s","title":"enable dns add one to microk8s","text":"
$ microk8s enable dns\n

You should ready on stdout

$ microk8s enable dns\nInfer repository core for addon dns\nEnabling DNS\nApplying manifest\nserviceaccount/coredns created\nconfigmap/coredns created\ndeployment.apps/coredns created\nservice/kube-dns created\nclusterrole.rbac.authorization.k8s.io/coredns created\nclusterrolebinding.rbac.authorization.k8s.io/coredns created\nRestarting kubelet\nDNS is enabled\n

Check microk8s status

$ microk8s status\nmicrok8s is running\nhigh-availability: no\n  datastore master nodes: 127.0.0.1:19001\n  datastore standby nodes: none\naddons:\n  enabled:\n    dns                  # (core) CoreDNS\n    ha-cluster           # (core) Configure high availability on the current node\n
"},{"location":"3.0/setup/requirements/#supported-architectures","title":"Supported Architectures","text":"

images support only architectures x86-64. The architectures supported by this image is:

Architecture Tag x86-64 amd64-latest"},{"location":"3.0/setup/requirements/#gnulinux","title":"GNU/Linux","text":"

The recommended distribution is Ubuntu 22.04.1 LTS (Jammy Jellyfish)

"},{"location":"3.0/setup/troubleshooting_core_services/","title":"Troubeshooting abcdesktop core services","text":""},{"location":"3.0/setup/troubleshooting_core_services/#troubeshooting-nginx-errors","title":"Troubeshooting nginx errors","text":""},{"location":"3.0/setup/troubleshooting_core_services/#read-pods-status","title":"Read pod's status","text":"
kubectl get pods -n abcdesktop\nNAME                           READY   STATUS             RESTARTS       AGE\nmemcached-od-78578c879-bb8qq   1/1     Running            0              164m\nmongodb-od-5b4dd4765f-ptw2j    1/1     Running            0              164m\nnginx-od-788c97cdc9-b4gbq      0/1     CrashLoopBackOff   36 (57s ago)   164m\nopenldap-od-65759b74dc-tbvfg   1/1     Running            0              164m\npyos-od-7d5d9457cf-jw6nk       1/1     Running            0              164m\nspeedtest-od-c94b56c88-48cvq   1/1     Running            0              164m\n

The pod nginx-od-788c97cdc9-b4gbq has CrashLoopBackOff status. This is wrong.

"},{"location":"3.0/setup/troubleshooting_core_services/#read-the-pods-log","title":"Read the pod's log","text":"
kubectl logs -l run=nginx-od -n abcdesktop\n
"},{"location":"3.0/setup/troubleshooting_core_services/#issue-with-an-error-in-nginx-configuration-file","title":"Issue with an error in nginx configuration file","text":"
running standart configuration file\nstarting nginx web server in foreground\nnginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\n

Nginx has failed to start. There is an error in the configuration file.

We need to fix the nginx-config ConfigMap in the yaml file.

"},{"location":"3.0/setup/troubleshooting_core_services/#start-the-pod-by-hands","title":"Start the pod by hands","text":"

If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

Update the container description to replace the default command by a sleep command

      - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:3.0\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

The container will start the command /usr/bin/sleep for 1d (one day).

A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/nginx-3.0.yaml\ndeployment.apps/nginx-od configured\n

Check that nginx pod has been updated and that the status is Running

kubectl get pods  -l run=nginx-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\nnginx-od-666df64f4-whtng   1/1     Running   0          2m30s\n

Nginx web service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the nginx web service by hands.

Run the command /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log

kubectl exec -n abcdesktop -it deployment/nginx-od -- bash\nroot@nginx-od-666df64f4-whtng:/# /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log\n

Nginx returns an explicit error, the /etc/nginx/sites-enabled/default file is wrong.

nginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\nroot@nginx-od-666df64f4-whtng:/# \n

It's time to fix the nginx-config ConfigMap in the yaml file.

"},{"location":"3.0/setup/troubleshooting_core_services/#troubeshooting-pyos-errors","title":"Troubeshooting pyos errors","text":""},{"location":"3.0/setup/troubleshooting_core_services/#read-pods-status_1","title":"Read pod's status","text":"
kubectl get pods -n abcdesktop\nNAME                            READY   STATUS             RESTARTS      AGE\nmemcached-od-5ff8844d56-sw9n5   1/1     Running            0             90m\nmongodb-od-77c945467d-c47nl     1/1     Running            0             90m\nnginx-od-666df64f4-wf99b        1/1     Running            0             22m\nopenldap-od-5bbdd75864-m6qmh    1/1     Running            0             90m\npyos-od-57946b67c4-m5zc9        0/1     CrashLoopBackOff   5 (17s ago)   3m18s\nspeedtest-od-7f5484966f-kxkw4   1/1     Running            0             90m\n

The pod pyos-od-57946b67c4-m5zc9 has CrashLoopBackOff status. This is wrong.

"},{"location":"3.0/setup/troubleshooting_core_services/#read-the-pods-log_1","title":"Read the pod's log","text":"
kubectl logs -l run=pyos-od -n abcdesktop\n
2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

It's time to fix the abcdesktop-config ConfigMap.

"},{"location":"3.0/setup/troubleshooting_core_services/#start-the-pod-by-hands_1","title":"Start the pod by hands","text":"

If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

Update the container description to replace the default command by a sleep command

      - name : pyos\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.pyos:3.0\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

The container will start the command /usr/bin/sleep for 1d (one day).

A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/pyos-3.0.yaml\ndeployment.apps/pyos-od configured\n

Check that pyos pod is Running

kubectl get pods  -l run=pyos-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\npyos-od-6cd679d6b8-css9q   1/1     Running   0          5s\n

Pyos service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the pyos service by hands.

Run the command cd /var/pyos && ./od.py

kubectl exec -n abcdesktop -it deployment/pyos-od -- bash\nroot@pyos-od-6cd679d6b8-css9q:/var/pyos# cd /var/pyos && ./od.py \n

od.py command returns the same explicit error, the od.config file is wrong.

2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

We need to fix the abcdesktop-config ConfigMap in the yaml file.

kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
"},{"location":"3.0/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

Uninstall abcdesktop for kubernetes

"},{"location":"3.0/setup/uninstall_kubernetes/#commands-to-uninstall-abcdesktop-release-30","title":"Commands to uninstall abcdesktop release 3.0","text":"

To uninstall abcdesktop. Choose run run the uninstall-3.0.sh bash script using a curl or run step by step uninstall commands manually.

"},{"location":"3.0/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

Quick uninstallation can be run on Linux or macOS operation system.

Download and extract the uninstall bash script (Linux or macOS):

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.0.sh | bash\n

You should read on stdout

starting abcdesktop uninstall commands start at 1669824908 epoch seconds\nstop and remove abcdesktop user pods\npod \"anonymous-33c30478-5cc0-4e18-b128-735694c98f3c\" deleted\nremove all services, pods\nclusterrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nclusterrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nstorageclass.storage.k8s.io \"storage-local-abcdesktop\" deleted\nconfigmap \"nginx-config\" deleted\ndeployment.apps \"memcached-od\" deleted\nsecret \"mongodb-secret\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\nremove all secrets\nsecret \"abcdesktopjwtdesktoppayload\" deleted\nsecret \"abcdesktopjwtdesktopsigning\" deleted\nsecret \"abcdesktopjwtusersigning\" deleted\nremove all configmaps\nconfigmap \"abcdesktop-config\" deleted\nconfigmap \"kube-root-ca.crt\" deleted\nremove all pvc\nNo resources found\nremove all pv\nNo resources found\nremove namespace\nnamespace \"abcdesktop\" deleted\nabcdesktop is uninstalled, in 48 seconds\n
"},{"location":"3.0/setup/uninstall_kubernetes/#run-step-by-step-uninstall-commands","title":"Run step by step uninstall commands","text":"

Run the bash commands from the uninstall-3.0.sh main content :

echo \"stop and remove abcdesktop user pods\"\nkubectl delete pods --selector=\"type=x11server\" -n abcdesktop\necho \"remove all services, pods\"\nkubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.0.yaml \necho \"remove all secrets\"\nkubectl delete secrets --all -n abcdesktop\necho \"remove all configmaps\"\nkubectl delete cm --all -n abcdesktop\necho \"remove all pvc\"\nkubectl delete pvc --all -n abcdesktop 2>/dev/null\necho \"remove namespace\"\nkubectl delete namespace abcdesktop\necho \"abcdesktop is uninstalled\"\n

The last command kubectl delete namespace can take few minutes.

Please wait for the output message:

abcdesktop is uninstalled\n

Great, you have uninstalled abcdesktop for kubernetes.

"},{"location":"3.1/config/persistentvolumes/","title":"Use PersistentVolume and PersistentVolumeClaim to retain user's home directory files","text":"

To retain user's home directory files, you can define

In most cases with managed providers, you do not need to create a Persistent Volume, just a Persistent Volume Claim. Even in a non-managed set up, the Persistent Volume is generally created by the cluster administrator while Persistent Volume Claim is used by the end-user. The Persistent Volume Claim is namespaced ressource.

Optionally, if you need a cluster administrator role, then abcdestkop can create Persistent Volume and Persistent Volume Claim.

"},{"location":"3.1/config/persistentvolumes/#define-clusterrole-only-if-you-need-to-create-persistent-volume","title":"Define ClusterRole only if you need to create Persistent Volume","text":"

Persistent Volume is a non-namespaced resource, so you need to update the pyos-role to ClusterRole to allow methods [ \"get\", \"list\", \"create\", \"patch\", \"delete\" ]

- apiGroups: [\"\"]\n  resources: [\"persistentvolumes\"]\n  verbs: [\"get\", \"list\", \"create\", \"patch\", \"delete\"] \n

Update the default pyos role to ClusterRole

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
"},{"location":"3.1/config/persistentvolumes/#define-persistent-volume-and-persistent-volume-claim","title":"Define persistent volume and persistent volume claim","text":"

To define Persistent Volume or Persistent Volume Claim, update the od.config file and set

desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: { YOUR PERSISTENT VOLUME DICT CONFIGURATION TEMPLATE - THIS CAN BE NONE }\ndesktop.persistentvolumeclaim: 'NAME OF AN EXISTING PVC' OR { YOUR PERSISTENT VOLUME CLAIM DICT CONFIGURATION TEMPLATE } \ndesktop.removepersistentvolume: False\ndesktop.removepersistentvolumeclaim: True\n
"},{"location":"3.1/config/persistentvolumes/#desktophomedirectorytype","title":"desktop.homedirectorytype","text":"

To use desktop.persistentvolume and desktop.persistentvolumeclaim values, the desktop.homedirectorytype must be set to persistentVolumeClaim

desktop.homedirectorytype: 'persistentVolumeClaim'\n
"},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolume-is-optional","title":"Define desktop.persistentvolume is optional","text":"

desktop.persistentvolume is optional and can be set to None, else the type of desktop.persistentvolume parameter must be a dict (dictionary).

If desktop.persistentvolume is None then abcdesktop does not create a persistent volume. The persistent volumes should already exist or created by another provisioning engine.

If desktop.persistentvolume is a dict then abcdesktop creates the persistent volume.

If you set desktop.persistentvolume to None, or if you create the persistent volume manualy, then you don't need to update the pyos role.

"},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim","title":"Define desktop.persistentvolumeclaim","text":"

The type of desktop.persistentvolumeclaim is dictionary or a string.

If desktop.homedirectorytype is set to 'persistentVolumeClaim', then desktop.persistentvolumeclaim must be defined as a dict or a str.

Kubernetes persistent volume is a namespaced resource, so you can keep the default rbac-role for pyos-role.

if desktop.persistentvolume option is defined then abcdesktop sets the persistent volume claim specification attribut volumeName value to the created persistent volume.

Get more information about PersistentVolume and PersistentVolumeClaim.

"},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-string","title":"Define desktop.persistentvolumeclaim as a string","text":"

All pods will share the same persistent volume claim, and the same persistent volume. The access mode must be ReadWriteMany, else only one pod (the first one) will bound the pvc.

Create a persistent volume

kubectl get pv -n abcdesktop\nNAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGE\npv-nfs   10Gi       RWX            Retain           Bound    abcdesktop/homedir         nfs-csi                 3d22h\n
kubectl describe pv pv-nfs \nName:            pv-nfs\nLabels:          <none>\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\n                 pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/homedir\nReclaim Policy:  Retain\nAccess Modes:    RWX\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      nfs-server.default.svc.cluster.local/share##\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir\nEvents:                <none>\n

Create a persistent volume claim

kubectl get pvc -n abcdesktop\nNAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE\nhomedir   Bound    pv-nfs   10Gi       RWX            nfs-csi        3d22h\n
kubectl describe pvc homedir -n abcdesktop\nName:          homedir\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        pv-nfs\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWX\nVolumeMode:    Filesystem\nUsed By:       fry-88a6e\n               hermes-7d84b\nEvents:        <none>\n

In the od.config file, set the values

desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: 'homedir'\ndesktop.removepersistentvolumeclaim: False\n

If you need to use subPath

desktop.persistentvolumeclaimforcesubpath: True\n

'subPath' is not supported for ephemeral container.

"},{"location":"3.1/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-dictionary","title":"Define desktop.persistentvolumeclaim as a dictionary","text":"

in od.config file

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}',\n    },\n    'spec': {\n      'storageClassName': 'mystorageclass',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteMany' ] } }\n

Replace mystorageclass by storageclass of your cloud provider.

To list the storage classes

kubectl get storageclass\n
NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE\ngp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false \n
NAME                          PROVISIONER                    RECLAIMPOLICY          Immediate           false                  3h22m\ndo-block-storage (default)    dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-retain       dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\ndo-block-storage-xfs          dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-xfs-retain   dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\n
"},{"location":"3.1/config/persistentvolumes/#template-values-for-desktoppersistentvolumespec-and-desktoppersistentvolumeclaim","title":"Template values for desktop.persistentvolumespec and desktop.persistentvolumeclaim","text":"

Value defines inside {{ VALUE }} is replaced by the templated value keys:

The template values can be one of them :

var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale uuid a uniqu uuid template tag value tag value set by auth rules

The uuid have the same value for the persistent volume and for the persistent volume claim. uuid can be use for naming the PVC or the PV, or on all string values.

desktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}-{{ uuid }}',\n    },\n    'spec': {\n      'volumeName': '{{ provider }}-{{ userid }}-{{ uuid }}',\n      'storageClassName': 'nfs-csi',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteOnce' ] } }\n\ndesktop.persistentvolume: {\n    'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n    'spec': {\n    'storageClassName': 'nfs-csi',\n    'mountOptions': [\n      'nfsvers=3'\n    ],\n    'capacity': {\n      'storage': '10Gi'\n    },\n    'accessModes': [ 'ReadWriteOnce' ],\n    'csi': {\n      'driver': 'nfs.csi.k8s.io',\n      'readOnly': False,\n      'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n      'volumeAttributes': {\n          'server': '192.168.7.101',\n          'share': '/volume1/homedir/{{ userid }}'\n      } } } }\n

The variables persistentvolumeclaim and persistentvolume become

desktop.persistentvolumeclaim: {\n      'metadata': {'name': 'planet-fry-1841f'}, \n      'spec': {\n        'volumeName': 'planet-fry-1841f', \n        'storageClassName': 'nfs-csi', \n        'resources': {\n          'requests': {'storage': '1Gi'}\n        }, \n        'accessModes': ['ReadWriteOnce']\n      }\n}\ndesktop.persistentvolume: {\n     'metadata': { 'name': 'planet-fry-1841f'}, \n     'spec': {\n       'storageClassName': 'nfs-csi', \n       'mountOptions': ['nfsvers=3'], \n       'capacity': {'storage': '10Gi'}, \n       'accessModes': ['ReadWriteOnce'], \n       'csi': {\n         'driver': 'nfs.csi.k8s.io', \n         'readOnly': False, \n         'volumeHandle': '192.168.7.101#volume1#homedir#fry',\n         'volumeAttributes': {\n           'server': '192.168.7.101', \n           'share': '/volume1/homedir/fry'\n         }\n       }\n      }\n}\n
"},{"location":"3.1/config/persistentvolumes/#desktopremovepersistentvolume","title":"desktop.removepersistentvolume","text":"

During the remove desktop process, delete or not the persistent volume. The persistent volume can be delete only if the desktop.deletepersistentvolumeclaim is True.

The default value for desktop.removepersistentvolume is False.

"},{"location":"3.1/config/persistentvolumes/#desktopremovepersistentvolumeclaim","title":"desktop.removepersistentvolumeclaim","text":"

During the remove desktop process, delete or not the persistent volume claim.

The default value for desktop.removepersistentvolumeclaim is False.

"},{"location":"3.1/config/persistentvolumes/#define-persistentvolume-using-csi-driver-nfs","title":"Define persistentVolume using csi-driver-nfs","text":"

In this example, we use nfs protocol to share user home directory on each worker node

Use the https://github.com/kubernetes-csi/csi-driver-nfs as a csi-driver-nfs with a nfs server as backend.

"},{"location":"3.1/config/persistentvolumes/#on-the-nfs-server","title":"On the nfs server","text":"

On the nfs server, create an export with the no_root_squash option

For example export /volume1/pods

/volume1/pods        192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
"},{"location":"3.1/config/persistentvolumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs","text":"

Run the install install-driver.sh command from kubernetes-csi/csi-driver-nfs GitHub repository.

curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n

Create a storage class file nfs-csi-sc-ds01.yaml,

Content of the default nfs-csi-sc-ds01.yaml

apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n  server: 192.168.7.101\n  share: /volume1/pods\n  mountPermissions: \"0755\"\n  # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n  # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n  # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n  - nfsvers=3\n
kubectl apply -f nfs-csi-sc-ds01.yaml\n

You read the response on stdout

storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n

Check the storage class nfs-csi-sc-ds01

kubectl get sc\nNAME                 PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE\nnfs-csi-sc-ds01      nfs.csi.k8s.io   Delete          Immediate           false                  18m\n
"},{"location":"3.1/config/persistentvolumes/#update-the-odconfig-file","title":"Update the od.config file","text":"

In your od.config file, define the entry desktop.persistentvolumeclaim

The Persistent Volume and Persistent Volume Claim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.deletepersistentvolume: False\ndesktop.deletepersistentvolumeclaim: True\ndesktop.persistentvolume: {\n            'metadata': { 'name': '{{ provider }}-{{ userid }}' },\n            'spec': {\n            'storageClassName': 'nfs-csi',\n            'mountOptions': [\n              'nfsvers=3'\n            ],\n            'capacity': {\n              'storage': '10Gi'\n            },\n            'accessModes': [ 'ReadWriteOnce' ],\n            'csi': {\n              'driver': 'nfs.csi.k8s.io',\n              'readOnly': False,\n              'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n              'volumeAttributes': {\n                  'server': '192.168.7.101',\n                  'share': '/volume1/homedir/{{ userid }}'\n              } } } }\n\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'nfs-csi',\n              'volumeName': '{{ provider }}-{{ userid }}',\n              'resources': { \n                'requests': { \n                  'storage': '1Gi'\n                } \n            },\n            'accessModes': [ 'ReadWriteMany' ] } }\n

Update the new config file and restart pyos pods. Update the pyos role to allow

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n

abcdesktop creates PV and PVC for you.

"},{"location":"3.1/config/persistentvolumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

Login as user (Philip J. Fry, fry)

The new desktop for Philip J. Fry is created.

Start the web shell command using the search bar

Using the web shell application start the df command

The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32

"},{"location":"3.1/config/persistentvolumes/#list-the-persistentvolume-and-persistentvolumeclaim","title":"List the PersistentVolume and PersistentVolumeClaim","text":"

List the new PersistentVolume

kubectl get pv \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS      REASON   AGE\nplanet-fry                                 10Gi       RWO            Retain           Bound    abcdesktop/planet-fry         nfs-csi                    2m58s\n

List the new PersistentVolumeClaim

kubectl get pvc -n abcdesktop \nNAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE\nplanet-fry         Bound    planet-fry                                 10Gi       RWO            nfs-csi        107s\n

Get the persistent volume claim's description

kubectl describe pvc planet-fry  -n abcdesktop\nName:          planet-fry\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        planet-fry\nLabels:        access_provider=planet\n               access_providertype=ldap\n               access_userid=fry\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWO\nVolumeMode:    Filesystem\nUsed By:       fry-055f6\nEvents:        <none>\n

Get the persistent volume description

kubectl describe pv planet-fry\nName:            planet-fry\nLabels:          access_provider=planet\n                 access_providertype=ldap\n                 access_userid=fry\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/planet-fry\nReclaim Policy:  Retain\nAccess Modes:    RWO\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      192.168.7.101#volume1#homedir#fry\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir/fry\nEvents:                <none>\n
"},{"location":"3.1/config/persistentvolumes/#define-persistentvolume-using-storage-class-do-block-storage-on-digitalocean","title":"Define persistentVolume using storage class do-block-storage on digitalocean","text":""},{"location":"3.1/config/persistentvolumes/#update-odconfig-file","title":"Update od.config file","text":"

Update od.config file with the options

desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'do-block-storage',\n              'resources': {\n                'requests': {\n                  'storage': '1Gi'\n                }\n            },\n            'accessModes': [ 'ReadWriteOnce' ] } }\n

Update the configmap

kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n

Restart pyos pod

kubectl delete pods -l run=pyos-od -n abcdesktop\n

Login to your abcdesktop service, you should read on the html page, the status

b.Reading your persistent volume claim planet-fry, status is Pending, using storage class do-block-storage ....\nb.Creating your desktop\nb.Successfully assigned abcdesktop/fry-0d805 to pool-g8u8ddr44-yhh3i.................\nb.Your pod gets event SuccessfulAttachVolume AttachVolume.Attach succeeded for volume \"pvc-38899590-c94a-4849-a111-31ae7de624e1\" ..\nb.Started container i-planet-fry\nb.pending: x-planet-fry is starting\nb.Created container x-planet-fry\nb.Your pod fry-0d805 is Pending..\nc.Waiting for desktop graphical service 1/42........\nc.Waiting for desktop spawner service 1/42\nc.Waiting for desktop graphical service 2/42\nRock and roll\n

Read the new pod for fry the user fry

kubectl get pods  -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nfry-0d805                       4/4     Running   0          17m\nmemcached-od-5ff8844d56-lcn7p   1/1     Running   0          106m\nmongodb-od-77c945467d-97g8w     1/1     Running   0          106m\nnginx-od-7445969696-lpfhh       1/1     Running   0          106m\nopenldap-od-5bbdd75864-dprvl    1/1     Running   0          106m\npyos-od-7584db6787-chtdc        1/1     Running   0          19m\nspeedtest-od-7f5484966f-5pl6k   1/1     Running   0          106m\n

Read the pvc for fry

kubectl get pvc  -n abcdesktop\nNAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE\nplanet-fry   Bound    pvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            do-block-storage   17m\n

Read the pv for fry

kubectl get pv                \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS       REASON   AGE\npvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            Delete           Bound    abcdesktop/planet-fry   do-block-storage            17m\n
"},{"location":"3.1/config/persistentvolumes/#known-issues","title":"known issues","text":""},{"location":"3.1/config/persistentvolumes/#bound-a-volume-if-desktopdeletepersistentvolumeclaim-is-false","title":"Bound a volume if desktop.deletepersistentvolumeclaim is False","text":"

When desktop.deletepersistentvolumeclaim is True and desktop.deletepersistentvolume is False, if you create manually the persistent volumes, you may have to patch the claimRef of the persistent volumes to make it Available again.

kubectl get pv \nNAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                   STORAGECLASS   REASON   AGE\nplanet-fry  10Gi       RWO            Retain           Released   abcdesktop/planet-fry   nfs-csi                 4m1                           \n
kubectl patch pv planet-fry -p '{\"spec\":{\"claimRef\": null}}' \npersistentvolume/planet-fry patched\n
kubectl get pv \nNAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS   REASON   AGE\nplanet-fry    10Gi       RWO            Retain           Available              nfs-csi                 8m\n
"},{"location":"3.1/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.1/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"

To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.

"},{"location":"3.1/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204","title":"Install Kubernetes on Ubuntu 22.04","text":"

These commands install the latest Kubernetes on a single node Ubuntu 22.04. km is a command tools from https://github.com/jfv-opensource/kube-tools repository.

Clone kube-tools and run km --apply as root.

git clone https://github.com/jfv-opensource/kube-tools.git\ncd kube-tools\n./km --apply\n

kube-tools installs and configures all components. kube-tools runs a simple hello-world pods to check the pods execution.

Configure repositories & install packages\n2023-10-06 12:37:52 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Installing base needed packages\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Adding docker package repository signature\nGet:1 file:/etc/apt/apt-mirrors.txt Mirrorlist [142 B]\nGet:6 https://download.docker.com/linux/ubuntu jammy InRelease [48.9 kB]\nHit:7 https://packages.microsoft.com/ubuntu/22.04/prod jammy InRelease\nHit:2 http://azure.archive.ubuntu.com/ubuntu jammy InRelease\nHit:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates InRelease\nHit:4 http://azure.archive.ubuntu.com/ubuntu jammy-backports InRelease\nHit:5 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease\nGet:8 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [22.2 kB]\nHit:9 https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu jammy InRelease\nFetched 71.0 kB in 1s (71.4 kB/s)\nReading package lists...\nRepository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable'\nDescription:\nArchive for codename: jammy components: stable\nMore info: https://download.docker.com/linux/ubuntu\nAdding repository.\nAdding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\nAdding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\n2023-10-06 12:37:59 [OK] - fv-az1111-309: Adding docker package repository\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository signature\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository\n2023-10-06 12:38:03 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Installing kubectl\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Freezing kubernetes tools version\nConfigure system\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this session\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this file /etc/fstab\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module overlay\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module br_netfilter\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module load for containerd\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Installing containerd & kubernetes tools\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Freezing kubernetes tools version\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 1#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 2#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Restarting containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Enabling containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Configuring network for kubernetes\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Applying system configuration\nConfigure kubernetes\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Starting master node\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Writting kubernetes config file to /root/.kube/config\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Loading network configuration into cluster\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Allowing pods on master because of standalone node\n2023-10-06 12:38:54 [INFO] - fv-az1111-309: Waiting for node fv-az1111-309 condition=Ready during timeout=600s\n2023-10-06 12:39:01 [OK] - fv-az1111-309: Your cluster is Ready\nError from server (NotFound): serviceaccounts \"default\" not found\n2023-10-06 12:39:01 [INFO] - fv-az1111-309:  retry 1/10 default account service account is net yet created, sleeping for 5s\n2023-10-06 12:39:07 [OK] - fv-az1111-309: default account service account is created\n2023-10-06 12:39:07 [OK] - fv-az1111-309: create pod-helloworld\n2023-10-06 12:39:12 [OK] - fv-az1111-309: pod-helloworld says hello world\n2023-10-06 12:39:17 [OK] - fv-az1111-309: delete pod-helloworld\nConfiguration archive\n2023-10-06 12:39:17 [OK] - fv-az1111-309: Generating config archive\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"

abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.

The abcdesktop infrastructure is using the contianers :

Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.0 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.0 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.1/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

You need to have a

You can run the Quick installation process or choose the Manually installation step by step

"},{"location":"3.1/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

Quick installation can be run on Linux or macOS operation system.

Download and extract the latest release automatically (Linux or macOS):

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.1.sh | bash\n

You can read on stdout

[INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nGenerating RSA private key, 1024 bit long modulus\n..........+++++\n...+++++\ne is 65537 (0x10001)\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys create\nGenerating RSA private key, 1024 bit long modulus\n...+++++\n..................................+++++\ne is 65537 (0x10001)\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nGenerating RSA private key, 1024 bit long modulus\n.....+++++\n...............................................+++++\ne is 65537 (0x10001)\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.1.yaml\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.1\n##################################################################################################################################################################################################### 100.0%\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-6dt28 Ready\n[OK] pod/memcached-od-5ff8844d56-6dt28 condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-r82kv Ready\n[OK] pod/mongodb-od-77c945467d-r82kv condition met\n[INFO] waiting for pod/nginx-od-7445969696-6z88w Ready\n[OK] pod/nginx-od-7445969696-6z88w condition met\n[INFO] waiting for pod/openldap-od-5bbdd75864-d5bpq Ready\n[OK] pod/openldap-od-5bbdd75864-d5bpq condition met\n[INFO] waiting for pod/pyos-od-7584db6787-vnp64 Ready\n[OK] pod/pyos-od-7584db6787-vnp64 condition met\n[INFO] waiting for pod/speedtest-od-7f5484966f-jsb2m Ready\n[OK] pod/speedtest-od-7f5484966f-jsb2m condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-6dt28   1/1     Running   0          40s\nmongodb-od-77c945467d-r82kv     1/1     Running   0          40s\nnginx-od-7445969696-6z88w       1/1     Running   0          40s\nopenldap-od-5bbdd75864-d5bpq    1/1     Running   0          38s\npyos-od-7584db6787-vnp64        1/1     Running   0          39s\nspeedtest-od-7f5484966f-jsb2m   1/1     Running   0          39s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

"},{"location":"3.1/setup/kubernetes_abcdesktop/#change-the-default-namespace","title":"Change the default namespace","text":"

You may need to replace the default namespace abcdesktop by your own. The install-3.1.sh bash script allow you to set the new namespace as an option.

wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.1.sh\nchmod 755 install-3.1.sh \n

Run install-3.1.sh

./install-3.1.sh --namespace superdesktop\n
[INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] use local file poduser.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-b75fb Ready\n[OK] pod/memcached-od-5ff8844d56-b75fb condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-t8cv7 Ready\n[OK] pod/mongodb-od-77c945467d-t8cv7 condition met\n[INFO] waiting for pod/nginx-od-b8c8c7b95-lkjl6 Ready\n[OK] pod/nginx-od-b8c8c7b95-lkjl6 condition met\n[INFO] waiting for pod/openldap-od-56b6564c85-2npln Ready\n[OK] pod/openldap-od-56b6564c85-2npln condition met\n[INFO] waiting for pod/pyos-od-67dfc48d84-kww9n Ready\n[OK] pod/pyos-od-67dfc48d84-kww9n condition met\n[INFO] waiting for pod/speedtest-od-894b7c886-69vc4 Ready\n[OK] pod/speedtest-od-894b7c886-69vc4 condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-b75fb   1/1     Running   0          20s\nmongodb-od-77c945467d-t8cv7     1/1     Running   0          20s\nnginx-od-b8c8c7b95-lkjl6        1/1     Running   0          20s\nopenldap-od-56b6564c85-2npln    1/1     Running   0          18s\npyos-od-67dfc48d84-kww9n        1/1     Running   0          20s\nspeedtest-od-894b7c886-69vc4    1/1     Running   0          20s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

"},{"location":"3.1/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.1/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

We will create the abcdesktop namespace and set it as default :

kubectl create namespace abcdesktop\n

You should read on the standard output

namespace/abcdesktop created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

The following commands will let you create all necessary keys :

openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

Then, create the kubernetes secrets from the new key files:

kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

You should read on the standard output :

secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

You can verify secrets creation with the following command :

kubectl get secrets -n abcdesktop\n

You should read on the standard output :

NAME                          TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"

Create a pod user to make sure that Kubernetes will find the docker images at startup time.

kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n

You should read on stdout

pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n

You can wait for user pod is Ready, this while take a while, for container images are downloading.

kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5  -n abcdesktop --timeout=-1s\n
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n

You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5. The container images are downloaded.

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.1.yaml\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"

Download the od.config file. This is the main configuration file for pyos control plane.

curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.1 --output od.config\n

Create the config map abcdesktop-config in the abcdesktop namespace

kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

You should read on sdtout

configmap/abcdesktop-config created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"

abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

Run the command line

kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.1.yaml\n

You should read on the standard output

role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

kubectl get pods -n abcdesktop\n

You should read on the standard output

NAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          18s\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          18s\nnginx-od-7445969696-mwlc9       1/1     Running   0          18s\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          18s\npyos-od-7584db6787-tjlvk        1/1     Running   0          18s\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          18s\n
"},{"location":"3.1/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

Open your navigator to http://[your-ip-hostname]:30443/

abcdesktop homepage should be available :

Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

Also, you can run again the command

kubectl get pods -n abcdesktop\n

You should see that the anonymous-XXXXX pod have been created and is Running

NAME                            READY   STATUS    RESTARTS   AGE\nanonymous-50b0f                 4/4     Running   0          5m22s\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          77m\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          77m\nnginx-od-7445969696-mwlc9       1/1     Running   0          77m\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          77m\npyos-od-7584db6787-tjlvk        1/1     Running   0          77m\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          77m\n

Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications

"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

Quick installation can be run on Linux or macOS operation system.

Download and execute the pullapps-3.1.sh script :

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.1.sh | bash\n

This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

Now reconnect to your abcdesktop.

Open your navigator to http://[your-ip-hostname]:30443/

http://localhost:30443/\n

The new applications are installed, and ready to run.

"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

Add new application, require to send an application json document to the control-plane pyos.

"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.1

curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.1/2048-alpine.d.3.1.json --output 2048.json\n

To inspect image json you can also run crictl inspecti or docker inspect command.

The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

Send the 2048.json file to the images REST endpoint

curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n

The response is the json document.

[{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GETcurl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/imagePUTcurl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.jsonPOSTcurl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.jsonDELETEcurl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

kubectl get pods -n abcdesktop\n

The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

Then the pod STATUS become Running during 42 seconds.

NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

This pod is created to ask Kubernetes for pulling the container image.

"},{"location":"3.1/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

Now reconnect to your abcdesktop.

Open your navigator to http://[your-ip-hostname]:30443/

http://localhost:30443/\n

The new applications are installed, and ready to run.

"},{"location":"3.1/setup/troubleshooting_core_services/","title":"Troubeshooting abcdesktop core services","text":""},{"location":"3.1/setup/troubleshooting_core_services/#troubeshooting-nginx-errors","title":"Troubeshooting nginx errors","text":""},{"location":"3.1/setup/troubleshooting_core_services/#read-pods-status","title":"Read pod's status","text":"
kubectl get pods -n abcdesktop\nNAME                           READY   STATUS             RESTARTS       AGE\nmemcached-od-78578c879-bb8qq   1/1     Running            0              164m\nmongodb-od-5b4dd4765f-ptw2j    1/1     Running            0              164m\nnginx-od-788c97cdc9-b4gbq      0/1     CrashLoopBackOff   36 (57s ago)   164m\nopenldap-od-65759b74dc-tbvfg   1/1     Running            0              164m\npyos-od-7d5d9457cf-jw6nk       1/1     Running            0              164m\nspeedtest-od-c94b56c88-48cvq   1/1     Running            0              164m\n

The pod nginx-od-788c97cdc9-b4gbq has CrashLoopBackOff status. This is wrong.

"},{"location":"3.1/setup/troubleshooting_core_services/#read-the-pods-log","title":"Read the pod's log","text":"
kubectl logs -l run=nginx-od -n abcdesktop\n
"},{"location":"3.1/setup/troubleshooting_core_services/#issue-with-an-error-in-nginx-configuration-file","title":"Issue with an error in nginx configuration file","text":"
running standart configuration file\nstarting nginx web server in foreground\nnginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\n

Nginx has failed to start. There is an error in the configuration file.

We need to fix the nginx-config ConfigMap in the yaml file.

"},{"location":"3.1/setup/troubleshooting_core_services/#start-the-pod-by-hands","title":"Start the pod by hands","text":"

If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

Update the container description to replace the default command by a sleep command

      - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:3.1\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

The container will start the command /usr/bin/sleep for 1d (one day).

A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/nginx-3.1.yaml\ndeployment.apps/nginx-od configured\n

Check that nginx pod is Running

kubectl get pods  -l run=nginx-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\nnginx-od-666df64f4-whtng   1/1     Running   0          2m30s\n

Nginx web service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the nginx web service by hands.

Run the command /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log

kubectl exec -n abcdesktop -it deployment/nginx-od -- bash\nroot@nginx-od-666df64f4-whtng:/# /usr/local/openresty/nginx/sbin/nginx -p /etc/nginx -c nginx.conf -e /var/log/nginx/error.log\n

Nginx returns an explicit error, the /etc/nginx/sites-enabled/default file is wrong.

nginx: [emerg] unexpected \"s\" in /etc/nginx/sites-enabled/default:10\nroot@nginx-od-666df64f4-whtng:/# \n

It's time to fix the nginx-config ConfigMap in the yaml file.

"},{"location":"3.1/setup/troubleshooting_core_services/#troubeshooting-pyos-errors","title":"Troubeshooting pyos errors","text":""},{"location":"3.1/setup/troubleshooting_core_services/#read-pods-status_1","title":"Read pod's status","text":"
kubectl get pods -n abcdesktop\nNAME                            READY   STATUS             RESTARTS      AGE\nmemcached-od-5ff8844d56-sw9n5   1/1     Running            0             90m\nmongodb-od-77c945467d-c47nl     1/1     Running            0             90m\nnginx-od-666df64f4-wf99b        1/1     Running            0             22m\nopenldap-od-5bbdd75864-m6qmh    1/1     Running            0             90m\npyos-od-57946b67c4-m5zc9        0/1     CrashLoopBackOff   5 (17s ago)   3m18s\nspeedtest-od-7f5484966f-kxkw4   1/1     Running            0             90m\n

The pod pyos-od-57946b67c4-m5zc9 has CrashLoopBackOff status. This is wrong.

"},{"location":"3.1/setup/troubleshooting_core_services/#read-the-pods-log_1","title":"Read the pod's log","text":"
kubectl logs -l run=pyos-od -n abcdesktop\n
2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

It's time to fix the abcdesktop-config ConfigMap.

"},{"location":"3.1/setup/troubleshooting_core_services/#start-the-pod-by-hands_1","title":"Start the pod by hands","text":"

If the kubectl logs command doesn't return usable information. You can update the pod default command and then start the service by hands.

Update the container description to replace the default command by a sleep command

      - name : pyos\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.pyos:3.1\n        command: [ \"/usr/bin/sleep\" ]\n        args: [\"1d\"]\n

The container will start the command /usr/bin/sleep for 1d (one day).

A default nginx debug pods is available on https://github.com/abcdesktopio/conf/tree/main/kubernetes/debug

kubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/debug/pyos-3.1.yaml\ndeployment.apps/pyos-od configured\n

Check that pyos pod is Running

kubectl get pods  -l run=pyos-od -n abcdesktop\nNAME                       READY   STATUS    RESTARTS   AGE\npyos-od-6cd679d6b8-css9q   1/1     Running   0          5s\n

Pyos service is not started inside the container, only the pod is started. We need to get a shell inside the container to start the pyos service by hands.

Run the command cd /var/pyos && ./od.py

kubectl exec -n abcdesktop -it deployment/pyos-od -- bash\nroot@pyos-od-6cd679d6b8-css9q:/var/pyos# cd /var/pyos && ./od.py \n

od.py command returns the same explicit error, the od.config file is wrong.

2023-10-15 14:53:00,136 [INFO   ] oc.logging.init_logging: Initializing logging subsystem\n2023-10-15 14:53:00,136 [INFO   ] oc.logging.load_config: Reading cherrypy configuration section 'global/logging': path = od.config\n2023-10-15 14:53:00,138 [CRITICAL] oc.logging.configure: Failed to configure logging: config_or_path = 'od.config'\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 179, in as_dict\n    value = unrepr(value)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 367, in unrepr\n    obj = b.astnode(s)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 229, in astnode\n    p = ast.parse('__tempvalue__ = ' + s)\n  File \"/usr/lib/python3.8/ast.py\", line 47, in parse\n    return compile(source, filename, mode, flags,\n  File \"<unknown>\", line 1\n    __tempvalue__ = 'abcdesktop\n                              ^\nSyntaxError: EOL while scanning string literal\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/var/pyos/oc/logging.py\", line 89, in configure\n    init_logging(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 80, in init_logging\n    cfg = config_or_path if isinstance(config_or_path, dict) else load_config(config_or_path, is_cp_file)\n  File \"/var/pyos/oc/logging.py\", line 66, in load_config\n    cfg = Config(path)['global']['logging']\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 119, in __init__\n    self.update(file)\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 130, in update\n    self._apply(Parser.load(config))\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 205, in load\n    return Parser().dict_from_file(input) if is_file else input.copy()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 194, in dict_from_file\n    return self.as_dict()\n  File \"/usr/local/lib/python3.8/dist-packages/cherrypy/lib/reprconf.py\", line 185, in as_dict\n    raise ValueError(msg, x.__class__.__name__, x.args)\nValueError: ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\nFailed to load configuration file od.config ('Config error in section: \\'global\\', option: \\'namespace\\', value: \"\\'abcdesktop\". Config values must be valid Python.', 'SyntaxError', ('EOL while scanning string literal', ('<unknown>', 1, 28, \"__tempvalue__ = 'abcdesktop\\n\")))\n

We need to fix the abcdesktop-config ConfigMap in the yaml file.

kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
"},{"location":"3.1/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

Uninstall abcdesktop for kubernetes

"},{"location":"3.1/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-31","title":"Command to uninstall abcdesktop release 3.1","text":"

To uninstall abcdesktop. Choose run run the uninstall-3.A.sh bash script using a curl.

"},{"location":"3.1/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

Quick uninstallation can be run on Linux or macOS operation system.

Download and extract the uninstall bash script (Linux or macOS):

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.1.sh | bash\n

You should read on stdout

abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n

Please wait for the output message:

[OK] namespace \"abcdesktop\" deleted\n

Great, you have uninstalled abcdesktop for kubernetes.

"},{"location":"3.1/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"
wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.1.sh\nchmod 755 uninstall-3.1.sh\n

Run the uninstall-3.1.sh command line with your own namespace

./uninstall-3.1.sh --namespace superdesktop\n

You should read on stdout

abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n

Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.

"},{"location":"3.2/config/persistentvolumes/","title":"Use PersistentVolume and PersistentVolumeClaim to retain user's home directory files","text":"

To retain user's home directory files, you can define

In most cases with managed providers, you do not need to create a Persistent Volume, just a Persistent Volume Claim. Even in a non-managed set up, the Persistent Volume is generally created by the cluster administrator while Persistent Volume Claim is used by the end-user. The Persistent Volume Claim is namespaced ressource.

Optionally, if you need a cluster administrator role, then abcdestkop can create Persistent Volume and Persistent Volume Claim.

"},{"location":"3.2/config/persistentvolumes/#define-clusterrole-only-if-you-need-to-create-persistent-volume","title":"Define ClusterRole only if you need to create Persistent Volume","text":"

Persistent Volume is a non-namespaced resource, so you need to update the pyos-role to ClusterRole to allow methods [ \"get\", \"list\", \"create\", \"patch\", \"delete\" ]

- apiGroups: [\"\"]\n  resources: [\"persistentvolumes\"]\n  verbs: [\"get\", \"list\", \"create\", \"patch\", \"delete\"] \n

Update the default pyos role to ClusterRole

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
"},{"location":"3.2/config/persistentvolumes/#define-persistent-volume-and-persistent-volume-claim","title":"Define persistent volume and persistent volume claim","text":"

To define Persistent Volume or Persistent Volume Claim, update the od.config file and set

desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: { YOUR PERSISTENT VOLUME DICT CONFIGURATION TEMPLATE - THIS CAN BE NONE }\ndesktop.persistentvolumeclaim: 'NAME OF AN EXISTING PVC' OR { YOUR PERSISTENT VOLUME CLAIM DICT CONFIGURATION TEMPLATE } \ndesktop.removepersistentvolume: False\ndesktop.removepersistentvolumeclaim: True\n
"},{"location":"3.2/config/persistentvolumes/#desktophomedirectorytype","title":"desktop.homedirectorytype","text":"

To use desktop.persistentvolume and desktop.persistentvolumeclaim values, the desktop.homedirectorytype must be set to persistentVolumeClaim

desktop.homedirectorytype: 'persistentVolumeClaim'\n
"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolume-is-optional","title":"Define desktop.persistentvolume is optional","text":"

desktop.persistentvolume is optional, the default value is None. desktop.persistentvolume can be None, or a string or a dict.

If desktop.persistentvolume is None then abcdesktop does not create a persistent volume. The persistent volumes should already exist or created by another provisioning engine.

If desktop.persistentvolume is a string, it must match the name of a persistentvolume. abcdesktop does not create the persistent volume. The persistent volumes should already exist.

If desktop.persistentvolume is a dict then abcdesktop creates the persistent volume. The dict values of persistent volume support template values.

For example :

desktop.persistentvolume: {\n    'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n    'spec': {\n    'storageClassName': 'nfs-csi',\n    'mountOptions': [\n      'nfsvers=3'\n    ],\n    'capacity': {\n      'storage': '10Gi'\n    },\n    'accessModes': [ 'ReadWriteOnce' ],\n    'csi': {\n      'driver': 'nfs.csi.k8s.io',\n      'readOnly': False,\n      'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n      'volumeAttributes': {\n          'server': '192.168.7.101',\n          'share': '/volume1/homedir/{{ userid }}'\n      } } } }\n

If you set desktop.persistentvolume to None, or if you create the persistent volume manualy, then you don't need to update the pyos role.

"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim","title":"Define desktop.persistentvolumeclaim","text":"

desktop.persistentvolumeclaim is optional, the default value is None. The type of desktop.persistentvolumeclaim can be None, or a string or a dict.

If desktop.homedirectorytype is set to 'persistentVolumeClaim', then desktop.persistentvolumeclaim must be defined as a dict or a string.

Kubernetes persistent volume is a namespaced resource, so you can keep the default rbac-role for pyos-role.

if desktop.persistentvolume option is defined then abcdesktop sets the persistent volume claim specification attribut volumeName value to the created persistent volume.

Get more information about PersistentVolume and PersistentVolumeClaim.

"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-string","title":"Define desktop.persistentvolumeclaim as a string","text":"

All pods will share the same persistent volume claim, and the same persistent volume. The access mode must be ReadWriteMany, else only one pod (the first one) will bound the pvc.

Create a persistent volume

kubectl get pv -n abcdesktop\nNAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGE\npv-nfs   10Gi       RWX            Retain           Bound    abcdesktop/homedir         nfs-csi                 3d22h\n
kubectl describe pv pv-nfs \nName:            pv-nfs\nLabels:          <none>\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\n                 pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/homedir\nReclaim Policy:  Retain\nAccess Modes:    RWX\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      nfs-server.default.svc.cluster.local/share##\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir\nEvents:                <none>\n

Create a persistent volume claim

kubectl get pvc -n abcdesktop\nNAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE\nhomedir   Bound    pv-nfs   10Gi       RWX            nfs-csi        3d22h\n
kubectl describe pvc homedir -n abcdesktop\nName:          homedir\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        pv-nfs\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWX\nVolumeMode:    Filesystem\nUsed By:       fry-88a6e\n               hermes-7d84b\nEvents:        <none>\n

In the od.config file, set the values

desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: 'homedir'\ndesktop.removepersistentvolumeclaim: False\n

If you need to use subPath

desktop.persistentvolumeclaimforcesubpath: True\n

'subPath' is not supported for ephemeral container.

"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaim-as-a-dictionary","title":"Define desktop.persistentvolumeclaim as a dictionary","text":"

in od.config file

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolumespec: None\ndesktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}',\n    },\n    'spec': {\n      'storageClassName': 'mystorageclass',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteMany' ] } }\n

Replace mystorageclass by storageclass of your cloud provider.

To list the storage classes

kubectl get storageclass\n
NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE\ngp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false \n
NAME                          PROVISIONER                    RECLAIMPOLICY          Immediate           false                  3h22m\ndo-block-storage (default)    dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-retain       dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\ndo-block-storage-xfs          dobs.csi.digitalocean.com      Delete          Immediate           true                   2d7h\ndo-block-storage-xfs-retain   dobs.csi.digitalocean.com      Retain          Immediate           true                   2d7h\n
"},{"location":"3.2/config/persistentvolumes/#template-values-for-desktoppersistentvolumespec-and-desktoppersistentvolumeclaim","title":"Template values for desktop.persistentvolumespec and desktop.persistentvolumeclaim","text":"

Value defines inside {{ VALUE }} is replaced by the templated value keys:

The template values can be one of them :

var description cn Common Name uid user id gid group id uidNumber user id number gidNumber group id number homeDirectory homeDirectory loginShell loginShell description description groups groups gecos gecos provider provider protocol protocol providertype providertype name user name userid user id locale user's locale uuid a uniqu uuid template tag value tag value set by auth rules

The uuid have the same value for the persistent volume and for the persistent volume claim. uuid can be use for naming the PVC or the PV, or on all string values.

desktop.persistentvolumeclaim: {\n    'metadata': {\n        'name': '{{ provider }}-{{ userid }}-{{ uuid }}',\n    },\n    'spec': {\n      'volumeName': '{{ provider }}-{{ userid }}-{{ uuid }}',\n      'storageClassName': 'nfs-csi',\n      'resources': { \n        'requests': { \n          'storage': '1Gi'\n        } \n    },\n    'accessModes': [ 'ReadWriteOnce' ] } }\n\ndesktop.persistentvolume: {\n    'metadata': { 'name': '{{ provider }}-{{ userid }}-{{ uuid }}' },\n    'spec': {\n    'storageClassName': 'nfs-csi',\n    'mountOptions': [\n      'nfsvers=3'\n    ],\n    'capacity': {\n      'storage': '10Gi'\n    },\n    'accessModes': [ 'ReadWriteOnce' ],\n    'csi': {\n      'driver': 'nfs.csi.k8s.io',\n      'readOnly': False,\n      'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n      'volumeAttributes': {\n          'server': '192.168.7.101',\n          'share': '/volume1/homedir/{{ userid }}'\n      } } } }\n

The variables persistentvolumeclaim and persistentvolume become

desktop.persistentvolumeclaim: {\n      'metadata': {'name': 'planet-fry-1841f'}, \n      'spec': {\n        'volumeName': 'planet-fry-1841f', \n        'storageClassName': 'nfs-csi', \n        'resources': {\n          'requests': {'storage': '1Gi'}\n        }, \n        'accessModes': ['ReadWriteOnce']\n      }\n}\ndesktop.persistentvolume: {\n     'metadata': { 'name': 'planet-fry-1841f'}, \n     'spec': {\n       'storageClassName': 'nfs-csi', \n       'mountOptions': ['nfsvers=3'], \n       'capacity': {'storage': '10Gi'}, \n       'accessModes': ['ReadWriteOnce'], \n       'csi': {\n         'driver': 'nfs.csi.k8s.io', \n         'readOnly': False, \n         'volumeHandle': '192.168.7.101#volume1#homedir#fry',\n         'volumeAttributes': {\n           'server': '192.168.7.101', \n           'share': '/volume1/homedir/fry'\n         }\n       }\n      }\n}\n
"},{"location":"3.2/config/persistentvolumes/#desktopremovepersistentvolume","title":"desktop.removepersistentvolume","text":"

During the remove desktop process, delete or not the persistent volume. The persistent volume can be delete only if the desktop.deletepersistentvolumeclaim is True.

The default value for desktop.removepersistentvolume is False.

"},{"location":"3.2/config/persistentvolumes/#desktopremovepersistentvolumeclaim","title":"desktop.removepersistentvolumeclaim","text":"

During the remove desktop process, delete or not the persistent volume claim.

The default value for desktop.removepersistentvolumeclaim is False.

"},{"location":"3.2/config/persistentvolumes/#define-persistentvolume-using-csi-driver-nfs","title":"Define persistentVolume using csi-driver-nfs","text":"

In this example, we use nfs protocol to share user home directory on each worker node

Use the https://github.com/kubernetes-csi/csi-driver-nfs as a csi-driver-nfs with a nfs server as backend.

"},{"location":"3.2/config/persistentvolumes/#on-the-nfs-server","title":"On the nfs server","text":"

On the nfs server, create an export with the no_root_squash option

For example export /volume1/pods

/volume1/pods        192.168.7.0/24(rw,async,no_wdelay,crossmnt,insecure,no_root_squash,insecure_locks,anonuid=1025,anongid=100)\n
"},{"location":"3.2/config/persistentvolumes/#install-the-csi-driver-nfs","title":"Install the csi-driver-nfs","text":"

Run the install install-driver.sh command from kubernetes-csi/csi-driver-nfs GitHub repository.

curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --\n

Create a storage class file nfs-csi-sc-ds01.yaml,

Content of the default nfs-csi-sc-ds01.yaml

apiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: nfs-csi-sc-ds01\nprovisioner: nfs.csi.k8s.io\nparameters:\n  server: 192.168.7.101\n  share: /volume1/pods\n  mountPermissions: \"0755\"\n  # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume\n  # csi.storage.k8s.io/provisioner-secret-name: \"mount-options\"\n  # csi.storage.k8s.io/provisioner-secret-namespace: \"default\"\nreclaimPolicy: Delete\nvolumeBindingMode: Immediate\nmountOptions:\n  - nfsvers=3\n
kubectl apply -f nfs-csi-sc-ds01.yaml\n

You read the response on stdout

storageclass.storage.k8s.io/nfs-csi-sc-ds01 created\n

Check the storage class nfs-csi-sc-ds01

kubectl get sc\nNAME                 PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE\nnfs-csi-sc-ds01      nfs.csi.k8s.io   Delete          Immediate           false                  18m\n
"},{"location":"3.2/config/persistentvolumes/#update-the-odconfig-file","title":"Update the od.config file","text":"

In your od.config file, define the entry desktop.persistentvolumeclaim

The Persistent Volume and Persistent Volume Claim are created by abcdesktop. Abcdesktop defines a binding between that specific PV and PVC

# set to persistentVolumeClaim\ndesktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.deletepersistentvolume: False\ndesktop.deletepersistentvolumeclaim: True\ndesktop.persistentvolume: {\n            'metadata': { 'name': '{{ provider }}-{{ userid }}' },\n            'spec': {\n            'storageClassName': 'nfs-csi',\n            'mountOptions': [\n              'nfsvers=3'\n            ],\n            'capacity': {\n              'storage': '10Gi'\n            },\n            'accessModes': [ 'ReadWriteOnce' ],\n            'csi': {\n              'driver': 'nfs.csi.k8s.io',\n              'readOnly': False,\n              'volumeHandle': '192.168.7.101#volume1#homedir#{{ userid }}',\n              'volumeAttributes': {\n                  'server': '192.168.7.101',\n                  'share': '/volume1/homedir/{{ userid }}'\n              } } } }\n\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'nfs-csi',\n              'volumeName': '{{ provider }}-{{ userid }}',\n              'resources': { \n                'requests': { \n                  'storage': '1Gi'\n                } \n            },\n            'accessModes': [ 'ReadWriteMany' ] } }\n

Update the new config file and restart pyos pods. Update the pyos role to allow

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-role.yaml\nkubectl apply -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/rbac-cluster.yaml\n
kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\nkubectl delete pods -l run=pyos-od -n abcdesktop\n

abcdesktop creates PV and PVC for you.

"},{"location":"3.2/config/persistentvolumes/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

Login as user (Philip J. Fry, fry)

The new desktop for Philip J. Fry is created.

Start the web shell command using the search bar

Using the web shell application start the df command

The fry home dir is mounted on 192.168.7.101:/volume1/pods/pvc-b8317d7b-dc35-4fc3-88e9-ad894ab11d32

"},{"location":"3.2/config/persistentvolumes/#list-the-persistentvolume-and-persistentvolumeclaim","title":"List the PersistentVolume and PersistentVolumeClaim","text":"

List the new PersistentVolume

kubectl get pv \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS      REASON   AGE\nplanet-fry                                 10Gi       RWO            Retain           Bound    abcdesktop/planet-fry         nfs-csi                    2m58s\n

List the new PersistentVolumeClaim

kubectl get pvc -n abcdesktop \nNAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE\nplanet-fry         Bound    planet-fry                                 10Gi       RWO            nfs-csi        107s\n

Get the persistent volume claim's description

kubectl describe pvc planet-fry  -n abcdesktop\nName:          planet-fry\nNamespace:     abcdesktop\nStorageClass:  nfs-csi\nStatus:        Bound\nVolume:        planet-fry\nLabels:        access_provider=planet\n               access_providertype=ldap\n               access_userid=fry\nAnnotations:   pv.kubernetes.io/bind-completed: yes\nFinalizers:    [kubernetes.io/pvc-protection]\nCapacity:      10Gi\nAccess Modes:  RWO\nVolumeMode:    Filesystem\nUsed By:       fry-055f6\nEvents:        <none>\n

Get the persistent volume description

kubectl describe pv planet-fry\nName:            planet-fry\nLabels:          access_provider=planet\n                 access_providertype=ldap\n                 access_userid=fry\nAnnotations:     pv.kubernetes.io/bound-by-controller: yes\nFinalizers:      [kubernetes.io/pv-protection]\nStorageClass:    nfs-csi\nStatus:          Bound\nClaim:           abcdesktop/planet-fry\nReclaim Policy:  Retain\nAccess Modes:    RWO\nVolumeMode:      Filesystem\nCapacity:        10Gi\nNode Affinity:   <none>\nMessage:         \nSource:\n    Type:              CSI (a Container Storage Interface (CSI) volume source)\n    Driver:            nfs.csi.k8s.io\n    FSType:            \n    VolumeHandle:      192.168.7.101#volume1#homedir#fry\n    ReadOnly:          false\n    VolumeAttributes:      server=192.168.7.101\n                           share=/volume1/homedir/fry\nEvents:                <none>\n
"},{"location":"3.2/config/persistentvolumes/#define-persistentvolume-using-storage-class-do-block-storage-on-digitalocean","title":"Define persistentVolume using storage class do-block-storage on digitalocean","text":""},{"location":"3.2/config/persistentvolumes/#update-odconfig-file","title":"Update od.config file","text":"

Update od.config file with the options

desktop.homedirectorytype: 'persistentVolumeClaim'\ndesktop.persistentvolume: None\ndesktop.persistentvolumeclaim: {\n            'metadata': {\n                'name': '{{ provider }}-{{ userid }}',\n            },\n            'spec': {\n              'storageClassName': 'do-block-storage',\n              'resources': {\n                'requests': {\n                  'storage': '1Gi'\n                }\n            },\n            'accessModes': [ 'ReadWriteOnce' ] } }\n

Update the configmap

kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n

Restart pyos pod

kubectl delete pods -l run=pyos-od -n abcdesktop\n

Login to your abcdesktop service, you should read on the html page, the status

b.Reading your persistent volume claim planet-fry, status is Pending, using storage class do-block-storage ....\nb.Creating your desktop\nb.Successfully assigned abcdesktop/fry-0d805 to pool-g8u8ddr44-yhh3i.................\nb.Your pod gets event SuccessfulAttachVolume AttachVolume.Attach succeeded for volume \"pvc-38899590-c94a-4849-a111-31ae7de624e1\" ..\nb.Started container i-planet-fry\nb.pending: x-planet-fry is starting\nb.Created container x-planet-fry\nb.Your pod fry-0d805 is Pending..\nc.Waiting for desktop graphical service 1/42........\nc.Waiting for desktop spawner service 1/42\nc.Waiting for desktop graphical service 2/42\nRock and roll\n

Read the new pod for fry the user fry

kubectl get pods  -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nfry-0d805                       4/4     Running   0          17m\nmemcached-od-5ff8844d56-lcn7p   1/1     Running   0          106m\nmongodb-od-77c945467d-97g8w     1/1     Running   0          106m\nnginx-od-7445969696-lpfhh       1/1     Running   0          106m\nopenldap-od-5bbdd75864-dprvl    1/1     Running   0          106m\npyos-od-7584db6787-chtdc        1/1     Running   0          19m\nspeedtest-od-7f5484966f-5pl6k   1/1     Running   0          106m\n

Read the pvc for fry

kubectl get pvc  -n abcdesktop\nNAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE\nplanet-fry   Bound    pvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            do-block-storage   17m\n

Read the pv for fry

kubectl get pv                \nNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS       REASON   AGE\npvc-38899590-c94a-4849-a111-31ae7de624e1   1Gi        RWO            Delete           Bound    abcdesktop/planet-fry   do-block-storage            17m\n
"},{"location":"3.2/config/persistentvolumes/#define-desktoppersistentvolumeclaimforcesubpath","title":"Define desktop.persistentvolumeclaimforcesubpath","text":"

desktop.persistentvolumeclaimforcesubpath is a boolean. The default value of desktop.persistentvolumeclaimforcesubpath is False

If desktop.persistentvolumeclaimforcesubpath is set to True then persistentvolumeclaim is mounted with the subPath option.

Subpath mounts are not allowed for ephemeral containers. Subpath cannot be updated. So you can run only pod applications, if you set desktop.persistentvolumeclaimforcesubpath to True.

If you try to start an ephemeral container application, you get an error code 422 and the message

{ \n    \"reason\":\"FieldValueForbidden\",\n    \"message\":\"Forbidden: can not be set for an Ephemeral Container\",\n    \"field\":\"spec.ephemeralContainers[8].volumeMounts[0].subPath\"\n}\n
"},{"location":"3.2/config/persistentvolumes/#use-case-for-the-desktoppersistentvolumeclaimforcesubpath-option","title":"Use case for the desktop.persistentvolumeclaimforcesubpath option","text":"

In this case :

We create the unique PersistentVolume named pv-nfs.

---\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  annotations:\n    pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io\n  name: pv-nfs\nspec:\n  capacity:\n    storage: 10Gi\n  accessModes:\n    - ReadWriteMany\n  persistentVolumeReclaimPolicy: Retain\n  storageClassName: nfs-csi\n  mountOptions:\n    - nfsvers=3\n  csi:\n    driver: nfs.csi.k8s.io\n    readOnly: false\n    # volumeHandle format: {nfs-server-address}#{sub-dir-name}#{share-name}\n    # make sure this value is unique for every share in the cluster\n    volumeHandle: nfs-server.default.svc.cluster.local/share##\n    volumeAttributes:\n      server: 192.168.7.101\n      share: /volume1/home\n---\n

accessModes is ReadWriteMany for the PersistentVolume

We create the unique PersistentVolumeClaim named pvc-nfs-homedir

---\nkind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n  name: pvc-nfs-homedir\n  namespace: abcdesktop\nspec:\n  accessModes:\n    - ReadWriteMany\n  resources:\n    requests:\n      storage: 10Gi\n  volumeName: pv-nfs\n  storageClassName: nfs-csi\n---\n

accessModes is ReadWriteMany for the PersistentVolumeClaim

We define in od.config file

desktop.persistentvolume: 'pvc-nfs'\ndesktop.persistentvolumeclaim: 'pvc-nfs-homedir'\ndesktop.persistentvolumeclaimforcesubpath : True\n

All pods share the same PersistentVolumeClaim named pvc-nfs-homedir, the desktop.persistentvolumeclaimforcesubpath is set to True, the subPath value is set with the default of the current LDAP userid. So the user's home directory is /volume1/home/{{ userid }}. The nfs server allows user to access subfolders, the mount operation is permitted.

"},{"location":"3.2/config/persistentvolumes/#known-issues","title":"known issues","text":""},{"location":"3.2/config/persistentvolumes/#bound-a-volume-if-desktopdeletepersistentvolumeclaim-is-false","title":"Bound a volume if desktop.deletepersistentvolumeclaim is False","text":"

When desktop.deletepersistentvolumeclaim is True and desktop.deletepersistentvolume is False, if you create manually the persistent volumes, you may have to patch the claimRef of the persistent volumes to make it Available again.

kubectl get pv \nNAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                   STORAGECLASS   REASON   AGE\nplanet-fry  10Gi       RWO            Retain           Released   abcdesktop/planet-fry   nfs-csi                 4m1                           \n
kubectl patch pv planet-fry -p '{\"spec\":{\"claimRef\": null}}' \npersistentvolume/planet-fry patched\n
kubectl get pv \nNAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS   REASON   AGE\nplanet-fry    10Gi       RWO            Retain           Available              nfs-csi                 8m\n
"},{"location":"3.2/config/webrtc/","title":"Configure abcdesktop to use WebRTC","text":"

Play sound from a container to web browser using WebRTC

"},{"location":"3.2/config/webrtc/#webrtc-overview","title":"WebRTC overview","text":""},{"location":"3.2/config/webrtc/#requirements","title":"Requirements","text":""},{"location":"3.2/config/webrtc/#webrtc-design","title":"WebRTC design","text":"

abcdesktop/pulseaudio:3.2 container executes the following services

"},{"location":"3.2/config/webrtc/#stun-server","title":"STUN server","text":"

STUN servers are used by both client and abcdesktop WebRTC to determine their IP address as visible by the global Internet.

The STUN server can to hosted on a dedicated droplets and on an external network. For a public Internet usage, the Google-hosted STUN servers is a good

{ 'urls': 'stun:stun.l.google.com:19302' }\n
"},{"location":"3.2/config/webrtc/#turn-server","title":"TURN server","text":"

The TURN server can to hosted on a dedicated droplets and on an external network. To reduce latency you should host your TURN server near your kubernetes network.

You can run coturn service on dedicated machines or virtual machines, to avoid any scenario where the port range is being restricted or set arbitrarily by the infrastructure or orchestration tools.

"},{"location":"3.2/config/webrtc/#coturn-server","title":"COTURN server","text":"

coturn is a free open source implementation of TURN and STUN Server. The TURN Server is a VoIP media traffic NAT traversal server and gateway.

apt-get install coturn \n

You need a X509 certificates to use TURN over TLS. Let's Encrypt provides X.509 certificates for Transport Layer Security (TLS) encryption at no charge.

Default minimal configuration file /etc/turnserver.conf for abcdesktop.

listening-port=3478\ntls-listening-port=5349\nlt-cred-mech\nuse-auth-secret\nstatic-auth-secret=CHANGEME\nserver-name=turn.domain.local\nrealm=turn.domain.local\ncert=/usr/local/etc/turn.domain.local.pem\npkey=/usr/local/etc/turn.domain.local.pem\n

Update the following configuration file with you own values

Then start your turn service.

"},{"location":"3.2/config/webrtc/#update-configmap-odconfig-file","title":"Update configmap od.config file","text":"

Add new webrtc's entries

webrtc.enable:True\nwebrtc.rtc_configuration:{ 'iceServers':[ {'urls':'stun:stun.l.google.com:19302'} ] }\nwebrtc.coturn: { \n  'coturn_static_auth_secret': 'CHANGEME', \n  'ttl':3600,\n  'protocol': 'turns',\n  'url': 'turn.domain.local:3478' }\n

pyos merges a new rtc_configuration json document from the webrtc.coturn and from webrtc.coturn values.

pyos adds username and credential entries. For example, a new rtc_configuration json document is send to the web browser

{\n  \"iceServers\": [\n    { \"urls\": \"stun:stun.l.google.com:19302\" },\n    { \"urls\": \"turns:nturns.domain.local:3478\",\n      \"username\": \"1703086872\",\n      \"credential\": \"+BuFkb0hFf8pAoFwpp0A0UbO+1k=\" } \n  ]\n}\n

STUN_SERVER value is used by the gstreamer webrtcbin

desktop.envlocal :  { \n  'STUN_SERVER': 'stun://stun.l.google.com:19302',\n}\n

Update the value 'enable': False to 'enable': True

desktop.pod : \n\n    ...[CUT HERE ]...\n\n'sound': { \n    'image': 'abcdesktopio/oc.pulseaudio:3.2',\n    'pullpolicy': 'IfNotPresent',\n    'enable': True,\n    'tcpport': 4714,\n    'acl':  { 'permit': [ 'all' ] },\n    'resources': { \n        'requests': { 'memory': \"8Mi\", 'cpu': \"50m\"  },  \n        'limits'  : { 'memory': \"2Gi\", 'cpu': \"2000m\" } \n    } },\n\n    ...[CUT HERE ]...\n\n
kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\n
kubectl delete pods -l run=pyos-od -n abcdesktop\n
"},{"location":"3.2/config/webrtc/#connect-to-your-desktop","title":"connect to your desktop","text":"

Open your web browser, and go to your abcdesktop web site.

Make sure to use secured https protocol, else WebRTC is disabled.

"},{"location":"3.2/config/webrtc/#step-1-login-using-credentials","title":"Step 1, login using credentials","text":"

Login using credentials, for example

The sound is not yet available

"},{"location":"3.2/config/webrtc/#step-2-sound-becomes-available","title":"Step 2, sound becomes available","text":"

Few seconds later, sound becomes available.

The sound is available. The web browser has an access to local sound devices. The web browser has an access to local speaker. The web browser can get an access to local microphone only if the user allows the access.

"},{"location":"3.2/config/webrtc/#play-sound-with-paplay","title":"Play sound with paplay","text":"

Open a Terminal Web Shell application and run the command inside the web shell

paplay /usr/share/sounds/alsa/Rear_Center.wav \n

You should heard Rear Center on your local sound device

"},{"location":"3.2/config/webrtc/#test-microphone-access","title":"Test microphone access","text":"

Open a Terminal Web Shell application and run the command inside the web shell

pavumeter --record\n

You should see cursor changes if you talk to your abcdesktop

"},{"location":"3.2/config/webrtc/#step-3-look-at-the-web-browsers-console-log","title":"Step 3, look at the web browser's console log","text":"

Open the web browser's console log to read the WebRTC messages

Read the json rtc_configuration document created by pyos pod

Read the step Created peer connection for call and creating SDP and step Exchange from foundation for 1 to 6

Read the step Exchange from foundation from 6 to 9

Read the step Local stream answer

The last line is ICE Candidate was null, done

The sound is now enabled

"},{"location":"3.2/setup/k8slinuxinstallation/","title":"Linux Requirements","text":""},{"location":"3.2/setup/k8slinuxinstallation/#packages-installation","title":"Packages installation","text":"

To install Kubernetes on your GNU/Linux, you can read the Kubernetes setup guide on the kubernetes.io web site.

"},{"location":"3.2/setup/k8slinuxinstallation/#install-kubernetes-on-ubuntu-2204","title":"Install Kubernetes on Ubuntu 22.04","text":"

These commands install the latest Kubernetes on a single node Ubuntu 22.04. km is a command tools from https://github.com/jfv-opensource/kube-tools repository.

Clone kube-tools and run km --apply as root.

git clone https://github.com/jfv-opensource/kube-tools.git\ncd kube-tools\n./km --apply\n

kube-tools installs and configures all components. kube-tools runs a simple hello-world pods to check the pods execution.

Configure repositories & install packages\n2023-10-06 12:37:52 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Installing base needed packages\n2023-10-06 12:37:53 [OK] - fv-az1111-309: Adding docker package repository signature\nGet:1 file:/etc/apt/apt-mirrors.txt Mirrorlist [142 B]\nGet:6 https://download.docker.com/linux/ubuntu jammy InRelease [48.9 kB]\nHit:7 https://packages.microsoft.com/ubuntu/22.04/prod jammy InRelease\nHit:2 http://azure.archive.ubuntu.com/ubuntu jammy InRelease\nHit:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates InRelease\nHit:4 http://azure.archive.ubuntu.com/ubuntu jammy-backports InRelease\nHit:5 http://azure.archive.ubuntu.com/ubuntu jammy-security InRelease\nGet:8 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [22.2 kB]\nHit:9 https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu jammy InRelease\nFetched 71.0 kB in 1s (71.4 kB/s)\nReading package lists...\nRepository: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable'\nDescription:\nArchive for codename: jammy components: stable\nMore info: https://download.docker.com/linux/ubuntu\nAdding repository.\nAdding deb entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\nAdding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list\n2023-10-06 12:37:59 [OK] - fv-az1111-309: Adding docker package repository\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository signature\n2023-10-06 12:38:00 [OK] - fv-az1111-309: Adding google package repository\n2023-10-06 12:38:03 [OK] - fv-az1111-309: Updating package repository\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Installing kubectl\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Freezing kubernetes tools version\nConfigure system\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this session\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Disabling swap in this file /etc/fstab\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module overlay\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module br_netfilter\n2023-10-06 12:38:09 [OK] - fv-az1111-309: Enabling module load for containerd\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Installing containerd & kubernetes tools\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Freezing kubernetes tools version\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 1#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Configuring containerd 2#2\n2023-10-06 12:38:24 [OK] - fv-az1111-309: Restarting containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Enabling containerd\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Configuring network for kubernetes\n2023-10-06 12:38:25 [OK] - fv-az1111-309: Applying system configuration\nConfigure kubernetes\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Starting master node\n2023-10-06 12:38:51 [OK] - fv-az1111-309: Writting kubernetes config file to /root/.kube/config\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Loading network configuration into cluster\n2023-10-06 12:38:54 [OK] - fv-az1111-309: Allowing pods on master because of standalone node\n2023-10-06 12:38:54 [INFO] - fv-az1111-309: Waiting for node fv-az1111-309 condition=Ready during timeout=600s\n2023-10-06 12:39:01 [OK] - fv-az1111-309: Your cluster is Ready\nError from server (NotFound): serviceaccounts \"default\" not found\n2023-10-06 12:39:01 [INFO] - fv-az1111-309:  retry 1/10 default account service account is net yet created, sleeping for 5s\n2023-10-06 12:39:07 [OK] - fv-az1111-309: default account service account is created\n2023-10-06 12:39:07 [OK] - fv-az1111-309: create pod-helloworld\n2023-10-06 12:39:12 [OK] - fv-az1111-309: pod-helloworld says hello world\n2023-10-06 12:39:17 [OK] - fv-az1111-309: delete pod-helloworld\nConfiguration archive\n2023-10-06 12:39:17 [OK] - fv-az1111-309: Generating config archive\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/","title":"abcdesktop in kubernetes mode","text":"

abcdesktop release 3.x support only kubernetes mode. All applications containers can be distributed on different hosts.

The abcdesktop infrastructure is using the contianers :

Container Role Image From oc.pyos API Server abcdesktopio/oc.pyos:3.2 abcdesktopio oc.nginx web server proxy abcdesktopio/oc.nginx:3.2 abcdesktopio oc.speedtest http benchmarch abcdesktopio/oc.speedtest LibreSpeed oc.mongo json database server mongo MongoDB memcached cache server memcached Memcached"},{"location":"3.2/setup/kubernetes_abcdesktop/#requirements","title":"Requirements","text":"

You need to have a

You can run the Quick installation process or choose the Manually installation step by step

Linux operating system is recommanded to run abcdesktop.io.

"},{"location":"3.2/setup/kubernetes_abcdesktop/#quick-installation-microsoft-windows","title":"Quick installation (Microsoft Windows)","text":"

If you are using a Microsoft Windows operating system please follow the dedicated link below Quick install for windows

"},{"location":"3.2/setup/kubernetes_abcdesktop/#quick-installation-linux-or-macos","title":"Quick installation (Linux or macOS)","text":"

Quick installation can be run on Linux or macOS operation system.

Download and extract the latest release automatically (Linux or macOS):

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh | bash\n

You can read on stdout

[INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys create\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-6dt28 Ready\n[OK] pod/memcached-od-5ff8844d56-6dt28 condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-r82kv Ready\n[OK] pod/mongodb-od-77c945467d-r82kv condition met\n[INFO] waiting for pod/nginx-od-7445969696-6z88w Ready\n[OK] pod/nginx-od-7445969696-6z88w condition met\n[INFO] waiting for pod/openldap-od-5bbdd75864-d5bpq Ready\n[OK] pod/openldap-od-5bbdd75864-d5bpq condition met\n[INFO] waiting for pod/pyos-od-7584db6787-vnp64 Ready\n[OK] pod/pyos-od-7584db6787-vnp64 condition met\n[INFO] waiting for pod/speedtest-od-7f5484966f-jsb2m Ready\n[OK] pod/speedtest-od-7f5484966f-jsb2m condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-6dt28   1/1     Running   0          40s\nmongodb-od-77c945467d-r82kv     1/1     Running   0          40s\nnginx-od-7445969696-6z88w       1/1     Running   0          40s\nopenldap-od-5bbdd75864-d5bpq    1/1     Running   0          38s\npyos-od-7584db6787-vnp64        1/1     Running   0          39s\nspeedtest-od-7f5484966f-jsb2m   1/1     Running   0          39s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

The command above downloads the latest release (numerically) of abcdesktop.io. The quick installation process runs the all commands step by step:

"},{"location":"3.2/setup/kubernetes_abcdesktop/#change-the-default-namespace","title":"Change the default namespace","text":"

You may need to replace the default namespace abcdesktop by your own during the install process. The install-3.2.sh bash script allow you to set the new namespace as an option.

wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.sh\nchmod 755 install-3.2.sh \n

Run install-3.2.sh

./install-3.2.sh --namespace superdesktop\n
[INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] use local file abcdesktop.yaml\n[OK] use local file od.config\n[OK] use local file poduser.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\n[OK] role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] waiting for pod/memcached-od-5ff8844d56-b75fb Ready\n[OK] pod/memcached-od-5ff8844d56-b75fb condition met\n[INFO] waiting for pod/mongodb-od-77c945467d-t8cv7 Ready\n[OK] pod/mongodb-od-77c945467d-t8cv7 condition met\n[INFO] waiting for pod/nginx-od-b8c8c7b95-lkjl6 Ready\n[OK] pod/nginx-od-b8c8c7b95-lkjl6 condition met\n[INFO] waiting for pod/openldap-od-56b6564c85-2npln Ready\n[OK] pod/openldap-od-56b6564c85-2npln condition met\n[INFO] waiting for pod/pyos-od-67dfc48d84-kww9n Ready\n[OK] pod/pyos-od-67dfc48d84-kww9n condition met\n[INFO] waiting for pod/speedtest-od-894b7c886-69vc4 Ready\n[OK] pod/speedtest-od-894b7c886-69vc4 condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-b75fb   1/1     Running   0          20s\nmongodb-od-77c945467d-t8cv7     1/1     Running   0          20s\nnginx-od-b8c8c7b95-lkjl6        1/1     Running   0          20s\nopenldap-od-56b6564c85-2npln    1/1     Running   0          18s\npyos-od-67dfc48d84-kww9n        1/1     Running   0          20s\nspeedtest-od-894b7c886-69vc4    1/1     Running   0          20s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free tcp port from 30443\n[OK] get a free tcp port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-b8c8c7b95-lkjl6 --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#manually-installation-step-by-step-linux-macos-or-windows","title":"Manually installation step by step (Linux, macOS or Windows)","text":"

The following commands will let you deploy an abcdesktop on the master node. All applications run on a single server.

"},{"location":"3.2/setup/kubernetes_abcdesktop/#install-abcdesktop","title":"Install abcdesktop","text":""},{"location":"3.2/setup/kubernetes_abcdesktop/#step-1-create-abcdesktop-namespace","title":"Step 1: Create abcdesktop namespace","text":"

We will create the abcdesktop namespace and set it as default :

kubectl create namespace abcdesktop\n

You should read on the standard output

namespace/abcdesktop created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-2-secure-abcdesktop-jwt-exchange","title":"Step 2: Secure abcdesktop JWT exchange","text":"

User JWT is signed. So we need to define a (private, public) RSA keys for signing. Desktop JWT is encrypted AND signed. So we need to define a (private, public) RSA keys for signing, and a (private, public) RSA keys to encrypt data.

Please use the payload private as private key, and the payload public as private key. Do not publish the public key. This public key must stay private, this is a special case, this is not stupid, it's only a more secure option.

The abcdesktop jwt desktop payload public key is read by nginx lua script. The exported the public key need the RSAPublicKey_out option, to use the RSAPublicKey format. The RSAPublicKey format make key file format compatible between python 3.x jwt module and lua jwt lib.

The following commands will let you create all necessary keys :

openssl genrsa -out abcdesktop_jwt_desktop_payload_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_payload_private_key.pem -outform PEM -pubout -out  _abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl rsa -pubin -in _abcdesktop_jwt_desktop_payload_public_key.pem -RSAPublicKey_out -out abcdesktop_jwt_desktop_payload_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_desktop_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_desktop_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_desktop_signing_public_key.pem\nopenssl genrsa -out abcdesktop_jwt_user_signing_private_key.pem 1024\nopenssl rsa -in abcdesktop_jwt_user_signing_private_key.pem -outform PEM -pubout -out abcdesktop_jwt_user_signing_public_key.pem\n

Then, create the kubernetes secrets from the new key files:

kubectl create secret generic abcdesktopjwtdesktoppayload --from-file=abcdesktop_jwt_desktop_payload_private_key.pem --from-file=abcdesktop_jwt_desktop_payload_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtdesktopsigning --from-file=abcdesktop_jwt_desktop_signing_private_key.pem --from-file=abcdesktop_jwt_desktop_signing_public_key.pem --namespace=abcdesktop\nkubectl create secret generic abcdesktopjwtusersigning --from-file=abcdesktop_jwt_user_signing_private_key.pem --from-file=abcdesktop_jwt_user_signing_public_key.pem --namespace=abcdesktop\n

You should read on the standard output :

secret/abcdesktopjwtdesktoppayload created\nsecret/abcdesktopjwtdesktopsigning created\nsecret/abcdesktopjwtusersigning created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#verify-secrets","title":"Verify Secrets","text":"

You can verify secrets creation with the following command :

kubectl get secrets -n abcdesktop\n

You should read on the standard output :

NAME                          TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload   Opaque                                2      68s\nabcdesktopjwtdesktopsigning   Opaque                                2      68s\nabcdesktopjwtusersigning      Opaque                                2      67s\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-3-download-user-pod-images","title":"Step 3: Download user pod images","text":"

Create a pod user to make sure that Kubernetes will find the docker images at startup time.

kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n

You should read on stdout

pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 created\n

You can wait for user pod is Ready, this while take a while, for container images are downloading.

kubectl wait --for=condition=Ready pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5  -n abcdesktop --timeout=-1s\n
pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n

You can delete the user pod anonymous-74bea267-8197-4b1d-acff-019b24e778c5. The container images are downloaded.

kubectl delete -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-4-download-and-create-the-abcdesktop-config-file","title":"Step 4: Download and create the abcdesktop config file","text":"

Download the od.config file. This is the main configuration file for pyos control plane.

curl https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2 --output od.config\n

Create the config map abcdesktop-config in the abcdesktop namespace

kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n

You should read on sdtout

configmap/abcdesktop-config created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#step-5-create-the-abcdesktop-pods-and-services","title":"Step 5: Create the abcdesktop pods and services","text":"

abcdesktop.yaml file contains declarations for all roles, service account, pods, and services required for abcdesktop.

Run the command line

kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n

You should read on the standard output

role.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#verify-pods","title":"Verify Pods","text":"

Once the pods are created, all pods should be in Running status. For the first time, please wait for downloading all container images. It can take a while.

kubectl get pods -n abcdesktop\n

You should read on the standard output

NAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          18s\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          18s\nnginx-od-7445969696-mwlc9       1/1     Running   0          18s\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          18s\npyos-od-7584db6787-tjlvk        1/1     Running   0          18s\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          18s\n
"},{"location":"3.2/setup/kubernetes_abcdesktop/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

Open your navigator to http://[your-ip-hostname]:30443/

abcdesktop homepage should be available :

Click on the Connect with Anonymous access button. abcdesktop service pyos is creating a new pod.

Few seconds later, processes are ready to run. You should see the abcdesktop main screen, with no application in the dock.

Also, you can run again the command

kubectl get pods -n abcdesktop\n

You should see that the anonymous-XXXXX pod have been created and is Running

NAME                            READY   STATUS    RESTARTS   AGE\nanonymous-50b0f                 4/4     Running   0          5m22s\nmemcached-od-5ff8844d56-jv4bh   1/1     Running   0          77m\nmongodb-od-77c945467d-9xbnw     1/1     Running   0          77m\nnginx-od-7445969696-mwlc9       1/1     Running   0          77m\nopenldap-od-5bbdd75864-c6th9    1/1     Running   0          77m\npyos-od-7584db6787-tjlvk        1/1     Running   0          77m\nspeedtest-od-7f5484966f-cxwpr   1/1     Running   0          77m\n

Great you have installed abcdesktop.io. You just need a web browser to reach your web workspace. It' now time to add some container applications. Read the next chapter to add applications

"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/","title":"Setup applications for abcdesktop","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#quick-application-install","title":"Quick application install","text":"

Quick installation can be run on Linux or macOS operation system.

Download and execute the pullapps-3.2.sh script :

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.2.sh | bash\n

This script starts abcdesktop application on an empty desktop. Pod is created to ask Kubernetes for pulling containers image.

NAME                                                             READY   STATUS              RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running             0          100m\ndaemonset-pyos-rdwws                                             1/1     Running             0          100m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running             0          100m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running             0          100m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running             0          100m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running             0          5s\npull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4   1/1     Running             0          3s\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378   0/1     ContainerCreating   0          1s\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017   0/1     ContainerCreating   0          0s\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49   0/1     ContainerCreating   0          2s\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87   1/1     Running             0          3s\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8   1/1     Running             0          4s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running             0          100m\n

list of created pods for pulling is pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274

pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4\npull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378\npull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017\npull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49\npull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87\npull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8\npod/pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 condition met\npod/pull-calc-abcinst-57622131ac1ce4b37d5cec51ee7f0071c460293158a4 condition met\npod/pull-firefox-abcinst-d2872d0d272a3a02606b4877c12e832755ba1a378 condition met\npod/pull-gimp-abcinst-051fefa55d97338653a58e86ccdd5f1a3e66f7f05017 condition met\npod/pull-impress-abcinst-f74fed932051c2760b3fd69f4ef475e34ad1a8a49 condition met\npod/pull-writer-abcinst-cfe1a4f74d19fbe49d86d211f99d005532b6cf7c87 condition met\npod/pull-xterm-abcinst-0e802cfa8addb4648f843869325f3413d544bb9eae8 condition met\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#quick-application-install-windows","title":"Quick application install (Windows)","text":"

Quick installation can be run on Windows operation system.

Download and execute the pullapps-3.2.ps1 script :

$script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/pullapps-3.2.ps1 \n\nInvoke-Expression $($script.Content)\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop","title":"Connect to your abcdesktop","text":"

The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

Now reconnect to your abcdesktop.

Open your navigator to http://[your-ip-hostname]:30443/

http://localhost:30443/\n

The new applications are installed, and ready to run.

"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#mannualy-install-application","title":"Mannualy install application","text":"

Add new application, require to send an application json document to the control-plane pyos.

"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#download-a-json-application-document-format","title":"Download a json application document format","text":"

In this example, we install the application 2048 game, but you can choose another one from https://github.com/abcdesktopio/images/tree/main/artifact/3.2

curl https://raw.githubusercontent.com/abcdesktopio/images/main/artifact/3.1/2048-alpine.d.3.2.json --output 2048.json\n

To inspect image json you can also run crictl inspecti or docker inspect command.

The image manager endpoint REST API is http://[your-ip-hostname]:30443/API/manager/image

Replace [your-ip-hostname] by your own server ip, by default with localhost, the url become http://localhost:30443/API/manager/image

Send the 2048.json file to the images REST endpoint

curl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d @2048.json\n

The response is the json document.

[{\"home\": null, \"cmd\": [\"/composer/appli-docker-entrypoint.sh\"], \"workingdir\": \"/home/balloon\", \"user\": \"balloon\", \"sha_id\": \"sha256:1897dd8f22453ae01c72d4975d43e5505b6faae3f4a41611108c2e3beb2ab4bd\", \"id\": \"abcdesktopio/2048.d:3.0\", \"rules\": {\"homedir\": {\"default\": true}}, \"acl\": {\"permit\": [\"all\"]}, \"launch\": \"2048-qt.2048-qt\", \"name\": \"2048\", \"icon\": \"circle_2048.svg\", \"icondata\": \"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\", \"keyword\": \"2048,2048\", \"uniquerunkey\": null, \"cat\": \"games\", \"args\": null, \"execmode\": null, \"security_opt\": null, \"showinview\": null, \"displayname\": \"2048\", \"mimetype\": [], \"path\": \"/usr/games/2048-qt\", \"desktopfile\": \"2048-qt.desktop\", \"executablefilename\": \"2048-qt\", \"usedefaultapplication\": null, \"fileextensions\": [], \"legacyfileextensions\": [], \"host_config\": {\"mem_limit\": \"256M\", \"shm_size\": \"64M\", \"pid_mode\": false, \"network_mode\": \"none\"}, \"secrets_requirement\": null, \"run_inside_pod\": false, \"image_pull_policy\": \"IfNotPresent\", \"image_pull_secrets\": null\n
"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#rest-api-methods-description-for-apimanagerimage","title":"REST API methods description for /API/manager/image","text":"Method Type GET http request list images in mongo db image collection PUT http request update or insert images in mongo db image collection, then create a pull pod to fetch images POST http request update or insert images in mongo db image collection. This method does not pull images. DELETE http request delete images in mongo db image collection Method Sample GETcurl -X GET -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/imagePUTcurl -X PUT -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.jsonPOSTcurl -X POST -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image -d@xterm.d.jsonDELETEcurl -X DELETE -H 'Content-Type: text/javascript' http://localhost:30443/API/manager/image/efbb56e0c579d1945fd8f4a4d955e08d7801208c953e03fe6d4d274edd1904c9

The PUT method create a pull pod to fetch application images. Check that a new pull-2048-*-UUID pod exists

kubectl get pods -n abcdesktop\n

The pod pull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274 is ContainerCreating.

NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   0/1     ContainerCreating   0          2s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

Then the pod STATUS become Running during 42 seconds.

NAME                                                             READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-dqxzx                                            1/1     Running   0          32m\ndaemonset-pyos-rdwws                                             1/1     Running   0          32m\nmemcached-od-bdcbbcb74-xbg8x                                     1/1     Running   0          32m\nmongodb-od-6484d8bc67-9xsgm                                      1/1     Running   0          32m\nopenldap-od-795c55f6db-pb68k                                     1/1     Running   0          32m\npull-2048-abcinst-9fd80f22ad6b0750cb3d248bda04de25444bab2cf274   1/1     Running   0          80s\nspeedtest-od-5565dfdc67-vdwcl                                    1/1     Running   0          32m\n

This pod is created to ask Kubernetes for pulling the container image.

"},{"location":"3.2/setup/kubernetes_abcdesktop_applications/#connect-to-your-abcdesktop_1","title":"Connect to your abcdesktop","text":"

The API server receives a new image event from docker daemon. To run the new applications just refresh you web browser page.

Now reconnect to your abcdesktop.

Open your navigator to http://[your-ip-hostname]:30443/

http://localhost:30443/\n

The new applications are installed, and ready to run.

"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/","title":"Kubernetes abcdesktop windows","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#quick-installation-windows","title":"Quick installation (Windows)","text":"

Quick installation can be run on Windows operation system.

"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#prerequisites","title":"Prerequisites","text":""},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#install-and-configure-docker-desktop","title":"Install and configure Docker Desktop","text":"

To run abcdesktop on Microsoft Windows plateform you need to use docker desktop

Start Docker Desktop and wait for the docker engine to start.

Once started go to the Settings | Kubernetes and click on Enable Kubernetes, starting your cluster may take a while.

Now your cluster should be correctly initialized, you can check it by opening a new PowerShell and run the command kubectl version

kubectl version\nclient version: V1.40.4\nKustomise Version: V9-0-4-0.202506011699445602001590025\nServer Version: v1.28.2\n

"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#install-openssl","title":"Install OpenSSL","text":"

abcdesktop install process creates RSA keys using openssl, you need to install openssl command line.

Download the OpenSSL v3.2.0 Light executable file.

Then follow the install process.

Make sure to keep in mind the path where OpenSSL will be installed.

Once installed, go to \"Edit the system environement variables\", and click on \"Environement variables\".

Go to the system variables section and search for Path

Click on Edit and add a new Path, you have to paste the absolute path to the bin folder of OpenSSL.

Now OpenSSL should be correctly installed, you can check it by opening a new PowerShell and run the command

openssl version\n

"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#run-the-install-script","title":"Run the install script","text":"

Download and extract the latest release automatically (Windows):

$script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/install-3.2.ps1\n\nInvoke-Expression $($script.Content)\n

You should read on stdout

[INFO] abcdesktop install script namespace=abcdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace abcdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n abcdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-x89kq   1/1     Running   0          11s\nmongodb-od-77c945467d-c5cw4     1/1     Running   0          11s\nnginx-od-86c5dfcc67-nfvbq       1/1     Running   0          11s\nopenldap-od-5bbdd75864-mzzmh    1/1     Running   0          11s\npyos-od-7646bf4786-c2hdm        1/1     Running   0          11s\nspeedtest-od-7f5484966f-6t4b2   1/1     Running   0          11s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-86c5dfcc67-nfvbq --address 0.0.0.0 30443:80 -n abcdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

You can open a web browser and go to the http://localhost:30443/

"},{"location":"3.2/setup/kubernetes_abcdesktop_windows/#change-the-default-namespace","title":"Change the default namespace","text":"

You may need to replace the default namespace abcdesktop by your own. The install-3.2.ps1 PowerShell script allows you to set the new namespace as an option.

curl https://raw.githubusercontent.com/Matt307082/powershell-scripts/master/install-3.2.ps1 -OutFile install-3.2.ps1\n

Run install-3.2.ps1

.\\install-3.2.ps1 --namespace superdesktop\n

You should read on stdout

[INFO] abcdesktop install script namespace=superdesktop\n[OK] kubectl version\n[OK] openssl version\n[OK] kubectl create namespace superdesktop\nwriting RSA key\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_payload keys created\nwriting RSA key\n[OK] abcdesktop_jwt_desktop_signing keys create\nwriting RSA key\n[OK] abcdesktop_jwt_user_signing keys create\n[OK] create secret generic abcdesktopjwtdesktoppayload\n[OK] create secret generic abcdesktopjwtdesktopsigning\n[OK] create secret generic abcdesktopjwtusersigning\n[OK] label secret abcdesktopjwtdesktoppayload\n[OK] label secret abcdesktopjwtdesktopsigning\n[OK] label secret abcdesktopjwtusersigning\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/abcdesktop-3.2.yaml\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/reference/od.config.3.2\n[OK] downloaded source https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/poduser-3.2.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\n[OK] updated abcdesktop.yaml file with new fqdn superdesktop.svc.cluster.local\n[OK] updated od.config file with new namespace superdesktop\n[OK] updated od.config file with new fqdn superdesktop.svc.cluster.local\n[OK] updated poduser.yaml file with new superdesktop\n[OK] kubectl create configmap abcdesktop-config --from-file=od.config -n superdesktop\n[OK] label configmap abcdesktop-config abcdesktop/role=pyos.config\n[INFO] kubectl create -f poduser.yaml\n[OK] kubectl create -f poduser.yaml\n[INFO] waiting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 condition met\n[INFO] deleting for pod/anonymous-74bea267-8197-4b1d-acff-019b24e778c5 Ready\n[OK] pod \"anonymous-74bea267-8197-4b1d-acff-019b24e778c5\" deleted\nrole.rbac.authorization.k8s.io/pyos-role created\nrolebinding.rbac.authorization.k8s.io/pyos-rbac created\nserviceaccount/pyos-serviceaccount created\nconfigmap/configmap-mongodb-scripts created\nconfigmap/nginx-config created\nsecret/secret-mongodb created\ndeployment.apps/mongodb-od created\ndeployment.apps/memcached-od created\ndeployment.apps/nginx-od created\ndeployment.apps/speedtest-od created\ndeployment.apps/pyos-od created\nendpoints/desktop created\nservice/desktop created\nservice/memcached created\nservice/mongodb created\nservice/speedtest created\nservice/nginx created\nservice/pyos created\ndeployment.apps/openldap-od created\nservice/openldap created\n[INFO] waiting for deployment/memcached-od available\n[OK] deployment.apps/memcached-od condition met\n[INFO] waiting for deployment/mongodb-od available\n[OK] deployment.apps/mongodb-od condition met\n[INFO] waiting for deployment/nginx-od available\n[OK] deployment.apps/nginx-od condition met\n[INFO] waiting for deployment/openldap-od available\n[OK] deployment.apps/openldap-od condition met\n[INFO] waiting for deployment/pyos-od available\n[OK] deployment.apps/pyos-od condition met\n[INFO] waiting for deployment/speedtest-od available\n[OK] deployment.apps/speedtest-od condition met\n[INFO] list all pods in namespace superdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\nmemcached-od-5ff8844d56-98t4t   1/1     Running   0          23s\nmongodb-od-77c945467d-v4k58     1/1     Running   0          23s\nnginx-od-7c7bf5bf48-khtvg       1/1     Running   0          23s\nopenldap-od-56b6564c85-t56tj    1/1     Running   0          21s\npyos-od-644c98bcd5-8gqzd        1/1     Running   0          23s\nspeedtest-od-894b7c886-fgt6v    1/1     Running   0          23s\n[INFO] Setup done\n[INFO] Checking the service url on http://localhost:30443\n[INFO] service status is down\n[INFO] Looking for a free TCP port from 30443\n[OK] Get a free TCP port from 30443\n\n[INFO] If you're using a cloud provider\n[INFO] Forwarding abcdesktop service for you on port=30443\n[INFO] For you setup is running the command 'kubectl port-forward nginx-od-86c5dfcc67-nfvbq --address 0.0.0.0 30443:80 -n superdesktop'\n[OK] Port-Forward successful\n[OK] Please open your web browser and connect to\n\n[INFO] http://localhost:30443/\n

You can open a web browser and go to the http://localhost:30443/

"},{"location":"3.2/setup/uninstall_kubernetes/","title":"Uninstall abcdesktop","text":"

Uninstall abcdesktop for kubernetes

"},{"location":"3.2/setup/uninstall_kubernetes/#command-to-uninstall-abcdesktop-release-32","title":"Command to uninstall abcdesktop release 3.2","text":"

To uninstall abcdesktop. Choose run run the uninstall-3.2.sh bash script using a curl.

"},{"location":"3.2/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

If you are using a Windows operating system please click on the link below Quick uninstall for windows

"},{"location":"3.2/setup/uninstall_kubernetes/#quick-uninstallation-abcdesktop-linux-or-macos","title":"Quick uninstallation abcdesktop (Linux or macOS)","text":"

Quick uninstallation can be run on Linux or macOS operation system.

Download and extract the uninstall bash script (Linux or macOS):

curl -sL https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.sh | bash\n

You should read on stdout

abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\"type=x11server\" -n abcdesktop\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n

Please wait for the output message:

[OK] namespace \"abcdesktop\" deleted\n

Great, you have uninstalled abcdesktop for kubernetes.

"},{"location":"3.2/setup/uninstall_kubernetes/#uninstall-with-a-dedicated-namespace","title":"uninstall with a dedicated namespace","text":"
wget https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.sh\nchmod 755 uninstall-3.2.sh\n

Run the uninstall-3.2.sh command line with your own namespace

./uninstall-3.2.sh --namespace superdesktop\n

You should read on stdout

abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\"type=x11server\" -n superdesktop\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n

Great, you have uninstalled abcdesktop for kubernetes with a dedicated namespace.

"},{"location":"3.2/setup/uninstall_kubernetes_windows/","title":"Uninstall kubernetes windows","text":""},{"location":"3.2/setup/uninstall_kubernetes_windows/#quick-uninstallation-abcdesktop-windows","title":"Quick uninstallation abcdesktop (Windows)","text":"

Quick uninstallation can be run on Windows operation system.

Download and extract the uninstall PowerShell script (Windows):

$script = curl https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/uninstall-3.2.ps1 \n\nInvoke-Expression $($script.Content)\n

You should read on stdout

[INFO] abcdesktop uninstall script namespace=abcdesktop\n[OK] kubectl version\n[OK] kubectl get namespace abcdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n abcdesktop\n[OK] kubectl delete configmap --all -n abcdesktop\n[OK] kubectl delete pvc --all -n abcdesktop\n[INFO] deleting namespace abcdesktop\n[OK] namespace \"abcdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
"},{"location":"3.2/setup/uninstall_kubernetes_windows/#uninstall-with-a-dedicated-namespace","title":"Uninstall with a dedicated namespace","text":"
curl https://raw.githubusercontent.com/Matt307082/powershell-scripts/master/uninstall-3.2.ps1 -OutFile uninstall-3.2.ps1\n

Run the uninstall-3.2.ps1 command line with your own namespace

.\\uninstall-3.2.ps1 --namespace superdesktop\n

You should read on stdout

[INFO] abcdesktop uninstall script namespace=superdesktop\n[OK] kubectl version\n[OK] kubectl get namespace superdesktop\n[OK] delete pods --selector=\\\n[OK] use local file abcdesktop.yaml\n[OK] updated abcdesktop.yaml file with new namespace superdesktop\nrole.rbac.authorization.k8s.io \"pyos-role\" deleted\nrolebinding.rbac.authorization.k8s.io \"pyos-rbac\" deleted\nserviceaccount \"pyos-serviceaccount\" deleted\nconfigmap \"configmap-mongodb-scripts\" deleted\nconfigmap \"nginx-config\" deleted\nsecret \"secret-mongodb\" deleted\ndeployment.apps \"mongodb-od\" deleted\ndeployment.apps \"memcached-od\" deleted\ndeployment.apps \"nginx-od\" deleted\ndeployment.apps \"speedtest-od\" deleted\ndeployment.apps \"pyos-od\" deleted\nendpoints \"desktop\" deleted\nservice \"desktop\" deleted\nservice \"memcached\" deleted\nservice \"mongodb\" deleted\nservice \"speedtest\" deleted\nservice \"nginx\" deleted\nservice \"pyos\" deleted\ndeployment.apps \"openldap-od\" deleted\nservice \"openldap\" deleted\n[OK] kubectl delete -f abcdesktop.yaml\n[OK] kubectl delete secrets --all -n superdesktop\n[OK] kubectl delete configmap --all -n superdesktop\n[OK] kubectl delete pvc --all -n superdesktop\n[INFO] deleting namespace superdesktop\n[OK] namespace \"superdesktop\" deleted\n[INFO] delete abcdesktop related files\n[OK] remove od.config abcdesktop.yaml poduser.yaml\n[OK] remove *.pem\n[INFO] abcdesktop was succesfully uninstalled\n
"},{"location":"about/authors/","title":"Authors and Contributors","text":""},{"location":"about/authors/#primary-authors","title":"Primary Authors","text":""},{"location":"about/authors/#other-contributors","title":"Other Contributors","text":"

The incomplete list of individuals below have provided patches or otherwise contribute to the project prior to the project being hosted on GitHub. See the GitHub commit log for a list of recent contributors. We would like to thank everyone who has contributed to the project in any way.

"},{"location":"about/gnu-gpl-v2.0/","title":"GNU General Public License","text":"

Version 2, June 1991 Copyright \u00a9 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

"},{"location":"about/gnu-gpl-v2.0/#preamble","title":"Preamble","text":"

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

"},{"location":"about/gnu-gpl-v2.0/#terms-and-conditions-for-copying-distribution-and-modification","title":"TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION","text":"

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The \u201cProgram\u201d, below, refers to any such program or work, and a \u201cwork based on the Program\u201d means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term \u201cmodification\u201d.) Each licensee is addressed as \u201cyou\u201d.

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and \u201cany later version\u201d, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

"},{"location":"about/gnu-gpl-v2.0/#no-warranty","title":"NO WARRANTY","text":"

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \u201cAS IS\u201d WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS

"},{"location":"about/gnu-gpl-v2.0/#how-to-apply-these-terms-to-your-new-programs","title":"How to Apply These Terms to Your New Programs","text":"

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the \u201ccopyright\u201d line and a pointer to where the full notice is found.

<one line to give the program's name and a brief idea of what it does.>\nCopyright (C) <year>  <name of author>\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 2 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

Gnomovision version 69, Copyright (C) year name of author\nGnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\nThis is free software, and you are welcome to redistribute it\nunder certain conditions; type `show c' for details.\n

The hypothetical commands show w and show c should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than show w and show c; they could even be mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a \u201ccopyright disclaimer\u201d for the program, if necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n`Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n<signature of Ty Coon>, 1 April 1989\nTy Coon, President of Vice\n

This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.

"},{"location":"about/howreadthisdoc/","title":"How to read the abcdesktop.io documentation","text":""},{"location":"about/howreadthisdoc/#abcdesktopio-documentation","title":"abcdesktop.io documentation","text":"

The abcdesktop.io documentation brings you labs and tutorials that help you get hands-on experience using abcdesktop.io. You will find a mix of labs and tutorials that will help abcdesktop.io users, including sysadmins, IT Pros, and developers. There is a mix of hands-on tutorials right in the browser, instructions on setting up and using abcdesktop.io in your own environment (docker and kubernetes), and resources about best practices for developing and deploying your own abcdesktop.io applications.

We recommend you to start in docker mode first with the Setup Guide in docker mode.

Then explore the individual labs that explore many advanced features of abcdesktop.io, in Configuration Guide

You can also, read the genesis chapters GUI apps on Docker.

Learn more about abcdesktop.io, how it can help you deploy secure, scalable applications and save money along the way.

"},{"location":"about/howreadthisdoc/#the-basics-of-abcdesktopio","title":"The Basics of abcdesktop.io","text":"

Learn more about the core concepts of abcdesktop.io and what it can do for your operations team, and help you understand the fundamental value proposition for abcdesktop.io.

Topics include:

"},{"location":"about/howreadthisdoc/#the-advanced-of-abcdesktopio","title":"The Advanced of abcdesktop.io","text":"

This stage will help you learn more about some of the advanced topics of abcdesktop.io using Kubernetes.

Topics include:

"},{"location":"about/howtodolabsexercices/","title":"How to do the labs and exercices","text":"

abcdesktop labs and tutorials are written using a desktop host. The supported operating system are :

Operating System Recommended version GNU/Linux Ubuntu 18.04.4 LTS (Bionic Beaver) macOS/X Catalina version 10.15.3 (and above) Windows 10 Version 1703 (and above)"},{"location":"about/howtodolabsexercices/#choose-desktop-or-server","title":"Choose desktop or server","text":"

For example, if you are doing the exercice on a hostname 'server01.labs.domain.local', you have to translate the URL request http://localhost with http://server01.labs.domain.local

Your web browser (like Google Chrome) may refuse unsecure websocket (ws) connections to localhost or your FQDN (only wss, so you should setup a TLS certificate for your local web/websocket server). It should work without any issues in Mozilla Firefox on localhost.

"},{"location":"about/opensource/","title":"Open Source","text":""},{"location":"about/opensource/#abcdesktopio-is-an-open-source-project","title":"abcdesktop.io is an open source project","text":"

abcdesktop.io is an open source project and is a volunteer effort. This means that it depends on people to give some of their free time to improve it and make it even better.

Follow the Fork me on github links, to get access to each repository.

If you are reading this, then you are probably curious or want to contribute in some way. Read on to see how you can do so.

"},{"location":"about/opensource/#open-source-packages-dependencies","title":"Open Source packages dependencies","text":"

abcdesktop.io deplend on a lot of open source diffrents projets.

"},{"location":"about/opensource/#webmodules","title":"WebModules","text":"Package Licence Authors Source novnc MPL-2.0 Joel Martin https://kanaka.github.io/noVNC/ os.js BSD license Anders Evenrud https://github.com/os-js/OS.js/ dropzone.js MIT license Matias Meno, www.colorglare.com https://github.com/enyo/dropzone/ hammer.js MIT license Jorik Tangelder http://hammerjs.github.io/ jquery MIT license jQuery Team https://jquery.com/ jqueryui MIT license jQuery Team https://jqueryui.com/ js-cookie MIT license Klaus Hartl & Fagner Brack https://github.com/js-cookie/ UAParser GPLv2 & MIT Faisal Salman https://github.com/faisalman/ua-parser-js Angular FileManager MIT license Jonas Sciangula Street https://github.com/joni2back/angular-filemanager Bootstrap MIT license Bootstrap team https://getbootstrap.com/ webaudio-wav-stream-player MIT license Julien Bouquillon https://github.com/revolunet/webaudio-wav-stream-player bootbox MIT license Nick Payne makeusabrew https://github.com/makeusabrew/bootbox"},{"location":"about/opensource/#container-components","title":"Container components","text":""},{"location":"about/opensource/#nginx","title":"nginx","text":"Package Licence Authors Source nginx BSD licence Igor Sysoev http://nginx.org/ lua GPL-Compatible Free Software Licenses team at PUC-Rio in Brazil https://www.lua.org/"},{"location":"about/opensource/#ocpyos","title":"oc.pyos","text":"Package Version License CherryPy 18.5.0 BSD License Jinja2 2.11.1 BSD-3-Clause PyJWT 1.7.1 MIT PyNaCl 1.3.0 Apache License 2.0 PyYAML 5.3 MIT bcrypt 3.1.7 Apache License, Version 2.0 certifi 2020.4.5.1 MPL-2.0 cffi 1.14.0 MIT chardet 3.0.4 LGPL cryptography 2.9 BSD or Apache License, Version 2.0 dnspython 1.16.0 BSD-like docker 4.2.0 Apache License 2.0 future 0.18.2 MIT google-auth 1.13.1 Apache 2.0 graypy 2.1.0 BSD License idna 2.9 BSD-like iso8601 0.1.12 MIT isort 4.3.21 MIT kubernetes 11.0.0 Apache License Version 2.0 netaddr 0.7.19 BSD License oauthlib 3.1.0 BSD paramiko 2.7.1 LGPL pyasn1 0.4.8 BSD pyasn1-modules 0.2.8 BSD-2-Clause pycrypto 2.6.1 Public Domain pymongo 3.10.1 Apache License, Version 2.0 python-dateutil 2.8.1 Dual License python-geoip 1.2 GNU LESSER GENERAL PUBLIC LICENSE python-ldap 3.2.0 Python style python-subprocess2 2.0.2 LGPLv3 pytz 2019.3 MIT requests 2.23.0 Apache 2.0 requests-oauthlib 1.3.0 ISC rsa 4.0 ASL 2 shellescape 3.8.1 MIT license urllib3 1.25.8 MIT Package Version License ntlm_auth 2.0 GNU Lesser General Public License kerberos 1.16-2 MIT cntlm 0.92.3 GNU General Public License version 2.0 (GPLv2)"},{"location":"about/opensource/#ocuser","title":"oc.user","text":"Package Licence Authors Source novnc MPL-2.0 Joel Martin (github@martintribe.org) https://kanaka.github.io/noVNC/ supervisor LICENCES.TXT Chris McDonough http://supervisord.org/ tigervnc MIT licence Tiger Dev Tea https://tigervnc.org/ openbox GNU license Mikael Magnusson http://openbox.org/ cupds GNU & LGPL Apple Inc. https://www.cups.org/ xsettingsd COPYING Daniel Erat https://github.com/derat/xsettingsd angular-filemanager AGPL-3.0 Maestro Alubia https://www.npmjs.com/package/angular-filemanager-nodejs-bridge"},{"location":"about/opensource/#daemons","title":"Daemons","text":""},{"location":"about/opensource/#spawner-service","title":"Spawner-Service","text":"Package Licence Authors Source accept-language-parser@1.5.0 MIT Andy Royle https://github.com/opentable/accept-language-parser accept-language@3.0.18 MIT Tingan Ho https://github.com/tinganho/node-accept-language accepts@1.3.7 MIT no Author https://github.com/jshttp/accepts create-symlink@1.0.0 MIT Shinnosuke Watanabe https://github.com/shinnn/create-symlink diacritics@1.3.0 MIT Andrew Kelley https://github.com/andrewrk/node-diacritics dominant-color@0.0.1 ISC Hrvoje Simic https://github.com/shime/dominant-color event-stream@4.0.1 MIT Dominic Tarr https://github.com/dominictarr/event-stream express-validator@6.4.0 MIT Christoph Tavan https://github.com/express-validator/express-validator express@4.17.1 MIT TJ Holowaychuk https://github.com/expressjs/express find-process@1.4.3 MIT zoujie https://github.com/yibn2008/find-process geoip-lite@1.4.1 Apache-2.0 Philip Tellis https://github.com/bluesmoon/node-geoip helmet@3.22.0 MIT Adam Baldwin https://github.com/helmetjs/helmet hex-rgb@4.1.0 MIT Sindre Sorhus https://github.com/sindresorhus/hex-rgb imagemagick@0.1.3 MIT Rasmus Andersson https://github.com/rsms/node-imagemagick ini@1.3.5 ISC Isaac Z. Schlueter https://github.com/isaacs/ini ipaddr.js@1.9.1 MIT whitequark https://github.com/whitequark/ipaddr.js jsonfile@6.0.1 MIT JP Richardson https://github.com/jprichardson/node-jsonfile mime-types@2.1.26 MIT no Author https://github.com/jshttp/mime-types mmmagic@0.5.3 MIT Brian White https://github.com/mscdex/mmmagic npid@0.4.0 MIT* Mathieu Turcotte https://github.com/MathieuTurcotte/node-pid ps-node@0.1.6 MIT no Author https://github.com/neekey/ps simple-parser@0.0.0 ISC no Author no Repository walk@2.3.14 (MIT OR Apache-2.0) AJ ONeal https://git.coolaj86.com/coolaj86/fs-walk.js which@2.0.2 ISC Isaac Z. Schlueter https://github.com/isaacs/node-which wmctrljs@1.1.9 ISC kevin.voyer.developpeur@gmail.com https://github.com/Kmynes/wmctrljs ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws xwininfo@0.0.0 ISC ashaffer https://github.com/ashaffer/node-xwininfo"},{"location":"about/opensource/#broadcast-service","title":"Broadcast-service","text":"Package Licence Authors Source http-proxy@1.18.0 MIT Charlie Robbins https://github.com/http-party/node-http-proxy ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws"},{"location":"about/opensource/#file-service","title":"File-Service","text":"Package Licence Authors Source busboy@0.3.1 MIT Brian White https://github.com/mscdex/busboy express@4.17.1 MIT TJ Holowaychuk https://github.com/expressjs/express fs-extra@9.0.0 MIT JP Richardson https://github.com/jprichardson/node-fs-extra helmet@3.22.0 MIT Adam Baldwin https://github.com/helmetjs/helmet mime-types@2.1.26 MIT no Author https://github.com/jshttp/mime-types mkdirp@1.0.4 MIT no Author https://github.com/isaacs/node-mkdirp urlencode@1.1.0 MIT fengmk2 https://github.com/node-modules/urlencode"},{"location":"about/opensource/#printer-service","title":"Printer-Service","text":"Package Licence Authors Source chokidar@3.3.1 MIT Paul Miller https://github.com/paulmillr/chokidar ws@7.2.3 MIT Einar Otto Stangvik https://github.com/websockets/ws"},{"location":"about/opensource/#xterm-service","title":"Xterm-Service","text":"Package Licence Authors Source xterm.js MIT xtermjs team https://github.com/xtermjs/xterm.js"},{"location":"about/opensource/#filemanager-service","title":"FileManager-Service","text":"Package Licence Authors Source angular-filemanager-nodejs-bridge@0.1.3 AGPL-3.0 Fabian K\u00f6ster no Repository"},{"location":"about/otherrelatedprojects/","title":"Others related projets","text":""},{"location":"about/otherrelatedprojects/#projects","title":"Projects","text":"

Welcome to the others related projects section, where you can find some projects related to use cloud application inside a web browser.

"},{"location":"about/play_sound_in_docker/","title":"Play sound inside a docker to a web browser","text":""},{"location":"about/play_sound_in_docker/#sound-in-docker-is-the-big-challenge","title":"Sound in docker is the big challenge","text":"

As VNC does not support sound, we have to forward a Pulseaudio null-sink output to the user browser, with no latency.

Realy fun projets: use virtual microphone using gstreamer and pulseaudio and Get Pulseaduio sink from webrtc To be implemented

"},{"location":"about/play_sound_in_docker/#release-10-pulseaudio-with-a-simple-module-http-protocol-tcp-and-a-javascript-no-latency-wav-stream-player","title":"Release 1.0: Pulseaudio with a simple module-http-protocol-tcp and a javascript no latency wav stream player","text":"
# defined with desktop 1.0\nload-module module-null-sink sink_name=u8_1_11025 format=u8 channels=1 rate=11025 sink_properties=\"device.description='default format=u8 c=1 ra\nte=11025'\"\n

Then use

load-module module-http-protocol-tcp\n

Read the http stream data, using fetch call :

http://$target:$pulseaudio_http_port/listen/source/u8_1_11025.monitor;\n

Pulseaudio module-http-protocol-tcp does not send wav formated header. We need to build a new wav header for each receved fragment. This is done in wavify.js file :

//\n// Write a proper WAVE header for the given buffer.\n// format ULAW or ALAW \n// Offset is hardcoded \nfunction wavify_law(data, numberOfChannels, sampleRate, bitsPerSample, format ) {\n\n    // // total header : 4 + 26 + 12 + 8 = 50 \n    // // and the data and size: 50 + 8 ( data + 32 bits for the size )\n    var header_length = 58; // 4 + 26 + 12 + 8 + 8 = 58 \n    var total_length =  header_length + data.byteLength;\n\n    // bitsPerSample MUST BE  8 bits\n\n    // The default byte ordering assumed for WAVE data files is little-endian.\n    var header = new ArrayBuffer(header_length); \n    var d = new DataView(header);\n\n    d.setUint8(0, \"R\".charCodeAt(0)); \n    d.setUint8(1, \"I\".charCodeAt(0));\n    d.setUint8(2, \"F\".charCodeAt(0));\n    d.setUint8(3, \"F\".charCodeAt(0));\n\n    // All integers MUST be set in bigEndian format\n    // Wave chunks containing format information and sampled data\n    // cksize   4   Chunk size: 4+n  \n    // 4: for sizeof( 'WAVE' ) + n \n    // n: Wave chunks containing format information and sampled data\n    //var data_length = d.setUint32(4, data.byteLength / 2 + 44, true);\n    //bitsPerSample data.byteLength + 8+16+12\n    d.setUint32(4, total_length, true); \n\n    // write 4 bytes\n    d.setUint8(8,  \"W\".charCodeAt(0)); \n    d.setUint8(9,  \"A\".charCodeAt(0)); \n    d.setUint8(10, \"V\".charCodeAt(0)); \n    d.setUint8(11, \"E\".charCodeAt(0)); \n\n\n    // write 4 bytes\n    d.setUint8(12, \"f\".charCodeAt(0));\n    d.setUint8(13, \"m\".charCodeAt(0));\n    d.setUint8(14, \"t\".charCodeAt(0));\n    d.setUint8(15, \" \".charCodeAt(0));\n\n\n    // All integers MUST be set in bigEndian format\n\n\n    // Subchunk1Size 16 for PCM.  \n    // Offset 16    \n    // Size 4\n    // This is the size of the rest of the Subchunk which follows this number.\n    // The size of the rest of this subchunk.\n    // All integers MUST be set in bigEndian format\n    // d.setUint32(16, 16, true);\n    // cksize   4   Chunk size: 16, 18 or 40 \n    var chunksize = 18;\n    d.setUint32(16, chunksize, true);\n\n    // The format of the wave data, which will be 1 for uncompressed PCM data.\n    // All integers MUST be set in bigEndian format\n    // FORMAT must be WAVE_FORMAT_ULAW or WAVE_FORMAT_ALAW\n    d.setUint16(20, format, true);\n\n    // Indicates if the data is mono, stereo, or something else.\n    // NumChannels Mono = 1, Stereo = 2, etc.\n    // All integers MUST be set in bigEndian format\n    d.setUint16(22, numberOfChannels, true);\n\n    // The sample rate per second.\n    // SampleRate 8000, 44100, etc.\n    // All integers MUST be set in bigEndian format\n    d.setUint32(24, sampleRate, true);\n\n    // byteRate == SampleRate * NumChannels * BitsPerSample/8\n    // All integers MUST be set in bigEndian format\n    var byteRate = sampleRate * numberOfChannels * bitsPerSample/8;\n    d.setUint32(28, byteRate, true ); \n\n    // blockAlign       == NumChannels * BitsPerSample/8\n    // The number of bytes for one sample including all channels.\n    var blockAlign = numberOfChannels * bitsPerSample / 8; \n     // All integers MUST be set in bigEndian format\n    d.setUint16(32, blockAlign, true ); \n\n    // BitsPerSample    8 bits = 8, 16 bits = 16, etc.\n    d.setUint16(34, bitsPerSample, true);\n\n    // Wave files may include an additional field, usually reserved for non-PCM formats:\n    // bits per Sample \n    // Size of the extension \n    // 2 bytes\n    // Offset \n    var cbSize = 0;\n    d.setUint16(36, cbSize, true);\n\n    d.setUint8(38, \"f\".charCodeAt(0));\n    d.setUint8(39, \"a\".charCodeAt(0));\n    d.setUint8(40, \"c\".charCodeAt(0));\n    d.setUint8(41, \"t\".charCodeAt(0));\n    var cksize = 4;\n    d.setUint32(42, cksize, true);\n    var dwSampleLength = data.byteLength; // Number of samples ( per channel )\n    d.setUint32(46, dwSampleLength, true);\n\n// 50\n    d.setUint8(50, \"d\".charCodeAt(0));\n    d.setUint8(51, \"a\".charCodeAt(0));\n    d.setUint8(52, \"t\".charCodeAt(0));\n    d.setUint8(53, \"a\".charCodeAt(0));\n\n    d.setUint32(54, data.byteLength, true);\n\n//58\n    // data must pad byte 0 or 1 if n is odd\n    return concat(header, data);\n}\n

Then use the WavPlayer.js from Julien Bouquillon https://github.com/revolunet/webaudio-wav-stream-player to read data and send to javascript AudioContext()

This Release is getting glitchy audio. In Chrome, the stream plays with a slight crackle. Read the issue https://github.com/revolunet/webaudio-wav-stream-player/issues/10

It works, uses only HTTP protocol but i can't fix the glitchy audio. We find another way to stream sound to web browser device, using the WebRTC stack and RTP pulseaudio.

"},{"location":"about/play_sound_in_docker/#release-20-pulseaudio-with-a-webrtc-gateway","title":"Release 2.0: Pulseaudio with a WebRTC gateway","text":""},{"location":"about/play_sound_in_docker/#architecture","title":"Architecture","text":"
### Load the RTP sender module (also configured via paprefs, see above)\nload-module module-null-sink sink_name=rtp_alaw format=alaw channels=1 rate=8000 sink_properties=\"device.description='RTP Multicast Sink alaw'\"\nload-module module-rtp-send source=rtp_alaw.monitor destination_ip=127.0.0.1 port=5000 channels=1 format=alaw\n

Add a RTP stream to Janus WebRTC gateway

[pulseaudio-rtp-pcma-8000]\ntype = rtp\nid = 1\ndescription = pcam/8000 live stream coming from pulseaudio\naudio = yes\nvideo = no\naudioport = 5000\naudiopt = 8\naudiortpmap = PCMA/8000\n

Read the dedicated webrtc chapter to configure and get more informations about the janus WebRTC

"},{"location":"about/version/","title":"Documentation","text":""},{"location":"about/version/#version","title":"Version","text":"

The current documentation version is 0.1

"},{"location":"about/version/#location","title":"Location","text":"

This documentation is located at https://github.com/abcdesktopio/docs

"},{"location":"about/version/#installing-make","title":"Installing Make","text":"

Install the Make package using apt-get

sudo apt-get install make\n
"},{"location":"about/version/#installing-mkdocs","title":"Installing MkDocs","text":"

Install the mkdocs package using the Makefile:

make install\n

make install command runs :

Make sure that the pip command is installed on you system.

"},{"location":"about/version/#how-to-build-the-documentation","title":"How to build the documentation","text":""},{"location":"about/version/#build-documentation-files","title":"Build documentation files","text":"
git clone https://github.com/abcdesktopio/docs\ncd docs\nmake docs\nINFO    -  Cleaning site directory \nINFO    -  Building documentation to directory: /home/alex/src/docs/opsdocs/site \n

All HTML files are located in the building documentation directory

"},{"location":"about/version/#how-to-view-the-documentation","title":"How to view the documentation","text":""},{"location":"about/version/#serve-documentation-files","title":"Serve documentation files","text":"
make serve\nINFO    -  Serving on http://127.0.0.1:8000\nINFO    -  Start watching changes\nINFO    -  Start detecting changes\n

Now connect http://127.0.0.1:8000 with any Web Navigator to browse through the documentation.

"},{"location":"api/backend/launchdesktop/","title":"Launchdesktop","text":"

{\"status\": 200, \"result\": {\"userid\": \"7d2ecad7-2154-4529-85b4-1ab037c29fed\", \"jwt_user_token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJleHAiOjE2NjM2ODYyMzEsImF1dGgiOnsicHJvdmlkZXIiOiJhbm9ueW1vdXMiLCJwcm92aWRlcnR5cGUiOiJhbm9ueW1vdXMiLCJkYXRhIjp7ImxhYmVscyI6eyJtYWlzb25hbGV4IjoidHJ1ZSJ9fX0sInVzZXIiOnsibmFtZSI6IkFub255bW91cyIsInVzZXJpZCI6IjdkMmVjYWQ3LTIxNTQtNDUyOS04NWI0LTFhYjAzN2MyOWZlZCIsIm5vZGVob3N0bmFtZSI6bnVsbH0sInJvbGVzIjp7fX0.Lz6PbYz-KPPXJWyBaWuXF60YCQEv9z9Hsr8Ik2rHELBhSAd00eeqrZ0js9aLJ4uHsU1YJQQ2mfupHOpUEgo7AZCJm3HgjJRseWI-ftDV3NJKo2U76Q7RsIZQlSu9O1gK42XL_IkZmB3kLwTv0-Q-3EO6cmL5aP2Nu0nc9gVgxPA\", \"name\": \"Anonymous\", \"provider\": \"anonymous\", \"expire_in\": 14400}, \"message\": \"Authentication successful in 0.01 s\"}

https://ocv5.pepins.net/API/composer/launchdesktop

{\"status\": 200, \"result\": {\"target_ip\": \"ocv5.pepins.net\", \"vncpassword\": \"gCalVYJoJdI15sI\", \"authorization\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJrZXkiOjAsImhhc2giOiJSdTJmWDAwZW5hSU5OT2dOZ2dCVU1pQ01nQkdrQmZRTnRJSzAweWFXU1FSbUc5dkpiYUFHUXJ5ekpPY0h1QmIyZTRyOXgrMzdINDZZZFlTcThESlZUczdDTXZnamxGajFIZVJ2Y25YNFFCOENkcWFBeE5xTW5XdkMxNVlpNkNtaXlRRmpFYkJlZFlPMWtEazZPNjB6R2wxN3RZZ0kvQ0ZJejdQcVJyL1BHM3c9IiwiZXhwIjoxNjYzNjg1OTI2fQ.is9k5bdUy10_u2MP4Z5tecKFUsdCcS4v_CsnEB6y4dDt4SuKebYz8MA4zCHDpP_Hi13RXVZDW9ax4Crzj0q-WvD_IgPjiz2qdjf7e-2TQ4TbnrqzEngHo6BVkd8vm1vvBE11RGRgufxu6oreGfPxnTtU9ly53sn-j2O3DVR5glA\", \"websocketrouting\": \"http_origin\", \"websockettcpport\": 6081, \"expire_in\": 14400}, \"message\": \"ok\"}

"},{"location":"applications/","title":"oc.apps","text":""},{"location":"applications/#to-get-more-informations","title":"To get more informations","text":"

Please, read the public documentation web site: * https://www.abcdesktop.io * https://abcdesktopio.github.io/

"},{"location":"applications/#abcdesktop-application-dockerfiles","title":"abcdesktop application dockerfiles","text":"

DockerFile generator from json file to build applications images run commands

$ make dockerfile\n$ make build\n

this command build all generated Dockerfile

To build documentation files

$ make docs\n

this command build all md files, and build list.md

"},{"location":"applications/2048-alpine-error/","title":"2048-alpine-error","text":""},{"location":"applications/2048-alpine-error/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/2048-alpine-error/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.0\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/2048-alpine-error/#alpine-packages","title":"Alpine packages","text":"
gnome-2048\n
"},{"location":"applications/2048-alpine-error/#displayname","title":"Displayname","text":"
2048 (alpine gtk) with error\n
"},{"location":"applications/2048-alpine-error/#path","title":"Path","text":"
/usr/bin/gnome-2048\n
"},{"location":"applications/2048-alpine-error/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/2048-alpine-error/#wm_class","title":"WM_CLASS","text":"
org.gnome.TwentyFortyEight.Gnome-2048\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/2048-alpine-error/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.TwentyFortyEight.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/2048-alpine-error/#json-dump","title":"JSON dump","text":"

json source file

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"containerengine\": \"pod_application\",\n    \"apkpackage\": \"gnome-2048\",\n    \"icon\": \"circle_2048.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"org.gnome.TwentyFortyEight.Gnome-2048\",\n    \"name\": \"2048-alpine-error\",\n    \"displayname\": \"2048 (alpine gtk) with error\",\n    \"path\": \"/usr/bin/gnome-2048\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.TwentyFortyEight.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    }\n}\n
"},{"location":"applications/2048-alpine-error/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output 2048-alpine-error.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-error.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine-error.json\n\n
"},{"location":"applications/2048-alpine-error/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-2048\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-alpine-error,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.TwentyFortyEight.desktop\"\nLABEL oc.launch=\"org.gnome.TwentyFortyEight.Gnome-2048\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"2048-alpine-error\"\nLABEL oc.displayname=\"2048 (alpine gtk) with error\"\nLABEL oc.path=\"/usr/bin/gnome-2048\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"2048-alpine-error\"\nENV APPBIN \"/usr/bin/gnome-2048\"\nENV APP \"/usr/bin/gnome-2048\"\nLABEL oc.containerengine=\"pod_application\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/2048-alpine-error/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-alpine-error/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application 2048-alpine-error

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine-error.d\n
"},{"location":"applications/2048-alpine-error/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f 2048-alpine-error.d -t 2048-alpine-error .\n
"},{"location":"applications/2048-alpine-error/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect 2048-alpine-error > 2048-alpine-error.json\ndocker image save 2048-alpine-error -o 2048-alpine-error.tar\nctr -n k8s.io images import 2048-alpine-error.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine-error.json\n\n
"},{"location":"applications/2048-alpine/","title":"2048-alpine","text":""},{"location":"applications/2048-alpine/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/2048-alpine/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/2048-alpine/#alpine-packages","title":"Alpine packages","text":"
gnome-2048\n
"},{"location":"applications/2048-alpine/#displayname","title":"Displayname","text":"
2048 (alpine gtk)\n
"},{"location":"applications/2048-alpine/#path","title":"Path","text":"
/usr/bin/gnome-2048\n
"},{"location":"applications/2048-alpine/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/2048-alpine/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/2048-alpine/#wm_class","title":"WM_CLASS","text":"
org.gnome.TwentyFortyEight.Gnome-2048\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/2048-alpine/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.TwentyFortyEight.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/2048-alpine/#json-dump","title":"JSON dump","text":"

json source file 2048-alpine.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"containerengine\": \"ephemeral_container\",\n    \"apkpackage\": \"gnome-2048\",\n    \"icon\": \"circle_2048.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"org.gnome.TwentyFortyEight.Gnome-2048\",\n    \"name\": \"2048-alpine\",\n    \"displayname\": \"2048 (alpine gtk)\",\n    \"path\": \"/usr/bin/gnome-2048\",\n    \"showinview\": \"dock\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.TwentyFortyEight.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"64M\",\n        \"pid_mode\": false,\n        \"network_mode\": \"none\"\n    }\n}\n
"},{"location":"applications/2048-alpine/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output 2048-alpine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine.d.3.0.json\n\n
"},{"location":"applications/2048-alpine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-2048\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-alpine,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.TwentyFortyEight.desktop\"\nLABEL oc.launch=\"org.gnome.TwentyFortyEight.Gnome-2048\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"2048-alpine\"\nLABEL oc.displayname=\"2048 (alpine gtk)\"\nLABEL oc.path=\"/usr/bin/gnome-2048\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"64M\\\",\\\"pid_mode\\\":false,\\\"network_mode\\\":\\\"none\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"2048-alpine\"\nENV APPBIN \"/usr/bin/gnome-2048\"\nENV APP \"/usr/bin/gnome-2048\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/2048-alpine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-alpine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application 2048-alpine

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-alpine.d\n
"},{"location":"applications/2048-alpine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f 2048-alpine.d -t 2048-alpine .\n
"},{"location":"applications/2048-alpine/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect 2048-alpine > 2048-alpine.json\ndocker image save 2048-alpine -o 2048-alpine.tar\nctr -n k8s.io images import 2048-alpine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-alpine.json\n\n
"},{"location":"applications/2048-ubuntu/","title":"2048-ubuntu","text":""},{"location":"applications/2048-ubuntu/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/2048-ubuntu/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/2048-ubuntu/#ubuntu-packages","title":"Ubuntu packages","text":"
2048-qt\n
"},{"location":"applications/2048-ubuntu/#displayname","title":"Displayname","text":"
2048 (ubuntu qt)\n
"},{"location":"applications/2048-ubuntu/#path","title":"Path","text":"
/usr/games/2048-qt\n
"},{"location":"applications/2048-ubuntu/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/2048-ubuntu/#wm_class","title":"WM_CLASS","text":"
2048-qt.2048-qt\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/2048-ubuntu/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/2048-qt.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/2048-ubuntu/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

ENV QT_X11_NO_MITSHM=1\n
"},{"location":"applications/2048-ubuntu/#json-dump","title":"JSON dump","text":"

json source file 2048-ubuntu.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"containerengine\": \"pod_application\",\n    \"debpackage\": \"2048-qt\",\n    \"icon\": \"circle_2048.svg\",\n    \"keyword\": \"2048\",\n    \"launch\": \"2048-qt.2048-qt\",\n    \"name\": \"2048-ubuntu\",\n    \"displayname\": \"2048 (ubuntu qt)\",\n    \"path\": \"/usr/games/2048-qt\",\n    \"desktopfile\": \"/usr/share/applications/2048-qt.desktop\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"postruncommands\": [\n        \"ENV QT_X11_NO_MITSHM=1\"\n    ]\n}\n
"},{"location":"applications/2048-ubuntu/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output 2048-ubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-ubuntu.d.3.0.json\n\n
"},{"location":"applications/2048-ubuntu/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends 2048-qt && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_2048.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzIiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMTgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzI3NiAwIDAgMS4zMjc2IC01MTAuNjQgLTY2My41MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3AyIiBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A0IiBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMiIgc3RkRGV2aWF0aW9uPSIxMC41NjIzNzkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjE1IiBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTA1IiB4MT0iMjUuMDkzIiB4Mj0iMjUuMDM0IiB5MT0iNTkuMjMzIiB5Mj0iMi44MjYzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODk5IiBzdG9wLWNvbG9yPSIjZmY1NDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDEiIHN0b3AtY29sb3I9IiNmYjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkxMyIgeDE9IjI2LjUwMiIgeDI9IjI2LjU5IiB5MT0iNTkuNjAyIiB5Mj0iMTguOTQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTA3IiBzdG9wLWNvbG9yPSIjMzVlODcyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MDkiIHN0b3AtY29sb3I9IiMzNGU5ZDgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDkyMSIgeDE9IjQzLjA2NyIgeDI9IjQyLjU3OSIgeTE9IjU5LjQxIiB5Mj0iMjguMzQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wOTE1IiBzdG9wLWNvbG9yPSIjMzU1M2U0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A5MTciIHN0b3AtY29sb3I9IiM1NmNlZjMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTAyNSIgeD0iLS4xMjQ2MiIgeT0iLS4xMjQ2MiIgd2lkdGg9IjEuMjQ5MiIgaGVpZ2h0PSIxLjI0OTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMDI3IiBzdGREZXZpYXRpb249IjEuMzQ4NzMwNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEwMjkiIHg9Ii0uMTI0NjIiIHk9Ii0uMTI0NjIiIHdpZHRoPSIxLjI0OTIiIGhlaWdodD0iMS4yNDkyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzMSIgc3RkRGV2aWF0aW9uPSIxLjM0ODczMDUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMzIiB4PSItLjEyNDYyIiB5PSItLjEyNDYyIiB3aWR0aD0iMS4yNDkyIiBoZWlnaHQ9IjEuMjQ5MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjEwMzUiIHN0ZERldmlhdGlvbj0iMS4zNDg3MzA1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTEzOSIgeD0iLS4yNDk0IiB5PSItLjE4NjM0IiB3aWR0aD0iMS40OTg4IiBoZWlnaHQ9IjEuMzcyNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjExNDEiIHN0ZERldmlhdGlvbj0iMC43NzY0MjE3NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjExNDMiIHg9Ii0uMjM5NzIiIHk9Ii0uMTg2MzQiIHdpZHRoPSIxLjQ3OTQiIGhlaWdodD0iMS4zNzI3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTE0NSIgc3RkRGV2aWF0aW9uPSIwLjc3NjQyMTc2Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTE0NyIgeD0iLS4yMjM0MiIgeT0iLS4xODYzNCIgd2lkdGg9IjEuNDQ2OCIgaGVpZ2h0PSIxLjM3MjciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXIxMTQ5IiBzdGREZXZpYXRpb249IjAuNzc2NDIxNzYiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxyZWN0IGlkPSJyZWN0MjAiIHRyYW5zZm9ybT0ibWF0cml4KDEuMDExNSAwIDAgMS4wMTE1IC0zODkuMzIgLTQ4OS45MikiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KIDxyZWN0IGlkPSJyZWN0MjIiIHg9IjEuOTgyNiIgeT0iMS45Nzg0IiB3aWR0aD0iNTkuOTk3IiBoZWlnaHQ9IjU5Ljk5NyIgcnk9IjI5Ljk5OCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjAxMTUiLz4KIDxnIHN0cm9rZS13aWR0aD0iLjUzMDcyIj4KICA8cGF0aCBpZD0icGF0aDkyMyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMDI1KSIgb3BhY2l0eT0iLjE1Ii8+CiAgPHBhdGggaWQ9InBhdGgzODY3MyIgZD0ibTMxIDUuMDI1NGMtMTQuMTU4IDAuNTExMTMtMjUuNDYzIDExLjgxNi0yNS45NzUgMjUuOTc1aDI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MDUpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjUiIGQ9Im0zMyAzM3YyNS45NzVjMTQuMTU4LTAuNTExMTIgMjUuNDYzLTExLjgxNiAyNS45NzUtMjUuOTc1eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMjkpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBpZD0icGF0aDM4NjcxIiBkPSJtMzMgMzN2MjUuOTc1YzE0LjE1OC0wLjUxMTEyIDI1LjQ2My0xMS44MTYgMjUuOTc1LTI1Ljk3NXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIi8+CiAgPHBhdGggaWQ9InBhdGg5MjciIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTAzMykiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGlkPSJyZWN0MzgxMTUiIGQ9Im01LjAyNTQgMzNjMC41MTExMyAxNC4xNTggMTEuODE2IDI1LjQ2MyAyNS45NzUgMjUuOTc1di0yNS45NzV6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTEzKSIvPgogPC9nPgogPHBhdGggaWQ9InBhdGgxMDM3IiBkPSJtMjEuNjkgMjMuODY5YzEuOTMxOS0xLjM3NzkgMy4wMzk4LTIuOTY4OCAzLjAzOTgtNC43MDE2IDAtMS45ODg3LTEuNDIwNS0zLjE2NzctMy44MDY4LTMuMTY3Ny0xLjIwNzQgMC0yLjM3MjIgMC4yOTgzLTMuMzk1IDAuODUyMjlsMC41NTM5OCAxLjg2MDhjMC45Mzc1MS0wLjQyNjE0IDEuNjQ3OC0wLjYxMDgyIDIuMzI5Ni0wLjYxMDgyIDEuMTIyMiAwIDEuNzYxNCAwLjQ5NzE4IDEuNzYxNCAxLjM5MjEgMCAxLjEzNjQtMC45OTQzNSAyLjQwMDYtNC4yNzU1IDQuOTU3M3YxLjU0ODNoNy4xMDIzdi0yLjEzMDd6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWx0ZXI9InVybCgjZmlsdGVyMTEzOSkiIG9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgzODcwOCIgZD0ibTIxLjY5IDIzLjg2OWMxLjkzMTktMS4zNzc5IDMuMDM5OC0yLjk2ODggMy4wMzk4LTQuNzAxNiAwLTEuOTg4Ny0xLjQyMDUtMy4xNjc3LTMuODA2OC0zLjE2NzctMS4yMDc0IDAtMi4zNzIyIDAuMjk4My0zLjM5NSAwLjg1MjI5bDAuNTUzOTggMS44NjA4YzAuOTM3NTEtMC40MjYxNCAxLjY0NzgtMC42MTA4MiAyLjMyOTYtMC42MTA4MiAxLjEyMjIgMCAxLjc2MTQgMC40OTcxOCAxLjc2MTQgMS4zOTIxIDAgMS4xMzY0LTAuOTk0MzUgMi40MDA2LTQuMjc1NSA0Ljk1NzN2MS41NDgzaDcuMTAyM3YtMi4xMzA3eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIuMzgwNDVweCIgc3R5bGU9ImZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbCIvPgogPHBhdGggaWQ9InBhdGgxMDM5IiBkPSJtNDQuOTM4IDQyLjYwOGMwLjk4MDQtMC41MDQxOSAxLjUxMjYtMS4yNjA1IDEuNTEyNi0yLjE1NjggMC0xLjQ3MDYtMS40MTQ2LTIuNDUxLTMuNTAxNC0yLjQ1MS0yLjIxMjkgMC0zLjY4MzUgMS4xOTA1LTMuNjgzNSAyLjk2OTIgMCAxLjA3ODQgMC41NDYyMSAxLjcyMjcgMS4yODg1IDIuMTcwOS0wLjk5NDQgMC40MjAxNy0xLjU1NDYgMS4xNzY1LTEuNTU0NiAyLjEyODkgMCAxLjYzODcgMS41NDA2IDIuNzMxMSAzLjg1MTcgMi43MzExIDIuMzUzIDAgMy45MjE1LTEuMjA0NSAzLjkyMTUtMy4wMjUyIDAtMS4yNzQ1LTAuODQwMzQtMS45MzI4LTEuODM0Ny0yLjM2Njl6bS0yLjA3MjgtMi41MzVjMC42NTgyNSAwIDEuMDkyNSAwLjMyMjEzIDEuMDkyNSAwLjgyNjM0IDAgMC41MDQxOS0wLjM2NDE0IDAuOTEwMzctMC45MjQzNiAxLjA1MDQtMC43MjgyOS0wLjI2NjEtMS4yNzQ1LTAuNTQ2MjEtMS4yNzQ1LTEuMDY0NCAwLTAuNDkwMiAwLjQzNDE2LTAuODEyMzEgMS4xMDY0LTAuODEyMzF6bTAuMTEyMDQgNS44NTQ0Yy0wLjg5NjM0IDAtMS40ODQ2LTAuNDM0MTYtMS40ODQ2LTEuMDc4NCAwLTAuNDYyMTggMC4yOTQxMi0wLjgyNjM0IDAuNzk4MzItMC45OTQ0IDEuMDUwNCAwLjMzNjEzIDEuOTg4OCAwLjU4ODIyIDEuOTg4OCAxLjI0NjUgMCAwLjQ5MDItMC41MzIyMSAwLjgyNjM0LTEuMzAyNSAwLjgyNjM0eiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjExNDMpIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjM3NTEycHgiIHN0eWxlPSJmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXBzOm5vcm1hbDtmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWwiLz4KIDxwYXRoIGlkPSJwYXRoMzg3MTEiIGQ9Im00NC45MzggNDIuNjA4YzAuOTgwNC0wLjUwNDE5IDEuNTEyNi0xLjI2MDUgMS41MTI2LTIuMTU2OCAwLTEuNDcwNi0xLjQxNDYtMi40NTEtMy41MDE0LTIuNDUxLTIuMjEyOSAwLTMuNjgzNSAxLjE5MDUtMy42ODM1IDIuOTY5MiAwIDEuMDc4NCAwLjU0NjIxIDEuNzIyNyAxLjI4ODUgMi4xNzA5LTAuOTk0NCAwLjQyMDE3LTEuNTU0NiAxLjE3NjUtMS41NTQ2IDIuMTI4OSAwIDEuNjM4NyAxLjU0MDYgMi43MzExIDMuODUxNyAyLjczMTEgMi4zNTMgMCAzLjkyMTUtMS4yMDQ1IDMuOTIxNS0zLjAyNTIgMC0xLjI3NDUtMC44NDAzNC0xLjkzMjgtMS44MzQ3LTIuMzY2OXptLTIuMDcyOC0yLjUzNWMwLjY1ODI1IDAgMS4wOTI1IDAuMzIyMTMgMS4wOTI1IDAuODI2MzQgMCAwLjUwNDE5LTAuMzY0MTQgMC45MTAzNy0wLjkyNDM2IDEuMDUwNC0wLjcyODI5LTAuMjY2MS0xLjI3NDUtMC41NDYyMS0xLjI3NDUtMS4wNjQ0IDAtMC40OTAyIDAuNDM0MTYtMC44MTIzMSAxLjEwNjQtMC44MTIzMXptMC4xMTIwNCA1Ljg1NDRjLTAuODk2MzQgMC0xLjQ4NDYtMC40MzQxNi0xLjQ4NDYtMS4wNzg0IDAtMC40NjIxOCAwLjI5NDEyLTAuODI2MzQgMC43OTgzMi0wLjk5NDQgMS4wNTA0IDAuMzM2MTMgMS45ODg4IDAuNTg4MjIgMS45ODg4IDEuMjQ2NSAwIDAuNDkwMi0wLjUzMjIxIDAuODI2MzQtMS4zMDI1IDAuODI2MzR6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zNzUxMnB4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDEwNDEiIGQ9Im0yNSA0My45MDhoLTEuMzQ0OHYtNS45MDg0aC0yLjM3NDhsLTQuNjIxIDUuOTA4NHYyLjE0NTloNC41MDY0djEuOTQ1NmgyLjQ4OTN2LTEuOTQ1NmgxLjM0NDh6bS02LjA4MDEtMC4wMjg2MiAyLjI0NjEtMi45MzI4djIuOTQ3MXoiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbHRlcj0idXJsKCNmaWx0ZXIxMTQ3KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+CiA8cGF0aCBpZD0icGF0aDM4NzE0IiBkPSJtMjUgNDMuOTA4aC0xLjM0NDh2LTUuOTA4NGgtMi4zNzQ4bC00LjYyMSA1LjkwODR2Mi4xNDU5aDQuNTA2NHYxLjk0NTZoMi40ODkzdi0xLjk0NTZoMS4zNDQ4em0tNi4wODAxLTAuMDI4NjIgMi4yNDYxLTIuOTMyOHYyLjk0NzF6IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4zODMxN3B4IiBzdHlsZT0iZm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"2048-ubuntu,2048\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"2048-qt.desktop\"\nLABEL oc.launch=\"2048-qt.2048-qt\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"2048-ubuntu\"\nLABEL oc.displayname=\"2048 (ubuntu qt)\"\nLABEL oc.path=\"/usr/games/2048-qt\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"2048-ubuntu\"\nENV APPBIN \"/usr/games/2048-qt\"\nENV APP \"/usr/games/2048-qt\"\nLABEL oc.containerengine=\"pod_application\"\nENV QT_X11_NO_MITSHM=1\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/2048-ubuntu/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/2048-ubuntu/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application 2048-ubuntu

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/2048-ubuntu.d\n
"},{"location":"applications/2048-ubuntu/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f 2048-ubuntu.d -t 2048-ubuntu .\n
"},{"location":"applications/2048-ubuntu/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect 2048-ubuntu > 2048-ubuntu.json\ndocker image save 2048-ubuntu -o 2048-ubuntu.tar\nctr -n k8s.io images import 2048-ubuntu.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @2048-ubuntu.json\n\n
"},{"location":"applications/2048/","title":"2048","text":""},{"location":"applications/2048/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk

"},{"location":"applications/2048/#use-ubuntu-package","title":"use ubuntu package","text":"

2048-qt

"},{"location":"applications/2048/#display-name","title":"Display name","text":"

\"2048\"

"},{"location":"applications/2048/#path","title":"path","text":"

\"/usr/games/2048-qt\"

"},{"location":"applications/apachedirectorystudio/","title":"apachedirectorystudio","text":""},{"location":"applications/apachedirectorystudio/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.22.04

"},{"location":"applications/apachedirectorystudio/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/apachedirectorystudio/#ubuntu-packages","title":"Ubuntu packages","text":"
openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java\n
"},{"location":"applications/apachedirectorystudio/#arguments","title":"Arguments","text":"

\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"

"},{"location":"applications/apachedirectorystudio/#displayname","title":"Displayname","text":"
Apache Directory Studio\n
"},{"location":"applications/apachedirectorystudio/#path","title":"Path","text":"
/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\n
"},{"location":"applications/apachedirectorystudio/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/apachedirectorystudio/#wm_class","title":"WM_CLASS","text":"
Apache Directory Studio.Apache Directory Studio\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/apachedirectorystudio/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\nRUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\nCOPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\n
"},{"location":"applications/apachedirectorystudio/#json-dump","title":"JSON dump","text":"

json source file apachedirectorystudio.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\",\n        \"RUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\",\n        \"COPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\"\n    ],\n    \"debpackage\": \"openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java\",\n    \"icon\": \"account.svg\",\n    \"args\": \"-configuration .eclipse/1988419495_linux_gtk_x86_64\",\n    \"installrecommends\": true,\n    \"keyword\": \"ldap\",\n    \"launch\": \"Apache Directory Studio.Apache Directory Studio\",\n    \"name\": \"apachedirectorystudio\",\n    \"displayname\": \"Apache Directory Studio\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.22.04\"\n}\n
"},{"location":"applications/apachedirectorystudio/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output apachedirectorystudio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/apachedirectorystudio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @apachedirectorystudio.d.3.0.json\n\n
"},{"location":"applications/apachedirectorystudio/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.22.04:$TAG\nUSER root\nRUN curl -sL --output /tmp/ApacheDirectoryStudio.tar.gz https://dlcdn.apache.org/directory/studio/2.0.0.v20210717-M17/ApacheDirectoryStudio-2.0.0.v20210717-M17-linux.gtk.x86_64.tar.gz && cd /usr/local && tar -xvf /tmp/ApacheDirectoryStudio.tar.gz && rm -rf /tmp/ApacheDirectoryStudio.tar.gz\nRUN mkdir /.ApacheDirectoryStudio && chmod 777 /.ApacheDirectoryStudio\nCOPY composer/init.d/init.ApacheDirectoryStudio /composer/init.d/\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y openjdk-11-jre libswt-gtk-4-jni libswt-webkit-gtk-4-jni libswt-cairo-gtk-4-jni libswt-gtk-4-java && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"account.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9Ii00NjIgNDYzIDM1IDM1IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IC00NjIgNDYzIDM1IDM1OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDojMDA3OEQ2O30NCjwvc3R5bGU+DQo8dGl0bGU+XzwvdGl0bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNLTQ0MS4yLDQ4NGMwLjksMC4zLDEuOCwwLjgsMi42LDEuNGMwLjgsMC42LDEuNCwxLjMsMiwyLjFjMC41LDAuOCwxLDEuNywxLjMsMi42YzAuMywxLDAuNCwxLjksMC40LDIuOWgtMS4zDQoJYzAtMS4xLTAuMi0yLjItMC42LTMuMmMtMC44LTItMi40LTMuNS00LjMtNC4zYy0xLjctMC43LTMuNi0wLjgtNS40LTAuM2MtMC43LDAuMi0xLjQsMC41LTIsMC44Yy0xLjIsMC43LTIuMiwxLjctMi45LDIuOQ0KCWMtMC43LDEuMy0xLjEsMi43LTEuMSw0LjJoLTEuM2MwLTIsMC42LTMuOSwxLjctNS41YzAuNi0wLjgsMS4yLTEuNSwyLTIuMWMwLjgtMC42LDEuNy0xLjEsMi42LTEuNGMtMS4xLTAuNi0yLTEuNC0yLjYtMi41DQoJYy0wLjMtMC41LTAuNS0xLjEtMC43LTEuN2MtMC40LTEuNS0wLjMtMy4xLDAuMy00LjVjMC43LTEuNiwyLTIuOSwzLjYtMy42YzEuNy0wLjcsMy42LTAuNyw1LjMsMGMxLjYsMC43LDIuOSwyLDMuNiwzLjYNCgljMC42LDEuNCwwLjcsMywwLjMsNC41Yy0wLjIsMC42LTAuNCwxLjEtMC43LDEuN2MtMC4zLDAuNS0wLjcsMS0xLjEsMS40Qy00NDAuMiw0ODMuMy00NDAuNyw0ODMuNy00NDEuMiw0ODR6IE0tNDUwLDQ3OA0KCWMwLDAuNywwLjEsMS41LDAuNCwyLjFjMC42LDEuMywxLjYsMi4zLDIuOSwyLjljMS40LDAuNiwyLjksMC42LDQuMiwwYzEuMy0wLjYsMi4zLTEuNiwyLjktMi45YzAuNi0xLjQsMC42LTIuOSwwLTQuMg0KCWMtMC42LTEuMy0xLjYtMi4zLTIuOS0yLjljLTEuNC0wLjYtMi45LTAuNi00LjIsMGMtMS4zLDAuNi0yLjMsMS42LTIuOSwyLjlDLTQ0OS45LDQ3Ni41LTQ1MCw0NzcuMy00NTAsNDc4eiIvPg0KPHBhdGggY2xhc3M9InN0MCIgZD0iTS00MzQuNSw0OTMuNWgtMi4zVjQ5M2MwLTEtMC4yLTIuMS0wLjYtMy4xYy0wLjctMS44LTIuMi0zLjMtNC4xLTQuMWMtMS42LTAuNy0zLjQtMC44LTUuMS0wLjMNCgljLTAuNiwwLjItMS4zLDAuNC0xLjksMC44Yy0xLjEsMC43LTIuMSwxLjYtMi44LDIuOGMtMC43LDEuMi0xLDIuNi0xLDMuOXYwLjVoLTIuM1Y0OTNjMC0yLjEsMC42LTQuMSwxLjgtNS44DQoJYzAuNi0wLjgsMS4zLTEuNiwyLjEtMi4yYzAuNi0wLjQsMS4yLTAuOCwxLjktMS4xYy0wLjMtMC4yLTAuNi0wLjQtMC44LTAuN2MtMC41LTAuNS0wLjktMS0xLjItMS41Yy0wLjMtMC41LTAuNi0xLjEtMC44LTEuNw0KCWMtMC40LTEuNi0wLjMtMy4zLDAuMy00LjhjMS42LTMuNyw1LjgtNS40LDkuNi0zLjljMS43LDAuNywzLjEsMi4xLDMuOSwzLjljMC42LDEuNSwwLjcsMy4yLDAuMyw0LjhjLTAuMiwwLjYtMC40LDEuMi0wLjgsMS44DQoJYy0wLjMsMC42LTAuNywxLjEtMS4yLDEuNWMtMC4yLDAuMi0wLjUsMC41LTAuOCwwLjdjMC43LDAuMywxLjMsMC42LDEuOSwxLjFjMC44LDAuNiwxLjUsMS40LDIuMSwyLjJjMC42LDAuOCwxLDEuOCwxLjMsMi43DQoJYzAuMywxLDAuNSwyLDAuNSwzLjFWNDkzLjV6IE0tNDM1LjksNDkyLjVoMC40YzAtMC44LTAuMi0xLjYtMC40LTIuM2MtMC4zLTAuOS0wLjctMS43LTEuMi0yLjVjLTAuNS0wLjgtMS4yLTEuNC0xLjktMg0KCWMtMC43LTAuNi0xLjYtMS0yLjUtMS4zbC0xLTAuNGwwLjktMC41YzAuNS0wLjMsMS0wLjYsMS40LTFjMC40LTAuNCwwLjctMC44LDEtMS4zYzAuMy0wLjUsMC41LTEsMC43LTEuNWMwLjQtMS40LDAuMy0yLjgtMC4zLTQuMg0KCWMtMS40LTMuMi01LjEtNC43LTguMy0zLjRjLTEuNSwwLjYtMi43LDEuOS0zLjQsMy40Yy0wLjMsMC44LTAuNSwxLjYtMC41LDIuNWMwLDAuNiwwLjEsMS4xLDAuMiwxLjdjMC4xLDAuNSwwLjMsMS4xLDAuNiwxLjYNCgljMC42LDEsMS40LDEuOCwyLjQsMi4zbDAuOSwwLjVsLTEsMC40Yy0wLjksMC4zLTEuNywwLjgtMi41LDEuNGMtMC43LDAuNi0xLjQsMS4yLTEuOSwyYy0xLDEuNC0xLjUsMy4xLTEuNiw0LjhoMC40DQoJYzAuMS0xLjQsMC41LTIuOCwxLjItNGMwLjctMS4zLDEuOC0yLjMsMy4xLTMuMWMwLjctMC40LDEuNC0wLjcsMi4xLTAuOWMxLjktMC41LDMuOS0wLjQsNS43LDAuNGMyLjEsMC44LDMuNywyLjUsNC42LDQuNg0KCUMtNDM2LjEsNDkwLjUtNDM1LjksNDkxLjUtNDM1LjksNDkyLjV6IE0tNDQ0LjUsNDgzLjljLTAuOCwwLTEuNi0wLjItMi4zLTAuNWMtMS40LTAuNi0yLjYtMS43LTMuMi0zLjFjLTAuNi0xLjUtMC42LTMuMSwwLTQuNg0KCWMwLjYtMS40LDEuNy0yLjUsMy4xLTMuMmMxLjUtMC42LDMuMS0wLjYsNC42LDBjMS40LDAuNiwyLjYsMS43LDMuMiwzLjJjMC42LDEuNSwwLjYsMy4xLDAsNC42Yy0wLjYsMS40LTEuNywyLjUtMy4xLDMuMQ0KCUMtNDQyLjksNDgzLjgtNDQzLjcsNDgzLjktNDQ0LjUsNDgzLjl6IE0tNDQ0LjUsNDczYy0wLjcsMC0xLjMsMC4xLTEuOSwwLjRjLTEuMiwwLjUtMi4xLDEuNS0yLjcsMi43Yy0wLjUsMS4yLTAuNSwyLjYsMCwzLjkNCgljMC41LDEuMiwxLjUsMi4xLDIuNywyLjdjMS4yLDAuNSwyLjYsMC41LDMuOSwwYzEuMi0wLjUsMi4xLTEuNSwyLjctMi43YzAuNS0xLjIsMC41LTIuNiwwLTMuOWMtMC41LTEuMi0xLjUtMi4xLTIuNy0yLjcNCglDLTQ0My4yLDQ3My4xLTQ0My44LDQ3My00NDQuNSw0NzN6Ii8+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNLTQ0NC41LDQ5N2MtOS4xLDAtMTYuNS03LjQtMTYuNi0xNi41YzAtOS4xLDcuNC0xNi41LDE2LjUtMTYuNmM5LjEsMCwxNi41LDcuNCwxNi42LDE2LjUNCglDLTQyOCw0ODkuNi00MzUuNCw0OTctNDQ0LjUsNDk3eiBNLTQ0NC41LDQ2NS44Yy04LjEsMC0xNC43LDYuNi0xNC43LDE0LjdzNi42LDE0LjcsMTQuNywxNC43czE0LjctNi42LDE0LjctMTQuN2MwLDAsMCwwLDAsMA0KCUMtNDI5LjksNDcyLjMtNDM2LjQsNDY1LjgtNDQ0LjUsNDY1LjhMLTQ0NC41LDQ2NS44eiIvPg0KPC9zdmc+DQo=\"\nLABEL oc.keyword=\"apachedirectorystudio,ldap\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"Apache Directory Studio.Apache Directory Studio\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.22.04\"\nENV ARGS=\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"\nLABEL oc.name=\"apachedirectorystudio\"\nLABEL oc.displayname=\"Apache Directory Studio\"\nLABEL oc.path=\"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"apachedirectorystudio\"\nENV APPBIN \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nLABEL oc.args=\"-configuration .eclipse/1988419495_linux_gtk_x86_64\"\nENV APP \"/usr/local/ApacheDirectoryStudio/ApacheDirectoryStudio\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/apachedirectorystudio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/apachedirectorystudio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application apachedirectorystudio

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/apachedirectorystudio.d\n
"},{"location":"applications/apachedirectorystudio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f apachedirectorystudio.d -t apachedirectorystudio .\n
"},{"location":"applications/apachedirectorystudio/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect apachedirectorystudio > apachedirectorystudio.json\ndocker image save apachedirectorystudio -o apachedirectorystudio.tar\nctr -n k8s.io images import apachedirectorystudio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @apachedirectorystudio.json\n\n
"},{"location":"applications/astromenace/","title":"astromenace","text":""},{"location":"applications/astromenace/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/astromenace/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/astromenace/#ubuntu-packages","title":"Ubuntu packages","text":"
astromenace\n
"},{"location":"applications/astromenace/#displayname","title":"Displayname","text":"
astromenace\n
"},{"location":"applications/astromenace/#path","title":"Path","text":"
/usr/games/AstroMenace\n
"},{"location":"applications/astromenace/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/astromenace/#wm_class","title":"WM_CLASS","text":"
Astromenace.Astromenace\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/astromenace/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/astromenace.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/astromenace/#json-dump","title":"JSON dump","text":"

json source file astromenace.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"astromenace\",\n    \"installrecommends\": true,\n    \"icon\": \"astromenace.svg\",\n    \"launch\": \"Astromenace.Astromenace\",\n    \"name\": \"astromenace\",\n    \"displayname\": \"astromenace\",\n    \"path\": \"/usr/games/AstroMenace\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"/usr/share/applications/astromenace.desktop\"\n}\n
"},{"location":"applications/astromenace/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output astromenace.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/astromenace.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @astromenace.d.3.0.json\n\n
"},{"location":"applications/astromenace/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y astromenace && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"astromenace.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmVyc2lvbj0iMS4xIj4KIDxyZWN0IHN0eWxlPSJvcGFjaXR5OjAuMiIgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB4PSIyIiB5PSIzIiByeD0iMS40IiByeT0iMS40Ii8+CiA8cmVjdCBzdHlsZT0iZmlsbDojMzQ1Nzg0IiB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHg9IjIiIHk9IjIiIHJ4PSIxLjQiIHJ5PSIxLjQiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0ibSAxNi44NzYxNDMsOS4wMDA4MTk3IGMgLTAuMDcyOTgsMC4wMDI0MSAtMC4xNDg0MDYsMC4wMDk4IC0wLjIyOTY4NywwLjAyMDc1NSAtMC45MTQxNjQsMC4xMjMyMTQ0IC0xLjE2NTA4OSwwLjM0NzAzNjEgLTEuNzI0MDIzLDEuNTM0MzEyMyAtMC4zNzY5OTksMC44MDA4MDcgLTAuNTY1NjAyLDAuODk4NTk4IC0xLjA1MTM2NywxLjAwNDI4OCAtMi4yNzA4OTksLTEuNjc0MDY3NiAtMi4yNzA4OTksMC44ODEyOTQgLTIuNzE3OTY5LDEuNTg5NjUgLTAuNjEyODEyLC0wLjU0NDA5NyAtMS40MDg2NjM4LC0xLjcyMDY0OCAtMi4xOTU2NDUxLC0yLjM3ODM5MiAtMC43MDM2MDg1LC0wLjU4ODA2MiAtMS40MDAxMjY3LC0wLjk0NDM1MDIgLTEuOTUyNDAyMiwtMC41NzMyIC0wLjQzNzY0MDgsMC4zMTA1NCAtMC44MDk0NzIsMC45NzY4MiAtMC45NDQ3MjY3LDIuNTA1NTM0IC0wLjE4NDc3OSwyLjA4ODQ1NCAwLjAwMTkzLDMuMjY0MjEzIDEuMzEyNTAwNCw0Ljk5Mzc5NSAxLjQ4MTk4NCwxLjk1NTc5NyAzLjY4OTk5MDYsMy45MTIyOTcgNy4xODU5MzY2LDYuMzY4MjkzIEMgMTYuMDczLDI1LjEyOTY0OCAxNy4zNDE5NjUsMjYgMTcuMzc5MjY4LDI2IGMgMC4yMDk2ODEsMCAtMi4wMjY2MzksLTIuOTM5NjMxIC0zLjM4MTA1NCwtNC40NDM4MzMgLTIuMDI0MTg1LC0yLjI0ODAzNyAtMi4zOTc3MDQsLTMuMDQ3NDMyIC0yLjQ0MTQ0NywtNC4wNTcwMDUgLTAuMDM5NSwtMC45MTIxMTYgMC4zNDYzNzksLTEuNTE2MzI0IDAuODYzNzEyLC0xLjUxNjMyNCAwLjE4Nzk4MywwIDEuMDM4NzksMC42NDYxOTQgMS45NzY5NTQsMS43MjMwMjMgMC43ODE4MjMsMC44NTQ5MDkgMS4yOTU4NjgsMi4wNTcxOCAxLjkyMDE2NSwyLjkzNzE3NSAxLjMyMjAzNCwxLjY3MDQ2NSAyLjg1NTE4MywxLjg4MzUxOCAzLjQyNDgwNCwwLjQ3NTkyOCAwLjU1MTc5NSwtMS4zNjk2NTYgMC4xOTE2NDMsLTMuNzc1MDg0IC0xLjA2OTc3NCwtNS40NTExNjkgLTAuMTQxOTE5LC0wLjYxMjk3MyAwLjEyNjM1MiwtMC43MDYyMzQgMC43NDY0ODQsLTAuNzA1NTg5IDAuNzg0MzksNy43OWUtNCAyLjI3NDA2NCwwLjUzOTY5MiAzLjE2OTE0MSwxLjMyNDE3NCAxLjEwNjExNCwwLjk2OTQ0MyAxLjI5MjUxLDAuOTY0ODgxIDIuNTIzODI4LDMuNDM2MTM2IDAuNzI2ODM0LDEuNDU4NzU2IDEuNDQ3NzM5LDIuODE5Mjg5IDEuNjAyMzQ0LDMuMDIyOTY4IDAuMjc1MzM2LDAuMzYyNzQ2IDAuMjgxMTIyLDAuMzYwNzM5IDAuMjg1NzQyLC0wLjA5MjY5IC0wLjIzMjM0NiwtMy43NzU3NjggLTEuNTI3MzYsLTcuMzY5MzY5IC00LjMyNzE0OSwtOS45NDgzMTcgQyAyMi4xOTk0MTksMTIuMjg1NTU1IDIwLjgwOTcxLDExLjI2MzY5IDE5LjU4NDU0MiwxMC40MzQxMzYgMTcuNzk5NTAzLDkuMjI1NDkyIDE3LjM4Njk4OSw4Ljk4Mzc1MTggMTYuODc2MTQzLDkuMDAwODE5NyBaIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojOGQ4MDY5IiBkPSJtIDE2Ljg3NjE0Myw4LjAwMDgxOTcgYyAtMC4wNzI5OCwwLjAwMjQxIC0wLjE0ODQwNiwwLjAwOTggLTAuMjI5Njg3LDAuMDIwNzU1IC0wLjkxNDE2NCwwLjEyMzIxNDQgLTEuMTY1MDg5LDAuMzQ3MDM2MSAtMS43MjQwMjMsMS41MzQzMTIyIC0wLjM3Njk5OSwwLjgwMDgwNzEgLTAuNTY1NjAyLDAuODk4NTk4MSAtMS4wNTEzNjcsMS4wMDQyODgxIC0yLjI3MDg5OSwtMS42NzQwNjc2IC0yLjI3MDg5OSwwLjg4MTI5NCAtMi43MTc5NjksMS41ODk2NSBDIDEwLjU0MDI4NSwxMS42MDU3MjggOS43NDQ0MzMyLDEwLjQyOTE3NyA4Ljk1NzQ1MTksOS43NzE0MzMzIDguMjUzODQzNCw5LjE4MzM3MDcgNy41NTczMjUyLDguODI3MDgyOCA3LjAwNTA0OTcsOS4xOTgyMzI3IDYuNTY3NDA4OSw5LjUwODc3MjggNi4xOTU1Nzc3LDEwLjE3NTA1MyA2LjA2MDMyMywxMS43MDM3NjcgYyAtMC4xODQ3NzksMi4wODg0NTQgMC4wMDE5MywzLjI2NDIxMyAxLjMxMjUwMDQsNC45OTM3OTUgMS40ODE5ODQsMS45NTU3OTcgMy42ODk5OTA2LDMuOTEyMjk3IDcuMTg1OTM2Niw2LjM2ODI5MyBDIDE2LjA3MywyNC4xMjk2NDggMTcuMzQxOTY1LDI1IDE3LjM3OTI2OCwyNSBjIDAuMjA5NjgxLDAgLTIuMDI2NjM5LC0yLjkzOTYzMSAtMy4zODEwNTQsLTQuNDQzODMzIC0yLjAyNDE4NSwtMi4yNDgwMzcgLTIuMzk3NzA0LC0zLjA0NzQzMiAtMi40NDE0NDcsLTQuMDU3MDA1IC0wLjAzOTUsLTAuOTEyMTE2IDAuMzQ2Mzc5LC0xLjUxNjMyNCAwLjg2MzcxMiwtMS41MTYzMjQgMC4xODc5ODMsMCAxLjAzODc5LDAuNjQ2MTk0IDEuOTc2OTU0LDEuNzIzMDIzIDAuNzgxODIzLDAuODU0OTA5IDEuMjk1ODY4LDIuMDU3MTggMS45MjAxNjUsMi45MzcxNzUgMS4zMjIwMzQsMS42NzA0NjUgMi44NTUxODMsMS44ODM1MTggMy40MjQ4MDQsMC40NzU5MjggMC41NTE3OTUsLTEuMzY5NjU2IDAuMTkxNjQzLC0zLjc3NTA4NCAtMS4wNjk3NzQsLTUuNDUxMTY5IC0wLjE0MTkxOSwtMC42MTI5NzMgMC4xMjYzNTIsLTAuNzA2MjM0IDAuNzQ2NDg0LC0wLjcwNTU4OSAwLjc4NDM5LDcuNzllLTQgMi4yNzQwNjQsMC41Mzk2OTIgMy4xNjkxNDEsMS4zMjQxNzQgMS4xMDYxMTQsMC45Njk0NDMgMS4yOTI1MSwwLjk2NDg4MSAyLjUyMzgyOCwzLjQzNjEzNiAwLjcyNjgzNCwxLjQ1ODc1NiAxLjQ0NzczOSwyLjgxOTI4OSAxLjYwMjM0NCwzLjAyMjk2OCAwLjI3NTMzNiwwLjM2Mjc0NiAwLjI4MTEyMiwwLjM2MDczOSAwLjI4NTc0MiwtMC4wOTI2OSAtMC4yMzIzNDYsLTMuNzc1NzY4IC0xLjUyNzM2LC03LjM2OTM2OSAtNC4zMjcxNDksLTkuOTQ4MzE3IEMgMjIuMTk5NDE5LDExLjI4NTU1NSAyMC44MDk3MSwxMC4yNjM2OSAxOS41ODQ1NDIsOS40MzQxMzU4IDE3Ljc5OTUwMyw4LjIyNTQ5MiAxNy4zODY5ODksNy45ODM3NTE4IDE2Ljg3NjE0Myw4LjAwMDgxOTcgWiIvPgogPGVsbGlwc2Ugc3R5bGU9Im9wYWNpdHk6MC4yIiBjeD0iMS4wMzciIGN5PSIyNS40OTciIHJ4PSIxLjQxOSIgcnk9IjIuMDU4IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQxODAzMjg2LC0wLjkwODQzMTkxLDAuNjY5MzU4NDMsMC43NDI5Mzk2MywwLDApIi8+CiA8ZWxsaXBzZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iMS43NjYiIGN5PSIyNS4wNDEiIHJ4PSIxLjQxOSIgcnk9IjIuMDU4IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQxODAzMjg2LC0wLjkwODQzMTkxLDAuNjY5MzU4NDMsMC43NDI5Mzk2MywwLDApIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmO29wYWNpdHk6MC4xIiBkPSJNIDMuNDAwMzkwNiAyIEMgMi42MjQ3OTA2IDIgMiAyLjYyNDc5MDYgMiAzLjQwMDM5MDYgTCAyIDQuNDAwMzkwNiBDIDIgMy42MjQ3OTA2IDIuNjI0NzkwNiAzIDMuNDAwMzkwNiAzIEwgMjguNTk5NjA5IDMgQyAyOS4zNzUyMDkgMyAzMCAzLjYyNDc5MDYgMzAgNC40MDAzOTA2IEwgMzAgMy40MDAzOTA2IEMgMzAgMi42MjQ3OTA2IDI5LjM3NTIwOSAyIDI4LjU5OTYwOSAyIEwgMy40MDAzOTA2IDIgeiIvPgogPHBhdGggc3R5bGU9ImZpbGw6I2ZmZmZmZjtvcGFjaXR5OjAuMSIgZD0iTSAxNi44NzY5NTMgOCBDIDE2LjgwMzk3MyA4LjAwMjQxIDE2LjcyNzc2NSA4LjAxMDUyOTQgMTYuNjQ2NDg0IDguMDIxNDg0NCBDIDE1LjczMjMyIDguMTQ0Njk4OCAxNS40ODA4MDkgOC4zNjkzNjQ1IDE0LjkyMTg3NSA5LjU1NjY0MDYgQyAxNC41NDQ4NzYgMTAuMzU3NDQ4IDE0LjM1Njg1OSAxMC40NTQ4NTcgMTMuODcxMDk0IDEwLjU2MDU0NyBDIDExLjYwMDE5NSA4Ljg4NjQ3OTMgMTEuNTk5NDE0IDExLjQ0MjAzNSAxMS4xNTIzNDQgMTIuMTUwMzkxIEMgMTAuNTM5NTMyIDExLjYwNjI5NCA5Ljc0NDAxMjYgMTAuNDI5MjI4IDguOTU3MDMxMiA5Ljc3MTQ4NDQgQyA4LjI1MzQyMjcgOS4xODM0MjE4IDcuNTU4MTM0OSA4LjgyNjExNTcgNy4wMDU4NTk0IDkuMTk3MjY1NiBDIDYuNTY4MjE4NiA5LjUwNzgwNTcgNi4xOTU4MDE2IDEwLjE3NDQxMSA2LjA2MDU0NjkgMTEuNzAzMTI1IEMgNi4wMDExNDQxIDEyLjM3NDUyMSA1Ljk4NjkxNiAxMi45NDcwNDggNi4wMjkyOTY5IDEzLjQ3ODUxNiBDIDYuMDM4NzQ5NyAxMy4yMjMzNzIgNi4wMzUyODU3IDEyLjk4ODYzNyA2LjA2MDU0NjkgMTIuNzAzMTI1IEMgNi4xOTU4MDE2IDExLjE3NDQxMSA2LjU2ODIxODYgMTAuNTA3ODA2IDcuMDA1ODU5NCAxMC4xOTcyNjYgQyA3LjU1ODEzNDkgOS44MjYxMTU0IDguMjUzNDIyOCAxMC4xODM0MjIgOC45NTcwMzEyIDEwLjc3MTQ4NCBDIDkuNzQ0MDEyNSAxMS40MjkyMjggMTAuNTM5NTMyIDEyLjYwNjI5NCAxMS4xNTIzNDQgMTMuMTUwMzkxIEMgMTEuNTk5NDE0IDEyLjQ0MjAzNSAxMS42MDAxOTUgOS44ODY0NzkzIDEzLjg3MTA5NCAxMS41NjA1NDcgQyAxNC4zNTY4NTkgMTEuNDU0ODU3IDE0LjU0NDg3NiAxMS4zNTc0NDggMTQuOTIxODc1IDEwLjU1NjY0MSBDIDE1LjQ4MDgwOSA5LjM2OTM2NDQgMTUuNzMyMzIgOS4xNDQ2OTg4IDE2LjY0NjQ4NCA5LjAyMTQ4NDQgQyAxNi43Mjc3NjUgOS4wMTA1Mjk0IDE2LjgwMzk3MyA5LjAwMjQxIDE2Ljg3Njk1MyA5IEMgMTcuMzg3Nzk5IDguOTgyOTMyMSAxNy43OTg5NDUgOS4yMjQ5NDk3IDE5LjU4Mzk4NCAxMC40MzM1OTQgQyAyMC44MDkxNTIgMTEuMjYzMTQ4IDIyLjIwMDIyOSAxMi4yODYxNTYgMjIuNjczODI4IDEyLjcwNTA3OCBDIDI1LjMwODgzNiAxNS4xMzIyNDIgMjYuNTk3NzEgMTguNDU5NTgzIDI2LjkzNTU0NyAyMS45OTAyMzQgQyAyNi45ODgzMDYgMjIuMDA4NDUxIDI2Ljk5NzM3MiAyMS45MTAyMzMgMjcgMjEuNjUyMzQ0IEMgMjYuNzY3NjU0IDE3Ljg3NjU3NiAyNS40NzM2MTcgMTQuMjg0MDI2IDIyLjY3MzgyOCAxMS43MDUwNzggQyAyMi4yMDAyMjkgMTEuMjg2MTU2IDIwLjgwOTE1MiAxMC4yNjMxNDggMTkuNTgzOTg0IDkuNDMzNTkzOCBDIDE3Ljc5ODk0NSA4LjIyNDk0OTkgMTcuMzg3Nzk5IDcuOTgyOTMyMSAxNi44NzY5NTMgOCB6IE0gMTguOTA4MjAzIDE1LjAyOTI5NyBDIDE4LjY3Njk3NyAxNS4xMDcxNjggMTguNTgwODI0IDE1LjI3NDcwMiAxOC42NzE4NzUgMTUuNjY3OTY5IEMgMTkuNDMzNTU1IDE2LjY4MDAzNyAxOS44NjA3ODIgMTcuOTU2MDIgMTkuOTYyODkxIDE5LjExMTMyOCBDIDIwLjA3OTg4NiAxNy44NjgyMTQgMTkuNzI1MDk2IDE2LjI5ODUzMiAxOC45MDgyMDMgMTUuMDI5Mjk3IHogTSAxMS42MTEzMjggMTYuODUxNTYyIEMgMTEuNTY4MTA2IDE3LjA0MzYzMyAxMS41NDYyMzkgMTcuMjU5ODE5IDExLjU1NjY0MSAxNy41IEMgMTEuNjAwMzg0IDE4LjUwOTU3MyAxMS45NzM4NjIgMTkuMzA4NjA0IDEzLjk5ODA0NyAyMS41NTY2NDEgQyAxNC42MjU0ODEgMjIuMjUzNDY0IDE1LjQzMjMxMyAyMy4yNDg5ODMgMTYuMTA3NDIyIDI0LjEyNjk1MyBDIDE2LjUzNDg4NiAyNC40MTg5NzYgMTcuMzYyMDgxIDI1IDE3LjM3ODkwNiAyNSBDIDE3LjU4ODU4NyAyNSAxNS4zNTI0NjIgMjIuMDYwODQzIDEzLjk5ODA0NyAyMC41NTY2NDEgQyAxMi4yMTM1NzkgMTguNTc0ODMgMTEuNzM1MDggMTcuNzE4MTk5IDExLjYxMTMyOCAxNi44NTE1NjIgeiIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"astromenace\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"astromenace.desktop\"\nLABEL oc.launch=\"Astromenace.Astromenace\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"astromenace\"\nLABEL oc.displayname=\"astromenace\"\nLABEL oc.path=\"/usr/games/AstroMenace\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"astromenace\"\nENV APPBIN \"/usr/games/AstroMenace\"\nENV APP \"/usr/games/AstroMenace\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/astromenace/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/astromenace/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application astromenace

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/astromenace.d\n
"},{"location":"applications/astromenace/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f astromenace.d -t astromenace .\n
"},{"location":"applications/astromenace/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect astromenace > astromenace.json\ndocker image save astromenace -o astromenace.tar\nctr -n k8s.io images import astromenace.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @astromenace.json\n\n
"},{"location":"applications/atom/","title":"Atom","text":""},{"location":"applications/atom/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk

"},{"location":"applications/atom/#use-ubuntu-package","title":"use ubuntu package","text":"

libxss1 atom aspell

"},{"location":"applications/atom/#arguments","title":"Arguments","text":"

\"-f\"

"},{"location":"applications/atom/#display-name","title":"Display name","text":"

\"Atom\"

"},{"location":"applications/atom/#path","title":"path","text":"

\"/usr/bin/atom\"

"},{"location":"applications/atom/#pre-run-command","title":"Pre run command","text":"
\nRUN apt-get update && apt-get install  --no-install-recommends --yes wget && apt-get clean,RUN apt-get update && apt-get install                          --yes libxss1 && apt-get clean,RUN wget -qO - https://packagecloud.io/AtomEditor/atom/gpgkey | apt-key add -,RUN echo \"deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main\" > /etc/apt/sources.list.d/atom.list,RUN apt-get update && apt-get install  --no-install-recommends --yes $(apt-cache search aspell- | awk '{print $1 }') && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/base/","title":"base","text":""},{"location":"applications/base/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.libreoffice

"},{"location":"applications/base/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/base/#alpine-packages","title":"Alpine packages","text":"
libreoffice-gnome\n
"},{"location":"applications/base/#arguments","title":"Arguments","text":"

\"--base\"

"},{"location":"applications/base/#displayname","title":"Displayname","text":"
Base\n
"},{"location":"applications/base/#path","title":"Path","text":"
/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/base/#uniquerunkey","title":"uniquerunkey","text":"

\"libreoffice\"

"},{"location":"applications/base/#mimetype","title":"Mimetype","text":"
application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\n
"},{"location":"applications/base/#file-extensions","title":"File extensions","text":"

\"odb\"

"},{"location":"applications/base/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"odb\"

"},{"location":"applications/base/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/base/#wm_class","title":"WM_CLASS","text":"
libreoffice.libreoffice-base\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/base/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/libreoffice-base.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/base/#json-dump","title":"JSON dump","text":"

json source file base.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_base.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-base\",\n    \"name\": \"base\",\n    \"displayname\": \"Base\",\n    \"args\": \"--base\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\",\n    \"fileextensions\": \"odb\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"legacyfileextensions\": \"odb\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-base.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/base/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output base.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/base.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @base.d.3.0.json\n\n
"},{"location":"applications/base/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_base.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzk1MGJhOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjNTU3YmMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjciIHkyPSI1NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjhkMmZjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0NS41MDEiIHgyPSI0NS41MDEiIHkxPSI3LjEwNTUiIHkyPSIyOS44OTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlZWJmNyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2U3ZjkiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzUiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImQiIGN4PSIzOC4wNjYiIGN5PSIyNi4xOTIiIHI9IjI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0uOCAzZS04IC0xLjkyNjVlLTggLS45NDAzNCA4MC40NTMgMzguNjI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWUzNTNjIiBzdG9wLW9wYWNpdHk9Ii40ODUzOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxOTE5MTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI1MjUuNDQiIHgyPSI1MTYuNjYiIHkxPSI4MzYuMTkiIHkyPSI4MjguNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc4OTMgMCAwIDEuMDAwNyAtMTcxLjQxIC03NDApIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZGM4NWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2YyY2JmOCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImoiIHgxPSI1MjUuNDQiIHgyPSI1MTYuNjYiIHkxPSI4MzYuMTkiIHkyPSI4MjguNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc4OTMgMCAwIDEuMDAwNyA3NTUuNiAtMTY5OC43KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iNTI1LjQ0IiB4Mj0iNTE2LjY2IiB5MT0iODM2LjE5IiB5Mj0iODI4LjUiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyNS41IC0xNzAyLjUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSI1MjAuNTkiIHgyPSI1MTYuMTUiIHkxPSI3MzUuMDUiIHkyPSI3MjAuODYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxmaWx0ZXIgaWQ9Im0iIHg9Ii0uMDU4MTA4IiB5PSItLjA2MjAxNyIgd2lkdGg9IjEuMTE2MiIgaGVpZ2h0PSIxLjEyNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC41NDYyMzg3NCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8ZyBzdHJva2Utd2lkdGg9Ii44MzM1MiI+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xOTkyIDAgMCAxLjIwMDIgLTM4MC41MyAtNzEuNjU2KSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsdGVyPSJ1cmwoI20pIiBvcGFjaXR5PSIuMjUiIHN0cm9rZT0iIzAwMCI+CiAgIDxwYXRoIGQ9Im0zMzIuNzQgOTAuMTA1djQuMDAyOWMwIDEuOTM0NCA1LjA0MDIgMy41MDI2IDExLjI1OCAzLjUwMjYgNi4yMTc0IDAgMTEuMjU4LTEuNTY4MSAxMS4yNTgtMy41MDI2di00LjAwMjl6IiBjb2xvcj0iIzAwMDAwMCIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTI3IDk1My45OSkiPgogICAgPHBhdGggZD0ibTEyNTkuNy04NjguNTd2NC4wMDNjMCAxLjkzNDQgNS4wNDAyIDMuNTAyNSAxMS4yNTggMy41MDI1IDYuMjE3NCAwIDExLjI1OC0xLjU2ODEgMTEuMjU4LTMuNTAyNXYtNC4wMDN6IiBjb2xvcj0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIuODMzNTIiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KC45Nzg5MyAwIDAgMS4wMDA3IDg3OC40NSAuMzc3NTQpIj4KICAgICA8cGF0aCBkPSJtMzg5LjUtODcyLjk2djRjMCAxLjkzMyA1LjE0ODcgMy41IDExLjUgMy41czExLjUtMS41NjcgMTEuNS0zLjV2LTR6IiBjb2xvcj0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIuODQyMTQiLz4KICAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguNTEyNTQgMCAwIC42MTUzOCAxMzQuNjQgLTEzMjMuMikiIGN4PSI1MTkuNjkiIGN5PSI3MzAuMzEiIHJ4PSIyMi40MzgiIHJ5PSI1LjY4NzUiIGNvbG9yPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNDk5NSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTk5MiAwIDAgMS4yMDAyIC0zODAuNTMgLTcxLjY1NikiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIHN0cm9rZT0iIzhlMDNhMyI+CiAgIDxwYXRoIGQ9Im0zMzIuNzQgOTAuMTA1djQuMDAyOWMwIDEuOTM0NCA1LjA0MDIgMy41MDI2IDExLjI1OCAzLjUwMjYgNi4yMTc0IDAgMTEuMjU4LTEuNTY4MSAxMS4yNTgtMy41MDI2di00LjAwMjl6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNsKSIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTI3IDk1My45OSkiPgogICAgPHBhdGggZD0ibTEyNTkuNy04NjguNTd2NC4wMDNjMCAxLjkzNDQgNS4wNDAyIDMuNTAyNSAxMS4yNTggMy41MDI1IDYuMjE3NCAwIDExLjI1OC0xLjU2ODEgMTEuMjU4LTMuNTAyNXYtNC4wMDN6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNqKSIgc3Ryb2tlLXdpZHRoPSIuODMzNTIiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KC45Nzg5MyAwIDAgMS4wMDA3IDg3OC40NSAuMzc3NTQpIj4KICAgICA8cGF0aCBkPSJtMzg5LjUtODcyLjk2djRjMCAxLjkzMyA1LjE0ODcgMy41IDExLjUgMy41czExLjUtMS41NjcgMTEuNS0zLjV2LTR6IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0idXJsKCNpKSIgc3Ryb2tlLXdpZHRoPSIuODQyMTQiLz4KICAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguNTEyNTQgMCAwIC42MTUzOCAxMzQuNjQgLTEzMjMuMikiIGN4PSI1MTkuNjkiIGN5PSI3MzAuMzEiIHJ4PSIyMi40MzgiIHJ5PSI1LjY4NzUiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2gpIiBzdHJva2Utd2lkdGg9IjEuNDk5NSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"base,libreoffice,office\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"libreoffice-base.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-base\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--base\"\nLABEL oc.name=\"base\"\nLABEL oc.displayname=\"Base\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.database;application/vnd.sun.xml.base;\"\nLABEL oc.fileextensions=\"odb\"\nLABEL oc.legacyfileextensions=\"odb\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"base\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--base\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/base/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/base/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application base

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/base.d\n
"},{"location":"applications/base/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f base.d -t base .\n
"},{"location":"applications/base/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect base > base.json\ndocker image save base -o base.tar\nctr -n k8s.io images import base.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @base.json\n\n
"},{"location":"applications/beekeeperstudio/","title":"beekeeperstudio","text":""},{"location":"applications/beekeeperstudio/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/beekeeperstudio/#arguments","title":"Arguments","text":"

\"--no-sandbox\"

"},{"location":"applications/beekeeperstudio/#displayname","title":"Displayname","text":"
Beekeeper-studio\n
"},{"location":"applications/beekeeperstudio/#path","title":"Path","text":"
/opt/Beekeeper-Studio/beekeeper-studio\n
"},{"location":"applications/beekeeperstudio/#file-extensions","title":"File extensions","text":"

\"sql\"

"},{"location":"applications/beekeeperstudio/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"sql\"

"},{"location":"applications/beekeeperstudio/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/beekeeperstudio/#wm_class","title":"WM_CLASS","text":"
beekeeper-studio.beekeeper-studio\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/beekeeperstudio/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/beekeeper-studio.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/beekeeperstudio/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install  --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 && apt-get clean\nRUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\nRUN echo \"deb https://deb.beekeeperstudio.io stable main\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\nRUN apt-get update && apt-get install  --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\nRUN mv \"/opt/Beekeeper Studio/\" /opt/Beekeeper-Studio\nENV ELECTRON_ENABLE_LOGGING=true\nENV QT_X11_NO_MITSHM=1\n
"},{"location":"applications/beekeeperstudio/#json-dump","title":"JSON dump","text":"

json source file beekeeperstudio.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 && apt-get clean\",\n        \"RUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\",\n        \"RUN echo \\\"deb https://deb.beekeeperstudio.io stable main\\\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\",\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\",\n        \"RUN mv \\\"/opt/Beekeeper Studio/\\\" /opt/Beekeeper-Studio\",\n        \"ENV ELECTRON_ENABLE_LOGGING=true\",\n        \"ENV QT_X11_NO_MITSHM=1\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"beekeeper-studio.svg\",\n    \"keyword\": \"database,sql,mysql,postgres,sqllite,db,sqlserver,query,editor\",\n    \"launch\": \"beekeeper-studio.beekeeper-studio\",\n    \"name\": \"beekeeperstudio\",\n    \"displayname\": \"Beekeeper-studio\",\n    \"installrecommends\": false,\n    \"forceconfold\": true,\n    \"host_config\": {\n        \"shm_size\": \"2G\",\n        \"ipc_mode\": \"shareable\"\n    },\n    \"args\": \"--no-sandbox\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/opt/Beekeeper-Studio/beekeeper-studio\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"legacyfileextensions\": \"sql\",\n    \"fileextensions\": \"sql\",\n    \"desktopfile\": \"/usr/share/applications/beekeeper-studio.desktop\",\n    \"usedefaultapplication\": false\n}\n
"},{"location":"applications/beekeeperstudio/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output beekeeperstudio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/beekeeperstudio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @beekeeperstudio.d.3.0.json\n\n
"},{"location":"applications/beekeeperstudio/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 && apt-get clean\nRUN curl -Ls https://deb.beekeeperstudio.io/beekeeper.key | apt-key add -\nRUN echo \"deb https://deb.beekeeperstudio.io stable main\" | tee /etc/apt/sources.list.d/beekeeper-studio-app.list\nRUN apt-get update && apt-get install  --no-install-recommends --yes beekeeper-studio libxshmfence1 && apt-get clean\nRUN mv \"/opt/Beekeeper Studio/\" /opt/Beekeeper-Studio\nENV ELECTRON_ENABLE_LOGGING=true\nENV QT_X11_NO_MITSHM=1\nLABEL oc.icon=\"beekeeper-studio.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDEzMi44IDE0Ni4yIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxMzIuOCAxNDYuMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGQUQ4M0I7fQo8L3N0eWxlPgo8Zz4KCTxnPgoJCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMjEuMywyOC4yTDc3LjcsMy4xQzcwLjYtMSw2MS45LTEsNTQuOSwzLjFMNDMuNSw5LjdWMzl2Ni43djI3LjVjMCw4LjEsNC4zLDE1LjcsMTEuNCwxOS44CgkJCWMzLjUsMiw3LjUsMy4xLDExLjQsMy4xczcuOS0xLDExLjQtMy4xbDAsMGM3LjEtNC4xLDExLjQtMTEuNiwxMS40LTE5LjhjMC04LjEtNC4zLTE1LjctMTEuNC0xOS44bDAsMGMtMy41LTItNy41LTMuMS0xMS40LTMuMQoJCQlWMzZjMy45LDAsNy45LDEsMTEuNCwzLjFsMTIuNCw3LjJjNy4xLDQuMSwxMS40LDExLjYsMTEuNCwxOS44djE0LjNjMCw4LjEtNC4zLDE1LjctMTEuNCwxOS44bC0xMi40LDcuMmMtMy41LDItNy41LDMuMS0xMS40LDMuMQoJCQlzLTcuOS0xLTExLjQtMy4xbC0xMi40LTcuMmMtNy4xLTQuMS0xMS40LTExLjYtMTEuNC0xOS44di03LjJWNjZWNDcuNVYxNi44TDExLjQsMjguMkM0LjMsMzIuMywwLDM5LjgsMCw0OHY1MC4zCgkJCWMwLDguMSw0LjMsMTUuNywxMS40LDE5LjhMNTUsMTQzLjJjNy4xLDQuMSwxNS44LDQuMSwyMi44LDBsNDMuNi0yNS4xYzcuMS00LjEsMTEuNC0xMS42LDExLjQtMTkuOFY0OAoJCQlDMTMyLjcsMzkuOCwxMjguMywzMi4zLDEyMS4zLDI4LjJ6IE01Mi4zLDU1LjJjLTEuMywxLTIuNCwyLjEtMy40LDMuM3YtMTZsMy40LTJWNTUuMnogTTYxLDUxYy0xLjIsMC4zLTIuMywwLjYtMy40LDEuMVYzNy43CgkJCWMxLjEtMC41LDIuMy0wLjgsMy40LTEuMVY1MXoiLz4KCTwvZz4KPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"beekeeperstudio,database,sql,mysql,postgres,sqllite,db,sqlserver,query,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"beekeeper-studio.desktop\"\nLABEL oc.launch=\"beekeeper-studio.beekeeper-studio\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--no-sandbox\"\nLABEL oc.name=\"beekeeperstudio\"\nLABEL oc.displayname=\"Beekeeper-studio\"\nLABEL oc.path=\"/opt/Beekeeper-Studio/beekeeper-studio\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"sql\"\nLABEL oc.legacyfileextensions=\"sql\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"shm_size\\\":\\\"2G\\\",\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"beekeeperstudio\"\nENV APPBIN \"/opt/Beekeeper-Studio/beekeeper-studio\"\nLABEL oc.args=\"--no-sandbox\"\nENV APP \"/opt/Beekeeper-Studio/beekeeper-studio\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/beekeeperstudio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/beekeeperstudio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application beekeeperstudio

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/beekeeperstudio.d\n
"},{"location":"applications/beekeeperstudio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f beekeeperstudio.d -t beekeeperstudio .\n
"},{"location":"applications/beekeeperstudio/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect beekeeperstudio > beekeeperstudio.json\ndocker image save beekeeperstudio -o beekeeperstudio.tar\nctr -n k8s.io images import beekeeperstudio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @beekeeperstudio.json\n\n
"},{"location":"applications/blender/","title":"blender","text":""},{"location":"applications/blender/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/blender/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/blender/#alpine-packages","title":"Alpine packages","text":"
blender mesa-dri-gallium\n
"},{"location":"applications/blender/#displayname","title":"Displayname","text":"
Blender\n
"},{"location":"applications/blender/#path","title":"Path","text":"
/usr/bin/blender\n
"},{"location":"applications/blender/#mimetype","title":"Mimetype","text":"
application/x-blender\n
"},{"location":"applications/blender/#file-extensions","title":"File extensions","text":"

\"blend,obj,fbx,3ds,ply,stl\"

"},{"location":"applications/blender/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/blender/#wm_class","title":"WM_CLASS","text":"
Blender.Blender\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/blender/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/blender.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/blender/#json-dump","title":"JSON dump","text":"

json source file blender.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,graphics\",\n    \"apkpackage\": \"blender mesa-dri-gallium\",\n    \"icon\": \"circle_blender.svg\",\n    \"keyword\": \"blender,modeler\",\n    \"launch\": \"Blender.Blender\",\n    \"name\": \"blender\",\n    \"displayname\": \"Blender\",\n    \"path\": \"/usr/bin/blender\",\n    \"mimetype\": \"application/x-blender\",\n    \"fileextensions\": \"blend,obj,fbx,3ds,ply,stl\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/blender.desktop\"\n}\n
"},{"location":"applications/blender/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output blender.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blender.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blender.d.3.0.json\n\n
"},{"location":"applications/blender/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update blender mesa-dri-gallium\nLABEL oc.icon=\"circle_blender.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMDEuODEiIHgyPSIxMDEuODEiIHkxPSItMTYuNTc4IiB5Mj0iMjQyLjcyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQuNzgxMiAwIDAgNC43ODEyIDMzLjg3NSA2Mi4yMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYmI1MjEiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjE1ZjE5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjUyMCIgeDI9IjUyMCIgeTE9IjMyLjM2MiIgeTI9IjEwNTIuNCIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg1LjQzNzIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI1MjAiIHgyPSI1MjAiIHkxPSIyNTIuMzYiIHkyPSI3MTIuMzYiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc1Ljk5MyAtMTIyLjk5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTk3Y2YxIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIxYzlmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSI2Ny4wMjQiIHgyPSIxMDIuOTEiIHkxPSIyODMuOTEiIHkyPSI1ODEuNzYiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDQuNjQxIDIuNjc5NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlOGViZWMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmRmZWZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2MzI0IiB5PSItLjAzNTY4MiIgd2lkdGg9IjEuMDcyNiIgaGVpZ2h0PSIxLjA3MTQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjExLjYyMzYzNyIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4zNDM3NDkiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjI3NDUgMCAwIC4wNjI3NDUgLS4xMjU0OSA5ODYuNDYpIiBzdHJva2Utd2lkdGg9IjE1LjkzOCI+CiAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU0MC4zNiIgcj0iNDc4LjEyIiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2YpIiBvcGFjaXR5PSIuMjUiLz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSI0NzguMTIiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMTApIiBmaWxsPSIjMTQxNDE0IiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9IjI1NCI+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSgtMzApIiBjeD0iMTY4LjU4IiBjeT0iNDYwLjI1IiByeD0iMTgzLjMxIiByeT0iMTYwLjE5IiBvcGFjaXR5PSIxIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICAgPGNpcmNsZSBjeD0iNTEyLjAxIiBjeT0iNTQ1Ljg1IiByPSIzODQiIG9wYWNpdHk9IjEiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiAgICA8Y2lyY2xlIGN4PSI0MDEuMzIiIGN5PSIzNDYuNzUiIHI9IjEyOCIgb3BhY2l0eT0iMSIgc3Ryb2tlPSIjZjBmMGYwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjE3LjY3NSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPC9nPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjkzOCI+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSgtMzApIiBjeD0iMTY4LjU4IiBjeT0iNDYwLjI1IiByeD0iMTgzLjMxIiByeT0iMTYwLjE5IiBmaWxsPSJ1cmwoI2MpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICAgPGNpcmNsZSBjeD0iNTEyLjAxIiBjeT0iNTQ1Ljg1IiByPSIzODQiIGZpbGw9InVybCgjZSkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiAgICA8Y2lyY2xlIGN4PSI0NDEuMzIiIGN5PSI0MjYuNzUiIHI9IjEyOCIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlPSIjZjBmMGYwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjE3LjY3NSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"blender,blender,modeler\"\nLABEL oc.cat=\"utilities,graphics\"\nLABEL oc.desktopfile=\"blender.desktop\"\nLABEL oc.launch=\"Blender.Blender\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"blender\"\nLABEL oc.displayname=\"Blender\"\nLABEL oc.path=\"/usr/bin/blender\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-blender\"\nLABEL oc.fileextensions=\"blend,obj,fbx,3ds,ply,stl\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"blender\"\nENV APPBIN \"/usr/bin/blender\"\nENV APP \"/usr/bin/blender\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/blender/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/blender/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application blender

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blender.d\n
"},{"location":"applications/blender/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f blender.d -t blender .\n
"},{"location":"applications/blender/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect blender > blender.json\ndocker image save blender -o blender.tar\nctr -n k8s.io images import blender.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blender.json\n\n
"},{"location":"applications/bless/","title":"Bless","text":""},{"location":"applications/bless/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/bless/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/bless/#ubuntu-packages","title":"Ubuntu packages","text":"
bless\n
"},{"location":"applications/bless/#path","title":"Path","text":"
/usr/bin/bless\n
"},{"location":"applications/bless/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/bless/#wm_class","title":"WM_CLASS","text":"
bless.Bless\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/bless/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/bless.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/bless/#json-dump","title":"JSON dump","text":"

json source file bless.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"debpackage\": \"bless\",\n    \"icon\": \"circle_bless.svg\",\n    \"keyword\": \"hexa,decimal\",\n    \"launch\": \"bless.Bless\",\n    \"name\": \"Bless\",\n    \"path\": \"/usr/bin/bless\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/bless.desktop\"\n}\n
"},{"location":"applications/bless/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output bless.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/bless.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @bless.d.3.0.json\n\n
"},{"location":"applications/bless/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends bless && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_bless.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYmciIHgxPSIyNS4wMDQiIHgyPSIyNS4wMDQiIHkxPSI1LjIxNTgiIHkyPSI0NS4xMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyAuNjk1NjUgLjY5NTY1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYzdjN2M3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y2ZjZmNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMTgyIiB4PSItLjEyMjczIiB5PSItLjA5NjQyOSIgd2lkdGg9IjEuMjQ1NSIgaGVpZ2h0PSIxLjE5MjkiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTI1MDAwMSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjEzOTkiIHg9Ii0uMDI3IiB5PSItLjAyNyIgd2lkdGg9IjEuMDU0IiBoZWlnaHQ9IjEuMDU0IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjUxNzUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50ODg4IiB4MT0iMjEuNTE3IiB4Mj0iNDkuMTUzIiB5MT0iMzguMjE2IiB5Mj0iMzguMjE2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTNmNDciIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3NTUyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk3MCIgeD0iLS4wNTQ5NzIiIHk9Ii0uMTE3OTkiIHdpZHRoPSIxLjEwOTkiIGhlaWdodD0iMS4yMzYiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzI2MzkzNyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5ODAiIHgxPSIzNS41MzUiIHgyPSIyNS44NSIgeTE9IjIwLjgwMyIgeTI9IjE0Ljc0OSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjODc4Nzg3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg3ODc4NyIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyAuNjk1NjUgLjY5NTY1KSIgY3g9IjI0IiBjeT0iMjQuNzY3IiByPSIyMyIgZmlsbD0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEzOTkpIiBvcGFjaXR5PSIuMTUiLz4KIDxjaXJjbGUgY3g9IjMxLjk5OSIgY3k9IjMxLjk5OSIgcj0iMjkuOTk5IiBmaWxsPSJ1cmwoI2JnKSIgc3Ryb2tlLXdpZHRoPSIxLjMwNDMiLz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuNDU0NSAwIDAgMS40NTQ1IC0zLjIxMDMgLTEuNzgzNCkiIGQ9Im0xOCAxMGMwIDUgMiA4IDYgMTFsLTkgMWMwIDIuMjE2IDEuNzg0IDQgNCA0aDF2LTNoM3YyaC0xdjFoM2wtNyA4LjVjLTAuMDAyMiAxLjkzMyAxLjU2NyAzLjUwMiAzLjUgMy41IDAuOTI3MDItOS43ZS00IDEuODQ2MS0wLjM0Mjg3IDIuNS0xbDEyLTEyYzAuNjU3MTItMC42NTM4NyAwLjk5ODk1LTEuNTczIDEtMi41IDAuMDAyMi0xLjkzMy0xLjU2Ny0zLjUwMi0zLjUtMy41LTAuNjE0OTcgNi40M2UtNCAtMS4yMjQ5IDAuMTU0MDUtMS43NTc4IDAuNDQ3Mjd6IiBmaWx0ZXI9InVybCgjZmlsdGVyMTE4MikiIG9wYWNpdHk9Ii4xIi8+CiA8cGF0aCBkPSJtMTcuMTUzIDI3LjMwN3YxLjQ1NDVjMCAzLjIyMzIgMi41OTQ5IDUuODE4MSA1LjgxODEgNS44MTgxaDEuNDU0NXYtNC4zNjM2aDQuMzYzNmMwLjgwNTgxIDAgMS40NTQ1IDAuNjQ4NzIgMS40NTQ1IDEuNDU0NXMtMC42NDg3MiAxLjQ1NDUtMS40NTQ1IDEuNDU0NWgtMS40NTQ1djEuNDU0NWgxMS42MzZsNS44MTgxLTcuMjcyNnoiIGZpbGw9IiNmMmYyZjIiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjkuODc3IDI3LjMwN2MwLjU3MzIgMC40ODc0MyAxLjE3NjQgMC45NzEwNiAxLjgyMTEgMS40NTQ1bDcuNzc4NCA1LjE4NDcgNC42NTA2LTYuNjM5MnoiIGZpbHRlcj0idXJsKCNmaWx0ZXI5NzApIiBvcGFjaXR5PSIuMSIgc3Ryb2tlLXdpZHRoPSIxLjQ1NDUiLz4KIDxwYXRoIGQ9Im0yMS41MTcgMTEuMzA3IDIzLjI3MiAxNi01LjgxODEgNS44MTgxLTguNzI3Mi01LjgxODFjLTUuODE4MS00LjM2MzYtOC43MjcyLTguNzI3Mi04LjcyNzItMTZ6IiBmaWxsPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNDU0NSIvPgogPHBhdGggZD0ibTQ0LjA2MiAyNC4zOThjLTEuMzQ4NCAwLjAwMTQtMi42ODUyIDAuNDk4NzEtMy42MzYzIDEuNDU0NWwtMTcuNDU0IDE3LjQ1NGMtMC45NTU4IDAuOTUxMTQtMS40NTMgMi4yODgtMS40NTQ1IDMuNjM2My0wLjAwMzIgMi44MTE2IDIuMjc5MiA1LjA5MzggNS4wOTA4IDUuMDkwOCAxLjM0ODQtMC4wMDE0IDIuNjg1Mi0wLjQ5ODcxIDMuNjM2My0xLjQ1NDVsMTcuNDU0LTE3LjQ1NGMwLjk1NTgtMC45NTEwNyAxLjQ1My0yLjI4OCAxLjQ1NDUtMy42MzYzIDAuMDAzMi0yLjgxMTYtMi4yNzkyLTUuMDkzOC01LjA5MDgtNS4wOTA4eiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg4OCkiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjcuMzM1IDQxLjg1Mi0wLjcyNzI2IDAuNzI3MjYgMS4wOTA5IDEuMDkwOS0wLjcyNzI2IDAuNzI3MjYtMS4wOTA5LTEuMDkwOS0wLjcyNzI2IDAuNzI3MjYgMS4wOTA5IDEuMDkwOS0xLjA5MDkgMS4wOTA5IDAuNzI3MjYgMC43MjcyNiAxLjA5MDktMS4wOTA5IDAuNzI3MjYgMC43MjcyNi0xLjA5MDkgMS4wOTA5IDAuNzI3MjYgMC43MjcyNiAxLjA5MDktMS4wOTA5IDEuMDkwOSAxLjA5MDkgMC43MjcyNi0wLjcyNzI2LTEuMDkwOS0xLjA5MDkgMC43MjcyNi0wLjcyNzI2IDEuMDkwOSAxLjA5MDkgMC43MjcyNi0wLjcyNzI2LTEuMDkwOS0xLjA5MDkgMS4wOTA5LTEuMDkwOS0wLjcyNzI2LTAuNzI3MjYtMS4wOTA5IDEuMDkwOS0wLjcyNzI2LTAuNzI3MjYgMS4wOTA5LTEuMDkwOS0wLjcyNzI2LTAuNzI3MjYtMS4wOTA5IDEuMDkwOXptMS4wOTA5IDIuNTQ1NCAwLjcyNzI2IDAuNzI3MjYtMC43MjcyNiAwLjcyNzI2LTAuNzI3MjYtMC43MjcyNnoiIGZpbGw9IiNmOWY5ZjkiIHN0cm9rZS13aWR0aD0iMS40NTQ1Ii8+CiA8cGF0aCBkPSJtMjUuODggMTUuNzYxdjEuNDU0NWw4LjcyNzIgNS45OTk5di0xLjQ1NDV6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTgwKSIgc3Ryb2tlLXdpZHRoPSIxLjQ1NDUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"bless,hexa,decimal\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"bless.desktop\"\nLABEL oc.launch=\"bless.Bless\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"Bless\"\nLABEL oc.displayname=\"Bless\"\nLABEL oc.path=\"/usr/bin/bless\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Bless\"\nENV APPBIN \"/usr/bin/bless\"\nENV APP \"/usr/bin/bless\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/bless/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/bless/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Bless

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Bless.d\n
"},{"location":"applications/bless/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Bless.d -t Bless .\n
"},{"location":"applications/bless/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Bless > Bless.json\ndocker image save Bless -o Bless.tar\nctr -n k8s.io images import Bless.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Bless.json\n\n
"},{"location":"applications/blobby/","title":"blobby","text":""},{"location":"applications/blobby/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/blobby/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/blobby/#ubuntu-packages","title":"Ubuntu packages","text":"
blobby\n
"},{"location":"applications/blobby/#path","title":"Path","text":"
/usr/games/blobby\n
"},{"location":"applications/blobby/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/blobby/#wm_class","title":"WM_CLASS","text":"
blobby.blobby\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/blobby/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/blobby.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/blobby/#json-dump","title":"JSON dump","text":"

json source file blobby.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"blobby\",\n    \"icon\": \"blobby.svg\",\n    \"installrecommends\": false,\n    \"keyword\": \"game\",\n    \"launch\": \"blobby.blobby\",\n    \"name\": \"blobby\",\n    \"path\": \"/usr/games/blobby\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"args\": \"\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/blobby.desktop\"\n}\n
"},{"location":"applications/blobby/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output blobby.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blobby.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blobby.d.3.0.json\n\n
"},{"location":"applications/blobby/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends blobby && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"blobby.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8c3ZnIHZpZXdCb3g9IjAgMCAyMDAgMjAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGZpbGw9IiNGRjAwNjYiIGQ9Ik0zNy45LDIyLjRDMjQuOCw0NC42LC0yNyw0NSwtMzkuNywyM0MtNTIuNCwxLC0yNi4yLC00My40LC0wLjQsLTQzLjZDMjUuNSwtNDMuOCw1MSwwLjIsMzcuOSwyMi40WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAwIDEwMCkiIC8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"blobby,game\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"blobby.desktop\"\nLABEL oc.launch=\"blobby.blobby\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"blobby\"\nLABEL oc.displayname=\"blobby\"\nLABEL oc.path=\"/usr/games/blobby\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"blobby\"\nENV APPBIN \"/usr/games/blobby\"\nENV APP \"/usr/games/blobby\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/blobby/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/blobby/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application blobby

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/blobby.d\n
"},{"location":"applications/blobby/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f blobby.d -t blobby .\n
"},{"location":"applications/blobby/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect blobby > blobby.json\ndocker image save blobby -o blobby.tar\nctr -n k8s.io images import blobby.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @blobby.json\n\n
"},{"location":"applications/boxes/","title":"boxes","text":""},{"location":"applications/boxes/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/boxes/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/boxes/#alpine-packages","title":"Alpine packages","text":"
gnome-boxes sudo\n
"},{"location":"applications/boxes/#displayname","title":"Displayname","text":"
Gnome-boxes\n
"},{"location":"applications/boxes/#path","title":"Path","text":"
/usr/bin/gnome-boxes\n
"},{"location":"applications/boxes/#mimetype","title":"Mimetype","text":"
application-x-cd-image;\n
"},{"location":"applications/boxes/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/boxes/#wm_class","title":"WM_CLASS","text":"
gnome-boxes.Gnome-boxes\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/boxes/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Boxes.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/boxes/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
"},{"location":"applications/boxes/#json-dump","title":"JSON dump","text":"

json source file boxes.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"icon\": \"org.gnome.Boxes.svg\",\n    \"apkpackage\": \"gnome-boxes sudo\",\n    \"keyword\": \"boxes,vm\",\n    \"launch\": \"gnome-boxes.Gnome-boxes\",\n    \"name\": \"boxes\",\n    \"displayname\": \"Gnome-boxes\",\n    \"path\": \"/usr/bin/gnome-boxes\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Boxes.desktop\",\n    \"mimetype\": \"application-x-cd-image;\",\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n    ],\n    \"securitycontext\": {\n        \"allowPrivilegeEscalation\": true,\n        \"capabilities\": {\n            \"add\": [\n                \"NET_ADMIN\",\n                \"CAP_SYS_ADMIN\"\n            ]\n        }\n    }\n}\n
"},{"location":"applications/boxes/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output boxes.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/boxes.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @boxes.d.3.0.json\n\n
"},{"location":"applications/boxes/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-boxes sudo\nLABEL oc.icon=\"org.gnome.Boxes.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmVyc2lvbj0iMS4wIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImEiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPjxzdG9wIG9mZnNldD0iLjQiIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmNmY1ZjQiLz48L2xpbmVhckdyYWRpZW50PjxyYWRpYWxHcmFkaWVudCB4bGluazpocmVmPSIjYSIgaWQ9ImkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQgMCAwIDQgLTQ5Mi43OTkgLTY0MS45NTIpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iaCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNCAwIDAgNCAtNDkyLjc5OSAtNjgxLjk1MikiIGN4PSIxMzQuMiIgY3k9IjIyMi45ODgiIGZ4PSIxMzQuMiIgZnk9IjIyMi45ODgiIHI9IjIiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJnIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2IDAgMCA2IC03ODUuMTk4IC0xMDY1LjkyOCkiIGN4PSIxMzQuMiIgY3k9IjIyMi45ODgiIGZ4PSIxMzQuMiIgZnk9IjIyMi45ODgiIHI9IjIiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJmIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2IDAgMCA2IC03ODUuMTk4IC0xMTUzLjkyOCkiLz48cmFkaWFsR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJlIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg0IDAgMCA0IC00NTIuNzk5IC02ODEuOTUyKSIgY3g9IjEzNC4yIiBjeT0iMjIyLjk4OCIgZng9IjEzNC4yIiBmeT0iMjIyLjk4OCIgcj0iMiIvPjxyYWRpYWxHcmFkaWVudCB4bGluazpocmVmPSIjYSIgaWQ9ImQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQgMCAwIDQgLTQ1Mi43OTkgLTY0MS45NTIpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iYyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNiAwIDAgNiAtNjk3LjE5OCAtMTA2NS45MjgpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PHJhZGlhbEdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiBpZD0iYiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNiAwIDAgNiAtNjk3LjE5OCAtMTE1My45MjgpIiBjeD0iMTM0LjIiIGN5PSIyMjIuOTg4IiBmeD0iMTM0LjIiIGZ5PSIyMjIuOTg4IiByPSIyIi8+PC9kZWZzPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTE3MikiPjxwYXRoIHN0eWxlPSJsaW5lLWhlaWdodDpub3JtYWw7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LXBvc2l0aW9uOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtdmFyaWFudC1hbHRlcm5hdGVzOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtaW5kZW50OjA7dGV4dC1hbGlnbjpzdGFydDt0ZXh0LWRlY29yYXRpb24tbGluZTpub25lO3RleHQtZGVjb3JhdGlvbi1zdHlsZTpzb2xpZDt0ZXh0LWRlY29yYXRpb24tY29sb3I6IzAwMDt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtb3JpZW50YXRpb246bWl4ZWQ7d2hpdGUtc3BhY2U6bm9ybWFsO3NoYXBlLXBhZGRpbmc6MDtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7c29saWQtY29sb3I6IzAwMDtzb2xpZC1vcGFjaXR5OjE7bWFya2VyOm5vbmUiIGQ9Ik0yMi4zNTIgMTk0LjM1Mmg4Mi42ODd2ODIuNjg3SDIyLjM1MnoiIGNvbG9yPSIjMDAwIiBmb250LXdlaWdodD0iNDAwIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9Im5vbmUiLz48ZyBjb2xvcj0iIzAwMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZjZmNWY0IiBzdHJva2Utd2lkdGg9IjgiPjxwYXRoIHN0eWxlPSJtYXJrZXI6bm9uZSIgZD0iTTg0IDI1NmwyNCAyNE04NCAyMTZsMjQtMjRNNDQgMjU2bC0yNCAyNE00NCAyMTZsLTI0LTI0TTQ0IDIxNmg0MHY0MEg0NHoiIG92ZXJmbG93PSJ2aXNpYmxlIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBvdmVyZmxvdz0idmlzaWJsZSIgZD0iTTIwIDE5Mmg4OHY4OEgyMHoiLz48L2c+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNOTguNSAxOTR2MmgtNjl2LTJ6Ii8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBkPSJNMTIwIDE5MmMwIDYuNjI3LTUuMzczIDEyLTEyIDEyLTEuODUgMC0zLjIyMi0uMDk1LTUuMTY1LTEuMTY2LTEuMDkyLTEuNzI2LTMuNTUtNC41ODQtNS42NjgtNS42NjZDOTYuMDk2IDE5NS4yMjQgOTYgMTkzLjg1IDk2IDE5MmMwLTYuNjI3IDUuMzczLTEyIDEyLTEyczEyIDUuMzczIDEyIDEyeiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNMTEwIDIwM2gydjY5aC0yeiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMTA4IiBjeT0iMjgwIiByPSIxMiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNzkgMjU4djJINDl2LTJ6TTk5LjYwNCAyNzQuNDI1bC0xLjQxNCAxLjQxNS0xNS0xNSAxLjQxNS0xLjQxNXpNMTAzLjA1OCAxOTkuNzkzbDEuNDE0IDEuNDE0LTE1IDE1LTEuNDE0LTEuNDE0eiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMTA4IiBjeT0iMTkwIiByPSIxMiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2IpIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNODYgMjIyaDJ2MjZoLTJ6TTc5IDIxOHYySDQ5di0yeiIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iODQiIGN5PSIyMTYiIHI9IjgiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2Q1ZDNjZiIvPjxwYXRoIHN0eWxlPSJtYXJrZXI6bm9uZSIgZmlsbD0iI2Q1ZDNjZiIgZD0iTTk4LjUgMjgydjJoLTY5di0yeiIvPjxjaXJjbGUgcj0iMTIiIGN5PSIyNzgiIGN4PSIxMDgiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2MpIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBkPSJNOTIgMjU2YzAgLjY2NiAwIDEtLjIzNSAxLjkzMi0xLjE2NS41OS00Ljc2NSA0LjU0Mi01Ljc4NyA1LjgyMi0uNTAyLjI0Ni0xLjI5NS4yNDYtMS45NzguMjQ2YTggOCAwIDEgMSA4LTh6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNkNWQzY2YiLz48Y2lyY2xlIHN0eWxlPSJtYXJrZXI6bm9uZSIgY3g9Ijg0IiBjeT0iMjU0IiByPSI4IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZCkiLz48Y2lyY2xlIHI9IjgiIGN5PSIyMTQiIGN4PSI4NCIgc3R5bGU9Im1hcmtlcjpub25lIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZSkiLz48cGF0aCBzdHlsZT0ibWFya2VyOm5vbmUiIGZpbGw9IiNkNWQzY2YiIGQ9Ik0yMiAyMDNoMnY2OWgtMnoiLz48Y2lyY2xlIHI9IjEyIiBjeT0iMjgwIiBjeD0iMjAiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNDYgMjIyaDJ2MjZoLTJ6Ii8+PGNpcmNsZSByPSI4IiBjeT0iMjE2IiBjeD0iNDQiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PHBhdGggc3R5bGU9Im1hcmtlcjpub25lIiBmaWxsPSIjZDVkM2NmIiBkPSJNNDMuNTg2IDI1OS41ODZMNDUgMjYxbC0xNSAxNS0xLjQxNC0xLjQxNHoiLz48cGF0aCBkPSJNNy45MTIgMTkyYzAgNi42MjcgNS4zNzIgMTIgMTIgMTIgMS44NDkgMCAzLjIyMi0uMDk1IDUuMTY1LTEuMTY2IDEuMDkyLTEuNzI2IDMuNTUtNC41ODQgNS42NjgtNS42NjYgMS4wNzEtMS45NDQgMS4xNjctMy4zMTggMS4xNjctNS4xNjggMC02LjYyNy01LjM3My0xMi0xMi0xMi02LjYyOCAwLTEyIDUuMzczLTEyIDEyeiIgc3R5bGU9Im1hcmtlcjpub25lIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNkNWQzY2YiLz48cGF0aCBzdHlsZT0ibWFya2VyOm5vbmUiIGZpbGw9IiNkNWQzY2YiIGQ9Ik00MC4wNzcgMjE0Ljk1M2wtMS40MTQgMS40MTUtMTUtMTUgMS40MTUtMS40MTR6Ii8+PGNpcmNsZSByPSIxMiIgY3k9IjE5MCIgY3g9IjIwIiBzdHlsZT0ibWFya2VyOm5vbmUiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0idXJsKCNmKSIvPjxjaXJjbGUgc3R5bGU9Im1hcmtlcjpub25lIiBjeD0iMjAiIGN5PSIyNzgiIHI9IjEyIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjZykiLz48Y2lyY2xlIHN0eWxlPSJtYXJrZXI6bm9uZSIgY3g9IjQ0IiBjeT0iMjE0IiByPSI4IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9InVybCgjaCkiLz48cGF0aCBkPSJNMzYgMjU2YzAgLjY2NiAwIDEgLjIzNSAxLjkzMiAxLjE2NS41OSA0Ljc2NSA0LjU0MiA1Ljc4NyA1LjgyMi41MDIuMjQ2IDEuMjk1LjI0NiAxLjk3OC4yNDZhOCA4IDAgMSAwLTgtOHoiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZDVkM2NmIi8+PGNpcmNsZSByPSI4IiBjeT0iMjU0IiBjeD0iNDQiIHN0eWxlPSJtYXJrZXI6bm9uZSIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSJ1cmwoI2kpIi8+PC9nPjwvc3ZnPg==\"\nLABEL oc.keyword=\"boxes,boxes,vm\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Boxes.desktop\"\nLABEL oc.launch=\"gnome-boxes.Gnome-boxes\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"boxes\"\nLABEL oc.displayname=\"Gnome-boxes\"\nLABEL oc.path=\"/usr/bin/gnome-boxes\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application-x-cd-image;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"boxes\"\nENV APPBIN \"/usr/bin/gnome-boxes\"\nENV APP \"/usr/bin/gnome-boxes\"\nLABEL oc.securitycontext={\"allowPrivilegeEscalation\":true,\"capabilities\":{\"add\":[\"NET_ADMIN\",\"CAP_SYS_ADMIN\"]}}\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/boxes/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/boxes/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application boxes

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/boxes.d\n
"},{"location":"applications/boxes/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f boxes.d -t boxes .\n
"},{"location":"applications/boxes/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect boxes > boxes.json\ndocker image save boxes -o boxes.tar\nctr -n k8s.io images import boxes.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @boxes.json\n\n
"},{"location":"applications/brackets/","title":"Brackets","text":""},{"location":"applications/brackets/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.18.04

"},{"location":"applications/brackets/#arguments","title":"Arguments","text":"

\"--no-sandbox --disable-gpu\"

"},{"location":"applications/brackets/#path","title":"Path","text":"
/opt/brackets/Brackets\n
"},{"location":"applications/brackets/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/brackets/#wm_class","title":"WM_CLASS","text":"
brackets.Brackets\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/brackets/#desktopfile","title":"Desktopfile","text":"
/opt/brackets/brackets.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/brackets/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb  && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/brackets/#json-dump","title":"JSON dump","text":"

json source file brackets.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_brackets.svg\",\n    \"keyword\": \"html,brackets\",\n    \"launch\": \"brackets.Brackets\",\n    \"name\": \"Brackets\",\n    \"path\": \"/opt/brackets/Brackets\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\"\n    },\n    \"desktopfile\": \"/opt/brackets/brackets.desktop\",\n    \"preruncommands\": [\n        \"RUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb  && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"args\": \"--no-sandbox  --disable-gpu\"\n}\n
"},{"location":"applications/brackets/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output brackets.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/brackets.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @brackets.d.3.0.json\n\n
"},{"location":"applications/brackets/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN curl -Ls -o /tmp/bracket.deb https://github.com/adobe/brackets/releases/download/release-1.14.1/Brackets.Release.1.14.1.64-bit.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin libcurl3 libxss1 && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/bracket.deb && rm /tmp/bracket.deb  && apt-get clean && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"circle_brackets.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI0MDguNTciIHgyPSI0MDguNTciIHkxPSI1MzUuMiIgeTI9IjUxMi40IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjI4IDAgMCAxLjIyOCAtNDY5LjcxIC02MTEuMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzJlMzQzNiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1NTU3NTMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMzIuMDIiIHgyPSIzMi4wMiIgeTE9IjIuMDQzIiB5Mj0iNjIuMDQ1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMDY0ZDMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTRjNmZkIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNyIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2EpIi8+CiAgPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMjQiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMjQiIGZpbGw9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8L2c+CiA8cGF0aCBkPSJtMTggMTh2MjhoMTIuNzI3di02LjM2MzZoLTYuMzYzNnYtMTUuMjczaDYuMzYzNnYtNi4zNjM2aC02LjUwNXptMTUuMjczIDB2Ni4zNjM2aDYuMzYzNnYxNS4yNzNoLTYuMzYzNnY2LjM2MzZoMTIuNzI3di0yOGgtMTIuNzI3eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0xOCAxOHYyOGgxMi43Mjd2LTYuMzYzNmgtNi4zNjM2di0xNS4yNzNoNi4zNjM2di02LjM2MzZoLTYuNTA1em0xNS4yNzMgMHY2LjM2MzZoNi4zNjM2djE1LjI3M2gtNi4zNjM2djYuMzYzNmgxMi43Mjd2LTI4aC0xMi43Mjd6IiBmaWxsPSJ1cmwoI2QpIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"brackets,html,brackets\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"brackets.desktop\"\nLABEL oc.launch=\"brackets.Brackets\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nENV ARGS=\"--no-sandbox  --disable-gpu\"\nLABEL oc.name=\"Brackets\"\nLABEL oc.displayname=\"Brackets\"\nLABEL oc.path=\"/opt/brackets/Brackets\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Brackets\"\nENV APPBIN \"/opt/brackets/Brackets\"\nLABEL oc.args=\"--no-sandbox  --disable-gpu\"\nENV APP \"/opt/brackets/Brackets\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/brackets/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/brackets/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Brackets

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Brackets.d\n
"},{"location":"applications/brackets/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Brackets.d -t Brackets .\n
"},{"location":"applications/brackets/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Brackets > Brackets.json\ndocker image save Brackets -o Brackets.tar\nctr -n k8s.io images import Brackets.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Brackets.json\n\n
"},{"location":"applications/calc/","title":"calc","text":""},{"location":"applications/calc/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.libreoffice

"},{"location":"applications/calc/#distribution","title":"Distribution","text":"

alpine

"},{"location":"applications/calc/#alpine-packages","title":"Alpine packages","text":"
libreoffice-gnome\n
"},{"location":"applications/calc/#arguments","title":"Arguments","text":"

\"--calc\"

"},{"location":"applications/calc/#displayname","title":"Displayname","text":"

\"Calc\"

"},{"location":"applications/calc/#path","title":"Path","text":"

\"/usr/lib/libreoffice/program/soffice\"

"},{"location":"applications/calc/#uniquerunkey","title":"uniquerunkey","text":"

\"libreoffice\"

"},{"location":"applications/calc/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/calc/#mime-type","title":"Mime Type","text":"

\"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\"

"},{"location":"applications/calc/#file-extensions","title":"File extensions","text":"

\"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\"

"},{"location":"applications/calc/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"ods;ots;csv\"

"},{"location":"applications/calc/#acl","title":"ACL","text":"

{\"permit\":[\"all\"]}

"},{"location":"applications/calc/#wm_class","title":"WM_CLASS","text":"

libreoffice.libreoffice-calc

"},{"location":"applications/calc/#desktopfile","title":"Desktopfile","text":"

/usr/share/applications/libreoffice-calc.desktop

"},{"location":"applications/calc/#json-dump","title":"JSON dump","text":"
{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_calc.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-calc\",\n    \"name\": \"calc\",\n    \"displayname\": \"Calc\",\n    \"showinview\": \"dock\",\n    \"args\": \"--calc\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"uniquerunkey\": \"libreoffice\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\",\n    \"legacyfileextensions\": \"ods;ots;csv\",\n    \"fileextensions\": \"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-calc.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/calc/#dockerfile-generated","title":"Dockerfile generated","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_calc.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5LDAsMCwyLjE0MjksLTgyNi4zNiwtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzg4OWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MTk5OTg3NCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjMyLjAyIiB4Mj0iMzIuMDIiIHkxPSIyLjA0MyIgeTI9IjYyLjA0NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmU4NTFiIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE4YTAwMyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkMmZjZWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJmZWYyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZmNlOCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJpIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYSIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDIuOTg4NmUtOCAtMS45MjY1ZS04IC0xIDgwLjQ1MyA0MC4xOTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjQ4MSIgeDI9IjQ4MSIgeTE9Ii03NTkuNjQiIHkyPSItNzY0LjY0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMjgxNSAwIDAgMi45MzM0IC0xMDYyLjggMjI3Ni42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSIzMCIgeDI9IjMwIiB5MT0iMTgiIHkyPSI0NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMThhMzAzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzEwNjgwMiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA2MjEwNSIgeT0iLS4wNTc5NjYiIHdpZHRoPSIxLjEyNDIiIGhlaWdodD0iMS4xMTU5IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjM1NDIzNzU5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaiIgeD0iLS4wNTc4NTciIHk9Ii0uMDYyMzA4IiB3aWR0aD0iMS4xMTU3IiBoZWlnaHQ9IjEuMTI0NiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC42NzUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgY3g9IjQwMC41NyIgY3k9IjUzMS44IiByPSIxNCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8ZyBzdHJva2Utd2lkdGg9IjEuNTcxNSI+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNmKSIvPgogIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsdGVyPSJ1cmwoI2kpIiBvcGFjaXR5PSIuMjUiLz4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiLz4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiKSIvPgogIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsbD0idXJsKCNlKSIvPgogPC9nPgogPHJlY3QgeD0iMTYiIHk9IjE5IiB3aWR0aD0iMjgiIGhlaWdodD0iMjYiIHJ5PSIwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjI1IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjIwMTllLTYgMSkiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgPHJlY3QgeD0iMTYiIHk9IjE4IiB3aWR0aD0iMjgiIGhlaWdodD0iMjYiIHJ5PSIwIiBmaWxsPSIjY2NmNGM2IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPHJlY3QgeD0iMTYiIHk9IjE4IiB3aWR0aD0iMjgiIGhlaWdodD0iNiIgcnk9IjAiIGZpbGw9IiM5MmUyODUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz4KICA8cGF0aCBkPSJtMTYgMTh2MjZoMjh2LTI2em0xIDFoOHY0aC04em05IDBoOHY0aC04em05IDBoOHY0aC04em0tMTggNWg4djRoLTh6bTkgMGg4djRoLTh6bTkgMGg4djRoLTh6bS0xOCA1aDh2NGgtOHptOSAwaDh2NGgtOHptOSAwaDh2NGgtOHptLTE4IDVoOHY0aC04em05IDBoOHY0aC04em05IDBoOHY0aC04em0tMTggNWg4djRoLTh6bTkgMGg4djRoLTh6bTkgMGg4djRoLTh6IiBmaWxsPSJ1cmwoI2gpIiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAyMjcgMCAwIC45NTQ1NSAtLjQzMTgxIDEuODYzNykiIHN0cm9rZS13aWR0aD0iMS4wMTIxIj4KICA8cmVjdCB4PSIzNC42NDUiIHk9IjMzLjY2NiIgd2lkdGg9IjEzLjY4OSIgaGVpZ2h0PSIxNC42NjciIHJ5PSIxLjA0NzYiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPHJlY3QgeD0iMzQuNjQ1IiB5PSIzMy42NjYiIHdpZHRoPSIxMy42ODkiIGhlaWdodD0iMTQuNjY3IiByeT0iMS4wNDc2IiBmaWxsPSJ1cmwoI2cpIi8+CiAgPGc+CiAgIDxyZWN0IHg9IjM1LjYyMiIgeT0iNDIuMDQ3IiB3aWR0aD0iMi45MzQ2IiBoZWlnaHQ9IjYuMjg2OCIgZmlsbD0iIzIyOGZmZiIvPgogICA8cmVjdCB4PSIzOS41MzMiIHk9IjM2LjgwOSIgd2lkdGg9IjMuOTEyNiIgaGVpZ2h0PSIxMS41MjQiIGZpbGw9IiNmZjgwMzciLz4KICAgPHJlY3QgeD0iNDQuNDIyIiB5PSI0NC4xNDMiIHdpZHRoPSIyLjkzNDgiIGhlaWdodD0iNC4xOTE0IiBmaWxsPSIjZmZjYTIyIi8+CiAgPC9nPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"calc,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-calc.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-calc\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--calc\"\nLABEL oc.name=\"calc\"\nLABEL oc.displayname=\"Calc\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/x-iwork-numbers-sffnumbers;\"\nLABEL oc.fileextensions=\"ods;ots;sxc;stc;fods;uos;uof;xml;xlsx;xlsm;xltm;xltx;xlsb;xls;xlm;xlc;xlw;xlk;xlt;dif;dbf;htm;html;wk1;wks;123;wb2;rtf;slk;sylk;csv;numbers;dummy;cwk;wps;wk3;wq1;wq2\"\nLABEL oc.legacyfileextensions=\"ods;ots;csv\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"calc\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--calc\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/calculator/","title":"calculator","text":""},{"location":"applications/calculator/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/calculator/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/calculator/#alpine-packages","title":"Alpine packages","text":"
gnome-calculator\n
"},{"location":"applications/calculator/#path","title":"Path","text":"
/usr/bin/gnome-calculator\n
"},{"location":"applications/calculator/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/calculator/#wm_class","title":"WM_CLASS","text":"
gnome-calculator.gnome-calculator\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/calculator/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Calculator.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/calculator/#json-dump","title":"JSON dump","text":"

json source file calculator.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"apkpackage\": \"gnome-calculator\",\n    \"icon\": \"gnome_calculator.svg\",\n    \"keyword\": \"calculator\",\n    \"launch\": \"gnome-calculator.gnome-calculator\",\n    \"name\": \"calculator\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-calculator\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Calculator.desktop\"\n}\n
"},{"location":"applications/calculator/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output calculator.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/calculator.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @calculator.d.3.0.json\n\n
"},{"location":"applications/calculator/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-calculator\nLABEL oc.icon=\"gnome_calculator.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBoZWlnaHQ9IjEyOHB4IiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgd2lkdGg9IjEyOHB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjE5MjM1MSAwIDAgMC4yNSAyMi4wMDUyMTMgNTcuMDAwMDMxKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMC4yNzYxNTYiIHgyPSI0MjYuMjc2MjE1IiB5MT0iMjU5Ljk5OTg3OCIgeTI9IjI1OS45OTk4NzgiPgogICAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzlhOTk5NiIvPgogICAgICAgIDxzdG9wIG9mZnNldD0iMC4wNTAyMTU2IiBzdG9wLWNvbG9yPSIjYzBiZmJjIi8+CiAgICAgICAgPHN0b3Agb2Zmc2V0PSIwLjEwMDIwNCIgc3RvcC1jb2xvcj0iIzlhOTk5NiIvPgogICAgICAgIDxzdG9wIG9mZnNldD0iMC45MDAwMjMiIHN0b3AtY29sb3I9IiM5YTk5OTYiLz4KICAgICAgICA8c3RvcCBvZmZzZXQ9IjAuOTUwMDExIiBzdG9wLWNvbG9yPSIjYzBiZmJjIi8+CiAgICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjOWE5OTk2Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHBhdGggZD0ibSAzMiAzNiBoIDY0IGMgNC40MTc5NjkgMCA4IDMuNTgyMDMxIDggOCB2IDY4IGMgMCA0LjQxNzk2OSAtMy41ODIwMzEgOCAtOCA4IGggLTY0IGMgLTQuNDE3OTY5IDAgLTggLTMuNTgyMDMxIC04IC04IHYgLTY4IGMgMCAtNC40MTc5NjkgMy41ODIwMzEgLTggOCAtOCB6IG0gMCAwIiBmaWxsPSJ1cmwoI2EpIi8+CiAgICA8cGF0aCBkPSJtIDMyIDggaCA2NCBjIDQuNDE3OTY5IDAgOCAzLjU4MjAzMSA4IDggdiA5MCBjIDAgNC40MTc5NjkgLTMuNTgyMDMxIDggLTggOCBoIC02NCBjIC00LjQxNzk2OSAwIC04IC0zLjU4MjAzMSAtOCAtOCB2IC05MCBjIDAgLTQuNDE3OTY5IDMuNTgyMDMxIC04IDggLTggeiBtIDAgMCIgZmlsbD0iI2RlZGRkYSIvPgogICAgPHBhdGggZD0ibSAzOCAxOCBoIDUyLjAzOTA2MiBjIDIuMjEwOTM4IDAgNCAxLjc4OTA2MiA0IDQgdiA2IGMgMCAyLjIxMDkzOCAtMS43ODkwNjIgNCAtNCA0IGggLTUyLjAzOTA2MiBjIC0yLjIxMDkzOCAwIC00IC0xLjc4OTA2MiAtNCAtNCB2IC02IGMgMCAtMi4yMTA5MzggMS43ODkwNjIgLTQgNCAtNCB6IG0gMCAwIiBmaWxsPSIjNzc3NjdiIi8+CiAgICA8cGF0aCBkPSJtIDM4IDM2IGggNTIuMDM5MDYyIGMgMi4yMTA5MzggMCA0IC0xLjc4OTA2MiA0IC00IHYgLTggYyAwIC0yLjIxMDkzOCAtMS43ODkwNjIgLTQgLTQgLTQgaCAtNTIuMDM5MDYyIGMgLTIuMjEwOTM4IDAgLTQgMS43ODkwNjIgLTQgNCB2IDggYyAwIDIuMjEwOTM4IDEuNzg5MDYyIDQgNCA0IHogbSAwIDAiIGZpbGw9IiM2ZmIxODIiLz4KICAgIDxwYXRoIGQ9Im0gMzQgNTEgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDQxIDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gNTcuMDExNzE5IDUxIHYgMiBjIDAgMy44Nzg5MDYgMy4xMjEwOTMgNyA3IDcgYyAzLjg3NSAwIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gODAgNTEgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDg3IDQ0IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM5YTk5OTYiLz4KICAgIDxwYXRoIGQ9Im0gMzQgNzMgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDU3LjAxMTcxOSA3MyB2IDIgYyAwIDMuODc4OTA2IDMuMTIxMDkzIDcgNyA3IGMgMy44NzUgMCA3IC0zLjEyMTA5NCA3IC03IHYgLTIgeiBtIDAgMCIgZmlsbD0iIzNkMzg0NiIvPgogICAgPHBhdGggZD0ibSA0MSA2NiBjIDMuODY3MTg4IDAgNyAzLjEzMjgxMiA3IDcgcyAtMy4xMzI4MTIgNyAtNyA3IHMgLTcgLTMuMTMyODEyIC03IC03IHMgMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjNWU1YzY0Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDY2IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gMzQgOTUgdiAyIGMgMCAzLjg3ODkwNiAzLjEyMTA5NCA3IDcgNyBzIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDQxIDg4IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gNTcuMDExNzE5IDk1IHYgMiBjIDAgMy44Nzg5MDYgMy4xMjEwOTMgNyA3IDcgYyAzLjg3NSAwIDcgLTMuMTIxMDk0IDcgLTcgdiAtMiB6IG0gMCAwIiBmaWxsPSIjM2QzODQ2Ii8+CiAgICA8cGF0aCBkPSJtIDY0IDg4IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyBzIC0zLjEzMjgxMiA3IC03IDcgcyAtNyAtMy4xMzI4MTIgLTcgLTcgcyAzLjEzMjgxMiAtNyA3IC03IHogbSAwIDAiIGZpbGw9IiM1ZTVjNjQiLz4KICAgIDxwYXRoIGQ9Im0gODcgODYgYyAzLjg2NzE4OCAwIDcgMy4xMzI4MTIgNyA3IHYgNCBjIDAgMy44NjcxODggLTMuMTMyODEyIDcgLTcgNyBzIC03IC0zLjEzMjgxMiAtNyAtNyB2IC00IGMgMCAtMy44NjcxODggMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjYzY0NjAwIi8+CiAgICA8cGF0aCBkPSJtIDg3IDY2IGMgMy44NjcxODggMCA3IDMuMTMyODEyIDcgNyB2IDIyIGMgMCAzLjg2NzE4OCAtMy4xMzI4MTIgNyAtNyA3IHMgLTcgLTMuMTMyODEyIC03IC03IHYgLTIyIGMgMCAtMy44NjcxODggMy4xMzI4MTIgLTcgNyAtNyB6IG0gMCAwIiBmaWxsPSIjZmY3ODAwIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"calculator,calculator\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Calculator.desktop\"\nLABEL oc.launch=\"gnome-calculator.gnome-calculator\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"calculator\"\nLABEL oc.displayname=\"calculator\"\nLABEL oc.path=\"/usr/bin/gnome-calculator\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"calculator\"\nENV APPBIN \"/usr/bin/gnome-calculator\"\nENV APP \"/usr/bin/gnome-calculator\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/calculator/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/calculator/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application calculator

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/calculator.d\n
"},{"location":"applications/calculator/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f calculator.d -t calculator .\n
"},{"location":"applications/calculator/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect calculator > calculator.json\ndocker image save calculator -o calculator.tar\nctr -n k8s.io images import calculator.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @calculator.json\n\n
"},{"location":"applications/chess/","title":"chess","text":""},{"location":"applications/chess/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/chess/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/chess/#alpine-packages","title":"Alpine packages","text":"
gnuchess gnome-chess\n
"},{"location":"applications/chess/#path","title":"Path","text":"
/usr/bin/gnome-chess\n
"},{"location":"applications/chess/#mimetype","title":"Mimetype","text":"
application/x-chess-pgn\n
"},{"location":"applications/chess/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/chess/#wm_class","title":"WM_CLASS","text":"
gnome-chess.gnome-chess\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/chess/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Chess.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/chess/#json-dump","title":"JSON dump","text":"

json source file chess.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"gnuchess gnome-chess\",\n    \"icon\": \"circle_chess.svg\",\n    \"keyword\": \"chess gnuchess\",\n    \"launch\": \"gnome-chess.gnome-chess\",\n    \"name\": \"chess\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-chess\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-chess-pgn\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Chess.desktop\"\n}\n
"},{"location":"applications/chess/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output chess.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chess.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chess.d.3.0.json\n\n
"},{"location":"applications/chess/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnuchess gnome-chess\nLABEL oc.icon=\"circle_chess.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnNDciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMjUiPgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMiIgc3RkRGV2aWF0aW9uPSIxNC4zNDM3NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMiIgeDI9IjMyIiB5MT0iMiIgeTI9IjYyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wNSIgc3RvcC1jb2xvcj0iIzFkMjEyMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wNyIgc3RvcC1jb2xvcj0iIzNlNDU0YSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MTQiIHg9Ii0uMDY2IiB5PSItLjA1NSIgd2lkdGg9IjEuMTMyIiBoZWlnaHQ9IjEuMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI5MTYiIHN0ZERldmlhdGlvbj0iMC42NDE2NjY2OCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlMjciIHRyYW5zZm9ybT0ibWF0cml4KC4wNjI3NDUgMCAwIC4wNjI3NDUgLS4xMjU0OSAtLjEyNTQ5KSIgY3g9IjUxMiIgY3k9IjUxMiIgcj0iNDc4LjEyIiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS45MzgiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiA8Y2lyY2xlIGlkPSJjaXJjbGUyOSIgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPHBhdGggaWQ9InBhdGg4NjQiIGQ9Im0yNC40OSAxOGMtMC4zNjUxNyAwLTAuNjYwMzMgMC4yODctMC42NjAzMyAwLjY1NTY3djUuNjg3NWMwIDAuMzY1MTcgMC4yOTE2NyAwLjY1NjgzIDAuNjYwMzMgMC42NTY4M2gwLjUwNjMzbC0xLjE2NjcgMS4xNjY3IDEuMTY2NyAxLjE2NjctMS4xNjMyIDEyLjgzM2MtMS4yOTM4IDAtMi4zMzIyIDEuMDM5NS0yLjMzMjIgMi4zMjg3IDAgMC40MjM1IDAuMTI3MTcgMC44MjAxNyAwLjMyMzE3IDEuMTY2N2wtMC4zMjQzMyAwLjAwNDYtMS4xNjY3IDIuMzMzNGgyMy4zMzNsLTEuMTY2Ny0yLjMzMzMtMC4zMjY2Ny0wLjAwNDZjMC4yMDA2Ny0wLjM0NjUgMC4zMjc4My0wLjc0MzE3IDAuMzI3ODMtMS4xNjY3IDAtMS4yOTM4LTEuMDQ1My0yLjMyODctMi4zMzQ1LTIuMzI4N2wtMS4xNjU1LTEyLjgzMyAxLjE2NjctMS4xNjY3LTEuMTY2Ny0xLjE2NjdoMC41MTFjMC4zNjg2NyAwIDAuNjYwMzMtMC4yODcgMC42NjAzMy0wLjY1Njgzdi01LjY4NzVjMC0wLjM2NTE3LTAuMjg3LTAuNjU1NjctMC42NjAzMy0wLjY1NTY3aC0xLjY3ODh2Mi4zMzMzaC0yLjMzMzN2LTIuMzMzM2gtMi4zMzMzdjIuMzMzM2gtMi4zMzMzdi0yLjMzMzRoLTIuMzMzM3YyLjMzMzNoLTIuMzMzM3YtMi4zMzMzIiBmaWx0ZXI9InVybCgjZmlsdGVyOTE0KSIgb3BhY2l0eT0iLjUiIHN0cm9rZS13aWR0aD0iMS4xNjY3Ii8+CiA8cGF0aCBpZD0icGF0aDI5IiBkPSJtMjQuNDkgMThjLTAuMzY1MTcgMC0wLjY2MDMzIDAuMjg3LTAuNjYwMzMgMC42NTU2N3Y1LjY4NzVjMCAwLjM2NTE3IDAuMjkxNjcgMC42NTY4MyAwLjY2MDMzIDAuNjU2ODNoMC41MDYzM2wtMS4xNjY3IDEuMTY2NyAxLjE2NjcgMS4xNjY3LTEuMTYzMiAxMi44MzNjLTEuMjkzOCAwLTIuMzMyMiAxLjAzOTUtMi4zMzIyIDIuMzI4NyAwIDAuNDIzNSAwLjEyNzE3IDAuODIwMTcgMC4zMjMxNyAxLjE2NjdsLTAuMzI0MzMgMC4wMDQ2LTEuMTY2NyAyLjMzMzRoMjMuMzMzbC0xLjE2NjctMi4zMzMzLTAuMzI2NjctMC4wMDQ2YzAuMjAwNjctMC4zNDY1IDAuMzI3ODMtMC43NDMxNyAwLjMyNzgzLTEuMTY2NyAwLTEuMjkzOC0xLjA0NTMtMi4zMjg3LTIuMzM0NS0yLjMyODdsLTEuMTY1NS0xMi44MzMgMS4xNjY3LTEuMTY2Ny0xLjE2NjctMS4xNjY3aDAuNTExYzAuMzY4NjcgMCAwLjY2MDMzLTAuMjg3IDAuNjYwMzMtMC42NTY4M3YtNS42ODc1YzAtMC4zNjUxNy0wLjI4Ny0wLjY1NTY3LTAuNjYwMzMtMC42NTU2N2gtMS42Nzg4djIuMzMzM2gtMi4zMzMzdi0yLjMzMzNoLTIuMzMzM3YyLjMzMzNoLTIuMzMzM3YtMi4zMzM0aC0yLjMzMzN2Mi4zMzMzaC0yLjMzMzN2LTIuMzMzMyIgZmlsbD0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxLjE2NjciLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"chess,chess gnuchess\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Chess.desktop\"\nLABEL oc.launch=\"gnome-chess.gnome-chess\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"chess\"\nLABEL oc.displayname=\"chess\"\nLABEL oc.path=\"/usr/bin/gnome-chess\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-chess-pgn\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chess\"\nENV APPBIN \"/usr/bin/gnome-chess\"\nENV APP \"/usr/bin/gnome-chess\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/chess/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chess/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application chess

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chess.d\n
"},{"location":"applications/chess/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f chess.d -t chess .\n
"},{"location":"applications/chess/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect chess > chess.json\ndocker image save chess -o chess.tar\nctr -n k8s.io images import chess.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chess.json\n\n
"},{"location":"applications/chrome/","title":"chrome","text":""},{"location":"applications/chrome/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/chrome/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/chrome/#ubuntu-packages","title":"Ubuntu packages","text":"
krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable\n
"},{"location":"applications/chrome/#displayname","title":"Displayname","text":"
Chrome\n
"},{"location":"applications/chrome/#path","title":"Path","text":"
/usr/bin/google-chrome-stable\n
"},{"location":"applications/chrome/#mimetype","title":"Mimetype","text":"
text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\n
"},{"location":"applications/chrome/#file-extensions","title":"File extensions","text":"

\"html;xml;gif\"

"},{"location":"applications/chrome/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"html;xml\"

"},{"location":"applications/chrome/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/chrome/#wm_class","title":"WM_CLASS","text":"
google-chrome.Google-chrome\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/chrome/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/google-chrome.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/chrome/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\" | tee /etc/apt/sources.list.d/google-chrome.list\n
"},{"location":"applications/chrome/#json-dump","title":"JSON dump","text":"

json source file chrome.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable\",\n    \"preruncommands\": [\n        \"RUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\\\" | tee /etc/apt/sources.list.d/google-chrome.list\"\n    ],\n    \"icon\": \"circle_google-chrome.svg\",\n    \"keyword\": \"web,browser,internet\",\n    \"launch\": \"google-chrome.Google-chrome\",\n    \"name\": \"chrome\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"displayname\": \"Chrome\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/google-chrome-stable\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/google-chrome.desktop\",\n    \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/chrome/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output chrome.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chrome.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chrome.d.3.0.json\n\n
"},{"location":"applications/chrome/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl -Ls https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] http://dl.google.com/linux/chrome/deb/ stable main\" | tee /etc/apt/sources.list.d/google-chrome.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y krb5-user fonts-noto fonts-roboto xfonts-100dpi fonts-ubuntu fonts-freefont-ttf dbus-x11 fonts-wine fonts-recommended google-chrome-stable && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_google-chrome.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSIxNy4xODciIHgyPSIxNy4xODciIHkxPSI0Ni43MzciIHkyPSIxOTkuOTgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC43MDUgMCAwIDQuNzA1IDQxIDcwLjM2MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM1QzEzMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNEJEMzAiIG9mZnNldD0iLjM0ODMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMxQjIzMSIgb2Zmc2V0PSIuNjgwOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMkM5RjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9Ijk1Ljk3IiB4Mj0iOTUuOTciIHkxPSIyLjI5MjIiIHkyPSIxOTguNDQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS43MTkxIDAgMCAxLjcxOTEgMzQwLjA5IDM2OC40NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQ3QjlGRiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzRDhBRkYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMTE0Ljc1IiB4Mj0iMTE0Ljc1IiB5MT0iNTYuNjgxIiB5Mj0iMTg4LjkzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuMSAwIDAgNS4xIDIgMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmY2UwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlNmJjMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMTAzLjY3IiB4Mj0iMTAzLjY3IiB5MT0iLTQuNjYyMyIgeTI9IjIwNi41IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTY5OSAwIDAgMi4xNjk5IDI5NS4wMSAzMjMuMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImciIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI2LjUwOTc3ODkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI5Ny40MjUiIHgyPSI5Ny40MjUiIHkxPSItOS4wMDcxIiB5Mj0iMjA5Ljg3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDQuNzA1IDAgMCA0LjcwNSA0MSA0MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI0Y2NTAzQiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNGMjQ3MzUiIG9mZnNldD0iLjIxNzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI0U2MkYyNSIgb2Zmc2V0PSIuNTcxOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjRDQwOTBEIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xMTUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCA5ODUuODgpIiBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1Ii8+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtODEzLjQxIDE1MS43NGMtOTYuNzI2IDIzLjAzMi01NTQuMTcgMTM2LjQ1LTMwMC4xNCAxNjMuOTEgMjgzLjA1IDMwLjYgMTc1LjMxIDMxNy40NyAxNzUuMzEgMzE3LjQ3bC0yMDcuMjYgMzQ4LjM3YTQ3MC41IDQ3MC41IDAgMCAwIDMwLjE2OCAxLjUwOTggNDcwLjUgNDcwLjUgMCAwIDAgNDcwLjUtNDcwLjUgNDcwLjUgNDcwLjUgMCAwIDAtMTY4LjU5LTM2MC43NnoiIGZpbGw9InVybCgjYykiLz4KICAgPGc+CiAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDI4LjM2MikiIGQ9Im01MTEuNSA0MmE0NzAuNSA0NzAuNSAwIDAgMC0zOTQuNDUgMjE0LjgybDIxMC4zNSAzNTMuODRzLTUuNjMzOC0xNzAuNDUgOC40NTMxLTE4Ny4zNmMxNC4wODctMTYuOTA0IDgzLjExMy04MS43MDMgODMuMTEzLTgxLjcwM2w5NC4zODEtMjguMTc0LTUuMTA1NS0xOC4zMTIgNDE4LjcxLTIuNzUzOWE0NzAuNSA0NzAuNSAwIDAgMC00MTUuNDYtMjUwLjM2eiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYSkiLz4KICAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU1MC4zNiIgcj0iMjE2Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0iIzExMSIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMiIvPgogICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSIyMTYuOTkiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1NDAuMzYiIHI9IjE3MS45MSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZCkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"chrome,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"google-chrome.desktop\"\nLABEL oc.launch=\"google-chrome.Google-chrome\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"chrome\"\nLABEL oc.displayname=\"Chrome\"\nLABEL oc.path=\"/usr/bin/google-chrome-stable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chrome\"\nENV APPBIN \"/usr/bin/google-chrome-stable\"\nENV APP \"/usr/bin/google-chrome-stable\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/chrome/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chrome/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application chrome

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chrome.d\n
"},{"location":"applications/chrome/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f chrome.d -t chrome .\n
"},{"location":"applications/chrome/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect chrome > chrome.json\ndocker image save chrome -o chrome.tar\nctr -n k8s.io images import chrome.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chrome.json\n\n
"},{"location":"applications/chromium/","title":"chromium","text":""},{"location":"applications/chromium/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/chromium/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/chromium/#alpine-packages","title":"Alpine packages","text":"
chromium\n
"},{"location":"applications/chromium/#displayname","title":"Displayname","text":"
chromium (alpine)\n
"},{"location":"applications/chromium/#path","title":"Path","text":"
/usr/bin/chromium-browser\n
"},{"location":"applications/chromium/#mimetype","title":"Mimetype","text":"
text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\n
"},{"location":"applications/chromium/#file-extensions","title":"File extensions","text":"

\"html;xml;gif\"

"},{"location":"applications/chromium/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"html;xml\"

"},{"location":"applications/chromium/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/chromium/#wm_class","title":"WM_CLASS","text":"
chromium.Chromium\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/chromium/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/chromium-browser.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/chromium/#json-dump","title":"JSON dump","text":"

json source file chromium.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"chromium\",\n    \"icon\": \"circle_chromium.svg\",\n    \"keyword\": \"web,browser,internet\",\n    \"launch\": \"chromium.Chromium\",\n    \"name\": \"chromium\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"displayname\": \"chromium (alpine)\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/chromium-browser\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/chromium-browser.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/chromium/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output chromium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chromium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chromium.d.3.0.json\n\n
"},{"location":"applications/chromium/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update chromium\nLABEL oc.icon=\"circle_chromium.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI5NS45NyIgeDI9Ijk1Ljk3IiB5MT0iMi4yOTIyIiB5Mj0iMTk4LjQ0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNzE5MSAwIDAgMS43MTkxIDM0MC4wOSAzNjguNDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4ZGI2ZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNTlmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjExNC43NSIgeDI9IjExNC43NSIgeTE9IjU2LjY4MSIgeTI9IjE4OC45MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1LjEgMCAwIDUuMSAyIDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM3NmE3ZjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTJjMmY4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjEwMy42NyIgeDI9IjEwMy42NyIgeTE9Ii00LjY2MjMiIHkyPSIyMDYuNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjE2OTkgMCAwIDIuMTY5OSAyOTUuMDEgMzIzLjM3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi41MDk3Nzg5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZiIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjExNSIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQxIiB4Mj0iOTgyIiB5MT0iNTQwLjg2IiB5Mj0iNTQwLjg2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2NDlhZjUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGI4YWY1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjExNy4wNSIgeDI9IjkyNi45NSIgeTE9IjMyNi4zMyIgeTI9IjMyNi4zMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjM2I2YmQ0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2OGJkZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTk4OC4zNikiPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCA5ODUuODgpIiBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1Ii8+CiAgIDxjaXJjbGUgY3g9IjUxMS41IiBjeT0iNTQwLjg2IiByPSI0NzAuNSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjZSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtODEzLjQxIDE1MS43NGMtOTYuNzI2IDIzLjAzMi01NTQuMTcgMTM2LjQ1LTMwMC4xNCAxNjMuOTEgMjgzLjA1IDMwLjYgMTc1LjMxIDMxNy40NyAxNzUuMzEgMzE3LjQ3bC0yMDcuMjYgMzQ4LjM3YTQ3MC41IDQ3MC41IDAgMCAwIDMwLjE2OCAxLjUwOTggNDcwLjUgNDcwLjUgMCAwIDAgNDcwLjUtNDcwLjUgNDcwLjUgNDcwLjUgMCAwIDAtMTY4LjU5LTM2MC43NnoiIGZpbGw9InVybCgjYykiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAyOC4zNjIpIiBkPSJtNTExLjUgNDJhNDcwLjUgNDcwLjUgMCAwIDAtMzk0LjQ1IDIxNC44MmwyMTAuMzUgMzUzLjg0cy01LjYzMzgtMTcwLjQ1IDguNDUzMS0xODcuMzZjMTQuMDg3LTE2LjkwNCA4My4xMTMtODEuNzAzIDgzLjExMy04MS43MDNsOTQuMzgxLTI4LjE3NC01LjEwNTUtMTguMzEyIDQxOC43MS0yLjc1MzlhNDcwLjUgNDcwLjUgMCAwIDAtNDE1LjQ2LTI1MC4zNnoiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjU1MC4zNiIgcj0iMjE2Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZmlsbD0iIzExMSIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMiIvPgogICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1NDAuMzYiIHI9IjIxNi45OSIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYikiLz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTQwLjM2IiByPSIxNzEuOTEiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2QpIi8+CiAgPC9nPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"chromium,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"chromium-browser.desktop\"\nLABEL oc.launch=\"chromium.Chromium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"chromium\"\nLABEL oc.displayname=\"chromium (alpine)\"\nLABEL oc.path=\"/usr/bin/chromium-browser\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;video/webm;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"chromium\"\nENV APPBIN \"/usr/bin/chromium-browser\"\nENV APP \"/usr/bin/chromium-browser\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/chromium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/chromium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application chromium

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/chromium.d\n
"},{"location":"applications/chromium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f chromium.d -t chromium .\n
"},{"location":"applications/chromium/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect chromium > chromium.json\ndocker image save chromium -o chromium.tar\nctr -n k8s.io images import chromium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @chromium.json\n\n
"},{"location":"applications/citrix/","title":"citrix","text":""},{"location":"applications/citrix/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.18.04

"},{"location":"applications/citrix/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/citrix/#ubuntu-packages","title":"Ubuntu packages","text":"
libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8\n
"},{"location":"applications/citrix/#licence","title":"Licence","text":"

** This application is NO FREE. ** You need to build it manually.

"},{"location":"applications/citrix/#arguments","title":"Arguments","text":"

\"-icaroot /opt/Citrix/ICAClient\"

"},{"location":"applications/citrix/#displayname","title":"Displayname","text":"
citrix-client\n
"},{"location":"applications/citrix/#path","title":"Path","text":"
/opt/Citrix/ICAClient/wfica\n
"},{"location":"applications/citrix/#mimetype","title":"Mimetype","text":"
application/x-ica;\n
"},{"location":"applications/citrix/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/citrix/#wm_class","title":"WM_CLASS","text":"
Wfica.Wfica\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/citrix/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/wfica.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/citrix/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

COPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\nRUN apt-get update && apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/citrix/#json-dump","title":"JSON dump","text":"

json source file citrix.d.3.0.json

{\n    \"comment\": \"download icaclientWeb from https://www.citrix.com/fr-fr/downloads/citrix-receiver/linux/receiver-for-linux-latest.html\",\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"postruncommands\": [\n        \"COPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\",\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"debpackage\": \"libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8\",\n    \"icon\": \"icaclient.svg\",\n    \"keyword\": \"ica,icaclient,\",\n    \"launch\": \"Wfica.Wfica\",\n    \"name\": \"citrix\",\n    \"displayname\": \"citrix-client\",\n    \"secrets_requirement\": \"citrix\",\n    \"args\": \"-icaroot /opt/Citrix/ICAClient\",\n    \"path\": \"/opt/Citrix/ICAClient/wfica\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n    \"mimetype\": \"application/x-ica;\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/wfica.desktop\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\",\n        \"shm_size\": \"512M\",\n        \"pid_mode\": true,\n        \"ipc_mode\": \"shareable\"\n    },\n    \"usedefaultapplication\": true,\n    \"licence\": \"non-free\"\n}\n
"},{"location":"applications/citrix/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output citrix.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/citrix.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @citrix.d.3.0.json\n\n
"},{"location":"applications/citrix/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends libsecret-1-0 libpcsclite1 x11-utils libjpeg-turbo8 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"icaclient.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTouMiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiB4PSItNTkiIHk9Ii02MCIgcng9IjI4IiByeT0iMjgiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCBzdHlsZT0iZmlsbDojNGY0ZjRmIiB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHg9Ii01OCIgeT0iLTYwIiByeD0iMjgiIHJ5PSIyOCIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMSwtMSwwLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5Oi4yIiBkPSJtMzIgMTFhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMTE3MmMtMTAuOTMzMjI0IDAuMTA0NTM5LTE5LjgwODYgOS4wMzA5Ny0xOS44MDg2IDE5Ljk4ODI4IDAgMTEuMDIyMDA2IDguOTc3OTk0IDIwIDIwIDIwIDEwLjk1NDY3OCAwIDE5Ljg3OTUyNC04Ljg3MTE4IDE5Ljk4ODI4Mi0xOS44MDA3ODJhMiAyIDAgMCAwIDAuMDExNzE4IC0wLjE5OTIxOCAyIDIgMCAwIDAgLTIgLTIgMiAyIDAgMCAwIC0yIDJjMCA4Ljg2MDI0Ni03LjEzOTc1NCAxNi0xNiAxNnMtMTYtNy4xMzk3NTQtMTYtMTYgNy4xMzk3NTQtMTYgMTYtMTZhMiAyIDAgMCAwIDIgLTIgMiAyIDAgMCAwIC0yIC0yem0wIDhhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMDc4Yy02LjUxNTM3NCAwLjEwNDEyNi0xMS44MDg2IDUuNDUzMDUyLTExLjgwODYgMTEuOTkyMiAwIDYuNjAzNzI4IDUuMzk2MjcyIDEyIDEyIDEyIDYuNTM2NDUyIDAgMTEuODc5ODgtNS4yODkxMTIgMTEuOTg4MjgyLTExLjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDQuNDQxOTY4LTMuNTU4MDMyIDgtOCA4cy04LTMuNTU4MDMyLTgtOCAzLjU1ODAzMi04IDgtOGEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGE0IDQgMCAwIDAgLTQgNCA0IDQgMCAwIDAgNCA0IDQgNCAwIDAgMCA0IC00IDQgNCAwIDAgMCAtNCAtNHoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOiNmZmZmZmYiIGQ9Im0zMiAxMGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAxMTcyYy0xMC45MzMyMjQgMC4xMDQ1MzktMTkuODA4NiA5LjAzMDk3LTE5LjgwODYgMTkuOTg4MjggMCAxMS4wMjIwMDYgOC45Nzc5OTQgMjAgMjAgMjAgMTAuOTU0Njc4IDAgMTkuODc5NTI0LTguODcxMTggMTkuOTg4MjgyLTE5LjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDguODYwMjQ2LTcuMTM5NzU0IDE2LTE2IDE2cy0xNi03LjEzOTc1NC0xNi0xNiA3LjEzOTc1NC0xNiAxNi0xNmEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAwNzhjLTYuNTE1Mzc0IDAuMTA0MTI2LTExLjgwODYgNS40NTMwNTItMTEuODA4NiAxMS45OTIyIDAgNi42MDM3MjggNS4zOTYyNzIgMTIgMTIgMTIgNi41MzY0NTIgMCAxMS44Nzk4OC01LjI4OTExMiAxMS45ODgyODItMTEuODAwNzgyYTIgMiAwIDAgMCAwLjAxMTcxOCAtMC4xOTkyMTggMiAyIDAgMCAwIC0yIC0yIDIgMiAwIDAgMCAtMiAyYzAgNC40NDE5NjgtMy41NTgwMzIgOC04IDhzLTgtMy41NTgwMzItOC04IDMuNTU4MDMyLTggOC04YTIgMiAwIDAgMCAyIC0yIDIgMiAwIDAgMCAtMiAtMnptMCA4YTQgNCAwIDAgMCAtNCA0IDQgNCAwIDAgMCA0IDQgNCA0IDAgMCAwIDQgLTQgNCA0IDAgMCAwIC00IC00eiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6LjE7ZmlsbDojZmZmZmZmIiBkPSJtMzIgMmMtMTUuNTEyIDAtMjggMTIuNDg4LTI4IDI4IDAgMC4xMTM0NSAwLjAxMTI4MDUgMC4yMjQxMTMgMC4wMTc1NzgxIDAuMzM1OTM4IDAuMzUxNTQzMi0xNS4yMDE3NTcgMTIuNjkzMTQ5OS0yNy4zMzU5MzggMjcuOTgyNDIxOS0yNy4zMzU5MzhzMjcuNjMwODc5IDEyLjEzNDE4MSAyNy45ODI0MjIgMjcuMzM1OTM4YzAuMDA2Mjk4LTAuMTExODI1IDAuMDE3NTc4LTAuMjIyNDg4IDAuMDE3NTc4LTAuMzM1OTM4IDAtMTUuNTEyLTEyLjQ4OC0yOC0yOC0yOHoiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"citrix,ica,icaclient,\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"wfica.desktop\"\nLABEL oc.launch=\"Wfica.Wfica\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nENV ARGS=\"-icaroot /opt/Citrix/ICAClient\"\nLABEL oc.name=\"citrix\"\nLABEL oc.displayname=\"citrix-client\"\nLABEL oc.path=\"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"application/x-ica;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"512M\\\",\\\"pid_mode\\\":true,\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nLABEL oc.secrets_requirement=\"\\\"citrix\\\"\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"citrix\"\nENV APPBIN \"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.args=\"-icaroot /opt/Citrix/ICAClient\"\nENV APP \"/opt/Citrix/ICAClient/wfica\"\nLABEL oc.usedefaultapplication=true\nCOPY icaclientWeb_13.10.0.20_amd64.deb /tmp/icaclient_amd64.deb\nRUN apt-get update && apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb && rm -rf /var/lib/apt/lists/*\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/citrix/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/citrix/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application citrix

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/citrix.d\n
"},{"location":"applications/citrix/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f citrix.d -t citrix .\n
"},{"location":"applications/citrix/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect citrix > citrix.json\ndocker image save citrix -o citrix.tar\nctr -n k8s.io images import citrix.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @citrix.json\n\n
"},{"location":"applications/cloudfoundry/","title":"cloudFoundry","text":""},{"location":"applications/cloudfoundry/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/cloudfoundry/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/cloudfoundry/#ubuntu-packages","title":"Ubuntu packages","text":"
cf8-cli\n
"},{"location":"applications/cloudfoundry/#arguments","title":"Arguments","text":"

\"--disable-factory --class pivotalio.cf\"

"},{"location":"applications/cloudfoundry/#displayname","title":"Displayname","text":"
Cloud Foundry cli\n
"},{"location":"applications/cloudfoundry/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/cloudfoundry/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/cloudfoundry/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.pivotalio.cf\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/cloudfoundry/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\nRUN echo \"deb https://packages.cloudfoundry.org/debian stable main\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\n
"},{"location":"applications/cloudfoundry/#json-dump","title":"JSON dump","text":"

json source file cloudfoundry.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\",\n        \"RUN echo \\\"deb https://packages.cloudfoundry.org/debian stable main\\\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\"\n    ],\n    \"debpackage\": \"cf8-cli\",\n    \"icon\": \"pivotalio-icon.svg\",\n    \"keyword\": \"cf,pivotal.io,cloud,foundry,cloud foundry\",\n    \"launch\": \"gnome-terminal-server.pivotalio.cf\",\n    \"name\": \"cloudFoundry\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"displayname\": \"Cloud Foundry cli\",\n    \"args\": \"--disable-factory --class pivotalio.cf\",\n    \"quick\": true\n}\n
"},{"location":"applications/cloudfoundry/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output cloudfoundry.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cloudfoundry.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cloudfoundry.d.3.0.json\n\n
"},{"location":"applications/cloudfoundry/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -\nRUN echo \"deb https://packages.cloudfoundry.org/debian stable main\" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends cf8-cli && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pivotalio-icon.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCI+PHBhdGggZD0iTTI3LjY2IDBIMTAuNXY2NGgxMC42NjdWOS42Mmg1LjQzOGMxLjM2IDAgMi4zIDAgMy40NS4yMSA4Ljc4NC4yMSAxMy4wNzIgMi44MjQgMTMuMDcyIDkuODN2LjgzN2MwIDYuNDg0LTMuNDUgMTAuNjY3LTEyLjg2MyAxMC42NjctLjk0IDAtMi4zLS4yMS0yLjMtLjIxdjguNzg0aDIuM0M0My44NyAzOS43NCA1My41IDM0LjMgNTMuNSAyMC4zOTJ2LS44MzdDNTMuNSA1LjEyNCA0Mi44MjQgMCAyNy42NiAweiIgZmlsbD0iIzAwN2Q2OCIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"cloudfoundry,cf,pivotal.io,cloud,foundry,cloud foundry\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.pivotalio.cf\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--disable-factory --class pivotalio.cf\"\nLABEL oc.name=\"cloudFoundry\"\nLABEL oc.displayname=\"Cloud Foundry cli\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cloudFoundry\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class pivotalio.cf\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cloudfoundry/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cloudfoundry/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application cloudFoundry

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cloudFoundry.d\n
"},{"location":"applications/cloudfoundry/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f cloudFoundry.d -t cloudFoundry .\n
"},{"location":"applications/cloudfoundry/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect cloudFoundry > cloudFoundry.json\ndocker image save cloudFoundry -o cloudFoundry.tar\nctr -n k8s.io images import cloudFoundry.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cloudFoundry.json\n\n
"},{"location":"applications/cmd.exe/","title":"cmd.exe","text":""},{"location":"applications/cmd.exe/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.wine

"},{"location":"applications/cmd.exe/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/cmd.exe/#alpine-packages","title":"Alpine packages","text":"
wine\n
"},{"location":"applications/cmd.exe/#displayname","title":"Displayname","text":"
cmd.exe wine (alpine)\n
"},{"location":"applications/cmd.exe/#path","title":"Path","text":"
/usr/bin/wineconsole\n
"},{"location":"applications/cmd.exe/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/cmd.exe/#wm_class","title":"WM_CLASS","text":"
conhost.exe.conhost.exe\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/cmd.exe/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
"},{"location":"applications/cmd.exe/#json-dump","title":"JSON dump","text":"

json source file cmd.exe.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n    ],\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"wine\",\n    \"icon\": \"cmd.svg\",\n    \"keyword\": \"wine,command,cmd.exe\",\n    \"launch\": \"conhost.exe.conhost.exe\",\n    \"name\": \"cmd.exe\",\n    \"displayname\": \"cmd.exe wine (alpine)\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/wineconsole\",\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/cmd.exe/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output cmd.exe.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cmd.exe.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cmd.exe.d.3.0.json\n\n
"},{"location":"applications/cmd.exe/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"cmd.svg\"\nLABEL oc.icondata=\"PHN2ZyBoZWlnaHQ9IjEwMjQiIHdpZHRoPSI4OTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTgzMSAxMjdINjNjLTM1LjM1IDAtNjQgMjguNjUtNjQgNjR2NjQwYzAgMzUuMzUgMjguNjUgNjQgNjQgNjRoNzY4YzM1LjM1IDAgNjQtMjguNjUgNjQtNjRWMTkxQzg5NSAxNTUuNjQ5OTk5OTk5OTk5OTggODY2LjM1IDEyNyA4MzEgMTI3ek0xMjcgNTc1bDEyOC0xMjhMMTI3IDMxOWw2NC02NCAxOTIgMTkyTDE5MSA2MzkgMTI3IDU3NXpNNjM5IDYzOUgzODN2LTY0aDI1NlY2Mzl6IiAvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"cmd.exe,wine,command,cmd.exe\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"conhost.exe.conhost.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"cmd.exe\"\nLABEL oc.displayname=\"cmd.exe wine (alpine)\"\nLABEL oc.path=\"/usr/bin/wineconsole\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cmd.exe\"\nENV APPBIN \"/usr/bin/wineconsole\"\nENV APP \"/usr/bin/wineconsole\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cmd.exe/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cmd.exe/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application cmd.exe

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cmd.exe.d\n
"},{"location":"applications/cmd.exe/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f cmd.exe.d -t cmd.exe .\n
"},{"location":"applications/cmd.exe/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect cmd.exe > cmd.exe.json\ndocker image save cmd.exe -o cmd.exe.tar\nctr -n k8s.io images import cmd.exe.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cmd.exe.json\n\n
"},{"location":"applications/cntlm/","title":"cntlm","text":""},{"location":"applications/cntlm/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/cntlm/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cntlm/#ubuntu-packages","title":"Ubuntu packages","text":"
ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget\n
"},{"location":"applications/cntlm/#arguments","title":"Arguments","text":"

\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"

"},{"location":"applications/cntlm/#displayname","title":"Displayname","text":"
cntlm\n
"},{"location":"applications/cntlm/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/cntlm/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/cntlm/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.cntlm\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/cntlm/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

COPY cntlm/cntlm.mustache  cntlm/init.cntlm.sh /composer/\nCOPY composer/init.d/init.gnome-terminal /composer/init.d/\n
"},{"location":"applications/cntlm/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN chown balloon:root /etc/cntlm.conf\nRUN chmod 755 /composer/cntlm.mustache\n
"},{"location":"applications/cntlm/#json-dump","title":"JSON dump","text":"

json source file

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget\",\n    \"icon\": \"cntlm.svg\",\n    \"keyword\": \"cntlm,proxy,ntlm\",\n    \"launch\": \"gnome-terminal-server.cntlm\",\n    \"name\": \"cntlm\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"displayname\": \"cntlm\",\n    \"host_config\": {\n        \"network_mode\": \"container\"\n    },\n    \"args\": \"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\",\n    \"preruncommands\": [\n        \"COPY cntlm/cntlm.mustache  cntlm/init.cntlm.sh /composer/\",\n        \"COPY composer/init.d/init.gnome-terminal /composer/init.d/\"\n    ],\n    \"postruncommands\": [\n        \"RUN chown balloon:root /etc/cntlm.conf\",\n        \"RUN chmod 755 /composer/cntlm.mustache\"\n    ]\n}\n
"},{"location":"applications/cntlm/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output cntlm.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cntlm.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cntlm.json\n\n
"},{"location":"applications/cntlm/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nCOPY cntlm/cntlm.mustache  cntlm/init.cntlm.sh /composer/\nCOPY composer/init.d/init.gnome-terminal /composer/init.d/\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends ruby-mustache gnome-terminal dbus-x11 cntlm net-tools vim curl wget && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"cntlm.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDQ3MC4xMDcgNDcwLjEwNyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDcwLjEwNyA0NzAuMTA3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8cGF0aCBkPSJNNDIzLjQ4OSwxNjkuNzg1YzQuMzY0LTEyLjMzOCw2Ljg2My0yNS41NTUsNi44NjMtMzkuMzkxYzAtNjUuMzE2LTUyLjk1Ni0xMTguMjcyLTExOC4yNzItMTE4LjI3Mg0KCQljLTQ0LjQ0NSwwLTgzLjEyOSwyNC41NTMtMTAzLjMzMiw2MC43OTljLTE1LjM5LTkuNjc1LTMzLjU2LTE1LjM2LTUzLjA4LTE1LjM2Yy01NS4yMzksMC0xMDAuMDEsNDQuNzczLTEwMC4wMSwxMDAuMDAyDQoJCWMwLDMuODI4LDAuMjY0LDcuNTkzLDAuNjg0LDExLjMxM2gtMC42ODRDMjQuOTI1LDE2OC44NzUsMCwxOTMuNzkyLDAsMjI0LjUzM2MwLDMwLjc0LDI0LjkyNSw1NS42NTgsNTUuNjU4LDU1LjY1OGgyMC4yMDQNCgkJYy0yLjQwOC0zLjg2Ni0zLjc0Mi04LjI5OS0zLjc0Mi0xMi45NTljMC02LjU2MSwyLjU0Ni0xMi43NDIsNy4yMDUtMTcuNDE2bDE0LjA4NS0xNC4wN2w4LjMyNS04LjMyMw0KCQljNC42NDMtNC42MzUsMTAuODIzLTcuMTgzLDE3LjM5Mi03LjE4M2M2LjU2OSwwLDEyLjc2NSwyLjU1NiwxNy40MjQsNy4yMTNsMC4wNDYsMC4wNDh2LTAuMDdjMC0xMy41OCwxMS4wNDItMjQuNjMxLDI0LjYzMS0yNC42MzENCgkJaDMxLjYzM2MxMy41NzIsMCwyNC42MTUsMTEuMDUsMjQuNjE1LDI0LjYzMXYwLjA4NGwwLjA2Mi0wLjA2MmMxMS4wNjQtMTEuMDY0LDI2Ljk3Mi03Ljg5LDM0Ljg0OC0wLjAxNGwxMC4zMjcsMTAuMzI3DQoJCWwxMi4wMzUsMTIuMDM1YzQuNjU5LDQuNjUxLDcuMjIxLDEwLjgzOSw3LjIyMSwxNy40MjRjMCw0LjY3NS0xLjM1LDkuMTE1LTMuNzU4LDEyLjk2N2gzMy40MDQNCgkJYzIzLjAzLTM2LjA1Miw5MS40NjktNTIuNTA0LDExMC41MjMtNi42ODVjMC43NzYsMS44NjQsMC45MzIsMy44MzYsMS4xOCw1Ljc5M2MyNi40OTMtNC4yNzEsNDYuNzktMjcuMDYxLDQ2Ljc5LTU0Ljc2NQ0KCQlDNDcwLjEwNywxOTYuODkyLDQ0OS45MDQsMTc0LjEyNSw0MjMuNDg5LDE2OS43ODV6Ii8+DQoJPHBhdGggZD0iTTE0Ni4xOTUsMzcyLjExYy0xNS4yODItMTAuMDcxLTI1LjQwNy0yNy4zMzEtMjUuNDA3LTQ2Ljk1M2MwLTMxLjAyLDI1LjIzNS01Ni4yNTUsNTYuMjQ3LTU2LjI1NQ0KCQljMzEuMDI4LDAsNTYuMjYzLDI1LjIzNSw1Ni4yNjMsNTYuMjU1YzAsMy44MDQtMC40MDQsNy41MjMtMS4xMTgsMTEuMTE5bDUxLjMyNC0yMS40di01LjU0M2MwLTQuODIzLTMuOTEzLTguNzM3LTguNzI3LTguNzM3DQoJCWgtMTcuOTM2Yy0xLjU1NC01LjA1NC0zLjYwNC05Ljg5OS02LjA0MS0xNC40OTZsMTIuNzAzLTEyLjcwM2MxLjY0Ni0xLjYzOCwyLjU2Mi0zLjg1OSwyLjU2Mi02LjE3Mw0KCQljMC0yLjMxNC0wLjkxNi00LjUzNC0yLjU2Mi02LjE4MWwtMjIuMzYyLTIyLjM2MmMtMS43MS0xLjcwOC0zLjk0NS0yLjU1Ni02LjE4MS0yLjU1NmMtMi4yMzYsMC00LjQ1NywwLjg0OC02LjE2NSwyLjU1Ng0KCQlsLTEyLjcxOSwxMi43MTFjLTQuNTk3LTIuNDM4LTkuNDI3LTQuNDgtMTQuNTA0LTYuMDI1VjIyNy40M2MwLTQuODIzLTMuODk4LTguNzI5LTguNzEzLTguNzI5aC0zMS42MzMNCgkJYy00LjgxNSwwLTguNzI5LDMuOTA2LTguNzI5LDguNzI5djE3LjkzNmMtNS4wNjIsMS41NDYtOS45MDcsMy41ODgtMTQuNTA0LDYuMDI1bC0xMi42ODctMTIuNjk1DQoJCWMtMS43MDgtMS43MS0zLjk0NS0yLjU1Ni02LjE4MS0yLjU1NmMtMi4yMzYsMC00LjQ3MiwwLjg0Ni02LjE4MSwyLjU0OGwtMjIuMzc4LDIyLjM3Yy0xLjYzLDEuNjM4LTIuNTQ2LDMuODU5LTIuNTQ2LDYuMTczDQoJCWMwLDIuMzIyLDAuOTE2LDQuNTQyLDIuNTQ2LDYuMTgxbDEyLjcwMywxMi42OTVjLTIuNDM4LDQuNTk3LTQuNDcyLDkuNDM1LTYuMDI1LDE0LjQ4OEg3OS4zMDljLTQuODEzLDAtOC43MjcsMy45MTQtOC43MjcsOC43MzcNCgkJdjMxLjY0MWMwLDQuODE0LDMuOTE0LDguNzI3LDguNzI3LDguNzI3SDk3LjIzYzEuNTY4LDUuMDU1LDMuNjAyLDkuOTAxLDYuMDQsMTQuNDk4bC0xMi43MDMsMTIuNzAzDQoJCWMtMy40MDEsMy40LTMuNDAxLDguOTM3LDAsMTIuMzQ1bDcuNTE3LDcuNTA5YzQuMzMyLTQuNjksOS42MjctOC42MDMsMTUuOTAyLTExLjIyMUwxNDYuMTk1LDM3Mi4xMXoiLz4NCgk8cGF0aCBkPSJNMTc3LjAzNSwyODQuODA0Yy0yMi4yNTMsMC00MC4zNDUsMTguMS00MC4zNDUsNDAuMzUzYzAsMTguNDM0LDEyLjQ4NiwzMy44NTQsMjkuMzk3LDM4LjY2bDQ2LjA5Mi0xOS4yMQ0KCQljMy4yMTQtNS43OTEsNS4yMTctMTIuMzYxLDUuMjE3LTE5LjQ1QzIxNy4zOTcsMzAyLjkwNCwxOTkuMjg5LDI4NC44MDQsMTc3LjAzNSwyODQuODA0eiIvPg0KCTxwYXRoIGQ9Ik00MjUuMzA1LDMzMi41NzJjLTAuODIyLDAtMS42NjIsMC4xNjItMi40NywwLjQ5NmwtMzIuOTg0LDEzLjczNmMtMS40MjgsMC41OTgtMi45MDQsMC44NzgtNC4zNjQsMC44NzgNCgkJYy00LjQ0MiwwLTguNjY1LTIuNjMzLTEwLjQ4My03LjAwNWwtMTAuMDYzLTI0LjEyNGMtMS4xNDgtMi43ODgtMS4xOC01LjkwOS0wLjAxNi04LjY5N2MxLjEzNC0yLjc5NiwzLjM0LTUuMDA5LDYuMTE5LTYuMTY1DQoJCWwzMi45ODQtMTMuNzQ0YzMuMjYyLTEuMzU4LDQuNzgzLTUuMDc4LDMuNDMyLTguMzE1Yy01LjY1Mi0xMy41OC0yMC4yNS0yMC43NjMtMzQuMTAyLTE3LjU2NGwtMTYuMzY4LDMuNzM1DQoJCWMtMTUuNTc2LDMuNTU2LTI4LjY1MSwxNC4wNDYtMzUuNTE2LDI4LjQ1N0wzMDguNCwzMjEuNzMyTDEyMC4xMDQsNDAwLjIxYy0xNS4zMTIsNi4zODMtMjIuNTQ4LDIzLjk1My0xNi4xNjYsMzkuMjgxDQoJCWM2LjMyMSwxNS4xNSwyMy44MDcsMjIuNjExLDM5LjI4OSwxNi4xNzRsMTg4LjMxLTc4LjQ3MWwyOC42ODMsMTAuMDQ5YzUuNjIzLDEuOTcyLDExLjQ2MSwyLjk0MiwxNy4yNywyLjk0Mg0KCQljOS43ODMsMCwxOS40OS0yLjc0OCwyNy45NTMtOC4xMTNsMTQuMTk0LTguOTk5YzEyLjIzNy03Ljc2NSwxNy4wOTgtMjMuMjAxLDExLjUyMy0zNi41OA0KCQlDNDMwLjE1LDMzNC4wNDgsNDI3Ljc5LDMzMi41NzIsNDI1LjMwNSwzMzIuNTcyeiIvPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo=\"\nLABEL oc.keyword=\"cntlm,cntlm,proxy,ntlm\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.cntlm\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"\nLABEL oc.name=\"cntlm\"\nLABEL oc.displayname=\"cntlm\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"network_mode\\\":\\\"container\\\"}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"cntlm\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--class cntlm -- bash -c '/usr/sbin/cntlm -f -v; exec bash'\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN chown balloon:root /etc/cntlm.conf\nRUN chmod 755 /composer/cntlm.mustache\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cntlm/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cntlm/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application cntlm

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cntlm.d\n
"},{"location":"applications/cntlm/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f cntlm.d -t cntlm .\n
"},{"location":"applications/cntlm/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect cntlm > cntlm.json\ndocker image save cntlm -o cntlm.tar\nctr -n k8s.io images import cntlm.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cntlm.json\n\n
"},{"location":"applications/corsix-th/","title":"corsix-th","text":""},{"location":"applications/corsix-th/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/corsix-th/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/corsix-th/#ubuntu-packages","title":"Ubuntu packages","text":"
libgl1 corsix-th\n
"},{"location":"applications/corsix-th/#path","title":"Path","text":"
/usr/games/corsix-th\n
"},{"location":"applications/corsix-th/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/corsix-th/#wm_class","title":"WM_CLASS","text":"
corsix-th.corsix-th\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/corsix-th/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/com.corsixth.CorsixTH.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/corsix-th/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\nRUN cd /composer &&  curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\nCOPY corsix-th.config.txt /composer/corsix-th.config.txt\n
"},{"location":"applications/corsix-th/#json-dump","title":"JSON dump","text":"

json source file corsix-th.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\",\n        \"RUN cd /composer &&  curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\",\n        \"COPY corsix-th.config.txt /composer/corsix-th.config.txt\"\n    ],\n    \"debpackage\": \"libgl1 corsix-th\",\n    \"icon\": \"games.svg\",\n    \"keyword\": \"hospital,role,playing\",\n    \"launch\": \"corsix-th.corsix-th\",\n    \"name\": \"corsix-th\",\n    \"path\": \"/usr/games/corsix-th\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/com.corsixth.CorsixTH.desktop\"\n}\n
"},{"location":"applications/corsix-th/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output corsix-th.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/corsix-th.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @corsix-th.d.3.0.json\n\n
"},{"location":"applications/corsix-th/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes unzip && apt-get clean\nRUN cd /composer &&  curl -Ls https://th.corsix.org/Demo.zip -o Demo.zip && unzip Demo.zip && rm -rf Demo.zip\nCOPY corsix-th.config.txt /composer/corsix-th.config.txt\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends libgl1 corsix-th && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"games.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgeD0iMHB4IgogICB5PSIwcHgiCiAgIHdpZHRoPSIyNDguNTcxcHgiCiAgIGhlaWdodD0iMjQ4LjU3MXB4IgogICB2aWV3Qm94PSIwIDAgMjQ4LjU3MSAyNDguNTcxIgogICBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNDguNTcxIDI0OC41NzEiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJWaWRlby1HYW1lLUNvbnRyb2xsZXItSWNvbi1JRFYtZ3JlZW4uc3ZnIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE1NyI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGU+PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczU1IiAvPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzAwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjQ4MCIKICAgICBpZD0ibmFtZWR2aWV3NTMiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuOTQ5NDI2OTMiCiAgICAgaW5rc2NhcGU6Y3g9IjEyNC4yODU1IgogICAgIGlua3NjYXBlOmN5PSIxMjQuMjg1NSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIgLz48cGF0aAogICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgZD0iTTg3LjQyMyw4OC45NjhjMC41NjIsMy4xMjYtMS41MTcsNi4xMTUtNC42NDIsNi42NzZsLTMzLjk1Niw2LjEwMmMtMy4xMjYsMC41NjItNi4xMTUtMS41MTctNi42NzYtNC42NDIgIGwwLDBjLTAuNTYyLTMuMTI2LDEuNTE3LTYuMTE1LDQuNjQyLTYuNjc2bDMzLjk1Ni02LjEwMkM4My44NzMsODMuNzY0LDg2Ljg2MSw4NS44NDIsODcuNDIzLDg4Ljk2OEw4Ny40MjMsODguOTY4eiIKICAgICBpZD0icGF0aDMiIC8+PGcKICAgICBpZD0ibGF5ZXIxIgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yODUuNzE0MjksLTM2NS4yMTkzMikiPjxwYXRoCiAgICAgICBpZD0icGF0aDI5ODUiCiAgICAgICBmaWxsPSIjRUEzRDRFIgogICAgICAgZD0iTTUzNC4yODUsNDg5LjUwNWMwLjAyNCw2OC42NDEtNTUuNjAxLDEyNC4zMDUtMTI0LjI0MiwxMjQuMzI5ICAgcy0xMjQuMzA1LTU1LjYwMi0xMjQuMzI5LTEyNC4yNDNjMC0wLjAyOSwwLTAuMDU4LDAtMC4wODZjLTAuMDI0LTY4LjY0MSw1NS42MDItMTI0LjMwNSwxMjQuMjQzLTEyNC4zMjkgICBjNjguNjQxLTAuMDIzLDEyNC4zMDUsNTUuNjAyLDEyNC4zMjgsMTI0LjI0M0M1MzQuMjg1LDQ4OS40NDcsNTM0LjI4NSw0ODkuNDc2LDUzNC4yODUsNDg5LjUwNXoiCiAgICAgICBzdHlsZT0iZmlsbDojNzZjMmFmO2ZpbGwtb3BhY2l0eToxIiAvPjxwYXRoCiAgICAgICBpZD0icGF0aDMwOTkiCiAgICAgICBmaWxsPSIjMjMxRjIwIgogICAgICAgc3Ryb2tlPSIjMjMxRjIwIgogICAgICAgc3Ryb2tlLXdpZHRoPSI2IgogICAgICAgZD0iTTQxMC45NTEsMzY2LjcyNiAgIGMtMi41ODMsMjcuMzY0LTguNjUsNDAuMDUxLTExLjA1OSw1MC45MjJjLTEuMjA0LDUuNDM2LTEuNDY4LDEwLjQzMiwwLjA5NCwxNi40NjZzNC45NDMsMTMuMTA3LDExLjAyNywyMi44MDhsMC44NDYtMC41MTggICBjLTYuMDU3LTkuNjU5LTkuMzc4LTE2LjY0OS0xMC45MDEtMjIuNTM0Yy0xLjUyMy01Ljg4NS0xLjI0Ny0xMC42NjItMC4wNjMtMTYuMDA4YzIuMzY5LTEwLjY5NCw4LjQ2NS0yMy41NjksMTEuMDU4LTUxLjA0NCAgIEw0MTAuOTUxLDM2Ni43MjZMNDEwLjk1MSwzNjYuNzI2eiIgLz48ZwogICAgICAgaWQ9ImczOTE1Ij48ZwogICAgICAgICBpZD0iZzkiPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzXzFfIgogICAgICAgICAgIGZpbGw9IiNDMUJDOUQiCiAgICAgICAgICAgZD0iTTM5OS4yNjUsNTA0Ljk0YzAsMjIuMDkyLTE3LjkwOSw0MC00MCw0MGMtMjIuMDkyLDAtNDAtMTcuOTA4LTQwLTQwbDAsMCAgICAgYzAtMjIuMDkxLDE3LjkwOC00MCw0MC00MEMzODEuMzU2LDQ2NC45NCwzOTkuMjY1LDQ4Mi44NDksMzk5LjI2NSw1MDQuOTR6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzLTdfMV8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNTAxLjI2NCw1MDQuOTRjMCwyMi4wOTItMTcuOTA4LDQwLTQwLDQwcy00MC0xNy45MDgtNDAtNDBsMCwwICAgICBjMC0yMi4wOTEsMTcuOTA4LTQwLDQwLTQwUzUwMS4yNjQsNDgyLjg0OSw1MDEuMjY0LDUwNC45NHoiIC8+PHJlY3QKICAgICAgICAgICBpZD0icmVjdDMwMzFfMV8iCiAgICAgICAgICAgeD0iMzU2LjA1IgogICAgICAgICAgIHk9IjQ2NC45NCIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIHdpZHRoPSIxMDUuNzEzIgogICAgICAgICAgIGhlaWdodD0iNjAiIC8+PC9nPjxnCiAgICAgICAgIGlkPSJnMTQiPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzIgogICAgICAgICAgIGZpbGw9IiNGMkYyRjIiCiAgICAgICAgICAgZD0iTTM5OS41OTgsNDk2LjI3M2MwLDIyLjA5Mi0xNy45MDksNDAtNDAsNDBjLTIyLjA5MiwwLTQwLTE3LjkwOC00MC00MGwwLDAgICAgIGMwLTIyLjA5MSwxNy45MDgtNDAsNDAtNDBDMzgxLjY4OSw0NTYuMjczLDM5OS41OTgsNDc0LjE4MiwzOTkuNTk4LDQ5Ni4yNzN6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgyOTkzLTciCiAgICAgICAgICAgZmlsbD0iI0YyRjJGMiIKICAgICAgICAgICBkPSJNNTAxLjU5OCw0OTYuMjczYzAsMjIuMDkyLTE3LjkwOCw0MC00MCw0MHMtNDAtMTcuOTA4LTQwLTQwbDAsMCAgICAgYzAtMjIuMDkxLDE3LjkwOC00MCw0MC00MFM1MDEuNTk4LDQ3NC4xODIsNTAxLjU5OCw0OTYuMjczeiIgLz48cmVjdAogICAgICAgICAgIGlkPSJyZWN0MzAzMSIKICAgICAgICAgICB4PSIzNTYuMzg0IgogICAgICAgICAgIHk9IjQ1Ni4yNzMiCiAgICAgICAgICAgZmlsbD0iI0YyRjJGMiIKICAgICAgICAgICB3aWR0aD0iMTA1LjcxNCIKICAgICAgICAgICBoZWlnaHQ9IjYwIiAvPjwvZz48ZwogICAgICAgICBpZD0iZzE5Ij48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NV8yXyIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik00NzIuMzg3LDQ3OC40NzFjMCw1LjA2MS00LjEwNCw5LjE2My05LjE2NCw5LjE2M3MtOS4xNjMtNC4xMDItOS4xNjMtOS4xNjMgICAgIGMwLTUuMDYxLDQuMTAzLTkuMTYzLDkuMTYzLTkuMTYzUzQ3Mi4zODcsNDczLjQxLDQ3Mi4zODcsNDc4LjQ3MUw0NzIuMzg3LDQ3OC40NzF6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTBfMl8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNDcyLjUzMSw1MTYuMDA1YzAsNS4wNjEtNC4xMDMsOS4xNjMtOS4xNjIsOS4xNjNjLTUuMDYyLDAtOS4xNjQtNC4xMDMtOS4xNjQtOS4xNjMgICAgIGMwLTUuMDYyLDQuMTAzLTkuMTY0LDkuMTY0LTkuMTY0QzQ2OC40MjksNTA2Ljg0MSw0NzIuNTMxLDUxMC45NDMsNDcyLjUzMSw1MTYuMDA1TDQ3Mi41MzEsNTE2LjAwNXoiIC8+PHBhdGgKICAgICAgICAgICBpZD0icGF0aDMwNTUtOV8yXyIKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik00OTEuMTI1LDQ5Ny4zNzZjMCw1LjA2LTQuMTA0LDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MywwLTkuMTY0LTQuMTA0LTkuMTY0LTkuMTYzICAgICBjMC01LjA2Miw0LjEwMi05LjE2NCw5LjE2NC05LjE2NEM0ODcuMDIxLDQ4OC4yMTIsNDkxLjEyNSw0OTIuMzE1LDQ5MS4xMjUsNDk3LjM3Nkw0OTEuMTI1LDQ5Ny4zNzZ6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTRfMl8iCiAgICAgICAgICAgZmlsbD0iI0MxQkM5RCIKICAgICAgICAgICBkPSJNNDUzLjcyNCw0OTcuMzU2YzAsNS4wNjMtNC4xMDMsOS4xNjQtOS4xNjMsOS4xNjRjLTUuMDYyLDAtOS4xNjMtNC4xMDItOS4xNjMtOS4xNjQgICAgIGMwLTUuMDYsNC4xMDItOS4xNjMsOS4xNjMtOS4xNjNDNDQ5LjYyMSw0ODguMTkzLDQ1My43MjQsNDkyLjI5Niw0NTMuNzI0LDQ5Ny4zNTZMNDUzLjcyNCw0OTcuMzU2eiIgLz48L2c+PGcKICAgICAgICAgaWQ9ImcyNSI+PHBhdGgKICAgICAgICAgICBpZD0icGF0aDMwNTVfMV8iCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNNDcyLjM4Nyw0NzcuMjIxYzAsNS4wNjEtNC4xMDQsOS4xNjMtOS4xNjQsOS4xNjNzLTkuMTYzLTQuMTAyLTkuMTYzLTkuMTYzICAgICBjMC01LjA2MSw0LjEwMy05LjE2Myw5LjE2My05LjE2M1M0NzIuMzg3LDQ3Mi4xNiw0NzIuMzg3LDQ3Ny4yMjFMNDcyLjM4Nyw0NzcuMjIxeiIgLz48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NS0wXzFfIgogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTQ3Mi41MzEsNTE0Ljc1NWMwLDUuMDYxLTQuMTAzLDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MiwwLTkuMTY0LTQuMTAzLTkuMTY0LTkuMTYzICAgICBjMC01LjA2Miw0LjEwMy05LjE2NCw5LjE2NC05LjE2NEM0NjguNDI5LDUwNS41OTEsNDcyLjUzMSw1MDkuNjkzLDQ3Mi41MzEsNTE0Ljc1NUw0NzIuNTMxLDUxNC43NTV6IiAvPjxwYXRoCiAgICAgICAgICAgaWQ9InBhdGgzMDU1LTlfMV8iCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNNDkxLjEyNSw0OTYuMTI2YzAsNS4wNi00LjEwNCw5LjE2My05LjE2Miw5LjE2M2MtNS4wNjMsMC05LjE2NC00LjEwNC05LjE2NC05LjE2MyAgICAgYzAtNS4wNjIsNC4xMDItOS4xNjQsOS4xNjQtOS4xNjRDNDg3LjAyMSw0ODYuOTYyLDQ5MS4xMjUsNDkxLjA2NSw0OTEuMTI1LDQ5Ni4xMjZMNDkxLjEyNSw0OTYuMTI2eiIgLz48cGF0aAogICAgICAgICAgIGlkPSJwYXRoMzA1NS00XzFfIgogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTQ1My43MjQsNDk2LjEwNmMwLDUuMDYzLTQuMTAzLDkuMTY0LTkuMTYzLDkuMTY0Yy01LjA2MiwwLTkuMTYzLTQuMTAyLTkuMTYzLTkuMTY0ICAgICBjMC01LjA2LDQuMTAyLTkuMTYzLDkuMTYzLTkuMTYzQzQ0OS42MjEsNDg2Ljk0Myw0NTMuNzI0LDQ5MS4wNDYsNDUzLjcyNCw0OTYuMTA2TDQ1My43MjQsNDk2LjEwNnoiIC8+PC9nPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzA1NSIKICAgICAgICAgZmlsbD0iIzMzMzMzMyIKICAgICAgICAgZD0iTTQ3Mi4zODcsNDc0Ljg0NmMwLDUuMDYxLTQuMTA0LDkuMTYzLTkuMTY0LDkuMTYzcy05LjE2My00LjEwMy05LjE2My05LjE2MyAgICBjMC01LjA2MSw0LjEwMy05LjE2Myw5LjE2My05LjE2M1M0NzIuMzg3LDQ2OS43ODUsNDcyLjM4Nyw0NzQuODQ2TDQ3Mi4zODcsNDc0Ljg0NnoiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgzMDU1LTAiCiAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgIGQ9Ik00NzIuNTMxLDUxMi4zOGMwLDUuMDYxLTQuMTAzLDkuMTYzLTkuMTYyLDkuMTYzYy01LjA2MiwwLTkuMTY0LTQuMTAzLTkuMTY0LTkuMTYzICAgIGMwLTUuMDYyLDQuMTAzLTkuMTY0LDkuMTY0LTkuMTY0QzQ2OC40MjksNTAzLjIxNiw0NzIuNTMxLDUwNy4zMTgsNDcyLjUzMSw1MTIuMzhMNDcyLjUzMSw1MTIuMzh6IiAvPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzA1NS05IgogICAgICAgICBmaWxsPSIjMzMzMzMzIgogICAgICAgICBkPSJNNDkxLjEyNSw0OTMuNzUxYzAsNS4wNi00LjEwNCw5LjE2My05LjE2Miw5LjE2M2MtNS4wNjMsMC05LjE2NC00LjEwNC05LjE2NC05LjE2MyAgICBjMC01LjA2Miw0LjEwMi05LjE2NCw5LjE2NC05LjE2NEM0ODcuMDIxLDQ4NC41ODgsNDkxLjEyNSw0ODguNjksNDkxLjEyNSw0OTMuNzUxTDQ5MS4xMjUsNDkzLjc1MXoiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgzMDU1LTQiCiAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgIGQ9Ik00NTMuNzI0LDQ5My43MzFjMCw1LjA2My00LjEwMyw5LjE2NC05LjE2Myw5LjE2NGMtNS4wNjIsMC05LjE2My00LjEwMi05LjE2My05LjE2NCAgICBjMC01LjA2LDQuMTAyLTkuMTYzLDkuMTYzLTkuMTYzQzQ0OS42MjEsNDg0LjU2OCw0NTMuNzI0LDQ4OC42NzEsNDUzLjcyNCw0OTMuNzMxTDQ1My43MjQsNDkzLjczMXoiIC8+PGcKICAgICAgICAgaWQ9ImczNSI+PHBhdGgKICAgICAgICAgICBmaWxsPSIjQzFCQzlEIgogICAgICAgICAgIGQ9Ik0zODMuNzUsNTAyLjEzYzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVoLTM2LjI1Yy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1bDAsMCAgICAgYzAtMy43OTcsMy4wNzgtNi44NzUsNi44NzUtNi44NzVoMzYuMjVDMzgwLjY3Miw0OTUuMjU1LDM4My43NSw0OTguMzMzLDM4My43NSw1MDIuMTNMMzgzLjc1LDUwMi4xM3oiCiAgICAgICAgICAgaWQ9InBhdGgzNyIgLz48cGF0aAogICAgICAgICAgIGZpbGw9IiNDMUJDOUQiCiAgICAgICAgICAgZD0iTTM1OC42MjUsNDc3LjEzYzMuNzk3LDAsNi44NzUsMy4wNzgsNi44NzUsNi44NzV2MzYuMjVjMCwzLjc5Ny0zLjA3OCw2Ljg3NS02Ljg3NSw2Ljg3NWwwLDAgICAgIGMtMy43OTcsMC02Ljg3NS0zLjA3OC02Ljg3NS02Ljg3NXYtMzYuMjVDMzUxLjc1LDQ4MC4yMDgsMzU0LjgyOCw0NzcuMTMsMzU4LjYyNSw0NzcuMTNMMzU4LjYyNSw0NzcuMTN6IgogICAgICAgICAgIGlkPSJwYXRoMzkiIC8+PC9nPjxnCiAgICAgICAgIGlkPSJnNDEiPjxwYXRoCiAgICAgICAgICAgZmlsbD0iIzE0MTIxMiIKICAgICAgICAgICBkPSJNMzgzLjc1LDQ5OS4yNTVjMCwzLjc5Ny0zLjA3OCw2Ljg3NS02Ljg3NSw2Ljg3NWgtMzYuMjVjLTMuNzk3LDAtNi44NzUtMy4wNzgtNi44NzUtNi44NzVsMCwwICAgICBjMC0zLjc5NywzLjA3OC02Ljg3NSw2Ljg3NS02Ljg3NWgzNi4yNUMzODAuNjcyLDQ5Mi4zOCwzODMuNzUsNDk1LjQ1OCwzODMuNzUsNDk5LjI1NUwzODMuNzUsNDk5LjI1NXoiCiAgICAgICAgICAgaWQ9InBhdGg0MyIgLz48cGF0aAogICAgICAgICAgIGZpbGw9IiMxNDEyMTIiCiAgICAgICAgICAgZD0iTTM1OC42MjUsNDc0LjI1NWMzLjc5NywwLDYuODc1LDMuMDc4LDYuODc1LDYuODc1djM2LjI1YzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVsMCwwICAgICBjLTMuNzk3LDAtNi44NzUtMy4wNzgtNi44NzUtNi44NzV2LTM2LjI1QzM1MS43NSw0NzcuMzMzLDM1NC44MjgsNDc0LjI1NSwzNTguNjI1LDQ3NC4yNTVMMzU4LjYyNSw0NzQuMjU1eiIKICAgICAgICAgICBpZD0icGF0aDQ1IiAvPjwvZz48ZwogICAgICAgICBpZD0iZzQ3Ij48cGF0aAogICAgICAgICAgIGZpbGw9IiMzMzMzMzMiCiAgICAgICAgICAgZD0iTTM4My43NSw0OTUuNzU1YzAsMy43OTctMy4wNzgsNi44NzUtNi44NzUsNi44NzVoLTM2LjI1Yy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1bDAsMCAgICAgYzAtMy43OTcsMy4wNzgtNi44NzUsNi44NzUtNi44NzVoMzYuMjVDMzgwLjY3Miw0ODguODgsMzgzLjc1LDQ5MS45NTgsMzgzLjc1LDQ5NS43NTVMMzgzLjc1LDQ5NS43NTV6IgogICAgICAgICAgIGlkPSJwYXRoNDkiIC8+PHBhdGgKICAgICAgICAgICBmaWxsPSIjMzMzMzMzIgogICAgICAgICAgIGQ9Ik0zNTguNjI1LDQ3MC43NTVjMy43OTcsMCw2Ljg3NSwzLjA3OCw2Ljg3NSw2Ljg3NXYzNi4yNWMwLDMuNzk3LTMuMDc4LDYuODc1LTYuODc1LDYuODc1bDAsMCAgICAgYy0zLjc5NywwLTYuODc1LTMuMDc4LTYuODc1LTYuODc1di0zNi4yNUMzNTEuNzUsNDczLjgzMywzNTQuODI4LDQ3MC43NTUsMzU4LjYyNSw0NzAuNzU1TDM1OC42MjUsNDcwLjc1NXoiCiAgICAgICAgICAgaWQ9InBhdGg1MSIgLz48L2c+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"corsix-th,hospital,role,playing\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"com.corsixth.CorsixTH.desktop\"\nLABEL oc.launch=\"corsix-th.corsix-th\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"corsix-th\"\nLABEL oc.displayname=\"corsix-th\"\nLABEL oc.path=\"/usr/games/corsix-th\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"corsix-th\"\nENV APPBIN \"/usr/games/corsix-th\"\nENV APP \"/usr/games/corsix-th\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/corsix-th/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/corsix-th/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application corsix-th

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/corsix-th.d\n
"},{"location":"applications/corsix-th/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f corsix-th.d -t corsix-th .\n
"},{"location":"applications/corsix-th/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect corsix-th > corsix-th.json\ndocker image save corsix-th -o corsix-th.tar\nctr -n k8s.io images import corsix-th.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @corsix-th.json\n\n
"},{"location":"applications/cuda/","title":"cuda","text":""},{"location":"applications/cuda/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.nvidia.22.04

"},{"location":"applications/cuda/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cuda/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-terminal dbus-x11 git\n
"},{"location":"applications/cuda/#arguments","title":"Arguments","text":"

\"--disable-factory --class=cuda\"

"},{"location":"applications/cuda/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/cuda/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/cuda/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.cuda\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/cuda/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/cuda/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

"},{"location":"applications/cuda/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
"},{"location":"applications/cuda/#json-dump","title":"JSON dump","text":"

json source file cuda.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [],\n    \"debpackage\": \"gnome-terminal dbus-x11 git\",\n    \"icon\": \"nvidia.svg\",\n    \"keyword\": \"cuda nvidia\",\n    \"launch\": \"gnome-terminal-server.cuda\",\n    \"name\": \"cuda\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=cuda\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\"\n    ]\n}\n
"},{"location":"applications/cuda/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output cuda.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cuda.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cuda.d.3.0.json\n\n
"},{"location":"applications/cuda/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal dbus-x11 git && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cuda,cuda nvidia\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cuda\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=cuda\"\nLABEL oc.name=\"cuda\"\nLABEL oc.displayname=\"cuda\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cuda\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=cuda\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cuda/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cuda/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application cuda

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cuda.d\n
"},{"location":"applications/cuda/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f cuda.d -t cuda .\n
"},{"location":"applications/cuda/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect cuda > cuda.json\ndocker image save cuda -o cuda.tar\nctr -n k8s.io images import cuda.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cuda.json\n\n
"},{"location":"applications/cudademo/","title":"cudademo","text":""},{"location":"applications/cudademo/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.nvidia.22.04

"},{"location":"applications/cudademo/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cudademo/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\n
"},{"location":"applications/cudademo/#arguments","title":"Arguments","text":"

\"--disable-factory --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"

"},{"location":"applications/cudademo/#displayname","title":"Displayname","text":"
cuda demo\n
"},{"location":"applications/cudademo/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/cudademo/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/cudademo/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.cudademo\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/cudademo/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/cudademo/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

"},{"location":"applications/cudademo/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
"},{"location":"applications/cudademo/#json-dump","title":"JSON dump","text":"

json source file cudademo.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [],\n    \"debpackage\": \"gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\",\n    \"icon\": \"nvidia.svg\",\n    \"keyword\": \"cuda nvidia\",\n    \"launch\": \"gnome-terminal-server.cudademo\",\n    \"name\": \"cudademo\",\n    \"displayname\": \"cuda demo\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\"\n    ]\n}\n
"},{"location":"applications/cudademo/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output cudademo.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudademo.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudademo.d.3.0.json\n\n
"},{"location":"applications/cudademo/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal dbus-x11 git cuda-demo-suite-12-0 libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cudademo,cuda nvidia\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cudademo\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"\nLABEL oc.name=\"cudademo\"\nLABEL oc.displayname=\"cuda demo\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cudademo\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=cudademo -- cd /usr/local/cuda/extras/demo_suite\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cudademo/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cudademo/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application cudademo

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudademo.d\n
"},{"location":"applications/cudademo/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f cudademo.d -t cudademo .\n
"},{"location":"applications/cudademo/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect cudademo > cudademo.json\ndocker image save cudademo -o cudademo.tar\nctr -n k8s.io images import cudademo.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudademo.json\n\n
"},{"location":"applications/cudadev/","title":"cudadev","text":""},{"location":"applications/cudadev/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.nvidia.22.04

"},{"location":"applications/cudadev/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/cudadev/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\n
"},{"location":"applications/cudadev/#arguments","title":"Arguments","text":"

\"--disable-factory --class=cudadev\"

"},{"location":"applications/cudadev/#displayname","title":"Displayname","text":"
cuda developper\n
"},{"location":"applications/cudadev/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/cudadev/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/cudadev/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.cudadev\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/cudadev/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/cudadev/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

"},{"location":"applications/cudadev/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nRUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \nRUN echo \"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\" > /cuda.sh\nRUN echo \"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\" >> /cuda.sh\n
"},{"location":"applications/cudadev/#json-dump","title":"JSON dump","text":"

json source file cudadev.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [],\n    \"debpackage\": \"gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils\",\n    \"icon\": \"nvidia.svg\",\n    \"keyword\": \"cuda nvidia dev\",\n    \"launch\": \"gnome-terminal-server.cudadev\",\n    \"name\": \"cudadev\",\n    \"displayname\": \"cuda developper\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=cudadev\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\",\n        \"RUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \",\n        \"RUN echo \\\"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\\\" > /cuda.sh\",\n        \"RUN echo \\\"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\\\" >> /cuda.sh\"\n    ]\n}\n
"},{"location":"applications/cudadev/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output cudadev.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudadev.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudadev.d.3.0.json\n\n
"},{"location":"applications/cudadev/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal dbus-x11 git cuda libnvidia-cfg1-525 libnvidia-common-525 libnvidia-compute-525 libnvidia-decode-525 libnvidia-encode-525 libnvidia-extra-525 libnvidia-fbc1-525 git libglu1-mesa libxi6 libxinerama1 libxmu6 libglu1-mesa mesa-utils freeglut3 x11-xserver-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"nvidia.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzUxLjQ2cHgiDQoJIGhlaWdodD0iMjU4Ljc4NXB4IiB2aWV3Qm94PSIzNS4xODggMzEuNTEyIDM1MS40NiAyNTguNzg1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDM1LjE4OCAzMS41MTIgMzUxLjQ2IDI1OC43ODUiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHRpdGxlICBpZD0idGl0bGU0Ij5nZW5lcmF0ZWQgYnkgcHN0b2VkaXQgdmVyc2lvbjozLjQ0IGZyb20gTlZCYWRnZV8yRC5lcHM8L3RpdGxlPg0KPHBhdGggaWQ9InBhdGgxNyIgZD0iTTM4NC4xOTUsMjgyLjEwOWMwLDMuNzcxLTIuNzY5LDYuMzAyLTYuMDQ3LDYuMzAydi0wLjAyM2MtMy4zNzEsMC4wMjMtNi4wODktMi41MDgtNi4wODktNi4yNzgNCgljMC0zLjc2OSwyLjcxOC02LjI5Myw2LjA4OS02LjI5M0MzODEuNDI3LDI3NS44MTYsMzg0LjE5NSwyNzguMzQsMzg0LjE5NSwyODIuMTA5eiBNMzg2LjY0OCwyODIuMTA5YzAtNS4xNzUtNC4wMi04LjE3OS04LjUtOC4xNzkNCgljLTQuNTExLDAtOC41MzEsMy4wMDQtOC41MzEsOC4xNzljMCw1LjE3Miw0LjAyMSw4LjE4OCw4LjUzMSw4LjE4OEMzODIuNjI5LDI5MC4yOTcsMzg2LjY0OCwyODcuMjgxLDM4Ni42NDgsMjgyLjEwOQ0KCSBNMzc2LjczOCwyODIuODAxaDAuOTFsMi4xMDksMy43MDNoMi4zMTZsLTIuMzM2LTMuODU5YzEuMjA3LTAuMDg2LDIuMi0wLjY2MSwyLjItMi4yODZjMC0yLjAxOS0xLjM5Mi0yLjY2OC0zLjc1LTIuNjY4aC0zLjQxMQ0KCXY4LjgxM2gxLjk2MVYyODIuODAxIE0zNzYuNzM4LDI4MS4zMDl2LTIuMTIyaDEuMzY0YzAuNzQyLDAsMS43NTMsMC4wNiwxLjc1MywwLjk2NWMwLDAuOTg1LTAuNTIzLDEuMTU3LTEuMzk4LDEuMTU3SDM3Ni43MzgiLz4NCjxwYXRoIGlkPSJwYXRoMTkiIGQ9Ik0zMjkuNDA2LDIzNy4wMjdsMTAuNTk4LDI4Ljk5M0gzMTguNDhMMzI5LjQwNiwyMzcuMDI3eiBNMzE4LjA1NiwyMjUuNzM4bC0yNC40MjMsNjEuODhoMTcuMjQ2bDMuODYzLTEwLjkzNA0KCWgyOC45MDNsMy42NTYsMTAuOTM0aDE4LjcyMmwtMjQuNjA1LTYxLjg4OEwzMTguMDU2LDIyNS43Mzh6IE0yNjkuMDIzLDI4Ny42NDFoMTcuNDk3di02MS45MjJsLTE3LjUtMC4wMDRMMjY5LjAyMywyODcuNjQxeg0KCSBNMTQ3LjU1NiwyMjUuNzE1bC0xNC41OTgsNDkuMDc4bC0xMy45ODQtNDkuMDc0bC0xOC44NzktMC4wMDRsMTkuOTcyLDYxLjkyNmgyNS4yMDdsMjAuMTMzLTYxLjkyNkgxNDcuNTU2eiBNMjE4LjI4MSwyMzkuMTk5aDcuNTINCgljMTAuOTEsMCwxNy45NjYsNC44OTgsMTcuOTY2LDE3LjYwOWMwLDEyLjcxNC03LjA1NiwxNy42MTMtMTcuOTY2LDE3LjYxM2gtNy41MlYyMzkuMTk5eiBNMjAwLjkzMSwyMjUuNzE1djYxLjkyNmgyOC4zNjYNCgljMTUuMTEzLDAsMjAuMDQ4LTIuNTEyLDI1LjM4NC04LjE0OGMzLjc2OS0zLjk1Nyw2LjIwNy0xMi42NDEsNi4yMDctMjIuMTM0YzAtOC43MDctMi4wNjMtMTYuNDY4LTUuNjYtMjEuMzA0DQoJYy02LjQ4MS04LjY0OS0xNS44MTctMTAuMzQtMjkuNzUtMTAuMzRIMjAwLjkzMXogTTM1LjE4OCwyMjUuNjI5djYyLjAxMmgxNy42NDV2LTQ3LjA4NmwxMy42NzIsMC4wMDQNCgljNC41MjcsMCw3Ljc1NCwxLjEyOCw5LjkzNCwzLjQ1N2MyLjc2NSwyLjk0NSwzLjg5NCw3LjY5OSwzLjg5NCwxNi4zOTV2MjcuMjNoMTcuMDk4di0zNC4yNjJjMC0yNC40NTMtMTUuNTg2LTI3Ljc1LTMwLjgzNi0yNy43NQ0KCUgzNS4xODh6IE0xNzIuNzcxLDIyNS43MTVsMC4wMDcsNjEuOTI2aDE3LjQ4OXYtNjEuOTI2SDE3Mi43NzF6Ii8+DQo8cGF0aCBpZD0icGF0aDIxIiBmaWxsPSIjNzdCOTAwIiBkPSJNODIuMjExLDEwMi40MTRjMCwwLDIyLjUwNC0zMy4yMDMsNjcuNDM3LTM2LjYzOFY1My43Mw0KCWMtNDkuNzY5LDMuOTk3LTkyLjg2Nyw0Ni4xNDktOTIuODY3LDQ2LjE0OXMyNC40MSw3MC41NjUsOTIuODY3LDc3LjAyNnYtMTIuODA0Qzk5LjQxMSwxNTcuNzgxLDgyLjIxMSwxMDIuNDE0LDgyLjIxMSwxMDIuNDE0eg0KCSBNMTQ5LjY0OCwxMzguNjM3djExLjcyNmMtMzcuOTY4LTYuNzY5LTQ4LjUwNy00Ni4yMzctNDguNTA3LTQ2LjIzN3MxOC4yMy0yMC4xOTUsNDguNTA3LTIzLjQ3djEyLjg2Nw0KCWMtMC4wMjMsMC0wLjAzOS0wLjAwNy0wLjA1OC0wLjAwN2MtMTUuODkxLTEuOTA3LTI4LjMwNSwxMi45MzgtMjguMzA1LDEyLjkzOFMxMjguMjQzLDEzMS40NDUsMTQ5LjY0OCwxMzguNjM3IE0xNDkuNjQ4LDMxLjUxMg0KCVY1My43M2MxLjQ2MS0wLjExMiwyLjkyMi0wLjIwNyw0LjM5MS0wLjI1N2M1Ni41ODItMS45MDcsOTMuNDQ5LDQ2LjQwNiw5My40NDksNDYuNDA2cy00Mi4zNDMsNTEuNDg4LTg2LjQ1Nyw1MS40ODgNCgljLTQuMDQzLDAtNy44MjgtMC4zNzUtMTEuMzgzLTEuMDA1djEzLjczOWMzLjA0LDAuMzg2LDYuMTkyLDAuNjEzLDkuNDgxLDAuNjEzYzQxLjA1MSwwLDcwLjczOC0yMC45NjUsOTkuNDg0LTQ1Ljc3OA0KCWM0Ljc2NiwzLjgxNywyNC4yNzgsMTMuMTAzLDI4LjI4OSwxNy4xNjhjLTI3LjMzMiwyMi44ODMtOTEuMDMxLDQxLjMyOS0xMjcuMTQ0LDQxLjMyOWMtMy40ODEsMC02LjgyNC0wLjIxMS0xMC4xMS0wLjUyOHYxOS4zMDYNCgloMTU2LjAzMlYzMS41MTJIMTQ5LjY0OHogTTE0OS42NDgsODAuNjU2VjY1Ljc3N2MxLjQ0Ni0wLjEwMSwyLjkwMy0wLjE3OSw0LjM5MS0wLjIyNmM0MC42ODgtMS4yNzgsNjcuMzgyLDM0Ljk2NSw2Ny4zODIsMzQuOTY1DQoJcy0yOC44MzIsNDAuMDQzLTU5Ljc0Niw0MC4wNDNjLTQuNDQ5LDAtOC40MzgtMC43MTUtMTIuMDI4LTEuOTIyVjkzLjUyM2MxNS44NCwxLjkxNCwxOS4wMjgsOC45MTEsMjguNTUxLDI0Ljc4NmwyMS4xOC0xNy44NTkNCgljMCwwLTE1LjQ2MS0yMC4yNzctNDEuNTI0LTIwLjI3N0MxNTUuMDIxLDgwLjE3MiwxNTIuMzEsODAuMzcxLDE0OS42NDgsODAuNjU2Ii8+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"cudadev,cuda nvidia dev\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.cudadev\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=cudadev\"\nLABEL oc.name=\"cudadev\"\nLABEL oc.displayname=\"cuda developper\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"cudadev\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=cudadev\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nRUN cd /usr/local/cuda && git clone https://github.com/NVIDIA/cuda-samples.git && chmod 777 cuda-samples && cd cuda-samples && chmod -R 777 * \nRUN echo \"export PATH=/usr/local/cuda-12.0/bin${PATH:+:${PATH}}\" > /cuda.sh\nRUN echo \"export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\" >> /cuda.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/cudadev/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/cudadev/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application cudadev

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/cudadev.d\n
"},{"location":"applications/cudadev/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f cudadev.d -t cudadev .\n
"},{"location":"applications/cudadev/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect cudadev > cudadev.json\ndocker image save cudadev -o cudadev.tar\nctr -n k8s.io images import cudadev.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @cudadev.json\n\n
"},{"location":"applications/dia/","title":"Dia","text":""},{"location":"applications/dia/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/dia/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/dia/#alpine-packages","title":"Alpine packages","text":"
dia dia-lang\n
"},{"location":"applications/dia/#path","title":"Path","text":"
/usr/bin/dia\n
"},{"location":"applications/dia/#mimetype","title":"Mimetype","text":"
application/x-dia-diagram;\n
"},{"location":"applications/dia/#file-extensions","title":"File extensions","text":"

\"dia\"

"},{"location":"applications/dia/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"dia\"

"},{"location":"applications/dia/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/dia/#wm_class","title":"WM_CLASS","text":"
dia-gnome.Dia-gnome\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/dia/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/dia.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/dia/#json-dump","title":"JSON dump","text":"

json source file dia.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"dia dia-lang\",\n    \"installrecommends\": true,\n    \"icon\": \"circle_dia.svg\",\n    \"launch\": \"dia-gnome.Dia-gnome\",\n    \"name\": \"Dia\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/dia\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-dia-diagram;\",\n    \"fileextensions\": \"dia\",\n    \"legacyfileextensions\": \"dia\",\n    \"desktopfile\": \"/usr/share/applications/dia.desktop\"\n}\n
"},{"location":"applications/dia/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output dia.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/dia.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @dia.d.3.0.json\n\n
"},{"location":"applications/dia/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update dia dia-lang\nLABEL oc.icon=\"circle_dia.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk0MyIgeD0iLS4xMTk3NCIgeT0iLS4wOTgzNTciIHdpZHRoPSIxLjIzOTUiIGhlaWdodD0iMS4xOTY3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjE0NzUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTE3NCIgeDE9IjMwLjA1NSIgeDI9IjMwLjA1NSIgeTE9IjU3Ljg2MyIgeTI9IjYuNjI0IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDYwLjIwMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFmMWYxZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1MjUyNTIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyMTM3NSIgeD0iLS4wMzA3MiIgeT0iLS4wMzA3MiIgd2lkdGg9IjEuMDYxNCIgaGVpZ2h0PSIxLjA2MTQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzY4Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEzNzUpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgZmlsbCBtYXJrZXJzIi8+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDExNzQpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMDQzIDAgMCAxLjMwNDMgMiAyKSI+CiAgPGcgb3BhY2l0eT0iLjEiPgogICA8cGF0aCBkPSJtMTYuNSAxMWgydjEuOTk2aC0yIiBmaWxsPSIjMDAwMDAwIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMDQzIDAgMCAxLjMwNDMgMiAuNjk1NjUpIj4KICA8cGF0aCBkPSJtMTUgMTF2M2gxdjFoLTJ2M2gydjE0aC0ydjNoMnYwLjg3N2gtMWwyIDMuMTIzIDItMy4xMjNoLTF2LTAuODc3aDljNS41NCAwIDEwLTQuNDYgMTAtMTBzLTQuNDYtMTAtMTAtMTBoLTl2LTFoMXYtM3ptMyA3aDljMy44NzggMCA3IDMuMTIyIDcgN3MtMy4xMjIgNy03IDdoLTl6bTcgMi01IDloMTB6bTAgMy42IDEuODAxIDMuNGgtMy42MDIiIGZpbGw9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmaWx0ZXI5NDMpIiBvcGFjaXR5PSIuNSIvPgogIDxwYXRoIGQ9Im0yNCAxOS01IDloMTBtLTMuMi0yaC0zLjZsMS44LTMuNCIgZmlsbD0iI2ZmOTQwOSIvPgogPC9nPgogPHBhdGggZD0ibTIwLjI2MSAxMy43Mzl2My45MTNoMS4zMDQzdjEuMzA0M2gtMi42MDg3djMuOTEzaDIuNjA4N3YxOC4yNjFoLTIuNjA4N3YzLjkxM2gyLjYwODd2MS4xNDM5aC0xLjMwNDNsMi42MDg3IDQuMDczNSAyLjYwODctNC4wNzM1aC0xLjMwNDN2LTEuMTQzOWgxMS43MzljNy4yMjYxIDAgMTMuMDQzLTUuODE3NCAxMy4wNDMtMTMuMDQzcy01LjgxNzQtMTMuMDQzLTEzLjA0My0xMy4wNDNoLTExLjczOXYtMS4zMDQzaDEuMzA0M3YtMy45MTN6bTMuOTEzIDkuMTMwNGgxMS43MzljNS4wNTgzIDAgOS4xMzA0IDQuMDcyMiA5LjEzMDQgOS4xMzA0cy00LjA3MjIgOS4xMzA0LTkuMTMwNCA5LjEzMDRoLTExLjczOXoiIGZpbGw9IiNmOWY5ZjkiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"dia\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"dia.desktop\"\nLABEL oc.launch=\"dia-gnome.Dia-gnome\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Dia\"\nLABEL oc.displayname=\"Dia\"\nLABEL oc.path=\"/usr/bin/dia\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-dia-diagram;\"\nLABEL oc.fileextensions=\"dia\"\nLABEL oc.legacyfileextensions=\"dia\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Dia\"\nENV APPBIN \"/usr/bin/dia\"\nENV APP \"/usr/bin/dia\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/dia/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/dia/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Dia

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Dia.d\n
"},{"location":"applications/dia/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Dia.d -t Dia .\n
"},{"location":"applications/dia/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Dia > Dia.json\ndocker image save Dia -o Dia.tar\nctr -n k8s.io images import Dia.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Dia.json\n\n
"},{"location":"applications/doom/","title":"doom","text":""},{"location":"applications/doom/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/doom/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/doom/#ubuntu-packages","title":"Ubuntu packages","text":"
chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus\n
"},{"location":"applications/doom/#displayname","title":"Displayname","text":"
Doom\n
"},{"location":"applications/doom/#path","title":"Path","text":"
/usr/games/doom\n
"},{"location":"applications/doom/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/doom/#wm_class","title":"WM_CLASS","text":"
chocolate-doom.chocolate-doom\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/doom/#json-dump","title":"JSON dump","text":"

json source file doom.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus\",\n    \"icon\": \"doom.svg\",\n    \"keyword\": \"doom\",\n    \"launch\": \"chocolate-doom.chocolate-doom\",\n    \"name\": \"doom\",\n    \"displayname\": \"Doom\",\n    \"path\": \"/usr/games/doom\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/doom/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output doom.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/doom.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @doom.d.3.0.json\n\n
"},{"location":"applications/doom/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends chocolate-doom doom-wad-shareware prboom-plus freedoom prboom-plus && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"doom.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzgyMzA1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzhhMjgwNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0yNCA5Yy04LjI4NCAwLTE1IDYuNzE2LTE1IDE1czYuNzE2IDE1IDE1IDE1IDE1LTYuNzE2IDE1LTE1LTYuNzE2LTE1LTE1LTE1em0wIDJjMi4zMDggMCA0LjQ2NSAwLjYwMiA2LjM0NCAxLjY1NmwtNi4zNDQgNC40MDYtNi4zNDQtNC40MDZjMS44NzktMS4wNTUgNC4wNC0xLjY1NiA2LjM0NC0xLjY1NnptLTcuMDk0IDIuMTI1Yy0wLjI0NCAwLjE1OS0wLjQ4NiAwLjMyNS0wLjcxOSAwLjUgMC4yMzMtMC4xNzUgMC40NzQtMC4zNCAwLjcxOS0wLjV6bTE0LjE4OCAwYzAuMjQ0IDAuMTYgMC40ODYgMC4zMjUgMC43MTkgMC41LTAuMjMzLTAuMTc1LTAuNDc1LTAuMzQxLTAuNzE5LTAuNXptLTE0LjIxOSAxLjM3NSA1LjQwNiAzLjc1LTMuMzc1IDIuMzQ0em0xNC4yNSAwLTIuMDMxIDYuMDk0LTMuMzc1LTIuMzQ0em0tMTYuMjUgMC4yNSAyLjM0NCA3LjAzLTYuMDYgNC4yMTljLTAuMS0wLjY1LTAuMTU2LTEuMzIyLTAuMTU2LTIgMC0zLjYyMiAxLjQ4NS02Ljg5MyAzLjg3NS05LjI1em0xOC4yNSAwYzIuMzkgMi4zNTcgMy44NzUgNS42MjggMy44NzUgOS4yNSAwIDAuNjc4LTAuMDU2IDEuMzUtMC4xNTYgMmwtNi4wNi00LjIxOSAyLjM0NC03LjAzem0tOS4xMjUgNC43MTlsNC40MzggMy4wOTQtMS40NjkgNC40MzhoLTUuOTM4bC0xLjQ2OS00LjQzOHptLTYuMTI1IDQuMjUgMS4wOTQgMy4yODFoLTUuODEzem0xMi4yNSAwIDQuNzE5IDMuMjgxaC01LjgxM3ptLTE4Ljk2OSAyLjMxM2MwLjA4IDAuNTEzIDAuMjA1IDEuMDEgMC4zNDQgMS41IDAuMTE0IDAuNDA1IDAuMjU1IDAuOCAwLjQwNiAxLjE4OC0wLjE1Mi0wLjM4OS0wLjI5Mi0wLjc4Mi0wLjQwNi0xLjE4OC0wLjEzOC0wLjQ5LTAuMjY0LTAuOTg5LTAuMzQ0LTEuNXptMjUuNjg4IDBjLTAuMDggMC41MTEtMC4yMDYgMS4wMS0wLjM0NCAxLjUtMC4xMTQgMC40MDYtMC4yNTUgMC43OTktMC40MDYgMS4xODggMC4xNTEtMC4zODggMC4yOTItMC43ODMgMC40MDYtMS4xODggMC4xMzktMC40OTEgMC4yNjQtMC45ODcgMC4zNDQtMS41em0tMjQuODQ0IDIuOTY5aDcuNjI1bDIuNjI1IDcuODc1YzAuMjM0IDAuMDMxIDAuNDggMC4wNDIgMC43MTkgMC4wNjMtMC4yNDItMC4wMTktMC40ODEtMC4wMzEtMC43MTktMC4wNjMtNC42NDgtMC42MjMtOC41MDYtMy42ODktMTAuMjUtNy44NzV6bTkuNzE5IDBoNC41NjNsLTIuMjgxIDYuODc1LTIuMjgxLTYuODc1em02LjY1NiAwaDcuNjI1Yy0xLjc0NCA0LjE4Ni01LjYwMiA3LjI1Mi0xMC4yNSA3Ljg3NS0wLjIzOCAwLjAzMi0wLjQ3NyAwLjA0NC0wLjcxOSAwLjA2MyAwLjIzOS0wLjAyMSAwLjQ4NS0wLjAzMSAwLjcxOS0wLjA2M3oiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8cGF0aCBkPSJtMjQgOGMtOC4yODQgMC0xNSA2LjcxNi0xNSAxNXM2LjcxNiAxNSAxNSAxNSAxNS02LjcxNiAxNS0xNS02LjcxNi0xNS0xNS0xNXptMCAyYzIuMzA4IDAgNC40NjUgMC42MDIgNi4zNDQgMS42NTZsLTYuMzQ0IDQuNDA2LTYuMzQ0LTQuNDA2YzEuODc5LTEuMDU1IDQuMDQtMS42NTYgNi4zNDQtMS42NTZ6bS03LjA5NCAyLjEyNWMtMC4yNDQgMC4xNTktMC40ODYgMC4zMjUtMC43MTkgMC41IDAuMjMzLTAuMTc1IDAuNDc0LTAuMzQgMC43MTktMC41em0xNC4xODggMGMwLjI0NCAwLjE2IDAuNDg2IDAuMzI1IDAuNzE5IDAuNS0wLjIzMy0wLjE3NS0wLjQ3NS0wLjM0MS0wLjcxOS0wLjV6bS0xNC4yMTkgMS4zNzUgNS40MDYgMy43NS0zLjM3NSAyLjM0NHptMTQuMjUgMC0yLjAzMSA2LjA5NC0zLjM3NS0yLjM0NHptLTE2LjI1IDAuMjUgMi4zNDQgNy4wMy02LjA2IDQuMjE5Yy0wLjEtMC42NS0wLjE1Ni0xLjMyMi0wLjE1Ni0yIDAtMy42MjIgMS40ODUtNi44OTMgMy44NzUtOS4yNXptMTguMjUgMGMyLjM5IDIuMzU3IDMuODc1IDUuNjI4IDMuODc1IDkuMjUgMCAwLjY3OC0wLjA1NiAxLjM1LTAuMTU2IDJsLTYuMDYtNC4yMTkgMi4zNDQtNy4wM3ptLTkuMTI1IDQuNzE5bDQuNDM4IDMuMDk0LTEuNDY5IDQuNDM4aC01LjkzOGwtMS40NjktNC40Mzh6bS02LjEyNSA0LjI1IDEuMDk0IDMuMjgxaC01LjgxM3ptMTIuMjUgMCA0LjcxOSAzLjI4MWgtNS44MTN6bS0xOC45NjkgMi4zMTNjMC4wOCAwLjUxMyAwLjIwNSAxLjAxIDAuMzQ0IDEuNSAwLjExNCAwLjQwNSAwLjI1NSAwLjggMC40MDYgMS4xODgtMC4xNTItMC4zODktMC4yOTItMC43ODItMC40MDYtMS4xODgtMC4xMzgtMC40OS0wLjI2NC0wLjk4OS0wLjM0NC0xLjV6bTI1LjY4OCAwYy0wLjA4IDAuNTExLTAuMjA2IDEuMDEtMC4zNDQgMS41LTAuMTE0IDAuNDA2LTAuMjU1IDAuNzk5LTAuNDA2IDEuMTg4IDAuMTUxLTAuMzg4IDAuMjkyLTAuNzgzIDAuNDA2LTEuMTg4IDAuMTM5LTAuNDkxIDAuMjY0LTAuOTg3IDAuMzQ0LTEuNXptLTI0Ljg0NCAyLjk2OWg3LjYyNWwyLjYyNSA3Ljg3NWMwLjIzNCAwLjAzMSAwLjQ4IDAuMDQyIDAuNzE5IDAuMDYzLTAuMjQyLTAuMDE5LTAuNDgxLTAuMDMxLTAuNzE5LTAuMDYzLTQuNjQ4LTAuNjIzLTguNTA2LTMuNjg5LTEwLjI1LTcuODc1em05LjcxOSAwaDQuNTYzbC0yLjI4MSA2Ljg3NS0yLjI4MS02Ljg3NXptNi42NTYgMGg3LjYyNWMtMS43NDQgNC4xODYtNS42MDIgNy4yNTItMTAuMjUgNy44NzUtMC4yMzggMC4wMzItMC40NzcgMC4wNDQtMC43MTkgMC4wNjMgMC4yMzktMC4wMjEgMC40ODUtMC4wMzEgMC43MTktMC4wNjN6IiBzdHlsZT0iZmlsbDojZGM3ZDQxIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"doom,doom\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"chocolate-doom.chocolate-doom\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"doom\"\nLABEL oc.displayname=\"Doom\"\nLABEL oc.path=\"/usr/games/doom\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"doom\"\nENV APPBIN \"/usr/games/doom\"\nENV APP \"/usr/games/doom\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/doom/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/doom/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application doom

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/doom.d\n
"},{"location":"applications/doom/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f doom.d -t doom .\n
"},{"location":"applications/doom/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect doom > doom.json\ndocker image save doom -o doom.tar\nctr -n k8s.io images import doom.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @doom.json\n\n
"},{"location":"applications/draw/","title":"draw","text":""},{"location":"applications/draw/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.libreoffice

"},{"location":"applications/draw/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/draw/#alpine-packages","title":"Alpine packages","text":"
libreoffice-gnome\n
"},{"location":"applications/draw/#arguments","title":"Arguments","text":"

\"--draw\"

"},{"location":"applications/draw/#displayname","title":"Displayname","text":"
Draw\n
"},{"location":"applications/draw/#path","title":"Path","text":"
/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/draw/#uniquerunkey","title":"uniquerunkey","text":"

\"libreoffice\"

"},{"location":"applications/draw/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/draw/#mimetype","title":"Mimetype","text":"
application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\n
"},{"location":"applications/draw/#file-extensions","title":"File extensions","text":"

\"odp;otg\"

"},{"location":"applications/draw/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"odp;otg\"

"},{"location":"applications/draw/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/draw/#wm_class","title":"WM_CLASS","text":"
libreoffice.libreoffice-draw\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/draw/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/libreoffice-draw.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/draw/#json-dump","title":"JSON dump","text":"

json source file draw.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_draw.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-draw\",\n    \"name\": \"draw\",\n    \"displayname\": \"Draw\",\n    \"showinview\": \"dock\",\n    \"args\": \"--draw\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\",\n    \"fileextensions\": \"odp;otg\",\n    \"legacyfileextensions\": \"odp;otg\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-draw.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/draw/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output draw.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/draw.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @draw.d.3.0.json\n\n
"},{"location":"applications/draw/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_draw.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5LDAsMCwyLjE0MjksLTgyNi4zNiwtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzg4OWU5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MTk5OTg3NCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjMyLjAyIiB4Mj0iMzIuMDIiIHkxPSIyLjA0MyIgeTI9IjYyLjA0NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmU4MDAyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZDAwNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2Y1ZDIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmVmY2ViIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZjZjllNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDNlLTggLTEuOTI2NWUtOCAtLjk0MDM0IDgwLjQ1MyAzOC42MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjExODAuMiIgeDI9IjExODAuMiIgeTE9IjY4OC41MyIgeTI9IjY1OC4xMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNjA2MDUgMCAwIC42MDY2OCAtNjkwLjg3IC0zODIuOCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmN2IzZCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMTRlNGUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMTA1NyIgeDI9IjEwNTciIHkxPSItMTA3My42IiB5Mj0iLTExMjEuNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNDk5OTkgMCAwIC0uNSAtNDkxLjk5IC01MTMuODIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkMDQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWM0YTAwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjExNjIuNiIgeDI9IjExNjIuNiIgeTE9IjkwMS4xNiIgeTI9Ijg4Ny40MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMzNDksMCwwLDEuMjU2OSwtMTUyMy43LC0xMDg3LjcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMWI4MTgiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYTY0IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImoiIHg9Ii0uMDc5NzUzIiB5PSItLjA5NzQ3NiIgd2lkdGg9IjEuMTU5NSIgaGVpZ2h0PSIxLjE5NSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43MzEwNjYyNSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9Im0iIHg9Ii0uMDYiIHk9Ii0uMDYiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzk5OTk5OTkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJsIiB4PSItLjA2MDAzMSIgeT0iLS4wNTk5NjkiIHdpZHRoPSIxLjEyMDEiIGhlaWdodD0iMS4xMTk5IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjUwMDI1NTI1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9InVybCgjZykiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbC1vcGFjaXR5PSIwIi8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZikiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zNyAyNy4wMWExMCAxMC4wMSAwIDAgMS0xMCAxMC4wMSAxMCAxMC4wMSAwIDAgMS0xMC0xMC4wMSAxMCAxMC4wMSAwIDAgMSAxMC0xMC4wMSAxMCAxMC4wMSAwIDAgMSAxMCAxMC4wMXoiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCBkPSJtMzcgMjcuMDFhMTAgMTAuMDEgMCAwIDEtMTAgMTAuMDEgMTAgMTAuMDEgMCAwIDEtMTAtMTAuMDEgMTAgMTAuMDEgMCAwIDEgMTAtMTAuMDEgMTAgMTAuMDEgMCAwIDEgMTAgMTAuMDF6IiBmaWxsPSJ1cmwoI2kpIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICA8cGF0aCBkPSJtMzIgMzloMTZ2LTE2aC0xNnoiIGZpbHRlcj0idXJsKCNtKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPHBhdGggZD0ibTMyIDM5aDE2di0xNmgtMTZ6IiBmaWxsPSJ1cmwoI2gpIi8+CiAgPHBhdGggZD0ibTM5IDQ1aC0yMmwxMS0xOHoiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjI1IiBzdHJva2U9IiNjOTljMDAiLz4KICA8cGF0aCBkPSJtMzkgNDVoLTIybDExLTE4eiIgZmlsbD0idXJsKCNhKSIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMSkiIGZpbGw9IiM5MmUyODUiIHN0cm9rZT0iIzE4YTMwMyI+CiAgPHJlY3QgeD0iMTUuNSIgeT0iNDMuNSIgd2lkdGg9IjMiIGhlaWdodD0iMyIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgeD0iMzcuNSIgeT0iNDMuNDk3IiB3aWR0aD0iMyIgaGVpZ2h0PSIzLjAwMyIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgeD0iMjYuNSIgeT0iMjUuNSIgd2lkdGg9IjMiIGhlaWdodD0iMy4wMDMiIG9wYWNpdHk9Ii43NSIvPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"draw,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-draw.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-draw\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--draw\"\nLABEL oc.name=\"draw\"\nLABEL oc.displayname=\"Draw\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-flat-xml;application/vnd.oasis.opendocument.graphics-template;application/vnd.sun.xml.draw;application/vnd.sun.xml.draw.template;application/vnd.visio;application/x-wpg;application/vnd.ms-publisher;image/x-freehand;application/x-pagemaker;\"\nLABEL oc.fileextensions=\"odp;otg\"\nLABEL oc.legacyfileextensions=\"odp;otg\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"draw\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--draw\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/draw/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/draw/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application draw

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/draw.d\n
"},{"location":"applications/draw/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f draw.d -t draw .\n
"},{"location":"applications/draw/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect draw > draw.json\ndocker image save draw -o draw.tar\nctr -n k8s.io images import draw.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @draw.json\n\n
"},{"location":"applications/drawio/","title":"drawio","text":""},{"location":"applications/drawio/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/drawio/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/drawio/#ubuntu-packages","title":"Ubuntu packages","text":"
libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin\n
"},{"location":"applications/drawio/#displayname","title":"Displayname","text":"
draw.io\n
"},{"location":"applications/drawio/#path","title":"Path","text":"
/opt/drawio/drawio\n
"},{"location":"applications/drawio/#mimetype","title":"Mimetype","text":"
application/vnd.jgraph.mxfile;application/vnd.visio;\n
"},{"location":"applications/drawio/#file-extensions","title":"File extensions","text":"

\"drawio\"

"},{"location":"applications/drawio/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"drawio\"

"},{"location":"applications/drawio/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/drawio/#wm_class","title":"WM_CLASS","text":"
draw.io.draw.io\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/drawio/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/drawio.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/drawio/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/drawio/#json-dump","title":"JSON dump","text":"

json source file drawio.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"debpackage\": \"libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin\",\n    \"icon\": \"circle_drawio.svg\",\n    \"launch\": \"draw.io.draw.io\",\n    \"name\": \"drawio\",\n    \"displayname\": \"draw.io\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/opt/drawio/drawio\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"application/vnd.jgraph.mxfile;application/vnd.visio;\",\n    \"fileextensions\": \"drawio\",\n    \"legacyfileextensions\": \"drawio\",\n    \"desktopfile\": \"/usr/share/applications/drawio.desktop\",\n    \"postruncommands\": [\n        \"RUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\"\n    ]\n}\n
"},{"location":"applications/drawio/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output drawio.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/drawio.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @drawio.d.3.0.json\n\n
"},{"location":"applications/drawio/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_drawio.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iQ2FsY3VsYXRvciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTQzNSIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjUyMC4zMiIgeDI9IjUyMC4zMiIgeTE9Ii0xMzguNDYiIHkyPSIxNDg0LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2MzYzMyAwIDAgLjA2MzYzMyAtLjU2NzYxIC0uNTM4OTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRhNjQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmI3YzM4IiBvZmZzZXQ9Ii4zNTE1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmI3YzM4IiBvZmZzZXQ9Ii40NDk3NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZjM0ZjE3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzYzMyAwIDAgLjA2MzYzMyAtLjU2NzYxIC0uNTM4OTcpIiBkPSJtOTgzLjI1IDUxMS4zNWMwLTcuOTUtMC4yLTE1Ljg1LTAuNS0yMy41NXEtOC0xODAuMTUtMTM3LjU1LTMwOS44NWMtOTIuMDUtOTItMjAzLjItMTM4LjA1LTMzMy40LTEzOC4wNS0xMzAuMTUgMC0yNDEuMzUgNDYuMDUtMzMzLjM1IDEzOC4wNS05Mi4wNSA5Mi0xMzguMSAyMDMuMi0xMzguMSAzMzMuNCAwIDEzMC4xNSA0Ni4wNSAyNDEuMzUgMTM4LjEgMzMzLjM1IDg2LjE1IDg2LjMgMTg5LjM1IDEzMi4xNSAzMDkuMTUgMTM3LjYgOCAwLjMgMTYgMC41IDI0LjIgMC41IDEzMC4yIDAgMjQxLjM1LTQ2LjEgMzMzLjQtMTM4LjEgOTItOTIgMTM4LjA1LTIwMy4yIDEzOC4wNS0zMzMuMzV6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiLz4KIDxwYXRoIGQ9Im02MiAzMmMwLTAuNTA1ODgtMC4wMTI3My0xLjAwODYtMC4wMzE4Mi0xLjQ5ODZxLTAuNTA5MDYtMTEuNDY0LTguNzUyNy0xOS43MTdjLTUuODU3NC01Ljg1NDMtMTIuOTMtOC43ODQ2LTIxLjIxNS04Ljc4NDYtOC4yODE5IDAtMTUuMzU4IDIuOTMwMy0yMS4yMTIgOC43ODQ2LTUuODU3NCA1Ljg1NDMtOC43ODc3IDEyLjkzLTguNzg3NyAyMS4yMTUgMCA4LjI4MTkgMi45MzAzIDE1LjM1OCA4Ljc4NzcgMjEuMjEyIDUuNDgyIDUuNDkxNSAxMi4wNDkgOC40MDkxIDE5LjY3MiA4Ljc1NTkgMC41MDkwNyAwLjAxOTA5IDEuMDE4MSAwLjAzMTgyIDEuNTM5OSAwLjAzMTgyIDguMjg1IDAgMTUuMzU4LTIuOTMzNSAyMS4yMTUtOC43ODc3IDUuODU0My01Ljg1NDMgOC43ODQ2LTEyLjkzIDguNzg0Ni0yMS4yMTJ6IiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9Ii45OTc5NiIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4wNTg4IDAgMCAxLjA1ODggLTEuODgyNCAtLjMzNTkyKSIgZmlsbD0iI2ZmZiI+CiAgPHJlY3QgeD0iMjUiIHk9IjE1IiB3aWR0aD0iMTQiIGhlaWdodD0iMTEuOCIgcng9IjMiIHJ5PSIzIi8+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAxLjU5OTUpIj4KICAgPHJlY3QgeD0iMTUiIHk9IjMyLjY2NCIgd2lkdGg9IjE0IiBoZWlnaHQ9IjExLjgiIHJ4PSIzIiByeT0iMyIvPgogICA8cmVjdCB4PSIzNSIgeT0iMzIuNjc5IiB3aWR0aD0iMTQiIGhlaWdodD0iMTEuOCIgcng9IjMiIHJ5PSIzIi8+CiAgPC9nPgogIDxnIHRyYW5zZm9ybT0ibWF0cml4KC41OTgxMyAwIDAgLjgxMjMyIDEzLjM2IDQuNTQ1NSkiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIyLjg2OTMiPgogICA8cGF0aCBkPSJtMjYuNDUxIDI1Ljc3NC05LjU4ODYgMTIuNDUyIi8+CiAgIDxwYXRoIGQ9Im0zNS44NzcgMjUuNzc0IDkuNTg4NiAxMi40NTIiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"drawio\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"drawio.desktop\"\nLABEL oc.launch=\"draw.io.draw.io\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"drawio\"\nLABEL oc.displayname=\"draw.io\"\nLABEL oc.path=\"/opt/drawio/drawio\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.jgraph.mxfile;application/vnd.visio;\"\nLABEL oc.fileextensions=\"drawio\"\nLABEL oc.legacyfileextensions=\"drawio\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"drawio\"\nENV APPBIN \"/opt/drawio/drawio\"\nENV APP \"/opt/drawio/drawio\"\nRUN apt-get update && curl -Ls 'https://github.com/jgraph/drawio-desktop/releases/download/v20.3.0/drawio-amd64-20.3.0.deb' -o /tmp/drawio-amd64.deb && apt-get install --yes --no-install-recommends /tmp/drawio-amd64.deb && rm /tmp/drawio-amd64.deb && rm -rf /var/lib/apt/lists/*\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/drawio/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/drawio/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application drawio

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/drawio.d\n
"},{"location":"applications/drawio/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f drawio.d -t drawio .\n
"},{"location":"applications/drawio/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect drawio > drawio.json\ndocker image save drawio -o drawio.tar\nctr -n k8s.io images import drawio.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @drawio.json\n\n
"},{"location":"applications/dummy/","title":"Dummy","text":"

dummy

"},{"location":"applications/eclipse/","title":"Eclipse","text":""},{"location":"applications/eclipse/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk.java.eclipse

"},{"location":"applications/eclipse/#display-name","title":"Display name","text":"

\"Eclipse\"

"},{"location":"applications/eclipse/#path","title":"path","text":"

\"/usr/bin/eclipse\"

"},{"location":"applications/eclipse_sts4/","title":"Eclipse_Sts4","text":""},{"location":"applications/eclipse_sts4/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk.java.sts4

"},{"location":"applications/eclipse_sts4/#display-name","title":"Display name","text":"

\"Eclipse Sts4\"

"},{"location":"applications/eclipse_sts4/#path","title":"path","text":"

\"/opt/sts/SpringToolSuite4\"

"},{"location":"applications/edge/","title":"edge","text":""},{"location":"applications/edge/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/edge/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/edge/#ubuntu-packages","title":"Ubuntu packages","text":"
microsoft-edge-stable\n
"},{"location":"applications/edge/#displayname","title":"Displayname","text":"
Microsoft Edge\n
"},{"location":"applications/edge/#path","title":"Path","text":"
/usr/bin/microsoft-edge-stable\n
"},{"location":"applications/edge/#mimetype","title":"Mimetype","text":"
application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\n
"},{"location":"applications/edge/#file-extensions","title":"File extensions","text":"

\"html;xml;gif\"

"},{"location":"applications/edge/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"html;xml\"

"},{"location":"applications/edge/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/edge/#wm_class","title":"WM_CLASS","text":"
microsoft-edge.Microsoft-edge\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/edge/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/microsoft-edge.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/edge/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN curl https://packages.microsoft.com/keys/microsoft.asc  | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\" > /etc/apt/sources.list.d/edge.list\n
"},{"location":"applications/edge/#json-dump","title":"JSON dump","text":"

json source file edge.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"containerengine\": \"ephemeral_container\",\n    \"debpackage\": \"microsoft-edge-stable\",\n    \"preruncommands\": [\n        \"RUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n        \"RUN curl https://packages.microsoft.com/keys/microsoft.asc  | apt-key add -\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\\\" > /etc/apt/sources.list.d/edge.list\"\n    ],\n    \"icon\": \"circle_microsoft-edge.svg\",\n    \"keyword\": \"web,browser,internet\",\n    \"launch\": \"microsoft-edge.Microsoft-edge\",\n    \"name\": \"edge\",\n    \"displayname\": \"Microsoft Edge\",\n    \"path\": \"/usr/bin/microsoft-edge-stable\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"mimetype\": \"application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/microsoft-edge.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/edge/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output edge.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/edge.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @edge.d.3.0.json\n\n
"},{"location":"applications/edge/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN # curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN curl https://packages.microsoft.com/keys/microsoft.asc  | apt-key add -\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/repos/edge stable main\" > /etc/apt/sources.list.d/edge.list\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends microsoft-edge-stable && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_microsoft-edge.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MzIiIHgxPSIxMS43ODgiIHgyPSI1Mi43NDkiIHkxPSIyNS4xMDYiIHkyPSIyNS4xMDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMjAyIDAgMCAxLjAyMDIgLS45MjE0NiAtLjY2MzU1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDBiZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVmZGU1NiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTQwIiB4MT0iMTEuODA0IiB4Mj0iMzAuNzQzIiB5MT0iMzYuMjU0IiB5Mj0iMzYuMjU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDIwMiAwIDAgMS4wMjAyIC0uOTIxNDYgLS42NjM1NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwNzhkNCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMDhkZGMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0OCIgeDE9IjIxLjE4MiIgeDI9IjQ5LjcxMiIgeTE9IjQwLjI0MyIgeTI9IjQwLjI0MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAyMDIgMCAwIDEuMDIwMiAtLjkyMTQ2IC0uNjYzNTUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwYjRlOTAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMGQ1NTlkIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk4MC02IiB4PSItLjE1NzE3IiB5PSItLjA4MjI2NSIgd2lkdGg9IjEuMzE0MyIgaGVpZ2h0PSIxLjE2NDUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTUxNTE0OCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjk2OS03IiB4PSItLjA3OTQyMSIgeT0iLS4xNjg3IiB3aWR0aD0iMS4xNTg4IiBoZWlnaHQ9IjEuMzM3NCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44NjA1MzI0NyIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjkwOC01IiB4PSItLjEwOCIgeT0iLS4xMDgiIHdpZHRoPSIxLjIxNiIgaGVpZ2h0PSIxLjIxNiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS44ODA1MTkyIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNDA4LjI1IiB4Mj0iNDA3Ljk0IiB5MT0iNTQ3LjYiIHkyPSI0OTguODkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4zMjc2LDAsMCwxLjMyNzYsLTUxMC42NCwtNjYzLjUyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U2ZTZlNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44ODk3MjQ0OSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPHBhdGggZD0ibTMxLjk5OCAxMi4yNDhjLTExLjQyNi0wLjAwMTEtMjAuNzMyIDkuMTcyOC0yMC44OTMgMjAuNTk2IDAuMDA2My0wLjQ4MzIyIDAuMDYzODgtMC45NjA3IDAuMTQ0NTMtMS40MzU1LTAuMDc0NjggMC40ODk0NC0wLjEyNjk1IDAuOTc4MzctMC4xMjY5NSAxLjQ2MDktMC4wMjgyNiAzLjE1NTYgMC42NDY4MiA2LjI3NjcgMS45NzY2IDkuMTM4NyA0LjQ5ODMgOS41OTY1IDE1LjQ3MiAxNC4zMDUgMjUuNTI3IDEwLjk1My0wLjE4MTY4IDAuMDU3MjgtMC4zNzU5NyAwLjA5MjA0LTAuNTYyNSAwLjE0MDYyIDAuMTgyOTgtMC4wNDkxNyAwLjM4Mjk3LTAuMDk2NiAwLjU0MTAyLTAuMTQ2NDhsMC4yMTQ4NC0wLjA3MjI3YzQuNDk3NS0xLjU1NDYgOC4zMzE0LTQuNTkzNSAxMC44NzEtOC42MTcyIDAuMzYyNzMtMC41NzE0Mi0wLjI3NzQ2LTEuMjQ4Ni0wLjg2OTE0LTAuOTE5OTItMi4wMDI0IDEuOTcwMS01LjEwOCAyLjQzNzEtNy41ODAxIDIuNDQ5Mi03LjcyNDIgMC0xNC40NTMtNS45Mzg1LTE0LjQ1My0xMi43NTYgMC4wMjAxNC0xLjg2MTkgMS4wNDc5LTMuNTY2OSAyLjY4MzYtNC40NTcgMC41MDkyOS0wLjIzOTkyIDEuMzc3OC0wLjY3NTUyIDIuNTM1Mi0wLjY1NDMgMS42NTI5IDAuMDEyMDkgMy4yMDQ3IDAuNzk4NTQgNC4xOTM0IDIuMTIzIDAuNDQ5MTMgMC41OTk2IDAuNzUwMTYgMS4yODc3IDAuOTA4MiAyLjAxMTcgMC4wNDQxNyAxLjI4MDktMC4zMTMwMyAyLjQ3NjctMS4xMzg3IDMuNTU0Ny0wLjEzMjIyIDAuMTcxMzctMC41MzkwNiAwLjQwODA4LTAuNTM5MDYgMC45MjM4MyAwIDAuNDI1OTggMC4yNzY1NyAwLjgzNTMxIDAuNzY5NTMgMS4xNzk3IDIuMzQ3MyAxLjYzMjEgNi43NzM3IDEuNDE4IDYuNzg1MiAxLjQxOCAxLjczOTMtMC4wMDQyIDMuNDQ2LTAuNDc1MjcgNC45NDE0LTEuMzYzMyAzLjA2OTctMS43OTIyIDQuOTU5NS00LjE1MDkgNC45NjY4LTcuNzA1MSAwLjA0MjQzLTMuNjU3Ni0xLjMwNjQtNi4wOTA4LTEuODUxNi03LjE2OC0zLjQ1ODktNi43NjUxLTEwLjkyNi0xMC42NTQtMTkuMDQ1LTEwLjY1NHptNS4zOTQ1IDQxLjAyMWMtMC4wNTM2NyAwLjAxMDczLTAuMTA2MiAwLjAyMzE2LTAuMTYwMTYgMC4wMzMyIDAuMDUyODgtMC4wMTE0OCAwLjEwODA2LTAuMDIxNDUgMC4xNjAxNi0wLjAzMzJ6IiBmaWx0ZXI9InVybCgjZmlsdGVyOTA4LTUpIiBvcGFjaXR5PSIuMiIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTQ4LjgyMyA0Mi41OTljLTIuMDAyNCAxLjk3MDEtNS4xMDg1IDIuNDM3Ny03LjU4MDYgMi40NDk5LTcuNzI0MiAwLTE0LjQ1My01LjkzOTMtMTQuNDUzLTEyLjc1NyAwLjAyMDE0LTEuODYxOSAxLjA0NjItMy41NjcyIDIuNjgxOS00LjQ1NzMtNi45ODY0IDAuMjkzNzgtOC43ODIgNy41NzMtOC43ODIgMTEuODM4IDAgMTIuMDU4IDExLjExNSAxMy4yODEgMTMuNTA5IDEzLjI4MSAxLjI5MTIgMCAzLjIzODYtMC4zNzUzOSA0LjQwNzMtMC43NDQyNGwwLjIxMzg0LTAuMDcxODFjNC40OTc1LTEuNTU0NiA4LjMzMTYtNC41OTM5IDEwLjg3MS04LjYxNzYgMC4zNjI3My0wLjU3MTQxLTAuMjc2NzItMS4yNDkyLTAuODY4NC0wLjkyMDUxeiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDk0OCkiIHN0cm9rZS13aWR0aD0iLjc0NjI4Ii8+CiA8cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Im0yNy43MzcgNTAuOTAzYy0xLjQ1NTktMC45MDM1NC0yLjcxNzctMi4wODc1LTMuNzExOS0zLjQ4MjktNC44MjQzLTYuNjA4Ny0xLjg5MzYtMTUuOTcgNS40NDctMTkuNTg1IDAuNTA5MjktMC4yMzk5MiAxLjM3OTMtMC42NzQwNiAyLjUzNjctMC42NTI4NCAxLjY1MjkgMC4wMTIwOSAzLjIwNDggMC43OTcyNCA0LjE5MzUgMi4xMjE3IDAuNjU5MTggMC44ODAwMSAxLjAyMjYgMS45NDYyIDEuMDM4MiAzLjA0NTUgMC0wLjAzNDI3IDMuOTkyNy0xMi45OTItMTMuMDU5LTEyLjk5Mi03LjE2NiAwLTEzLjA1OSA2Ljc5OTQtMTMuMDU5IDEyLjc2NS0wLjAyODI2IDMuMTU1NiAwLjY0NzAxIDYuMjc3OSAxLjk3NjggOS4xMzk4IDQuNDk4MyA5LjU5NjUgMTUuNDcxIDE0LjMwNSAyNS41MjYgMTAuOTUzLTMuNDQyNCAxLjA4NTItNy44MTQzIDAuNjA4MDYtMTAuODc1LTEuMzA1N3oiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5NDApIiBzdHJva2Utd2lkdGg9Ii43NDYyOCIvPgogPHBhdGggZD0ibTI0LjE2NCAyMC42MDJjLTYuNDgxMSAwLTEyIDQuNjc2MS0xMi45MTQgMTAuMDYyLTAuMDg0NiAwLjcxNjI5LTAuMTM0MTcgMS40NDI4LTAuMTQ0NTMgMi4xNzk3IDAuMDc4MzYtNS45NjM3IDYuMDA2OS0xMS40OTYgMTMuMDU5LTExLjQ5NiAwLjU3MTMyIDAgMy44MjkxIDAuMDU0NTMgNi44NTU1IDEuNjQyNiAyLjY2NzIgMS40MDA0IDQuMDY1OSAzLjgwODIgNS4wMzcxIDUuNDg0NCAwLjYyNzI0IDEuMTgzNCAwLjk3MDYyIDIuMzE5OSAxLjA0MSAzLjQwMDQgMC4wODE0NS0xLjI5NjUtMC4yNjk2MS0yLjY4NzQtMS4wNDMtNC4xNDY1LTAuOTcxMjQtMS42NzYyLTIuMzY3OS00LjA4NC01LjAzNTItNS40ODQ0LTMuMDI2NC0xLjU4ODEtNi4yODQyLTEuNjQyNi02Ljg1NTUtMS42NDI2eiIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjk2OS03KSIgb3BhY2l0eT0iLjM1IiBzdHJva2Utd2lkdGg9Ii43NDYyOCIvPgogPHBhdGggZD0ibTI0Ljc5NSAxOS4xOTFjLTEuMDgyOSAwLTIuMTMxOCAwLjE3MDg2LTMuMTQwNiAwLjQ1NTA4IDAuODE4ODItMC4xODQyOCAxLjY2MzQtMC4yODkwNiAyLjUyNzMtMC4yODkwNiAxMy4xMTEgMCAxMy43NzYgNy42NDI5IDEzLjM4NSAxMS4xOTkgMC4xODAxIDAuNTIwNiAwLjI3OTIyIDEuMDY5MyAwLjI4NzExIDEuNjI3IDAtMC4wMzQyNyAzLjk5MjgtMTIuOTkyLTEzLjA1OS0xMi45OTJ6bTYuMTc5NyA4LjEwMzVjLTAuNjQ0MjUgMC4xMzk2NC0xLjE2MDMgMC4zODAwNS0xLjUwMiAwLjU0MTAyLTcuMzQwNiAzLjYxNTUtMTAuMjcyIDEyLjk3NS01LjQ0NzMgMTkuNTg0IDAuOTk0MjMgMS4zOTU1IDIuMjU1IDIuNTgwOCAzLjcxMDkgMy40ODQ0bDAuMDE1NjMgMC4wMDU5YzMuMDYwMiAxLjkxMzcgNy40MzI2IDIuMzg5OSAxMC44NzUgMS4zMDQ3LTAuNDQ4MjggMC4xNDk0MS0wLjkwMDI5IDAuMjYzMi0xLjM1MTYgMC4zODA4NiAwLjY1NjY3LTAuMTUwMjggMS4zMTE5LTAuMzI5OSAxLjk2MjktMC41NDY4OC0zLjQ0MjQgMS4wODUyLTcuODEyOCAwLjYwOTA2LTEwLjg3My0xLjMwNDdsLTAuMDE1NjMtMC4wMDc4Yy0xLjQ1NTktMC45MDM1NC0yLjcxNjctMi4wODY5LTMuNzEwOS0zLjQ4MjQtNC44MjQzLTYuNjA4Ny0xLjg5NTMtMTUuOTcgNS40NDUzLTE5LjU4NiAwLjIyNDg5LTAuMTA1OTQgMC41MzEzNy0wLjI0NzI5IDAuODkwNjItMC4zNzMwNXoiIGZpbHRlcj0idXJsKCNmaWx0ZXI5ODAtNikiIG9wYWNpdHk9Ii4zNSIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KIDxwYXRoIGNsYXNzPSJjbHMtNSIgZD0ibTM1Ljk3IDM0Ljg3MmMtMC4xMzIyMiAwLjE3MTM3LTAuNTM4NjcgMC40MDgwMy0wLjUzODY3IDAuOTIzNzggMCAwLjQyNTk4IDAuMjc3NSAwLjgzNTY0IDAuNzcwNDYgMS4xOCAyLjM0NzMgMS42MzIxIDYuNzcyNiAxLjQxNjcgNi43ODQgMS40MTY3IDEuNzM5My0wLjAwNDIgMy40NDU2LTAuNDc0OCA0Ljk0MTEtMS4zNjI4IDMuMDY5Ny0xLjc5MjIgNC45NTk5LTQuMTUxNSA0Ljk2NzItNy43MDU3IDAuMDQyNDQtMy42NTc2LTEuMzA1OS02LjA4OTQtMS44NTExLTcuMTY2Ni0zLjQ1ODktNi43NjUxLTEwLjkyNS0xMC42NTYtMTkuMDQ0LTEwLjY1Ni0xMS40MjYtMC4wMDExLTIwLjczMyA5LjE3NDQtMjAuODk0IDIwLjU5NyAwLjA3ODM2LTUuOTYzNyA2LjAwNy0xMS40OTcgMTMuMDU5LTExLjQ5NyAwLjU3MTMyIDAgMy44Mjk1IDAuMDU1NDkgNi44NTU4IDEuNjQzNSAyLjY2NzIgMS40MDA0IDQuMDY0NSAzLjgwNzkgNS4wMzU4IDUuNDg0MSAxLjQxMTcgMi42NjMzIDEuNDcyNCA1LjEwOTQtMC4wODQ4OCA3LjE0MjZ6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50OTMyKSIgc3Ryb2tlLXdpZHRoPSIuNzQ2MjgiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"edge,web,browser,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"microsoft-edge.desktop\"\nLABEL oc.launch=\"microsoft-edge.Microsoft-edge\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"edge\"\nLABEL oc.displayname=\"Microsoft Edge\"\nLABEL oc.path=\"/usr/bin/microsoft-edge-stable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"edge\"\nENV APPBIN \"/usr/bin/microsoft-edge-stable\"\nENV APP \"/usr/bin/microsoft-edge-stable\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/edge/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/edge/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application edge

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/edge.d\n
"},{"location":"applications/edge/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f edge.d -t edge .\n
"},{"location":"applications/edge/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect edge > edge.json\ndocker image save edge -o edge.tar\nctr -n k8s.io images import edge.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @edge.json\n\n
"},{"location":"applications/elementary.terminal/","title":"elementary.terminal","text":""},{"location":"applications/elementary.terminal/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.elementary

"},{"location":"applications/elementary.terminal/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/elementary.terminal/#ubuntu-packages","title":"Ubuntu packages","text":"
io.elementary.terminal io.elementary.stylesheet\n
"},{"location":"applications/elementary.terminal/#path","title":"Path","text":"
/usr/bin/io.elementary.terminal\n
"},{"location":"applications/elementary.terminal/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/elementary.terminal/#wm_class","title":"WM_CLASS","text":"
io.elementary.terminal.Io.elementary.terminal\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/elementary.terminal/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/io.elementary.terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/elementary.terminal/#json-dump","title":"JSON dump","text":"

json source file

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"io.elementary.terminal io.elementary.stylesheet\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"terminal,bash,shell,cmd\",\n    \"launch\": \"io.elementary.terminal.Io.elementary.terminal\",\n    \"name\": \"elementary.terminal\",\n    \"path\": \"/usr/bin/io.elementary.terminal\",\n    \"args\": \"\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.elementary\",\n    \"desktopfile\": \"/usr/share/applications/io.elementary.terminal.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/elementary.terminal/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output elementary.terminal.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/elementary.terminal.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @elementary.terminal.json\n\n
"},{"location":"applications/elementary.terminal/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.elementary:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends io.elementary.terminal io.elementary.stylesheet && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"elementary.terminal,terminal,bash,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"io.elementary.terminal.desktop\"\nLABEL oc.launch=\"io.elementary.terminal.Io.elementary.terminal\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.elementary\"\nLABEL oc.name=\"elementary.terminal\"\nLABEL oc.displayname=\"elementary.terminal\"\nLABEL oc.path=\"/usr/bin/io.elementary.terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"elementary.terminal\"\nENV APPBIN \"/usr/bin/io.elementary.terminal\"\nENV APP \"/usr/bin/io.elementary.terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/elementary.terminal/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/elementary.terminal/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application elementary.terminal

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/elementary.terminal.d\n
"},{"location":"applications/elementary.terminal/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f elementary.terminal.d -t elementary.terminal .\n
"},{"location":"applications/elementary.terminal/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect elementary.terminal > elementary.terminal.json\ndocker image save elementary.terminal -o elementary.terminal.tar\nctr -n k8s.io images import elementary.terminal.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @elementary.terminal.json\n\n
"},{"location":"applications/eog/","title":"eog","text":""},{"location":"applications/eog/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/eog/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/eog/#alpine-packages","title":"Alpine packages","text":"
eog\n
"},{"location":"applications/eog/#path","title":"Path","text":"
/usr/bin/eog\n
"},{"location":"applications/eog/#mimetype","title":"Mimetype","text":"
image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\n
"},{"location":"applications/eog/#file-extensions","title":"File extensions","text":"

\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"

"},{"location":"applications/eog/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"

"},{"location":"applications/eog/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/eog/#wm_class","title":"WM_CLASS","text":"
eog.Eog\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/eog/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.eog.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/eog/#json-dump","title":"JSON dump","text":"

json source file eog.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"eog\",\n    \"icon\": \"circle_eog.svg\",\n    \"keyword\": \"eog,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"eog.Eog\",\n    \"name\": \"eog\",\n    \"path\": \"/usr/bin/eog\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\",\n    \"fileextensions\": \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\",\n    \"legacyfileextensions\": \"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.eog.desktop\",\n    \"usedefaultapplication\": true,\n    \"quick\": true\n}\n
"},{"location":"applications/eog/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output eog.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/eog.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @eog.d.3.0.json\n\n
"},{"location":"applications/eog/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update eog\nLABEL oc.icon=\"circle_eog.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iUHJldmlldyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkN2Q3ZDciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4wMzE4IiB5PSItLjA0MTQ3OCIgd2lkdGg9IjEuMDYzNiIgaGVpZ2h0PSIxLjA4MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNy4yMjIxNTUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzMTQ2NSIgeT0iLS4wNDIwNjMiIHdpZHRoPSIxLjA2MjkiIGhlaWdodD0iMS4wODQxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI2LjQyNjIxIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iNTE5LjIiIHgyPSI1MTkuMiIgeTE9IjEwMjQuOCIgeTI9IjQuOCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk3MjQgMCAwIC45OTcxOSAuOTEwNzcgMS45NjI4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGQ0ZDRkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQxNDE0MSIgb2Zmc2V0PSIuMDE5NTUxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMTEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iNTM4LjU2IiB4Mj0iNTM4LjU2IiB5MT0iLTIxLjEzIiB5Mj0iOTY0LjM3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0NzkuMSIgeDI9IjQ4MC41OSIgeTE9Ii0yOC44NDEiIHkyPSI5NjQuMzciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xMTUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImkiIHgxPSI0NDguNzciIHgyPSI0ODEuNTgiIHkxPSI0MTguNCIgeTI9Ijc2NS44NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmM1YmUwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYzYTVmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI1MzguMDQiIHgyPSI1MzguMDQiIHkxPSIyNzguNjIiIHkyPSI2MDIuNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMmQ1N2NkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzUyOTRlZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCAtLjY3OCkiPgogIDxwYXRoIGQ9Im03OTcuNzEgMTM5LjEzcS02MC41MzMtNDYuNjE5LTEzMi40My03MS40NDktNzQuMjk1LTI1LjY3OC0xNTMuNzMtMjUuNjc4Yy0yNTkuODggMC00NzAuNTUgMjEwLjY2LTQ3MC41NSA0NzAuNTIgMCAyMzcuNzMgMTc2LjM2IDQzNC4xOCA0MDUuMzMgNDY1Ljk0IDExLjE2OSAxLjU0NTYgMjIuNDg4IDIuNzQyMyAzMy44NTYgMy40NDAzIDEwLjM3MSAwLjY0ODE3IDIwLjc5MyAxLjA5NjkgMzEuMzYzIDEuMDk2OSAyNTkuODMgMCA0NzAuNDUtMjEwLjY2IDQ3MC40NS00NzAuNDggMC0yMC41NDItMS4yOTY0LTQwLjgzNS0zLjgzOTQtNjAuNjI5LTIuOTQxOS0yMy4xMzUtNy43Mjg2LTQ1LjYyMi0xMy44NjItNjcuNTFxLTIwLjg0Mi03My41NDMtNjQuMDIzLTEzNi44Ni00Mi42ODItNjIuMzc0LTEwMi41Ny0xMDguMzl6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIxNS42NCIvPgogIDxwYXRoIGQ9Im03OTcuNzEgMTM5LjEzcS02MC41MzMtNDYuNjE5LTEzMi40My03MS40NDktNzQuMjk1LTI1LjY3OC0xNTMuNzMtMjUuNjc4Yy0yNTkuODggMC00NzAuNTUgMjEwLjY2LTQ3MC41NSA0NzAuNTIgMCAyMzcuNzMgMTc2LjM2IDQzNC4xOCA0MDUuMzMgNDY1Ljk0IDExLjE2OSAxLjU0NTYgMjIuNDg4IDIuNzQyMyAzMy44NTYgMy40NDAzIDEwLjM3MSAwLjY0ODE3IDIwLjc5MyAxLjA5NjkgMzEuMzYzIDEuMDk2OSAyNTkuODMgMCA0NzAuNDUtMjEwLjY2IDQ3MC40NS00NzAuNDggMC0yMC41NDItMS4yOTY0LTQwLjgzNS0zLjgzOTQtNjAuNjI5LTIuOTQxOS0yMy4xMzUtNy43Mjg2LTQ1LjYyMi0xMy44NjItNjcuNTFxLTIwLjg0Mi03My41NDMtNjQuMDIzLTEzNi44Ni00Mi42ODItNjIuMzc0LTEwMi41Ny0xMDguMzl6IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjE1LjY0Ii8+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjkzNTcxIDAgMCAuOTM1NzEgNDQuMTE2IDg3LjczMSkiIGZpbHRlcj0idXJsKCNnKSIgb3ZlcmZsb3c9InZpc2libGUiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgIDxnIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgICAgPHBhdGggZD0ibTc4OC4zMiA1ODAuNjZ2LTM2Ni41N2wtNDkwLjE3LTAuMDkydjM2Ni41N3oiIGZpbGw9IiMxZDFkMWIiIGZpbGwtb3BhY2l0eT0iLjMiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im03NTcuNjggNjAyLjQgMC4wODYtMzIzLjY5LTQzOS4zNi0wLjA4NjEtMC4wODYxIDMyMy43N3oiIGZpbGw9InVybCgjZCkiIHN0cm9rZS13aWR0aD0iMTQuNjc1Ii8+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjkzNTcxIDAgMCAuOTM1NzEgNDQuMTE2IDg3LjczMSkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTc3Mi45OCA1NjAuNDJ2LTM2Ni42MmwtNDkwLjI0LTAuMDkydjM2Ni42MnptLTIwLjY5NS0yMC42OTQtNDQ4Ljg1LTAuMDkydi0zMjUuMjNsNDQ4Ljg1IDAuMDkyeiIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiLz4KICAgPC9nPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTM1NzEgMCAwIC45MzU3MSA0NC4xMTYgODcuNzMxKSIgZmlsdGVyPSJ1cmwoI2gpIiBvdmVyZmxvdz0idmlzaWJsZSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgICA8cGF0aCBkPSJtNzYxLjI3IDY5Ny43OS0zOC4yNTctMzY0LjY0LTUwNi44MSA1My4yNDcgMzguMzQ5IDM2NC42NHoiIGZpbGw9IiMxZDFkMWIiIGZpbGwtb3BhY2l0eT0iLjMiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im0yMzcuMTYgNDQzLjg3IDMzLjgyMyAzMjEuOTcgNDU1LjAyLTQ3Ljc2NS0zMy45MDktMzIxLjk3eiIgZmlsbD0idXJsKCNpKSIgc3Ryb2tlLXdpZHRoPSIxNC42NzUiLz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTM1NzEgMCAwIC45MzU3MSA0NC4xMTYgODcuNzMxKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8cGF0aCBkPSJtNzQwLjA1IDY4Mi44NC0zOC4yNjMtMzY0LjY5LTUwNi44OCA1My4yNTUgMzguMjYzIDM2NC42OXptLTU2Ljc1LTM0MS44OCAzNC4wMzEgMzIzLjM5LTQ2NS42OCA0OC45MzItMzQuMDMxLTMyMy4zOXoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiAgIDwvZz4KICA8L2c+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMTUuNjgzIDAgMCAxNS42ODMgOS42MzMzIDEwLjYzMykiIGQ9Im00NCAzNS40MzUtNC4yMDMxIDQuNjI3My0yLjc5My0wLjQzMzU5LTEuOTA4MiAyLjIzMjQtMy42MTcyLTAuNDA2MjUtMy40OTgtMi41OTU3LTQuNTkzOCAzLjc4NzEtMi4wMDk4LTIuMDQzLTQuNjM3MSAyLjM5NjUgMC40NzMgNC40NzIzIDI3Ljc4NC0yLjkxOTR6IiBmaWxsPSIjM2M2OGQ5IiBzdHJva2Utd2lkdGg9Ii45MzU3MSIvPgogPC9nPgogPGNpcmNsZSBjeD0iMzgiIGN5PSIzMS41IiByPSIyLjUiIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgb3BhY2l0eT0iLjc1IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiA8cGF0aCBkPSJtNDQgMzUuNDM2LTQuMjAzMSA0LjYyNy0yLjc5My0wLjQzMzU5IDIuOTk2MSAxLjY0MjYgMy00LjI3MTV2MS43MTA5bDEtMy4yNzU0em0tNi45OTYxIDQuMTkzNC0xLjkwODIgMi4yMzI0LTMuNjE3Mi0wLjQwNjI1LTMuNDc4NS0yLjQ1NTEgMyA1IDItMiAyIDEgMi4wMDM5LTMuMzcxMXptLTkuMDIzNC0wLjc2OTUzLTQuNTkzOCAzLjc4NzEtMi4wMDk4LTIuMDQzIDEuOTc4NSA0LjM5NjUgNC42MjUtNi4xNDA2em0tNi42MDM1IDEuNzQ0MS00LjYzNjcgMi4zOTY1IDAuMTU4MiAxLjQ4NDQgMC4xMDE1Ni0wLjA2MDU0NyAxLjY0NDUtMS44NDc3IDAuMTAxNTYgMS4xMzQ4IDIuNjMwOS0zLjEwNzR6IiBvcGFjaXR5PSIuMDUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"eog,eog,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.gnome.eog.desktop\"\nLABEL oc.launch=\"eog.Eog\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"eog\"\nLABEL oc.displayname=\"eog\"\nLABEL oc.path=\"/usr/bin/eog\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/gif;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-tga;image/x-xbitmap;image/jpeg;image/png;image/x-icon;image/x-xpixmap;image/x-xcursor;\"\nLABEL oc.fileextensions=\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"\nLABEL oc.legacyfileextensions=\"ani;bmp;gif;ico;jpg;jpeg;pcx;png;pnm;ras;svg;tga;tif;tiff;wbmp;xbm;xpm\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"eog\"\nENV APPBIN \"/usr/bin/eog\"\nENV APP \"/usr/bin/eog\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/eog/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/eog/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application eog

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/eog.d\n
"},{"location":"applications/eog/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f eog.d -t eog .\n
"},{"location":"applications/eog/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect eog > eog.json\ndocker image save eog -o eog.tar\nctr -n k8s.io images import eog.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @eog.json\n\n
"},{"location":"applications/evince/","title":"Evince","text":""},{"location":"applications/evince/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/evince/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/evince/#alpine-packages","title":"Alpine packages","text":"
evince\n
"},{"location":"applications/evince/#path","title":"Path","text":"
/usr/bin/evince\n
"},{"location":"applications/evince/#mimetype","title":"Mimetype","text":"
application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\n
"},{"location":"applications/evince/#file-extensions","title":"File extensions","text":"

\"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\"

"},{"location":"applications/evince/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"pdf;ps;dvi\"

"},{"location":"applications/evince/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/evince/#wm_class","title":"WM_CLASS","text":"
evince.Evince\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/evince/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Evince.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/evince/#json-dump","title":"JSON dump","text":"

json source file evince.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"evince\",\n    \"icon\": \"circle_acroread.svg\",\n    \"keyword\": \"evince,pdf,viewer\",\n    \"launch\": \"evince.Evince\",\n    \"name\": \"Evince\",\n    \"path\": \"/usr/bin/evince\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\",\n    \"fileextensions\": \"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\",\n    \"legacyfileextensions\": \"pdf;ps;dvi\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Evince.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/evince/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output evince.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evince.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evince.d.3.0.json\n\n
"},{"location":"applications/evince/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update evince\nLABEL oc.icon=\"circle_acroread.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMjkuOTY0IiB4Mj0iMjkuOTY0IiB5MT0iMi42OTE0IiB5Mj0iNjEuOTk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC00LjczNTEgMCAwIDQuNzQxIDkzLjYxMSAtNDkwNC41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYzYxNDIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RjMmI0MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMiIgeDI9IjMyIiB5MT0iMiIgeTI9IjYyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNzE1OSA5LjIxOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYmU1ZTUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMTkuMjg5IiB4Mj0iMTkuMjg5IiB5MT0iMi43OTg4IiB5Mj0iMjcuNDQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNSAwIDAgMS41IC01NzUuNTcgLTc1My43NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5N2NmMSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMGJjZmEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZSIgeD0iLS4wMzcwOTYiIHk9Ii0uMDM0OTY2IiB3aWR0aD0iMS4wNzQyIiBoZWlnaHQ9IjEuMDY5OSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC44NjQwNzc2MiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU0OTY0IiB5PSItLjAyNjc2NSIgd2lkdGg9IjEuMTA5OSIgaGVpZ2h0PSIxLjA1MzUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMjc0ODE5MzMiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mjc0NSAwIDAgLjA2Mjc0NSAtLjEyNTQ5IC0uMTI1NDkpIiBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzguMTIiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjkzOCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPHBhdGggZD0ibTM4LjU4OCAyLjY5MTRjLTE4LjIzMyAxNC45NTktMzAuMTE2IDE4Ljk5OS0zNS4xMzkgMTkuODUtMC42NDQzMiAxLjk4NDMtMS4wNzkzIDQuMDU1My0xLjI5MSA2LjIxODggMy4wMjA1LTAuNDE2OSAxMC4yNjctMS44MDY2IDE4LTYuNDU3IDEwLjA2OC02LjA1NTIgMjIuMTA1LTE3LjU1MSAyMi4xMDUtMTcuNTUxLTMuMjgyNyA2LjE4MjgtNC4zMDY3IDI4LjU4NS00LjM4MDkgNTYuNzEzIDAuMDY2NjEtMC4wMTI0NSAwLjEzNjg3LTAuMDIwMzQgMC4yMDMxMy0wLjAzMzIgMC41MDUyOS0wLjA5ODUxIDEuMDAzMy0wLjIxMDU0IDEuNDg2My0wLjMyODEyIDUuMTM1Ni0xLjI5MDMgOS42Njk5LTMuOTE2MyAxMy42NDMtNy44ODg3IDEuODY1Ny0xLjg2NTcgMy40Mjk3LTMuODU1OSA0LjcwMTItNS45Njg4LTEuNzY0Mi01Ljg1Ny0zLjE1MzctMTIuMjc1LTQuMzA0Ny0xOC4yNzMtMC45MjA0Ni02LjcwNjgtMC41NTAwMy0xMi44ODYgMC4xMDE1Ni0xNy42NTYtMC4xNjc5Mi0wLjE3NTE4LTAuMzIzMDYtMC4zNTYyNy0wLjQ5NjA5LTAuNTI5My00LjIzNC00LjIzNC05LjExNTUtNi45MjIyLTE0LjYyOS04LjA5NTd6bS0zNi41NzQgMjkuOTA0YzAuMDQwMzczIDIuMzQyOSAwLjMxMDU3IDQuNTkwMSAwLjgyNjE3IDYuNzM2MyA4LjQ2NTUgMC41Njc3MSAyMS4xNTcgOS41MTE1IDI3LjE5NyAyMi42MDcgMC4wNjM3MiAwLjAwMzcgMC4xMjU1OCAwLjAxMjI3IDAuMTg5NDUgMC4wMTU2M2gwLjAyNTM5YzAuNTQwMjUgMC4wMjg2IDEuMDU0NSAwLjA0NDkyIDEuNTU2NiAwLjA0NDkyaDAuMTkxNDFjMC42NTQ2OSAwIDEuMzAxOS0wLjAxOSAxLjkxMjEtMC4wNTA3OCAwLjE1ODktMC4wMDk1IDAuMzAxNTgtMC4wMTk3NyAwLjQ0MTQxLTAuMDI5MyAwLjQxMjM2LTAuMDI5NiAwLjgxNTc1LTAuMDc4NTggMS4yMjA3LTAuMTIzMDUtNC43MTMyLTEzLjc0MS0yNy4xMTQtMjkuMTgxLTMzLjU2MS0yOS4yMDF6IiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0zOC41ODggMi42OTE0Yy0xOC4yMzMgMTQuOTU5LTMwLjExNiAxOC45OTktMzUuMTM5IDE5Ljg1LTAuNjQ0MzIgMS45ODQzLTEuMDc5MyA0LjA1NTMtMS4yOTEgNi4yMTg4IDMuMDIwNS0wLjQxNjkgMTAuMjY3LTEuODA2NiAxOC02LjQ1NyAxMC4wNjgtNi4wNTUyIDIyLjEwNS0xNy41NTEgMjIuMTA1LTE3LjU1MS0zLjI4MjcgNi4xODI4LTQuMzA2NyAyOC41ODUtNC4zODA5IDU2LjcxMyAwLjA2NjYxLTAuMDEyNDUgMC4xMzY4Ny0wLjAyMDM0IDAuMjAzMTMtMC4wMzMyIDAuNTA1MjktMC4wOTg1MSAxLjAwMzMtMC4yMTA1NCAxLjQ4NjMtMC4zMjgxMiA1LjEzNTYtMS4yOTAzIDkuNjY5OS0zLjkxNjMgMTMuNjQzLTcuODg4NyAxLjg2NTctMS44NjU3IDMuNDI5Ny0zLjg1NTkgNC43MDEyLTUuOTY4OC0xLjc2NDItNS44NTctMy4xNTM3LTEyLjI3NS00LjMwNDctMTguMjczLTAuOTIwNDYtNi43MDY4LTAuNTUwMDMtMTIuODg2IDAuMTAxNTYtMTcuNjU2LTAuMTY3OTItMC4xNzUxOC0wLjMyMzA2LTAuMzU2MjctMC40OTYwOS0wLjUyOTMtNC4yMzQtNC4yMzQtOS4xMTU1LTYuOTIyMi0xNC42MjktOC4wOTU3em0tMzYuNTc0IDI5LjkwNGMwLjA0MDM3MyAyLjM0MjkgMC4zMTA1NyA0LjU5MDEgMC44MjYxNyA2LjczNjMgOC40NjU1IDAuNTY3NzEgMjEuMTU3IDkuNTExNSAyNy4xOTcgMjIuNjA3IDAuMDYzNzIgMC4wMDM3IDAuMTI1NTggMC4wMTIyNyAwLjE4OTQ1IDAuMDE1NjNoMC4wMjUzOWMwLjU0MDI1IDAuMDI4NiAxLjA1NDUgMC4wNDQ5MiAxLjU1NjYgMC4wNDQ5MmgwLjE5MTQxYzAuNjU0NjkgMCAxLjMwMTktMC4wMTkgMS45MTIxLTAuMDUwNzggMC4xNTg5LTAuMDA5NSAwLjMwMTU4LTAuMDE5NzcgMC40NDE0MS0wLjAyOTMgMC40MTIzNi0wLjAyOTYgMC44MTU3NS0wLjA3ODU4IDEuMjIwNy0wLjEyMzA1LTQuNzEzMi0xMy43NDEtMjcuMTE0LTI5LjE4MS0zMy41NjEtMjkuMjAxeiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYykiLz4KIDxwYXRoIGQ9Im0yNS4yODkgMi43OTg4YTMwIDMwIDAgMCAwLTEyIDUuNzU1OXYxOC44ODdsNi0zLjQ2NDggNiAzLjQ2NDh2LTI0LjY0M3oiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCBkPSJtMjUuMjg5IDIuNzk4OGEzMCAzMCAwIDAgMC0xMiA1Ljc1NTl2MTguODg3bDYtMy40NjQ4IDYgMy40NjQ4di0yNC42NDN6IiBmaWxsPSJ1cmwoI2EpIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"evince,evince,pdf,viewer\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Evince.desktop\"\nLABEL oc.launch=\"evince.Evince\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Evince\"\nLABEL oc.displayname=\"Evince\"\nLABEL oc.path=\"/usr/bin/evince\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/pdf;application/x-bzpdf;application/x-gzpdf;application/x-xzpdf;application/x-ext-pdf;application/postscript;application/x-bzpostscript;application/x-gzpostscript;image/x-eps;image/x-bzeps;image/x-gzeps;application/x-ext-ps;application/x-ext-eps;application/x-dvi;application/x-bzdvi;application/x-gzdvi;application/x-ext-dvi;image/vnd.djvu;application/x-ext-djv;application/x-ext-djvu;image/tiff;application/x-cbr;application/x-cbz;application/x-cb7;application/x-cbt;application/x-ext-cbr;application/x-ext-cbz;application/x-ext-cb7;application/x-ext-cbt;application/oxps;application/vnd.ms-xpsdocument;\"\nLABEL oc.fileextensions=\"pdf;ps;dvi;eps;cbt;cbr;cb7;xps\"\nLABEL oc.legacyfileextensions=\"pdf;ps;dvi\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Evince\"\nENV APPBIN \"/usr/bin/evince\"\nENV APP \"/usr/bin/evince\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/evince/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/evince/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Evince

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Evince.d\n
"},{"location":"applications/evince/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Evince.d -t Evince .\n
"},{"location":"applications/evince/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Evince > Evince.json\ndocker image save Evince -o Evince.tar\nctr -n k8s.io images import Evince.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Evince.json\n\n
"},{"location":"applications/evolution/","title":"evolution","text":""},{"location":"applications/evolution/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/evolution/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/evolution/#ubuntu-packages","title":"Ubuntu packages","text":"
evolution dbus-x11\n
"},{"location":"applications/evolution/#displayname","title":"Displayname","text":"
Evolution\n
"},{"location":"applications/evolution/#path","title":"Path","text":"
/usr/bin/evolution\n
"},{"location":"applications/evolution/#mimetype","title":"Mimetype","text":"
text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\n
"},{"location":"applications/evolution/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/evolution/#wm_class","title":"WM_CLASS","text":"
evolution.Evolution\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/evolution/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Evolution.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/evolution/#json-dump","title":"JSON dump","text":"

json source file evolution.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"evolution dbus-x11\",\n    \"icon\": \"evolution.svg\",\n    \"keyword\": \"evolution,mail\",\n    \"launch\": \"evolution.Evolution\",\n    \"name\": \"evolution\",\n    \"displayname\": \"Evolution\",\n    \"path\": \"/usr/bin/evolution\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Evolution.desktop\"\n}\n
"},{"location":"applications/evolution/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output evolution.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evolution.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evolution.d.3.0.json\n\n
"},{"location":"applications/evolution/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends evolution dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"evolution.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzlhYTI5YSIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiNWJlYjUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSI2LjcwMyIgY3k9IjczLjYxNiIgcj0iNy4yMjgiIGdyYWRpZW50VHJhbnNmb3JtPSJzY2FsZSgxLjkwMjIgLjUyNTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iMCIvPgogICAgPC9yYWRpYWxHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjguNzgiIHgyPSI5Ljc2MiIgeTE9IjM3Ljc4NSIgeTI9IjMyLjIwMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjM5NDkgMCAwIC43ODEwNiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1vcGFjaXR5PSIuMTI5Ii8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMTEuMjMzIiB4Mj0iMjEuMTEyIiB5MT0iMTMuNjg2IiB5Mj0iMjQuMTMzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzcwOSAwIDAgMS40NDM4IDIuNDMxIC0uMTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNlZGVkZWQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSI4LjkxNiIgeDI9IjkuODg2IiB5MT0iMzcuMTk3IiB5Mj0iNTIuMDkxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNDU0OCAwIDAgLjc2MiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjEwLjE4NCIgeDI9IjE1LjMxMSIgeTE9IjE1LjE0OCIgeTI9IjI5LjU2OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjgxOTMgMCAwIDEuMDI4MiAyLjg4IC4zNDMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNkY2RjZGMiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI1LjgyNyIgeDI9IjEzLjQ2NyIgeTE9IjcuMjMxIiB5Mj0iMTcuODc3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTcwNiAwIDAgMS4xOTEgMi44OCAuMzQzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNlZGVkZWQiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYzhjOGM4Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMTEuNTczIiB4Mj0iMTguNDc1IiB5MT0iNC43NDYiIHkyPSIyNi4wMjMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4zNDM1IDAgMCAxLjQxNzkgMi44OCAuMzE1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZTJlMmUyIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMi4wNjIiIHgyPSIzMC42IiB5MT0iMTUuMjU3IiB5Mj0iMTUuMjU3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzQzNSAwIDAgMS40MTc5IDIuODggLjMxNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjOTg5NjkwIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzY1NjQ2MCIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPHBhdGggZmlsbD0idXJsKCNiKSIgZD0iTTI2LjUgMzguN2ExMy43NSAzLjggMCAxIDEtMjcuNSAwIDEzLjc1IDMuOCAwIDEgMSAyNy41IDB6IiBjb2xvcj0iIzAwMCIgb3BhY2l0eT0iLjQ1NiIgdHJhbnNmb3JtPSJtYXRyaXgoMS44MDA2IDAgMCAxLjk3NDggMS4wODQgLTM4LjAxMykiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2MpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0idXJsKCNkKSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIuODU3IiBkPSJNNi4zMzMgMTYuOTcydjI0LjUxaDM2Ljk3M2wtLjA2Mi0yNC4zOTJjLS4wMDMtMS4zNzgtMTEuODQ4LTE0LjY3OC0xNC4wMzMtMTQuNjc4SDIwLjY2Yy0yLjI5NyAwLTE0LjMyNiAxMy4yNjItMTQuMzI2IDE0LjU2eiIvPgogIDxwYXRoIGZpbGw9InVybCgjZSkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTYuOTIzIDE2Ljc4N2MtLjM5OC0uNDMgMTEuODg3LTEzLjY5NCAxMy43NDQtMTMuNjk0aDguMzc2YzEuNzQ3IDAgMTQuMDM3IDEzLjEyOCAxMy40MjcgMTMuODg2TDMxLjYxIDMwLjQ3NGwtMTIuMzE1LS4zMTgtMTIuMzcyLTEzLjM3eiIvPgogIDxwYXRoIGZpbGwtb3BhY2l0eT0iLjE0NiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTkuMDc4IDMwLjAxOGwtNy4zMzMtOC43NDYgMjQuODE4LTYuOTM2IDMuMDI5IDYuMjE2LTcuNDE2IDkuNDQiLz4KICA8cGF0aCBmaWxsLW9wYWNpdHk9Ii4xNDYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTE4LjI5MiAyOS44MzZsLTcuNDgzLTguODEgMjQuNjQ4LTYuODkzIDMuMTc0IDYuMjcxLTcuMjQxIDkuNDA3Ii8+CiAgPHBhdGggZmlsbC1vcGFjaXR5PSIuMTQ2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xOC43NzUgMjkuOTU3bC03LjY3NS04LjY2IDI0Ljk2OC03LjA2NSAzLjI4NiA2LjU5My03LjQ4IDkuMTA3Ii8+CiAgPHBhdGggZmlsbD0idXJsKCNmKSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTguNTk0IDMwLjQ0MWwtNy4zMzMtOC43NDYgMjQuNzEyLTYuODk0IDMuMTEgNi4zODgtNy4xMiA4Ljk4NiIvPgogIDxwYXRoIGZpbGw9InVybCgjZykiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTIwLjQ4OCAyOS4wNjRMNy4wOTIgNDAuMDM2bDEzLjkwOS05LjYwNGg5LjAxOGwxMi40MiA5LjQ4Mi0xMS44NjQtMTAuODVIMjAuNDg4eiIvPgogIDxwYXRoIGZpbGw9InVybCgjZykiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTYuOTYzIDE2Ljg4NUwxOC40OCAzMS4yMDFsMS4wNjgtLjg1NEw2Ljk2NCAxNi44ODV6IiBjb2xvcj0iIzAwMCIvPgogIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNoKSIgc3Ryb2tlLXdpZHRoPSIuODU3IiBkPSJNNy4zMDggMTcuMTMxbC4wMyAyMy4yMTFoMzQuOTQ2bC0uMDYzLTIzLjA4NGMtLjAwMi0uNzUtMTEuMjE2LTEzLjc5OS0xMy4zODQtMTMuNzk5aC03Ljg5NWMtMi4yNTMgMC0xMy42MzUgMTIuODkyLTEzLjYzNCAxMy42NzJ6Ii8+CiAgPHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMjAuOTU3IDMwLjQ1M0w5LjAxNiAzOC43MjRsMi4yMTkuMDA2IDkuOTk4LTYuODY5IDguODIyLTEuNDIzLTkuMDk4LjAxNXptLTkuNTI5LTguNzgzbDEuMzI0IDEuNDExIDIyLjc5MS02Ljg4NCAyLjkxNSA1LjY4Mi42MTQtLjcxMi0zLjA2OS02LjM3OC0yNC41NzUgNi44ODF6Ii8+CiAgPHBhdGggZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTMuMzA4IDIzLjYzNmw2LjAyNiA2LjQ1NCAxLjE5Ny0xLjAyNiAxMC4wODcuMDQzLjgxMi43MjcgMy45NzUtNC43NDRjLTEuMTU0LTEuNDExLTIyLjA5Ny0xLjQ1NC0yMi4wOTctMS40NTR6Ii8+CiAgPHBhdGggZmlsbD0iI2IxYjFiMSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNDEuODEzIDE3Ljg0OGwtOS45NTIgMTIuNjMxLTEuMDY4LS44NTUgMTEuMDItMTEuNzc2eiIgY29sb3I9IiMwMDAiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"evolution,evolution,mail\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Evolution.desktop\"\nLABEL oc.launch=\"evolution.Evolution\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"evolution\"\nLABEL oc.displayname=\"Evolution\"\nLABEL oc.path=\"/usr/bin/evolution\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/calendar;text/x-vcard;text/directory;application/mbox;message/rfc822;x-scheme-handler/mailto;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"evolution\"\nENV APPBIN \"/usr/bin/evolution\"\nENV APP \"/usr/bin/evolution\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/evolution/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/evolution/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application evolution

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/evolution.d\n
"},{"location":"applications/evolution/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f evolution.d -t evolution .\n
"},{"location":"applications/evolution/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect evolution > evolution.json\ndocker image save evolution -o evolution.tar\nctr -n k8s.io images import evolution.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @evolution.json\n\n
"},{"location":"applications/file-roller/","title":"file-roller","text":""},{"location":"applications/file-roller/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/file-roller/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/file-roller/#ubuntu-packages","title":"Ubuntu packages","text":"
file-roller\n
"},{"location":"applications/file-roller/#displayname","title":"Displayname","text":"
file-roller\n
"},{"location":"applications/file-roller/#path","title":"Path","text":"
/usr/bin/file-roller\n
"},{"location":"applications/file-roller/#mimetype","title":"Mimetype","text":"
application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\n
"},{"location":"applications/file-roller/#file-extensions","title":"File extensions","text":"

\"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\"

"},{"location":"applications/file-roller/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/file-roller/#wm_class","title":"WM_CLASS","text":"
file-roller.File-roller\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/file-roller/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.FileRoller.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/file-roller/#json-dump","title":"JSON dump","text":"

json source file file-roller.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"file-roller\",\n    \"icon\": \"circle_file-roller.svg\",\n    \"keyword\": \"zip,tar,gz,tgz,unzip,compress,7zip,7z,iso\",\n    \"launch\": \"file-roller.File-roller\",\n    \"name\": \"file-roller\",\n    \"displayname\": \"file-roller\",\n    \"path\": \"/usr/bin/file-roller\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"mimetype\": \"application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\",\n    \"fileextensions\": \"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\",\n    \"args\": \"\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/org.gnome.FileRoller.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/file-roller/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output file-roller.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/file-roller.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @file-roller.d.3.0.json\n\n
"},{"location":"applications/file-roller/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends file-roller && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_file-roller.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijk5LjAzNiIgeDI9Ijk5LjAzNiIgeTE9Ii0uNTA0NzIiIHkyPSIxOTkuODQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC42ODY2IDAgMCA0LjY4NjYgNDIuODQgNzIuMTk4KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWNkNWI5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UyY2E4NyIgb2Zmc2V0PSIuNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDZhYTM3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjUwMCIgeDI9IjUwMCIgeTE9IjI1Mi4zNiIgeTI9IjgwNi4wMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAtNC44Mjk0IDExLjUxOCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYmViZWIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wNTgyNTEiIHk9Ii0uMDI2MDUiIHdpZHRoPSIxLjExNjUiIGhlaWdodD0iMS4wNTIxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI1LjU1NzI0MjIiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMDU5ODYzIi8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC05ODguMzYpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDY0MDEyIDAgMCAuMDY0MDEyIC0uNzQyMjYgOTg1Ljc0KSIgc3Ryb2tlLXdpZHRoPSIxNS42MjIiPgogICA8Y2lyY2xlIGN4PSI1MTEuNSIgY3k9IjU0MC44NiIgcj0iNDY4LjY2IiBjb2xvcj0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiLz4KICAgPGNpcmNsZSBjeD0iNTExLjUiIGN5PSI1NDAuODYiIHI9IjQ2OC42NiIgY29sb3I9IiMwMDAwMDAiIGZpbGw9InVybCgjYSkiLz4KICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgLTQuODI5NCAxMS41MTgpIiBkPSJtNjAyLjgzIDU3Mi42MmgtMi43NjU0di00OS43MzhoLTMxLjA4NnYtNDkuNzM4aC00OS43Mzh2LTQ5LjczOGg0OS43Mzh2LTQ5LjczOGgtNDkuNzM4di00OS43MzhoNDkuNzM4di00OS43MzhoLTYyLjE3MnY0OS43MzhoLTQ5LjczOHY0OS43MzhoNDkuNzM4djQ5LjczOGgtNDkuNzM4djQ5LjczOGg0OS43Mzh2NDkuNzM4aC04MC44MjR2NDkuNzM4aC0yLjc2NTRsLTI0LjY3NiAxNjQuNTEgMTE0LjQ4IDQ5LjA2NCAxMTQuNDgtNDkuMDY0em0tODkuODA1IDE1OS40Ni01OS42LTI1LjU0MyAxMi42MjYtODQuMThoOTMuOTQ2bDEyLjYyNiA4NC4xOHoiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iMTkuNDI1Ii8+CiAgIDxwYXRoIGlkPSJYTUxJRF8xMDczXyIgZD0ibTU5NS42NSA1NzEuOTRoLTIuNzU0NnYtNDkuNTQ0aC0zMC45NjV2LTQ5LjU0NGgtNDkuNTQ0di00OS41NDRoNDkuNTQ0di00OS41NDRoLTQ5LjU0NHYtNDkuNTQ0aDQ5LjU0NHYtNDkuNTQ0aC02MS45Mjl2NDkuNTQ0aC00OS41NDR2NDkuNTQ0aDQ5LjU0NHY0OS41NDRoLTQ5LjU0NHY0OS41NDRoNDkuNTQ0djQ5LjU0NGgtODAuNTA4djQ5LjU0NGgtMi43NTQ2bC0yNC41OCAxNjMuODcgMTE0LjA0IDQ4Ljg3MiAxMTQuMDQtNDguODcyem0tODkuNDU1IDE1OC44NC01OS4zNjctMjUuNDQzIDEyLjU3Ny04My44NTFoOTMuNTc5bDEyLjU3NyA4My44NTF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjE5LjM0OSIvPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"file-roller,zip,tar,gz,tgz,unzip,compress,7zip,7z,iso\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.gnome.FileRoller.desktop\"\nLABEL oc.launch=\"file-roller.File-roller\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"file-roller\"\nLABEL oc.displayname=\"file-roller\"\nLABEL oc.path=\"/usr/bin/file-roller\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-7z-compressed;application/gzip;application/gtar;application/tar;application/zip;application/x-compress;application/x-compressed;application/x-zip-compressed;multipart/x-zip;application/gnutar;application/x-lzx;application/lzx;application/x-gzip;application/x-gtar;application/x-bzip2;application/x-bzip;application/x-bzip2;\"\nLABEL oc.fileextensions=\"7z;7zip;Z;unzip;zip;tar;tgz;war;tar.gz;ar;bcz;cpio;ear;jar;iso;tar.Z;tar.gz;tar.lz;tar.lzma;tar.lzo;tar.xz\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"file-roller\"\nENV APPBIN \"/usr/bin/file-roller\"\nENV APP \"/usr/bin/file-roller\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/file-roller/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/file-roller/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application file-roller

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/file-roller.d\n
"},{"location":"applications/file-roller/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f file-roller.d -t file-roller .\n
"},{"location":"applications/file-roller/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect file-roller > file-roller.json\ndocker image save file-roller -o file-roller.tar\nctr -n k8s.io images import file-roller.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @file-roller.json\n\n
"},{"location":"applications/filelight/","title":"filelight","text":""},{"location":"applications/filelight/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/filelight/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/filelight/#ubuntu-packages","title":"Ubuntu packages","text":"
filelight\n
"},{"location":"applications/filelight/#displayname","title":"Displayname","text":"
Filelight\n
"},{"location":"applications/filelight/#path","title":"Path","text":"
/usr/bin/filelight\n
"},{"location":"applications/filelight/#mimetype","title":"Mimetype","text":"
inode/directory;\n
"},{"location":"applications/filelight/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/filelight/#wm_class","title":"WM_CLASS","text":"
filelight.filelight\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/filelight/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.kde.filelight.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/filelight/#json-dump","title":"JSON dump","text":"

json source file filelight.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"filelight\",\n    \"icon\": \"filelight.svg\",\n    \"keyword\": \"disk,space,file,system,usage,volume,storage\",\n    \"launch\": \"filelight.filelight\",\n    \"name\": \"filelight\",\n    \"displayname\": \"Filelight\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/filelight\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"inode/directory;\",\n    \"fileextensions\": \"\",\n    \"args\": \"\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.filelight.desktop\"\n}\n
"},{"location":"applications/filelight/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output filelight.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filelight.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filelight.d.3.0.json\n\n
"},{"location":"applications/filelight/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends filelight && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"filelight.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnIGlkPSJzdmc0MzQwIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgd2lkdGg9IjQ4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogPGRlZnMgaWQ9ImRlZnM0MzQyIj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NDIzMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQ4IC4wMDIyMSkiIHgyPSI0NyIgeDE9IjEiPgogICA8c3RvcCBpZD0ic3RvcDctNTAiIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU0ZTQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDktOTYiIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8bWV0YWRhdGEgaWQ9Im1ldGFkYXRhNDM0NSI+CiAgPHJkZjpSREY+CiAgIDxjYzpXb3JrIHJkZjphYm91dD0iIj4KICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgPGRjOnR5cGUgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIvPgogICAgPGRjOnRpdGxlLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZyBpZD0iZzIxIj4KICA8cGF0aCBpZD0icGF0aDIzIiBzdHlsZT0ib3BhY2l0eTowLjAyIiBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIvPgogIDxwYXRoIGlkPSJwYXRoMjUiIHN0eWxlPSJvcGFjaXR5Oi4wNSIgZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6Ii8+CiAgPHBhdGggaWQ9InBhdGgyNyIgc3R5bGU9Im9wYWNpdHk6LjEiIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIvPgogPC9nPgogPHJlY3QgaWQ9InJlY3Q0MjI5IiBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDIzMSkiIHJ4PSI0IiB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiBoZWlnaHQ9IjQ2IiB3aWR0aD0iNDYiIHk9IjEiIHg9Ii00NyIvPgogPGcgaWQ9Imc1NyI+CiAgPGcgaWQ9Imc1OSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMTAwNC40KSI+CiAgIDxwYXRoIGlkPSJwYXRoNjEiIHN0eWxlPSJvcGFjaXR5Oi4xIiBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6Ii8+CiAgPC9nPgogPC9nPgogPHBhdGggaWQ9InBhdGgzNyIgc3R5bGU9ImZpbGwtb3BhY2l0eTowLjA5ODtmaWxsLXJ1bGU6ZXZlbm9kZCIgZD0ibTM5IDI0LjIwNWExNCAxNCAwIDAgMCAtNC4xIC0xMC4xMWwtOS45IDkuODk4IDEzLjE1NiA0Ljc4OWExNCAxNCAwIDAgMCAwLjg0MiAtNC41ODR6bS0xLjc4MSA2LjI0LTEyLjIxNy00LjQ0NXYxM2ExMyAxMyAwIDAgMCAxMi4yMTUgLTguNTU5bS00LjMxNi0xNy4zNDZhMTQgMTQgMCAwIDAgLTE2LjkgLTIuMjI1IDE0IDE0IDAgMCAwIC02LjUyMyAxNS43NDggMTQgMTQgMCAwIDAgMTMuNTIzIDEwLjM3N3YtMTRsOS45LTkuOXoiLz4KIDxwYXRoIGlkPSJwYXRoMzkiIHN0eWxlPSJmaWxsOiNlMzhjNTM7ZmlsbC1ydWxlOmV2ZW5vZGQiIGQ9Im0yMyAzNS45OTVhMTQgMTQgMCAwIDEgLTEzLjUyMyAtMTAuMzc3IDE0IDE0IDAgMCAxIDYuNTIzIC0xNS43NDcgMTQgMTQgMCAwIDEgMTYuOSAyLjIyNGwtOS45IDkuOSIvPgogPHBhdGggaWQ9InBhdGg0MSIgc3R5bGU9ImZpbGw6IzU5YTNjODtmaWxsLXJ1bGU6ZXZlbm9kZCIgZD0ibTM0LjkgMTMuMDk1YTE0IDE0IDAgMCAxIDMuMjU1IDE0LjY4OWwtMTMuMTU1LTQuNzg5Ii8+CiA8cGF0aCBpZD0icGF0aDQzIiBzdHlsZT0iZmlsbDojYThjZjM2O2ZpbGwtcnVsZTpldmVub2RkIiBkPSJtMzcuMjE1IDI5LjQ0MWExMyAxMyAwIDAgMSAtMTIuMjE1IDguNTU0di0xM3oiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"filelight,disk,space,file,system,usage,volume,storage\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.kde.filelight.desktop\"\nLABEL oc.launch=\"filelight.filelight\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"filelight\"\nLABEL oc.displayname=\"Filelight\"\nLABEL oc.path=\"/usr/bin/filelight\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"inode/directory;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"filelight\"\nENV APPBIN \"/usr/bin/filelight\"\nENV APP \"/usr/bin/filelight\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/filelight/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/filelight/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application filelight

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filelight.d\n
"},{"location":"applications/filelight/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f filelight.d -t filelight .\n
"},{"location":"applications/filelight/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect filelight > filelight.json\ndocker image save filelight -o filelight.tar\nctr -n k8s.io images import filelight.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filelight.json\n\n
"},{"location":"applications/filezilla/","title":"filezilla","text":""},{"location":"applications/filezilla/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/filezilla/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/filezilla/#alpine-packages","title":"Alpine packages","text":"
filezilla\n
"},{"location":"applications/filezilla/#displayname","title":"Displayname","text":"
filezilla (alpine)\n
"},{"location":"applications/filezilla/#path","title":"Path","text":"
/usr/bin/filezilla\n
"},{"location":"applications/filezilla/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/filezilla/#wm_class","title":"WM_CLASS","text":"
filezilla.Filezilla\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/filezilla/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/filezilla.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/filezilla/#json-dump","title":"JSON dump","text":"

json source file filezilla.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"filezilla\",\n    \"icon\": \"circle_filezilla.svg\",\n    \"keyword\": \"ftp,client\",\n    \"launch\": \"filezilla.Filezilla\",\n    \"name\": \"filezilla\",\n    \"displayname\": \"filezilla (alpine)\",\n    \"path\": \"/usr/bin/filezilla\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"desktopfile\": \"/usr/share/applications/filezilla.desktop\"\n}\n
"},{"location":"applications/filezilla/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output filezilla.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filezilla.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filezilla.d.3.0.json\n\n
"},{"location":"applications/filezilla/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update filezilla\nLABEL oc.icon=\"circle_filezilla.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjQyIi8+PC9maWx0ZXI+PGZpbHRlciBpZD0iYyIgeD0iLS4wNiIgeT0iLS4wNiIgd2lkdGg9IjEuMTIiIGhlaWdodD0iMS4xMiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIuNiIvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQwMC41NyIgeDI9IjQwMC41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2My42NyAtMjM1LjkxKSBzY2FsZSgxLjQyODYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2UwMmQyZCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2Y3NTE1MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PGNpcmNsZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODI2LjM2IC0xMTA3LjUpIHNjYWxlKDIuMTQyOSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PHJlY3QgeD0iMzg4LjU3IiB5PSI1MDMuOCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeT0iMjAiIGZpbGw9InVybCgjYikiIHRyYW5zZm9ybT0ibWF0cml4KDEuNTAwMDggMCAwIDEuNTAwMDggLTU4MC44NSAtNzUzLjY5MykiIHN0cm9rZS13aWR0aD0iLjk2NiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQgNCkgc2NhbGUoMS4xNjY3KSIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMTUiPjxwYXRoIGQ9Im0xNyAxMi01IDIxaDQuMWwyLjE1LTlIMjlsLTEwLjA3MSA4Ljk2MkwyMS41NjIgMzZsMS4zNDgtLjcwM2MyLjU1MS0xLjMwOSAzLjYyMS0uNTQzIDUuNTU1LS4wMDggMS44ODMuNTIgMy42NTYgMS4wNzggNy4zMjgtMS4wMzVsLS43My0zLjczNGMtNCAyLjg0OC01LjI3My4zMDktOC4xMjkuMjAzTDM1IDI0bDEtNEgxOS4ybC45OC00SDMxbDEtNCIvPjwvZz48cGF0aCBkPSJNMjMuODM0IDE4IDE4IDQyLjUwMWg0Ljc4NGwyLjUwOC0xMC41aDEyLjU0MmwtMTEuNzUgMTAuNDU2TDI5LjE1NiA0NmwxLjU3My0uODJjMi45NzYtMS41MjcgNC4yMjUtLjYzNCA2LjQ4MS0uMDEgMi4xOTcuNjA3IDQuMjY2IDEuMjU4IDguNTUtMS4yMDdsLS44NTItNC4zNTZjLTQuNjY3IDMuMzIyLTYuMTUyLjM2LTkuNDg0LjIzN0w0NC44MzQgMzJsMS4xNjctNC42NjdoLTE5LjZsMS4xNDMtNC42NjdoMTIuNjI0TDQxLjMzNCAxOCIgZmlsbD0iI2Y5ZjlmOSIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"filezilla,ftp,client\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"filezilla.desktop\"\nLABEL oc.launch=\"filezilla.Filezilla\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"filezilla\"\nLABEL oc.displayname=\"filezilla (alpine)\"\nLABEL oc.path=\"/usr/bin/filezilla\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"filezilla\"\nENV APPBIN \"/usr/bin/filezilla\"\nENV APP \"/usr/bin/filezilla\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/filezilla/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/filezilla/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application filezilla

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/filezilla.d\n
"},{"location":"applications/filezilla/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f filezilla.d -t filezilla .\n
"},{"location":"applications/filezilla/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect filezilla > filezilla.json\ndocker image save filezilla -o filezilla.tar\nctr -n k8s.io images import filezilla.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @filezilla.json\n\n
"},{"location":"applications/firefox-esr/","title":"firefox-esr","text":""},{"location":"applications/firefox-esr/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/firefox-esr/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/firefox-esr/#alpine-packages","title":"Alpine packages","text":"
firefox-esr\n
"},{"location":"applications/firefox-esr/#displayname","title":"Displayname","text":"
Firefox (esr alpine)\n
"},{"location":"applications/firefox-esr/#path","title":"Path","text":"
/usr/bin/firefox-esr\n
"},{"location":"applications/firefox-esr/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/firefox-esr/#mimetype","title":"Mimetype","text":"
text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
"},{"location":"applications/firefox-esr/#file-extensions","title":"File extensions","text":"

\"htm;html;xml;gif\"

"},{"location":"applications/firefox-esr/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"htm;html;xml\"

"},{"location":"applications/firefox-esr/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/firefox-esr/#wm_class","title":"WM_CLASS","text":"
Navigator.firefox-esr\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/firefox-esr/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/firefox-esr.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/firefox-esr/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

COPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\n
"},{"location":"applications/firefox-esr/#json-dump","title":"JSON dump","text":"

json source file firefox-esr.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"cat\": \"office\",\n    \"comment\": \"NSS_SDB_USE_CACHE=yes\",\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\",\n        \"COPY policies.json /usr/lib/firefox/distribution\",\n        \"COPY /ntlm_auth /usr/bin/ntlm_auth.desktop\",\n        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\"\n    ],\n    \"apkpackage\": \"firefox-esr\",\n    \"icon\": \"circle_firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.firefox-esr\",\n    \"name\": \"firefox-esr\",\n    \"displayname\": \"Firefox (esr alpine)\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/firefox-esr\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/firefox-esr.desktop\",\n    \"usedefaultapplication\": true\n}\n
"},{"location":"applications/firefox-esr/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output firefox-esr.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox-esr.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox-esr.d.3.0.json\n\n
"},{"location":"applications/firefox-esr/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.firefox-esr /composer/init.d/init.firefox-esr\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\nRUN apk add --no-cache --update firefox-esr\nLABEL oc.icon=\"circle_firefox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IHgxPSIyODAiIHgyPSIyODAiIHkxPSIxNzIiIHkyPSIyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmFiZGI2IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2JhYmRiNiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjbGlwUGF0aD4KICAgPGNpcmNsZSBjeD0iNjQiIGN5PSIyMzYiIHI9IjUyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjMzU4NGU0IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPC9jbGlwUGF0aD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI3MC43ODYiIHgyPSI2LjQ0NyIgeTE9IjEyLjM5MyIgeTI9Ijc0LjQ2OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAtLjAwNTQ2MTUgMjgwLjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4wNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZTg0NyIgb2Zmc2V0PSIuMTExIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjIyNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zNjgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuNDAxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ2MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41MzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UzMTU4NyIgb2Zmc2V0PSIuNzA1Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItNzkwNy4yIiBjeT0iLTg1MTUuMSIgcj0iODAuNzk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkNGYiIG9mZnNldD0iLjEyOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhYzMxIiBvZmZzZXQ9Ii4xODYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOWQxNyIgb2Zmc2V0PSIuMjQ3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjI4MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjNiIiBvZmZzZXQ9Ii40MDMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgb2Zmc2V0PSIuNDY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNTE1NmMiIG9mZnNldD0iLjcxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYjA4NzgiIG9mZnNldD0iLjc4MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTUwMDgwIiBvZmZzZXQ9Ii44NiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iLTc5MzYuNyIgY3k9Ii04NDgyLjEiIHI9IjgwLjc5NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjOTYwZTE4IiBvZmZzZXQ9Ii4zIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNiMTE5MjciIHN0b3Atb3BhY2l0eT0iLjc0IiBvZmZzZXQ9Ii4zNTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RiMjkzZCIgc3RvcC1vcGFjaXR5PSIuMzQzIiBvZmZzZXQ9Ii40MzUiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1MzM0YiIgc3RvcC1vcGFjaXR5PSIuMDk0IiBvZmZzZXQ9Ii40OTciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9Ii41MyIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iLTc5MjciIGN5PSItODUzMy41IiByPSI1OC41MzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTMyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRjM2UiIG9mZnNldD0iLjI1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ZDEyIiBvZmZzZXQ9Ii41MDYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNTI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImciIGN4PSItNzkzNy43IiBjeT0iLTg1MTguNCIgcj0iMjcuNjc2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUyMjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYjI3IiBvZmZzZXQ9Ii4xMjEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmYzgyYSIgb2Zmc2V0PSIuMjk1Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE5MzAiIG9mZnNldD0iLjUwMiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3ZTM3IiBvZmZzZXQ9Ii43MzIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNzEzOSIgb2Zmc2V0PSIuNzkyIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImgiIGN4PSItNzkxNiIgY3k9Ii04NTM2IiByPSIxMTguMDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTEzIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjQ1NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjM0IiBvZmZzZXQ9Ii42MjIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzY0NyIgb2Zmc2V0PSIuNzE2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlMzE1ODciIG9mZnNldD0iLjkwNCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iLTc5MjcuMiIgY3k9Ii04NTIyLjkiIHI9Ijg2LjQ5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDIyMjM0IC4yMTA3IC0uMTM4MjggLjAxNDYxMSAtOTkxLjg2IDIwNzMuNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmU4NDciIG9mZnNldD0iLjA2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjE2OCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zMDQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuMzU2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41NyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii43MzciLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iaiIgY3g9Ii03OTM4LjQiIGN5PSItODUwOC4yIiByPSI3My43MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4xMzciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTYzNCIgb2Zmc2V0PSIuNTkyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjM2NDciIG9mZnNldD0iLjY1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii45MDQiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iayIgY3g9Ii03OTE4LjkiIGN5PSItODUwMy45IiByPSI4MC42ODYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMDk0Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUxNDEiIG9mZnNldD0iLjIzMSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhZjFlIiBvZmZzZXQ9Ii41MDkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNjI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI3MC4wMTMiIHgyPSIxNS4yNjciIHkxPSIxMi4wNjEiIHkyPSI2Ni44MDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgLS4wMDU0NjE1IDI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgc3RvcC1vcGFjaXR5PSIuOCIgb2Zmc2V0PSIuMTY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjYzNCIgb2Zmc2V0PSIuMjY2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjIxNyIgb2Zmc2V0PSIuNDg5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIuNiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iOC40OTM3IiBjeT0iMjg3LjM0IiByPSIzLjY0NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOTYyIDAgLTI3Ljc1NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYyYTBlYSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNTg0ZTQiIG9mZnNldD0iLjU1MTY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxYTVmYjQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0yODAuMDcpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTY4MzYgMCAwIC45NjgzNiAuMjY3ODkgOC44Njc4KSI+CiAgIDxjaXJjbGUgY3g9IjMzOS4xMyIgY3k9IjI4NS42OSIgcj0iMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2Q1ZDNjZiIvPgogICA8ZyBzdHJva2Utd2lkdGg9Ii4yMTE3NSI+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTFsMC4wMDE1IDAuMDEzOGMtMC45Mjc5MS0yLjMxMzQtMi41MDE1LTMuMjQ2Mi0zLjc4NjYtNS4yNzczLTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zbDAuMDAzMi02ZS0zYy0yLjA2MTQgMS4yMDctMi43NjA5IDMuNDQxNC0yLjgyNTIgNC41NTkxYTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTIgMi40NTM2IDIuNDUzNiAwIDAgMC0wLjIxMTc1LTAuMTYwNTEgMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhoLTAuMDAzODFjLTAuMzI1MzUtMC40MTEzMS0wLjMwMjQ4LTEuNzcwOC0wLjI4Mzg1LTIuMDU0N2ExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDcxMTQ5IDAuNDMzODgtMC4wODA2NzggMC41MTI0NCAwIDZlLTMgLTAuMDAxMjcxIDAuMDExOS0wLjAwMTkwNiAwLjAxOGE3LjgyMTYgNy44MjE2IDAgMCAwLTAuMTMzMTkgMS4xMzE0djAuMDQyM2E4LjIwNzQgOC4yMDc0IDAgMCAwIDE2LjI5NSAxLjM4NzhjMC4wMTM3Ni0wLjEwNTg4IDAuMDI0OTktMC4yMTA3IDAuMDM3MjctMC4zMTc2M2E4LjQzOTkgOC40Mzk5IDAgMCAwLTAuNTMyMzUtNC4xMjI2em0tOS40NTkxIDYuNDI0MmMwLjAzODMyNyAwLjAxODQgMC4wNzQzMjYgMC4wMzgzIDAuMTEzNzEgMC4wNTU5bDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1em0xLjg4LTQuOTVtNi43NjYtMS4wNDQ4di04ZS0zbDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNhKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExdjhlLTNsMC4wMDE1IDllLTNhNy40MzI2IDcuNDMyNiAwIDAgMS0wLjI1NTM4IDUuNTM5MWMtMC45NDA2MSAyLjAxODItMy4yMTc0IDQuMDg2OC02Ljc4MTIgMy45ODYzLTMuODUwNy0wLjEwOTA2LTcuMjQyLTIuOTY2NS03Ljg3Ni02LjcwOS0wLjExNTQxLTAuNTkwMTYgMC0wLjg4OTM3IDAuMDU4MDIxLTEuMzY5YTYuMTE0NiA2LjExNDYgMCAwIDAtMC4xMzE5MiAxLjEzMjV2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6IiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTF2OGUtM2wwLjAwMTUgOWUtM2E3LjQzMjYgNy40MzI2IDAgMCAxLTAuMjU1MzggNS41MzkxYy0wLjk0MDYxIDIuMDE4Mi0zLjIxNzQgNC4wODY4LTYuNzgxMiAzLjk4NjMtMy44NTA3LTAuMTA5MDYtNy4yNDItMi45NjY1LTcuODc2LTYuNzA5LTAuMTE1NDEtMC41OTAxNiAwLTAuODg5MzcgMC4wNTgwMjEtMS4zNjlhNi4xMTQ2IDYuMTE0NiAwIDAgMC0wLjEzMTkyIDEuMTMyNXYwLjA0MjNhOC4yMDc0IDguMjA3NCAwIDAgMCAxNi4yOTUgMS4zODc4YzAuMDEzNzYtMC4xMDU4OCAwLjAyNDk5LTAuMjEwNyAwLjAzNzI3LTAuMzE3NjNhOC40Mzk5IDguNDM5OSAwIDAgMC0wLjUzMjM1LTQuMTIyNnoiIGZpbGw9InVybCgjYykiLz4KICAgIDxwYXRoIGQ9Im0xMi4wODIgMjg2LjcxYzAuMDE3NzkgMC4wMTI1IDAuMDM0MyAwLjAyNSAwLjA1MTAzIDAuMDM3NWE0LjQ2OCA0LjQ2OCAwIDAgMC0wLjc2MjMyLTAuOTk0MThjLTIuNTUwOC0yLjU1MTItMC42Njg1MS01LjUzMTctMC4zNTEwOS01LjY4MzFsMC4wMDMyLTVlLTNjLTIuMDYxNCAxLjIwNy0yLjc2MDkgMy40NDE0LTIuODI1MiA0LjU1OTEgMC4wOTU3MTMtN2UtMyAwLjE5MDU4LTAuMDE0NiAwLjI4ODQxLTAuMDE0NmE0LjE0MTkgNC4xNDE5IDAgMCAxIDMuNTk2IDIuMXoiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im04LjQ5MTIgMjg3LjIyYy0wLjAxMzU1MiAwLjIwNDEzLTAuNzM0NzkgMC45MDgyMS0wLjk4Njk5IDAuOTA4MjEtMi4zMzM3IDAtMi43MTI2IDEuNDExOC0yLjcxMjYgMS40MTE4IDAuMTAzMzQgMS4xODg4IDAuOTMxNzIgMi4xNjc5IDEuOTMzMSAyLjY4NTkgMC4wNDU3MzkgMC4wMjM3IDAuMDkyMTEzIDAuMDQ1MSAwLjEzODQ5IDAuMDY2MXEwLjEyMDQ5IDAuMDUzNCAwLjI0MDk4IDAuMDk4N2EzLjY0OTYgMy42NDk2IDAgMCAwIDEuMDY3OSAwLjIwNjA0YzQuMDkwNSAwLjE5MTg1IDQuODgyOC00Ljg5MTUgMS45MzEtNi4zNjY2YTIuODMzMyAyLjgzMzMgMCAwIDEgMS45Nzg4IDAuNDgwNDcgNC4xNDE5IDQuMTQxOSAwIDAgMC0zLjU5Ni0yLjFjLTAuMDk3NDA3IDAtMC4xOTI3IDhlLTMgLTAuMjg4NDEgMC4wMTQ2YTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTJjMC4xMjUxNSAwLjEwNTg3IDAuMjY2MzkgMC4yNDczMyAwLjU2MzkgMC41NDA2MSAwLjU1NjkxIDAuNTQ4NjUgMS45ODUyIDEuMTE3IDEuOTg4NCAxLjE4Mzd6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCBkPSJtNS41NTYzIDI4NS4yMmMwLjA2NjQ5MSAwLjA0MjMgMC4xMjEzNCAwLjA3OTIgMC4xNjk0IDAuMTEyNDRhMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhjMC4wNDAwMjItMWUtMyAxLjIzMDUtMC4wMjI0IDEuODI5MSAwLjM2Njc2eiIgZmlsbD0idXJsKCNnKSIvPgogICAgPHBhdGggZD0ibTAuMzQ0NzggMjg4Ljk5YzAuNjMzMzYgMy43NDI1IDQuMDI1MiA2LjYgNy44NzYgNi43MDkgMy41NjM4IDAuMTAwNzkgNS44NDA2LTEuOTY4IDYuNzgxMi0zLjk4NjNhNy40MzI2IDcuNDMyNiAwIDAgMCAwLjI1NTM4LTUuNTM5MXYtOGUtM2MwLTZlLTMgLTAuMDAxMy0wLjAxIDAtOGUtM2wwLjAwMTUgMC4wMTM4YzAuMjkxMTYgMS45MDA5LTAuNjc1NzEgMy43NDI1LTIuMTg3MiA0Ljk4NzlsLTAuMDA0NyAwLjAxMDZjLTIuOTQ1MSAyLjM5ODUtNS43NjM1IDEuNDQ3MS02LjMzNCAxLjA1ODhxLTAuMDU5NzE1LTAuMDI4Ni0wLjExOTQzLTAuMDU5NWMtMS43MTcxLTAuODIwNzYtMi40MjY1LTIuMzg1Mi0yLjI3NDUtMy43MjY5YTIuMTA3NiAyLjEwNzYgMCAwIDEtMS45NDQxLTEuMjIyOSAzLjA5NTQgMy4wOTU0IDAgMCAxIDMuMDE3My0wLjEyMTEzIDQuMDg2OSA0LjA4NjkgMCAwIDAgMy4wODE0IDAuMTIxMTNjLTAuMDAzMTgtMC4wNjY3LTEuNDMxNS0wLjYzNTI2LTEuOTg4NC0xLjE4MzctMC4yOTc1MS0wLjI5MzI4LTAuNDM4NzUtMC40MzQ1Mi0wLjU2MzktMC41NDA2MWEyLjQ1MzYgMi40NTM2IDAgMCAwLTAuMjExNzUtMC4xNjA1MWMtMC4wNDg3MDQtMC4wMzMyLTAuMTAzNTUtMC4wNjkyLTAuMTY5NC0wLjExMjQ0LTAuNTk4NjMtMC4zODkyLTEuNzg5MS0wLjM2NzgxLTEuODI4NS0wLjM2Njc1aC0wLjAwMzgxYy0wLjMyNTIzLTAuNDEyLTAuMzAyMzYtMS43NzE1LTAuMjgzNzMtMi4wNTU0YTEuNDY3IDEuNDY3IDAgMCAwLTAuMjc0MDEgMC4xNDU0NyA1Ljk3NjggNS45NzY4IDAgMCAwLTAuODAyMTIgMC42ODcxNCA3LjE2NjggNy4xNjY4IDAgMCAwLTAuNzcwMzYgMC45MTgzOHYxZS0zIC0xZS0zYTYuOTMxMyA2LjkzMTMgMCAwIDAtMS4xMDExIDIuNDg2NmMtMC4wMDQwMjMgMC4wMTY3LTAuMjk1NjEgMS4yOTE1LTAuMTUxODMgMS45NTI2eiIgZmlsbD0idXJsKCNoKSIvPgogICAgPHBhdGggZD0ibTExLjM3MSAyODUuNzZhNC40NjggNC40NjggMCAwIDEgMC43NjIzMiAwLjk5NTI0YzAuMDQ1MSAwLjAzNDEgMC4wODcyNCAwLjA2OCAwLjEyMzAzIDAuMTAwNzkgMS44NjA3IDEuNzE1MiAwLjg4NTc3IDQuMTM5OCAwLjgxMzE0IDQuMzEyNCAxLjUxMTUtMS4yNDUzIDIuNDc3NS0zLjA4NyAyLjE4NzItNC45ODc5LTAuOTI4MzMtMi4zMTQ1LTIuNTAxOS0zLjI0NzItMy43ODctNS4yNzg0LTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zIC0wLjMxNzQyIDAuMTUwNTUtMi4xOTk3IDMuMTMxIDAuMzUxNTEgNS42ODIyeiIgZmlsbD0idXJsKCNpKSIvPgogICAgPHBhdGggZD0ibTEyLjI1NSAyODYuODVjLTAuMDM1NzktMC4wMzI4LTAuMDc3OTItMC4wNjY3LTAuMTIzMDMtMC4xMDA4LTAuMDE2NzMtMC4wMTI1LTAuMDMzMjUtMC4wMjUtMC4wNTEwMy0wLjAzNzVhMi44MzMzIDIuODMzMyAwIDAgMC0xLjk3ODgtMC40ODA0N2MyLjk1MTkgMS40NzU5IDIuMTU5OSA2LjU1ODQtMS45MzEgNi4zNjY2YTMuNjQ5NiAzLjY0OTYgMCAwIDEtMS4wNjc5LTAuMjA2MDJxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM2MwLjU3MDQ3IDAuMzg5NDEgMy4zODgxIDEuMzQwOCA2LjMzNC0xLjA1ODhsMC4wMDQ3LTAuMDEwNmMwLjA3MzQ4LTAuMTcxNTIgMS4wNDg0LTIuNTk2Ny0wLjgxMzE0LTQuMzExM3oiIGZpbGw9InVybCgjaikiLz4KICAgIDxwYXRoIGQ9Im00Ljc5MTYgMjg5LjU0czAuMzc4ODMtMS40MTE4IDIuNzEyNi0xLjQxMThjMC4yNTIyIDAgMC45NzQwNy0wLjcwNDA4IDAuOTg2OTktMC45MDgyMWE0LjA4NjkgNC4wODY5IDAgMCAxLTMuMDgxNC0wLjEyMTEyIDMuMDk1NCAzLjA5NTQgMCAwIDAtMy4wMTczIDAuMTIxMTIgMi4xMDc2IDIuMTA3NiAwIDAgMCAxLjk0NDEgMS4yMjI5Yy0wLjE1MjA0IDEuMzQxOSAwLjU1NzM0IDIuOTA2MyAyLjI3NDUgMy43MjY5IDAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3NzMtMS44Mjk4LTEuNDk2OS0xLjkzMzEtMi42ODU3eiIgZmlsbD0idXJsKCNrKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExbDAuMDAxNSAwLjAxMzhjLTAuOTI3OTEtMi4zMTM0LTIuNTAxNS0zLjI0NjItMy43ODY2LTUuMjc3My0wLjA2NTAxLTAuMTAyNy0wLjEzMDAyLTAuMjA1NjEtMC4xOTMzMy0wLjMxNDI0LTAuMDM2MjEtMC4wNjItMC4wNjUyMi0wLjExNzk1LTAuMDkwNDItMC4xNjk0YTEuNDkzNSAxLjQ5MzUgMCAwIDEtMC4xMjIzOS0wLjMyNTA0IDAuMDIxMTc1IDAuMDIxMTc1IDAgMCAwLTAuMDE4NjMtMC4wMjEyIDAuMDI5MjIyIDAuMDI5MjIyIDAgMCAwLTAuMDE1NDYgMGMtMC4wMDExIDAtMC4wMDI4IDJlLTMgLTRlLTMgMmUtMyAtMC4wMDEzIDQuMmUtNCAtNGUtMyAyZS0zIC0wLjAwNTkgM2UtM2wwLjAwMzItNmUtM2MtMi4wNjE0IDEuMjA3LTIuNzYwOSAzLjQ0MTQtMi44MjUyIDQuNTU5MSAwLjA5NTcxMy03ZS0zIDAuMTkwNTgtMC4wMTQ2IDAuMjg4NDEtMC4wMTQ2YTQuMTQxOSA0LjE0MTkgMCAwIDEgMy41OTYgMi4xIDIuODMzMyAyLjgzMzMgMCAwIDAtMS45Nzg4LTAuNDgwNDdjMi45NTE5IDEuNDc1OSAyLjE1OTkgNi41NTg0LTEuOTMxIDYuMzY2NmEzLjY0OTYgMy42NDk2IDAgMCAxLTEuMDY4LTAuMjA1MDhxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1YzAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3OTUtMS44Mjk4LTEuNDk3MS0xLjkzMzEtMi42ODU5IDAgMCAwLjM3ODgzLTEuNDExOCAyLjcxMjYtMS40MTE4IDAuMjUyMiAwIDAuOTc0MDctMC43MDQwOCAwLjk4Njk5LTAuOTA4MjEtMC4wMDMxOC0wLjA2NjctMS40MzE1LTAuNjM1MjYtMS45ODg0LTEuMTgzNy0wLjI5NzUxLTAuMjkzMjgtMC40Mzg3NS0wLjQzNDUyLTAuNTYzOS0wLjU0MDYxYTIuNDUzNiAyLjQ1MzYgMCAwIDAtMC4yMTE3NS0wLjE2MDUxIDMuODA0OCAzLjgwNDggMCAwIDEtMC4wMjMwODEtMi4wMDYgNi4wNzg0IDYuMDc4NCAwIDAgMC0xLjk3NTUgMS41MjY4aC0wLjAwMzgxYy0wLjMyNTI2LTAuNDEyNjMtMC4zMDIzOS0xLjc3MjEtMC4yODM3NS0yLjA1NmExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDg0NzAyIDAuNDM4OTYtMC4wOTQ2NTQgMC41MTc3NHYwYTkuNTQ4OCA5LjU0ODggMCAwIDAtMC4xMjExMiAxLjE0NDF2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6bS0wLjgxNDIgMC40MjE2IDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNsKSIvPgogICA8L2c+CiAgIDxjaXJjbGUgY3g9Ii0xOS4zNDciIGN5PSIyOTQuNTMiIHI9IjAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9IiNkNWQzY2YiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"firefox-esr,firefox,mozilla,web,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"firefox-esr.desktop\"\nLABEL oc.launch=\"Navigator.firefox-esr\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"firefox-esr\"\nLABEL oc.displayname=\"Firefox (esr alpine)\"\nLABEL oc.path=\"/usr/bin/firefox-esr\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"htm;html;xml;gif\"\nLABEL oc.legacyfileextensions=\"htm;html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"firefox-esr\"\nENV APPBIN \"/usr/bin/firefox-esr\"\nENV APP \"/usr/bin/firefox-esr\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/firefox-esr/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/firefox-esr/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application firefox-esr

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox-esr.d\n
"},{"location":"applications/firefox-esr/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f firefox-esr.d -t firefox-esr .\n
"},{"location":"applications/firefox-esr/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect firefox-esr > firefox-esr.json\ndocker image save firefox-esr -o firefox-esr.tar\nctr -n k8s.io images import firefox-esr.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox-esr.json\n\n
"},{"location":"applications/firefox/","title":"Firefox","text":""},{"location":"applications/firefox/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/firefox/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/firefox/#alpine-packages","title":"Alpine packages","text":"
firefox krb5\n
"},{"location":"applications/firefox/#displayname","title":"Displayname","text":"
Firefox (alpine)\n
"},{"location":"applications/firefox/#path","title":"Path","text":"
/usr/bin/firefox\n
"},{"location":"applications/firefox/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/firefox/#mimetype","title":"Mimetype","text":"
text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
"},{"location":"applications/firefox/#file-extensions","title":"File extensions","text":"

\"htm;html;xml;gif\"

"},{"location":"applications/firefox/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"htm;html;xml\"

"},{"location":"applications/firefox/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/firefox/#wm_class","title":"WM_CLASS","text":"
Navigator.firefox\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/firefox/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/firefox.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/firefox/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

COPY composer/init.d/init.firefox /composer/init.d/init.firefox\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\n
"},{"location":"applications/firefox/#json-dump","title":"JSON dump","text":"

json source file firefox.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"cat\": \"office\",\n    \"comment\": \"NSS_SDB_USE_CACHE=yes\",\n    \"postruncommands\": [\n        \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n        \"COPY policies.json /usr/lib/firefox/distribution\",\n        \"COPY /ntlm_auth /usr/bin/ntlm_auth.desktop\",\n        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\"\n    ],\n    \"apkpackage\": \"firefox krb5\",\n    \"icon\": \"circle_firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.firefox\",\n    \"args\": \"\",\n    \"name\": \"Firefox\",\n    \"displayname\": \"Firefox (alpine)\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/firefox.desktop\",\n    \"usedefaultapplication\": true\n}\n
"},{"location":"applications/firefox/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output firefox.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/firefox.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @firefox.d.3.0.json\n\n
"},{"location":"applications/firefox/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update firefox krb5\nLABEL oc.icon=\"circle_firefox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IHgxPSIyODAiIHgyPSIyODAiIHkxPSIxNzIiIHkyPSIyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmFiZGI2IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2JhYmRiNiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjbGlwUGF0aD4KICAgPGNpcmNsZSBjeD0iNjQiIGN5PSIyMzYiIHI9IjUyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSIjMzU4NGU0IiBzdHlsZT0icGFpbnQtb3JkZXI6bm9ybWFsIi8+CiAgPC9jbGlwUGF0aD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI3MC43ODYiIHgyPSI2LjQ0NyIgeTE9IjEyLjM5MyIgeTI9Ijc0LjQ2OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAtLjAwNTQ2MTUgMjgwLjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4wNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZTg0NyIgb2Zmc2V0PSIuMTExIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjIyNSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zNjgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuNDAxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ2MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41MzQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2UzMTU4NyIgb2Zmc2V0PSIuNzA1Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItNzkwNy4yIiBjeT0iLTg1MTUuMSIgcj0iODAuNzk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmJkNGYiIG9mZnNldD0iLjEyOSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhYzMxIiBvZmZzZXQ9Ii4xODYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOWQxNyIgb2Zmc2V0PSIuMjQ3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjI4MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjNiIiBvZmZzZXQ9Ii40MDMiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgb2Zmc2V0PSIuNDY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNTE1NmMiIG9mZnNldD0iLjcxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYjA4NzgiIG9mZnNldD0iLjc4MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTUwMDgwIiBvZmZzZXQ9Ii44NiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iLTc5MzYuNyIgY3k9Ii04NDgyLjEiIHI9IjgwLjc5NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjOTYwZTE4IiBvZmZzZXQ9Ii4zIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNiMTE5MjciIHN0b3Atb3BhY2l0eT0iLjc0IiBvZmZzZXQ9Ii4zNTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2RiMjkzZCIgc3RvcC1vcGFjaXR5PSIuMzQzIiBvZmZzZXQ9Ii40MzUiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1MzM0YiIgc3RvcC1vcGFjaXR5PSIuMDk0IiBvZmZzZXQ9Ii40OTciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzc1MCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9Ii41MyIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iLTc5MjciIGN5PSItODUzMy41IiByPSI1OC41MzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTMyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRjM2UiIG9mZnNldD0iLjI1MiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ZDEyIiBvZmZzZXQ9Ii41MDYiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNTI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImciIGN4PSItNzkzNy43IiBjeT0iLTg1MTguNCIgcj0iMjcuNjc2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4yMTE3NSAwIDAgLjIxMTc1IDE2ODguNyAyMDg1LjEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUyMjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZkYjI3IiBvZmZzZXQ9Ii4xMjEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmYzgyYSIgb2Zmc2V0PSIuMjk1Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE5MzAiIG9mZnNldD0iLjUwMiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY3ZTM3IiBvZmZzZXQ9Ii43MzIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNzEzOSIgb2Zmc2V0PSIuNzkyIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImgiIGN4PSItNzkxNiIgY3k9Ii04NTM2IiByPSIxMTguMDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMTEzIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjk4MGUiIG9mZnNldD0iLjQ1NiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY1NjM0IiBvZmZzZXQ9Ii42MjIiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmMzY0NyIgb2Zmc2V0PSIuNzE2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlMzE1ODciIG9mZnNldD0iLjkwNCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iLTc5MjcuMiIgY3k9Ii04NTIyLjkiIHI9Ijg2LjQ5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDIyMjM0IC4yMTA3IC0uMTM4MjggLjAxNDYxMSAtOTkxLjg2IDIwNzMuNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmU4NDciIG9mZnNldD0iLjA2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmM4MzAiIG9mZnNldD0iLjE2OCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmY5ODBlIiBvZmZzZXQ9Ii4zMDQiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOGIxNiIgb2Zmc2V0PSIuMzU2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjY3MmEiIG9mZnNldD0iLjQ1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmYzNjQ3IiBvZmZzZXQ9Ii41NyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii43MzciLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iaiIgY3g9Ii03OTM4LjQiIGN5PSItODUwOC4yIiByPSI3My43MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjExNzUgMCAwIC4yMTE3NSAxNjg4LjcgMjA4NS4xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmNDRmIiBvZmZzZXQ9Ii4xMzciLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNDgiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTYzNCIgb2Zmc2V0PSIuNTkyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZjM2NDciIG9mZnNldD0iLjY1NSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTMxNTg3IiBvZmZzZXQ9Ii45MDQiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iayIgY3g9Ii03OTE4LjkiIGN5PSItODUwMy45IiByPSI4MC42ODYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgMTY4OC43IDIwODUuMSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgb2Zmc2V0PSIuMDk0Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmUxNDEiIG9mZnNldD0iLjIzMSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZhZjFlIiBvZmZzZXQ9Ii41MDkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTgwZSIgb2Zmc2V0PSIuNjI2Ii8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI3MC4wMTMiIHgyPSIxNS4yNjciIHkxPSIxMi4wNjEiIHkyPSI2Ni44MDYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjIxMTc1IDAgMCAuMjExNzUgLS4wMDU0NjE1IDI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZjQ0ZiIgc3RvcC1vcGFjaXR5PSIuOCIgb2Zmc2V0PSIuMTY3Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjYzNCIgb2Zmc2V0PSIuMjY2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iLjIxNyIgb2Zmc2V0PSIuNDg5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmY0NGYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIuNiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iOC40OTM3IiBjeT0iMjg3LjM0IiByPSIzLjY0NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOTYyIDAgLTI3Ljc1NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYyYTBlYSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzNTg0ZTQiIG9mZnNldD0iLjU1MTY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxYTVmYjQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0yODAuMDcpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguOTY4MzYgMCAwIC45NjgzNiAuMjY3ODkgOC44Njc4KSI+CiAgIDxjaXJjbGUgY3g9IjMzOS4xMyIgY3k9IjI4NS42OSIgcj0iMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgZmlsbD0iI2Q1ZDNjZiIvPgogICA8ZyBzdHJva2Utd2lkdGg9Ii4yMTE3NSI+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTFsMC4wMDE1IDAuMDEzOGMtMC45Mjc5MS0yLjMxMzQtMi41MDE1LTMuMjQ2Mi0zLjc4NjYtNS4yNzczLTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zbDAuMDAzMi02ZS0zYy0yLjA2MTQgMS4yMDctMi43NjA5IDMuNDQxNC0yLjgyNTIgNC41NTkxYTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTIgMi40NTM2IDIuNDUzNiAwIDAgMC0wLjIxMTc1LTAuMTYwNTEgMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhoLTAuMDAzODFjLTAuMzI1MzUtMC40MTEzMS0wLjMwMjQ4LTEuNzcwOC0wLjI4Mzg1LTIuMDU0N2ExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDcxMTQ5IDAuNDMzODgtMC4wODA2NzggMC41MTI0NCAwIDZlLTMgLTAuMDAxMjcxIDAuMDExOS0wLjAwMTkwNiAwLjAxOGE3LjgyMTYgNy44MjE2IDAgMCAwLTAuMTMzMTkgMS4xMzE0djAuMDQyM2E4LjIwNzQgOC4yMDc0IDAgMCAwIDE2LjI5NSAxLjM4NzhjMC4wMTM3Ni0wLjEwNTg4IDAuMDI0OTktMC4yMTA3IDAuMDM3MjctMC4zMTc2M2E4LjQzOTkgOC40Mzk5IDAgMCAwLTAuNTMyMzUtNC4xMjI2em0tOS40NTkxIDYuNDI0MmMwLjAzODMyNyAwLjAxODQgMC4wNzQzMjYgMC4wMzgzIDAuMTEzNzEgMC4wNTU5bDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1em0xLjg4LTQuOTVtNi43NjYtMS4wNDQ4di04ZS0zbDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNhKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExdjhlLTNsMC4wMDE1IDllLTNhNy40MzI2IDcuNDMyNiAwIDAgMS0wLjI1NTM4IDUuNTM5MWMtMC45NDA2MSAyLjAxODItMy4yMTc0IDQuMDg2OC02Ljc4MTIgMy45ODYzLTMuODUwNy0wLjEwOTA2LTcuMjQyLTIuOTY2NS03Ljg3Ni02LjcwOS0wLjExNTQxLTAuNTkwMTYgMC0wLjg4OTM3IDAuMDU4MDIxLTEuMzY5YTYuMTE0NiA2LjExNDYgMCAwIDAtMC4xMzE5MiAxLjEzMjV2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6IiBmaWxsPSJ1cmwoI2IpIi8+CiAgICA8cGF0aCBkPSJtMTYuMDcgMjg1Ljc1Yy0wLjM1NjU5LTAuODU4MDMtMS4wNzk5LTEuNzg0NC0xLjY0NjQtMi4wNzczYTguNTI2NSA4LjUyNjUgMCAwIDEgMC44MzExMyAyLjQ5MTF2OGUtM2wwLjAwMTUgOWUtM2E3LjQzMjYgNy40MzI2IDAgMCAxLTAuMjU1MzggNS41MzkxYy0wLjk0MDYxIDIuMDE4Mi0zLjIxNzQgNC4wODY4LTYuNzgxMiAzLjk4NjMtMy44NTA3LTAuMTA5MDYtNy4yNDItMi45NjY1LTcuODc2LTYuNzA5LTAuMTE1NDEtMC41OTAxNiAwLTAuODg5MzcgMC4wNTgwMjEtMS4zNjlhNi4xMTQ2IDYuMTE0NiAwIDAgMC0wLjEzMTkyIDEuMTMyNXYwLjA0MjNhOC4yMDc0IDguMjA3NCAwIDAgMCAxNi4yOTUgMS4zODc4YzAuMDEzNzYtMC4xMDU4OCAwLjAyNDk5LTAuMjEwNyAwLjAzNzI3LTAuMzE3NjNhOC40Mzk5IDguNDM5OSAwIDAgMC0wLjUzMjM1LTQuMTIyNnoiIGZpbGw9InVybCgjYykiLz4KICAgIDxwYXRoIGQ9Im0xMi4wODIgMjg2LjcxYzAuMDE3NzkgMC4wMTI1IDAuMDM0MyAwLjAyNSAwLjA1MTAzIDAuMDM3NWE0LjQ2OCA0LjQ2OCAwIDAgMC0wLjc2MjMyLTAuOTk0MThjLTIuNTUwOC0yLjU1MTItMC42Njg1MS01LjUzMTctMC4zNTEwOS01LjY4MzFsMC4wMDMyLTVlLTNjLTIuMDYxNCAxLjIwNy0yLjc2MDkgMy40NDE0LTIuODI1MiA0LjU1OTEgMC4wOTU3MTMtN2UtMyAwLjE5MDU4LTAuMDE0NiAwLjI4ODQxLTAuMDE0NmE0LjE0MTkgNC4xNDE5IDAgMCAxIDMuNTk2IDIuMXoiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im04LjQ5MTIgMjg3LjIyYy0wLjAxMzU1MiAwLjIwNDEzLTAuNzM0NzkgMC45MDgyMS0wLjk4Njk5IDAuOTA4MjEtMi4zMzM3IDAtMi43MTI2IDEuNDExOC0yLjcxMjYgMS40MTE4IDAuMTAzMzQgMS4xODg4IDAuOTMxNzIgMi4xNjc5IDEuOTMzMSAyLjY4NTkgMC4wNDU3MzkgMC4wMjM3IDAuMDkyMTEzIDAuMDQ1MSAwLjEzODQ5IDAuMDY2MXEwLjEyMDQ5IDAuMDUzNCAwLjI0MDk4IDAuMDk4N2EzLjY0OTYgMy42NDk2IDAgMCAwIDEuMDY3OSAwLjIwNjA0YzQuMDkwNSAwLjE5MTg1IDQuODgyOC00Ljg5MTUgMS45MzEtNi4zNjY2YTIuODMzMyAyLjgzMzMgMCAwIDEgMS45Nzg4IDAuNDgwNDcgNC4xNDE5IDQuMTQxOSAwIDAgMC0zLjU5Ni0yLjFjLTAuMDk3NDA3IDAtMC4xOTI3IDhlLTMgLTAuMjg4NDEgMC4wMTQ2YTQuMTA1MyA0LjEwNTMgMCAwIDAtMi4yNTg2IDAuODcwNTJjMC4xMjUxNSAwLjEwNTg3IDAuMjY2MzkgMC4yNDczMyAwLjU2MzkgMC41NDA2MSAwLjU1NjkxIDAuNTQ4NjUgMS45ODUyIDEuMTE3IDEuOTg4NCAxLjE4Mzd6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCBkPSJtNS41NTYzIDI4NS4yMmMwLjA2NjQ5MSAwLjA0MjMgMC4xMjEzNCAwLjA3OTIgMC4xNjk0IDAuMTEyNDRhMy44MDQ4IDMuODA0OCAwIDAgMS0wLjAyMzA4MS0yLjAwNiA2LjA3ODQgNi4wNzg0IDAgMCAwLTEuOTc1NSAxLjUyNjhjMC4wNDAwMjItMWUtMyAxLjIzMDUtMC4wMjI0IDEuODI5MSAwLjM2Njc2eiIgZmlsbD0idXJsKCNnKSIvPgogICAgPHBhdGggZD0ibTAuMzQ0NzggMjg4Ljk5YzAuNjMzMzYgMy43NDI1IDQuMDI1MiA2LjYgNy44NzYgNi43MDkgMy41NjM4IDAuMTAwNzkgNS44NDA2LTEuOTY4IDYuNzgxMi0zLjk4NjNhNy40MzI2IDcuNDMyNiAwIDAgMCAwLjI1NTM4LTUuNTM5MXYtOGUtM2MwLTZlLTMgLTAuMDAxMy0wLjAxIDAtOGUtM2wwLjAwMTUgMC4wMTM4YzAuMjkxMTYgMS45MDA5LTAuNjc1NzEgMy43NDI1LTIuMTg3MiA0Ljk4NzlsLTAuMDA0NyAwLjAxMDZjLTIuOTQ1MSAyLjM5ODUtNS43NjM1IDEuNDQ3MS02LjMzNCAxLjA1ODhxLTAuMDU5NzE1LTAuMDI4Ni0wLjExOTQzLTAuMDU5NWMtMS43MTcxLTAuODIwNzYtMi40MjY1LTIuMzg1Mi0yLjI3NDUtMy43MjY5YTIuMTA3NiAyLjEwNzYgMCAwIDEtMS45NDQxLTEuMjIyOSAzLjA5NTQgMy4wOTU0IDAgMCAxIDMuMDE3My0wLjEyMTEzIDQuMDg2OSA0LjA4NjkgMCAwIDAgMy4wODE0IDAuMTIxMTNjLTAuMDAzMTgtMC4wNjY3LTEuNDMxNS0wLjYzNTI2LTEuOTg4NC0xLjE4MzctMC4yOTc1MS0wLjI5MzI4LTAuNDM4NzUtMC40MzQ1Mi0wLjU2MzktMC41NDA2MWEyLjQ1MzYgMi40NTM2IDAgMCAwLTAuMjExNzUtMC4xNjA1MWMtMC4wNDg3MDQtMC4wMzMyLTAuMTAzNTUtMC4wNjkyLTAuMTY5NC0wLjExMjQ0LTAuNTk4NjMtMC4zODkyLTEuNzg5MS0wLjM2NzgxLTEuODI4NS0wLjM2Njc1aC0wLjAwMzgxYy0wLjMyNTIzLTAuNDEyLTAuMzAyMzYtMS43NzE1LTAuMjgzNzMtMi4wNTU0YTEuNDY3IDEuNDY3IDAgMCAwLTAuMjc0MDEgMC4xNDU0NyA1Ljk3NjggNS45NzY4IDAgMCAwLTAuODAyMTIgMC42ODcxNCA3LjE2NjggNy4xNjY4IDAgMCAwLTAuNzcwMzYgMC45MTgzOHYxZS0zIC0xZS0zYTYuOTMxMyA2LjkzMTMgMCAwIDAtMS4xMDExIDIuNDg2NmMtMC4wMDQwMjMgMC4wMTY3LTAuMjk1NjEgMS4yOTE1LTAuMTUxODMgMS45NTI2eiIgZmlsbD0idXJsKCNoKSIvPgogICAgPHBhdGggZD0ibTExLjM3MSAyODUuNzZhNC40NjggNC40NjggMCAwIDEgMC43NjIzMiAwLjk5NTI0YzAuMDQ1MSAwLjAzNDEgMC4wODcyNCAwLjA2OCAwLjEyMzAzIDAuMTAwNzkgMS44NjA3IDEuNzE1MiAwLjg4NTc3IDQuMTM5OCAwLjgxMzE0IDQuMzEyNCAxLjUxMTUtMS4yNDUzIDIuNDc3NS0zLjA4NyAyLjE4NzItNC45ODc5LTAuOTI4MzMtMi4zMTQ1LTIuNTAxOS0zLjI0NzItMy43ODctNS4yNzg0LTAuMDY1MDEtMC4xMDI3LTAuMTMwMDItMC4yMDU2MS0wLjE5MzMzLTAuMzE0MjQtMC4wMzYyMS0wLjA2Mi0wLjA2NTIyLTAuMTE3OTUtMC4wOTA0Mi0wLjE2OTRhMS40OTM1IDEuNDkzNSAwIDAgMS0wLjEyMjM5LTAuMzI1MDQgMC4wMjExNzUgMC4wMjExNzUgMCAwIDAtMC4wMTg2My0wLjAyMTIgMC4wMjkyMjIgMC4wMjkyMjIgMCAwIDAtMC4wMTU0NiAwYy0wLjAwMTEgMC0wLjAwMjggMmUtMyAtNGUtMyAyZS0zIC0wLjAwMTMgNC4yZS00IC00ZS0zIDJlLTMgLTAuMDA1OSAzZS0zIC0wLjMxNzQyIDAuMTUwNTUtMi4xOTk3IDMuMTMxIDAuMzUxNTEgNS42ODIyeiIgZmlsbD0idXJsKCNpKSIvPgogICAgPHBhdGggZD0ibTEyLjI1NSAyODYuODVjLTAuMDM1NzktMC4wMzI4LTAuMDc3OTItMC4wNjY3LTAuMTIzMDMtMC4xMDA4LTAuMDE2NzMtMC4wMTI1LTAuMDMzMjUtMC4wMjUtMC4wNTEwMy0wLjAzNzVhMi44MzMzIDIuODMzMyAwIDAgMC0xLjk3ODgtMC40ODA0N2MyLjk1MTkgMS40NzU5IDIuMTU5OSA2LjU1ODQtMS45MzEgNi4zNjY2YTMuNjQ5NiAzLjY0OTYgMCAwIDEtMS4wNjc5LTAuMjA2MDJxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM2MwLjU3MDQ3IDAuMzg5NDEgMy4zODgxIDEuMzQwOCA2LjMzNC0xLjA1ODhsMC4wMDQ3LTAuMDEwNmMwLjA3MzQ4LTAuMTcxNTIgMS4wNDg0LTIuNTk2Ny0wLjgxMzE0LTQuMzExM3oiIGZpbGw9InVybCgjaikiLz4KICAgIDxwYXRoIGQ9Im00Ljc5MTYgMjg5LjU0czAuMzc4ODMtMS40MTE4IDIuNzEyNi0xLjQxMThjMC4yNTIyIDAgMC45NzQwNy0wLjcwNDA4IDAuOTg2OTktMC45MDgyMWE0LjA4NjkgNC4wODY5IDAgMCAxLTMuMDgxNC0wLjEyMTEyIDMuMDk1NCAzLjA5NTQgMCAwIDAtMy4wMTczIDAuMTIxMTIgMi4xMDc2IDIuMTA3NiAwIDAgMCAxLjk0NDEgMS4yMjI5Yy0wLjE1MjA0IDEuMzQxOSAwLjU1NzM0IDIuOTA2MyAyLjI3NDUgMy43MjY5IDAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3NzMtMS44Mjk4LTEuNDk2OS0xLjkzMzEtMi42ODU3eiIgZmlsbD0idXJsKCNrKSIvPgogICAgPHBhdGggZD0ibTE2LjA3IDI4NS43NWMtMC4zNTY1OS0wLjg1ODAzLTEuMDc5OS0xLjc4NDQtMS42NDY0LTIuMDc3M2E4LjUyNjUgOC41MjY1IDAgMCAxIDAuODMxMTMgMi40OTExbDAuMDAxNSAwLjAxMzhjLTAuOTI3OTEtMi4zMTM0LTIuNTAxNS0zLjI0NjItMy43ODY2LTUuMjc3My0wLjA2NTAxLTAuMTAyNy0wLjEzMDAyLTAuMjA1NjEtMC4xOTMzMy0wLjMxNDI0LTAuMDM2MjEtMC4wNjItMC4wNjUyMi0wLjExNzk1LTAuMDkwNDItMC4xNjk0YTEuNDkzNSAxLjQ5MzUgMCAwIDEtMC4xMjIzOS0wLjMyNTA0IDAuMDIxMTc1IDAuMDIxMTc1IDAgMCAwLTAuMDE4NjMtMC4wMjEyIDAuMDI5MjIyIDAuMDI5MjIyIDAgMCAwLTAuMDE1NDYgMGMtMC4wMDExIDAtMC4wMDI4IDJlLTMgLTRlLTMgMmUtMyAtMC4wMDEzIDQuMmUtNCAtNGUtMyAyZS0zIC0wLjAwNTkgM2UtM2wwLjAwMzItNmUtM2MtMi4wNjE0IDEuMjA3LTIuNzYwOSAzLjQ0MTQtMi44MjUyIDQuNTU5MSAwLjA5NTcxMy03ZS0zIDAuMTkwNTgtMC4wMTQ2IDAuMjg4NDEtMC4wMTQ2YTQuMTQxOSA0LjE0MTkgMCAwIDEgMy41OTYgMi4xIDIuODMzMyAyLjgzMzMgMCAwIDAtMS45Nzg4LTAuNDgwNDdjMi45NTE5IDEuNDc1OSAyLjE1OTkgNi41NTg0LTEuOTMxIDYuMzY2NmEzLjY0OTYgMy42NDk2IDAgMCAxLTEuMDY4LTAuMjA1MDhxLTAuMTIwNDktMC4wNDUxLTAuMjQwOTgtMC4wOTg3Yy0wLjA0NjM3NC0wLjAyMTItMC4wOTI3NDgtMC4wNDIzLTAuMTM4NDktMC4wNjYxbDAuMDA1NzIgNGUtM3EtMC4wNTk3MTUtMC4wMjg2LTAuMTE5NDMtMC4wNTk1YzAuMDM4MzI3IDAuMDE4NCAwLjA3NDMyNiAwLjAzODMgMC4xMTM3MSAwLjA1NTktMS4wMDIyLTAuNTE3OTUtMS44Mjk4LTEuNDk3MS0xLjkzMzEtMi42ODU5IDAgMCAwLjM3ODgzLTEuNDExOCAyLjcxMjYtMS40MTE4IDAuMjUyMiAwIDAuOTc0MDctMC43MDQwOCAwLjk4Njk5LTAuOTA4MjEtMC4wMDMxOC0wLjA2NjctMS40MzE1LTAuNjM1MjYtMS45ODg0LTEuMTgzNy0wLjI5NzUxLTAuMjkzMjgtMC40Mzg3NS0wLjQzNDUyLTAuNTYzOS0wLjU0MDYxYTIuNDUzNiAyLjQ1MzYgMCAwIDAtMC4yMTE3NS0wLjE2MDUxIDMuODA0OCAzLjgwNDggMCAwIDEtMC4wMjMwODEtMi4wMDYgNi4wNzg0IDYuMDc4NCAwIDAgMC0xLjk3NTUgMS41MjY4aC0wLjAwMzgxYy0wLjMyNTI2LTAuNDEyNjMtMC4zMDIzOS0xLjc3MjEtMC4yODM3NS0yLjA1NmExLjQ2NyAxLjQ2NyAwIDAgMC0wLjI3NDAxIDAuMTQ1NDcgNS45NzY4IDUuOTc2OCAwIDAgMC0wLjgwMjEyIDAuNjg3MTUgNy4xNjY4IDcuMTY2OCAwIDAgMC0wLjc2NzE4IDAuOTIwNDl2MWUtMyAtMWUtM2E2LjkzMTMgNi45MzEzIDAgMCAwLTEuMTAxMSAyLjQ4NjZsLTAuMDExMDExIDAuMDU0MmMtMC4wMTU0NTggMC4wNzIyLTAuMDg0NzAyIDAuNDM4OTYtMC4wOTQ2NTQgMC41MTc3NHYwYTkuNTQ4OCA5LjU0ODggMCAwIDAtMC4xMjExMiAxLjE0NDF2MC4wNDIzYTguMjA3NCA4LjIwNzQgMCAwIDAgMTYuMjk1IDEuMzg3OGMwLjAxMzc2LTAuMTA1ODggMC4wMjQ5OS0wLjIxMDcgMC4wMzcyNy0wLjMxNzYzYTguNDM5OSA4LjQzOTkgMCAwIDAtMC41MzIzNS00LjEyMjZ6bS0wLjgxNDIgMC40MjE2IDAuMDAxNSA5ZS0zeiIgZmlsbD0idXJsKCNsKSIvPgogICA8L2c+CiAgIDxjaXJjbGUgY3g9Ii0xOS4zNDciIGN5PSIyOTQuNTMiIHI9IjAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9IiNkNWQzY2YiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"firefox,firefox,mozilla,web,internet\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"firefox.desktop\"\nLABEL oc.launch=\"Navigator.firefox\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Firefox\"\nLABEL oc.displayname=\"Firefox (alpine)\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"htm;html;xml;gif\"\nLABEL oc.legacyfileextensions=\"htm;html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Firefox\"\nENV APPBIN \"/usr/bin/firefox\"\nENV APP \"/usr/bin/firefox\"\nLABEL oc.usedefaultapplication=true\nCOPY composer/init.d/init.firefox /composer/init.d/init.firefox\nCOPY policies.json /usr/lib/firefox/distribution\nCOPY /ntlm_auth /usr/bin/ntlm_auth.desktop\nRUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.desktop\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/firefox/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/firefox/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Firefox

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Firefox.d\n
"},{"location":"applications/firefox/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Firefox.d -t Firefox .\n
"},{"location":"applications/firefox/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Firefox > Firefox.json\ndocker image save Firefox -o Firefox.tar\nctr -n k8s.io images import Firefox.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Firefox.json\n\n
"},{"location":"applications/firefoxrest/","title":"FirefoxRest","text":""},{"location":"applications/firefoxrest/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk.firefox.rest

"},{"location":"applications/firefoxrest/#use-ubuntu-package","title":"use ubuntu package","text":"

firefox winbind

"},{"location":"applications/firefoxrest/#arguments","title":"Arguments","text":"

\"--class=Rest.Firefox\"

"},{"location":"applications/firefoxrest/#display-name","title":"Display name","text":"

\"Firefox-Rest\"

"},{"location":"applications/firefoxrest/#path","title":"path","text":"

\"/usr/bin/firefox\"

"},{"location":"applications/firefoxrest/#mime-type","title":"Mime Type","text":"

\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"

"},{"location":"applications/firefoxrest/#file-extensions","title":"File extensions","text":"

\"html;xml;gif\"

"},{"location":"applications/firefoxrest/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"html;xml\"

"},{"location":"applications/firefoxrest/#pre-run-command","title":"Pre run command","text":"
\nCOPY composer/init.d/init.firefox /composer/init.d/init.firefox\n
"},{"location":"applications/flare/","title":"flare","text":""},{"location":"applications/flare/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/flare/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/flare/#ubuntu-packages","title":"Ubuntu packages","text":"
flare-game\n
"},{"location":"applications/flare/#arguments","title":"Arguments","text":"

\"--game=flare-game\"

"},{"location":"applications/flare/#path","title":"Path","text":"
/usr/games/flare\n
"},{"location":"applications/flare/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/flare/#wm_class","title":"WM_CLASS","text":"
flare.flare\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/flare/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/flare.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/flare/#json-dump","title":"JSON dump","text":"

json source file flare.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"flare-game\",\n    \"icon\": \"flare.svg\",\n    \"keyword\": \"flare-game,role,playing\",\n    \"launch\": \"flare.flare\",\n    \"name\": \"flare\",\n    \"args\": \"--game=flare-game\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    },\n    \"path\": \"/usr/games/flare\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/flare.desktop\"\n}\n
"},{"location":"applications/flare/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output flare.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/flare.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @flare.d.3.0.json\n\n
"},{"location":"applications/flare/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends flare-game && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"flare.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNzQ0LjA5NDQ4ODE5IgogICBoZWlnaHQ9IjEwNTIuMzYyMjA0NyIKICAgaWQ9InN2ZzIiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYiCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL1VzZXJzL2NsaW50YmVsbGFuZ2VyL0Rlc2t0b3AvZmxhcmUucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMTUwIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMTUwIgogICBzb2RpcG9kaTpkb2NuYW1lPSJmbGFyZV9sb2dvLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzE2MyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmM2NDE7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzE2NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmN2YwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzMTY3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMTAiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMxNjMiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMTk3IgogICAgICAgY3g9IjM4MS44ODg5MiIKICAgICAgIGN5PSI0MTcuNTIxODIiCiAgICAgICBmeD0iMzgxLjg4ODkyIgogICAgICAgZnk9IjQxNy41MjE4MiIKICAgICAgIHI9IjE2Ni45NjU1MiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA1MjY1LDAsMCwxLjU4Nzk5NjIsLTE5LjQxNzYzNywtMTM2LjQ1OTc5KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMC40OCIKICAgICBpbmtzY2FwZTpjeD0iNDk1LjM3ODAyIgogICAgIGlua3NjYXBlOmN5PSI2MjIuNjcwNjUiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6c25hcC1nbG9iYWw9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzU2IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjcxMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iNDQ1IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIj4KICAgIDxpbmtzY2FwZTpncmlkCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBpZD0iZ3JpZDIzODUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzMTk3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDM1OS4xNzIxNiwyMzIuODMzOTcgQyAzNTkuMTcyMTYsMjMyLjgzMzk3IDM3Ny42ODAyMiwzMTQuNTg3MzkgMzcyLjkyNjkzLDM0Mi4xNTczNyBDIDM2OC4yNTIxNCwzNjkuMjcxOTkgMzUzLjM3NzgsNDAzLjUxNzI3IDMyNy40MzUzOCw0MTQuMDA0MjggQyAzMTkuMzUyNDQsNDE3LjI3MTc0IDI5NC40ODQ5Niw0MDAuNjk5ODEgMjg1LjQzMDM0LDM5MC4zNzMxIEMgMjc2LjM3NTczLDM4MC4wNDYzOSAyNzAuMTQ0ODQsMzUxLjA0NzQ0IDI3MC4xNDQ4NCwzNTEuMDQ3NDQgQyAyNzAuMTQ0ODQsMzUxLjA0NzQ0IDI2NC4zNTQwMiwzNzYuMzM5NTIgMjY3LjAxODYzLDQwMC43NDAyNyBDIDI2OS42ODMyMyw0MjUuMTQxMDIgMjgwLjgyNTMxLDQ2MC44OTMxMiAyNzkuOTc0NTUsNDc5LjYzNTU1IEMgMjc5LjA1NDU5LDQ5OS45MDIxNSAyNjUuMjE1MTYsNTIyLjExOTk1IDI2NS4yMTUxNiw1MjIuMTE5OTUgQyAyNjUuMjE1MTYsNTIyLjExOTk1IDI1Ni43MTY5OCw0OTguNDU1NzMgMjQ4LjM3MTY5LDQ4Mi42NjIxMiBDIDI0MC4wMjY0LDQ2Ni44Njg1MSAyMTcuOTcxMTUsNDQ1LjU2MDU0IDIxNy45NzExNSw0NDUuNTYwNTQgQyAyMTcuOTcxMTUsNDQ1LjU2MDU0IDIyOS40MTg0Niw0NzEuNjg3MzMgMjI5LjgzOTU0LDQ5Ni4xMDg5OSBDIDIzMC4yNjA2Miw1MjAuNTMwNjUgMTg2LjI0NDM0LDU3Mi4xNzYyNCAyMzEuMDMyNTUsNjM5LjMxMzkxIEMgMjc2LjMwNzE5LDcwNy4xODA3NiAzNDQuMDgxMTQsNjk5LjI2ODQzIDM0NC4wODExNCw2OTkuMjY4NDMgTCAzNjAuNTY5MDMsNjkzLjIwNTkzIEwgMjk3LjI5NjM4LDY2Mi4yMDU5MyBMIDM3OC45Mzg1LDYyMi4yMDU5MyBMIDI5Ny4yOTYzOCw1ODIuMjA1OTMgTCAzNzguOTM4NSw1NDIuMjA1OTMgTCA0NjAuNTgwNjIsNTgyLjIwNTkzIEwgNTMxLjY2NjY3LDU0Ny4zNjIxOCBMIDUyOS42ODk0LDUzNi4wODA5MyBMIDQ2MC41ODA2Miw1MDIuMjA1OTMgTCA1MjAuNzU5NzksNDcyLjczNzE4IEwgNTE4LjMzNjA0LDQ1Mi45MjQ2OCBMIDUwOC4zODU5MSwzNzkuNzY4NDMgQyA1MDguMzg1OTEsMzc5Ljc2ODQzIDQ5Ni45MzY2MSw0MDQuMTI0OTggNDg0LjI1NDgyLDQxMi42Nzk0MSBDIDQ3NS45MDg1Nyw0MTguMzA5MzEgNDU1LjM0ODg1LDQyMC4zMjMxNiA0NTUuMzQ4ODUsNDIwLjMyMzE2IEMgNDU1LjM0ODg1LDQyMC4zMjMxNiA0NDQuMDkyOTcsMzYwLjI5MTYzIDQzMi4yNDUwOSwzMjkuMDU3NSBDIDQxMS4wOTE2NCwyNzMuMjkxNCAzNTkuMTcyMTYsMjMyLjgzMzk3IDM1OS4xNzIxNiwyMzIuODMzOTcgeiBNIDQ2MC41ODA2Miw1ODIuMjA1OTMgTCAzNzguOTM4NSw2MjIuMjA1OTMgTCA0NTMuODgzNDIsNjU4LjkyNDY4IEwgNDgzLjQ3ODY4LDY0OC4wNDk2OCBMIDUxNi42MTM5LDYwOS42NzQ2OCBMIDQ2MC41ODA2Miw1ODIuMjA1OTMgeiIKICAgICAgIGlkPSJwYXRoMjM4MyIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3NzemN6c2N6Y3p6Y2NjY2NjY2NjY2NjY3Njc2NjY2NjY2MiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"flare,flare-game,role,playing\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"flare.desktop\"\nLABEL oc.launch=\"flare.flare\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--game=flare-game\"\nLABEL oc.name=\"flare\"\nLABEL oc.displayname=\"flare\"\nLABEL oc.path=\"/usr/games/flare\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"flare\"\nENV APPBIN \"/usr/games/flare\"\nLABEL oc.args=\"--game=flare-game\"\nENV APP \"/usr/games/flare\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/flare/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/flare/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application flare

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/flare.d\n
"},{"location":"applications/flare/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f flare.d -t flare .\n
"},{"location":"applications/flare/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect flare > flare.json\ndocker image save flare -o flare.tar\nctr -n k8s.io images import flare.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @flare.json\n\n
"},{"location":"applications/frozen-bubble/","title":"frozen-bubble","text":""},{"location":"applications/frozen-bubble/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/frozen-bubble/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/frozen-bubble/#ubuntu-packages","title":"Ubuntu packages","text":"
frozen-bubble\n
"},{"location":"applications/frozen-bubble/#displayname","title":"Displayname","text":"
frozen-bubble\n
"},{"location":"applications/frozen-bubble/#path","title":"Path","text":"
/usr/games/frozen-bubble\n
"},{"location":"applications/frozen-bubble/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/frozen-bubble/#wm_class","title":"WM_CLASS","text":"
perl.perl\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/frozen-bubble/#json-dump","title":"JSON dump","text":"

json source file frozen-bubble.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"frozen-bubble\",\n    \"icon\": \"frozen-bubble.svg\",\n    \"keyword\": \"frozen,bubble\",\n    \"launch\": \"perl.perl\",\n    \"name\": \"frozen-bubble\",\n    \"displayname\": \"frozen-bubble\",\n    \"path\": \"/usr/games/frozen-bubble\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/frozen-bubble/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output frozen-bubble.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/frozen-bubble.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @frozen-bubble.d.3.0.json\n\n
"},{"location":"applications/frozen-bubble/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends frozen-bubble && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"frozen-bubble.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZlcnNpb249IjEiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDQ2NDgiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojN2QzMjlhIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FjNWNjZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NDY1MiIgeDE9IjMwLjU3NyIgeDI9IjQ1IiB5MT0iMTkuMTI5IiB5Mj0iMjcuNDU2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNzA1ODgyMzcsMCwwLDAuNjY2NjY2NywtMC43NjQ3MDU1MSwtNWUtNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0NjQ4Ii8+CiA8L2RlZnM+CiA8cGF0aCBzdHlsZT0ib3BhY2l0eTowLjIiIGQ9Ik0gMTEuNzk5OTU3LDE2LjQ0NjA2IEMgMTAuMzc3MTY1LDIwLjg0NjE2MiA3LjY1ODQ0ODMsMjUuNzI3NjI5IDIsMjQuOTA5NDkyIDIuMzc0MTYxOCwyMS4yMjkyMjQgMy45MDIwMDg0LDE3LjUyMzc5OSA2LjA2MDI1NTEsMTQuNTUwNTAxIDYuNTE1MjE3NSwxMy45MjM3MjggNy40NTM5NzIyLDEzLjY0NTg1NCA3Ljg0MjI4MTUsMTMuMTAwMDUyIFoiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0iTSAxNC4wMTg4MDUsMy4wMDAwMDA1IEMgMTAuNjU2ODE2LDMuMDQ5NTYyNSAzLjkyNTEyMjcsOC41Mzc4ODYzIDMuMDkwNjc2LDE1LjEzNzgzOCBjIC0wLjI0MDI4NzUsMS45MDA1MjQgMC4wMDYzNiwzLjkyNDEwNCAwLjYyODcwNzQsNS44MTQ2MjIgMC4zNDM5NDI2LDUuOTMyODk0IDguMTM0NTY5Niw5LjcyMzE2MiAxMy4wMDAyMjU2LDEwLjA0NDY4MyA1Ljk1MjYzOCwwLjE0MDI0OCAxMS41MTIxNDQsLTQuOTI0MjUxIDEyLjYwNDY4MiwtNi4yODM1NjYgMS45OTgxLC0yLjk1NTA1MyAtMC44Mjk5OTcsLTkuMzI1MTIxIC0zLjM1MzEwNiwtMTMuMDM0NzA4IC0yLjc2ODkwMSwtNC4wNzA5NjU3IC03LjkzMDU2LC03LjAzNTIwNzUgLTExLjk1MjM4LC04LjY3ODg2ODUgeiIvPgogPHBhdGggc3R5bGU9ImZpbGw6IzY1MzU3OCIgZD0iTSAxMS43OTk5NTcsMTUuNDQ2MDYgQyAxMC4zNzcxNjUsMTkuODQ2MTYyIDcuNjU4NDQ4MywyNC43Mjc2MjkgMiwyMy45MDk0OTIgMi4zNzQxNjE4LDIwLjIyOTIyNCAzLjkwMjAwODQsMTYuNTIzNzk5IDYuMDYwMjU1MSwxMy41NTA1MDEgNi41MTUyMTc1LDEyLjkyMzcyOCA3LjQ1Mzk3MjIsMTIuNjQ1ODU0IDcuODQyMjgxNSwxMi4xMDAwNTIgWiIvPgogPHBhdGggc3R5bGU9ImZpbGw6IzdkMzI5YSIgZD0iTSAxNC4wMTg4MDUsMiBDIDEwLjY1NjgxNiwyLjA0OTU2MiAzLjkyNTEyMjcsNy41Mzc4ODU4IDMuMDkwNjc2LDE0LjEzNzgzOCBjIC0wLjI0MDI4NzUsMS45MDA1MjQgMC4wMDYzNiwzLjkyNDEwNCAwLjYyODcwNzQsNS44MTQ2MjIgMC4zNDM5NDI2LDUuOTMyODk0IDguMTM0NTY5Niw5LjcyMzE2MiAxMy4wMDAyMjU2LDEwLjA0NDY4MyA1Ljk1MjYzOCwwLjE0MDI0OCAxMS41MTIxNDQsLTQuOTI0MjUxIDEyLjYwNDY4MiwtNi4yODM1NjYgMS45OTgxLC0yLjk1NTA1MyAtMC44Mjk5OTcsLTkuMzI1MTIxIC0zLjM1MzEwNiwtMTMuMDM0NzA4IEMgMjMuMjAyMjg0LDYuNjA3OTAyOCAxOC4wNDA2MjUsMy42NDM2NjEgMTQuMDE4ODA1LDIgWiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4xO2ZpbGw6I2ZmZmZmZiIgZD0iTSAxNC4wMTk1MzEgMiBDIDEwLjY1NzU0MiAyLjA0OTU2MiAzLjkyNDI5MDQgNy41Mzg3MTk3IDMuMDg5ODQzOCAxNC4xMzg2NzIgQyAzLjAwODE3NTIgMTQuNzg0NjE5IDMuMDAyODMzOSAxNS40NDUwNTQgMy4wMjkyOTY5IDE2LjEwOTM3NSBDIDMuMDQyNjk1NyAxNS43ODQwOTIgMy4wNDk0NDMzIDE1LjQ1ODIxNCAzLjA4OTg0MzggMTUuMTM4NjcyIEMgMy45MjQyOTA0IDguNTM4NzIwMiAxMC42NTc1NDIgMy4wNDk1NjIgMTQuMDE5NTMxIDMgQyAxOC4wNDEzNTEgNC42NDM2NjEgMjMuMjAxODAyIDcuNjA4NzIxOCAyNS45NzA3MDMgMTEuNjc5Njg4IEMgMjcuODAyNzQyIDE0LjM3MzIzMiAyOS43ODcyNTQgMTguNDYzNjUgMjkuOTc2NTYyIDIxLjYzNjcxOSBDIDMwLjIyNjc3OSAxOC4zNzE3MzkgMjguMDAxNzUzIDEzLjY2NTgyNyAyNS45NzA3MDMgMTAuNjc5Njg4IEMgMjMuMjAxODAyIDYuNjA4NzIxMyAxOC4wNDEzNTEgMy42NDM2NjEgMTQuMDE5NTMxIDIgeiIvPgogPGVsbGlwc2Ugc3R5bGU9ImZpbGw6I2ZjZjhmZCIgY3g9Ii05LjAyMiIgY3k9IjIxLjU2NSIgcng9IjQuNzk0IiByeT0iNi4xMjUiIHRyYW5zZm9ybT0ibWF0cml4KDAuNjc4MTYyNDUsLTAuNzM0OTEyMDMsMC43MjQyNjM0OSwwLjY4OTUyMzMxLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0ibSAyMi4zNzQxNCwxMSBjIDQuNDM3MDk2LDEuNDUxODM1IDkuMzU5NjA3LDQuMjI2MDQ4IDguNTM0NTkxLDEwIEMgMjcuMTk3NTIyLDIwLjYxODIgMjMuNDYwOTQyLDE5LjA1OTE2NSAyMC40NjI2NDQsMTYuODU2ODY0IDE5LjgzMDYsMTYuMzkyNjE2IDE5LjU1MDM5MSwxNS40MzQ2OTcgMTksMTUuMDM4NDYxIFoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NjUyKSIgZD0ibSAyMi4zNzQxNCwxMCBjIDQuNDM3MDk2LDEuNDUxODM1IDkuMzU5NjA3LDQuMjI2MDQ4IDguNTM0NTkxLDEwIEMgMjcuMTk3NTIyLDE5LjYxODIgMjMuNDYwOTQyLDE4LjA1OTE2NSAyMC40NjI2NDQsMTUuODU2ODY0IDE5LjgzMDYsMTUuMzkyNjE2IDE5LjU1MDM5MSwxNC40MzQ2OTcgMTksMTQuMDM4NDYxIFoiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMiIgZD0iTSAxMiwxNiBDIDEyLjY5NDgxMywxOS4wMTY4MTEgNi43MDI3NjcsMjIuMTI4MDAzIDMuNjk2NTI3OCwyMC45MTk4MTEgMi4yNDk1NDMzLDIwLjMzODI3NSAyLjAwMjk2NjQsMTguMTI0MTgyIDIuMDYzOTI2MywxNi4zOTE5NyAyLjEyNTM3NDMsMTQuODU3NjUgMS45NzE0NjEzLDE0LjM5MDQ3MSAzLjUwNzQ4NDIsMTQuMjQ0MDUyIDYuNDE2NTMxOSwxMy45NzQ1NDkgMTEuNjk0Njg3LDE0LjY3NDM0NyAxMiwxNiBaIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZjMTAyIiBkPSJtIDExLjk0NDQxNCwxNC44MTMxMzcgYyAwLjY5NDgxMywzLjAxNjgxMSAtNS4yOTcyMzMsNi4xMjgwMDMgLTguMzAzNDcyMiw0LjkxOTgxMSAtMS40NDY5ODQ1LC0wLjU4MTUzNiAtMS42OTM1NjE0LC0yLjc5NTYyOSAtMS42MzI2MDE1LC00LjUyNzg0MSAwLjA2MTQ0OCwtMS41MzQzMiAtMC4wOTI0NjUsLTIuMDAxNDk5IDEuNDQzNTU3OSwtMi4xNDc5MTggMi45MDkwNDc3LC0wLjI2OTUwMyA4LjE4NzIwMjgsMC40MzAyOTUgOC40OTI1MTU4LDEuNzU1OTQ4IHoiLz4KIDxjaXJjbGUgc3R5bGU9Im9wYWNpdHk6MC4yIiBjeD0iLTQiIGN5PSIxMiIgcj0iMyIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0ib3BhY2l0eTowLjIiIGN4PSItMTAuNSIgY3k9IjExLjUiIHI9IjQuNSIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iLTQiIGN5PSIxMSIgcj0iMyIgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIvPgogPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iLTEwLjUiIGN5PSIxMC41IiByPSI0LjUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KIDxjaXJjbGUgc3R5bGU9ImZpbGw6IzNmM2YzZiIgY3g9Ii05IiBjeT0iMTEiIHI9IjIiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KIDxjaXJjbGUgc3R5bGU9ImZpbGw6IzNmM2YzZiIgY3g9Ii0zLjUiIGN5PSIxMS41IiByPSIxLjUiIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiLz4KPC9zdmc+Cgo=\"\nLABEL oc.keyword=\"frozen-bubble,frozen,bubble\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"perl.perl\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"frozen-bubble\"\nLABEL oc.displayname=\"frozen-bubble\"\nLABEL oc.path=\"/usr/games/frozen-bubble\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"frozen-bubble\"\nENV APPBIN \"/usr/games/frozen-bubble\"\nENV APP \"/usr/games/frozen-bubble\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/frozen-bubble/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/frozen-bubble/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application frozen-bubble

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/frozen-bubble.d\n
"},{"location":"applications/frozen-bubble/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f frozen-bubble.d -t frozen-bubble .\n
"},{"location":"applications/frozen-bubble/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect frozen-bubble > frozen-bubble.json\ndocker image save frozen-bubble -o frozen-bubble.tar\nctr -n k8s.io images import frozen-bubble.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @frozen-bubble.json\n\n
"},{"location":"applications/gcompris/","title":"GCompris","text":""},{"location":"applications/gcompris/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.20.04

"},{"location":"applications/gcompris/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/gcompris/#ubuntu-packages","title":"Ubuntu packages","text":"
qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt\n
"},{"location":"applications/gcompris/#path","title":"Path","text":"
/usr/games/gcompris-qt\n
"},{"location":"applications/gcompris/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/gcompris/#wm_class","title":"WM_CLASS","text":"
gcompris-qt.gcompris-qt\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/gcompris/#json-dump","title":"JSON dump","text":"

json source file gcompris.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt\",\n    \"icon\": \"gcompris.svg\",\n    \"installrecommends\": true,\n    \"keyword\": \"gcompris\",\n    \"launch\": \"gcompris-qt.gcompris-qt\",\n    \"name\": \"GCompris\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/games/gcompris-qt\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.20.04\"\n}\n
"},{"location":"applications/gcompris/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output gcompris.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gcompris.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gcompris.d.3.0.json\n\n
"},{"location":"applications/gcompris/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.20.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y qt5-default qml-module-qtquick-controls libqt5svg5 libqt5xmlpatterns5 libqt5sensors5 qml-module-qtquick-particles2 qml-module-qtmultimedia libqt5multimedia5-plugins gcompris-qt && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gcompris.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjY0IgogICBoZWlnaHQ9IjY0IgogICB2aWV3Qm94PSIwIDAgNjQgNjQiCiAgIGlkPSJzdmc0MjUwIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJnY29tcHJpcy1pY29uLnN2ZyIKICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSIvaG9tZS90aW1vL2Rlc3Npbi9HQ29tcHJpei9nY29tcHJpcy1pY29uMDctMjU2LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjM2MCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjM2MCI+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2I4YjhiOCIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI4IgogICAgIGlua3NjYXBlOmN4PSIxNS45ODA2NzYiCiAgICAgaW5rc2NhcGU6Y3k9IjU1Ljk0NzE3MiIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIKICAgICB1bml0cz0icHgiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxODc4IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwNTEiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBzaG93Z3VpZGVzPSJmYWxzZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgZW1wc3BhY2luZz0iNCIKICAgICAgIGlkPSJncmlkNTU3MyIKICAgICAgIHR5cGU9Inh5Z3JpZCIgLz4KICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDI1MiI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDkxMzgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjI1MTIwNzc0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wOTE0MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A5MTQyIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50ODk4OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzJhNDM7c3RvcC1vcGFjaXR5OjAuNTAxOTYwODEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A4OTkwIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTMzZTZiO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wODk5MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQyNDMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDQyNDUiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2NmNWUxOTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A0MjQ3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlNzc5MzY7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iNTYzLjQ1MjM5IgogICAgICAgeDI9IjQ0OC4xNTc4NyIKICAgICAgIHkxPSI2MTUuMTU5NTUiCiAgICAgICB4MT0iNDQ4LjE1Nzg3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDI0OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQyNDMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMDY5MDI4NDUsMC4yOTc3MzEwMSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDg5ODgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ4OTk0IgogICAgICAgeDE9IjQ1LjI4OTA1MSIKICAgICAgIHkxPSI5NS43NDU4NTciCiAgICAgICB4Mj0iNDUuMjg5MDUxIgogICAgICAgeTI9IjQ4Ljc2ODk0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzY5ODYyNDYsMCwwLDAuMzY5ODYyNDYsNDUyLjEzMzksNTc3LjM2MSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDkxMzgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ5MTQ0IgogICAgICAgeDE9IjMzLjAxMDQ0OCIKICAgICAgIHkxPSI2My42NDM2MTYiCiAgICAgICB4Mj0iMzMuMDEwNDQ4IgogICAgICAgeTI9IjEuNDE4MjE4OSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg0MTkuNzQzNzEsNTUzLjAzMTcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5MTM4IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50OTE2NyIKICAgICAgIHgxPSI0NTEuMDc0NTgiCiAgICAgICB5MT0iNjE0LjQxNTEiCiAgICAgICB4Mj0iNDUxLjA3NDU4IgogICAgICAgeTI9IjU1NS4yODMzMyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMC45NTg3NTg3OSwtMy45MjI5ODM4ZS00KSIgLz4KICA8L2RlZnM+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDI1NSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGUgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyMC43MDI0NywtNTUzLjAzMjA5KSIKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhbHF1ZSAxIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjEwNTU2OTIxLDEuMjUwMzA1NWUtNCwtMS4yNTA2NzJlLTQsMC4xMDU1MzgyOCw0MTkuMTY0NzMsNTc3LjEwNTcyKSIKICAgICAgIGlkPSJnMzY5Mi0xLTAtMC03LTQtMyIKICAgICAgIHN0eWxlPSJzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjQuMzg2NjkzO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0iZzU0NTMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjQ1NTkyNDI4LDAsMCwwLjQ1NTkyNDMzLDIzNS4yNDEzOSwzODAuOTgyNzQpIj4KICAgICAgPGcKICAgICAgICAgaW5rc2NhcGU6bGFiZWw9ImJhbGwiCiAgICAgICAgIGlkPSJsYXllcjMtMiIKICAgICAgICAgc3R5bGU9InN0cm9rZTpub25lO3N0cm9rZS13aWR0aDo0LjM4NjY5MztzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KICAgIDwvZz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMTg5NjEtMS05IgogICAgICAgZD0ibSA0NzQuMzU4OTQsNTg2Ljc3Nzc5IGMgLTAuNTU2ODEsLTAuMDE4NSAtMy4wOTgyNiwwLjAxMjIgLTMuNjE1MjMsMC4wMzMyIGwgLTAuNSwyNi4yNDgwNCBjIDEuNTY4MDgsLTAuMjc4OTQgNS42Mjk4MSwtMC44Mjg3NyA3LjE3NzczLC0xLjEyMzA0IDIuNjQ5MDQsLTEuMDc4ODYgMi44NjgzMywtNC4zOTk2MyA0LjQwNjI1LC02LjQ1NzAzIDEuMTM5MjMsLTIuMzcyNzcgMi41ODk3NywtNC44ODQxNiAyLjczNjMzLC03LjQ5NDE0IC0xLjkxNTAyLC0zLjkzOTAzIC00Ljk2MTk2LC03LjIxMTQzIC03LjgwNDY5LC0xMC40NzY1NyAtMC42OTEwMSwtMC41MjU2NSAtMS41NDYxMSwtMC42OTUzNyAtMi40MDAzOSwtMC43MzA0NyB6IgogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNDE4Mi0zIgogICAgICAgZD0ibSA0MjguNjgyMzEsNTU3LjMzODc1IGMgLTEyLjA2NDcsMTMuMDIwMzggLTkuODk0MjgsMzUuNjczMTggNC4zNTU0Nyw0Ni4yMTI4OSAxMi4xODUzNyw5Ljk5OTkxIDMxLjQwMjIzLDguNjc2OTMgNDIuNDA4MiwtMi40OTYxIC0zLjMyODAxLC0zLjI3Mjk3IC02LjMzNTg5LC0yLjUzNzMzIC0xMC4yNSwyLjY4OTQ2IC0xMi4yNTA2Niw4LjY1Mjc5IC0zNS4xNzk3MSwtNC44MzcyOSAtMzguNTk1NywtMTkuMTA1NDcgLTIuMzQwNzMsLTcuODk4MDUgMC4xMzU1NiwtMTYuNzM3NzQgNS43ODcxMSwtMjIuNjQyNTggLTIuMzI1MDYsLTAuNDQ2ODMgLTEuMjQwMzUsLTUuNjQ3MTkgLTMuNzA1MDgsLTQuNjU4MiB6IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InJlY3Q1Mjk3LTUiCiAgICAgICBkPSJtIDQ1MC45NTQ1OSw2MDcuNTM2NjcgYyAtNi4zNTc0OCwwLjYyOTgxIC0xNC44OTYzNywwLjA5ODcgLTE5LjAyMTk0LDUuNjIyOTggLTIuNjg4NzksNS4wOTg2OCA0LjEyOTcsMy4zNDAyNyA3LjU2NTI3LDMuNTQ5MTQgMTEuNTU4OTMsMCAyMy4xMTc4OCwwIDM0LjY3NjgxLDAgMC43MTc5MSwtNy4xNTgxMSAtOC42NDY4MiwtOC4yMDc4MSAtMTQuMTQyMTksLTguODQ0NDggLTMuMDE0MDksLTAuMjk5MjYgLTYuMDQ4NywtMC4zOTE0NCAtOS4wNzc5NSwtMC4zMjc2NCB6IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxyZWN0CiAgICAgICByeD0iMS42NDczOTMyZS0wNyIKICAgICAgIHk9IjYwNy4zOTM3NCIKICAgICAgIHg9IjQ1MC44NDQ3IgogICAgICAgaGVpZ2h0PSI0Ljg0MDIwNjYiCiAgICAgICB3aWR0aD0iMy44NzIxNjUyIgogICAgICAgaWQ9InJlY3Q1MzAwIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNlNzc5MzY7ZmlsbC1vcGFjaXR5OjAuOTcyNTQ5MDI7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxlbGxpcHNlCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGlkPSJwYXRoNDg0OC02IgogICAgICAgY3g9IjQ1Mi42NTE3MyIKICAgICAgIGN5PSI1NzguMzUyNTQiCiAgICAgICByeD0iMjMuMTExOTE3IgogICAgICAgcnk9IjIzLjExMTkyMSIgLz4KICAgIDxyZWN0CiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjcwNzEwNjc4LC0wLjcwNzEwNjc4LDAuNzA3MTA2NzgsMC43MDcxMDY3OCwwLDApIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGlkPSJyZWN0NDE4MC0zLTciCiAgICAgICB3aWR0aD0iNy42Mzg5Njg1IgogICAgICAgaGVpZ2h0PSI2NC40OTQ1OTgiCiAgICAgICB4PSItOTIuOTY4NTc1IgogICAgICAgeT0iNjk3LjA0ODIyIgogICAgICAgcng9IjMuMjQ5OTY5OWUtMDciCiAgICAgICByeT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50OTE0NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0ibSA0MzIuNTUwMzUsNTUzLjIyNTA2IC01LjQwMjM0LDUuNDAwMzkgMC4yMzQzOCwwLjIzNDM4IGMgLTEwLjU3NTgxLDEzLjE5OTAyIC04LjA1NDc0LDM0LjU1MDE4IDUuNjU2MjUsNDQuNjkxNCAyLjU2MTY0LDIuMTAyMjIgNS40MzUwMiwzLjY5OTM2IDguNDc2NTYsNC44MTQ0NSAtMy43OTEzNSwwLjU4MzQ4IC03LjMzOTUxLDEuNzkyMTEgLTkuNTgyMDMsNC43OTQ5MyAtMi42ODg3OSw1LjA5ODY3IDQuMTI4ODgsMy4zMzk5NiA3LjU2NDQ1LDMuNTQ4ODIgbCAzNC42Nzc3MywwIGMgMC4xNjg3MSwtMS42ODIxNSAtMC4yMjQ0MywtMy4wMjQwNyAtMC45ODgyOCwtNC4xMDU0NiAxLjYzNjU5LC0wLjI0MzY3IDMuMzE5OTgsLTAuNDk0MTQgNC4yMzQzOCwtMC42Njc5NyAyLjY0OTA0LC0xLjA3ODg2IDIuODY4MzMsLTQuMzk5NjIgNC40MDYyNSwtNi40NTcwMyAxLjEzOTIzLC0yLjM3Mjc2IDIuNTg5NzcsLTQuODg0MTUgMi43MzYzMywtNy40OTQxNCAtMS45MTUwMiwtMy45MzkwMyAtNC45NjE5NiwtNy4yMTE0MyAtNy44MDQ2OSwtMTAuNDc2NTcgLTAuNjkxMDEsLTAuNTI1NjUgLTEuNTQ2MTEsLTAuNjk1MzYgLTIuNDAwMzksLTAuNzMwNDcgLTAuMDMyNSwtMTBlLTQgLTAuMTY1NzMsMC4wMDMgLTAuMjEwOTQsMC4wMDIgMS4wNTk3OCwtMi42ODM3OSAxLjYwNzYzLC01LjU0MjMgMS42MTUyMywtOC40Mjc3NCAtMy4zZS00LC0xMi43NjM5IC0xMC4zNDc0MiwtMjMuMTExIC0yMy4xMTEzMiwtMjMuMTExMzMgLTQuODk3NDYsMC4wMSAtOS42NjUxMywxLjU3NTU2IC0xMy42MTUyNCw0LjQ3MDcxIGwgLTYuNDg2MzMsLTYuNDg2MzMgeiBtIC0xLjA0Njg3LDkuNzU1ODYgMi4xNzk2OSwyLjE3OTY5IGMgLTIuNjk0NiwzLjg3MTM5IC00LjE0MDE3LDguNDc0NTYgLTQuMTQyNTgsMTMuMTkxNCAtNy41ZS00LDEyLjc2NDY2IDEwLjM0NjY3LDIzLjExMjk2IDIzLjExMTMzLDIzLjExMzI4IDQuNzEzODQsLTAuMDEgOS4zMTE5OCwtMS40NjA3MiAxMy4xNzc3MywtNC4xNTgyIGwgMi44MjYxNywyLjgyNjE3IGMgLTEuMDg5MDIsMC43NzA0NyAtMi4yMjkwNCwxLjk2ODkxIC0zLjQ1ODk4LDMuNjExMzMgLTEyLjI1MDY2LDguNjUyOCAtMzUuMTc5NzEsLTQuODM3MjkgLTM4LjU5NTcsLTE5LjEwNTQ3IC0yLjIxNDM4LC03LjQ3MTcyIC0wLjExNTMyLC0xNS43ODMwNiA0LjkwMjM0LC0yMS42NTgyIHogbSAzOC44OTA2Miw0Mi4xNjYwMSAtMC4wOTc2LDUuMTAzNTIgYyAtMS45MDUwNCwtMC45NzIxNiAtNC4yNDQwNiwtMS41MTM0NyAtNi40ODQzOCwtMS44NzUgMi4zMDY4NSwtMC44MTk1NCA0LjUyMDM0LC0xLjg5NzM3IDYuNTgyMDMsLTMuMjI4NTIgeiIKICAgICAgIGlkPSJwYXRoMTg5NjEtMS05LTMiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNDE4MiIKICAgICAgIGQ9Im0gNDMwLjIwMTk4LDU1OC42NCBjIC00Ljc3NzU5LDUuNDU3IC03LjQxNzE3LDEyLjQ1OTYzIC03LjQzMDQ4LDE5LjcxMjUgMCwxNi41NzM2NiAxMy40MzU2MSwzMC4wMDkyNyAzMC4wMDkyOCwzMC4wMDkyNyA3LjI1NTI5LC0wLjAwOCAxNC4yNjIyNCwtMi42NDMwOSAxOS43MjM4NCwtNy40MTkxMyBsIC0zLjUyMjM3LC0zLjUyMjM3IGMgLTQuNTIwOCwzLjg1MSAtMTAuMjYyOCw1Ljk3MDUgLTE2LjIwMTQ3LDUuOTgwMjkgLTEzLjgzMzY2LDAgLTI1LjA0ODA4LC0xMS4yMTQzOSAtMjUuMDQ4MDgsLTI1LjA0ODA2IDEwZS00LC01Ljk0MTk2IDIuMTE2MjYsLTExLjY4OTcxIDUuOTY1MTksLTE2LjIxNjU5IHoiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHJlY3QKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNzA3MTA2NzgsLTAuNzA3MTA2NzgsMC43MDcxMDY3OCwwLjcwNzEwNjc4LDAsMCkiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgaWQ9InJlY3Q0MTgwLTMiCiAgICAgICB3aWR0aD0iNC43Mjc4MDEzIgogICAgICAgaGVpZ2h0PSI2MC43NDQ1OTUiCiAgICAgICB4PSItOTEuMjQ3Nzk1IgogICAgICAgeT0iNjk4LjY1ODA4IgogICAgICAgcng9IjIuMDExNDI1ZS0wNyIKICAgICAgIHJ5PSIwIiAvPgogICAgPGVsbGlwc2UKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2NsaXAtcnVsZTpub256ZXJvO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7Y29sb3ItaW50ZXJwb2xhdGlvbjpzUkdCO2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVyczpsaW5lYXJSR0I7c29saWQtY29sb3I6IzAwMDAwMDtzb2xpZC1vcGFjaXR5OjE7ZmlsbDojZTc3OTM1O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxOC45NDc2Nzk1MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgaWQ9InBhdGg0ODQ4IgogICAgICAgY3g9IjQ1Mi42NTE3MyIKICAgICAgIGN5PSI1NzguMzUyNTQiCiAgICAgICByeD0iMjEuMjM2OTE3IgogICAgICAgcnk9IjIxLjIzNjkyMSIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY3NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJyZWN0NTI5NyIKICAgICAgIGQ9Im0gNDcyLjE0MTYxLDYxNS4wNzQxNSAtMTkuMzYwODIsMCAtMTkuMzYwODIsMCBjIDAsLTMuODcyMTcgOS42ODA0MSwtNS44MDgyNSAxOS4zNjA4MiwtNS44MDgyNSA5LjY4MDQxLDAgMTkuMzYwODIsMS45MzYwOCAxOS4zNjA4Miw1LjgwODI1IHoiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6I2U3NzkzNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2NsaXAtcnVsZTpub256ZXJvO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7Y29sb3ItaW50ZXJwb2xhdGlvbjpzUkdCO2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVyczpsaW5lYXJSR0I7c29saWQtY29sb3I6IzAwMDAwMDtzb2xpZC1vcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDI0OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGQ9Im0gNDMyLjg0NzIzLDU1NS4yMDU1MyAtMy4zNDM3NSwzLjM0MTc5IDAuNDIxODcsMC40MjE4OCBjIC00LjU5OTM2LDUuNDA4MzIgLTcuMTQxMjUsMTIuMjczOTIgLTcuMTU0MywxOS4zODI4MSAwLDE1LjkyMjk0IDEyLjQwMzI3LDI4Ljk0MzA1IDI4LjA3NDIyLDI5Ljk0MTQxIGwgMCwxLjAyMTQ4IGMgLTguOTkxMzIsMC4yNDIwNCAtMTcuNDI1NzgsMi4xNDcwMiAtMTcuNDI1NzgsNS43NTk3NyBsIDE5LjM2MTMzLDAgMTkuMzYxMzMsMCBjIDAsLTMuNjEyNzUgLTguNDM0NDYsLTUuNTE3NzMgLTE3LjQyNTc4LC01Ljc1OTc3IGwgMCwtMS4wMjUzOSBjIDYuNDE0OTksLTAuNDIxNTcgMTIuNTM5MTIsLTIuODkxMTcgMTcuNDU4OTgsLTcuMDcwMzEgbCAwLjI4MTI1LDAuMjgxMjUgMy4zNDM3NSwtMy4zNDM3NSAtNi41NjgzNiwtNi41NjgzNiBhIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgNC42NTYyNSwtMTMuMjM2MzMgMjEuMjM2OTE3LDIxLjIzNjkyMSAwIDAgMCAtMjEuMjM2MzMsLTIxLjIzNjMzIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgLTEzLjI1LDQuNjQ0NTQgbCAtNi41NTQ2OCwtNi41NTQ2OSB6IG0gMC41ODU5Myw3LjI3MTQ4IDIuNjM4NjgsMi42Mzg2NyBhIDIxLjIzNjkxNywyMS4yMzY5MjEgMCAwIDAgLTQuNjU2MjUsMTMuMjM2MzMgMjEuMjM2OTE3LDIxLjIzNjkyMSAwIDAgMCAyMS4yMzYzMiwyMS4yMzgyOCAyMS4yMzY5MTcsMjEuMjM2OTIxIDAgMCAwIDEzLjI1LC00LjY0NDUzIGwgMi43NDAyNCwyLjc0MDI0IGMgLTQuNDY4MjIsMy42NzQ5NiAtMTAuMDY3MDgsNS43MDUyOSAtMTUuODYxMzMsNS43MTQ4NCAtMTMuODMzNjYsMCAtMjUuMDQ4ODMsLTExLjIxNTE2IC0yNS4wNDg4MywtMjUuMDQ4ODMgOS44ZS00LC01Ljc5NzE1IDIuMDI4NzEsLTExLjQwMDk4IDUuNzAxMTcsLTE1Ljg3NSB6IgogICAgICAgaWQ9InJlY3Q1MzAwLTMiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2NjY2Nzc2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gNDYwLjk2MDM1LDU2OS4yMzU2NyBjIDAsMCAtMy4yNDkyNSwtMy4xNTA5NyAtOC44MTA3OSwtMy4xNTc1NSAtNS41NjE1MywtMC4wMDcgLTExLjEzMTAxLDYuNzAwNjggLTExLjEzNzc0LDEyLjM2NTQ5IC0wLjAwNyw1LjY2NDggMy4yMzg1NywxMi4xNzI2OSAxMS44NDMyLDEyLjE4Mjg3IDguNjA0NjUsMC4wMDkgMTIuNTk3NSwtNC40OTU5NSAxMS4xNDA4NSwtMTQuOTg4MDYgbCAtMTAuNjAyNCwzLjM0NDM4IDEuOTkxMjksMi4xMDA0MSAxLjI1OTYxLC0wLjMxMzIgYyAwLDAgMi4wOTU1OCwyLjYyNTA4IC0xLjA1Mjk2LDMuMDQwOTcgLTMuMTQ4NTMsMC40MTU4NyAtNS45ODA4LC0wLjQyNjcgLTYuMzk1NzksLTQuNDEzNTUgLTAuNDE1MDMsLTMuOTg2ODUgMi43MzYzOCwtNi44MTU1MiA2LjQwNzIzLC01LjIzNzYzIHoiCiAgICAgICBpZD0icGF0aDg4MTAtNi03LTAtNC05LTgiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTguOTQ3Njc5NTI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzkxNjkiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC45NTg3NTg3OSwtMy45MjI5ODM4ZS00KSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMxYTU2OTQ7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJtIDQ1Ny4xMzY2NSw2MDIuMDY0MzYgYyAwLjEwNjY0LDAuODk0NTggNi4zOTMzOCw5LjcxNDI5IDcuMzEwOTYsMTAuMTQxNDcgMC45MTc1NywwLjQyNzE4IDEzLjI2NjAxLC0xLjI3MzkyIDE0LjAwNDA3LC0xLjkwNzggMC43MzgwNiwtMC42MzM4OCA1LjgzNzAyLC0xMC45MDc4OSA1LjY2MzQyLC0xMS45NDg4NiAtMC4xNzM2LC0xLjA0MDk3IC02Ljc0MjI0LC05LjQ4NjgxIC03LjcyMjg0LC05Ljk0MDY0IC0wLjk4MDYsLTAuNDUzODQgLTEzLjI5NTQ0LDAuMzQ3MTIgLTE0LjIxMDAyLDAuODAzMjggLTEuMDM0OTksMC41MTYyMiAtNS4xNTIyMywxMS45NTc5NyAtNS4wNDU1OSwxMi44NTI1NSB6IgogICAgICAgICBpZD0icGF0aDE4OTYxIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6enp6c3oiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMzZjhjZGY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJtIDQ1OC43ODQxOSw2MDIuMDg5NTcgYyAwLjExMjc1LDAuOTMyNTkgNS43NDkyMyw4LjMzODg2IDYuNTkwNTQsOC43NjA3MiAwLjg0MTMyLDAuNDIxODYgMTEuMjk0OTgsLTEuMTE1ODcgMTEuOTUwODUsLTEuNjk4NTEgMC42NTU4NywtMC41ODI2NCA1LjU0MDM2LC0xMC4yNjA3NiA1LjEyNzE5LC0xMS4zNzMzMiAtMC40MTMxNywtMS4xMTI1NyAtNS44NzE2OCwtNy43NDkwNCAtNi44ODQ2NywtOC4xMTQ4IC0xLjAxMjk4LC0wLjM2NTc2IC0xMS4wOTA5NSwwLjAxNjQgLTEyLjEyNjU5LDAuNzE1MTYgLTEuMDM1NjUsMC42OTg3IC00Ljc3MDA3LDEwLjc3ODE2IC00LjY1NzMyLDExLjcxMDc1IHoiCiAgICAgICAgIGlkPSJwYXRoMTk4NDgiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0ienp6enp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enp6eiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzJlNjZhNDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNDY1LjE5Njc5LDYxMS4yNDI4NyBjIC0wLjkxNCwtMC4wNDU4IDQuOTQyMDEsLTExLjk1NDkgNS40OTg1MiwtMTIuNTA1OCAwLjU1NjUxLC0wLjU1MDg5IDExLjcxNDksLTEuMjY0ODQgMTIuMzUxMzgsLTAuNjI4NTQgMC42MzY0OCwwLjYzNjMgLTUuMDA3ODcsMTEuMTU2MTYgLTUuNTg2NzksMTEuNTk3MzMgLTAuNTc4OTEsMC40NDExNyAtMTEuMzQ5MTEsMS41ODI3OCAtMTIuMjYzMTEsMS41MzcwMSB6IgogICAgICAgICBpZD0icGF0aDIyNTUxIiAvPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzdHlsZT0iZmlsbDojMWE1Njk0O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0ibSA0NjIuODAwMDcsNTkwLjgxODM4IGMgMi4xMjIzMiwyLjk5NDk5IDYuNjY2Nyw3LjQ2NjE5IDYuODk5MDYsOC41MzQ5IDAuMjMyMzcsMS4wNjg3MSAtMy40MzIwMiw3Ljc2NTQxIC01LjQwOTU0LDExLjcxMzkzIGwgMS44MDU1NSwwLjUzOTc0IGMgMS4yOTU2OCwtNC4zMTY2IDMuOTQxNTEsLTExLjI1MzU4IDQuODM5NjUsLTExLjk1MjQ0IDAuODk4MTQsLTAuNjk4ODYgMTEuODYzNSwtMS40MTE4NCAxMi42NDgyMiwtMC44NjU5NiAwLjc4NDcyLDAuNTQ1ODggLTEuMDg2MTUsLTEuNjE3NDMgLTEuMDg2MTUsLTEuNjE3NDMgLTMuODUwMiwwLjc5OTg4IC0xMS4xNzAzOCwxLjI0MjU1IC0xMi4wNzY5MywwLjk3NzIzIC0wLjkwNjU1LC0wLjI2NTMyIC00LjU4MjE1LC01Ljg2OTg1IC02LjU5MDE1LC04LjMzNDA4IHoiCiAgICAgICAgIGlkPSJwYXRoMTk4NTAiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3pjY3p6Y3pjYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDczLjg5MjAzLDU5NC44NDg5MSBjIC0xLjkzMzIsLTAuMTU4MjggLTMuMDYwNTEsLTIuNTA5MjIgLTEuMTI3MSwtMi4zNTM2MyAxLjkzMzQxLDAuMTU1NTggMy4wNjAzLDIuNTExOTEgMS4xMjcxLDIuMzUzNjMgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDY0LjQ0MTM3LDU5NS42Mjc1MiBjIDAuMTYwMDcsMS45MzMwNSAtMS45NzQ4MiwzLjQyOTcyIC0yLjEzNzU3LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MSAxLjk3NzUxLC0zLjQyOTk1IDIuMTM3NTcsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMyIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtmaWxsOiNjMGQ1ZWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBkPSJtIDQ2Mi4yNTc4Niw2MDAuMzU5MDUgYyAwLjE2MDA2LDEuOTMzMDUgLTEuOTc0ODIsMy40Mjk3MiAtMi4xMzc1OCwxLjQ5NjkgLTAuMTYyNzYsLTEuOTMyODIgMS45Nzc1MSwtMy40Mjk5NiAyLjEzNzU4LC0xLjQ5NjkgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtmaWxsOiNjMGQ1ZWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBkPSJtIDQ2Ny40NTczLDU5OS43MzUxMSBjIDAuMTYwMDcsMS45MzMwNSAtMS45NzQ4MSwzLjQyOTcyIC0yLjEzNzU3LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MSAxLjk3NzUxLC0zLjQyOTk1IDIuMTM3NTcsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMy03IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6I2MwZDVlYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDY1LjIyMTU0LDYwNC41MTg2MSBjIDAuMTYwMDYsMS45MzMwNSAtMS45NzQ4MiwzLjQyOTcyIC0yLjEzNzU4LDEuNDk2OSAtMC4xNjI3NiwtMS45MzI4MiAxLjk3NzUyLC0zLjQyOTk2IDIuMTM3NTgsLTEuNDk2OSB6IgogICAgICAgICBpZD0icGF0aDQxNDYtMy01IgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9Inp6eiIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2ZpbGw6Izk3YmJkZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICAgIGQ9Im0gNDc3LjI5MTc5LDYwNi42ODY2NiBjIC0wLjE3MDM0LDEuOTMyMTggLTIuNTI4MjcsMy4wNDQ3OSAtMi4zNjA2MiwxLjExMjM5IDAuMTY3NjQsLTEuOTMyNCAyLjUzMDk2LC0zLjA0NDU2IDIuMzYwNjIsLTEuMTEyMzkgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNTYiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0ienp6IiAvPgogICAgICA8cGF0aAogICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7ZmlsbDojOTdiYmRmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgICAgZD0ibSA0NzMuODY3NjksNjAyLjA0ODM2IGMgLTAuMjgyMDksMS45MTkwNCAtMi43MDA1NywyLjg5MzA1IC0yLjQyMTE1LDAuOTczNjMgMC4yNzk0MiwtMS45MTk0MyAyLjcwMzI1LC0yLjg5MjY3IDIuNDIxMTUsLTAuOTczNjMgeiIKICAgICAgICAgaWQ9InBhdGg0MTQ2LTMtNTYtOSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4OTk0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNDU3LjEzNjY2LDYwMi4wNjQzNiBjIDAuMTA2NjMsMC44OTQ1OCA2LjM5MzM3LDkuNzE0MjkgNy4zMTA5NSwxMC4xNDE0NyAwLjkxNzU4LDAuNDI3MTggMTMuMjY2MDEsLTEuMjczOTIgMTQuMDA0MDcsLTEuOTA3OCAwLjczODA2LC0wLjYzMzg4IDUuODM3MDIsLTEwLjkwNzg5IDUuNjYzNDIsLTExLjk0ODg2IC0wLjE3MzYsLTEuMDQwOTcgLTYuNzQyMjQsLTkuNDg2ODEgLTcuNzIyODQsLTkuOTQwNjQgLTAuOTgwNiwtMC40NTM4NCAtMTMuMjk1NDQsMC4zNDcxMiAtMTQuMjEwMDIsMC44MDMyOCAtMS4wMzQ5OSwwLjUxNjIyIC01LjE1MjIzLDExLjk1Nzk4IC01LjA0NTU4LDEyLjg1MjU1IHoiCiAgICAgICAgIGlkPSJwYXRoMTg5NjEtMSIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJ6enp6enN6IiAvPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2NjY2Nzc2NjIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gNDYwLjk2MDM1LDU2OS4yMzU2NyBjIDAsMCAtMy4yNDkyNSwtMy4xNTA5NyAtOC44MTA3OSwtMy4xNTc1NSAtNS41NjE1MywtMC4wMDcgLTExLjEzMTAxLDYuNzAwNjggLTExLjEzNzc0LDEyLjM2NTQ5IC0wLjAwNyw1LjY2NDggMy4yMzg1NywxMi4xNzI2OSAxMS44NDMyLDEyLjE4Mjg3IDguNjA0NjUsMC4wMDkgMTIuNTk3NSwtNC40OTU5NSAxMS4xNDA4NSwtMTQuOTg4MDYgbCAtMTAuNjAyNCwzLjM0NDM3IDEuOTkxMjksMi4xMDA0MiAxLjI1OTYxLC0wLjMxMzIgYyAwLDAgMi4wOTU1OCwyLjYyNTA3IC0xLjA1Mjk2LDMuMDQwOTYgLTMuMTQ4NTMsMC40MTU4OCAtNS45ODA4LC0wLjQyNjcgLTYuMzk1NzksLTQuNDEzNTUgLTAuNDE1MDMsLTMuOTg2ODQgMi43MzYzOCwtNi44MTU1MSA2LjQwNzIzLC01LjIzNzYyIHoiCiAgICAgICBpZD0icGF0aDg4MTAtNi03LTAtNC05LTgtNiIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50OTE2Nyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE4Ljk0NzY3OTUyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPC9nPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaWQ9ImxheWVyMyIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIgLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"gcompris,gcompris\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"gcompris-qt.gcompris-qt\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.20.04\"\nLABEL oc.name=\"GCompris\"\nLABEL oc.displayname=\"GCompris\"\nLABEL oc.path=\"/usr/games/gcompris-qt\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"GCompris\"\nENV APPBIN \"/usr/games/gcompris-qt\"\nENV APP \"/usr/games/gcompris-qt\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gcompris/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gcompris/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application GCompris

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/GCompris.d\n
"},{"location":"applications/gcompris/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f GCompris.d -t GCompris .\n
"},{"location":"applications/gcompris/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect GCompris > GCompris.json\ndocker image save GCompris -o GCompris.tar\nctr -n k8s.io images import GCompris.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @GCompris.json\n\n
"},{"location":"applications/geany/","title":"geany","text":""},{"location":"applications/geany/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/geany/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/geany/#alpine-packages","title":"Alpine packages","text":"
geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\n
"},{"location":"applications/geany/#displayname","title":"Displayname","text":"
Geany\n
"},{"location":"applications/geany/#path","title":"Path","text":"
/usr/bin/geany\n
"},{"location":"applications/geany/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/geany/#mimetype","title":"Mimetype","text":"
text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\n
"},{"location":"applications/geany/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/geany/#wm_class","title":"WM_CLASS","text":"
geany.Geany\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/geany/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/geany.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/geany/#json-dump","title":"JSON dump","text":"

json source file geany.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"icon\": \"geany.svg\",\n    \"apkpackage\": \"geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\",\n    \"keyword\": \"text,editor,geany,ide\",\n    \"launch\": \"geany.Geany\",\n    \"name\": \"geany\",\n    \"displayname\": \"Geany\",\n    \"path\": \"/usr/bin/geany\",\n    \"showinview\": \"dock\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/geany.desktop\",\n    \"mimetype\": \"text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\"\n}\n
"},{"location":"applications/geany/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output geany.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geany.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geany.d.3.0.json\n\n
"},{"location":"applications/geany/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update geany vte3 geany-plugins-commander geany-plugins-spellcheck geany-plugins-lang geany-plugins-pretty-printer geany-plugins-overview geany-plugins-scope\nLABEL oc.icon=\"geany.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgdmVyc2lvbj0iMS4wIgogICB3aWR0aD0iMjU2IgogICBoZWlnaHQ9IjI1NiIKICAgaWQ9InN2ZzIiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzIzNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzIzNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZjZTk0ZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDMyMzkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmY2U5NGY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC41IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDMyNDEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC43NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzMjQzIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzRhMDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxOTc0NCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTk3NDYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxOTc0OCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VkZDQwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjc4NTk3Mjk1IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDE5NzUwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNDY2NCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTQ2NjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxNDY2OCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTIyOTQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDEyMjk2IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmVmOGM0O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTIyOTgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDExODUzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMTg1NSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDExODU3IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ4Mjg1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A4Mjg3IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY2YzZjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wODI4OSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2NjMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzQ5OSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzUwMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZjVhYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDc1MDMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcxMDYiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxMDgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTEwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MzI4Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MzMwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjMzMiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTUzOSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNTU0MSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU1NDMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM1NzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTc0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmNlOTRmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzkwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyNzkyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjc5NCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZjZTk0ZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjE4OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjE5MCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0YTAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM2MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZGQ0MDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4yMDU1MjkyNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODQ4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmNlOTRmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODUwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWRkNDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjE5MiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0YTAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIzLjA3ODQwOSIKICAgICAgIGN5PSIxMi43NDM1OSIKICAgICAgIHI9IjMuNSIKICAgICAgIGZ4PSIyMy4wNzg0MDkiCiAgICAgICBmeT0iMTIuNzQzNTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMTg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mjc5MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1Ljg2NDkyNjQsLTE0LjA3NTgyMSwtMTAuMDAwMDAzLC0xMC42NjY2NjYsMTAzLjYzODMxLDMxNi43NzkyKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIxIgogICAgICAgeTE9IjM3LjY3ODIiCiAgICAgICB4Mj0iNDIuMjMwNzY2IgogICAgICAgeTI9IjU0LjE3OTYyNiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ3NTEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjI5NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxMiwwLDAsNi43ODcyOTE3LC0xNjUuMzMzMzQsLTI1NS43MzI5MykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyMy41IgogICAgICAgY3k9IjE5LjUiCiAgICAgICByPSIxNC41IgogICAgICAgZng9IjIzLjUiCiAgICAgICBmeT0iMTkuNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDU1NDUiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1NTM5IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNjU1MTcyMywwLDAsMC43MzU2MzIsODYuNDM2Nzg5LC0xMjYuMzQ0ODEpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMjEuNjI0OTk4IgogICAgICAgY3k9IjE2Ljc0OTk5OCIKICAgICAgIHI9IjUuNSIKICAgICAgIGZ4PSIyMS42MjQ5OTgiCiAgICAgICBmeT0iMTYuNzQ5OTk4IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NTkzNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc0OTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMy43MzMzMzM4LDAsMCwtMy44Nzg3ODc3LDM0LjkzMzMzNiwtNzMuNjk2OTYyKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEwLjQ1MDU4NSIKICAgICAgIGN5PSIyNy4zMzEzOTgiCiAgICAgICByPSI3IgogICAgICAgZng9IjEwLjQ1MDU4NSIKICAgICAgIGZ5PSIyNy4zMzEzOTgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ2NzE3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjMyOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxMy45OTk5OTgsMTQuNjM2NTg2LC0yLjMwODgzMTUsMTEuNzE3MzYyLC0yNi41Mzc5MTIsLTU1NC4zMzU1MykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyNCIKICAgICAgIGN5PSIzOC41IgogICAgICAgcj0iNiIKICAgICAgIGZ4PSIyNCIKICAgICAgIGZ5PSIzOC41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzExMiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxMDYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMTUuNTU1NTU2LDAsMCw1Ljc3Nzc3NjUsLTI0OC4wMDAwMSwtMjA5LjExMTA3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIzLjUiCiAgICAgICBjeT0iMTkuNSIKICAgICAgIHI9IjE0LjUiCiAgICAgICBmeD0iMjMuNSIKICAgICAgIGZ5PSIxOS41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzExNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDU1MzkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi45NDI1Mjg1LDAsMCwxLjI4NzM1NjMsNTguODUwNTc2LC0xNy4xMDM0NDIpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMjIuOTk5OTk4IgogICAgICAgY3k9IjI4LjUiCiAgICAgICByPSIzIgogICAgICAgZng9IjIyLjk5OTk5OCIKICAgICAgIGZ5PSIyOC41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTE4NjUiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ4Mjg1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDMuMTk5OTk4OSwwLDAsNi4yMjIyMjI5LDEuMDY2Njg1MiwtMjM5LjE1NTYzKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIxIgogICAgICAgeTE9IjI2IgogICAgICAgeDI9IjI1IgogICAgICAgeTI9IjMxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTE4NjciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMTg1MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjc3Nzc3NzEsMCwwLDQuNDQ0NDQ0MywzMy43Nzc3OCwtMTg2LjI2NjcxKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjIyLjk5OTk5OCIKICAgICAgIGN5PSIyOC41IgogICAgICAgcj0iMyIKICAgICAgIGZ4PSIyMi45OTk5OTgiCiAgICAgICBmeT0iMjguNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE0MjU5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50ODI4NSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgzLjIsMCwwLDYuMjIyMjIyOSw5Ny4wNjY2NjEsLTIzOC42NjY2OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMSIKICAgICAgIHkxPSIyNiIKICAgICAgIHgyPSIyNSIKICAgICAgIHkyPSIzMSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE0MjYxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTE4NTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS43Nzc3NzcxLDAsMCw0LjQ0NDQ0NDMsMTI5Ljc3Nzc4LC0xODUuNzc3NzcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iMTIiCiAgICAgICB5MT0iMTQiCiAgICAgICB4Mj0iNDQuNTY1MjE2IgogICAgICAgeTI9IjQ3LjY4NzUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNzEwOSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM1NzAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNC45MDY2NjY2LDAsMCw0Ljc0MDc0MDgsNC42MjIzNzE1ZS02LC0xOTkuNDA3NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIyMi45OTk5OTgiCiAgICAgICBjeT0iMjguNSIKICAgICAgIHI9IjMiCiAgICAgICBmeD0iMjIuOTk5OTk4IgogICAgICAgZnk9IjI4LjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxNzE3MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDgyODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4zMzMzMzA2LDAsMCw4LjI5NjI5NDksNS4wODU1NDE0ZS01LC0yODEuNzc3NzUpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iMjEiCiAgICAgICB5MT0iMjYiCiAgICAgICB4Mj0iMjUiCiAgICAgICB5Mj0iMzEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNzE3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDExODUzIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuOTYyOTYxNiwwLDAsNS45MjU5MjM3LDU0LjUxODU0NCwtMjExLjI1OTIxKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEzLjA3MTQ1NyIKICAgICAgIGN5PSIyMS4wOTQ0ODIiCiAgICAgICByPSIxNS41IgogICAgICAgZng9IjEzLjA3MTQ1NyIKICAgICAgIGZ5PSIyMS4wOTQ0ODIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxNzcwNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3OTAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNy42MTkwNDE2LDEyLjA0NjIyNywtOS44ODI3MTc4LDguNjIyNTg2MSwxNzcuODQ5NzQsLTQ0Ni4wMzQwNykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODA5OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSIzLjUiCiAgICAgICBjeT0iMTYuOTY5MTIyIgogICAgICAgcj0iMy4wNDc3MjI2IgogICAgICAgZng9IjMuNSIKICAgICAgIGZ5PSIxNi45NjkxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODEyOCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE0NjY0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTI5MDY3NywxLjI2OTc2MjMsLTEuMzEyNDU1NSwwLjc4NzQ3MzIsMjMuOTE5NDgsLTEuMDA2ODk3OCkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSI0MC4wMzU3MTciCiAgICAgICB5MT0iMTIuMzU4ODUzIgogICAgICAgeDI9IjQxLjY2MDcxMyIKICAgICAgIHkyPSIzNS4zOTQ1NjkiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxOTc0MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE5NzQ0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuMzMzMzMzMywwLDAsNS4zMzMzMzMzLC0xLjI5MTQzNGUtNywtMjA3Ljk5OTk5KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjEzLjgxOTM0MiIKICAgICAgIGN5PSI4Ljg3OTg1MDQiCiAgICAgICByPSIxNC41IgogICAgICAgZng9IjEzLjgxOTM0MiIKICAgICAgIGZ5PSI4Ljg3OTg1MDQiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxOTc3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM1NzAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MDI0OTY1LDIuNDUyMTA3MiwtMy4wMTY0NTYsMy44ODc4NzY4LDg2Ljc0NzMwNywtMTgzLjk2NTgxKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjMiCiAgICAgICB5MT0iMjciCiAgICAgICB4Mj0iMzkiCiAgICAgICB5Mj0iMjgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODQ2IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjE4OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDUuMzMzMzMzMywtMS4yOTE0MzRlLTcsLTIwNy45OTk5OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSI4IgogICAgICAgeTE9IjM5IgogICAgICAgeDI9IjM4IgogICAgICAgeTI9IjM5IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzIzMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMyMzUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4zMzMzMzMzLDAsMCw1LjMzMzMzMzMsLTEuMjkxNDM0ZS03LC0yMDcuOTk5OTkpIiAvPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlPjI5LTA2LTA3PC9kYzpkYXRlPgogICAgICAgIDxkYzpjcmVhdG9yPgogICAgICAgICAgPGNjOkFnZW50PgogICAgICAgICAgICA8ZGM6dGl0bGU+U2ViYXN0aWFuIEtyYWZ0PC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+YXBwbGljYXRpb248L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5nZWFueTwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPmVkaXRvcjwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnByb2dyYW1taW5nPC9yZGY6bGk+CiAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxjYzpsaWNlbnNlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwyMDgpIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjE4LjY2NjY4LDEzLjMzMzMzNyBjIDAsMTkuMTM2IC00MS44MTMzNCwzNC42NjY2NjEgLTkzLjMzMzM0LDM0LjY2NjY2MSBDIDczLjgxMzMzMyw0Ny45OTk5OTggMzIsMzIuNDY5MzM3IDMyLDEzLjMzMzMzNyBjIDAsLTE5LjEzNTk5NTEgNDEuODEzMzMzLC0zNC42NjY2NjIgOTMuMzMzMzQsLTM0LjY2NjY2MiA1MS41MiwwIDkzLjMzMzM0LDE1LjUzMDY2NjkgOTMuMzMzMzQsMzQuNjY2NjYyIHoiCiAgICAgICBpZD0icGF0aDY3MjEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ3MTEyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC40ODMwNDU4OHB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxOTkuOTk5OTksOC4wMDAwMDg2IGMgMCwxNC43MjAwMDA0IC0zNC42NDUzMywyNi42NjY2NjY0IC03Ny4zMzMzMywyNi42NjY2NjY0IC00Mi42ODc5OTMsMCAtNzcuMzMzMzMsLTExLjk0NjY2NiAtNzcuMzMzMzMsLTI2LjY2NjY2NjQgMCwtMTQuNzIgMzQuNjQ1MzM3LC0yNi42NjY2NjY2IDc3LjMzMzMzLC0yNi42NjY2NjY2IDQyLjY4OCwwIDc3LjMzMzMzLDExLjk0NjY2NjYgNzcuMzMzMzMsMjYuNjY2NjY2NiB6IgogICAgICAgaWQ9InBhdGgzNTgwIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzIzMyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMxNThweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTcwLjY2NjY2LDguMDAwMDA4NiBjIDAsMTAuMzA0MDAwNCAtMTkuMTE0NjcsMTguNjY2NjY2NCAtNDIuNjY2NjcsMTguNjY2NjY2NCAtMjMuNTUyLDAgLTQyLjY2NjY1NywtOC4zNjI2NjYgLTQyLjY2NjY1NywtMTguNjY2NjY2NCAwLC0xMC4zMDQgMTkuMTE0NjU3LC0xOC42NjY2NjY2IDQyLjY2NjY1NywtMTguNjY2NjY2NiAyMy41NTIsMCA0Mi42NjY2Nyw4LjM2MjY2NjYgNDIuNjY2NjcsMTguNjY2NjY2NiB6IgogICAgICAgaWQ9InBhdGg3MTE0IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NzExNik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTk0LjY2NjY3LDUuNTc3ODE2NiBjIDAsMTMuMTEzMDUwNCAtMzIuMjU2LDIzLjc1NTUxNDQgLTcxLjk5OTk5LDIzLjc1NTUxNDQgLTM5Ljc0NDAwOCwwIC03Mi4wMDAwMTYsLTEwLjY0MjQ2NCAtNzIuMDAwMDE2LC0yMy43NTU1MTQ0IDAsLTEzLjExMzA1MDcgMzIuMjU2MDA4LC0yMy43NTU1MjU2IDcyLjAwMDAxNiwtMjMuNzU1NTI1NiAzOS43NDM5OSwwIDcxLjk5OTk5LDEwLjY0MjQ3NDkgNzEuOTk5OTksMjMuNzU1NTI1NiB6IgogICAgICAgaWQ9InBhdGg0MzYyIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NDc1MSk7c3Ryb2tlLXdpZHRoOjUuMzMzMzMyNTRweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMTYwLDMuMjQzOTI2NGUtNiBDIDE2MCw4LjgzMjAwODYgMTQzLjI3NDY3LDE2LjAwMDAwOSAxMjIuNjY2NjcsMTYuMDAwMDA5IDEwMi4wNTg2NywxNi4wMDAwMDkgODUuMzMzMzMzLDguODMyMDA4NiA4NS4zMzMzMzMsMy4yNDM5MjY0ZS02IDg1LjMzMzMzMywtOC44MzE5OTE0IDEwMi4wNTg2NywtMTUuOTk5OTkxIDEyMi42NjY2NywtMTUuOTk5OTkxIDE0My4yNzQ2NywtMTUuOTk5OTkxIDE2MCwtOC44MzE5OTE0IDE2MCwzLjI0MzkyNjRlLTYgeiIKICAgICAgIGlkPSJwYXRoMzU3OCIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6I2M0YTAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4zODE2OTg3M3B4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjAuOTQwMjksLTEzNS45OTk5OSBjIC00MC41MzkxODYsMCAtNzMuNDM0ODQsMTYuNjkxNSAtNzMuNDM0ODQyLDM3LjMwMTE2MSAwLDUuNDE5OTUyIC0wLjgxNDY1MiwxNi45NDEwMjQgMC41OTQ2MTQsMzAuNDQzMTA0IEMgMzQuODI4OTAxLC03My4zNjk2MTggMzQuODQzNTA4LC04NC44NjU0MSAzMy42ODA2NzEsLTk4LjUzMTU2IGwgLTE0Ljg2NTM1MiwwIGMgLTAuMDQxNiwwLjkzMTE0NyAtMC4xNDg2NTMsMS45MDE0ODggLTAuMTQ4NjUzLDIuODQzNTkgNC44OTQyOTQsNTkuOTgwMzM2IDUxLjg2ODUxMyw5Ni4wODY2MTg1OCAxMDIuMjczNjI0LDk4LjM1NDYzOTkgMjAuMjY5NTgsMCA0NS40NTM2NywtNS41MDAwMTYgNjEuMDk2NTksLTMyLjI4MzA3MTkgMTUuNjQyOTQsLTI2Ljc4MzA0NiAxMi4zMzgyNCwtNTguNzc3NjExIDEyLjMzODI1LC02OS4wODI0MjcgMCwtMjAuNjA5NjUxIC0zMi44OTU2NywtMzcuMzAxMTYxIC03My40MzQ4NCwtMzcuMzAxMTYxIHoiCiAgICAgICBpZD0icGF0aDIxOTYiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyODQ2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I2M0YTAwMDtzdHJva2Utd2lkdGg6NS4zMzMzMzE1OHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAyNiwxNy41IGEgMy41LDAuNSAwIDEgMSAtNywwIDMuNSwwLjUgMCAxIDEgNywwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgzLjgwOTUyMzcsMCwwLDE2LjAwMDAwMiwzNi45NTIzODcsLTM5Mi4wMDAwMykiCiAgICAgICBpZD0icGF0aDM2MjgiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNjNGEwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNlZGQ0MDA7c3Ryb2tlLXdpZHRoOjAuNjgzMTMwMDNweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDEwMS4zMzMzMywtMTA2LjY2NjY2IGMgMCwxNC43MjAwMDcgNjAuOCwyNi42NjY2NjggMjQsMjYuNjY2NjY4IC0zNi43OTk5OTcsMCAtNjYuNjY2NjYzLC0xMS45NDY2NjEgLTY2LjY2NjY2MywtMjYuNjY2NjY4IDAsLTE0LjcyIDI5Ljg2NjY2NiwtMjYuNjY2NjcgNjYuNjY2NjYzLC0yNi42NjY2NyAzNi44LDAgLTI0LDExLjk0NjY3IC0yNCwyNi42NjY2NyB6IgogICAgICAgaWQ9InBhdGgzMTg3IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC42O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTk3NzQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkxMzQ1OTM2cHg7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE4My45OTk5OSwtMTA5LjMzMzMyIGMgMCwxMS43NzU5OSAtMjcuNDc3MzIsMjEuMzMzMzI4IC02MS4zMzMzMiwyMS4zMzMzMjggLTMzLjg1NjAwMywwIC02MS4zMzMzNDIsLTkuNTU3MzM4IC02MS4zMzMzNDIsLTIxLjMzMzMyOCAwLC0xMS43NzYwMSAyNy40NzczMzksLTIxLjMzMzM0IDYxLjMzMzM0MiwtMjEuMzMzMzQgMzMuODU2LDAgNjEuMzMzMzIsOS41NTczMyA2MS4zMzMzMiwyMS4zMzMzNCB6IgogICAgICAgaWQ9InBhdGgxNjMzOSIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6bm9uZTtzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDE3MTA5KTtzdHJva2Utd2lkdGg6NS4zMzMzMzMwMjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDU2LjY2NjY2NywtMTA2LjY2NjY2IGMgMCw0Ljg4Mjg1IC00LjA5MDczMSwzMC43MTc4NjMgLTMuMzMzMzM0LDQyLjY2NjY2OCAwLjM3ODY5OSw1Ljk3NDQwNiAtMjYuMTA1MjI0LC0yMS45MzIyMDggLTIxLjY2NjY2NiwtMjYuNjY2NjY2IDEwLC0xMC42NjY2NjIgLTUsMCAtNSw1LjMzMzMzMyAwLDQyLjk5ODcwOSA1MC43NzE4NzcsNjkuNzE3NjQzIDU4LjA5Mjc4NCw3NC4yMDI2NzIgNy4zMjA5MTcsNC40ODUwMjQyIDE1LjAzNDAzNyw1Ljc5NzMyODIgMjEuOTA3MjE5LDUuNzk3MzI4MiAwLDAgMjEuMzMzMzMsLTgwLjAwMDAwMDIgMjEuMzMzMzMsLTgwLjAwMDAwMDIgLTIzLjcyMTY0LDAgLTY1LjI3MTYyNywtOC42MjczNjUgLTcxLjMzMzMzMywtMjEuMzMzMzM1IHoiCiAgICAgICBpZD0icGF0aDU5MzkiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ2NzE3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxODkuMzMzMzMsLTEwNi43ODIwNCBjIDAsMTMuMzExNjkxIC0yOS44NjY2NiwyNC4xMTUzODIgLTY2LjY2NjY2LDI0LjExNTM4MiAtMzYuNzk5OTkzLDAgLTY2LjY2NjY2NSwtMTAuODAzNjkxIC02Ni42NjY2NjUsLTI0LjExNTM4MiAwLC0xMy4zMTE3IDI5Ljg2NjY3MiwtMjQuMTE1MzkgNjYuNjY2NjY1LC0yNC4xMTUzOSAzNi44LDAgNjYuNjY2NjYsMTAuODAzNjkgNjYuNjY2NjYsMjQuMTE1MzkgeiIKICAgICAgIGlkPSJwYXRoMTU5NDgiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxNDkuMzMzMzMsLTExMS45OTk5OSBjIDAsNS44ODggLTEwLjc1MiwxMC42NjY2NyAtMjQsMTAuNjY2NjcgLTEzLjI0Nzk5LDAgLTIzLjk5OTk5LC00Ljc3ODY3IC0yMy45OTk5OSwtMTAuNjY2NjcgMCwtNS44ODggMTAuNzUyLC0xMC42NjY2NiAyMy45OTk5OSwtMTAuNjY2NjYgMTMuMjQ4LDAgMjQsNC43Nzg2NiAyNCwxMC42NjY2NiB6IgogICAgICAgaWQ9InBhdGg1MTU0IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4xO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTU0NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTIxLjIwNTMsLTEzMC42NjY2NiBjIC0zNy40NjAwMiwwIC02OC4yNTk5MiwxNC45OTU5NSAtNjguMjU5OTIsMzQuMDIzODE1IDAsMCAwLjk2MDQyOCwzMy45NzYxOTIgMC45NjA0MjgsMzMuOTc2MTkyIC0xMy44NDQ1MiwtMi4yNjE5MDQgLTIxLjk3NjY3NiwtMTEuNSAtMjIuNzEwODU1LC0zMC4wMDAwMDUgLTQuNzc1NzI5LC0xLjcxMDcyNiAtNS4yMDM1NDUsMC41OTQ2NSAtNy4xOTQ5NTQsMS41MDAwMDUgOC42Nzc1ODksNTQuNzc3ODgzIDUwLjQyNTYxNyw4Ni4yODQ0NDgyIDk3LjIwNTMwMSw4OC41MDAwMDU2IDE4LjczMDAxLDAgNDIuMDc2OTksLTUuMTA1ODg4IDU2LjUzMTc4LC0yOS44MzMzMzM2IDE0LjQ1NDc3LC0yNC43Mjc0MzUgMTEuMzA2MzYsLTU0LjE1Mjc1NyAxMS4zMDYzNSwtNjMuNjY2NjcyIDAsLTE5LjAyNzg1NyAtMzAuMzc4MTEsLTM0LjUwMDAwNyAtNjcuODM4MTMsLTM0LjUwMDAwNyB6IgogICAgICAgaWQ9InBhdGgyMjA2IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTp1cmwoI3JhZGlhbEdyYWRpZW50MTc3MDYpO3N0cm9rZS13aWR0aDo1LjMzMzMzMjU0cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE0MS4zMzMzNCwtMTMzLjMzMzMxIGMgMCwtNy4zNjAwMSAtOC4zNjI2OCwtMTMuMzMzMzQgLTE4LjY2NjY3LC0xMy4zMzMzNCAtMTAuMzA0LDAgLTE4LjY2NjY2LDUuOTczMzMgLTE4LjY2NjY2LDEzLjMzMzM0IDAsNy4zNTk5OSA4LjM2MjY2LDI0IDE4LjY2NjY2LDI0IDEwLjMwMzk5LDAgMTguNjY2NjcsLTE2LjY0MDAxIDE4LjY2NjY3LC0yNCB6IgogICAgICAgaWQ9InBhdGgyMjAxIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTkzNCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDlweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTM2LjAwMDAxLC0xMzEuODA5NTEgYyAwLC01LjI1NzE0IC01Ljk3MzM0LC05LjUyMzgxIC0xMy4zMzMzNCwtOS41MjM4MSAtNy4zNTk5OSwwIC0xMy4zMzMzMyw0LjI2NjY3IC0xMy4zMzMzMyw5LjUyMzgxIDAsNS4yNTcxNCA1Ljk3MzM0LDE3LjE0Mjg2IDEzLjMzMzMzLDE3LjE0Mjg2IDcuMzYsMCAxMy4zMzMzNCwtMTEuODg1NzIgMTMuMzMzMzQsLTE3LjE0Mjg2IHoiCiAgICAgICBpZD0icGF0aDIyMDQiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOnVybCgjcmFkaWFsR3JhZGllbnQzMTg1KTtzdHJva2Utd2lkdGg6NS4zMzMzMzMwMnB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3NC42NjY2NjEsLTc3LjgyMjI2OSAtNy45OTk5OTQsMTYuMDAwMDA1IDcuOTk5OTk0LDE2IDguMDAwMDA2LC0xNiAtOC4wMDAwMDYsLTE2LjAwMDAwNSB6IgogICAgICAgaWQ9InBhdGgxMTg2MSIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTg2NSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNhNDAwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzMDI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gNzQuNjY2NjY3LC03NS4xNTU2MDIgLTUuMzMzMzM0LDEzLjMzMzMzOCA1LjMzMzMzNCwxMy4zMzMzMjggMCwtMjYuNjY2NjY2IHoiCiAgICAgICBpZD0icGF0aDExODYzIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDExODY3KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE3MC42NjY2NywtNzcuMzMzMzMgLTgsMTYuMDAwMDA1IDgsMTYgOCwtMTYgLTgsLTE2LjAwMDAwNSB6IgogICAgICAgaWQ9InBhdGgxNDI1NSIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxNDI1OSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNhNDAwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzMDI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTcwLjY2NjY3LC03NC42NjY2NjQgLTUuMzMzMzQsMTMuMzMzMzM5IDUuMzMzMzQsMTMuMzMzMzI4IDAsLTI2LjY2NjY2NyB6IgogICAgICAgaWQ9InBhdGgxNDI1NyIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxNDI2MSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjIuNjY2NjYsLTY2LjY2NjY1MyAtMTMuMzMzMzIsMjEuMzMzMzI4IDEzLjMzMzMyLDIxLjMzMzMzNCBMIDEzNiwtNDUuMzMzMzI1IDEyMi42NjY2NiwtNjYuNjY2NjUzIHoiCiAgICAgICBpZD0icGF0aDE3MTY4IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE3MTcyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6I2E0MDAwMDtzdHJva2Utd2lkdGg6NS4zMzMzMzI1NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNob2Zmc2V0OjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMjIuNjY2NjcsLTYzLjExMTEwNiAtOC44ODg4OCwxNy43Nzc3ODYgOC44ODg4OCwxNy43Nzc3NjYgMCwtMzUuNTU1NTUyIHoiCiAgICAgICBpZD0icGF0aDE3MTcwIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDE3MTc0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDUsMjAuNSBhIDIsMS41IDAgMSAxIC00LDAgMiwxLjUgMCAxIDEgNCwwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDMuNTU1NTU2OCw3Ljk5OTk5OTksLTE3MS41NTU1NykiCiAgICAgICBpZD0icGF0aDE3MjAzIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojMmUzNDM2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojYzRhMDAwO3N0cm9rZS13aWR0aDoxLjIyNDc0NDY4cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3LDE4IGEgMi41LDMgMCAxIDEgLTUsMCAyLjUsMyAwIDEgMSA1LDAgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNiwwLDAsOCwtOC41MzMzMzM1LC0zMjIuNjY2NjYpIgogICAgICAgaWQ9InBhdGgxODEwOSIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE4MTI0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41NDc3MjI0NnB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA3LDE4IGEgMi41LDMgMCAxIDEgLTUsMCAyLjUsMyAwIDEgMSA1LDAgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDcuNDY2NjY2NywwLDAsNi4yMjIyMjE5LC05LjYwMDAwMDEsLTI2My45OTk5OCkiCiAgICAgICBpZD0icGF0aDE4MTA1IgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTgxMjYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjY4NDY1MzFweDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gNywxOCBhIDIuNSwzIDAgMSAxIC01LDAgMi41LDMgMCAxIDEgNSwwIHoiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg1LjMzMzMzMzMsMCwwLDQuNDQ0NDQ0OCw1LjMzMzMzMzIsLTIxMC42NjY2NykiCiAgICAgICBpZD0icGF0aDE4MTAxIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTgxMjgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkxMjg3MDc2cHg7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDcsMTggYSAyLjUsMyAwIDEgMSAtNSwwIDIuNSwzIDAgMSAxIDUsMCB6IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoNC4yNjY2NjY3LDAsMCwzLjU1NTU1NTcsMi4xMzMzMzMyLC0xNzYpIgogICAgICAgaWQ9InBhdGgxNzcwOCIKICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE4MDk5KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wOTU0NDQ5MnB4O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAzNC42NjY2NjcsLTIwNS4zMzMzMyBjIC0xNC43MiwwIC0yNi42NjY2NjcxLDExLjk0NjY3IC0yNi42NjY2NjcxLDI2LjY2NjY3IDAsMy43NjE1NiAwLjkyNjE1MTUsNy4yNTM3MiAyLjMzMzMzMzEsMTAuNSAtNC42MzU3MTA3LDMuOTE0MzEgLTcuNjY2NjY2NSw5LjYyODk2IC03LjY2NjY2NjUsMTYuMTY2NjcgMCw4LjAxNjMgNC40NTczMDMsMTQuODU0OTIgMTEuMDAwMDAwNSwxOC41IC0wLjE3MjA1OCwwLjkzOTU5IC0wLjMzMzMzNCwxLjg0NDI3IC0wLjMzMzMzNCwyLjgzMzMzIDAsMi41MjM4OCAwLjYyNDQwOCw0Ljg3NjM0IDEuNjY2NjY3LDcgLTQuMTU2MjI0LDIuMjU4NzMgLTcuMDAwMDAwMSw2LjYwNjY2IC03LjAwMDAwMDEsMTEuNjY2NjcgMCw3LjM2IDUuOTczMzMzMSwxMy4zMzMzMzIgMTMuMzMzMzMzMSwxMy4zMzMzMzIgNy4zNiwwIDEzLjMzMzMzNCwtNS45NzMzMzIgMTMuMzMzMzM0LC0xMy4zMzMzMzIgMCwtMS4yMjE1OCAtMC4xOTE4NjgsLTIuMzc1NzkgLTAuNSwtMy41IDYuNDM0MzQ2LC0yLjA3Mjg2IDExLjE2NjY2NiwtOC4wNDU4NiAxMS4xNjY2NjYsLTE1LjE2NjY3IDAsLTMuNjk1MTUgLTEuMjI2OTkyLC03LjEyMzgxIC0zLjMzMzMzMywtOS44MzMzMyAyLjEwMzE3MywtMy4zMDUxIDMuMzMzMzMzLC03LjI5NDk2IDMuMzMzMzMzLC0xMS41IDAsLTAuNzM5MjIgLTAuMjU5ODI2LC0xLjQ0Njc1IC0wLjMzMzMzMywtMi4xNjY2NyA5LjU3LC00LjA1IDE2LjMzMzMzMywtMTMuNDYgMTYuMzMzMzMzLC0yNC41IDAsLTE0LjcyIC0xMS45NDY2NjcsLTI2LjY2NjY3IC0yNi42NjY2NjYsLTI2LjY2NjY3IHoiCiAgICAgICBpZD0icGF0aDE4MTEzIgogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDpub25lO3N0cm9rZTojYmFiZGI2O3N0cm9rZS13aWR0aDo1LjMzMzMzMzAycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAzNC42NjY2NjcsLTIwMC4zMzMzMyBjIC0xMS45MjMyLDAgLTIxLjY2NjY2Nyw5Ljc0MzQ3IC0yMS42NjY2NjcsMjEuNjY2NjcgMCw0LjQ3MTIgMS41MDM1NzEsOC41NTI0NCAzLjgzMzMzMywxMiAtNS40MzAzMzUsMi42NTQ5NyAtOS4xNjY2NjY0LDguMjE4NCAtOS4xNjY2NjY0LDE0LjY2NjY3IDAsNy41Njk2OCA1LjE3NTk0MDQsMTMuODE3MDIgMTIuMTY2NjY2NCwxNS42NjY2NiAtMC45OTYxMywxLjY2NTI2IC0xLjY2NjY2NiwzLjU4NjQyIC0xLjY2NjY2Niw1LjY2NjY3IDAsNi4xMzMzNCA1LjAzMzMzMywxMS4xNjY2NyAxMS4xNjY2NjYsMTEuMTY2NjcgNi4xMzMzMzQsMCAxMS4xNjY2NjgsLTUuMDMzMzMgMTEuMTY2NjY3LC0xMS4xNjY2NyAwLC00LjA1MzA4IC0yLjI1NTQ4NiwtNy41NTkxOCAtNS41LC05LjUgMy4yMTI3NjIsLTIuOTgzMzcgNS4zMzMzMzMsLTcuMTA2NTYgNS4zMzMzMzMsLTExLjgzMzMzIDAsLTEuOTkxMDQgLTAuMzQ2ODE2LC0zLjkwMTgyIC0xLC01LjY2NjY3IDkuNjU2MDMxLC0yLjE1NDYgMTcsLTEwLjY5NzYxIDE3LC0yMSAwLC0xMS45MjMyIC05Ljc0MzQ2NywtMjEuNjY2NjcgLTIxLjY2NjY2NiwtMjEuNjY2NjcgeiBtIC0xMy4zMzMzMzQsNzkuODMzMzQgYyAtNC43MTA0LDAgLTguNSwzLjc4OTU5IC04LjUsOC41IDAsNC43MTA0IDMuNzg5Niw4LjUgOC41LDguNSA0LjcxMDQsMCA4LjUsLTMuNzg5NjEgOC41LC04LjUgMCwtNC43MTA0IC0zLjc4OTYsLTguNSAtOC41LC04LjUgeiIKICAgICAgIGlkPSJwYXRoMTgxMzAiCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjQuNDQ0NDQzN3B4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjE4LjY2NjY3LC0xNTEuOTk5OTkgYyAtMTkuMjA1MzQsMCAtMzIsMTUuNDYxMzMgLTMyLDM0LjY2NjY3IEwgMTkyLC0xMDYuNjY2NjYgYyAtMWUtNSwtMTUuODE2MTUgNS4wODI2NywtMjkuMzMzMzMgMjEuMzMzMzMsLTI5LjMzMzMzIDE2LjI1MDY2LDAgMjkuMzMzMzQsMTIuNjgzODQgMjkuMzMzMzQsMjguNSBsIDAsNDguMzMzMzMyIGMgLTIuMDE2OTQsMjUuMTIwNTQ5IC0zOS4zODg4NCwzMC4wODAxNDkgLTU5LDMzLjgzMzMzMyAtMi4zODc0MywzLjQ5Mzg0IC00Ljk0NDU1LDYuNTUyMTk4IC03LjY2NjY3LDkuMzMzMzM0IDI1Ljk5MDc3LC03LjA0MjQ0MyA3NC41NzcyMywtNy4zOTY4ODYgNzcuMzMzMzMsLTQyLjY2NjY2NyBsIDAsLTU4LjY2NjY2MiBjIDAsLTE5LjIwNTM0IC0xNS40NjEzMywtMzQuNjY2NjcgLTM0LjY2NjY2LC0zNC42NjY2NyB6IgogICAgICAgaWQ9InJlY3QxOTMzNSIKICAgICAgIHN0eWxlPSJmaWxsOiNlZGQ0MDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiNjNGEwMDA7c3Ryb2tlLXdpZHRoOjUuMzMzMzMyNTQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTkyLC0xMjIuNjY2NjYgYyAxNiwtNDIuNjY2NjcgNTQuMTkwNDcsLTE4Ljg1NzE0IDU1LjYxOTA1LDAuNjY2NjcgbCAtMC40NzYxOSw2Ni42NjY2NjUgYyAwLDE2LjE5MDQ4IC0yOC40NzYxOSwyOC42NjY2NjcgLTY1LjgwOTUzLDM0IgogICAgICAgaWQ9InBhdGgxOTM1MyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuODtmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQxOTc0Mik7c3Ryb2tlLXdpZHRoOjUuMzMzMzMzNDk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"geany,text,editor,geany,ide\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"geany.desktop\"\nLABEL oc.launch=\"geany.Geany\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"geany\"\nLABEL oc.displayname=\"Geany\"\nLABEL oc.path=\"/usr/bin/geany\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-java;text/x-dsrc;text/x-pascal;text/x-perl;text/x-python;application/x-php;application/x-httpd-php3;application/x-httpd-php4;application/x-httpd-php5;application/xml;text/html;text/css;text/x-sql;text/x-diff;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"geany\"\nENV APPBIN \"/usr/bin/geany\"\nENV APP \"/usr/bin/geany\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/geany/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/geany/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application geany

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geany.d\n
"},{"location":"applications/geany/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f geany.d -t geany .\n
"},{"location":"applications/geany/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect geany > geany.json\ndocker image save geany -o geany.tar\nctr -n k8s.io images import geany.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geany.json\n\n
"},{"location":"applications/gedit/","title":"Gedit","text":""},{"location":"applications/gedit/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/gedit/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/gedit/#alpine-packages","title":"Alpine packages","text":"
gedit\n
"},{"location":"applications/gedit/#path","title":"Path","text":"
/usr/bin/gedit\n
"},{"location":"applications/gedit/#mimetype","title":"Mimetype","text":"
text/plain;\n
"},{"location":"applications/gedit/#file-extensions","title":"File extensions","text":"

\"txt\"

"},{"location":"applications/gedit/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"txt\"

"},{"location":"applications/gedit/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/gedit/#wm_class","title":"WM_CLASS","text":"
gedit.Gedit\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/gedit/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/gedit.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/gedit/#json-dump","title":"JSON dump","text":"

json source file gedit.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"gedit\",\n    \"icon\": \"gedit.svg\",\n    \"keyword\": \"editor\",\n    \"launch\": \"gedit.Gedit\",\n    \"name\": \"Gedit\",\n    \"path\": \"/usr/bin/gedit\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"text/plain;\",\n    \"fileextensions\": \"txt\",\n    \"legacyfileextensions\": \"txt\",\n    \"desktopfile\": \"/usr/share/applications/gedit.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/gedit/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output gedit.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gedit.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gedit.d.3.0.json\n\n
"},{"location":"applications/gedit/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gedit\nLABEL oc.icon=\"gedit.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZpZXdCb3g9IjAgMCAxMjggMTI4IgogICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IgogICB2ZXJzaW9uPSIxLjAiCiAgIGlkPSJzdmcxMTMwMCIKICAgaGVpZ2h0PSIxMjgiCiAgIHdpZHRoPSIxMjgiPgogIDx0aXRsZQogICAgIGlkPSJ0aXRsZTQxNjIiPkFkd2FpdGEgSWNvbiBUZW1wbGF0ZTwvdGl0bGU+CiAgPGRlZnMKICAgICBpZD0iZGVmczMiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMDM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MwYmZiYztzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEwMjYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTAyOCIKICAgICAgICAgb2Zmc2V0PSIwLjA0NTQ1NDU0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDEwMzAiCiAgICAgICAgIG9mZnNldD0iMC4wOTA5MDkwOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RlZGRkYTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMDMyIgogICAgICAgICBvZmZzZXQ9IjAuOTA5MDkwODgiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkZWRkZGE7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC45NTQ1NDU0NCIKICAgICAgICAgaWQ9InN0b3AxMDM0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzBiZmJjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMTAzNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDIyMTMiCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxyZWN0CiAgICAgICAgIHJ5PSI4IgogICAgICAgICByeD0iOCIKICAgICAgICAgeT0iLTE4OCIKICAgICAgICAgeD0iMTYwIgogICAgICAgICBoZWlnaHQ9IjU2IgogICAgICAgICB3aWR0aD0iMTYiCiAgICAgICAgIGlkPSJyZWN0MjIxNSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMDA1Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QwYmI4ZTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEwMDEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMDAzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTM1MS0zIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AxMzQ3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNWQzY2Y7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTM0OS02IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMzUuOTk5OTkpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iLTI3NiIKICAgICAgIHgyPSIxMTUuOTk5OTkiCiAgICAgICB5MT0iLTI3NiIKICAgICAgIHgxPSIyNy45OTk5OSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDExNTkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMDM4IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDc2MjEyMjQsLTAuNDQ0MTk3MjMsMC40NDQxOTcyNSwtMC4wNzYyMTIyMyw3Ny43MjU3OTQsMzMxLjgzODA3KSIKICAgICAgIHkyPSItMTI3LjM5OTE1IgogICAgICAgeDI9IjE1OC41MTgwMiIKICAgICAgIHkxPSItOTcuNjk4Mjg4IgogICAgICAgeDE9IjEyOC44MTcxNyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTEwMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwMDUiIC8+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDE2MDktNyIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImZpbGw6I2U3NDc0NztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gMjUyLDExNiAyOCwtMjggdiAtOCBoIC0zNiB2IDM2IHoiCiAgICAgICAgIGlkPSJwYXRoMTYxMS01IiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjcyIgogICAgICAgeDI9IjM0MCIKICAgICAgIHkxPSI3NiIKICAgICAgIHgxPSIzNDQiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsMTgwLDgzKSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTEzMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEzNTEtMyIgLz4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTA2MiIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSkiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Y2ZjVmNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBpZD0icmVjdDEwNjQiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaGVpZ2h0PSIxMDgiCiAgICAgICAgIHg9Ii0xMDgiCiAgICAgICAgIHk9Ii0xMTYiCiAgICAgICAgIHJ4PSI4IgogICAgICAgICByeT0iOCIKICAgICAgICAgY2xpcC1wYXRoPSJub25lIiAvPgogICAgPC9jbGlwUGF0aD4KICA8L2RlZnM+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkdOT01FIERlc2lnbiBUZWFtPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpzb3VyY2UgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyIgLz4KICAgICAgICA8ZGM6dGl0bGU+QWR3YWl0YSBJY29uIFRlbXBsYXRlPC9kYzp0aXRsZT4KICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgIDxyZGY6QmFnIC8+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxkYzpkYXRlIC8+CiAgICAgICAgPGRjOnJpZ2h0cz4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6cmlnaHRzPgogICAgICAgIDxkYzpwdWJsaXNoZXI+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZSAvPgogICAgICAgICAgPC9jYzpBZ2VudD4KICAgICAgICA8L2RjOnB1Ymxpc2hlcj4KICAgICAgICA8ZGM6aWRlbnRpZmllciAvPgogICAgICAgIDxkYzpyZWxhdGlvbiAvPgogICAgICAgIDxkYzpsYW5ndWFnZSAvPgogICAgICAgIDxkYzpjb3ZlcmFnZSAvPgogICAgICAgIDxkYzpkZXNjcmlwdGlvbiAvPgogICAgICAgIDxkYzpjb250cmlidXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6Y29udHJpYnV0b3I+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIj4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjUmVwcm9kdWN0aW9uIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNEaXN0cmlidXRpb24iIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNOb3RpY2UiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNBdHRyaWJ1dGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjRGVyaXZhdGl2ZVdvcmtzIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjU2hhcmVBbGlrZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0xNzIpIgogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTpub25lIgogICAgICAgaWQ9ImxheWVyMiI+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnOTIxMSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyI+CiAgICAgICAgPHJlY3QKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7ZmlsbDojZjBmMGYwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgICAgICBpZD0icmVjdDEzODA1IgogICAgICAgICAgIHdpZHRoPSIxMjgiCiAgICAgICAgICAgaGVpZ2h0PSIxMjgiCiAgICAgICAgICAgeD0iOS4yNjUxMzYyZS0wOCIKICAgICAgICAgICB5PSIxNzIiIC8+CiAgICAgICAgPGNpcmNsZQogICAgICAgICAgIGN4PSI2NC4wMDAwMzEiCiAgICAgICAgICAgY3k9IjIzNiIKICAgICAgICAgICByPSI1OS41MDQxMzEiCiAgICAgICAgICAgaWQ9ImNpcmNsZTI4OTIiCiAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MC4xO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTkwMDAwMDE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5OjAuOTkwMDAwMDEsIDAuOTkwMDAwMDE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHJ5PSI3LjkyOTI4ODkiCiAgICAgICAgICAgcng9IjguNzAxMDA0IgogICAgICAgICAgIHk9IjE4MC40OTQ5NiIKICAgICAgICAgICB4PSIyMC40OTUwMDciCiAgICAgICAgICAgaGVpZ2h0PSIxMTEuMDEwMDUiCiAgICAgICAgICAgd2lkdGg9Ijg3LjAwOTk4NyIKICAgICAgICAgICBpZD0icmVjdDI4OTQiCiAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MC4xO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTkwMDAwMDE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5OjAuOTkwMDAwMDEsIDAuOTkwMDAwMDE7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHJ5PSI3LjkyMzgwOTUiCiAgICAgICAgICAgcng9IjcuOTIzODA5NSIKICAgICAgICAgICB5PSIxODQuNDk1MjQiCiAgICAgICAgICAgeD0iMTIuNDk1MjY2IgogICAgICAgICAgIGhlaWdodD0iMTAzLjAwOTUyIgogICAgICAgICAgIHdpZHRoPSIxMDMuMDA5NTIiCiAgICAgICAgICAgaWQ9InJlY3QyODk2IgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjAuMTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk5MDAwMDAxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTowLjk5MDAwMDAxLCAwLjk5MDAwMDAxO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgICAgPHJlY3QKICAgICAgICAgICByeT0iOC43MDEwMDUiCiAgICAgICAgICAgcng9IjcuOTI5Mjg4OSIKICAgICAgICAgICB5PSIyMDAuNDk0OTYiCiAgICAgICAgICAgeD0iOC40OTUwMDY2IgogICAgICAgICAgIGhlaWdodD0iODcuMDEwMDQ4IgogICAgICAgICAgIHdpZHRoPSIxMTEuMDEwMDQiCiAgICAgICAgICAgaWQ9InJlY3QyODk4IgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjAuMTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk5MDAwMDAxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTowLjk5MDAwMDAxLCAwLjk5MDAwMDAxO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBpZD0icGF0aDI5MDAiCiAgICAgICAgICAgZD0iTSAyLjYyMDMwMTVlLTUsMjg4Ljk5OTk5IEggMTI4LjAwMDAzIgogICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtmaWxsOm5vbmU7c3Ryb2tlOiM2MmEwZWE7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI5Ij4KICAgICAgPHJlY3QKICAgICAgICAgY2xpcC1wYXRoPSJub25lIgogICAgICAgICByeT0iOCIKICAgICAgICAgcng9IjgiCiAgICAgICAgIHk9Ii0yOTQiCiAgICAgICAgIHg9Ii0xMDgiCiAgICAgICAgIGhlaWdodD0iMzAuMjUiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaWQ9InJlY3QxMTY3IgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiMxYTVmYjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEzLjcxODc2NTI2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbCIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsLTM3NCwyMDIuMDQ4MDgpIgogICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyMjEzKSIKICAgICAgICAgaWQ9Imc4MDA1IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IiAvPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjI1LDAsMCwwLjI1LC00MjQsMjAyLjA0ODA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMjIxMykiCiAgICAgICAgIGlkPSJnODAxNSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNSwwLDAsMC4yNSwtNDE0LDIwMi4wNDgwOCkiCiAgICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIyMTMpIgogICAgICAgICBpZD0iZzgwMjUiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjUsMCwwLDAuMjUsLTQwNCwyMDIuMDQ4MDgpIgogICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyMjEzKSIKICAgICAgICAgaWQ9Imc4MDM1IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZW5hYmxlLWJhY2tncm91bmQ6bmV3IiAvPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjI1LDAsMCwwLjI1LC0zOTQsMjAyLjA0ODA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMjIxMykiCiAgICAgICAgIGlkPSJnODA0NSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNSwwLDAsMC4yNSwtMzg0LDIwMi4wNDgwOCkiCiAgICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIyMTMpIgogICAgICAgICBpZD0iZzgwNTUiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoLTEpIgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMTU5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBpZD0icmVjdDExNTEiCiAgICAgICAgIHdpZHRoPSI4OCIKICAgICAgICAgaGVpZ2h0PSI0MCIKICAgICAgICAgeD0iLTEwOCIKICAgICAgICAgeT0iLTI5MiIKICAgICAgICAgcng9IjgiCiAgICAgICAgIHJ5PSI4IgogICAgICAgICBjbGlwLXBhdGg9Im5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGNsaXAtcGF0aD0ibm9uZSIKICAgICAgICAgcnk9IjgiCiAgICAgICAgIHJ4PSI4IgogICAgICAgICB5PSItMjg4IgogICAgICAgICB4PSItMTA4IgogICAgICAgICBoZWlnaHQ9IjEwOCIKICAgICAgICAgd2lkdGg9Ijg4IgogICAgICAgICBpZD0icmVjdDExNjEiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Y2ZjVmNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTMuNzE4NzY1MjY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKC0xKSIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQsMikiCiAgICAgICAgIGlkPSJnMTE1MyI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2Q1ZDNjZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgICAgZD0ibSAzMiwxODggYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHogbSA4LDAgYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHogbSA4LDAgYyAtMS4xMDQ1NywwIC0yLDAuODk1NDMgLTIsMiAwLDEuMTA0NTcgMC44OTU0MywyIDIsMiAxLjEwNDU3LDAgMiwtMC44OTU0MyAyLC0yIDAsLTEuMTA0NTcgLTAuODk1NDMsLTIgLTIsLTIgeiBtIDgsMCBjIC0xLjEwNDU3LDAgLTIsMC44OTU0MyAtMiwyIDAsMS4xMDQ1NyAwLjg5NTQzLDIgMiwyIDEuMTA0NTcsMCAyLC0wLjg5NTQzIDIsLTIgMCwtMS4xMDQ1NyAtMC44OTU0MywtMiAtMiwtMiB6IG0gOCwwIGMgLTEuMTA0NTcsMCAtMiwwLjg5NTQzIC0yLDIgMCwxLjEwNDU3IDAuODk1NDMsMiAyLDIgMS4xMDQ1NywwIDIsLTAuODk1NDMgMiwtMiAwLC0xLjEwNDU3IC0wLjg5NTQzLC0yIC0yLC0yIHoiCiAgICAgICAgICAgaWQ9InBhdGg5NTAtMy03IiAvPgogICAgICAgIDxjaXJjbGUKICAgICAgICAgICByPSIyIgogICAgICAgICAgIGN5PSIxOTAiCiAgICAgICAgICAgY3g9Ii0xMDQiCiAgICAgICAgICAgaWQ9InBhdGgxMTQ4IgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2Q1ZDNjZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBkPSJtIDExMiwxOTIgYSAyLDIgMCAwIDEgLTEuNzMyMDUsLTEgMiwyIDAgMCAxIDAsLTIgQSAyLDIgMCAwIDEgMTEyLDE4OCIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNkNWQzY2Y7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgICBpZD0iY2lyY2xlMTY3NzAiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICB0cmFuc2Zvcm09InNjYWxlKC0xLDEpIgogICAgICAgICAgIGQ9Im0gLTI0LDE5MiBhIDIsMiAwIDAgMSAtMS43MzIwNTEsLTEgMiwyIDAgMCAxIDAsLTIgQSAyLDIgMCAwIDEgLTI0LDE4OCIKICAgICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNkNWQzY2Y7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgICAgaWQ9ImNpcmNsZTE2NzcwLTMiIC8+CiAgICAgIDwvZz4KICAgICAgPHJlY3QKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMTMwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3BhaW50LW9yZGVyOm5vcm1hbDtlbmFibGUtYmFja2dyb3VuZDpuZXciCiAgICAgICAgIGlkPSJyZWN0MTA1Ni0zIgogICAgICAgICB3aWR0aD0iMzYiCiAgICAgICAgIGhlaWdodD0iMzYiCiAgICAgICAgIHg9IjI1MiIKICAgICAgICAgeT0iODgiCiAgICAgICAgIHJ4PSIxMS4yIgogICAgICAgICByeT0iMTEuMiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwwLjcxNDI4NTcxLDAuNzE0Mjg1NzEsMCwyNS4xNDI4NTgsODguMDAwMDA4KSIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTYwOS03KSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTA2MikiCiAgICAgICAgIGlkPSJwYXRoMTA0NyIKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxNzIpIgogICAgICAgICBkPSJNIDEwMCwxNiAzMiw4NCB2IDIwIGggMjIgbCA2OCwtNjggLTcuODY3MTksLTUuNzYxNzE5IC0wLjA3NDIsLTAuMDcyMjcgLTguMjI0NjEsLTguMjI0NjEgeiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEyLjQ4OTgyNzE2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtwYWludC1vcmRlcjpub3JtYWwiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDExMDMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxMi40ODk4MjcxNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgICAgICBkPSJtIDMyLDI3NiB2IC0yMCBsIDIwLDIwIHoiCiAgICAgICAgIGlkPSJwYXRoMTAzOCIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMDQyIgogICAgICAgICBkPSJtIDMxLjk5OTk5NiwyNzYgNGUtNiwtOCA4LDggeiIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lO29wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojNDI0MDQ4O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxMi40ODk4MjcxNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7cGFpbnQtb3JkZXI6bm9ybWFsO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMDQ0IgogICAgICAgICBkPSJtIDUwLDI3NCAtMTYsLTE2IDY3Ljk0Njk2LC02Ny45NDY5NSAxNiwxNiB6IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7ZmlsbDojZjZkMzJkO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjUwNjQzNzg0cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTA0NiIKICAgICAgICAgZD0iTSAzNy44ODc3NzIsMjYxLjg4Nzc2IDMyLDI1NiBsIDY4LjAwMDAxLC02Ny45OTk5OSA1LjgzNDcyLDUuOTQwOCB6IgogICAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmU7b3BhY2l0eToxO2ZpbGw6I2Y5ZjA2YjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4zNTgxMDU2cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtlbmFibGUtYmFja2dyb3VuZDpuZXciIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTA0OCIKICAgICAgICAgZD0iTSA0Ni4xMTIyNDYsMjcwLjExMjIzIDUyLDI3NiBsIDY4LC02OCAtNS45NDA4LC01LjgzNDcyIHoiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZTtvcGFjaXR5OjE7ZmlsbDojZTVhNTBhO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjM1ODEwNTZweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gedit,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"gedit.desktop\"\nLABEL oc.launch=\"gedit.Gedit\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Gedit\"\nLABEL oc.displayname=\"Gedit\"\nLABEL oc.path=\"/usr/bin/gedit\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/plain;\"\nLABEL oc.fileextensions=\"txt\"\nLABEL oc.legacyfileextensions=\"txt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gedit\"\nENV APPBIN \"/usr/bin/gedit\"\nENV APP \"/usr/bin/gedit\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gedit/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gedit/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Gedit

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gedit.d\n
"},{"location":"applications/gedit/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Gedit.d -t Gedit .\n
"},{"location":"applications/gedit/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Gedit > Gedit.json\ndocker image save Gedit -o Gedit.tar\nctr -n k8s.io images import Gedit.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gedit.json\n\n
"},{"location":"applications/gelemental/","title":"gElemental","text":""},{"location":"applications/gelemental/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/gelemental/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/gelemental/#ubuntu-packages","title":"Ubuntu packages","text":"
gelemental\n
"},{"location":"applications/gelemental/#path","title":"Path","text":"
/usr/bin/gelemental\n
"},{"location":"applications/gelemental/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/gelemental/#wm_class","title":"WM_CLASS","text":"
gelemental.Gelemental\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/gelemental/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/gelemental.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/gelemental/#json-dump","title":"JSON dump","text":"

json source file gelemental.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"gelemental\",\n    \"icon\": \"gelemental.svg\",\n    \"keyword\": \"gelemental\",\n    \"launch\": \"gelemental.Gelemental\",\n    \"name\": \"gElemental\",\n    \"path\": \"/usr/bin/gelemental\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"/usr/share/applications/gelemental.desktop\"\n}\n
"},{"location":"applications/gelemental/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output gelemental.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gelemental.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gelemental.d.3.0.json\n\n
"},{"location":"applications/gelemental/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gelemental && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gelemental.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZlcnNpb249IjEuMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiBpZD0ic3ZnMiIgdmlld0JveD0iMCAwIDQ4IDQ4Ij4KICA8ZGVmcyBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0NDciPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZjdiOTVkO3N0b3Atb3BhY2l0eToxIiBvZmZzZXQ9IjAiIGlkPSJzdG9wOTQ0OSIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZjdiOTVkO3N0b3Atb3BhY2l0eTowLjQwMDAwMDAxIiBvZmZzZXQ9IjEiIGlkPSJzdG9wOTQ1MSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5NDQxIj4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2I0NTkwMDtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDk0NDMiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2YyOGIyNjtzdG9wLW9wYWNpdHk6MC42NTg4MjM1NSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDk0NDUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MjAyMTAiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjUxNTQ2Mzg5IiBvZmZzZXQ9IjAiIGlkPSJzdG9wMjAyMTIiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MC4xNDQzMjk4OSIgb2Zmc2V0PSIwLjY5OTk5OTk5IiBpZD0ic3RvcDIwMjE4Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAiIG9mZnNldD0iMSIgaWQ9InN0b3AyMDIxNCIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3NjI3Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2VlZjFmNTtzdG9wLW9wYWNpdHk6MC43NjQ3MDU5IiBvZmZzZXQ9IjAiIGlkPSJzdG9wNzYyOSIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZWZmMmY2O3N0b3Atb3BhY2l0eTowIiBvZmZzZXQ9IjEiIGlkPSJzdG9wNzYzNSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3NjE5Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FkN2ZhODtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDc2MjEiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6I2FkN2ZhODtzdG9wLW9wYWNpdHk6MC40MDIwNjE4NSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDc2MjMiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NzU5NSI+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU1ZTg7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMCIgaWQ9InN0b3A3NTk3Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNlNGU1ZTg7c3RvcC1vcGFjaXR5OjAuNTQ1MDk4MDciIG9mZnNldD0iMSIgaWQ9InN0b3A3NTk5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDc1ODUiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNjUzNjZjO3N0b3Atb3BhY2l0eToxIiBvZmZzZXQ9IjAiIGlkPSJzdG9wNzU4NyIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzY1MDdjO3N0b3Atb3BhY2l0eTowLjc5MzgxNDQyIiBvZmZzZXQ9IjEiIGlkPSJzdG9wNzU4OSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ3Mzk3Ij4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzBmMjM0MTtzdG9wLW9wYWNpdHk6MSIgb2Zmc2V0PSIwIiBpZD0ic3RvcDczOTkiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzBmMjI0MTtzdG9wLW9wYWNpdHk6MC41MDE5NjA4MSIgb2Zmc2V0PSIxIiBpZD0ic3RvcDc0MDEiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50Njg4NSI+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNmMWYzZmY7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMCIgaWQ9InN0b3A2ODg3Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiM2MTY0NzE7c3RvcC1vcGFjaXR5OjAiIG9mZnNldD0iMSIgaWQ9InN0b3A2ODg5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDY2NTAiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjE3MjU0OTAyIiBvZmZzZXQ9IjAiIGlkPSJzdG9wNjY1MiIvPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojNzA5YWM4O3N0b3Atb3BhY2l0eTowLjYyNzQ1MSIgb2Zmc2V0PSIwLjY2NyIgaWQ9InN0b3A3NDEyIi8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiM2Zjk2ZGQ7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMSIgaWQ9InN0b3A2NjU0Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIxNy44MzQyNzgiIHkxPSI4LjkzODIwMTkiIHgyPSIzMy45ODI0MTQiIHkyPSIzOS4wMDE4NzMiIGlkPSJsaW5lYXJHcmFkaWVudDc2NjEiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBzcHJlYWRNZXRob2Q9InBhZCIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNC4yMzk3IiB5MT0iMzcuNjkyODg2IiB4Mj0iMjQuMjM5NyIgeTI9IjMzLjU1ODA1MiIgaWQ9ImxpbmVhckdyYWRpZW50NzY2MyIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzM5NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjUuNDY5NDA0IiB5MT0iNDAuNDcwNzQxIiB4Mj0iMjEuNTE5NTQzIiB5Mj0iMjEuODM0MDU1IiBpZD0ibGluZWFyR3JhZGllbnQ3NjY1IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTg1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNS40NDM4NTciIHkxPSIzNy42OTI4ODYiIHgyPSIyMy4wODcwMjciIHkyPSIzMy41NTgwNTIiIGlkPSJsaW5lYXJHcmFkaWVudDc2NjciIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc2MTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeDE9IjI2LjMwNTE3OCIgeTE9IjI0LjkxMzA2OSIgeDI9IjEyLjA1NTMzMSIgeTI9IjE0LjcyNTgwNCIgaWQ9ImxpbmVhckdyYWRpZW50NzY2OSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njg4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjYuOTgzNTk3IiB5MT0iMjYuNTA1MjEzIiB4Mj0iMzAuMjgwODk5IiB5Mj0iMjYuNTA1MjEzIiBpZD0ibGluZWFyR3JhZGllbnQ3NjcxIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkyNzMwNCwwLDAsMC44MzI4MTYsMS41NDIxMjIsNC42NzA5NTgpIi8+CiAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjIxLjc0NTUyNSIgY3k9IjIxLjk2NTQ5OCIgcj0iMi4zMjUxMzI2IiBmeD0iMjEuNzQ1NTI1IiBmeT0iMjEuOTY1NDk4IiBpZD0icmFkaWFsR3JhZGllbnQ3NjczIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NjI3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwNCwwLjIyOTE0OCwtMC42MjQ2NjksMi43MjYwNTUsMTMuNzIxMDUsLTQxLjI3NTk5KSIvPgogICAgPHJhZGlhbEdyYWRpZW50IGN4PSIxNC43NzIzMzQiIGN5PSI3NC4yMDk5MyIgcj0iNy44Mjg5ODI4IiBmeD0iMTQuNzcyMzM0IiBmeT0iNzQuMjA5OTMiIGlkPSJyYWRpYWxHcmFkaWVudDc2NzUiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMjEwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuNzY0Mjc4LDAuNTY2ODA0KSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIxNy44MzQyNzgiIHkxPSI4LjkzODIwMTkiIHgyPSIzMy45ODI0MTQiIHkyPSIzOS4wNjE3OTgiIGlkPSJsaW5lYXJHcmFkaWVudDg1NTIiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBzcHJlYWRNZXRob2Q9InBhZCIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNC4yMzk3IiB5MT0iMzcuNjkyODg2IiB4Mj0iMjQuMjM5NyIgeTI9IjMzLjU1ODA1MiIgaWQ9ImxpbmVhckdyYWRpZW50ODU1NCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzM5NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjUuNDY5NDA0IiB5MT0iNDAuNDcwNzQxIiB4Mj0iMjEuNTE5NTQzIiB5Mj0iMjEuODM0MDU1IiBpZD0ibGluZWFyR3JhZGllbnQ4NTU2IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5NDQxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIvPgogICAgPGxpbmVhckdyYWRpZW50IHgxPSIyNS40NDM4NTciIHkxPSIzNy42OTI4ODYiIHgyPSIyMy4wODcwMjciIHkyPSIzMy41NTgwNTIiIGlkPSJsaW5lYXJHcmFkaWVudDg1NTgiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk0NDciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeDE9IjI2LjMwNTE3OCIgeTE9IjI0LjkxMzA2OSIgeDI9IjEyLjA1NTMzMSIgeTI9IjE0LjcyNTgwNCIgaWQ9ImxpbmVhckdyYWRpZW50ODU2MCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njg4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMjYuOTgzNTk3IiB5MT0iMjYuNTA1MjEzIiB4Mj0iMzAuMjgwODk5IiB5Mj0iMjYuNTA1MjEzIiBpZD0ibGluZWFyR3JhZGllbnQ4NTYyIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NTk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkyNzMwNCwwLDAsMC44MzI4MTYsMS41NDIxMjIsNC42NzA5NTgpIi8+CiAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjIxLjc0NTUyNSIgY3k9IjIxLjk2NTQ5OCIgcj0iMi4zMjUxMzI2IiBmeD0iMjEuNzQ1NTI1IiBmeT0iMjEuOTY1NDk4IiBpZD0icmFkaWFsR3JhZGllbnQ4NTY0IiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3NjI3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwNCwwLjIyOTE0OCwtMC42MjQ2NjksMi43MjYwNTUsMTMuNzIxMDUsLTQxLjI3NTk5KSIvPgogICAgPHJhZGlhbEdyYWRpZW50IGN4PSIxNC43NzIzMzQiIGN5PSI3NC4yMDk5MyIgcj0iNy44Mjg5ODI4IiBmeD0iMTQuNzcyMzM0IiBmeT0iNzQuMjA5OTMiIGlkPSJyYWRpYWxHcmFkaWVudDg1NjYiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMjEwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuNzY0Mjc4LDAuNTY2ODA0KSIvPgogIDwvZGVmcz4KICA8ZyBpZD0ibGF5ZXIxIj4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDAuOTk5OTk3LDAsMCwxLDUuOTc5NWUtMiwwLjMzNjQpIiBpZD0iaWNvbiI+CiAgICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTgwMDk5LDAsMCwxLjE4MDA5OSwtMTUuMDU4NTEsLTkuMDI5Mjg1KSIgaWQ9InJvdW5kIj4KICAgICAgICA8cGF0aCBkPSJNIDE5LjkxMDEwMiwyMi4wMjcyNTIgQyAxOS45MTAxMDIsMjUuMDI3MjUyIDE1LjkxMDEwMiwyOC4wMjcyNTIgMTUuOTEwMTAyLDMzLjAyNzI1MiBDIDE1LjkxMDEwMiwzOC4wMjcyNTIgMTguOTEwMTAyLDQxLjAyNzI1MiAyNCw0MSBDIDI5LjA4OTg5OCw0MC45NzI3NDggMzEuOTEwMTAyLDM4LjAyNzI1MiAzMS45MTAxMDIsMzMuMDI3MjUyIEMgMzEuOTEwMTAyLDI4LjAyNzI1MiAyNy45MTAxMDIsMjUuMDI3MjUyIDI3LjkxMDEwMiwyMi4wMjcyNTIgQyAyNy45MTAxMDIsMTkuMDI3MjUyIDI4LDE1LjUwNDg2NCAyOCwxMiBDIDI4LDkgMzEsMTAgMzAsOSBDIDI5LDggMTksOCAxOCw5IEMgMTcsMTAgMjAsOC45OTk5OTk3IDIwLDEyIEMgMjAsMTUuNDUzNjA4IDE5LjkxMDEwMiwxOS4wMjcyNTIgMTkuOTEwMTAyLDIyLjAyNzI1MiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTUyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzhlOTE5ZTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtb3V0bGluZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjcwMjM4NCwwLDAsMS4wMTYwNCw2Ljk2Mzg1NywxLjg4Mzg4NikiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzBmMjM0MTtzdHJva2Utd2lkdGg6MC40MjU5ODkzOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO292ZXJmbG93OnZpc2libGUiIGlkPSJyb3VuZC1ib3R0b20iLz4KICAgICAgICA8cGF0aCBkPSJNIDMyIDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDE2LjQ3OTQwMSwzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAzMiAzNS42MjU0NjkgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMC40MzI3MDIsMCwwLDAuMzUwMTk5LDEzLjQ2NDI3LDkuMTkzMzcpIiBzdHlsZT0ib3BhY2l0eTowLjgzOTk5OTk5O2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojYmU1NTAwO3N0cm9rZS13aWR0aDoxLjYzMjY0NDM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiBpZD0icm91bmQtbGlxdWlkLXJpbSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMjAuMzIzNTA0LDIyLjQ3MTc3NiBDIDIwLjQ4NDM5MiwyNC4yNTUwMTcgMTUuOTYzMzM4LDI5LjAxMzEyMSAxNi4zNzIwNjYsMzMuNDY0MTc3IEMgMTYuNzgwNTA1LDM3LjkxMjA5MyAxOC44MTY0ODEsNDAuNjUwNTE1IDI0LjAwNjU0OCw0MC40NzA3NCBDIDI5LjI1NjU0LDQwLjI5MDk2NSAzMC42OTg4MTQsMzguODY5NzE0IDMxLjM4Mjg3MywzMy40OTk3MDYgQyAzMi4wNjc5MywyOC4xMjE4NjMgMjguMTU0NzMxLDI1LjY4NzgyMyAyNy43NjExODIsMjMuNDUzOTA5IEMgMjcuMzY4NzY3LDIxLjIyNjQzMSAyNy44NTg4MDEsMjEuODI1MDg2IDI2Ljk4MTI2LDIyLjA5NDU1MSBDIDI0Ljk3NDIxNiwyMi43MTA4NTIgMjIuMjg2NTAxLDIyLjcyNTk1NCAyMS4wNTY3NjYsMjIuMTQyODEgQyAyMC45MjY0NTMsMjIuMDgxMDE1IDIwLjE1OTk1NywyMC42NTkwNzQgMjAuMzIzNTA0LDIyLjQ3MTc3NiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC44NzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC43NTYwOTc1MyIgaWQ9InJvdW5kLWxpcXVpZCIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQwNzkxLDAsMCwwLjI2MzUzMiwxNC4wOTU4MiwxMi4yODA5NSkiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ4NTU4KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMjU4NTk3MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJyb3VuZC1saXF1aWQtc3VyZmFjZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMjAuNzYyNTk5LDIyLjE1MDA2NiBDIDIwLjc0NjM1OCwyNS4zNDY5ODcgMTYuNjg4MjU0LDI4LjUzNTE3OSAxNi44MDgxMDQsMzMuMDc4MjUxIEMgMTYuOTI3OTU0LDM3LjU2MTM5OCAxOS4yNjIzNDMsNDAuNDUyMTQ4IDI0LjA4NDM1LDQwLjA1OTkyNSBDIDI4Ljk2NjI4MiwzOS42Njc3MDIgMzAuNTUwNTkyLDM4LjY0NzU1OSAzMC45NzAwMjcsMzMuMTQ3MTAzIEMgMzEuMzkzNjg3LDI3LjU5MTI0IDI3LjcxODIzOSwyNi41ODQ4ODUgMjcuMTc5ODA4LDIyLjgwMzM5NCBDIDI2LjY1MDg4MywxOS4wODg2NTkgMjcuMTA2NzksMTYuMDY3NzEyIDI3LjEwNjc5LDEyLjc3NzY5NiBDIDI3LjEwNjc5LDkuOTYxNTk2MiAyNy42NDYxMTYsMTAuNDUwNjY5IDI3LjY0NjExNiw5Ljk4MTMxOSBDIDI3LjY0NjExNiw5LjA0MjYxOTEgMjkuMTMwMTEsOS43ODU4MDkyIDI5LjAyNzI4LDkuNDU1NDE2NCBDIDI4LjkyNzg5NCw5LjEzNjA5MTUgMTguODg4NDU4LDkuMDI3NjczMiAxOC42ODE2NDgsOS4zNjk5OTIgQyAxOC40ODE5NjUsOS43MDA1MTQ3IDIwLjQwMjczNCw5LjIyMjM5NDMgMjAuNDAyNzM0LDEwLjE2MTA5NSBDIDIwLjQwMjczNCwxMC42MzA0NDUgMjEuMDI5OTUzLDkuNzg1NzAyOCAyMC44ODIxMzUsMTIuNTk3OTIxIEMgMjAuNjQyNDM1LDE3LjE1ODE3NSAyMC43Nzg4NCwxOC45NTMxNzMgMjAuNzYyNTk5LDIyLjE1MDA2NiB6ICIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ4NTYwKTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjc1NjA5NzUzIiBpZD0icm91bmQtaW5saW5lIi8+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuMjk5NjI1LDAuNTk5MjUpIiBpZD0icm91bmQtbWFyay0xIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gMjkuMzQzNTMyLDI2LjA5OTIyMSBDIDI5LjM0MzUzMiwyNi4wOTkyMjEgMjguNTQ1MzkxLDI3LjExOTQ0MSAyNi44NDIzMTMsMjcuMzkwNjA0IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDg1NjIpO3N0cm9rZS13aWR0aDowLjQzNzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJyb3VuZC1pbm1hcmstMSIvPgogICAgICAgICAgPHBhdGggZD0iTSAyOS40Mjk0OTksMjUuMjM4NDI3IEMgMjkuNDI5NDk5LDI1LjIzODQyNyAyOC41Njg3ODcsMjYuNDYzNDUyIDI2LjczMjE5NywyNi43ODkwNSIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM2ODY4NzQ7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJyb3VuZC1vdXRtYXJrLTEiLz4KICAgICAgICA8L2c+CiAgICAgICAgPHBhdGggZD0iTSAxNy45MjM3MDEsOS40NzQ1NTYyIEMgMTcuOTIzNzAxLDkuNDc0NTU2MiAyMS43ODgxMzMsMTAuMzg1NTg1IDI0LjEyNzEyMSwxMC4zNjQzOTggQyAyNi40NjYxMDgsMTAuMzQzMjExIDI5Ljk5MTU1Miw5LjQ3NDU1NjIgMjkuOTkxNTUyLDkuNDc0NTU2MiIgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzhlOTE5ZTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtbGlwIi8+CiAgICAgICAgPHVzZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLjYyMjc4NywzLjI5ODU2MSkiIGlkPSJyb3VuZC1tYXJrLTIiIHg9IjAiIHk9IjAiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgeGxpbms6aHJlZj0iI3JvdW5kLW1hcmstMSIvPgogICAgICAgIDx1c2UgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMi41MTUyOTcsNy4wMjAwNjUpIiBpZD0icm91bmQtbWFyay0zIiB4PSIwIiB5PSIwIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHhsaW5rOmhyZWY9IiNyb3VuZC1tYXJrLTEiLz4KICAgICAgICA8cGF0aCBkPSJNIDE5LjkwNTMzNSwyNC4wMDQ0NjUgQyAxOC44ODYzNDYsMjcuMTA4NjQ5IDE4LjI5MjEzNCwyNy41NTA1NjIgMTkuNTk1NTA1LDI5LjA2MzY3MSBDIDIwLjUyODEwOSwzMC4xNDYzNDkgMjMuMjMyODQ3LDI4LjczOTQyNCAyNC4wMjk5NjIsMjQuMjA5NzM5IEMgMjQuOTExOTksMTkuMTk3NTMxIDIyLjkzMTE0MSwxNC4zNzI1ODggMjEuODEyNzM0LDEzLjQ4MzE0NiBDIDE5LjkxMDExMiwxMS45NzAwMzggMjEuNzY2MDI4LDE4LjMzNjE2NyAxOS45MDUzMzUsMjQuMDA0NDY1IHogIiBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50ODU2NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIiBpZD0icm91bmQtZ2xvc3MiLz4KICAgICAgICA8cGF0aCBkPSJNIDM5Ljg3NSA0Mi4wNjI1IEEgMTMuODEyNSA0LjQzNzUgMCAxIDEgIDEyLjI1LDQyLjA2MjUgQSAxMy44MTI1IDQuNDM3NSAwIDEgMSAgMzkuODc1IDQyLjA2MjUgeiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtMSkgbWF0cml4KDAuNzc1Nzc0LDAsMCwwLjcxMTg4NywzLjU3MTYzNCwxMS4xNjQ4NykiIHN0eWxlPSJvcGFjaXR5OjAuODtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDg1NjYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiBpZD0icm91bmQtc2hhZG93Ii8+CiAgICAgIDwvZz4KICAgICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xODAwOTksMCwwLDEuMTgwMDk5LDMuODIzMDYzLC00LjcwMTAzKSIgaWQ9ImZsYXNrIj4KICAgICAgICA8cGF0aCBkPSJNIDE4LDI2IEMgMTYsMjkgMTIuNSwzNy41IDE0LDM5IEMgMTUuNSw0MC41IDIzLDQxIDI0LDQxIEMgMjUsNDEgMzIuNSw0MC41IDM0LDM5IEMgMzUuNSwzNy41IDMyLDI5IDMwLDI2IEMgMjgsMjMgMjgsMTUuNTA0ODY0IDI4LDEyIEMgMjgsOSAzMSwxMCAzMCw5IEMgMjksOCAxOSw4IDE4LDkgQyAxNywxMCAyMCw4Ljk5OTk5OTcgMjAsMTIgQyAyMCwxNS40NTM2MDggMjAsMjMgMTgsMjYgeiAiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzY2MSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM4ZTkwOWY7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLW91dGxpbmUiLz4KICAgICAgICA8cGF0aCBkPSJNIDMyIDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDE2LjQ3OTQwMSwzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAzMiAzNS42MjU0NjkgeiIgdHJhbnNmb3JtPSJtYXRyaXgoMS4yMzY0NTIsMCwwLDEuMDE2MDQsLTUuOTIxODQ2LDEuODgzODg2KSIgc3R5bGU9Im9wYWNpdHk6MTtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDc2NjMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMGYyMzQxO3N0cm9rZS13aWR0aDowLjQyNTk4OTM5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgaWQ9ImZsYXNrLWJvdHRvbSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzIgMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMTYuNDc5NDAxLDM1LjYyNTQ2OSBBIDcuNzYwMjk5NyAyLjA2NzQxNTcgMCAxIDEgIDMyIDM1LjYyNTQ2OSB6IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjQ5NTMxMywwLDAsMC40NTEwNjIsMTEuOTU5MzUsNS4xNDEwODkpIiBzdHlsZT0ib3BhY2l0eTowLjgzOTk5OTk5O2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNWMzNTY2O3N0cm9rZS13aWR0aDoxLjAyNTg1OTcxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgaWQ9ImZsYXNrLWxpcXVpZC1yaW0iLz4KICAgICAgICA8cGF0aCBkPSJNIDE4LjAzNDY4NiwyNi44MDk3MTQgQyAxNi4zOTk3MjcsMjkuMzU5MDY3IDEzLjA5OTY0NSwzNy40MjQ5OSAxNC4zMjI5NDgsMzguODMzMDQgQyAxNS41NDYyNTEsNDAuMjQxMDkgMjMuMTkxMDEzLDQwLjQ3MDc0IDI0LjAwNjU0OCw0MC40NzA3NCBDIDI0LjgyMjA4Myw0MC40NzA3NCAzMi4zNzY3OTgsNDAuMzAxMDE1IDMzLjYwMDEwMSwzOC44OTI5NjUgQyAzNC44MjM0MDMsMzcuNDg0OTE1IDMxLjY2MzYxNywyOS4zNzM0NTEgMjkuODU4NTYsMjYuNjg5ODY0IEMgMjguMDQ5NzYsMjQuMDAwNzEzIDI4LjQwMjExMSwyMC44NDkyNzggMjcuODE3ODE2LDIxLjI5NzY0IEMgMjUuNzYzMzM3LDIyLjg3NDE1OSAyMC42OTY4NDgsMjEuOTg5OTM1IDIwLjEzNDA3NiwyMS4zNDgzMSBDIDE5LjY1NTMxOSwyMC44MDI0NzMgMTkuNjczNjczLDI0LjI1NDA3OSAxOC4wMzQ2ODYsMjYuODA5NzE0IHogIiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDc2NjUpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjg3NTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjc1NjA5NzUzIiBpZD0iZmxhc2stbGlxdWlkIi8+CiAgICAgICAgPHBhdGggZD0iTSAzMiAzNS42MjU0NjkgQSA3Ljc2MDI5OTcgMi4wNjc0MTU3IDAgMSAxICAxNi40Nzk0MDEsMzUuNjI1NDY5IEEgNy43NjAyOTk3IDIuMDY3NDE1NyAwIDEgMSAgMzIgMzUuNjI1NDY5IHoiIHRyYW5zZm9ybT0ibWF0cml4KDAuNDYyNTM5LDAsMCwwLjMzNzUzNSwxMi43NjU4OSw5LjIxMTA0NCkiIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3NjY3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMjU4NTk3MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJmbGFzay1saXF1aWQtc3VyZmFjZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMTguNDk0NDIxLDI2LjgwODE0MyBDIDE2LjczNjQwMSwyOS40OTcyOTQgMTMuNDU2OTkxLDM3LjQyMDE4OSAxNC43Njk0NDUsMzguNjA5MDk5IEMgMTYuMDQzNTI4LDM5Ljc2MzI1MSAyMy4yNjg4MTUsNDAuMDU5OTI1IDI0LjA4NDM1LDQwLjA1OTkyNSBDIDI0Ljg5OTg4NSw0MC4wNTk5MjUgMzEuODkxOTMsMzkuOTgyNjE0IDMzLjIxNjc5MiwzOC42MjUzNDQgQyAzNC41MTk2NzcsMzcuMjkwNTkgMzAuMzgwMTIyLDI3LjY2MjEyNiAyOS41MzYxNCwyNi45MDI2MDQgQyAyOS4xMjc5ODIsMjYuNTM1MjkyIDI3LjcwODE2NiwyMi41MzE2ODYgMjcuNTU4MzI3LDIwLjY5Njg2MyBDIDI3LjMwODQ0OSwxNy42MzcwMzMgMjcuMTA2NzksMTQuNDIyNzA0IDI3LjEwNjc5LDEyLjc3NzY5NiBDIDI3LjEwNjc5LDkuOTYxNTk2MiAyNy42NDYxMTYsMTAuNDUwNjY5IDI3LjY0NjExNiw5Ljk4MTMxOSBDIDI3LjY0NjExNiw5LjA0MjYxOTEgMjkuMjg5ODAyLDkuOTMxOTU2NSAyOS4xNTMyNDQsOS41MDU1MzkgQyAyOS4wMjQwODEsOS4xMDIyMTM0IDE4LjY1NjQ1Myw5LjAzNzcxMjMgMTguNTgwMDg4LDkuNTQ3MTczNCBDIDE4LjQ5OTk5OSwxMC4wODE0NzkgMjAuNDAyNzM0LDkuMjIyMzk0MyAyMC40MDI3MzQsMTAuMTYxMDk1IEMgMjAuNDAyNzM0LDEwLjYzMDQ0NSAyMC44ODIxMzUsOS43ODE4MjA2IDIwLjg4MjEzNSwxMi41OTc5MjEgQyAyMC44ODIxMzUsMTQuMjE4ODcyIDIwLjg1NTYyNiwxNy40NDg1MzQgMjAuNDgwNDMyLDIwLjI1NjY3NSBDIDIwLjEwNTIzOSwyMy4wNjQ4MTcgMTkuMzgxMzYsMjUuNDUxNDM5IDE4LjQ5NDQyMSwyNi44MDgxNDMgeiAiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzY2OSk7c3Ryb2tlLXdpZHRoOjAuODQ3Mzg3Nzk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlci1zdGFydDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC43NTYwOTc1MyIgaWQ9ImZsYXNrLWlubGluZSIvPgogICAgICAgIDxnIGlkPSJmbGFzay1tYXJrLTEiPgogICAgICAgICAgPHBhdGggZD0iTSAyOS4zNDM1MzIsMjYuMDk5MjIxIEMgMjkuMzQzNTMyLDI2LjA5OTIyMSAyOC41NDUzOTEsMjcuMTE5NDQxIDI2Ljg0MjMxMywyNy4zOTA2MDQiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzY3MSk7c3Ryb2tlLXdpZHRoOjAuNDM3NTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLWlubWFyay0xIi8+CiAgICAgICAgICA8cGF0aCBkPSJNIDI5LjQyOTQ5OSwyNS4yMzg0MjcgQyAyOS40Mjk0OTksMjUuMjM4NDI3IDI4LjU2ODc4NywyNi40NjM0NTIgMjYuNzMyMTk3LDI2Ljc4OTA1IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzVmNWY2OTtzdHJva2Utd2lkdGg6MC44NDczODc3OTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyLXN0YXJ0Om5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgaWQ9ImZsYXNrLW91dG1hcmstMSIvPgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aCBkPSJNIDE3LjkyMzcwMSw5LjQ3NDU1NjIgQyAxNy45MjM3MDEsOS40NzQ1NTYyIDIxLjc4ODEzMywxMC4zODU1ODUgMjQuMTI3MTIxLDEwLjM2NDM5OCBDIDI2LjQ2NjEwOCwxMC4zNDMyMTEgMjkuOTkxNTUyLDkuNDc0NTU2MiAyOS45OTE1NTIsOS40NzQ1NTYyIiBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojOGU5MTllO3N0cm9rZS13aWR0aDowLjg0NzM4Nzc5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJmbGFzay1saXAiLz4KICAgICAgICA8dXNlIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuODIwMjI1LDMuODIwMjI1KSIgaWQ9ImZsYXNrLW1hcmstMiIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB4bGluazpocmVmPSIjZmxhc2stbWFyay0xIi8+CiAgICAgICAgPHVzZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzLjU2OTM0Nyw3LjUyNDA2NykiIGlkPSJmbGFzay1tYXJrLTMiIHg9IjAiIHk9IjAiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgeGxpbms6aHJlZj0iI2ZsYXNrLW1hcmstMSIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMTkuMjY3ODQ4LDIzLjgyNTk2OSBDIDE4LjI0ODg1OSwyNi45MzAxNTMgMTguMjkyMTM0LDI3LjU1MDU2MiAxOS41OTU1MDUsMjkuMDYzNjcxIEMgMjAuNTI4MTA5LDMwLjE0NjM0OSAyMy4yMzI4NDcsMjguNzM5NDI0IDI0LjAyOTk2MiwyNC4yMDk3MzkgQyAyNC45MTE5OSwxOS4xOTc1MzEgMjIuOTMxMTQxLDE0LjM3MjU4OCAyMS44MTI3MzQsMTMuNDgzMTQ2IEMgMTkuOTEwMTEyLDExLjk3MDAzOCAyMS4xMjg1NDEsMTguMTU3NjcxIDE5LjI2Nzg0OCwyMy44MjU5NjkgeiAiIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ3NjczKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJmbGFzay1nbG9zcyIvPgogICAgICAgIDxwYXRoIGQ9Ik0gMzkuODc1IDQyLjA2MjUgQSAxMy44MTI1IDQuNDM3NSAwIDEgMSAgMTIuMjUsNDIuMDYyNSBBIDEzLjgxMjUgNC40Mzc1IDAgMSAxICAzOS44NzUgNDIuMDYyNSB6IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0wLjcpIG1hdHJpeCgwLjk1Nzc0NiwwLDAsMC44Nzg4NzMsLTEuMTcxMDA0LDQuMTQxMDI4KSIgc3R5bGU9Im9wYWNpdHk6MC44O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NzY3NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIGlkPSJmbGFzay1zaGFkb3ciLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"gelemental,gelemental\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"gelemental.desktop\"\nLABEL oc.launch=\"gelemental.Gelemental\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"gElemental\"\nLABEL oc.displayname=\"gElemental\"\nLABEL oc.path=\"/usr/bin/gelemental\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"gElemental\"\nENV APPBIN \"/usr/bin/gelemental\"\nENV APP \"/usr/bin/gelemental\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gelemental/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gelemental/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application gElemental

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gElemental.d\n
"},{"location":"applications/gelemental/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f gElemental.d -t gElemental .\n
"},{"location":"applications/gelemental/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect gElemental > gElemental.json\ndocker image save gElemental -o gElemental.tar\nctr -n k8s.io images import gElemental.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gElemental.json\n\n
"},{"location":"applications/geogebra/","title":"Geogebra","text":""},{"location":"applications/geogebra/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/geogebra/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/geogebra/#ubuntu-packages","title":"Ubuntu packages","text":"
geogebra\n
"},{"location":"applications/geogebra/#path","title":"Path","text":"
/usr/bin/geogebra\n
"},{"location":"applications/geogebra/#file-extensions","title":"File extensions","text":"

\"ggb;ggt\"

"},{"location":"applications/geogebra/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"ggb;ggt\"

"},{"location":"applications/geogebra/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/geogebra/#wm_class","title":"WM_CLASS","text":"
geogebra-GeoGebra.geogebra-GeoGebra\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/geogebra/#json-dump","title":"JSON dump","text":"

json source file geogebra.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"geogebra\",\n    \"icon\": \"geogebra.svg\",\n    \"installrecommends\": true,\n    \"keyword\": \"geogebra,math\",\n    \"launch\": \"geogebra-GeoGebra.geogebra-GeoGebra\",\n    \"name\": \"Geogebra\",\n    \"path\": \"/usr/bin/geogebra\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"fileextensions\": \"ggb;ggt\",\n    \"legacyfileextensions\": \"ggb;ggt\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktop\": \"geogebra.desktop\"\n}\n
"},{"location":"applications/geogebra/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output geogebra.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/geogebra.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @geogebra.d.3.0.json\n\n
"},{"location":"applications/geogebra/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y geogebra && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"geogebra.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHZlcnNpb249IjEuMCIKICAgd2lkdGg9IjI4IgogICBoZWlnaHQ9IjI4IgogICBpZD0ic3ZnMiIKICAgdmlld0JveD0iMCAwIDI4IDI4Ij4KICA8ZGVzYwogICAgIGlkPSJkZXNjNiI+Q3JlYXRvcjogRnJlZUhFUCBHcmFwaGljczJEIERyaXZlciBQcm9kdWNlcjogZ2VvZ2VicmEuZC5hIFJldmlzaW9uOiAxLjEwICBTb3VyY2U6ICBEYXRlOiBTYW1zdGFnLCA3LiBBdWd1c3QgMjAxMCAxNDowNiBVaHIgTUVTWjwvZGVzYz4KICA8ZGVmcwogICAgIGlkPSJkZWZzODUiIC8+CiAgPGcKICAgICBpZD0iZzI0OTgiPgogICAgPGcKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuNTA4ODg3NywwLDAsMS41MDg4ODc3LC0wLjQ1NTEwNDQsMC42NzA0MDU2KSIKICAgICAgIGlkPSJsYXllcjAiCiAgICAgICBzdHlsZT0ic3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MCI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC41NjY5MjkxLDAuNTY2OTI5MSkiCiAgICAgICAgIGlkPSJnMTgiPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9ImcyMCIKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjY2NjY2O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1vcGFjaXR5OjEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gNC42NTMwNDUsMjEuNzE1Mzk4IGMgMi41NTI4NzIzLDUuMzM3NzQ2IDkuOTk5OTMxLDcuMDkyOTM2IDE2LjYzMzQ3MSwzLjkyMDMyOCA2LjYzMzU0LC0zLjE3MjYwOSA5Ljk0MTU3NSwtMTAuMDcxNjE1IDcuMzg4NzAzLC0xNS40MDkzNjEgQyAyNi4xMjIzNDcsNC44ODg2MTg1IDE4LjY3NTI4OCwzLjEzMzQyODEgMTIuMDQxNzQ4LDYuMzA2MDM3MSA1LjQwODIwNzYsOS40Nzg2NDYxIDIuMTAwMTcyNywxNi4zNzc2NTIgNC42NTMwNDUsMjEuNzE1Mzk4IHoiCiAgICAgICAgICAgICBpZD0icGF0aDIyIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzI0Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMjYiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxOSw1IGMgMCwxLjY1Njg1NDIgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDU4IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDI4IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzMwIj4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMzIiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxOSw1IGMgMCwxLjY1Njg1NDIgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDU4IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDM0IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzM2Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnMzgiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSA4LDEzIGMgMCwxLjY1Njg1NCAtMS4zNDMxNDU4LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0MiwwIDMsMS4zNDMxNDYgMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDQwIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzQyIj4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnNDQiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSA4LDEzIGMgMCwxLjY1Njg1NCAtMS4zNDMxNDU4LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0MiwwIDMsMS4zNDMxNDYgMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDQ2IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzQ4Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnNTAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6Izk5OTlmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAxMiwyNiBjIDAsMS42NTY4NTQgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQyLDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ1OCwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NiAzLDMgeiIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC41NjY5MjkxLDAuNTY2OTI5MSkiCiAgICAgICAgIGlkPSJnNTQiPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9Imc1NiIKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utb3BhY2l0eToxIj4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJtIDEyLDI2IGMgMCwxLjY1Njg1NCAtMS4zNDMxNDYsMyAtMywzIC0xLjY1Njg1NDIsMCAtMywtMS4zNDMxNDYgLTMsLTMgMCwtMS42NTY4NTQgMS4zNDMxNDU4LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg1OCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc2MCI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzYyIgogICAgICAgICAgIHN0eWxlPSJmaWxsOiM5OTk5ZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjcsMjQgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg2NCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc2NiI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzY4IgogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1vcGFjaXR5OjEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjcsMjQgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0IDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ2IDMsMyB6IgogICAgICAgICAgICAgaWQ9InBhdGg3MCIgLz4KICAgICAgICA8L2c+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjU2NjkyOTEsMC41NjY5MjkxKSIKICAgICAgICAgaWQ9Imc3MiI+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzc0IgogICAgICAgICAgIHN0eWxlPSJmaWxsOiM5OTk5ZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Im0gMzIsMTEgYyAwLDEuNjU2ODU0IC0xLjM0MzE0NiwzIC0zLDMgLTEuNjU2ODU0LDAgLTMsLTEuMzQzMTQ2IC0zLC0zIDAsLTEuNjU2ODU0MiAxLjM0MzE0NiwtMyAzLC0zIDEuNjU2ODU0LDAgMywxLjM0MzE0NTggMywzIHoiCiAgICAgICAgICAgICBpZD0icGF0aDc2IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuNTY2OTI5MSwwLjU2NjkyOTEpIgogICAgICAgICBpZD0iZzc4Ij4KICAgICAgICA8ZwogICAgICAgICAgIGlkPSJnODAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0ibSAzMiwxMSBjIDAsMS42NTY4NTQgLTEuMzQzMTQ2LDMgLTMsMyAtMS42NTY4NTQsMCAtMywtMS4zNDMxNDYgLTMsLTMgMCwtMS42NTY4NTQyIDEuMzQzMTQ2LC0zIDMsLTMgMS42NTY4NTQsMCAzLDEuMzQzMTQ1OCAzLDMgeiIKICAgICAgICAgICAgIGlkPSJwYXRoODIiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"geogebra,geogebra,math\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"geogebra-GeoGebra.geogebra-GeoGebra\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Geogebra\"\nLABEL oc.displayname=\"Geogebra\"\nLABEL oc.path=\"/usr/bin/geogebra\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"ggb;ggt\"\nLABEL oc.legacyfileextensions=\"ggb;ggt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Geogebra\"\nENV APPBIN \"/usr/bin/geogebra\"\nENV APP \"/usr/bin/geogebra\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/geogebra/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/geogebra/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Geogebra

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Geogebra.d\n
"},{"location":"applications/geogebra/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Geogebra.d -t Geogebra .\n
"},{"location":"applications/geogebra/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Geogebra > Geogebra.json\ndocker image save Geogebra -o Geogebra.tar\nctr -n k8s.io images import Geogebra.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Geogebra.json\n\n
"},{"location":"applications/gephi/","title":"gephi","text":""},{"location":"applications/gephi/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk.java.gephi

"},{"location":"applications/gephi/#display-name","title":"Display name","text":"

\"Gephi\"

"},{"location":"applications/gephi/#path","title":"path","text":"

\"/opt/gephi-0.9.1/bin/gephi\"

"},{"location":"applications/gimagereader/","title":"gimagereader","text":""},{"location":"applications/gimagereader/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk.gimagereader

"},{"location":"applications/gimagereader/#display-name","title":"Display name","text":"

\"OCR-gimagereader\"

"},{"location":"applications/gimagereader/#path","title":"path","text":"

\"/usr/bin/gimagereader-gtk\"

"},{"location":"applications/gimagereader/#mime-type","title":"Mime Type","text":"

\"image/bmp;image/jpeg;image/gif;image/png;image/tiff;image/x-bmp;image/x-ico;image/x-png;image/x-pcx;image/x-tga;image/xpm;image/svg+xml;\"

"},{"location":"applications/gimagereader/#file-extensions","title":"File extensions","text":"

\"bmp;jpeg;png,tiff,tga\"

"},{"location":"applications/gimp/","title":"Gimp","text":""},{"location":"applications/gimp/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/gimp/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/gimp/#alpine-packages","title":"Alpine packages","text":"
gimp gimp-lang\n
"},{"location":"applications/gimp/#path","title":"Path","text":"
/usr/bin/gimp\n
"},{"location":"applications/gimp/#mimetype","title":"Mimetype","text":"
image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\n
"},{"location":"applications/gimp/#file-extensions","title":"File extensions","text":"

\"dds\"

"},{"location":"applications/gimp/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"dds\"

"},{"location":"applications/gimp/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/gimp/#wm_class","title":"WM_CLASS","text":"
gimp.Gimp\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/gimp/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/gimp.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/gimp/#json-dump","title":"JSON dump","text":"

json source file gimp.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"gimp gimp-lang\",\n    \"icon\": \"circle_gimp.svg\",\n    \"keyword\": \"gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\",\n    \"launch\": \"gimp.Gimp\",\n    \"name\": \"Gimp\",\n    \"path\": \"/usr/bin/gimp\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\",\n    \"fileextensions\": \"dds\",\n    \"legacyfileextensions\": \"dds\",\n    \"desktopfile\": \"/usr/share/applications/gimp.desktop\",\n    \"usedefaultapplication\": false,\n    \"quick\": true\n}\n
"},{"location":"applications/gimp/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output gimp.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gimp.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gimp.d.3.0.json\n\n
"},{"location":"applications/gimp/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update gimp gimp-lang\nLABEL oc.icon=\"circle_gimp.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iR2ltcCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iNTIwLjAzIiB4Mj0iNTIwLjAzIiB5MT0iMi4wMDc4IiB5Mj0iMTAyNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYzMzYgMCAwIC4wNjMzNjMgLS40NDM3OCAtLjQ0NDc1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI1MjIuNTMiIHgyPSI1MjIuNTMiIHkxPSIyNzUuMDMiIHkyPSI3NTUuMDMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS44NjU4IC0xLjEwNzEpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2YjRmMzUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzIzMjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDMxMzAzIiB5PSItLjA0MjM1NSIgd2lkdGg9IjEuMDYyNiIgaGVpZ2h0PSIxLjA4NDciIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjguMzQ3NDgwOSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xNzAzNTMiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MDkiIHg9Ii0uMDkzOTExIiB5PSItLjEyNzA2IiB3aWR0aD0iMS4xODc4IiBoZWlnaHQ9IjEuMjU0MSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS41OTY3NDM0Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS4zODQxIC42NDk4NCkiIGQ9Im04MjMgMjk5Ljg3Yy00LjM0OC0xOS40NTMtOC42MDctMjQuMzczLTguNjA3LTI0LjM3M3MtOC42NDcgMTcuOTkyLTIxLjg2OCAzOS41OTRjLTEzLjIyMiAyMS42NDMtMzQuMzU3IDQ0LjYyNS01Mi42MTMgNTkuMDc0LTIzLjc1IDE4LjgzOC00Ny44NDYgMzAuOTQ1LTY5LjE3NCAzNy45NDEtMjEuMjkxIDcuMDMzLTM4LjY2NCAxMS4wNjYtMzguNjY0IDExLjA2NiA5LjM3NyA3LjYxMyAxOS40MDggMTcuMDY4IDI0Ljg2NCAyNy45MSA1LjQxNiAxMC44MDEgOC41MzMgMjIuOTgyIDguNTMzIDM2LjI0NCAwIDI1Ljk0NS05Ljk5NCA0OC4yNzctMjYuMjg1IDY0LjE1Mi0xNi4yOTkgMTUuODM2LTM4LjkzNCAyNS4yMTUtNjQuMjYgMjUuMjE1LTMwLjc0NiAwLTU1LjA2OS05LjE0OC03MS43MTEtMjQuNzkzLTE2LjY0MS0xNS42ODUtMjUuNTk4LTM3LjktMjUuNTk4LTY0LjAzOSAwLTkuOTUxIDEuNTAyLTE5LjA5OSA0LjIyNy0yNy40MDIgMi43MzItOC4yNjQgNi42ODktMTUuNzIzIDExLjY0OC0yMi4yNTggMCAwLTcuMzgxIDEtMjAuNTIxLTEuNzY0LTEzLjEwOC0yLjc3My0zMi4wNTMtOS4zNDUtNTUuMTQ5LTI0LjQ0Ny0xOS42NDItMTIuODM4LTM2Ljc3OS0zMC43ODctNDkuMDM5LTQ1LjUwOC0xMi4yMjQtMTQuNzIzLTE5LjU1OC0yNi4yNTgtMTkuNTU4LTI2LjI1OHMwLjcyOSA1OS4zODcgMC40NTcgOTIuMjU0Yy0wLjY4OCA5MS4wMi05LjkxNCA5MS41OTgtOS45MTQgOTEuNTk4LTExLjIyMy0xNS44NzktMjMuMzI3LTI5LjU2My0zNy43OC0zOS4yODUtMTQuNDg0LTkuNzI3LTMxLjMyLTE1LjQ0OS01Mi4wMzMtMTUuNDEyLTI1LjA1NyAwLjAzNy0zOS4wODQgOS4zMzYtNDcuMDc2IDIyLjI1NC03Ljk5NiAxMi45NTMtOS45NTUgMjkuNDgtMTAuNzYyIDQzLjk3Mi0xLjQ2MSAyNC45ODMgMTEuMTQ1IDU2LjI3MSAzMS45MzYgODEuMjU2IDIwLjgyNiAyNC45ODMgNDkuODgxIDQzLjcwNSA4MS40MzYgNDMuNjY4IDIuMjI5IDAgNC42MTItMC4xNTQgNy4wMzMtMC40NjMgMi40MTgtMC4zNDcgNC44ODEtMC44MDggNy40MTgtMS40NjEgMCAwIDcuMTA4IDYuODQgMjMuNDQgMTcuMzM2IDE2LjMzNCAxMC41MjggNDEuODkgMjQuNjc2IDc4Ljc4NSAzOS4zNTggMTkuMTM5IDcuNjA3IDM5LjU0NSAxNS42NDIgNjUuMDYzIDIxLjkwNCAyNS41MTggNi4yNjggNTYuMTA2IDEwLjc2OCA5NS42MTQgMTEuMjY4IDU0LjAzNSAwLjY1MiA5Mi41ODQtMTEuMjY4IDEyMS4zMy0yOC41NjMgMjguNzg3LTE3LjI5NyA0Ny44MTItNDAuMDEgNjIuODM4LTYwLjk5NCAyNy4xMzEtMzcuOTc5IDQzLjQ2NS04My41MjcgNTIuOTU3LTEyNy43NyA5LjQ5NC00NC4yMDMgMTIuMTg3LTg3LjEwMyAxMi4wMzEtMTE5LjczLTAuMjcxLTU4LjExNi00LjY5My05Mi4wOTUtOC45OTQtMTExLjU0em0tNTc4LjU0IDI0Mi44OGMtMTYuOTg2IDAtMzAuNzQ0LTEzLjc2LTMwLjc0NC0zMC43NSAwLTE2Ljk4OCAxMy43NTgtMzAuNzUgMzAuNzQ0LTMwLjc1IDE2Ljk1MSAwIDMwLjc0NCAxMy43NjIgMzAuNzQ0IDMwLjc1IDAgMTYuOTktMTMuNzkzIDMwLjc1LTMwLjc0NCAzMC43NXptMTY1LjkxIDE1LjkxNGMtNDIuMDA0LTAuMDQxLTU4LjkxOC0yNy40MDYtNTguNTctNTEuNzM2IDAuMzg3LTI2LjYgMTEuNTI5LTU5LjYxNiA1OS4wNy01OS4yNzEgMjguOTc1IDAuMTk1IDU2LjUzNSAyNS40ODQgNTYuMzc3IDU1LjkyNC0wLjE1IDI3LjU2My0yMy44NjcgNTUuMDgzLTU2Ljg3NyA1NS4wODN6bTI3Mi4xNyA5Ni4zNTljLTIuMDc2IDUuNjU1LTQuOTkyIDkuNjA4LTQuOTkyIDkuNjA4czEuMTEzLTYuMTg0IDEuMTg5LTEwLjY4NGMwLjAzNi00LjY0OC0xLjE4OS0xMC4zMzgtMS4xODktMTAuMzM4cy0zLjI2NiA2Ljk1NS0xNC43OTkgMTMuOTUxYy0xMS41MjcgNi45NTctMzEuNjY2IDE1LjY4Mi02NC43OTMgMTUuNjgyLTI4LjM2MyAwLTQzLjk2My00LjMwMy01Mi43NjctNi44MDEtOC44NC0yLjUzOS0xMC41NjUtNS4wMzUtMTAuNTY1LTUuMDM1czIyLjMyNiAyLjEwOSA0NS4zMTEgMC44NGMzMC44MTgtMS42NDggNDcuOTItNy45OTQgNjYuNTk3LTE1LjAyMyAxMC44MDMtNC4xMTIgMjMuNTYzLTE0LjY0NiAyMy41NjMtMTQuNjQ2cy00LjA3OC00LjM0Mi05LjcyNy04LjgwM2MtNS4zMDItNC4xMTEtMTIuMzczLTguNDk0LTEyLjM3My04LjQ5NHM2LjE4OCAwLjcyOSAxMy41MjQgMy42MTVjNy4zNDIgMi45MTggMTUuODc1IDcuOTU1IDIwLjU2IDE2LjUyNiAzLjY1MSA2LjY5IDIuNDk4IDEzLjk1NCAwLjQ2MSAxOS42MDJ6IiBmaWx0ZXI9InVybCgjZSkiIG9wYWNpdHk9Ii4yIi8+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtMS4zODQxIC42NDk4NCkiIGQ9Im01ODguMyA0NjMuOTZjLTIyLjI1MiAwLTQwLjI3NiAxNy44MzQtNDAuMjc2IDM5LjgyIDAgMjEuOTQ2IDE4LjAyNCAzOS43OCA0MC4yNzYgMzkuNzhzNDAuMjczLTE3LjgzNCA0MC4yNzMtMzkuNzhjMC0yMS45ODYtMTguMDIxLTM5LjgyLTQwLjI3My0zOS44MnptMC45OTggNTYuMDc4Yy04LjQ5NCAwLTE1LjM3MS02Ljg3NS0xNS4zNzEtMTUuMzcxIDAtOC40NTcgNi44NzctMTUuMzc1IDE1LjM3MS0xNS4zNzUgOC40NTcgMCAxNS4zNzEgNi45MTggMTUuMzcxIDE1LjM3NSAwIDguNDk2LTYuOTE0IDE1LjM3MS0xNS4zNzEgMTUuMzcxeiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMiIvPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLTEuMzg0MSAuNjQ5ODQpIiBkPSJtNDIwLjQzIDQ4NS43NmMtMTQuMzcxIDAtMjYuMDE4IDExLjg3NS0yNi4wMTggMjYuNTIxIDAgMTQuNjg2IDExLjY0NiAyNi41NjMgMjYuMDE4IDI2LjU2MyAxNC4zMzQgMCAyNS45ODItMTEuODc3IDI1Ljk4Mi0yNi41NjMgMC0xNC42NDYtMTEuNjQ4LTI2LjUyMS0yNS45ODItMjYuNTIxem0wLjM4MiAzNi4wNTFjLTQuMjI4IDAtNy42ODctMy40Mi03LjY4Ny03LjY4NiAwLTQuMjI4IDMuNDU5LTcuNjg4IDcuNjg3LTcuNjg4IDQuMjY4IDAgNy42ODggMy40NjEgNy42ODggNy42ODggMCA0LjI2Ni0zLjQyIDcuNjg2LTcuNjg4IDcuNjg2eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMiIvPgogPC9nPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzUxMyAwIDAgLjA2MzUxMyAtLjQ4NjcyIC0uNTUwNDgpIiBkPSJtNzI2LjEzIDkzLjE5OGMtOC42NzkxLTQuMzM5OC0xNy44MDctOC42Mjk2LTI3LjE4NC0xMi42Ny04LjU3OTMtMy43NDEyLTE3LjEwOS03LjE4My0yNS44MzgtMTAuMzc2LTQxLjk5OS0xNS43MTMtODQuMDQ3LTI1LjI5LTEyNi4xNS0yOC41ODMtNjkuMjMzLTUuNTg2OC0xMzguNjIgNS4zODczLTIwOC40IDMyLjkyMi0yMy4zOTQgOS4yNzgxLTQ1LjU0IDE5Ljg1My02Ni40NCAzMS44MjUtNDEuMjAxIDIzLjY0NC03Ny40MTMgNTIuNTI2LTEwOC4yNCA4Ni40OTZxLTUxLjQ3NiA1Ni40NjctODQuMzQ3IDEzMi4yNGMtMjAuMjAxIDQ2LjU0LTMyLjc3MSA5My4yMy0zNy43NTkgMTM5LjMyLTAuNDQ4OTIgNC40Mzk1LTAuODQ3OTYgOC41Nzk3LTEuMTk3MSAxMi43Mi0zLjY5MTEgNDUuNDkzLTAuMTk5NTIgOTAuNTM2IDEwLjIyNSAxMzUuNjggNS42ODYzIDI0LjQ5MiAxMy4yMTggNDguNjM1IDIyLjY5NSA3Mi42NzggMjcuNjMzIDY5Ljc4NSA2Ny4wODggMTI4LjEgMTE4LjI2IDE3NC42OSAzMS4zNzQgMjguNTgzIDY3LjAzOCA1Mi43MjYgMTA3LjA0IDcyLjYyOSAwLjE0OTY0IDAuMDQ5OSAwLjI0OTQgMC4wOTk4IDAuMzQ5MTYgMC4xNDk2NCAzLjA5MjUgMS41NDY0IDYuMDg1MyAyLjk5MjkgOC42MjkyIDQuMTQwMiA0Ljg4ODIgMi4zNDQ1IDkuMjI3OCA0LjMzOTggMTMuNTY3IDYuMjM1MyAxLjA5NzQgMC40NDg5NSAxLjg5NTQgMC44NDgwMSAyLjc0MzQgMS4xOTcyIDkuNDI3MyA0LjA5MDQgMTguODU1IDcuODMxNSAyNy44MzMgMTEuMTc0IDIuMzQ0NCAwLjg0OCA0LjQ4OTIgMS42NDYxIDYuNTg0MSAyLjM5NDQgMTkuMDA0IDYuNjg0MiAzOC4xMDggMTIuMTIxIDU2Ljc2MyAxNi4yNjIgNy44ODEgMS42OTYgMTUuNzYyIDMuMjQyNCAyMy40NDMgNC41MzkzIDAuOTQ3NzEgMC4xOTk1MyAxLjk0NTMgMC4yOTkzIDIuNjkzNSAwLjQ0ODk0IDExLjYyMiAxLjg0NTYgMjMuMTQ0IDMuMjQyNCAzNC42NjYgNC4xOTAxIDY5LjYzMiA1LjQzNzIgMTM4Ljg3LTUuNTM2OSAyMDguMzUtMzIuOTcyIDI0LjI5MS05LjU3NzQgNDcuMTg2LTIwLjYwMSA2OC42MzQtMzMuMDcyIDM1LjAxNi0yMC4zMDIgNjYuMjktNDQuMzk1IDkzLjg3NC03Mi4zMjkgNC4xNC00LjE5MDEgOC4xODAzLTguNDggMTIuMjIxLTEyLjg3IDguMzc5OC05LjIyODIgMTYuNDYtMTguOTA1IDI0LjE5Mi0yOS4wMzEgMjAuMDAyLTI2LjA4OCAzNy40Ni01NC45NyA1Mi40NzMtODYuNDk2IDIuNTkzNy01LjQ4NyA1LjEzNzYtMTEuMDc0IDcuNjMxNi0xNi44MSAwLjI0OTM5LTAuNTk4NTkgMC41NDg2Ny0xLjI0NzEgMC43OTgwNy0xLjg0NTYgMC4xNDk2NC0wLjI5OTMgMC4yNDk0LTAuNTk4NTkgMC4zOTkwNC0wLjg5Nzg5IDIuNzkzMy02LjU4NDQgNS40MzY5LTEzLjIxOSA4LjA4MDUtMTkuOTUzIDExLjYyMi0zMC41NzggMjAuMTAyLTYxLjUwNSAyNS4yODktOTIuODMxIDAuNjk4MzItNC4zODk2IDEuMzk2Ni05LjEyODQgMi4wOTUtMTMuODY3IDAuODk3ODQtNy4zMzI3IDEuNzQ1OC0xNC44MTUgMi4zNDQ0LTIyLjU0NyAwLjA5OTgtMS40NDY2IDAuMjQ5NC0zLjE0MjYgMC4zOTkwNC00LjkzODMgMS4yOTY5LTE5LjI1NSAxLjI5NjktMzguNjA5IDAuMDk5OC01OC4yNjItMC40NDg5Mi02LjM4NDktMC45OTc2LTEyLjg3LTEuNjk1OS0xOS41NTQtMC4xOTk1Mi0xLjg0NTYtMC40NDg5Mi0zLjg0MDktMC42OTgzMi01LjgzNjItMS45OTUyLTE2LjM2MS00LjkzODEtMzIuNzczLTguOTI4NS00OS41ODMtNS40MzY5LTIzLjA5NS0xMi44MTktNDYuNjQtMjIuMTQ3LTcwLjIzNC0yNy40ODQtNjkuNTg2LTY2LjgzOS0xMjcuNzUtMTE4LjMxLTE3NC42OS0xOC43MDUtMTcuMDYtMzkuMjU1LTMyLjcyMy02MS40MDItNDYuODM5LTEzLjgxNy04Ljg3OS0yOC4yMzItMTcuMDYtNDMuNjQ1LTI0Ljg0MXoiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY0NiIvPgogPHBhdGggZD0ibTQ1LjYzMiA1LjM2ODhjLTAuNTUxMjMtMC4yNzU2My0xLjEzMS0wLjU0ODA5LTEuNzI2NS0wLjgwNDcxLTAuNTQ0OS0wLjIzNzYxLTEuMDg2Ni0wLjQ1NjIxLTEuNjQxLTAuNjU5MDEtMi42Njc1LTAuOTk3OTctNS4zMzgxLTEuNjA2Mi04LjAxMjEtMS44MTU0LTQuMzk3Mi0wLjM1NDgzLTguODA0MSAwLjM0MjE2LTEzLjIzNiAyLjA5MS0xLjQ4NTggMC41ODkyOC0yLjg5MjQgMS4yNjA5LTQuMjE5OCAyLjAyMTMtMi42MTY4IDEuNTAxNy00LjkxNjcgMy4zMzYxLTYuODc0NiA1LjQ5MzZxLTMuMjY5NCAzLjU4NjQtNS4zNTcxIDguMzk4OWMtMS4yODMgMi45NTU5LTIuMDgxNCA1LjkyMTMtMi4zOTgyIDguODQ4Ni0wLjAyODUxMiAwLjI4MTk2LTAuMDUzODU2IDAuNTQ0OTItMC4wNzYwMzEgMC44MDc4OC0wLjIzNDQzIDIuODg5NC0wLjAxMjY3MiA1Ljc1MDIgMC42NDk0MiA4LjYxNzQgMC4zNjExNSAxLjU1NTYgMC44Mzk1MSAzLjA4ODkgMS40NDE0IDQuNjE2IDEuNzU1IDQuNDMyMiA0LjI2MDkgOC4xMzYgNy41MTEgMTEuMDk1IDEuOTkyNiAxLjgxNTQgNC4yNTc4IDMuMzQ4OCA2Ljc5ODQgNC42MTI5IDAuMDA5NSAwLjAwMzIgMC4wMTU4NCAwLjAwNjMgMC4wMjIxOCAwLjAwOTUgMC4xOTY0MSAwLjA5ODIyIDAuMzg2NDkgMC4xOTAwOSAwLjU0ODA2IDAuMjYyOTYgMC4zMTA0NiAwLjE0ODkgMC41ODYwOCAwLjI3NTYzIDAuODYxNjggMC4zOTYwMiAwLjA2OTcgMC4wMjg1MSAwLjEyMDM4IDAuMDUzODYgMC4xNzQyNCAwLjA3NjA0IDAuNTk4NzUgMC4yNTk3OSAxLjE5NzUgMC40OTc0IDEuNzY3NyAwLjcwOTY5IDAuMTQ4OSAwLjA1Mzg2IDAuMjg1MTIgMC4xMDQ1NSAwLjQxODE3IDAuMTUyMDggMS4yMDcgMC40MjQ1MyAyLjQyMDMgMC43Njk4NCAzLjYwNTIgMS4wMzI4IDAuNTAwNTQgMC4xMDc3MiAxLjAwMTEgMC4yMDU5MyAxLjQ4ODkgMC4yODgzIDAuMDYwMTkgMC4wMTI2NyAwLjEyMzU1IDAuMDE5MDEgMC4xNzEwNyAwLjAyODUxIDAuNzM4MTQgMC4xMTcyMiAxLjQ2OTkgMC4yMDU5MyAyLjIwMTcgMC4yNjYxMiA0LjQyMjUgMC4zNDUzMyA4LjgyLTAuMzUxNjYgMTMuMjMzLTIuMDk0MSAxLjU0MjgtMC42MDgyOSAyLjk5NjktMS4zMDg0IDQuMzU5MS0yLjEwMDUgMi4yMjQtMS4yODk0IDQuMjEwMy0yLjgxOTYgNS45NjIyLTQuNTkzOCAwLjI2Mjk0LTAuMjY2MTIgMC41MTk1NS0wLjUzODU5IDAuNzc2MTktMC44MTc0MSAwLjUzMjIyLTAuNTg2MTEgMS4wNDU0LTEuMjAwNyAxLjUzNjUtMS44NDM4IDEuMjcwNC0xLjY1NjkgMi4zNzkyLTMuNDkxMyAzLjMzMjctNS40OTM2IDAuMTY0NzMtMC4zNDg0OSAwLjMyNjMtMC43MDMzNCAwLjQ4NDctMS4wNjc2IDAuMDE1ODQtMC4wMzgwMiAwLjAzNDg1LTAuMDc5MjEgMC4wNTA2OS0wLjExNzIyIDAuMDA5NS0wLjAxOTAxIDAuMDE1ODQtMC4wMzgwMiAwLjAyNTM0LTAuMDU3MDMgMC4xNzc0MS0wLjQxODE5IDAuMzQ1MzEtMC44Mzk1OCAwLjUxMzIxLTEuMjY3MyAwLjczODE0LTEuOTQyMSAxLjI3NjctMy45MDYzIDEuNjA2Mi01Ljg5NTkgMC4wNDQzNS0wLjI3ODggMC4wODg3LTAuNTc5NzcgMC4xMzMwNi0wLjg4MDczIDAuMDU3MDItMC40NjU3MiAwLjExMDg4LTAuOTQwOTQgMC4xNDg5LTEuNDMyIDAuMDA2My0wLjA5MTg4IDAuMDE1ODQtMC4xOTk2IDAuMDI1MzQtMC4zMTM2NCAwLjA4MjM3LTEuMjIyOSAwLjA4MjM3LTIuNDUyMiAwLjAwNjMtMy43MDA0LTAuMDI4NTEtMC40MDU1Mi0wLjA2MzM2LTAuODE3NDEtMC4xMDc3MS0xLjI0MTktMC4wMTI2MzItMC4xMTcyMS0wLjAyODQ3Mi0wLjI0Mzk0LTAuMDQ0MzEyLTAuMzcwNjYtMC4xMjY3Mi0xLjAzOTEtMC4zMTM2My0yLjA4MTUtMC41NjcwNy0zLjE0OTEtMC4zNDUzMS0xLjQ2NjgtMC44MTQxNy0yLjk2MjItMS40MDY2LTQuNDYwOC0xLjc0NTYtNC40MTk2LTQuMjQ1MS04LjExMzctNy41MTQyLTExLjA5NS0xLjE4OC0xLjA4MzUtMi40OTMyLTIuMDc4My0zLjg5OTgtMi45NzQ5LTAuODc3NTYtMC41NjM5My0xLjc5MzEtMS4wODM1LTIuNzcyLTEuNTc3N3oiIGZpbGw9InVybCgjYykiIHN0cm9rZS13aWR0aD0iLjk5MzcyIi8+CiA8cGF0aCBkPSJtNTAuMDYxIDE3LjE4OHMtMC41NDk1OCAxLjE0OC0xLjM5MjYgMi41MjU0Yy0wLjg0MzA2IDEuMzgtMi4xOTE0IDIuODQ0My0zLjM1NTUgMy43NjU2LTEuNTE0MyAxLjIwMTEtMy4wNTAyIDEuOTczOC00LjQxMDIgMi40MTk5LTEuMzU3NiAwLjQ0ODQ0LTIuNDY2OCAwLjcwNTA4LTIuNDY2OCAwLjcwNTA4IDAuNTk3OSAwLjQ4NTQyIDEuMjM4MSAxLjA4OCAxLjU4NTkgMS43NzkzIDAuMzQ1MzQgMC42ODg2OSAwLjU0NDkyIDEuNDY2OSAwLjU0NDkyIDIuMzEyNSAwIDEuNjU0My0wLjYzNzAzIDMuMDc3Ni0xLjY3NTggNC4wODk4LTEuMDM5MyAxLjAwOTctMi40ODI4IDEuNjA3NC00LjA5NzcgMS42MDc0LTEuOTYwNCAwLTMuNTExMS0wLjU4MjUyLTQuNTcyMy0xLjU4MDEtMS4wNjExLTEuMDAwMS0xLjYzMjgtMi40MTczLTEuNjMyOC00LjA4NCAwLTAuNjM0NSAwLjA5NTc4LTEuMjE4NiAwLjI2OTUzLTEuNzQ4IDAuMTc0Mi0wLjUyNjkzIDAuNDI1OTktMS4wMDEzIDAuNzQyMTktMS40MTggMCAwLTAuNDcwNzYgMC4wNjI5Ni0xLjMwODYtMC4xMTMyOC0wLjgzNTc5LTAuMTc2ODEtMi4wNDMtMC41OTU2Ni0zLjUxNTYtMS41NTg2LTEuMjUyNC0wLjgxODU4LTIuMzQ1Mi0xLjk2MzctMy4xMjctMi45MDIzLTAuNzc5NDMtMC45Mzg3Ny0xLjI0NjEtMS42NzM4LTEuMjQ2MS0xLjY3MzggMCAwIDAuMDQ0NjggMy43ODcxIDAuMDI3MzQgNS44ODI4LTAuMDQzODcgNS44MDM2LTAuNjMwODYgNS44Mzk4LTAuNjMwODYgNS44Mzk4LTAuNzE1Ni0xLjAxMjUtMS40ODg2LTEuODg0LTIuNDEwMi0yLjUwMzktMC45MjM1My0wLjYyMDIxLTEuOTk1Ny0wLjk4NDc4LTMuMzE2NC0wLjk4MjQyLTEuNTk3NyAwLjAwMjQtMi40OTI0IDAuNTk0MjktMy4wMDIgMS40MTgtMC41MDk4NCAwLjgyNTkxLTAuNjM0MDkgMS44ODA2LTAuNjg1NTUgMi44MDQ3LTAuMDkzMTYgMS41OTMgMC43MDk0OCAzLjU4NjYgMi4wMzUyIDUuMTc5NyAxLjMyNzkgMS41OTMgMy4xODEzIDIuNzg3NSA1LjE5MzQgMi43ODUyIDAuMTQyMTMgMCAwLjI5MjktMC4wMDk2IDAuNDQ3MjctMC4wMjkzIDAuMTU0MTgtMC4wMjIxMyAwLjMxMjg0LTAuMDUyMTEgMC40NzQ2MS0wLjA5Mzc1IDAgMCAwLjQ1Mjc4IDAuNDM2MjIgMS40OTQxIDEuMTA1NSAxLjA0MTUgMC42NzEyOSAyLjY3MDkgMS41NzM2IDUuMDIzNCAyLjUwOTggMS4yMjAzIDAuNDg1MDQgMi41MjE0IDAuOTk3MjEgNC4xNDg0IDEuMzk2NSAxLjYyNzEgMC4zOTk2NiAzLjU3NjYgMC42ODY4NyA2LjA5NTcgMC43MTg3NSAzLjQ0NTQgMC4wNDE1NyA1LjkwMzQtMC43MTk1IDcuNzM2My0xLjgyMjMgMS44MzU1LTEuMTAyOSAzLjA0OTctMi41NTA3IDQuMDA3OC0zLjg4ODcgMS43Mjk5LTIuNDIxNiAyLjc2OTgtNS4zMjU1IDMuMzc1LTguMTQ2NSAwLjYwNTM2LTIuODE4NSAwLjc3NzUyLTUuNTU0NCAwLjc2NzU4LTcuNjM0OC0wLjAxNzI4LTMuNzA1Ni0wLjI5ODAzLTUuODcxNS0wLjU3MjI3LTcuMTExM2gtMmUtM2MtMC4yNzcxOS0xLjI0MDQtMC41NDg3OC0xLjU1NDctMC41NDg3OC0xLjU1NDd6bS0yNS43MjkgMTAuOTc3YzEuODQ3NSAwLjAxMjQzIDMuNjA1OCAxLjYyNTUgMy41OTU3IDMuNTY2NC0wLjAwOTYgMS43NTc1LTEuNTIyMiAzLjUxMTctMy42MjcgMy41MTE3LTIuNjc4My0wLjAwMjYtMy43NTY2LTEuNzQ3NS0zLjczNDQtMy4yOTg4IDAuMDI0NjgtMS42OTYxIDAuNzM0MzItMy44MDEzIDMuNzY1Ni0zLjc3OTN6bTExLjMxMiAxLjA0MWMtMS40MTg4IDAtMi41NjY0IDEuMTM3Mi0yLjU2NjQgMi41MzkxIDAgMS4zOTkzIDEuMTQ3NiAyLjUzNTIgMi41NjY0IDIuNTM1MnMyLjU2ODQtMS4xMzU4IDIuNTY4NC0yLjUzNTJjMC0xLjQwMTktMS4xNDk1LTIuNTM5MS0yLjU2ODQtMi41Mzkxem0tMjEuOTI0IDEuMTAxNmMxLjA4MDggMCAxLjk2MDkgMC44Nzc3NSAxLjk2MDkgMS45NjA5IDAgMS4wODMzLTAuODgwMTEgMS45NjA5LTEuOTYwOSAxLjk2MDktMS4wODMxIDAtMS45NTktMC44Nzc2Mi0xLjk1OS0xLjk2MDkgMC0xLjA4MzIgMC44NzU5Mi0xLjk2MDkgMS45NTktMS45NjA5em0xMS4yMjEgMC4yODcxMWMtMC45MTYzMiAwLTEuNjU4MiAwLjc1NzU1LTEuNjU4MiAxLjY5MTQgMCAwLjkzNjQxIDAuNzQxODIgMS42OTM0IDEuNjU4MiAxLjY5MzQgMC45MTM5NiAwIDEuNjU2Mi0wLjc1Njk1IDEuNjU2Mi0xLjY5MzQgMC0wLjkzMzg2LTAuNzQyMjgtMS42OTE0LTEuNjU2Mi0xLjY5MTR6bTEwLjc2OCAwLjIyNjU2YzAuNTM5MjQgMCAwLjk4MDQ3IDAuNDQxMjMgMC45ODA0NyAwLjk4MDQ3IDAgMC41NDE3Mi0wLjQ0MTIzIDAuOTc4NTItMC45ODA0NyAwLjk3ODUyLTAuNTQxNiAwLTAuOTgwNDctMC40MzY3OS0wLjk4MDQ3LTAuOTc4NTIgMC0wLjUzOTI0IDAuNDM4ODctMC45ODA0NyAwLjk4MDQ3LTAuOTgwNDd6bS0xMC43NDIgMS4wOTE4YzAuMjcyMTQgMCAwLjQ5MDIzIDAuMjIwNzEgMC40OTAyMyAwLjQ5MDIzIDAgMC4yNzIwMS0wLjIxODEgMC40OTAyNC0wLjQ5MDIzIDAuNDkwMjMtMC4yNjk1OCAwLTAuNDkwMjQtMC4yMTgyMy0wLjQ5MDI0LTAuNDkwMjMgMC0wLjI2OTU5IDAuMjIwNjUtMC40OTAyMyAwLjQ5MDI0LTAuNDkwMjN6bTE0LjQ4NCA2Ljk0MTRzMC4zOTU1MiAwLjA0NjQ1IDAuODYzMjggMC4yMzA0N2MwLjQ2ODE0IDAuMTg2MDYgMS4wMTE4IDAuNTA2MjMgMS4zMTA1IDEuMDUyNyAwLjIzMjggMC40MjY1NyAwLjE1OTE4IDAuODg5ODcgMC4wMjkzIDEuMjUtMC4xMzIzNyAwLjM2MDU3LTAuMzE4MzYgMC42MTMyOC0wLjMxODM2IDAuNjEzMjhzMC4wNzEzMy0wLjM5NDcxIDAuMDc2MTctMC42ODE2NGMwLjAwMjMtMC4yOTYzNy0wLjA3NjE3LTAuNjU4Mi0wLjA3NjE3LTAuNjU4MnMtMC4yMDc5OSAwLjQ0MjU5LTAuOTQzMzYgMC44ODg2N2MtMC43MzQ5OCAwLjQ0MzU5LTIuMDE4NiAxLTQuMTMwOSAxLTEuODA4NSAwLTIuODAzOS0wLjI3NDMyLTMuMzY1Mi0wLjQzMzU5LTAuNTYzNjYtMC4xNjE4OS0wLjY3MzgzLTAuMzIwMzEtMC42NzM4My0wLjMyMDMxczEuNDIzMSAwLjEzMzY1IDIuODg4NyAwLjA1MjczYzEuOTY1LTAuMTA1MDggMy4wNTUyLTAuNTA4ODUgNC4yNDYxLTAuOTU3MDMgMC42ODg4Mi0wLjI2MjE5IDEuNTAzOS0wLjkzNTU1IDEuNTAzOS0wLjkzNTU1cy0wLjI2MDktMC4yNzYxLTAuNjIxMDktMC41NjA1NWMtMC4zMzgwNy0wLjI2MjEyLTAuNzg5MDYtMC41NDEwMi0wLjc4OTA2LTAuNTQxMDJ6IiBmaWx0ZXI9InVybCgjZmlsdGVyOTA5KSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9Ii45OTk5OCIvPgogPHBhdGggZD0ibTUwLjA2MSAxNi40NTlzLTAuNTQ5NTggMS4xNDgtMS4zOTI2IDIuNTI1NGMtMC44NDMwNiAxLjM4LTIuMTkxNCAyLjg0NDMtMy4zNTU1IDMuNzY1Ni0xLjUxNDMgMS4yMDExLTMuMDUwMiAxLjk3MzgtNC40MTAyIDIuNDE5OS0xLjM1NzYgMC40NDg0NC0yLjQ2NjggMC43MDUwOC0yLjQ2NjggMC43MDUwOCAwLjU5NzkgMC40ODU0MiAxLjIzODEgMS4wODggMS41ODU5IDEuNzc5MyAwLjM0NTM0IDAuNjg4NjkgMC41NDQ5MiAxLjQ2NjkgMC41NDQ5MiAyLjMxMjUgMCAxLjY1NDMtMC42MzcwMyAzLjA3NzYtMS42NzU4IDQuMDg5OC0xLjAzOTMgMS4wMDk3LTIuNDgyOCAxLjYwNzQtNC4wOTc3IDEuNjA3NC0xLjk2MDQgMC0zLjUxMTEtMC41ODI1Mi00LjU3MjMtMS41ODAxLTEuMDYxMS0xLjAwMDEtMS42MzI4LTIuNDE3My0xLjYzMjgtNC4wODQgMC0wLjYzNDUgMC4wOTU3NzktMS4yMTg2IDAuMjY5NTMtMS43NDggMC4xNzQyLTAuNTI2OTMgMC40MjU5OS0xLjAwMTMgMC43NDIxOS0xLjQxOCAwIDAtMC40NzA3NiAwLjA2Mjk1Ni0xLjMwODYtMC4xMTMyOC0wLjgzNTc5LTAuMTc2ODEtMi4wNDMtMC41OTU2Ni0zLjUxNTYtMS41NTg2LTEuMjUyNC0wLjgxODU4LTIuMzQ1Mi0xLjk2MzctMy4xMjctMi45MDIzLTAuNzc5NDMtMC45Mzg3Ny0xLjI0NjEtMS42NzM4LTEuMjQ2MS0xLjY3MzggMCAwIDAuMDQ0Njg0IDMuNzg3MSAwLjAyNzM0NCA1Ljg4MjgtMC4wNDM4NyA1LjgwMzYtMC42MzA4NiA1LjgzOTgtMC42MzA4NiA1LjgzOTgtMC43MTU2LTEuMDEyNS0xLjQ4ODYtMS44ODQtMi40MTAyLTIuNTAzOS0wLjkyMzUzLTAuNjIwMjEtMS45OTU3LTAuOTg0NzgtMy4zMTY0LTAuOTgyNDItMS41OTc3IDAuMDAyNC0yLjQ5MjQgMC41OTQyOS0zLjAwMiAxLjQxOC0wLjUwOTg0IDAuODI1OTEtMC42MzQwOSAxLjg4MDYtMC42ODU1NSAyLjgwNDctMC4wOTMxNiAxLjU5MyAwLjcwOTQ4IDMuNTg2NiAyLjAzNTIgNS4xNzk3IDEuMzI3OSAxLjU5MyAzLjE4MTMgMi43ODc1IDUuMTkzNCAyLjc4NTIgMC4xNDIxMyAwIDAuMjkyOS0wLjAwOTU3NyAwLjQ0NzI3LTAuMDI5Mjk3IDAuMTU0MTgtMC4wMjIxMyAwLjMxMjg0LTAuMDUyMTEgMC40NzQ2MS0wLjA5Mzc1IDAgMCAwLjQ1Mjc4IDAuNDM2MjIgMS40OTQxIDEuMTA1NSAxLjA0MTUgMC42NzEyOSAyLjY3MDkgMS41NzM2IDUuMDIzNCAyLjUwOTggMS4yMjAzIDAuNDg1MDQgMi41MjE0IDAuOTk3MjEgNC4xNDg0IDEuMzk2NSAxLjYyNzEgMC4zOTk2NiAzLjU3NjYgMC42ODY4NyA2LjA5NTcgMC43MTg3NSAzLjQ0NTQgMC4wNDE1NyA1LjkwMzQtMC43MTk1IDcuNzM2My0xLjgyMjMgMS44MzU1LTEuMTAyOSAzLjA0OTctMi41NTA3IDQuMDA3OC0zLjg4ODcgMS43Mjk5LTIuNDIxNiAyLjc2OTgtNS4zMjU1IDMuMzc1LTguMTQ2NSAwLjYwNTM2LTIuODE4NSAwLjc3NzUyLTUuNTU0NCAwLjc2NzU4LTcuNjM0OC0wLjAxNzI4LTMuNzA1Ni0wLjI5ODAzLTUuODcxNS0wLjU3MjI3LTcuMTExM2gtMC4wMDE5NTNjLTAuMjc3MjQtMS4yNDA0LTAuNTQ4ODMtMS41NTQ3LTAuNTQ4ODMtMS41NTQ3em0tMjUuNzI5IDEwLjk3N2MxLjg0NzUgMC4wMTI0MyAzLjYwNTggMS42MjU1IDMuNTk1NyAzLjU2NjQtMC4wMDk2IDEuNzU3NS0xLjUyMjIgMy41MTE3LTMuNjI3IDMuNTExNy0yLjY3ODMtMC4wMDI2LTMuNzU2Ni0xLjc0NzUtMy43MzQ0LTMuMjk4OCAwLjAyNDY4LTEuNjk2MSAwLjczNDMyLTMuODAxMyAzLjc2NTYtMy43Nzkzem0xMS4zMTIgMS4wNDFjLTEuNDE4OCAwLTIuNTY2NCAxLjEzNzItMi41NjY0IDIuNTM5MSAwIDEuMzk5MyAxLjE0NzYgMi41MzUyIDIuNTY2NCAyLjUzNTJzMi41Njg0LTEuMTM1OCAyLjU2ODQtMi41MzUyYzAtMS40MDE5LTEuMTQ5NS0yLjUzOTEtMi41Njg0LTIuNTM5MXptLTIxLjkyNCAxLjEwMTZjMS4wODA4IDAgMS45NjA5IDAuODc3NzUgMS45NjA5IDEuOTYwOSAwIDEuMDgzMy0wLjg4MDExIDEuOTYwOS0xLjk2MDkgMS45NjA5LTEuMDgzMSAwLTEuOTU5LTAuODc3NjItMS45NTktMS45NjA5IDAtMS4wODMyIDAuODc1OTItMS45NjA5IDEuOTU5LTEuOTYwOXptMTEuMjIxIDAuMjg3MTFjLTAuOTE2MzIgMC0xLjY1ODIgMC43NTc1NS0xLjY1ODIgMS42OTE0IDAgMC45MzY0MSAwLjc0MTgyIDEuNjkzNCAxLjY1ODIgMS42OTM0IDAuOTEzOTYgMCAxLjY1NjItMC43NTY5NSAxLjY1NjItMS42OTM0IDAtMC45MzM4Ni0wLjc0MjI4LTEuNjkxNC0xLjY1NjItMS42OTE0em0xMC43NjggMC4yMjY1NmMwLjUzOTI0IDAgMC45ODA0NyAwLjQ0MTIzIDAuOTgwNDcgMC45ODA0NyAwIDAuNTQxNzItMC40NDEyMyAwLjk3ODUyLTAuOTgwNDcgMC45Nzg1Mi0wLjU0MTYgMC0wLjk4MDQ3LTAuNDM2NzktMC45ODA0Ny0wLjk3ODUyIDAtMC41MzkyNCAwLjQzODg3LTAuOTgwNDcgMC45ODA0Ny0wLjk4MDQ3em0tMTAuNzQyIDEuMDkxOGMwLjI3MjE0IDAgMC40OTAyMyAwLjIyMDcxIDAuNDkwMjMgMC40OTAyMyAwIDAuMjcyMDEtMC4yMTgxIDAuNDkwMjQtMC40OTAyMyAwLjQ5MDIzLTAuMjY5NTggMC0wLjQ5MDI0LTAuMjE4MjMtMC40OTAyNC0wLjQ5MDIzIDAtMC4yNjk1OSAwLjIyMDY1LTAuNDkwMjMgMC40OTAyNC0wLjQ5MDIzem0xNC40ODQgNi45NDE0czAuMzk1NTIgMC4wNDY0NSAwLjg2MzI4IDAuMjMwNDdjMC40NjgxNCAwLjE4NjA2IDEuMDExOCAwLjUwNjIzIDEuMzEwNSAxLjA1MjcgMC4yMzI4IDAuNDI2NTcgMC4xNTkxOCAwLjg4OTg3IDAuMDI5Mjk3IDEuMjUtMC4xMzIzNyAwLjM2MDU3LTAuMzE4MzYgMC42MTMyOC0wLjMxODM2IDAuNjEzMjhzMC4wNzEzMzEtMC4zOTQ3MSAwLjA3NjE3MS0wLjY4MTY0YzAuMDAyMy0wLjI5NjM3LTAuMDc2MTcxLTAuNjU4Mi0wLjA3NjE3MS0wLjY1ODJzLTAuMjA3OTkgMC40NDI1OS0wLjk0MzM2IDAuODg4NjdjLTAuNzM0OTggMC40NDM1OS0yLjAxODYgMS00LjEzMDkgMS0xLjgwODUgMC0yLjgwMzktMC4yNzQzMi0zLjM2NTItMC40MzM1OS0wLjU2MzY2LTAuMTYxODktMC42NzM4My0wLjMyMDMxLTAuNjczODMtMC4zMjAzMXMxLjQyMzEgMC4xMzM2NSAyLjg4ODcgMC4wNTI3MzVjMS45NjUtMC4xMDUwOCAzLjA1NTItMC41MDg4NSA0LjI0NjEtMC45NTcwMyAwLjY4ODgyLTAuMjYyMTkgMS41MDM5LTAuOTM1NTUgMS41MDM5LTAuOTM1NTVzLTAuMjYwOS0wLjI3NjEtMC42MjEwOS0wLjU2MDU1Yy0wLjMzODA3LTAuMjYyMTItMC43ODkwNi0wLjU0MTAyLTAuNzg5MDYtMC41NDEwMnoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iLjk5OTk4Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gimp,gimp,image,gif,tiff,png,jpeg,bmp,tga,pcx,bitmap,jpg,pixmap\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"gimp.desktop\"\nLABEL oc.launch=\"gimp.Gimp\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Gimp\"\nLABEL oc.displayname=\"Gimp\"\nLABEL oc.path=\"/usr/bin/gimp\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;\"\nLABEL oc.fileextensions=\"dds\"\nLABEL oc.legacyfileextensions=\"dds\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gimp\"\nENV APPBIN \"/usr/bin/gimp\"\nENV APP \"/usr/bin/gimp\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gimp/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gimp/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Gimp

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gimp.d\n
"},{"location":"applications/gimp/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Gimp.d -t Gimp .\n
"},{"location":"applications/gimp/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Gimp > Gimp.json\ndocker image save Gimp -o Gimp.tar\nctr -n k8s.io images import Gimp.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gimp.json\n\n
"},{"location":"applications/gnumeric/","title":"Gnumeric","text":""},{"location":"applications/gnumeric/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/gnumeric/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/gnumeric/#alpine-packages","title":"Alpine packages","text":"
gnumeric glpk\n
"},{"location":"applications/gnumeric/#displayname","title":"Displayname","text":"
Gnumerix (alpine)\n
"},{"location":"applications/gnumeric/#path","title":"Path","text":"
/usr/bin/gnumeric\n
"},{"location":"applications/gnumeric/#mimetype","title":"Mimetype","text":"
application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\n
"},{"location":"applications/gnumeric/#file-extensions","title":"File extensions","text":"

\"gnm\"

"},{"location":"applications/gnumeric/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"gnm\"

"},{"location":"applications/gnumeric/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/gnumeric/#wm_class","title":"WM_CLASS","text":"
gnumeric.Gnumeric\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/gnumeric/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/gnumeric.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/gnumeric/#json-dump","title":"JSON dump","text":"

json source file gnumeric.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"gnumeric glpk\",\n    \"icon\": \"gnumeric.svg\",\n    \"keyword\": \"numeric\",\n    \"launch\": \"gnumeric.Gnumeric\",\n    \"displayname\": \"Gnumerix (alpine)\",\n    \"name\": \"Gnumeric\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnumeric\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\",\n    \"fileextensions\": \"gnm\",\n    \"legacyfileextensions\": \"gnm\",\n    \"desktopfile\": \"/usr/share/applications/gnumeric.desktop\",\n    \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/gnumeric/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output gnumeric.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/gnumeric.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @gnumeric.d.3.0.json\n\n
"},{"location":"applications/gnumeric/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnumeric glpk\nLABEL oc.icon=\"gnumeric.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL2lua3NjYXBlLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICBpZD0ic3ZnMiIKICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40MyIKICAgd2lkdGg9IjQ4IgogICBoZWlnaHQ9IjQ4IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY2Jhc2U9Ii9ob21lL3ZpbmljaXVzL3RhbmdvLWljb24tdGhlbWUtY29kZS9hcHBzL3NjYWxhYmxlIgogICBzb2RpcG9kaTpkb2NuYW1lPSJnbnVtZXJpYy5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvdmluaWNpdXMvdGFuZ28taWNvbi10aGVtZS1jb2RlL2FwcHMvc2NhbGFibGUvZ251bWVyaWMucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iOTAiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSI5MCIKICAgdmlld0JveD0iMCAwIDQ4IDQ4Ij4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzNSI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzOTAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjA2ODM3NjA3OyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDMzOTIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuMjEzNjc1MjI7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMzM5NCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5MDYwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QzZDdjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0OTA2MiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A0OTA2NCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3NjAyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RiZGJkNTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNzYwNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YxZjFmMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNzYwNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI1ODA1Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNTgwNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNTgwOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI0MDQ3Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M0ZjE5NztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDA0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izc0ZDIxODtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AyNDA1MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE4Nzg2Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzM0NjVhNDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxODc4OCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxODc5MCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE2MTQ3Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxNjE0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxNjE1MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDk5NDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY3MTcxO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDk5NTAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkYzI1MjU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wOTk1MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE1NjYyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wMTU2NjQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmOGY4Zjg7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDE1NjY2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjU5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZhZmFmYTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wMjYwIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYmJiYmJiO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AyNjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNjkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTNhM2EzO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AyNzAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0YzRjNGM7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDI3MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2OTkiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MDEiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY3MTcxO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MDMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2MwMDAwO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcxMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxMyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1YjhjY2I7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxNSIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzNDY1YTQ7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NzE5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NzIxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3M2QyMTY7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MjMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDVmN2IzO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTA0OCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNTA1MCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwLjUiCiAgICAgICAgIGlkPSJzdG9wNTA1NiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1MDUyIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3NjAyIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc2MDgiCiAgICAgICB4MT0iMTEuOTE4OTIiCiAgICAgICB5MT0iNDIuMDIwNDc3IgogICAgICAgeDI9IjExLjkxODkyIgogICAgICAgeTI9IjYuOTgyNzQ3NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NTgxNiwwLDAsMS4xNzE3MDIsLTgxLjc0NDU1LC00LjE4OTQ4MSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3NjAyIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzI5NjYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSIxMS45MTg5MiIKICAgICAgIHkxPSI0Mi4wMjA0NzciCiAgICAgICB4Mj0iMTEuOTE4OTIiCiAgICAgICB5Mj0iNi45ODI3NDc2IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwLDgwKSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjU4MDUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzMjk2OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgY3g9Ii03NC4wMTEwOTMiCiAgICAgICBjeT0iMzguODkwOTQyIgogICAgICAgZng9Ii03NC4wMTEwOTMiCiAgICAgICBmeT0iMzguODkwOTQyIgogICAgICAgcj0iMTMuNjYzNTg2IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMyOTcwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMjk3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMyOTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTkuMjU2NjM3NiIKICAgICAgIHkxPSI1NS44MzI5NDMiCiAgICAgICB4Mj0iLTE2LjYwNTM5MiIKICAgICAgIHkyPSI0OC41ODk0NzQiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0MDQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzI5NzYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMjk3OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNTgwNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDM1NzA0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBjeD0iLTc0LjAxMTA5MyIKICAgICAgIGN5PSIzOC44OTA5NDIiCiAgICAgICBmeD0iLTc0LjAxMTA5MyIKICAgICAgIGZ5PSIzOC44OTA5NDIiCiAgICAgICByPSIxMy42NjM1ODYiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE2MTQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzU3MDYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS41Mzk0NDMsMCwwLDEuNTEwODcxLDEwMC45NjU2LC0xNS4xODMxOSkiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTcwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzEwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzg5MzY1LDAsMCwxLjM4OTM2NSw0OC45OTAyOSwtNDYuMjA0MDUpIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzEyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMzg5MzY1LDAsMCwxLjM4OTM2NSw0OC45OTAyOSwtNDYuMjA0MDUpIgogICAgICAgeDE9Ii0xOC4wNzk4ODIiCiAgICAgICB5MT0iNDguNjY1NjgiCiAgICAgICB4Mj0iLTE4LjUiCiAgICAgICB5Mj0iNTYuODI3Nzc4IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1NzE0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI1ODA1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDEwNDkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGN4PSItNzQuMDExMDkzIgogICAgICAgY3k9IjM4Ljg5MDk0MiIKICAgICAgIGZ4PSItNzQuMDExMDkzIgogICAgICAgZnk9IjM4Ljg5MDk0MiIKICAgICAgIHI9IjEzLjY2MzU4NiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTA1MSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5OTQ4IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDEwNTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItNTQuMTAyNzgzIgogICAgICAgeTE9IjIwLjQ1Nzg3OCIKICAgICAgIHgyPSItNDkuOTk0MTQ4IgogICAgICAgeTI9IjMzLjU0MzM2NSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTg3ODYiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTA1NSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMDU3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTE4LjA3OTg4MiIKICAgICAgIHkxPSI0OC42NjU2OCIKICAgICAgIHgyPSItMTguNSIKICAgICAgIHkyPSI1Ni44Mjc3NzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE2MTQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDEwNTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItNDkuOTk0MTQ4IgogICAgICAgeTE9IjM3LjAzNjQ5OSIKICAgICAgIHgyPSItNDkuOTk0MTQ4IgogICAgICAgeTI9IjE3Ljg1NzIwMyIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjU4MDUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTE0MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgY3g9Ii03NC4wMTEwOTMiCiAgICAgICBjeT0iMzguODkwOTQyIgogICAgICAgZng9Ii03NC4wMTEwOTMiCiAgICAgICBmeT0iMzguODkwOTQyIgogICAgICAgcj0iMTMuNjYzNTg2IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNjE0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMTQ1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTE0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii01NC4xMDI3ODMiCiAgICAgICB5MT0iMjAuNDU3ODc4IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMzMuNTQzMzY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxODc4NiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMTQ5IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTkuMjU2NjM3NiIKICAgICAgIHkxPSI1NS44MzI5NDMiCiAgICAgICB4Mj0iLTE2LjYwNTM5MiIKICAgICAgIHkyPSI0OC41ODk0NzQiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0MDQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDExNTEiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTE1MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii00OS45OTQxNDgiCiAgICAgICB5MT0iMzcuMDM2NDk5IgogICAgICAgeDI9Ii00OS45OTQxNDgiCiAgICAgICB5Mj0iMTcuODU3MjAzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNzYwMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5MDY2IgogICAgICAgeDE9IjI0LjQ5NzAxNSIKICAgICAgIHkxPSI0My4wMTI5MDkiCiAgICAgICB4Mj0iMjQuNDk3MDE1IgogICAgICAgeTI9IjUuOTg3MDE3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjA0NzAwNiwwLDAsMS4wNTM2OTYsLTEuMTU0MzY2LC0xLjMwODg1KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgcj0iMTcuNTc2NjU0IgogICAgICAgZnk9IjM1LjM3MzA5MyIKICAgICAgIGZ4PSIyMi45MzA0NjIiCiAgICAgICBjeT0iMzUuMzczMDkzIgogICAgICAgY3g9IjIyLjkzMDQ2MiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMDAwMDAsMC4wMDAwMDAsMC4wMDAwMDAsMC4zMzMzMzMsMi42NTg0NjNlLTE2LDIzLjU4MjA2KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjI1MiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NDYiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxODIiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTM2ZDE4O3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MTg0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDc5MDIwO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MTg2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDE5MiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlOWI5NmU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDE5NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YxZDE5ZTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDE5NiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQyMTAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWFiYTZmO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjAuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MjEyIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjk3YTFiO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3A0MjE0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDIyMiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDIyNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC42ODYzOTA1MjsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDQyMjYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTQ2Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0OTQ4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDQ5NTAiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTc5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZiZjBlMDtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIwLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDk4MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2YwY2U5OTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIGlkPSJzdG9wNDk4MyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5OTUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGU5NTIzO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDQ5OTciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhMzZkMTg7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDQ5OTkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODcxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4NzMiCiAgICAgICAgIG9mZnNldD0iMS4wMDAwMDAwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2NjY2NjO3N0b3Atb3BhY2l0eToxLjAwMDAwMDA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExNDIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDUxMTQ0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAuNSIKICAgICAgICAgaWQ9InN0b3A1MTE0NiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1MTE0OCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNzYwMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYwMzIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MTIyMTYsMCwwLDEuMDUzNjk2LC0wLjQ0OTQ5NSwtMS4zMDg4NSkiCiAgICAgICB4MT0iMjQuNDk3MDE1IgogICAgICAgeTE9IjQzLjAxMjkwOSIKICAgICAgIHgyPSIyNC40OTcwMTUiCiAgICAgICB5Mj0iNS45ODcwMTcyIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNTgwNSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDYwMzQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGN4PSItNzQuMDExMDkzIgogICAgICAgY3k9IjM4Ljg5MDk0MiIKICAgICAgIGZ4PSItNzQuMDExMDkzIgogICAgICAgZnk9IjM4Ljg5MDk0MiIKICAgICAgIHI9IjEzLjY2MzU4NiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDM2IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDk5NDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDM4IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTU0LjEwMjc4MyIKICAgICAgIHkxPSIyMC40NTc4NzgiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIzMy41NDMzNjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE4Nzg2IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjA0MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ii05LjI1NjYzNzYiCiAgICAgICB5MT0iNTUuODMyOTQzIgogICAgICAgeDI9Ii0xNi42MDUzOTIiCiAgICAgICB5Mj0iNDguNTg5NDc0IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNDA0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYwNDIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSItMTguMDc5ODgyIgogICAgICAgeTE9IjQ4LjY2NTY4IgogICAgICAgeDI9Ii0xOC41IgogICAgICAgeTI9IjU2LjgyNzc3OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTYxNDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MDQ0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iLTQ5Ljk5NDE0OCIKICAgICAgIHkxPSIzNy4wMzY0OTkiCiAgICAgICB4Mj0iLTQ5Ljk5NDE0OCIKICAgICAgIHkyPSIxNy44NTcyMDMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMzOTAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMzk2IgogICAgICAgeDE9IjciCiAgICAgICB5MT0iLTE5LjUiCiAgICAgICB4Mj0iMTMiCiAgICAgICB5Mj0iLTE5LjUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDUuNTU5OTFlLTM1LDAuNzA5Njc4LDEuNjI2NDkzZS0xNiwtMTAuMTYxMjkpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMzkwIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzQwNCIKICAgICAgIHgxPSItMy45OTY0NTA3IgogICAgICAgeTE9Ii0yOC41NTAxODYiCiAgICAgICB4Mj0iLTEzIgogICAgICAgeTI9Ii0yOC41NTAxODYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC44MjM1MjksMCwtNy4yMzUyOTQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMzkwIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzQwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjYuOTk3MDA1NSIKICAgICAgIHkxPSItMjcuNjg2Njg0IgogICAgICAgeDI9IjEzLjY2OTE0NiIKICAgICAgIHkyPSItMjguNzIzODU2IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsLTIuMjQxOTAzZS0zNCwwLjI5MDMyMywxLjExMDcyMWUtMTYsLTIuODM4NzEpIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNzIwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTAyNCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBpZD0iYmFzZSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKICAgICBpbmtzY2FwZTpndWlkZS1iYm94PSJ0cnVlIgogICAgIGZpbGw9IiM4ODhhODUiCiAgICAgaW5rc2NhcGU6em9vbT0iMSIKICAgICBpbmtzY2FwZTpjeD0iMzYiCiAgICAgaW5rc2NhcGU6Y3k9IjEyLjUiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIKICAgICBzaG93Ym9yZGVyPSJmYWxzZSIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iZmFsc2UiIC8+CiAgPHJlY3QKICAgICByeD0iMi44OTE0OTQiCiAgICAgcnk9IjIuODkxNDk0IgogICAgIHk9IjUuNTI2NDk0IgogICAgIHg9IjIuMzk0MzIxIgogICAgIGhlaWdodD0iMzcuOTYwMzM5IgogICAgIHdpZHRoPSIzNC4xMDYwNzkiCiAgICAgaWQ9InJlY3Q1OTc2IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NjAzMik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM1NTU3NTM7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMzY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHk9Ii0zNSIKICAgICB4PSI3IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzUiCiAgICAgaWQ9InJlY3Q1OTgwIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLDEsLTEsMCwwLDApIiAvPgogIDxyZWN0CiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwxLC0xLDAsMCwwKSIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q1OTgyIgogICAgIHdpZHRoPSIzNSIKICAgICBoZWlnaHQ9IjEiCiAgICAgeD0iNyIKICAgICB5PSItMjQiIC8+CiAgPHJlY3QKICAgICB5PSItMTMiCiAgICAgeD0iNyIKICAgICBoZWlnaHQ9IjEiCiAgICAgd2lkdGg9IjM1IgogICAgIGlkPSJyZWN0NTk4NCIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCwxLC0xLDAsMCwwKSIgLz4KICA8cmVjdAogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAsMSwtMSwwLDAsMCkiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJyZWN0NTk4NiIKICAgICB3aWR0aD0iMzUiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjciCiAgICAgeT0iLTUiIC8+CiAgPHJlY3QKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q1OTg4IgogICAgIHdpZHRoPSIzMSIKICAgICBoZWlnaHQ9IjEiCiAgICAgeD0iNCIKICAgICB5PSIyMCIgLz4KICA8cmVjdAogICAgIHk9IjI0IgogICAgIHg9IjQiCiAgICAgaGVpZ2h0PSIxIgogICAgIHdpZHRoPSIzMSIKICAgICBpZD0icmVjdDU5OTAiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiAvPgogIDxyZWN0CiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM4ZDhlOGI7ZmlsbC1vcGFjaXR5OjAuNTYwMzQ0ODtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJyZWN0NTk5MiIKICAgICB3aWR0aD0iMzEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjQiCiAgICAgeT0iMjgiIC8+CiAgPHJlY3QKICAgICB5PSIzMiIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q1OTk0IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDU5OTYiCiAgICAgd2lkdGg9IjMxIgogICAgIGhlaWdodD0iMSIKICAgICB4PSI0IgogICAgIHk9IjM2IiAvPgogIDxyZWN0CiAgICAgeT0iNDEiCiAgICAgeD0iNCIKICAgICBoZWlnaHQ9IjEiCiAgICAgd2lkdGg9IjMxIgogICAgIGlkPSJyZWN0NTk5OCIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzhkOGU4YjtmaWxsLW9wYWNpdHk6MC41NjAzNDQ4O2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPHJlY3QKICAgICB5PSIxNiIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q2MDAwIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDYwMDIiCiAgICAgd2lkdGg9IjMxIgogICAgIGhlaWdodD0iMSIKICAgICB4PSI0IgogICAgIHk9IjEyIiAvPgogIDxyZWN0CiAgICAgeT0iNyIKICAgICB4PSI0IgogICAgIGhlaWdodD0iMSIKICAgICB3aWR0aD0iMzEiCiAgICAgaWQ9InJlY3Q2MDA0IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojOGQ4ZThiO2ZpbGwtb3BhY2l0eTowLjU2MDM0NDg7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8cmVjdAogICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMjIzMzg5ZS0xNywxLC0xLDEuNjAwNjc3ZS0xNywwLDApIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzM5Nik7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowLjU5MzA3MzU5IgogICAgIGlkPSJyZWN0NjAwOCIKICAgICB3aWR0aD0iNiIKICAgICBoZWlnaHQ9IjIyIgogICAgIHg9IjciCiAgICAgeT0iLTM1IiAvPgogIDxyZWN0CiAgICAgeT0iLTEzIgogICAgIHg9IjciCiAgICAgaGVpZ2h0PSI5IgogICAgIHdpZHRoPSI2IgogICAgIGlkPSJyZWN0MzQwNiIKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM0MDgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MC41OTMwNzM1OSIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjA5NTY4MmUtMTgsMSwtMSwzLjkxMjc2NmUtMTcsMCwwKSIgLz4KICA8cmVjdAogICAgIHk9Ii00MSIKICAgICB4PSItMTMiCiAgICAgaGVpZ2h0PSIyOCIKICAgICB3aWR0aD0iOSIKICAgICBpZD0icmVjdDYwMzAiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQzNDA0KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjAuNTkzMDczNTkiCiAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiIC8+CiAgPHJlY3QKICAgICByeD0iMS44OTU0OTUzIgogICAgIHJ5PSIxLjg5NTQ5NTMiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNDgyNzU4NTk7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMTI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBpZD0icmVjdDU5NzgiCiAgICAgd2lkdGg9IjMyLjA2MjY2NCIKICAgICBoZWlnaHQ9IjM1Ljk1ODM0NyIKICAgICB4PSIzLjQwNTA3OTEiCiAgICAgeT0iNi41MTM4OTAzIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTAuMDc4NiwtMTguMDkxNDgpIgogICAgIGlkPSJnNjAxMCI+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4yMjA2NywwLDAsMC45NTgzMzMsNzIuMTI1MDMsMTUuODUzMzcpIgogICAgICAgZD0iTSAtNjAuMzQ3NTA3IDM4Ljg5MDk0MiBBIDEzLjY2MzU4NiAxMy42NjM1ODYgMCAxIDEgIC04Ny42NzQ2NzksMzguODkwOTQyIEEgMTMuNjYzNTg2IDEzLjY2MzU4NiAwIDEgMSAgLTYwLjM0NzUwNyAzOC44OTA5NDIgeiIKICAgICAgIHNvZGlwb2RpOnJ5PSIxMy42NjM1ODYiCiAgICAgICBzb2RpcG9kaTpyeD0iMTMuNjYzNTg2IgogICAgICAgc29kaXBvZGk6Y3k9IjM4Ljg5MDk0MiIKICAgICAgIHNvZGlwb2RpOmN4PSItNzQuMDExMDkzIgogICAgICAgaWQ9InBhdGg2MDEyIgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDYwMzQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNhNDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2NzAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMTI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE4LjU0ODU5MiwzNy41OTM3NSBDIC0yNi4yOTQyNDksMzcuODA2MTY1IC0zMi40OTg0MzYsNDIuNDI4MzEzIC0zMi40OTg0MzksNDguMDYyNSBDIC0zMi40OTg0MzksNDguMzc4MDE1IC0zMi40OTg0MzksNTEuNzQ2OTg2IC0zMi40OTg0MzksNTIuMDYyNSBDIC0zMi40OTg0MzksNTcuODMxOTA4IC0yNS45ODkzMTgsNjIuNDk5OTk5IC0xNy45ODQzMjksNjIuNSBDIC05Ljk3OTMzOTgsNjIuNSAtMy41MDE1Njc3LDU3LjgzMTkwOSAtMy41MDE1Njc4LDUyLjA2MjUgQyAtMy41MDE1Njc4LDUxLjc0Njk4NSAtMy41MDE1Njc4LDQ4LjM3MTI1NCAtMy41MDE1Njc4LDQ4LjA2MjUgQyAtMy41MDE1Njc4LDQyLjI5MzA5MiAtOS45NzkzMzg4LDM3LjU5Mzc0OCAtMTcuOTg0MzI5LDM3LjU5Mzc1IEMgLTE4LjE3MTk0NiwzNy41OTM3NSAtMTguMzYyNjk2LDM3LjU4ODY1MiAtMTguNTQ4NTkyLDM3LjU5Mzc1IHogIgogICAgICAgaWQ9InBhdGg2MDE0IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3Nzc3NzYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMjA0YTg3O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE1LDU3IEwgLTE1LDYxLjc5OTI0MyBDIC0xMC45MTIwNzksNjEuMTkxMzkgLTQuOTgwMzM4OSw1OC41Nzg4NzUgLTQsNTMgTCAtNCw0OCBMIC0xNSw1NyB6ICIKICAgICAgIGlkPSJwYXRoNjAxNiIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzRlOWEwNjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIC0yMyw1Ny4zNjk4MjIgTCAtMjMsNjEuMzM3MjIzIEMgLTIxLjAyOTIyMiw2MS44ODUxMzcgLTE3LjU3MjgxNCw2Mi4zMDE5NzUgLTE1LDYxLjc2NDY1OCBMIC0xNSw1Ny43NjQ2NTggTCAtMjMsNTcuMzY5ODIyIHogIgogICAgICAgaWQ9InBhdGg2MDE4IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA2NjU5NSwwLDAsMS4wNDI1MjgsMzUuMzMxNTMsMjMuNDM0MDYpIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNTczODQ7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NjAzNik7c3Ryb2tlLXdpZHRoOjAuOTQ4MzIyNjU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAtMzcuMzI4OTY0LDI3LjQ0Njg1IEMgLTM3LjMyODk2NCwzMi40NzU1OTQgLTQzLjAwMjk2NywzNi41NTY4OTQgLTQ5Ljk5NDE0OCwzNi41NTY4OTQgQyAtNTYuOTg1MzMsMzYuNTU2ODk0IC02Mi42NTkzMzIsMzIuNDc1NTk0IC02Mi42NTkzMzIsMjcuNDQ2ODUgQyAtNjIuNjU5MzMyLDI3LjIwNjAxNCAtNjIuNjQ2MzE4LDI1LjA0ODkzNyAtNjIuNjIwNzY4LDI0LjgxMjc5MSBDIC02Mi4xMTI4MzMsMjAuMTE4MTMgLTU2LjY1MDUwOSwxOC4zMzY4MDUgLTQ5Ljk5NDE0OCwxOC4zMzY4MDUgQyAtNDMuMzY5MTIsMTguMzM2ODA1IC0zNy45MjY5MTIsMjAuMDgzMzgyIC0zNy4zNzUwMjksMjQuNzQ2NTY0IEMgLTM3LjM0NDUyOCwyNS4wMDQyODkgLTM3LjMyODk2NCwyNy4xODM0NzcgLTM3LjMyODk2NCwyNy40NDY4NSB6ICIKICAgICAgIGlkPSJwYXRoNjAyMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3NzYyIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwMzgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZmY3MTcxO3N0cm9rZS13aWR0aDowLjk0ODMyMjY1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icGF0aDYwMjIiCiAgICAgICBzb2RpcG9kaTpjeD0iLTQ5Ljk5NDE0OCIKICAgICAgIHNvZGlwb2RpOmN5PSIyNy40NDY4NSIKICAgICAgIHNvZGlwb2RpOnJ4PSIxMi42NjUxODQiCiAgICAgICBzb2RpcG9kaTpyeT0iOS4xMTAwNDQ1IgogICAgICAgZD0iTSAtMzcuMzI4OTY0IDI3LjQ0Njg1IEEgMTIuNjY1MTg0IDkuMTEwMDQ0NSAwIDEgMSAgLTYyLjY1OTMzMiwyNy40NDY4NSBBIDEyLjY2NTE4NCA5LjExMDA0NDUgMCAxIDEgIC0zNy4zMjg5NjQgMjcuNDQ2ODUgeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDY2NTk1LDAsMCwxLjA0MjUyOCwzNS4zMzE1MywxOS40MzQwNikiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE4LjAwNzg0Myw0Ny41MjU1NDUgTCAtNC44MzQ5MTE5LDQ0LjY0Mjk2OSBDIC0xLjY2MDI5ODIsNTEuNDQzMDI3IC04LjQ5MDk0OTcsNTcuMDk4MTI0IC0xNC45ODgwMjQsNTcuODIzMTI4IEwgLTE4LjAwNzg0Myw0Ny41MjU1NDUgeiAiCiAgICAgICBpZD0icGF0aDYwMjQiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDIpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTE3Ljk2MzAxOCw0Ny41NTYyMTMgTCAtMjMuMDAxOTE5LDU3LjM4MTU0MSBDIC0yMC4zODA4Myw1OC4xMTcwMTEgLTE3Ljc4MTA1Niw1OC4xNjMwNzEgLTE0Ljk2MzAxOCw1Ny44MTUzMTkgTCAtMTcuOTYzMDE4LDQ3LjU1NjIxMyB6ICIKICAgICAgIGlkPSJwYXRoNjAyNiIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA2NjU5NSwwLDAsMS4wNDI1MjgsMzUuMzMxNTMsMTkuNDM0MDYpIgogICAgICAgZD0iTSAtMzcuMzI4OTY0IDI3LjQ0Njg1IEEgMTIuNjY1MTg0IDkuMTEwMDQ0NSAwIDEgMSAgLTYyLjY1OTMzMiwyNy40NDY4NSBBIDEyLjY2NTE4NCA5LjExMDA0NDUgMCAxIDEgIC0zNy4zMjg5NjQgMjcuNDQ2ODUgeiIKICAgICAgIHNvZGlwb2RpOnJ5PSI5LjExMDA0NDUiCiAgICAgICBzb2RpcG9kaTpyeD0iMTIuNjY1MTg0IgogICAgICAgc29kaXBvZGk6Y3k9IjI3LjQ0Njg1IgogICAgICAgc29kaXBvZGk6Y3g9Ii00OS45OTQxNDgiCiAgICAgICBpZD0icGF0aDYwMjgiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjUxNDc2NzkzO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDYwNDQpO3N0cm9rZS13aWR0aDowLjk0ODMyMjY1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"gnumeric,numeric\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"gnumeric.desktop\"\nLABEL oc.launch=\"gnumeric.Gnumeric\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Gnumeric\"\nLABEL oc.displayname=\"Gnumerix (alpine)\"\nLABEL oc.path=\"/usr/bin/gnumeric\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-gnumeric;application/x-oleo;application/x-planperfect;application/x-sc;application/x-sylk;application/x-xbase;\"\nLABEL oc.fileextensions=\"gnm\"\nLABEL oc.legacyfileextensions=\"gnm\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Gnumeric\"\nENV APPBIN \"/usr/bin/gnumeric\"\nENV APP \"/usr/bin/gnumeric\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gnumeric/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gnumeric/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Gnumeric

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gnumeric.d\n
"},{"location":"applications/gnumeric/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Gnumeric.d -t Gnumeric .\n
"},{"location":"applications/gnumeric/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Gnumeric > Gnumeric.json\ndocker image save Gnumeric -o Gnumeric.tar\nctr -n k8s.io images import Gnumeric.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gnumeric.json\n\n
"},{"location":"applications/golly/","title":"Golly","text":""},{"location":"applications/golly/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/golly/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/golly/#ubuntu-packages","title":"Ubuntu packages","text":"
golly\n
"},{"location":"applications/golly/#path","title":"Path","text":"
/usr/games/golly\n
"},{"location":"applications/golly/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/golly/#wm_class","title":"WM_CLASS","text":"
golly.Golly\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/golly/#json-dump","title":"JSON dump","text":"

json source file golly.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"golly\",\n    \"icon\": \"golly.svg\",\n    \"keyword\": \"golly\",\n    \"launch\": \"golly.Golly\",\n    \"name\": \"Golly\",\n    \"path\": \"/usr/games/golly\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\n}\n
"},{"location":"applications/golly/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output golly.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/golly.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @golly.d.3.0.json\n\n
"},{"location":"applications/golly/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends golly && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"golly.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDUwOCA1MDgiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUwOCA1MDg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZEODQ2OTsiIGN4PSIyNTQiIGN5PSIyNTQiIHI9IjI1NCIvPg0KPGc+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzMyNEE1RTsiIGQ9Ik0yNTQuOCwyNTMuNmwtODUuNiwxMy4yYy0yLDAuNC00LjQtMC40LTUuNi0ybC01NC40LTY3LjZjLTEuMi0xLjYtMS42LTQtMC44LTZsMzEuMi04MC44DQoJCWMwLjgtMiwyLjQtMy42LDQuOC0zLjZMMjMwLDkzLjJjMi0wLjQsNC40LDAuNCw1LjYsMmw1NC40LDY4YzEuMiwxLjYsMS42LDQsMC44LDZMMjU5LjYsMjUwQzI1OC44LDI1MS42LDI1Ni44LDI1My4yLDI1NC44LDI1My42eg0KCQkgTTE3MC44LDI1NC40bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYyTDE0OS42LDExOGwtMjguOCw3NC40TDE3MC44LDI1NC40eiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiMzMjRBNUU7IiBkPSJNMjc3LjYsNDAxLjZMMTkyLDQxNC44Yy0yLDAuNC00LjQtMC40LTUuNi0ybC01NC02Ny42Yy0xLjItMS42LTEuNi00LTAuOC02bDMxLjItODAuOA0KCQljMC44LTIsMi40LTMuNiw0LjgtMy42bDg1LjYtMTMuMmMyLTAuNCw0LjQsMC40LDUuNiwybDU0LjQsNjcuNmMxLjIsMS42LDEuNiw0LDAuOCw2TDI4Mi40LDM5OEMyODEuNiw0MDAsMjgwLDQwMS42LDI3Ny42LDQwMS42eg0KCQkgTTE5My42LDQwMi44bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYybC03OC44LDEyLjRsLTI4LjgsNzQuNEwxOTMuNiw0MDIuOHoiLz4NCgk8cGF0aCBzdHlsZT0iZmlsbDojMzI0QTVFOyIgZD0iTTM5NC44LDMwNy42bC04NS42LDEzLjJjLTIsMC40LTQuNC0wLjQtNS42LTJsLTU0LjQtNjcuNmMtMS4yLTEuNi0xLjYtNC0wLjgtNmwzMS4yLTgwLjgNCgkJYzAuOC0yLDIuNC0zLjYsNC44LTMuNmw4NS42LTEzLjJjMi0wLjQsNC40LDAuNCw1LjYsMmw1NC40LDY3LjZjMS4yLDEuNiwxLjYsNCwwLjgsNkwzOTkuNiwzMDRDMzk4LjgsMzA2LDM5Ni44LDMwNy4yLDM5NC44LDMwNy42DQoJCXogTTMxMC44LDMwOC44bDc4LjgtMTIuNGwyOC44LTc0LjRsLTUwLTYybC03OC44LDEyLjRsLTI4LjgsNzQuNEwzMTAuOCwzMDguOHoiLz4NCjwvZz4NCjxnPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIyODUuMiIgY3k9IjE2Ni44IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjM3MC44IiBjeT0iMTUzLjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iNDI1LjIiIGN5PSIyMjAuOCIgcj0iMjcuNiIvPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIzOTMuNiIgY3k9IjMwMC40IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjMwOCIgY3k9IjMxNS4yIiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjI1NCIgY3k9IjI0Ny42IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjE2OC40IiBjeT0iMjYwLjgiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTE0IiBjeT0iMTkzLjIiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTQ2IiBjeT0iMTE1LjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMjMzLjYiIGN5PSI5OC44IiByPSIyNy42Ii8+DQoJPGNpcmNsZSBzdHlsZT0iZmlsbDojRkZGRkZGOyIgY3g9IjEzNi44IiBjeT0iMzQxLjYiIHI9IjI3LjYiLz4NCgk8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkZGRkY7IiBjeD0iMTkxLjIiIGN5PSI0MDkuMiIgcj0iMjcuNiIvPg0KCTxjaXJjbGUgc3R5bGU9ImZpbGw6I0ZGRkZGRjsiIGN4PSIyNzYuNCIgY3k9IjM5Mi44IiByPSIyNy42Ii8+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"golly,golly\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"golly.Golly\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"Golly\"\nLABEL oc.displayname=\"Golly\"\nLABEL oc.path=\"/usr/games/golly\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Golly\"\nENV APPBIN \"/usr/games/golly\"\nENV APP \"/usr/games/golly\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/golly/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/golly/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Golly

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Golly.d\n
"},{"location":"applications/golly/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Golly.d -t Golly .\n
"},{"location":"applications/golly/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Golly > Golly.json\ndocker image save Golly -o Golly.tar\nctr -n k8s.io images import Golly.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Golly.json\n\n
"},{"location":"applications/gretl/","title":"Gretl","text":""},{"location":"applications/gretl/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/gretl/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/gretl/#ubuntu-packages","title":"Ubuntu packages","text":"
gretl\n
"},{"location":"applications/gretl/#path","title":"Path","text":"
/usr/bin/gretl\n
"},{"location":"applications/gretl/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/gretl/#wm_class","title":"WM_CLASS","text":"
gretl_x11.Gretl_x11\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/gretl/#json-dump","title":"JSON dump","text":"

json source file

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"gretl\",\n    \"icon\": \"gretl.svg\",\n    \"keyword\": \"gretl\",\n    \"launch\": \"gretl_x11.Gretl_x11\",\n    \"name\": \"Gretl\",\n    \"path\": \"/usr/bin/gretl\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/gretl/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output Gretl.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gretl.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gretl.json\n\n
"},{"location":"applications/gretl/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gretl && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gretl.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwODhwdCIgaGVpZ2h0PSI4MjBwdCIgdmlld0JveD0iMCAwIDEwODggODIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGw9IiNmZGZkZmQiIGQ9IiBNIDAuMDAgMC4wMCBMIDEwODguMDAgMC4wMCBMIDEwODguMDAgODIwLjAwIEwgMC4wMCA4MjAuMDAgTCAwLjAwIDAuMDAgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gNjExLjk5IDE5LjA3IEMgNjE5LjM4IDE5LjM5IDYyNS44NSAxNS40MCA2MzIuNDYgMTIuNzMgQyA2MzEuMzEgMTYuNjIgNjMwLjcwIDIwLjcwIDYzMS4yNiAyNC43NSBDIDYzNC4wNiAyNy41NCA2MzguNDEgMjcuMjcgNjQxLjYzIDI5LjMyIEMgNjQ0LjYwIDMxLjQxIDY0NS44MCAzNS40OCA2NDkuMzkgMzYuNzcgQyA2NTEuNDYgMzcuNjEgNjUzLjQwIDM1LjkyIDY1NS4yNiAzNS4yMiBDIDY1NS4wMCAzOC43MCA2NTMuODIgNDIuMTMgNjU0LjE5IDQ1LjYzIEMgNjU2LjQ2IDQ5LjgyIDY2MS40NiA1MS4yMCA2NjUuOTIgNTEuMTMgQyA2NzAuNzYgNTEuMzkgNjc1LjU5IDUxLjg0IDY4MC40NCA1MS45MCBDIDY4MC44MCA0OS43OCA2ODEuMTEgNDcuNjUgNjgxLjQ3IDQ1LjU0IEMgNjgzLjc0IDQ5LjM2IDY4NS41NCA1My40NCA2ODcuNjYgNTcuMzQgQyA2ODkuMzAgNTkuMzYgNjkxLjAwIDYxLjM0IDY5Mi4yMiA2My42NyBDIDY5MC4wNiA2My44MyA2ODcuOTIgNjMuOTkgNjg1Ljc5IDY0LjMxIEMgNjg3LjY4IDY5LjU1IDY4OS44NSA3NS4wNiA2ODguNjcgODAuNzMgQyA2ODcuODQgODQuMTUgNjg5LjExIDg3LjUxIDY5MC4wNSA5MC43NiBDIDY5NC4xMCA5MS44MSA2OTcuNzYgOTQuMTAgNzAxLjg2IDk0Ljg4IEMgNzA1LjM0IDkzLjcxIDcwOC4zNCA5MS4zNiA3MTEuOTEgOTAuNDIgQyA3MTQuNzEgODkuOTQgNzE3LjU2IDg5Ljk3IDcyMC40MCA4OS44NSBDIDcyMS40NCA4OC4xNCA3MjIuMzYgODYuMjYgNzI0LjA0IDg1LjA1IEMgNzI4LjkzIDgxLjMxIDczMi44MCA3Ni40NSA3MzcuNTIgNzIuNTAgQyA3MzkuODMgNzAuNzUgNzQxLjI0IDY4LjE4IDc0My4xMSA2Ni4wMiBDIDc0NC45NyA2NS4xMCA3NDcuMDggNjUuNzUgNzQ5LjA2IDY1Ljc4IEMgNzU5LjQ1IDY2LjE3IDc3MC4wMiA2Ni43MCA3NzkuOTggNzAuMDAgQyA3ODMuOTYgNzEuNDAgNzg4LjMyIDcwLjQzIDc5Mi4yOSA3MS43NCBDIDc5OC43OSA3NC43OCA4MDYuMTggNzQuMDUgODEzLjAyIDc1LjkwIEMgODE2LjUyIDc1Ljk2IDgxOC40MyA3OS4xOCA4MjAuNjkgODEuMzUgQyA4MjIuMTQgODMuMDUgODI0LjMwIDgzLjgwIDgyNi4xNyA4NC45MyBDIDgzNC45NSA5MS43MCA4NDAuMTggMTAxLjY5IDg0Ni4zMCAxMTAuNzEgQyA4NDguNzQgMTE1LjA3IDg1MS4yMiAxMTkuNDYgODUyLjc3IDEyNC4yNCBDIDg1NS45MCAxMzMuNzUgODYxLjMzIDE0Mi42MSA4NjIuMzEgMTUyLjczIEMgODYzLjgyIDE1Ny42MyA4NjYuMzQgMTYyLjM2IDg2OS44MSAxNjYuMTYgQyA4NzMuNjEgMTY5LjM0IDg3Ny45MiAxNzIuNDEgODc5LjgyIDE3Ny4xOSBDIDg4MS42MiAxODIuMjggODgwLjQ5IDE4Ny44MCA4ODEuOTMgMTkyLjk3IEMgODg0LjQ2IDE5My4wMCA4ODcuMDAgMTkzLjAxIDg4OS41NSAxOTMuMDMgQyA4OTAuMTYgMTk1LjY4IDg5MC44MyAxOTguNDAgODkyLjM4IDIwMC42OCBDIDg5NS42MyAyMDIuODIgODk5LjcxIDIwMi44MyA5MDMuNDIgMjAzLjYwIEMgOTA4LjU4IDIwNC4zNyA5MTMuNTggMjA1Ljg5IDkxOC41NCAyMDcuNDggQyA5MjEuMTYgMjA4LjIzIDkyMi4zNCAyMTAuOTkgOTI0LjU2IDIxMi4zOCBDIDkzMS4wNSAyMTYuNjkgOTM5LjA5IDIxNy45OSA5NDUuMzkgMjIyLjY1IEMgOTQ5LjYxIDIyNS43OCA5NTQuMTYgMjI4LjQ1IDk1OC4zMyAyMzEuNjcgQyA5NjEuMTQgMjMzLjc5IDk2NC43NCAyMzQuNDIgOTY3LjY4IDIzNi4zNCBDIDk3My4xNCAyMzkuODUgOTc5LjE4IDI0Mi4yNiA5ODUuMDAgMjQ1LjA4IEMgOTg3LjgwIDI0Ni43NiA5OTEuMDggMjQ1LjM1IDk5NC4xMiAyNDUuODMgQyA5OTYuNzAgMjQ1Ljc5IDk5OS4wNSAyNDYuOTAgMTAwMS4zMSAyNDguMDYgQyAxMDAwLjcyIDI1MC4yOSA5OTkuNDAgMjUyLjQxIDk5OS4zOSAyNTQuNzQgQyAxMDAwLjIyIDI1Ni42NCAxMDAxLjY3IDI1OC4xOCAxMDAyLjk2IDI1OS43OSBDIDEwMDEuODUgMjYxLjE3IDEwMDAuNjggMjYyLjUyIDk5OS45MCAyNjQuMTIgQyAxMDAwLjU3IDI2OC41MSAxMDA3LjU1IDI2OS4yMSAxMDA2Ljk3IDI3My45NiBDIDEwMDYuODYgMjc1LjcwIDEwMDYuNDYgMjc3LjQxIDEwMDYuMTYgMjc5LjEzIEMgMTAwOC42NyAyNzkuMjAgMTAxMS4xOCAyNzkuMTUgMTAxMy43MSAyNzkuMjEgQyAxMDEzLjkwIDI4My4zMyAxMDEzLjk5IDI4Ny40NiAxMDE0LjA5IDI5MS41OSBDIDEwMTcuMzggMjkzLjQ5IDEwMTkuNjIgMjk2LjU2IDEwMjEuNDIgMjk5Ljg0IEMgMTAxOS4xNCAyOTkuNTAgMTAxNi44NyAyOTkuMTQgMTAxNC42MCAyOTguOTAgQyAxMDE1Ljk1IDMwNS4zMiAxMDIwLjUzIDMxMC40NCAxMDIyLjM3IDMxNi42OSBDIDEwMjUuNTIgMzI0LjQ2IDEwMjkuMzUgMzMyLjAyIDEwMzQuODEgMzM4LjQ1IEMgMTAzMS4zNCAzMzguMzcgMTAyNy44OCAzMzguNzUgMTAyNC43MCAzNDAuMjQgQyAxMDI3LjY3IDM0OC4zNyAxMDMxLjE2IDM1Ni4zMyAxMDMzLjI3IDM2NC43NCBDIDEwMzcuMzAgMzc2Ljg3IDEwMzcuNzYgMzg5Ljc2IDEwNDAuOTIgNDAyLjA5IEMgMTA0Mi40OSA0MDkuMzIgMTA0NC45MSA0MTYuNTMgMTA0NC43MyA0MjQuMDEgQyAxMDQ1LjEwIDQyNy4wOSAxMDQ2LjgyIDQyOS44NyAxMDQ2Ljk1IDQzMy4wMSBDIDEwNDcuMjcgNDM5LjAzIDEwNDYuMzggNDQ1LjE3IDEwNDcuODkgNDUxLjEwIEMgMTA0OS4yMCA0NTYuNDYgMTA0OS41MCA0NjIuMDEgMTA1MC43MyA0NjcuMzggQyAxMDUzLjcwIDQ3NC41MCAxMDUyLjk4IDQ4Mi4zNCAxMDU0LjAwIDQ4OS44MyBDIDEwNTQuMTAgNDk2LjQ2IDEwNTYuNTUgNTAyLjcwIDEwNTcuODggNTA5LjEzIEMgMTA1OC42OSA1MTIuOTUgMTA1OC41NSA1MTYuODYgMTA1OC43OCA1MjAuNzQgQyAxMDU4LjkxIDUyNC42NCAxMDYwLjg1IDUyOC4zNCAxMDYwLjI1IDUzMi4zMCBDIDEwNTkuMzYgNTM3LjkwIDEwNjMuMjggNTQzLjc5IDEwNTkuOTIgNTQ4Ljk4IEMgMTA2MC43MyA1NDkuODYgMTA2MS41OSA1NTAuNzIgMTA2Mi4zNyA1NTEuNjcgQyAxMDYyLjMwIDU1My40NiAxMDYxLjc3IDU1NS4yMCAxMDYxLjY5IDU1Ny4wMCBDIDEwNjIuMDcgNTU5Ljk0IDEwNjMuNTEgNTYzLjA3IDEwNjIuMDIgNTY1Ljk1IEMgMTA1OS42OSA1NzEuMzQgMTA2MS43MSA1NzcuMjAgMTA2Mi4zNSA1ODIuNzMgQyAxMDYzLjQyIDU4Ny40NiAxMDYxLjY2IDU5Mi4xOSAxMDYxLjk5IDU5Ni45NyBDIDEwNjIuMjAgNjAyLjMzIDEwNjEuODEgNjA3LjY4IDEwNjEuMTMgNjEzLjAwIEMgMTA2MS4xNSA2MTkuNjQgMTA1OS4yNyA2MjYuMjEgMTA2MC4xOSA2MzIuODYgQyAxMDYwLjcyIDYzNi4zMSAxMDYxLjQyIDYzOS43NiAxMDYxLjMyIDY0My4yOCBDIDEwNjEuMDcgNjQ2LjE4IDEwNjQuMDggNjQ4LjEwIDEwNjMuOTYgNjUxLjAwIEMgMTA2NC4yMyA2NTYuOTkgMTA2My43NyA2NjMuMDEgMTA2NC4wMyA2NjkuMDEgQyAxMDY0LjEzIDY3Mi4yMSAxMDY2LjE3IDY3NC44NyAxMDY3LjEyIDY3Ny44NSBDIDEwNjguNDIgNjgxLjA5IDEwNjcuNzkgNjg0LjYzIDEwNjcuOTggNjg4LjAzIEMgMTA2OC4wMyA2OTEuNDEgMTA2OS4zNSA2OTQuNTkgMTA3MC4yNCA2OTcuODIgQyAxMDY2LjQ3IDcwMC4wMiAxMDYyLjc1IDcwMi43MyAxMDU4LjMwIDcwMy4yNiBDIDEwNTUuMTIgNzAzLjkzIDEwNTEuNTkgNzAzLjgwIDEwNDguOTYgNzA2LjAwIEMgMTA0NS40NyA3MDguNjQgMTA0MS41NiA3MTAuNjIgMTAzNy43NSA3MTIuNzQgQyAxMDM1LjE4IDcxNS4zMSAxMDMzLjAzIDcxOC4yOCAxMDMwLjg5IDcyMS4yMiBDIDEwMjguOTIgNzIzLjY5IDEwMzEuMTMgNzI2Ljc4IDEwMzEuNDkgNzI5LjQ2IEMgMTAzMi40NyA3MzUuNzIgMTAzMi45MyA3NDIuNDUgMTAzMC41MCA3NDguNDcgQyAxMDI5LjY2IDc1MS40OSAxMDMwLjAxIDc1NC42OCAxMDI5Ljk0IDc1Ny43OSBDIDEwMjUuNDYgNzYxLjQxIDEwMjEuMTggNzY1LjQ3IDEwMTUuODUgNzY3Ljg1IEMgMTAxMi45NCA3NjkuMTYgMTAwOS42MSA3NjguNjYgMTAwNi42NSA3NjkuNjcgQyAxMDAwLjE3IDc3My41MSA5OTIuMjUgNzcyLjkyIDk4NS4wMCA3NzMuMDEgQyA5NzguMDYgNzczLjIyIDk3MC45NiA3NzIuMjAgOTY0LjIwIDc3NC4xOSBDIDk1Ni4yMSA3NzYuNDcgOTQ4LjA4IDc3My42OCA5NDAuMDEgNzczLjk3IEMgOTMyLjc1IDc3My44OCA5MjUuMzYgNzc0LjY2IDkxOC4yNiA3NzIuNzUgQyA5MTEuMTEgNzcwLjgxIDkwMy4wNyA3NzMuODYgODk2LjUyIDc2OS41NCBDIDg5MC4yNiA3NjcuMjcgODg1Ljg4IDc2Mi4xMyA4ODAuMzggNzU4LjYyIEMgODc2LjU0IDc1Ni4yMSA4NzMuNDggNzUyLjc1IDg2OS41MiA3NTAuNTMgQyA4NjIuODYgNzQ3LjYyIDg2MC41MCA3NDAuMTUgODU2LjAyIDczNC45OCBDIDg1NC43OSA3MzIuNjkgODUxLjU4IDczMS4wNiA4NTIuMDQgNzI4LjIxIEMgODUzLjQyIDcyNS4xMiA4NTUuNjEgNzIxLjg0IDg1OS4xNCA3MjEuMDYgQyA4NjEuMjggNzIxLjE2IDg2My40MiA3MjEuNzEgODY1LjQyIDcyMi41NCBDIDg2OC41NyA3MjQuMzcgODcwLjg3IDcyOC40MyA4NzQuOTggNzI4LjAxIEMgODgxLjE5IDcyNy4zMiA4ODcuMzkgNzI2LjQ2IDg5My41OSA3MjUuNjYgQyA4OTYuNTkgNzIxLjQ0IDg5OS4zNCA3MTYuNDQgODk5LjUxIDcxMS4xMCBDIDg5OS4xNCA3MDguNzQgODk2LjY1IDcwNy43MyA4OTUuMDAgNzA2LjM5IEMgODk1LjA2IDcwNC4wMSA4OTQuNjEgNzAxLjYzIDg5Mi40OSA3MDAuMjMgQyA4ODYuMDUgNjk4LjU3IDg4MC4zOSA3MDMuNTYgODczLjk4IDcwMy4xMCBDIDg3MS4wMyA3MDMuNjEgODY5LjE3IDcwMS4wMyA4NjYuNzYgNjk5Ljk2IEMgODY0LjA0IDY5OS43MSA4NjEuNjcgNzAxLjMxIDg1OS4yMyA3MDIuMjAgQyA4NTIuNDMgNzA0LjY5IDg0NC43NyA3MDYuNDAgODM3Ljc2IDcwMy43MiBDIDgzMi40OSA3MDQuNzkgODI1LjYzIDcwNy4wNCA4MjEuMzIgNzAyLjY2IEMgODE4LjE3IDY5OS42MiA4MTMuMzQgNzAxLjkxIDgwOS41OCA3MDAuMzggQyA4MDYuMDIgNjk5LjM5IDgwMy40NyA2OTUuMTQgNzk5LjQxIDY5Ni4zOSBDIDc5NS4yOSA2OTcuMzQgNzkxLjE1IDY5Ni4wOSA3ODcuMjkgNjk0Ljc1IEMgNzg0LjA3IDY5My41MSA3ODAuMjYgNjk0LjY5IDc3Ny4zMiA2OTIuNjcgQyA3NzQuMTUgNjkwLjI1IDc3MC4wMiA2OTEuMDkgNzY2LjMzIDY5MC45MyBDIDc2NS4yMCA2ODkuMzQgNzY0LjA3IDY4Ny43NyA3NjIuOTAgNjg2LjIzIEMgNzU5LjAyIDY4Ni4yMSA3NTUuMTQgNjg1Ljk2IDc1MS4yNyA2ODUuOTUgQyA3NTAuNDEgNjg0LjYzIDc0OS41NiA2ODMuMzIgNzQ4LjcxIDY4Mi4wMiBDIDc0NC4yMiA2ODEuNzEgNzM4LjcxIDY4My4yNyA3MzUuMTcgNjc5LjcxIEMgNzM0LjU0IDY3NC4zOSA3MzUuMzggNjY5LjA0IDczNS4yMiA2NjMuNzEgQyA3MzUuMDMgNjU4LjUzIDczNy42MCA2NTMuODQgNzM5LjA1IDY0OS4wMSBDIDc0MC4zMSA2NDQuOTQgNzQzLjQ5IDY0MS44MCA3NDQuODEgNjM3Ljc5IEMgNzQ1LjI4IDYzMy4xOSA3NDQuOTMgNjI4LjU1IDc0NS4wNCA2MjMuOTQgQyA3NDQuOTAgNjIxLjk5IDc0NS4zMiA2MTkuNzIgNzQzLjkwIDYxOC4xNSBDIDc0MS42OCA2MTUuMDggNzM5Ljc1IDYxMS41NiA3MzYuMjEgNjA5LjgxIEMgNzMxLjIyIDYwNy4yMCA3MjcuMDkgNjAzLjM0IDcyMi42NSA1OTkuOTQgQyA3MjYuNTEgNTk1LjY5IDczMC44MCA1OTEuODcgNzM1LjEyIDU4OC4xMSBDIDczOS4wNCA1ODEuNzUgNzQxLjM5IDU3NC41NiA3NDMuMjkgNTY3LjM3IEMgNzQ0LjE0IDU2NC42MiA3NDIuMzAgNTYxLjUzIDc0My44OSA1NTguOTcgQyA3NDYuMzEgNTU0LjYwIDc0OC4yOSA1NDkuODkgNzQ4Ljg4IDU0NC44OSBDIDc0OS4zMiA1NDIuMDIgNzQ4Ljk3IDUzOC45OCA3NTAuMjAgNTM2LjI3IEMgNzUyLjczIDUyOS45MyA3NTQuNDYgNTIzLjI5IDc1NS41OSA1MTYuNTYgQyA3NTYuMTIgNTEzLjQ1IDc1My44OSA1MTAuMzkgNzU1LjI1IDUwNy4zMyBDIDc1Ny42NCA1MDEuODMgNzU5Ljk0IDQ5Ni4xMSA3NjAuMDYgNDkwLjAxIEMgNzYwLjExIDQ4NS40OCA3NjIuMDkgNDgxLjA2IDc2MS4yMSA0NzYuNTIgQyA3NjAuNzMgNDczLjkwIDc2MS41MCA0NzEuMjggNzYxLjc2IDQ2OC42OSBDIDc2MS44MSA0NjUuNDUgNzY2LjAyIDQ2NC4yMCA3NjUuOTUgNDYwLjk0IEMgNzY2LjM3IDQ1Mi4yNyA3NjQuOTYgNDQzLjM5IDc2Ny43MiA0MzQuOTcgQyA3NjguMDEgNDMxLjIzIDc3MS4wMSA0MjguNzUgNzcyLjU5IDQyNS42MCBDIDc3NC4xOSA0MjEuMjEgNzczLjc0IDQxNi40MyA3NzQuOTggNDExLjk3IEMgNzc3Ljk2IDQwMS4wMiA3ODMuMDAgMzkwLjgxIDc4Ny42MiAzODAuNTAgQyA3ODkuMDggMzc3LjMyIDc4Ni4yOCAzNzQuNTYgNzg1LjIzIDM3MS43NyBDIDc4NS4zNCAzNjkuNDQgNzg2LjM5IDM2Ny4zMCA3ODcuMDcgMzY1LjExIEMgNzg5LjMzIDM1OS4wNyA3OTAuNzEgMzUyLjY0IDc5NC4wNSAzNDcuMDUgQyA3OTcuMjUgMzQxLjYyIDgwMC44MCAzMzYuMzQgODAzLjA2IDMzMC40MiBDIDgwNC44NSAzMjUuMzcgODA4LjExIDMyMS4wMiA4MTAuMDAgMzE2LjAyIEMgODExLjQzIDMxMi45MSA4MTEuNzMgMzA5LjQwIDgxMy4yOSAzMDYuMzYgQyA4MTUuNTAgMzA0LjMyIDgxOC4zMCAzMDMuMDUgODIwLjY0IDMwMS4xNyBDIDgxOC40MCAyOTguNjQgODE1Ljg2IDI5Ni4zNiA4MTIuNzUgMjk0Ljk3IEMgODEyLjkxIDI5OC4wOSA4MTIuODUgMzAyLjYyIDgwOS40MyAzMDMuOTcgQyA4MDUuNDIgMzA0LjQ1IDgwMS4zNCAzMDMuNDMgNzk3LjM1IDMwNC4xOSBDIDc5NC45MCAzMDUuNjggNzk0Ljg3IDMwOC43OCA3OTQuMjQgMzExLjI1IEMgNzkzLjU2IDMxNS4xOSA3OTIuMjQgMzE4Ljk5IDc5MC42MCAzMjIuNjMgQyA3ODkuMjQgMzI1LjcyIDc4Ni41MiAzMjcuODYgNzg0LjQ4IDMzMC40NyBDIDc3OS4zMSAzMzYuOTMgNzcyLjMzIDM0MS44NyA3NjguMDIgMzQ5LjAzIEMgNzY1Ljk3IDM1Mi40NiA3NjYuMTggMzU2LjczIDc2NC4wNyAzNjAuMTQgQyA3NjEuOTQgMzYzLjY1IDc1OC41MyAzNjcuMzEgNzU0LjA1IDM2Ny4wNSBDIDc0Ny4yNSAzNjcuMTQgNzQyLjgxIDM2MC44MyA3MzYuNDMgMzU5LjQ5IEMgNzMzLjYzIDM1OC40NyA3MzAuNzUgMzU5LjU5IDcyOC4wMSAzNjAuMTkgQyA3MjcuOTIgMzY0LjE0IDcyNy44NSAzNjguMTcgNzI5LjAxIDM3Mi4wMSBDIDczMC4zMSAzNzYuNDEgNzMwLjU1IDM4MS42OCA3MjcuNTYgMzg1LjQ5IEMgNzIzLjM0IDM4Ny40NSA3MTkuNjUgMzkwLjI2IDcxNS42NCAzOTIuNTggQyA3MDkuMzAgMzk0Ljk4IDcwNC4xMCAzOTkuOTEgNzAwLjcwIDQwNS43MCBDIDY5Ny43NyA0MTEuOTMgNzAwLjQ3IDQxOC41MCA3MDEuMjIgNDI0Ljg2IEMgNjk3LjY1IDQyMi44OCA2OTMuNzggNDIxLjU4IDY5MC4xMiA0MTkuNzkgQyA2ODguNDIgNDE4Ljg5IDY4Ni4zNCA0MTguNTkgNjg0LjU4IDQxOS40OCBDIDY4My40MyA0MjIuODYgNjg0LjAyIDQyNi41MCA2ODMuOTYgNDMwLjAwIEMgNjg0LjE4IDQzNy4yOCA2ODMuNjggNDQ0LjU4IDY4NC4yMiA0NTEuODUgQyA2ODUuMzAgNDU4LjAyIDY4NC45MCA0NjQuMjkgNjg1LjM0IDQ3MC41MiBDIDY4NS43MiA0NzUuNDAgNjg0LjM4IDQ4MC4zMyA2ODUuNjUgNDg1LjE2IEMgNjg2LjYzIDQ4OC43OCA2ODQuODEgNDkyLjM0IDY4NC45OSA0OTUuOTcgQyA2ODUuMDQgNDk4LjA4IDY4Ni4wMyA0OTkuOTkgNjg2LjQ0IDUwMi4wNCBDIDY4Ny4wMiA1MDcuMTMgNjg1LjQ2IDUxMi4yNCA2ODYuNjMgNTE3LjMwIEMgNjg3Ljg4IDUyNC4xMCA2ODguMDAgNTMwLjk4IDY4OC4yNSA1MzcuODYgQyA2ODkuNDUgNTQzLjI0IDY4Ny41MSA1NDguNjEgNjg3Ljk4IDU1NC4wMyBDIDY4Ny45OSA1NTcuMTIgNjg5LjYzIDU1OS45OCA2ODkuNDcgNTYzLjA3IEMgNjg5LjA3IDU2OC40OCA2OTAuMzAgNTczLjk0IDY4OC45NSA1NzkuMjggQyA2ODkuNjIgNTc4LjM4IDY5MC4zMSA1NzcuNDkgNjkxLjAxIDU3Ni42MSBDIDY4OS45NSA1ODIuMjkgNjkxLjYzIDU4OC4wMyA2OTAuNzAgNTkzLjczIEMgNjg5LjU0IDYwMC4wOSA2OTAuMTIgNjA2LjU3IDY5MC4xMiA2MTIuOTkgQyA2OTAuNDcgNjIxLjc1IDY4OS4xMSA2MzAuNjEgNjkwLjc3IDYzOS4zMCBDIDY5MS4zOSA2NDIuNjIgNjg5Ljc2IDY0NS45MyA2OTAuNjcgNjQ5LjI0IEMgNjkyLjAxIDY1NS42MyA2OTMuMTMgNjYyLjA3IDY5My41NiA2NjguNjAgQyA2OTQuMTAgNjczLjI4IDY5My44MCA2NzguNDMgNjk2LjY3IDY4Mi40NSBDIDY5OC4xNCA2ODQuNDMgNjk3LjUyIDY4Ny4wMiA2OTcuOTcgNjg5LjI5IEMgNjk4LjEzIDY5Mi4xNyA3MDAuOTUgNjk0LjA5IDcwMC45NiA2OTcuMDAgQyA3MDEuMTUgNzAwLjMxIDcwMS4wMCA3MDMuNjQgNzAwLjk3IDcwNi45NiBDIDY5Ni42NiA3MDcuMzMgNjkyLjI2IDcwNy40NSA2ODguMTUgNzA1Ljg3IEMgNjg0LjUwIDcwNS4xMiA2ODMuMjAgNzAxLjIzIDY4MS45MSA2OTguMjEgQyA2ODAuMDEgNjkxLjA1IDY4MC4yMCA2ODMuNTggNjc5LjY2IDY3Ni4yNiBDIDY3Ny41MSA2NjkuODAgNjc4LjI0IDY2Mi45MyA2NzYuOTUgNjU2LjMxIEMgNjc2LjY3IDY0OC41NSA2NzcuMzQgNjQwLjc3IDY3Ni45MSA2MzMuMDEgQyA2NzYuNTUgNjI5LjUxIDY3NC45NyA2MjYuMjUgNjc0Ljc2IDYyMi43MiBDIDY3NC4zNCA2MjAuMTcgNjc2LjEyIDYxNy44NCA2NzUuNzAgNjE1LjI5IEMgNjc0LjY3IDYwOC41NSA2NzIuNjIgNjAxLjg5IDY3My4wMCA1OTUuMDAgQyA2NzMuMzMgNTg5LjIwIDY3MS43MyA1ODMuNTcgNjcxLjI2IDU3Ny44NCBDIDY3MS40NyA1NzMuNjIgNjcyLjMzIDU2OS4zOSA2NzEuNDcgNTY1LjE4IEMgNjcxLjg1IDU2NS4zMCA2NzIuNjAgNTY1LjUzIDY3Mi45NyA1NjUuNjUgQyA2NzMuMDAgNTY1LjA4IDY3My4wNSA1NjMuOTUgNjczLjA3IDU2My4zOCBDIDY3Mi41NyA1NjMuNDggNjcxLjU3IDU2My42NyA2NzEuMDcgNTYzLjc3IEMgNjcyLjU2IDU1Ni45MiA2NzEuOTIgNTQ5Ljg5IDY3Mi4yMSA1NDIuOTYgQyA2NzEuNDQgNTM1LjY0IDY3Mi40MCA1MjguMzAgNjcyLjMxIDUyMC45OCBDIDY3Mi40OSA1MTguNjYgNjcxLjMzIDUxNi42NSA2NzAuMTkgNTE0Ljc0IEMgNjcyLjcyIDUxMC4xMyA2NzAuNTYgNTA0Ljk3IDY2OS4xMSA1MDAuMzkgQyA2NjguMDUgNDkzLjc5IDY2Ny45NCA0ODcuMDkgNjY3LjgyIDQ4MC40MiBDIDY2Ny43OCA0NzYuNDQgNjY2LjMzIDQ3Mi43MCA2NjUuNTkgNDY4Ljg0IEMgNjY1LjQ0IDQ2Mi4xOSA2NjQuMjkgNDU1LjYwIDY2My4wMSA0NDkuMDkgQyA2NjEuMDUgNDQ4LjcxIDY1OS4xMyA0NDguMTUgNjU3LjE0IDQ0OC4wMyBDIDY1My44NCA0NDguOTMgNjUxLjk1IDQ1Mi4wMiA2NDkuODAgNDU0LjQyIEMgNjQ4Ljc1IDQ0Ni42NCA2NDguNjQgNDM4LjQxIDY0NC41OCA0MzEuNDIgQyA2NDIuMjMgNDI4LjA5IDYzOC4yOSA0MjUuODkgNjM2Ljk5IDQyMS44NyBDIDYzNy4yMiA0MTcuMzcgNjM5Ljg2IDQxMy41MCA2NDEuMzEgNDA5LjM0IEMgNjQzLjUxIDQwMi43OSA2NDMuMTEgMzk1Ljc4IDY0Mi45MCAzODguOTggQyA2NDIuOTAgMzg2LjI0IDY0MS42OCAzODMuMTEgNjQzLjY3IDM4MC43NiBDIDY0OS4xOSAzNzIuNDMgNjU5LjkyIDM3MC4zNyA2NjkuMTUgMzY5LjI1IEMgNjc3Ljk4IDM2OS40MSA2ODYuNjIgMzY2LjY0IDY5NC4xOSAzNjIuMjEgQyA2OTcuNzcgMzYwLjQzIDY5OC41NiAzNTQuMDggNjk0LjUyIDM1Mi40NiBDIDY4OS40NiAzNTAuMTIgNjgzLjc2IDM1MC4zNCA2NzguMzcgMzQ5LjYxIEMgNjczLjI1IDM0OC44NCA2NzEuMjIgMzQzLjEzIDY2Ni42NiAzNDEuMjkgQyA2NjQuNTIgMzQxLjA4IDY2Mi40MiAzNDEuNzcgNjYwLjMyIDM0Mi4wNCBDIDY1OS4xMCAzMzkuOTEgNjU4LjQzIDMzNi45NyA2NTUuNzcgMzM2LjIxIEMgNjUyLjExIDMzNC44NSA2NDguMjIgMzM0LjI1IDY0NC40MSAzMzMuNDcgQyA2MzYuNzkgMzMxLjYyIDYyOS44OSAzMzcuMzUgNjIyLjI1IDMzNi4zMiBDIDYxOC4wOSAzMzQuNTMgNjE1LjcxIDMzMC4wOCA2MTEuMzAgMzI4Ljc1IEMgNjA3Ljc3IDMyNy43NyA2MDQuMTEgMzI3LjQwIDYwMC41OCAzMjYuNDUgQyA1OTUuNDggMzI1LjQ5IDU5MC43OSAzMjMuMDMgNTg1LjYxIDMyMi40MiBDIDU3NS44OSAzMjEuMTYgNTY2LjA5IDMyMC41NiA1NTYuMzQgMzE5LjcyIEMgNTUzLjg4IDMxNy45MyA1NTMuMDIgMzE0Ljg0IDU1MS43NyAzMTIuMjIgQyA1NDkuNzMgMzA3LjIzIDU0Ni44NiAzMDIuNjQgNTQzLjY3IDI5OC4zMyBDIDUzOS44MSAyOTMuODUgNTM1LjAyIDI5MC4yMiA1MzEuNTkgMjg1LjM2IEMgNTI5LjY3IDI4Mi42MiA1MjYuNjggMjgwLjcyIDUyNS4yNiAyNzcuNjQgQyA1MjUuMzkgMjY1LjE0IDUyOS41NSAyNTMuMjQgNTMyLjE5IDI0MS4xNCBDIDUzMi44OCAyMzcuOTkgNTM1LjMzIDIzNS4zNyA1MzguNDQgMjM0LjQ5IEMgNTQ0LjM1IDIzMi44MSA1NDkuNTUgMjI5LjQyIDU1NS4yOCAyMjcuMjggQyA1NjAuMjEgMjI1LjQyIDU2NC4xMiAyMjEuNzcgNTY4Ljg1IDIxOS41NSBDIDU2OC45MyAyMjEuMDAgNTY5LjAxIDIyMi40NiA1NjkuMDkgMjIzLjkyIEMgNTY1LjA2IDIyNy4zNCA1NjEuNzMgMjMxLjU2IDU1Ny4xOSAyMzQuMzkgQyA1NTMuMTAgMjM3LjgwIDU0Ny4yMyAyMzguODAgNTQ0LjE5IDI0My40NiBDIDU0Mi43NCAyNDcuNTUgNTQ2Ljc1IDI1MC4zNiA1NDguODkgMjUzLjI0IEMgNTQ2Ljg4IDI1Ni4yNyA1NDQuMTggMjU5LjIwIDU0NC4wMCAyNjMuMDIgQyA1NDMuODAgMjY1LjI3IDU0My40MSAyNjcuNTIgNTQzLjQ5IDI2OS43OSBDIDU0NC40NCAyNzMuNzIgNTQ5LjAxIDI3NS43NyA1NTIuNzcgMjc0Ljk0IEMgNTU0LjMxIDI3NC44MSA1NTUuMjYgMjczLjM5IDU1NS40NiAyNzEuOTggQyA1NTYuNDUgMjY2LjkzIDU1OC45MyAyNjIuMzcgNTYwLjU2IDI1Ny41MiBDIDU2MS41NCAyNTQuOTYgNTYzLjQ2IDI1MS4yMCA1NjYuNzggMjUyLjA2IEMgNTcxLjMxIDI1My44NiA1NzUuMzQgMjU2Ljc5IDU3OC43NyAyNjAuMjMgQyA1ODAuNjggMjYyLjYwIDU4NC42MSAyNjIuNzQgNTg2LjkyIDI2MC45NCBDIDU4OC45MSAyNTguODYgNTkwLjQ4IDI1Ni40MSA1OTIuNDkgMjU0LjMzIEMgNTkzLjQ1IDI1Ny4zNyA1OTQuNTMgMjYwLjY1IDU5My4zMCAyNjMuNzkgQyA1OTEuNjYgMjY4LjI0IDU5MS4wMyAyNzMuNzkgNTk0LjI5IDI3Ny42OCBDIDU5OC42NCAyODIuMzUgNjAyLjY2IDI4Ny4zMCA2MDcuMTUgMjkxLjg1IEMgNjExLjU3IDI5Ni40MiA2MTQuODcgMzAyLjI2IDYyMC41MSAzMDUuNDkgQyA2MjYuNjEgMzA4LjQ3IDYzMy4yMyAzMTAuNTMgNjQwLjAzIDMxMC45NiBDIDY0NS41OSAzMTEuMTcgNjUxLjE1IDMxMi43NyA2NTYuNzIgMzExLjc0IEMgNjU5LjUwIDMxMC4zNSA2NTYuOTggMzA3LjU2IDY1NS43NSAzMDYuMDMgQyA2NTUuMDAgMzA3LjQ1IDY1NC4yNCAzMDguODcgNjUzLjQ1IDMxMC4yNyBDIDY1My4xMCAzMDguMzEgNjUyLjc5IDMwNi4zNSA2NTIuNDMgMzA0LjM5IEMgNjU1Ljk2IDMwMy42MiA2NTkuMDkgMzAxLjc0IDY2Mi40NCAzMDAuNDcgQyA2NjYuNDIgMjk5LjY2IDY3MC42NSAzMDAuMTkgNjc0LjQ3IDI5OC41OCBDIDY3Ni45NCAyOTYuMDEgNjc5LjUxIDI5MS44OSA2ODMuNzIgMjkzLjE2IEMgNjk2LjA2IDI5Ni4yOCA3MDcuOTYgMzAxLjU2IDcyMC44MyAzMDIuMTkgQyA3MjIuMjMgMjk5LjIyIDcyMi45MyAyOTUuNjcgNzI1LjM1IDI5My4zNCBDIDcyOS44MCAyOTMuMzAgNzM0LjU2IDI5Mi4xMyA3MzYuODIgMjg3Ljg4IEMgNzM5LjAwIDI4Mi41NCA3NDIuMDYgMjc3LjY0IDc0NC43NSAyNzIuNTYgQyA3NDYuMTQgMjY3Ljg0IDc0MC45OSAyNjQuNTUgNzQwLjQzIDI2MC4wNiBDIDczNy40NCAyNjAuMDIgNzM0LjQ2IDI1OS45OSA3MzEuNDggMjU5Ljk2IEMgNzMwLjc2IDI1Ny43NiA3MzAuNzEgMjU0LjcyIDcyOC4zMiAyNTMuNjAgQyA3MjUuNDcgMjUyLjE2IDcyMi4xMSAyNTMuMjQgNzE5LjM0IDI1NC4zMiBDIDcxNi4zOSAyNTUuMTkgNzE2LjEyIDI1OC42NiA3MTQuODkgMjYxLjAxIEMgNzEyLjgwIDI1OS44OCA3MTAuNjggMjU4LjgwIDcwOC42MCAyNTcuNzAgQyA3MDguNTMgMjUyLjg2IDcxNC45MiAyNTEuMDMgNzE0LjA4IDI0Ni4xMSBDIDcxNC4zNiAyNDQuMDkgNzEyLjQ4IDI0Mi45MiA3MTEuMDcgMjQxLjkyIEMgNzA4LjM2IDIzOS45MiA3MDQuODggMjM5LjkxIDcwMS43NCAyMzkuMTQgQyA2OTguMTUgMjQyLjc1IDY5OS4yNCAyNDguMTIgNjk3LjU4IDI1Mi41NiBDIDY5Ni41MiAyNTUuMjcgNjk1LjQ2IDI1OC4xOSA2OTMuMjIgMjYwLjE3IEMgNjg5LjczIDI2Mi42NyA2ODkuMjIgMjY3LjY1IDY4NS4wMiAyNjkuNDMgQyA2ODYuMDkgMjY2LjUzIDY4Ny41NiAyNjMuNzggNjg4LjU0IDI2MC44NSBDIDY4OS45NSAyNTMuMzUgNjg3LjUzIDI0NS45NiA2ODYuNDIgMjM4LjU5IEMgNjg1Ljk0IDIzNC40NiA2ODIuNjMgMjMxLjY3IDY4MC4wOCAyMjguNzAgQyA2NzUuODcgMjMwLjQ5IDY3MS4wNCAyMzAuNTIgNjY3LjE2IDIzMy4xMCBDIDY2MS43MSAyMzYuMzEgNjU3Ljk4IDI0MS42MSA2NTIuOTggMjQ1LjQwIEMgNjU2Ljc0IDIzOS41NCA2NjEuNDcgMjMzLjk4IDY2My4wMiAyMjcuMDEgQyA2NjQuMzQgMjIyLjY1IDY2NS4zNCAyMTcuOTMgNjY4LjI4IDIxNC4zMSBDIDY3MS45NiAyMTAuNTggNjc1Ljk4IDIwNy4xNyA2ODAuMDUgMjAzLjg2IEMgNjgwLjAxIDIwMS45OCA2ODAuMDAgMjAwLjEwIDY4MC4wMCAxOTguMjIgQyA2NzYuMTggMTk1LjYwIDY3Mi42NCAxOTIuNTIgNjY4LjU3IDE5MC4zMCBDIDY2NC41NCAxODkuMzYgNjYwLjIzIDE5MC45MCA2NTYuNjYgMTkyLjczIEMgNjU0Ljc1IDE5Ni43MyA2NTUuNjcgMjAxLjUyIDY1My40MiAyMDUuMzggQyA2NTEuNzggMjA4LjI0IDY1MC42MiAyMTIuMzAgNjQ2LjgyIDIxMi43OCBDIDY0My41MSAyMTMuOTMgNjM5LjExIDIxMy42MyA2MzcuMTIgMjE3LjA1IEMgNjMzLjk4IDIyMS43MCA2MjkuMTIgMjI0LjYyIDYyNC4zMiAyMjcuMjkgQyA2MjEuMzAgMjI4Ljg0IDYxOS4yNCAyMzEuNjUgNjE2LjQ5IDIzMy41NyBDIDYxMy41MCAyMzUuMDEgNjA5LjI1IDIzNC45MyA2MDguMDIgMjM4LjY2IEMgNjA0LjMyIDIzOC44NiA2MDAuNzggMjM5LjkwIDU5Ny4zOCAyNDEuMzEgQyA1OTYuMjMgMjM4Ljg4IDU5NC43MSAyMzYuNTkgNTkzLjk4IDIzMy45OSBDIDU5NS4wNCAyMjkuOTIgNTk4LjQxIDIyNS45MyA1OTYuNjQgMjIxLjU1IEMgNTk0LjgwIDIxOS4yMiA1OTIuNjcgMjE3LjA5IDU5MS40MSAyMTQuMzYgQyA1OTUuOTAgMjEyLjg0IDYwMC41OCAyMTEuODIgNjA0LjkzIDIwOS45MSBDIDYwNy43NyAyMDguMTIgNjEwLjM1IDIwNS44OCA2MTIuNjkgMjAzLjQ4IEMgNjEzLjIzIDIwMS44MyA2MTMuMTQgMjAwLjA0IDYxMi45MSAxOTguMzQgQyA2MTAuOTQgMTk1Ljg0IDYwNy40OSAxOTUuNDYgNjA0LjY4IDE5Ni42MyBDIDU5OS45NyAxOTcuODcgNTk0LjE0IDIwMC44OCA1ODkuODAgMTk3LjIxIEMgNTg2LjIyIDE5My44NyA1ODEuMTQgMTkyLjY4IDU3Ni4zNyAxOTMuMDIgQyA1NzQuNTEgMTk3LjAyIDU3Mi43OSAyMDEuNjkgNTY4LjcxIDIwMy45MSBDIDU2NS41MCAyMDQuNDUgNTYzLjE5IDIwMS43OSA1NjAuNjIgMjAwLjM4IEMgNTU2LjIzIDE5OC4zMiA1NTcuMjMgMTkyLjY3IDU1NC44OCAxODkuMTAgQyA1NTIuMjggMTg1LjExIDU0Ny44NSAxODAuODAgNTQ5LjUwIDE3NS42MSBDIDU1MC43MiAxNzEuMjggNTUyLjE3IDE2Ni42OCA1NTUuNTIgMTYzLjUwIEMgNTU4LjA3IDE2MS4wNCA1NTguNjcgMTU3LjAxIDU1Ny4yMyAxNTMuODEgQyA1NTYuMjUgMTUwLjI3IDU1Mi41OCAxNDguNzkgNTQ5LjU4IDE0Ny4zNyBDIDU0Ni4xOSAxNDYuMzcgNTQ2LjA1IDE0Mi4xOSA1NDMuNjQgMTQwLjA3IEMgNTM5Ljg1IDEzOS4wMCA1MzYuNzkgMTQxLjYwIDUzMy43NyAxNDMuMzkgQyA1MzUuMzMgMTQwLjU0IDUzNy4yMyAxMzcuOTAgNTM5LjAzIDEzNS4yMCBDIDUzOC41NiAxMzMuODUgNTM4LjEzIDEzMi40OSA1MzcuNzEgMTMxLjE0IEMgNTM1LjE0IDEzMC40OSA1MzIuNTcgMTI5Ljg4IDUzMC4wMiAxMjkuMjAgQyA1MjcuMzcgMTMyLjQ2IDUyNC42MyAxMzUuNjggNTIyLjc0IDEzOS40NiBDIDUyMS4wNSAxMzguMzcgNTE5LjQwIDEzNi42MCA1MTcuMjEgMTM2Ljk1IEMgNTE1LjM1IDEzNy44OCA1MTMuOTggMTM5LjUyIDUxMi40OCAxNDAuOTAgQyA1MTEuMTcgMTQwLjcyIDUwOS44NyAxNDAuNTEgNTA4LjU3IDE0MC4zMSBDIDUwNy4xNiAxNDIuOTkgNTA1LjAwIDE0NS4xNiA1MDIuNDEgMTQ2LjcyIEMgNTAzLjA4IDE0My4zOSA1MDMuNTMgMTM5LjYzIDUwNi4zMSAxMzcuMzEgQyA1MDkuNjIgMTM0LjMxIDUxMS40NSAxMzAuMTQgNTE0LjI4IDEyNi43MyBDIDUxMi42NyAxMjUuNTcgNTEwLjY0IDEyNC44MiA1MDkuNjAgMTIzLjA0IEMgNTEzLjUyIDEyMC4wNCA1MTguMTAgMTE3Ljk1IDUyMS43MSAxMTQuNTQgQyA1MjQuNjYgMTEwLjEzIDUxOS4xMiAxMDUuOTQgNTIwLjMxIDEwMS4zMiBDIDUyMS43MyA5NS41OSA1MTguOTYgODguOTMgNTIyLjkxIDgzLjkxIEMgNTI1LjQ3IDgwLjQ4IDUyOC4zNiA3Ny4zMiA1MzAuODYgNzMuODUgQyA1MzQuMzggNjguOTggNTQwLjY0IDY3LjcwIDU0NS4xNyA2NC4xMyBDIDU0Ny4yMCA2Mi42MiA1NDcuMzggNTkuODEgNTQ2Ljc3IDU3LjU0IEMgNTQ1LjAxIDU2LjE5IDU0My4wMCA1NS4yMSA1NDAuOTkgNTQuMjkgQyA1MzYuMjIgNTcuOTAgNTMwLjI2IDU5LjY0IDUyNC4zNCA1OS45MiBDIDUyNy4wMiA1Ny44MiA1MzAuNTcgNTcuODUgNTMzLjYzIDU2LjYyIEMgNTM0LjgxIDU2LjEyIDUzNS4yOSA1NS4yMSA1MzUuMDYgNTMuOTAgQyA1MzUuMTYgNTEuMTcgNTM0LjU0IDQ4LjQ5IDUzMy45MyA0NS44NCBDIDUzNS4zMCA0Ni45MSA1MzYuNDIgNDguNDcgNTM4LjEzIDQ5LjAzIEMgNTQwLjQ1IDQ5LjQzIDU0MS42MCA0Ni44NSA1NDMuMjMgNDUuNjcgQyA1NDUuMDAgNDcuOTEgNTQ2LjU3IDUwLjM5IDU0OC44NCA1Mi4xOSBDIDU1Mi42NyA1NC41MSA1NTguMTggNTQuNzMgNTYwLjkzIDUwLjYxIEMgNTYxLjIyIDQ2LjYzIDU1OS4yNSA0Mi45NiA1NTguNjYgMzkuMDkgQyA1NjIuMDIgMzcuNDAgNTY1LjgyIDM2Ljg0IDU2OS4xOCAzNS4xOSBDIDU3MS42OCAzMy4wMCA1NzMuNDYgMzAuMTIgNTc1LjcyIDI3LjY5IEMgNTc4LjQ3IDI0LjYzIDU3Ny45MiAyMC4xNiA1NzkuNjcgMTYuNjIgQyA1ODIuOTMgMTUuMzcgNTg2LjYxIDE2LjMyIDU5MC4wNSAxNS45NyBDIDU5My40MCAxNi4xNiA1OTYuMzAgMTMuMzUgNTk5LjY2IDE0LjE0IEMgNjAzLjcwIDE1LjkwIDYwNy4zNCAxOS4xNyA2MTEuOTkgMTkuMDcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gODA4LjI1IDc3LjI1IEMgODA4Ljc4IDc3Ljc5IDgwOC43OCA3Ny43OSA4MDguMjUgNzcuMjUgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gOTc5LjI1IDEyMy4yNiBDIDk3OS43OSAxMjMuNzkgOTc5Ljc5IDEyMy43OSA5NzkuMjUgMTIzLjI2IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDI2Mi4yNSAxODkuMjAgQyAyNjYuNzYgMTgzLjM4IDI3My41MyAxODAuMTcgMjc5LjkzIDE3Ni45MSBDIDI3OS40MiAxNzkuNDcgMjc5LjA2IDE4Mi4wNiAyNzguODMgMTg0LjY2IEMgMjgyLjcyIDE4NS44OSAyODcuMDUgMTg2LjgzIDI5MC44OSAxODQuODYgQyAyOTcuNDUgMTgxLjY3IDMwNC41NyAxNzkuNTcgMzExLjg2IDE3OS4wNiBDIDMxNC42MCAxNzkuNTkgMzE2LjYwIDE4Mi4wMCAzMTkuMzYgMTgyLjY2IEMgMzI0LjQ2IDE4My44MCAzMjkuNjIgMTgyLjIxIDMzNC43MiAxODEuODEgQyAzMzYuODggMTg0LjQ1IDMzOS42NiAxODYuNDIgMzQyLjQ2IDE4OC4zMiBDIDM0MC43MiAxODguOTMgMzM4Ljk5IDE4OS41MyAzMzcuMjUgMTkwLjEzIEMgMzM3LjcxIDE5Mi4xNyAzMzcuOTQgMTk0LjI3IDMzOC42MiAxOTYuMjUgQyAzNDMuMTMgMTk5LjI3IDM0Ny40MyAyMDIuNjMgMzUyLjA4IDIwNS40NSBDIDM1MC4wMSAyMDYuMjQgMzQ3Ljk3IDIwNy4xMCAzNDUuOTYgMjA4LjAzIEMgMzQ2LjUzIDIxMy41NyAzNDYuMzMgMjE5LjE2IDM0Ny4xMCAyMjQuNjkgQyAzNDcuNDcgMjI3LjMwIDM0NS42NyAyMjkuODAgMzQ2LjQ4IDIzMi40MiBDIDM0Ny4wMCAyMzkuMTkgMzUyLjkzIDI0My4yOCAzNTcuMDMgMjQ3Ljk4IEMgMzU5LjU1IDI1MC4zOSAzNjEuNDUgMjUzLjMyIDM2My4xNiAyNTYuMzQgQyAzNjAuMzIgMjU4LjY4IDM1Ny4wNyAyNjAuNDMgMzUzLjg0IDI2Mi4xNSBDIDM1NC4zNCAyNjQuNjUgMzU0Ljg4IDI2Ny4xNSAzNTUuMjkgMjY5LjY3IEMgMzUxLjgyIDI3MS44NCAzNDkuMzcgMjc1Ljc4IDM0OS45MyAyNzkuOTggQyAzNDkuNDcgMjg0LjUwIDM1Mi42NyAyODkuNTYgMzQ5LjYyIDI5My42MSBDIDM0Ny40NCAyOTYuNDMgMzQ0LjkwIDI5OC45NyAzNDIuMTUgMzAxLjIzIEMgMzQwLjAyIDMwMy4xNSAzMzcuMDMgMzAyLjQyIDMzNC40MyAzMDIuNTcgQyAzMzAuNzUgMzAyLjg2IDMyNy4yOCAzMDAuNzMgMzIzLjYwIDMwMS41MCBDIDMyMC44MSAzMDEuODkgMzE3Ljk2IDMwMi4yNCAzMTUuMzUgMzAzLjM2IEMgMzEzLjUwIDMwNC4wNiAzMTQuMTIgMzA2LjMxIDMxNC4xMyAzMDcuODMgQyAzMTQuNjYgMzExLjQ0IDMxNC44NiAzMTUuMDkgMzE1LjMwIDMxOC43MiBDIDMxNi45MiAzMjMuMDEgMzE5Ljg5IDMyNi42NyAzMjIuOTEgMzMwLjA4IEMgMzI0LjgzIDMzMi4zMSAzMjQuOTIgMzM1LjgwIDMyNy42MSAzMzcuMzggQyAzMzAuMjkgMzM5LjMzIDMzMi45OSAzNDEuNDcgMzM0LjUwIDM0NC41MSBDIDMzNi41MyAzNDcuNDQgMzM1LjY4IDM1MS4yMCAzMzYuNjEgMzU0LjQ4IEMgMzM3LjMyIDM1OC4xMyAzNDAuOTUgMzYwLjA1IDM0Mi43NSAzNjMuMTQgQyAzNDkuMzIgMzcxLjMxIDM1Mi4yNCAzODEuNTcgMzU1Ljc3IDM5MS4yNiBDIDM1Ny45OCAzOTYuMTAgMzU1LjkzIDQwMS43NyAzNTguNTMgNDA2LjUwIEMgMzYyLjk3IDQxNS4yMyAzNjIuNzIgNDI1LjIzIDM2NS41MyA0MzQuNDUgQyAzNjYuNzMgNDQwLjQ2IDM2NS4wMSA0NDYuODIgMzY3LjMwIDQ1Mi42OCBDIDM2OS42NiA0NTkuMzAgMzY4LjQ4IDQ2Ni4zOSAzNjkuODEgNDczLjE4IEMgMzcyLjAyIDQ4NC45OSAzNzAuNjEgNDk3LjA2IDM3MS4wMCA1MDkuMDAgQyAzNzAuNTcgNTE3LjIxIDM3Mi40NSA1MjUuOTggMzY4LjY3IDUzMy42NiBDIDM2Ni43OCA1MzcuOTcgMzYzLjg0IDU0Mi4wOCAzNjMuOTYgNTQ2Ljk4IEMgMzYzLjkyIDU1MC4yOSAzNjIuNTIgNTUzLjM0IDM2MS40MiA1NTYuNDEgQyAzNTkuNDUgNTYwLjc3IDM2MC4yNiA1NjUuODEgMzU4LjE4IDU3MC4xNiBDIDM1NS45NCA1NzQuOTkgMzU0LjYxIDU4MC4xNCAzNTMuMzMgNTg1LjI5IEMgMzUyLjY0IDU4OS4wOSAzNTMuMzEgNTkyLjk4IDM1Mi44MiA1OTYuODAgQyAzNTEuODcgNTk5LjQzIDM1MC4wNCA2MDEuNzIgMzQ5LjYwIDYwNC41NSBDIDM0OC4yOCA2MTEuMTEgMzQ3LjczIDYxNy45MCAzNDUuMTcgNjI0LjE1IEMgMzQzLjIwIDYyOC41OSAzNDQuNzYgNjMzLjYyIDM0My4xMyA2MzguMTMgQyAzNDIuMjkgNjQwLjMyIDM0Mi4wNiA2NDIuNjUgMzQxLjk1IDY0NC45OCBDIDM0MS44MyA2NTAuMzEgMzM4LjM2IDY1NC42NyAzMzYuNDMgNjU5LjQzIEMgMzM1LjYyIDY2Mi41NyAzMzYuMTcgNjY1Ljg2IDMzNS45OSA2NjkuMDYgQyAzMzYuMTcgNjcyLjkwIDMzMy4wNiA2NzUuODEgMzMyLjYxIDY3OS41NCBDIDMzMS40MCA2ODkuMDEgMzI5LjExIDY5OC4zNyAzMjguOTggNzA3Ljk3IEMgMzI5LjAwIDcyMS4zMiAzMjkuMDIgNzM0LjY3IDMyOC45OCA3NDguMDIgQyAzMjguODYgNzUzLjY5IDMzMC4xNyA3NTkuMjcgMzMwLjA4IDc2NC45NSBDIDMzMC4wMiA3NjguODMgMzM1LjAxIDc2OS4zNiAzMzYuODYgNzcyLjExIEMgMzM5LjIwIDc3NS41NiAzNDIuMTggNzc4LjU2IDM0NC4xMCA3ODIuMjkgQyAzNDYuMjUgNzgyLjc2IDM0OC41MCA3ODMuMjMgMzUwLjIwIDc4NC43NiBDIDM1Mi42MSA3ODYuOTYgMzU1Ljg5IDc4Ny41MiAzNTguOTQgNzg4LjMyIEMgMzU5LjY2IDc5MS40MiAzNjAuMDUgNzk0LjU4IDM2MC4xNSA3OTcuNzggQyAzNTMuMTYgNzk4LjY5IDM0Ni40NSA4MDIuMjEgMzM5LjI4IDgwMC43MyBDIDMzNC45MSA3OTkuODQgMzMwLjMxIDgwMC40NSAzMjYuMDkgNzk4Ljg4IEMgMzIzLjkwIDc5OC4xNSAzMjEuODYgNzk3LjA1IDMxOS42NiA3OTYuMzggQyAzMTYuNzQgNzk1LjgyIDMxMy42NyA3OTYuMTMgMzEwLjgzIDc5NS4xNCBDIDMwNi4zOSA3OTMuODIgMzAyLjgzIDc5MC4wNCAyOTguMDAgNzkwLjAyIEMgMjkxLjM5IDc4OS44OSAyODQuNzcgNzkwLjA2IDI3OC4xNiA3OTAuMDAgQyAyNzcuMTQgNzg1LjQzIDI3Ny4wNSA3ODAuNzYgMjc2Ljc4IDc3Ni4xMyBDIDI3NS45NCA3NzIuMTAgMjc0LjM2IDc2OC4xOCAyNzQuMzIgNzY0LjAxIEMgMjc0LjU4IDc1OS42MCAyNzUuOTIgNzU0LjkyIDI3NC40MiA3NTAuNjUgQyAyNzAuMTEgNzQ1LjEyIDI3MS40MiA3MzcuNzcgMjcwLjY2IDczMS4yOCBDIDI2OS40NSA3MjQuNTIgMjcwLjU1IDcxNy41OSAyNjkuMjEgNzEwLjg0IEMgMjY4LjgwIDcwMi4yNiAyNjguOTQgNjkzLjY1IDI2OS4xMyA2ODUuMDYgQyAyNzAuNDQgNjc3LjQ0IDI2OS45MSA2NjkuNzAgMjcwLjAxIDY2Mi4wMCBDIDI3MC4wMCA2NTcuNTIgMjcwLjIxIDY1My4wMSAyNjkuNDMgNjQ4LjU3IEMgMjY4LjMwIDY0MS42NyAyNjkuODUgNjM0LjU4IDI2OC4yNSA2MjcuNzQgQyAyNjYuMDMgNjE4Ljk5IDI2Ny4zMyA2MDkuOTEgMjY3LjAwIDYwMS4wMCBDIDI2Ni42NiA1OTIuNTEgMjY4LjA2IDU4My43NyAyNjUuNDggNTc1LjUxIEMgMjY0LjIwIDU3MS42MyAyNjMuNzkgNTY3LjUxIDI2Mi4zMCA1NjMuNjkgQyAyNjAuMzIgNTU5LjAwIDI2MS4wMCA1NTMuNjYgMjU5LjA0IDU0OC45NiBDIDI1Ni45NyA1NDMuOTkgMjUwLjM4IDU0Mi4zMyAyNDkuMjYgNTM2Ljc3IEMgMjQ3Ljc3IDUzMC40OCAyNDQuMzcgNTI0Ljc1IDI0My42NyA1MTguMjggQyAyNDIuNjYgNTExLjQ2IDIzNy40MyA1MDYuMDkgMjM2LjgyIDQ5OS4xNyBDIDIzNS44NSA0OTAuODEgMjMwLjk2IDQ4My41NyAyMjkuNjkgNDc1LjI5IEMgMjI4Ljg0IDQ3MC44OSAyMjkuMTUgNDY2LjM1IDIyOC4wNiA0NjIuMDAgQyAyMjIuOTMgNDYyLjExIDIxNy40OCA0NjEuMjAgMjEyLjc0IDQ2My42NyBDIDIwOC4yNiA0NjQuODAgMjA1LjgxIDQ2OS45MSAyMDAuOTcgNDY5Ljk4IEMgMTk0LjM2IDQ3MC41NyAxODguMzMgNDc0LjAyIDE4My41NCA0NzguNDcgQyAxODEuNTQgNDc5Ljk2IDE3OS43MSA0ODIuMzcgMTc2Ljk0IDQ4Mi4xMCBDIDE3NC40NCA0ODIuMzYgMTcyLjQzIDQ4MC43MCAxNzAuNDEgNDc5LjUxIEMgMTY4LjQ3IDQ3OC4wMCAxNjUuOTEgNDc4LjM4IDE2My42MiA0NzguMDUgQyAxNjIuMzMgNDgxLjM0IDE2MC40OSA0ODQuNTEgMTU3LjQ0IDQ4Ni40NiBDIDE1My43NiA0ODguNTkgMTU0LjQzIDQ5My4zMiAxNTIuNjcgNDk2LjY1IEMgMTUxLjQyIDQ5OC4yMiAxNDkuNjUgNDk5LjIzIDE0OC4wNiA1MDAuNDAgQyAxNDcuOTQgNTA0LjE5IDE0Ny45MSA1MDcuOTkgMTQ3Ljk3IDUxMS44MCBDIDE0Ni4xOCA1MTIuNjcgMTQ0LjIzIDUxMy4zMSAxNDIuNjYgNTE0LjU5IEMgMTQwLjg4IDUxOC41NCAxMzkuMjYgNTIyLjU2IDEzNy40NCA1MjYuNTAgQyAxMzUuMDkgNTMwLjM3IDEzMi4xNiA1MzMuODQgMTI5LjQ3IDUzNy40NyBDIDEyNy4xOSA1NDEuNTEgMTI2LjI4IDU0Ni4xNiAxMjUuNjYgNTUwLjcyIEMgMTI1LjIwIDU1My43MyAxMjIuMzIgNTU2LjAzIDEyMi43NyA1NTkuMjEgQyAxMjMuMDggNTYzLjkyIDEyMi40MiA1NjguOTYgMTI0LjY0IDU3My4zMiBDIDEyNy41NSA1NzQuNDQgMTMwLjk3IDU3My41NCAxMzMuNzEgNTc1LjI4IEMgMTM2LjIyIDU3Ni42OCAxMzkuMDkgNTc3LjE5IDE0MS43MCA1NzguMzcgQyAxNDQuMzQgNTc5LjU0IDE0Ni4xNCA1ODEuODkgMTQ4LjQ3IDU4My41MyBDIDE1NC4yNyA1ODYuOTYgMTYwLjk3IDU4OC4zMSAxNjcuNTQgNTg5LjQwIEMgMTcxLjYxIDU5MS44MCAxNzQuMzkgNTk2LjA0IDE3OC41NCA1OTguNDIgQyAxODAuMzQgNTk5LjUzIDE4Mi42OSA2MDAuNDEgMTgzLjMwIDYwMi42OCBDIDE4NS43NiA2MDkuODMgMTg3LjMxIDYxNy4zOSAxODcuMDMgNjI1LjAwIEMgMTg2Ljg5IDYzMS45OCAxODcuMTcgNjM4Ljk3IDE4Ni45NSA2NDUuOTYgQyAxODcuMDggNjQ5LjgxIDE4Mi4yOSA2NTEuMzQgMTgyLjEzIDY1NS4wOCBDIDE4MS44NCA2NTcuOTkgMTgwLjczIDY2MC43MSAxNzkuMjYgNjYzLjIyIEMgMTc3LjA1IDY2Ni42NCAxNzguOTcgNjcxLjIwIDE3Ni41MyA2NzQuNTUgQyAxNzQuMjUgNjc3LjY5IDE3My40MiA2ODEuNTEgMTcxLjk5IDY4NS4wMyBDIDE2OS41MyA2ODcuNzUgMTY3Ljk4IDY5MS4wMiAxNjcuMzMgNjk0LjYzIEMgMTY1LjgzIDY5NS4xNCAxNjQuMjcgNjk1LjU0IDE2Mi44OSA2OTYuMzQgQyAxNTkuOTYgNzAwLjc5IDE2MC41MCA3MDYuNDMgMTU4LjE1IDcxMS4xMiBDIDE1Ny4xMyA3MTMuMzkgMTU2Ljc0IDcxNS44NiAxNTYuMjggNzE4LjMwIEMgMTU1LjgyIDcyNC4yOSAxNTAuNjkgNzI5LjQ3IDE1Mi44OSA3MzUuNjkgQyAxNTAuMTMgNzM4LjE5IDE0OS4xNyA3NDEuODggMTQ4LjQ0IDc0NS4zOSBDIDE0OC4yNCA3NDguMzAgMTQ5LjA2IDc1MS4yNSAxNDguMTMgNzU0LjExIEMgMTQ2Ljk1IDc1Ny45MCAxNDguOTAgNzYxLjcyIDE0OC4yMyA3NjUuNTggQyAxNDcuMDMgNzY1LjQzIDE0NS44MyA3NjUuMzAgMTQ0LjYzIDc2NS4xOSBDIDE0NS4xNCA3NjYuMTYgMTQ1LjY1IDc2Ny4xNSAxNDYuMTcgNzY4LjE0IEMgMTQ3LjQ0IDc2Ny41NCAxNDguNzEgNzY2LjkzIDE0OS45NyA3NjYuMzMgQyAxNTAuMTEgNzY4Ljk5IDE0OS41NiA3NzEuODQgMTUwLjUxIDc3NC4zOSBDIDE1My41OSA3NzguNjggMTU4LjM2IDc4MS4yNiAxNjEuOTIgNzg1LjEyIEMgMTY0LjUzIDc4OC4yNCAxNjguOTUgNzg3LjU5IDE3Mi41MiA3ODguNDYgQyAxNzQuMzkgNzg5LjU0IDE3NS44NiA3OTEuMTcgMTc3LjYwIDc5Mi40MyBDIDE4MC4wMCA3OTMuMjggMTgyLjU0IDc5My42NSAxODUuMDIgNzk0LjE5IEMgMTg2LjMzIDc5Ny41MiAxODYuNjEgODAxLjk5IDE4My4xOCA4MDQuMTYgQyAxNzIuODYgODA5LjEyIDE2MS4xMyA4MDguMDAgMTUwLjA0IDgwNy45MSBDIDE0My4zNSA4MDYuOTMgMTM2LjY2IDgwNS42NyAxMzAuMTYgODAzLjgxIEMgMTI0LjAwIDgwMS4zMyAxMTYuNzUgODAxLjA0IDExMS42NSA3OTYuMzggQyAxMTAuMDUgNzk0Ljk1IDEwNy43OSA3OTUuMDEgMTA1LjgzIDc5NC41MSBDIDEwNy43MyA3ODkuMzkgMTA4LjM5IDc4My44NSAxMTAuOTkgNzc4Ljk5IEMgMTEyLjk3IDc3NS4zNiAxMTMuNjUgNzcxLjI2IDExNC4zNCA3NjcuMjUgQyAxMTUuMDEgNzYzLjI2IDExNy44NCA3NTkuNTkgMTE2LjczIDc1NS40MSBDIDExNS4xNiA3NDcuODcgMTEyLjg3IDc0MC4zMiAxMTMuNTQgNzMyLjUyIEMgMTE0LjE3IDcyOC45MyAxMTIuMjAgNzI1LjY0IDExMS44NiA3MjIuMTMgQyAxMTAuNDEgNzE1LjgwIDExMi4xNyA3MDkuMzkgMTEyLjAwIDcwMy4wMiBDIDExMi4wMSA3MDAuMzMgMTExLjg5IDY5Ny42NSAxMTIuMDQgNjk0Ljk4IEMgMTEyLjAwIDY5MS42OSAxMTQuOTIgNjg5LjI3IDExNC45NSA2ODYuMDEgQyAxMTUuMTUgNjgxLjI2IDExNC43NSA2NzYuNDcgMTE1LjU0IDY3MS43NiBDIDExNC4xNCA2NzEuNDkgMTEyLjc0IDY3MS4xNSAxMTEuMzEgNjcxLjA5IEMgMTA3LjYwIDY3Mi45MiAxMDQuNDEgNjc2LjczIDk5LjkxIDY3Ni4xOSBDIDk1LjUzIDY3NS44MCA5MS44NCA2NzguNDcgODcuODAgNjc5LjYyIEMgODMuNDMgNjgwLjcxIDc4LjkwIDY4MS40MSA3NC40MCA2ODEuMTEgQyA3Mi4xMiA2NzkuOTYgNzAuMzkgNjc3Ljg0IDY3Ljg4IDY3Ny4xNiBDIDYzLjQ4IDY3NS45MCA1OS4xNyA2NzQuMTkgNTUuMzcgNjcxLjYxIEMgNTAuNTEgNjY3Ljg0IDQzLjk5IDY3MS4yMiAzOC42MiA2NjkuNTUgQyAzNS40MCA2NjYuMjkgMzIuODYgNjYyLjQ1IDMwLjI2IDY1OC43MSBDIDI4LjY2IDY1Ni4zMyAyNi4yMyA2NTQuNjggMjQuNTkgNjUyLjM0IEMgMjMuMDEgNjQ3LjYyIDIyLjUxIDY0Mi40NyAxOS44MyA2MzguMTggQyAxNy4xNSA2MzMuNTMgMTUuNDMgNjI4LjM1IDE0Ljk0IDYyMy4wMSBDIDE0LjY4IDYxOC43MyAxMC45OSA2MTUuNDggMTEuMTAgNjExLjEyIEMgMTAuOTggNjAyLjY4IDEwLjg4IDU5NC4yNCAxMS4yMCA1ODUuODEgQyAxMS4xNiA1ODEuMzQgMTAuNjcgNTc2Ljg1IDExLjQzIDU3Mi40MiBDIDEzLjMwIDU2MC41OSAxMC4xOCA1NDguMzMgMTMuNTcgNTM2LjcwIEMgMTQuNDMgNTMxLjU2IDE2LjE3IDUyNi42MyAxNi40NiA1MjEuMzkgQyAxNy4xMyA1MTYuMTkgMjAuMDEgNTExLjczIDIxLjk3IDUwNi45OCBDIDIzLjk0IDUwMi4wMCAyMy4xOCA0OTYuMzQgMjUuNDQgNDkxLjQ1IEMgMjguNDQgNDg0LjMyIDMwLjE0IDQ3Ni42OCAzMy42OCA0NjkuNzcgQyAzNS4zNSA0NjcuNDAgMzguNDkgNDY2LjM5IDM5LjYwIDQ2My41OSBDIDQxLjU3IDQ2MC42OSA0MS43MiA0NTcuMTEgNDIuOTggNDUzLjk2IEMgNDUuODYgNDQ4Ljk1IDQ4LjI4IDQ0My41NyA1Mi4zMCA0MzkuMzQgQyA1NC4zMyA0MzYuOTcgNTYuMjEgNDM0LjQ3IDU4LjAxIDQzMS45MyBDIDYwLjI1IDQyOC45NSA2MC41NyA0MjQuOTcgNjMuMTUgNDIyLjIxIEMgNjcuMDggNDE2LjQ1IDczLjQyIDQxMi42OCA3Ni4zMCA0MDYuMTYgQyA4MC40OCA0MDEuNDIgODUuMzQgMzk3LjI0IDkwLjI1IDM5My4yNSBDIDk1Ljg3IDM4Ni45MSAxMDYuNTMgMzg0LjI0IDEwNy42MyAzNzQuNjUgQyAxMTQuNTEgMzc0LjAwIDExNy42NCAzNjYuNzcgMTIzLjgwIDM2NC41MSBDIDEyNC4xNiAzNjIuNDEgMTI0LjkwIDM2MC4zMyAxMjQuODAgMzU4LjE5IEMgMTI0LjE4IDM1NS4yNCAxMjIuOTcgMzUyLjQ2IDEyMS44NyAzNDkuNjggQyAxMTcuODYgMzUzLjA0IDExMy4xNSAzNTUuODQgMTEwLjQ0IDM2MC40OCBDIDEwOC42NCAzNjMuNTYgMTAzLjk5IDM2Mi4xMiAxMDEuOTYgMzY0Ljk4IEMgOTcuNzYgMzY5LjYyIDkyLjUwIDM3My4yMCA4Ni44OCAzNzUuOTEgQyA4NC43MyAzNzYuOTcgODQuMTMgMzc5LjQxIDgzLjQwIDM4MS40OCBDIDc4Ljg5IDM4My4wMCA3NC41MiAzODQuOTggNzAuNDAgMzg3LjM3IEMgNjYuNjkgMzg5LjUwIDY0LjQ5IDM5My40NiA2MC43MiAzOTUuNDkgQyA1Ni45NCAzOTUuMzQgNTMuMTYgMzk0Ljg5IDQ5LjM3IDM5NC44OSBDIDQ4LjMwIDM5Mi4wMyA0NS44MyAzODkuNTEgNDUuOTkgMzg2LjMyIEMgNDcuOTMgMzg0LjE3IDQ5Ljg0IDM4MS44MCA1Mi40MCAzODAuMzcgQyA2MC4yMiAzNzkuMzkgNjguNzkgMzc5LjM5IDc1LjI3IDM3NC4yNiBDIDc4LjkxIDM3MC41MCA4MC45NiAzNjUuNDIgODQuOTUgMzYxLjk0IEMgODcuNjAgMzYwLjI2IDkxLjAxIDM1OS42NCA5Mi45OCAzNTcuMDIgQyA5NS4xMCAzNTQuNDAgOTcuNjUgMzUyLjE2IDk5LjY5IDM0OS40OCBDIDEwMS4wNiAzNDcuMjUgOTkuMTIgMzQ0LjUxIDk2Ljc3IDM0NC4xNiBDIDkzLjg1IDM0My44MCA5MC44OSAzNDMuODggODcuOTYgMzQ0LjAwIEMgODMuNDMgMzQ0LjE1IDc5LjE3IDM0Ni44OCA3NC41OCAzNDUuNTUgQyA2OC44MiAzNDUuMzMgNjMuODIgMzQyLjQ0IDU4LjYwIDM0MC4zOSBDIDU0LjczIDMzOS42OCA1MC43MCAzNDAuMjYgNDYuOTAgMzM5LjEwIEMgNDQuNTIgMzM4LjcyIDQzLjIwIDMzNi40NyA0MS40NyAzMzUuMDQgQyAzOC4xNyAzMzguNTQgMzMuNzUgMzM1LjQxIDMwLjU2IDMzMy40MyBDIDI3LjQzIDMzMC42MiAyOC4wMiAzMjYuMDUgMjcuOTMgMzIyLjI2IEMgMzEuNzIgMzIyLjM1IDM1LjIwIDMyMC45MSAzOC44MCAzMjAuMDkgQyA0MS43NiAzMjEuNTAgNDQuNTIgMzIzLjMzIDQ3LjYzIDMyNC40NCBDIDUxLjg3IDMyNS44OCA1NC4yMSAzMzEuMDQgNTkuMDYgMzMwLjkzIEMgNjIuNDMgMzMwLjc4IDY1LjI0IDMzMi42MiA2OC4yNCAzMzMuODEgQyA3MS40NCAzMzMuOTYgNzQuNTggMzMyLjY4IDc3Ljc5IDMzMy4xNyBDIDgxLjc1IDMzMy42NiA4Ni4xMCAzMzQuOTkgODkuODAgMzMyLjgxIEMgOTIuNTUgMzMxLjI4IDk1Ljg0IDMzMS4xMSA5OC41NCAzMjkuNTMgQyAxMDEuNzYgMzI1LjMwIDEwMy42NyAzMTkuODkgMTA4Ljg0IDMxNy41MyBDIDEwOC43MiAzMTAuNjEgMTEwLjc0IDMwMy45MiAxMTEuMDcgMjk3LjA0IEMgMTExLjMwIDI5MS45OSAxMTQuNDkgMjg3Ljc1IDExNS40OCAyODIuOTAgQyAxMTUuNTggMjc5LjMxIDExNS45NSAyNzUuNjkgMTE3LjQyIDI3Mi4zNyBDIDExOS4xNiAyNjguMjkgMTE1Ljc1IDI2My44NSAxMTcuODYgMjU5Ljg2IEMgMTE5LjEzIDI1Ni44MSAxMjEuODEgMjU0LjcyIDEyMy45OSAyNTIuMzUgQyAxMjUuNzQgMjUzLjAyIDEyNy41OCAyNTQuNTIgMTI5LjUzIDI1My42NiBDIDEzMi4yOCAyNTIuNzEgMTM0Ljg2IDI1MS4zNCAxMzcuMzQgMjQ5LjgzIEMgMTM2LjY0IDI0Ny43MCAxMzUuODMgMjQ1LjYxIDEzNS4wMCAyNDMuNTMgQyAxMzguMjQgMjQyLjQyIDE0MS4xOCAyNDAuNjQgMTQ0LjMyIDIzOS4zMiBDIDE0OC43NiAyMzguMzMgMTUzLjMxIDIzOS40NCAxNTcuNzggMjM5LjU3IEMgMTYzLjQ3IDIzNy45MSAxNjguNTYgMjMzLjc0IDE3NC44MCAyMzQuMjcgQyAxODAuMTcgMjM1LjMwIDE4NS40MiAyMzcuNDIgMTkwLjk5IDIzNi45OSBDIDE5My40OCAyMzcuMjQgMTk2LjY3IDIzNi4yMyAxOTguNTMgMjM4LjQzIEMgMjAxLjUyIDI0MS42OSAyMDUuODMgMjQzLjExIDIwOS4zNSAyNDUuNjQgQyAyMTQuNTAgMjQ5LjQyIDIyMC4zMiAyNTIuNTcgMjI0LjA4IDI1Ny45MCBDIDIyNi4zNCAyNjEuNTggMjI4Ljc4IDI2NS4zMyAyMjkuMzIgMjY5LjczIEMgMjMwLjEyIDI3NC41MyAyMzMuNTkgMjc4LjE3IDIzNS41NSAyODIuNDggQyAyMzcuNzMgMjg5LjQxIDIzNS4zNCAyOTYuNDggMjM0LjczIDMwMy40NCBDIDIzMi4wMiAzMDQuNzEgMjI5LjE2IDMwNi4wMSAyMjcuMjAgMzA4LjM2IEMgMjI2LjcxIDMxMi4wMSAyMjYuNDMgMzE2LjE1IDIyOC42OSAzMTkuMzIgQyAyMzAuMzMgMzIxLjcyIDIzMi40NiAzMjMuNzQgMjM0LjMwIDMyNS45OCBDIDIzMC44OSAzMjguNTIgMjI2LjU5IDMzMC42NSAyMjUuMTkgMzM1LjAwIEMgMjIzLjk3IDMzOC42NSAyMjEuODQgMzQyLjYyIDIyMy42MSAzNDYuNDcgQyAyMjMuOTIgMzQ3Ljc4IDIyNS4wNSAzNDkuMDcgMjI0LjY4IDM1MC40NiBDIDIyMy4yNSAzNTEuNDcgMjIxLjcwIDM1Mi4zMSAyMjAuMjAgMzUzLjIxIEMgMjIwLjQzIDM1OC4xMyAyMTguNTkgMzYyLjg1IDIxNS44MiAzNjYuODMgQyAyMTMuMjYgMzY4Ljg2IDIwOS44MSAzNjkuNzAgMjA2LjU3IDM2OS40NSBDIDIwMi4yNiAzNjkuMjIgMTk3Ljk0IDM2OS43NCAxOTMuNzQgMzcwLjY5IEMgMTg4Ljk5IDM3MS44NCAxODQuNDIgMzY5LjMzIDE3OS42OCAzNjkuNDkgQyAxNzYuMTAgMzcwLjIzIDE3NC40MCAzNzMuODIgMTcyLjM0IDM3Ni40NCBDIDE3MC40MiAzNzcuNjIgMTY4LjEyIDM3Ny45MCAxNjUuOTcgMzc4LjQyIEMgMTY2LjA0IDM4MS40NiAxNjUuNjkgMzg0LjU2IDE2Ni4zNSAzODcuNTUgQyAxNjguNzAgMzkxLjc0IDE3Mi45MCAzOTQuNDYgMTc1LjQyIDM5OC41NCBDIDE3Ny41MiA0MDEuNDMgMTc5LjE0IDQwNS4wMCAxODIuMzggNDA2LjgxIEMgMTg0LjYxIDQwNy4zOCAxODYuODggNDA2LjU3IDE4OS4wNCA0MDYuMDcgQyAxOTQuNTcgNDA0LjU1IDE5OS45OCA0MDIuMTMgMjA0LjI4IDM5OC4yOCBDIDIwNi42NSAzOTYuMDEgMjEwLjEzIDM5NS42NyAyMTIuNzEgMzkzLjcxIEMgMjE2Ljc0IDM5MC43MyAyMjAuODIgMzg3LjgxIDIyNC45NyAzODUuMDEgQyAyMjcuNDEgMzgzLjY5IDIzMC4yNSAzODMuMjAgMjMyLjUyIDM4MS41NSBDIDIzNS41MyAzNzcuMTkgMjM3LjIzIDM3Mi4xMyAyMzkuMzggMzY3LjM1IEMgMjQzLjM3IDM2MS43NSAyNDUuMzUgMzU1LjAyIDI0OS40OCAzNDkuNTAgQyAyNTIuMDAgMzQ1LjA4IDI1NC4xMSAzNDAuMzkgMjU3LjU4IDMzNi41OSBDIDI1OS44NyAzMzIuNTggMjYyLjI0IDMyOC42MSAyNjUuMTcgMzI1LjAzIEMgMjY2LjExIDMyNS4yNiAyNjcuMDYgMzI1LjUwIDI2OC4wMSAzMjUuNzQgQyAyNjYuMzcgMzIyLjUxIDI2Ni45MiAzMTguODcgMjY3LjA3IDMxNS40MSBDIDI3MC40MCAzMTMuNTQgMjcyLjYxIDMxMC40MyAyNzQuMzkgMzA3LjE2IEMgMjcyLjExIDMwNC43MiAyNjkuNzEgMzAyLjI5IDI2OC4zMiAyOTkuMjEgQyAyNjYuODYgMjk5LjExIDI2NS40MCAyOTkuMDMgMjYzLjk1IDI5OC45NSBDIDI2NC42NSAyOTguMzAgMjY1LjM1IDI5Ny42NiAyNjYuMDUgMjk3LjAyIEMgMjYzLjg3IDI5Ni44NCAyNjEuNjkgMjk2Ljc2IDI1OS41MSAyOTYuNzYgQyAyNTcuMzEgMjkyLjQyIDI1NC43NCAyODguMTQgMjUwLjg4IDI4NS4wOCBDIDI0Ny4zMiAyODIuMjAgMjQ3LjQ3IDI3Ny4yMSAyNDUuNTYgMjczLjM4IEMgMjQxLjU2IDI2Ni4xNiAyNDEuMDUgMjU3LjQ3IDIzNi40NyAyNTAuNTMgQyAyMzMuMzAgMjQ2LjEyIDIzNi4xNSAyNDAuMzYgMjM0LjUwIDIzNS41NSBDIDIzMy4zOSAyMzQuMDcgMjMxLjk1IDIzMi44OSAyMzAuNjYgMjMxLjU3IEMgMjMzLjcwIDIzMC4xOCAyMzguNDQgMjI5LjkwIDIzOC45NyAyMjUuNzkgQyAyMzkuOTEgMjIyLjg4IDIzNy41NCAyMjAuOTYgMjM1LjQ5IDIxOS40MSBDIDIzNS43MiAyMTguMDMgMjM1LjkyIDIxNi42NSAyMzYuMTMgMjE1LjI4IEMgMjQwLjg1IDIxMy4wNSAyNDUuODYgMjExLjU2IDI1MC43NCAyMDkuNzUgQyAyNTUuMjMgMjA3Ljc4IDI1OC4yOCAyMDMuNzYgMjYyLjE2IDIwMC45MiBDIDI2MS4yOCAxOTkuODkgMjYwLjQwIDE5OC44OCAyNTkuNTIgMTk3Ljg2IEMgMjYwLjY5IDE5NS4wNSAyNjAuODcgMTkxLjkxIDI2Mi4yNSAxODkuMjAgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gMzM1LjI3IDE5NS4yNiBDIDMzNS43OCAxOTUuNzkgMzM1Ljc4IDE5NS43OSAzMzUuMjcgMTk1LjI2IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDY1MS4yNSAyNDUuMjYgQyA2NTEuNzkgMjQ1LjgwIDY1MS43OSAyNDUuODAgNjUxLjI1IDI0NS4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjZmRmZGZkIiBkPSIgTSA5OTYuMjcgMjUwLjI2IEMgOTk2Ljc3IDI1MC43OCA5OTYuNzcgMjUwLjc4IDk5Ni4yNyAyNTAuMjYgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNTY3LjcyIDI2OS43NyBDIDU3MC40MCAyNjcuNDUgNTc0LjMyIDI2Ny43MCA1NzcuNjAgMjY4LjIzIEMgNTg0LjM5IDI3Mi41MiA1ODEuNDAgMjgxLjQxIDU4Mi4wMCAyODguMDMgQyA1NzcuODcgMjg4Ljc5IDU3Mi4yMiAyOTAuNzUgNTY5LjE4IDI4Ni43OSBDIDU2Ni44MiAyODQuMjYgNTY3LjAyIDI4MC41OCA1NjYuNDYgMjc3LjQwIEMgNTY1Ljk0IDI3NC44MiA1NjYuMjIgMjcxLjk4IDU2Ny43MiAyNjkuNzcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNzcwLjI2IDM0Mi4yNSBDIDc3MC43OSAzNDIuNzkgNzcwLjc5IDM0Mi43OSA3NzAuMjYgMzQyLjI1IFoiIC8+CjxwYXRoIGZpbGw9IiMwMzAzMDMiIGQ9IiBNIDc1Ny4yNiAzNjguMjYgQyA3NTcuNzcgMzY4Ljc4IDc1Ny43NyAzNjguNzggNzU3LjI2IDM2OC4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjZmRmZGZkIiBkPSIgTSA2ODUuMTQgMzg1Ljg3IEMgNjg4LjkwIDM4NS45MiA2OTMuNjAgMzg1Ljc3IDY5NS45MyAzODkuMzMgQyA2OTcuMTIgMzk0LjQ5IDY5Mi41OSAzOTguMjcgNjg5LjEzIDQwMS4yNyBDIDY4Ny40NyA0MDIuOTIgNjg0Ljk4IDQwMS43NCA2ODMuMzMgNDAwLjcxIEMgNjgwLjE2IDM5NS45NyA2ODIuNzAgMzkwLjI5IDY4NS4xNCAzODUuODcgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNjUyLjc0IDQxMy41OSBDIDY1My41NiA0MTAuMjcgNjU3LjY1IDQwOS4zNyA2NjAuNTggNDEwLjE1IEMgNjYyLjM5IDQxMS40NCA2NjQuMTUgNDEzLjA1IDY2NS4wNiA0MTUuMTQgQyA2NjQuNjIgNDE5LjkxIDY2Mi4xNiA0MjQuMjAgNjU5Ljc3IDQyOC4yNiBDIDY1OC4wOSA0MjcuNjAgNjU2LjM2IDQyNy4wNyA2NTQuNzggNDI2LjIxIEMgNjUxLjU2IDQyMi44NCA2NTEuOTQgNDE3LjgxIDY1Mi43NCA0MTMuNTkgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gNjk3LjI1IDQxOS4zMCBDIDY5Ny43OCA0MTkuODQgNjk3Ljc4IDQxOS44NCA2OTcuMjUgNDE5LjMwIFoiIC8+CjxwYXRoIGZpbGw9IiNmZGZkZmQiIGQ9IiBNIDIwNS45MyA0MjUuOTMgQyAyMTAuODUgNDIyLjU0IDIxNi43NCA0MjEuMjAgMjIyLjQ4IDQxOS45NSBDIDIxOS43OSA0MjQuMzAgMjE3LjEwIDQyOC44NiAyMTMuNDMgNDMyLjQyIEMgMjA1LjQ4IDQzNS44NSAxOTkuMTMgNDQyLjE0IDE5MC45MiA0NDQuOTcgQyAxODcuMDEgNDQ2LjYyIDE4My41NCA0NDkuODAgMTc5LjE3IDQ1MC4wMyBDIDE3NC44MSA0NDguMzIgMTcyLjMzIDQ0My45MCAxNjkuMjAgNDQwLjY1IEMgMTY4Ljc5IDQzNy43NiAxNjkuMDEgNDM0LjgzIDE2OS4wMCA0MzEuOTMgQyAxNzIuMDcgNDMyLjE3IDE3NS44NiA0MzEuMTMgMTc4LjExIDQzMy44OCBDIDE4MC4zNiA0MzYuMzggMTgzLjMxIDQzNy45OCAxODYuNjggNDM4LjM3IEMgMTkxLjMxIDQzMS44MCAxOTkuNjMgNDMwLjI3IDIwNS45MyA0MjUuOTMgWiIgLz4KPHBhdGggZmlsbD0iI2ZkZmRmZCIgZD0iIE0gMTA0NS4yNiA0NTEuMjYgQyAxMDQ1Ljc4IDQ1MS43OCAxMDQ1Ljc4IDQ1MS43OCAxMDQ1LjI2IDQ1MS4yNiBaIiAvPgo8cGF0aCBmaWxsPSIjMDMwMzAzIiBkPSIgTSAyMDEuMjcgNzIxLjI1IEMgMjAxLjc3IDcyMS43NyAyMDEuNzcgNzIxLjc3IDIwMS4yNyA3MjEuMjUgWiIgLz4KPHBhdGggZmlsbD0iIzAzMDMwMyIgZD0iIE0gMTY0LjI1IDc4My4yNSBDIDE2NC43OSA3ODMuNzkgMTY0Ljc5IDc4My43OSAxNjQuMjUgNzgzLjI1IFoiIC8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"gretl,gretl\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"gretl_x11.Gretl_x11\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Gretl\"\nLABEL oc.displayname=\"Gretl\"\nLABEL oc.path=\"/usr/bin/gretl\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"Gretl\"\nENV APPBIN \"/usr/bin/gretl\"\nENV APP \"/usr/bin/gretl\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/gretl/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/gretl/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Gretl

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Gretl.d\n
"},{"location":"applications/gretl/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Gretl.d -t Gretl .\n
"},{"location":"applications/gretl/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Gretl > Gretl.json\ndocker image save Gretl -o Gretl.tar\nctr -n k8s.io images import Gretl.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Gretl.json\n\n
"},{"location":"applications/hyper/","title":"hyper","text":""},{"location":"applications/hyper/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/hyper/#path","title":"Path","text":"
/opt/Hyper/hyper\n
"},{"location":"applications/hyper/#mimetype","title":"Mimetype","text":"
x-scheme-handler/ssh\n
"},{"location":"applications/hyper/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/hyper/#wm_class","title":"WM_CLASS","text":"
hyper.Hyper\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/hyper/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/hyper.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/hyper/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install  --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\nRUN curl -Ls -o /tmp/hyper.deb  https://releases.hyper.is/download/deb && apt-get install  --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\n
"},{"location":"applications/hyper/#json-dump","title":"JSON dump","text":"

json source file hyper.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\",\n        \"RUN curl -Ls -o /tmp/hyper.deb  https://releases.hyper.is/download/deb && apt-get install  --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\"\n    ],\n    \"icon\": \"hyper.svg\",\n    \"keyword\": \"terminal,remote\",\n    \"launch\": \"hyper.Hyper\",\n    \"name\": \"hyper\",\n    \"path\": \"/opt/Hyper/hyper\",\n    \"mimetype\": \"x-scheme-handler/ssh\",\n    \"fileextensions\": \"\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/hyper.desktop\"\n}\n
"},{"location":"applications/hyper/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output hyper.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/hyper.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @hyper.d.3.0.json\n\n
"},{"location":"applications/hyper/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes libgtk-3-0 libx11-xcb1 libasound2 && apt-get clean\nRUN curl -Ls -o /tmp/hyper.deb  https://releases.hyper.is/download/deb && apt-get install  --no-install-recommends --yes /tmp/hyper.deb && apt-get clean && rm -rf /tmp/hyper.deb\nLABEL oc.icon=\"hyper.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojM2QzZDNkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzQ3NDc0NyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0yMyAxMi0xMSA5IDUgMy0zIDggMTAtOS01LTN6bTIgMTh2MmgxMHYtMnoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8cGF0aCBkPSJtMzUgMzF2LTJoLTEwdjJtMTAgMCIgc3R5bGU9ImZpbGw6I2Y0NjA5ZCIvPgogPHBhdGggZD0ibTEyIDIwIDExLTktNCA4IDUgMy0xMCA5IDMtOHoiIHN0eWxlPSJmaWxsOiNmMWFiNDUiLz4KIDxwYXRoIGQ9Im0xMiAyMCAxMS05LTQgOCA1IDMtMTAgOSAzLTh6IiBzdHlsZT0iZmlsbDojZjNiNjRkIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"hyper,terminal,remote\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"hyper.desktop\"\nLABEL oc.launch=\"hyper.Hyper\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"hyper\"\nLABEL oc.displayname=\"hyper\"\nLABEL oc.path=\"/opt/Hyper/hyper\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/ssh\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"hyper\"\nENV APPBIN \"/opt/Hyper/hyper\"\nENV APP \"/opt/Hyper/hyper\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/hyper/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/hyper/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application hyper

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/hyper.d\n
"},{"location":"applications/hyper/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f hyper.d -t hyper .\n
"},{"location":"applications/hyper/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect hyper > hyper.json\ndocker image save hyper -o hyper.tar\nctr -n k8s.io images import hyper.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @hyper.json\n\n
"},{"location":"applications/impress/","title":"impress","text":""},{"location":"applications/impress/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.libreoffice

"},{"location":"applications/impress/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/impress/#alpine-packages","title":"Alpine packages","text":"
libreoffice-gnome\n
"},{"location":"applications/impress/#arguments","title":"Arguments","text":"

\"--impress\"

"},{"location":"applications/impress/#displayname","title":"Displayname","text":"
Impress\n
"},{"location":"applications/impress/#path","title":"Path","text":"
/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/impress/#uniquerunkey","title":"uniquerunkey","text":"

\"libreoffice\"

"},{"location":"applications/impress/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/impress/#mimetype","title":"Mimetype","text":"
application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\n
"},{"location":"applications/impress/#file-extensions","title":"File extensions","text":"

\"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\"

"},{"location":"applications/impress/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"odp\"

"},{"location":"applications/impress/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/impress/#wm_class","title":"WM_CLASS","text":"
libreoffice.libreoffice-impress\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/impress/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/libreoffice-impress.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/impress/#json-dump","title":"JSON dump","text":"

json source file impress.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_impress.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-impress\",\n    \"name\": \"impress\",\n    \"displayname\": \"Impress\",\n    \"showinview\": \"dock\",\n    \"args\": \"--impress\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\",\n    \"fileextensions\": \"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\",\n    \"legacyfileextensions\": \"odp\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-impress.desktop\",\n    \"usedefaultapplication\": true\n}\n
"},{"location":"applications/impress/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output impress.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/impress.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @impress.d.3.0.json\n\n
"},{"location":"applications/impress/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_impress.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Y1NWEwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmE4MjgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjciIHkyPSI1NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmNmNWQyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0NS41MDEiIHgyPSI0NS41MDEiIHkxPSI3LjEwNTUiIHkyPSIyOS44OTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlZmNlYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmY2Y5ZTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzUiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImQiIGN4PSIzOC4wNjYiIGN5PSIyNi4xOTIiIHI9IjI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0uOCAzZS04IC0xLjkyNjVlLTggLS45NDAzNCA4MC40NTMgMzguNjI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWUzNTNjIiBzdG9wLW9wYWNpdHk9Ii40ODUzOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxOTE5MTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImoiIHgxPSI3NTYiIHgyPSI3NTYiIHkxPSItODYwLjY0IiB5Mj0iLTg3Ni42NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjM2MzYgMCAwIDEuMzYzNiAtOTg5LjM2IDEyMTUuNCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2QzNjExOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMDllNmYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJpIiBjeD0iMTUyLjMzIiBjeT0iLTc1NC42NCIgcj0iMTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMTU3ZS02IC4wOTAyNDcgLTEuMDY5MyAwIC03NzUgMzQuNTY2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9Ii41MDE5NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI4MTIiIHgyPSI4MTIiIHkxPSItMTA3NS42IiB5Mj0iLTExMTUuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNSAwIDAgLjU0OTk4IC0zNjIgNjMzLjU5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJhZDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNjMzYSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9InAiIHgxPSI1MjMiIHgyPSI1MjMiIHkxPSItMTA2NC42IiB5Mj0iLTEwODguNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjg1NzEgMCAwIC40MTY2NyAtMTE1LjQzIDQ4MS42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYjNiM2IzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U2ZTZlNiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9InEiIHgxPSI3MTQiIHgyPSI3MTQiIHkxPSItMTA2My42IiB5Mj0iLTEwODMuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjU2NDEgMCAwIC41IC0xNDkuMDggNTY5LjgyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9Ii41ODgyNCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIHN0b3Atb3BhY2l0eT0iLjg2Mjc0IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iciIgeDE9Ijg4OSIgeDI9Ijg4MS43NyIgeTE9Ii0xMDU0LjYiIHkyPSItMTA0NC42IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC42NDIzNyAwIDAgLjYzODc2IC01MzEuMDkgNzA0LjI0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMThhMzAzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzEwNjgwMiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJhIiB4PSItLjA1MiIgeT0iLS4wNzA5MDkiIHdpZHRoPSIxLjEwNCIgaGVpZ2h0PSIxLjE0MTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNjUwMDAyNSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8cGF0aCBkPSJtMzMuMDEyIDM5LTEuNDg0NCAxLjQ4NDQtMC41MzkwNi0wLjQ4NDM4aC0yLjU3MDNsMS43NjE3IDEuODMwMS0wLjE2OTkyIDAuMTY5OTJoLTEuMDA5OHYxLjAwOThsLTUuOTkyMiA1Ljk5MDJoMy45MDIzbDQuMzM1OS01aDEuMDI1NGw0LjgxODQgNWgzLjkwMjNsLTUuOTkyMi01LjM5MDZ2LTEuNjA5NGgtMS43ODkxbC0wLjEyODkxLTAuMTE3MTkgMi41LTIuODgyOGgtMi41NzAzeiIgb3BhY2l0eT0iLjUiLz4KIDxwYXRoIGQ9Im0xOC4zNjQgMjBoMjQuNzMyYzAuNzU1NDUgMCAzLjkwNDQgMy4yNDQ2IDMuOTA0NCA0djE2LjQ1NWMwIDAuNzU1NDUtMC42MDgxOSAxLjM2MzYtMS4zNjM2IDEuMzYzNmgtMjcuMjczYy0wLjc1NTQ1IDAtMS4zNjM2LTAuNjA4MTktMS4zNjM2LTEuMzYzNnYtMTkuMDkxYzAtMC43NTU0NSAwLjYwODE5LTEuMzYzNiAxLjM2MzYtMS4zNjM2eiIgZmlsbD0idXJsKCNqKSIvPgogPHBhdGggZD0ibTE4LjM2NCAyMGgyNC43MzJjMC43NTU0NSAwIDMuOTA0NCAzLjI3MTYgMy45MDQ0IDQuMDMzM3YxNi41OTJjMCAwLjc2MTczLTAuNjA4MTkgMS4zNzQ5LTEuMzYzNiAxLjM3NDloLTI3LjI3M2MtMC43NTU0NSAwLTEuMzYzNi0wLjYxMzIzLTEuMzYzNi0xLjM3NDl2LTE5LjI1YzAtMC43NjE3MyAwLjYwODE5LTEuMzc0OSAxLjM2MzYtMS4zNzQ5eiIgZmlsdGVyPSJ1cmwoI2EpIiBvcGFjaXR5PSIuMjUiLz4KIDxwYXRoIGQ9Im0xOC4zNjQgMjBoMjQuNzMyYzAuNzU1NDUgMCAzLjkwNDQgMy4yNzE2IDMuOTA0NCA0LjAzMzN2MTYuNTkyYzAgMC43NjE3My0wLjYwODE5IDEuMzc0OS0xLjM2MzYgMS4zNzQ5aC0yNy4yNzNjLTAuNzU1NDUgMC0xLjM2MzYtMC42MTMyMy0xLjM2MzYtMS4zNzQ5di0xOS4yNWMwLTAuNzYxNzMgMC42MDgxOS0xLjM3NDkgMS4zNjM2LTEuMzc0OXoiIGZpbGw9InVybCgjbCkiLz4KIDxwYXRoIGQ9Im0xNi45MTQgNDdoMzAuMTcxYzAuNTA2NDkgMCAwLjkxNDI3IDAuNDAyMTMgMC45MTQyNyAwLjkwMTh2MC44NjMwN2MwIDAuNDk5NjctMC40MDc3NyAwLjkwMTgtMC45MTQyNyAwLjkwMThoLTMwLjE3MWMtMC41MDY0OSAwLTAuOTE0MjctMC40MDIxMy0wLjkxNDI3LTAuOTAxOHYtMC44NjMwN2MwLTAuNDk5NjcgMC40MDc3Ny0wLjkwMTggMC45MTQyNy0wLjkwMTh6IiBmaWxsPSJ1cmwoI2kpIiBvcGFjaXR5PSIuNCIvPgogPGcgZmlsbD0iI2ZmZiI+CiAgPHJlY3QgeD0iMjAiIHk9IjIzIiB3aWR0aD0iMjQiIGhlaWdodD0iMyIgb3BhY2l0eT0iLjM1Ii8+CiAgPHJlY3QgeD0iMjQiIHk9IjI4IiB3aWR0aD0iOCIgaGVpZ2h0PSIyIiBvcGFjaXR5PSIuMzUiLz4KICA8ZWxsaXBzZSBjeD0iMjEiIGN5PSIyOSIgcng9IjEiIHJ5PSIxIiBvcGFjaXR5PSIuMzUiLz4KICA8cmVjdCB4PSIyNCIgeT0iMzIiIHdpZHRoPSI4IiBoZWlnaHQ9IjIiIG9wYWNpdHk9Ii4zNSIvPgogIDxlbGxpcHNlIGN4PSIyMSIgY3k9IjMzIiByeD0iMSIgcnk9IjEiIG9wYWNpdHk9Ii4zNSIvPgogIDxyZWN0IHg9IjI0IiB5PSIzNiIgd2lkdGg9IjgiIGhlaWdodD0iMS45OTk5IiBvcGFjaXR5PSIuMzUiLz4KICA8ZWxsaXBzZSBjeD0iMjEiIGN5PSIzNyIgcng9IjEiIHJ5PSIxIiBvcGFjaXR5PSIuMzUiLz4KIDwvZz4KIDxyZWN0IHg9IjM0IiB5PSIyOCIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiBmaWxsPSJ1cmwoI3ApIi8+CiA8cmVjdCB4PSIzNCIgeT0iMjgiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgZmlsbD0idXJsKCNxKSIvPgogPHBhdGggZD0ibTM2IDM2LjM1MyAyLTQgMi42NjY3IDEuMzMzMyAyLTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNyKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CiA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZCkiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8cGF0aCBkPSJtNTYuODk2IDI5Ljg5Ni0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwIDIyLjc5MSAyMi43OTF6IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"impress,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-impress.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-impress\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--impress\"\nLABEL oc.name=\"impress\"\nLABEL oc.displayname=\"Impress\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroenabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;\"\nLABEL oc.fileextensions=\"odp;pot;potm;potx;pps;ppsx;ppt;pptx;pptm\"\nLABEL oc.legacyfileextensions=\"odp\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"impress\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--impress\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/impress/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/impress/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application impress

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/impress.d\n
"},{"location":"applications/impress/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f impress.d -t impress .\n
"},{"location":"applications/impress/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect impress > impress.json\ndocker image save impress -o impress.tar\nctr -n k8s.io images import impress.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @impress.json\n\n
"},{"location":"applications/inkscape/","title":"inkscape","text":""},{"location":"applications/inkscape/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/inkscape/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/inkscape/#ubuntu-packages","title":"Ubuntu packages","text":"
inkscape inkscape-lang\n
"},{"location":"applications/inkscape/#path","title":"Path","text":"
/usr/bin/inkscape\n
"},{"location":"applications/inkscape/#mimetype","title":"Mimetype","text":"
image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\n
"},{"location":"applications/inkscape/#file-extensions","title":"File extensions","text":"

\"ai;cdr\"

"},{"location":"applications/inkscape/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"ai;cdr\"

"},{"location":"applications/inkscape/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/inkscape/#wm_class","title":"WM_CLASS","text":"
org.inkscape.Inkscape.Inkscape\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/inkscape/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.inkscape.Inkscape.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/inkscape/#json-dump","title":"JSON dump","text":"

json source file inkscape.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"debpackage\": \"inkscape inkscape-lang\",\n    \"icon\": \"circle_inkscape.svg\",\n    \"keyword\": \"inkscape\",\n    \"launch\": \"org.inkscape.Inkscape.Inkscape\",\n    \"name\": \"inkscape\",\n    \"path\": \"/usr/bin/inkscape\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\",\n    \"fileextensions\": \"ai;cdr\",\n    \"legacyfileextensions\": \"ai;cdr\",\n    \"installrecommends\": true,\n    \"desktopfile\": \"/usr/share/applications/org.inkscape.Inkscape.desktop\"\n}\n
"},{"location":"applications/inkscape/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output inkscape.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/inkscape.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @inkscape.d.3.0.json\n\n
"},{"location":"applications/inkscape/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y inkscape inkscape-lang && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_inkscape.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iU2tldGNoIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMDEuNTMiIHgyPSIxMDEuNTMiIHkxPSIxOC44ODgiIHkyPSIxODMuNTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMy41MjIzIDAgMCAzLjUyMjMgMTYyLjM4IDE2Ny4wOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkN2Q3ZDciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzU3NjMiIHk9Ii0uMDM2MjQiIHdpZHRoPSIxLjA3MTUiIGhlaWdodD0iMS4wNzI1IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI3LjYyOTQwMyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjU0MC4xMSIgeDI9IjU0MC4xMSIgeTE9IjIuMDA3OCIgeTI9IjEwMjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMi4wMDA0IDEuOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iLjUwNzY5Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0YTRhNGEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjEwNDY4OCIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mzc2MiAwIDAgLjA2Mzc2MiAtLjYxNDI0IC0uNjc4KSI+CiAgPGcgaWQ9InNoYWRvdyIgdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMiAyKSIgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPjwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwMDcgMCAwIDEuMDAwNyAtLjkyNDYzIC4xNzU5OCkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTk2Ny45NiAzOTIuNDJjLTEuMDk1Ny00LjMzMy0yLjM0MDgtOC45NjQ4LTMuNjM1Ny0xMy41NDctMC45OTYxLTMuMzg2Ny0xLjk5MjItNi44MjMyLTMuMTM3Ny0xMC40NTktMS41OTM4LTUuMTI5OS0zLjM4NjctMTAuNDU5LTUuMjc5My0xNS43ODgtNi40MjQ4LTE4LjE3OS0xNC4wOTUtMzUuOTA5LTIzLjA2LTUzLjQ0LTMuNzg1MS03LjM3MTEtNy45MTg5LTE0Ljg5Mi0xMi4yNTItMjIuMzEyLTIwLjIyMS0zNC4zNjUtNDUuNjIxLTY2LjkzNy03Ni4wNTItOTcuMzY4LTcyLjMxNi03Mi4zMTYtMTU2LjU0LTExNi4xOS0yNTIuNjYtMTMxLjUzLTE2LjE4Ny0yLjU4OTgtMzIuNjcyLTQuMzgyOC00OS44NTQtNS4zMjkxLTkuNjYyMS0wLjU0Nzg1LTE5Ljc3Mi0wLjg0NjY4LTI5Ljk4Mi0wLjg0NjY4LTkuMzEzNSAwLTE4LjUyNyAwLjI0OTAyLTI3Ljc5MSAwLjc0NzA3LTExNy44OSA2LjA3NjItMjE5LjQ0IDUxLjc0Ny0zMDQuNjYgMTM2Ljk2cS0xMzcuNzEgMTM3LjcxLTEzNy43MSAzMzIuNDVjMCAxMjkuODQgNDUuOTIgMjQwLjcxIDEzNy43MSAzMzIuNSA1Ni40NzkgNTYuNDI5IDEyMC4wOCA5NS41MjUgMTkwLjM1IDExNy4wOSAzNi42MDYgMTEuMjA2IDc0LjUwOCAxNy43OCAxMTQuMyAxOS44NzJoMC4zOTg0NGM4LjQ2NjggMC40NDgzIDE2LjUzNSAwLjY5NzMgMjQuNDA0IDAuNjk3M2gyLjk4ODNjMTAuMjYgMCAyMC40Mi0wLjI5ODggMjkuOTgyLTAuNzk2OSAyLjQ5MDItMC4xNDk0IDQuNzMxNC0wLjI5ODggNi45MjI4LTAuNDQ4MiAyMC4xMjEtMS40NDQzIDM5Ljc0NC00LjAzNDIgNTguNDcxLTcuNjY5OSA3LjkxODktMS41NDQgMTUuNzM4LTMuMjg3MiAyMy4zMDktNS4xMjk5IDgwLjQ4NC0yMC4yMjEgMTUxLjU2LTYxLjM1OSAyMTMuODEtMTIzLjYyIDQ4LjQxLTQ4LjQxIDg0LjA3LTEwMi4xIDEwNi45My0xNjEuMTcgMTguMzc4LTQ3LjQ2NCAyOC41MzgtOTguNDE0IDMwLjQzMS0xNTIuOSAwLjE5OTItNi4wMjY0IDAuMjk4OS0xMi4yMDIgMC4yOTg5LTE4LjQyOHYtMS45OTIyLTAuOTk2MDljLTAuMTk5My00MC40OTEtNC45MzA3LTc5LjE4OS0xNC4yNDQtMTE2LjU0eiIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiLz4KICAgIDxwYXRoIGQ9Im05NjcuOTYgMzkyLjQyYy0xLjA5NTctNC4zMzMtMi4zNDA4LTguOTY0OC0zLjYzNTctMTMuNTQ3LTAuOTk2MS0zLjM4NjctMS45OTIyLTYuODIzMi0zLjEzNzctMTAuNDU5LTEuNTkzOC01LjEyOTktMy4zODY3LTEwLjQ1OS01LjI3OTMtMTUuNzg4LTYuNDI0OC0xOC4xNzktMTQuMDk1LTM1LjkwOS0yMy4wNi01My40NC0zLjc4NTEtNy4zNzExLTcuOTE4OS0xNC44OTItMTIuMjUyLTIyLjMxMi0yMC4yMjEtMzQuMzY1LTQ1LjYyMS02Ni45MzctNzYuMDUyLTk3LjM2OC03Mi4zMTYtNzIuMzE2LTE1Ni41NC0xMTYuMTktMjUyLjY2LTEzMS41My0xNi4xODctMi41ODk4LTMyLjY3Mi00LjM4MjgtNDkuODU0LTUuMzI5MS05LjY2MjEtMC41NDc4NS0xOS43NzItMC44NDY2OC0yOS45ODItMC44NDY2OC05LjMxMzUgMC0xOC41MjcgMC4yNDkwMi0yNy43OTEgMC43NDcwNy0xMTcuODkgNi4wNzYyLTIxOS40NCA1MS43NDctMzA0LjY2IDEzNi45NnEtMTM3LjcxIDEzNy43MS0xMzcuNzEgMzMyLjQ1YzAgMTI5Ljg0IDQ1LjkyIDI0MC43MSAxMzcuNzEgMzMyLjUgNTYuNDc5IDU2LjQyOSAxMjAuMDggOTUuNTI1IDE5MC4zNSAxMTcuMDkgMzYuNjA2IDExLjIwNiA3NC41MDggMTcuNzggMTE0LjMgMTkuODcyaDAuMzk4NDRjOC40NjY4IDAuNDQ4MyAxNi41MzUgMC42OTczIDI0LjQwNCAwLjY5NzNoMi45ODgzYzEwLjI2IDAgMjAuNDItMC4yOTg4IDI5Ljk4Mi0wLjc5NjkgMi40OTAyLTAuMTQ5NCA0LjczMTQtMC4yOTg4IDYuOTIyOC0wLjQ0ODIgMjAuMTIxLTEuNDQ0MyAzOS43NDQtNC4wMzQyIDU4LjQ3MS03LjY2OTkgNy45MTg5LTEuNTQ0IDE1LjczOC0zLjI4NzIgMjMuMzA5LTUuMTI5OSA4MC40ODQtMjAuMjIxIDE1MS41Ni02MS4zNTkgMjEzLjgxLTEyMy42MiA0OC40MS00OC40MSA4NC4wNy0xMDIuMSAxMDYuOTMtMTYxLjE3IDE4LjM3OC00Ny40NjQgMjguNTM4LTk4LjQxNCAzMC40MzEtMTUyLjkgMC4xOTkyLTYuMDI2NCAwLjI5ODktMTIuMjAyIDAuMjk4OS0xOC40Mjh2LTEuOTkyMi0wLjk5NjA5Yy0wLjE5OTMtNDAuNDkxLTQuOTMwNy03OS4xODktMTQuMjQ0LTExNi41NHoiIGZpbGw9InVybCgjYSkiLz4KICAgPC9nPgogIDwvZz4KICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjA5NzMgMCAwIDEuMDk3MyAtNTEuNTQ4IC01Ni4zOTYpIiBkPSJtNTA5Ljg1IDI4MS44OWMtMTUuODMzLTAuMDMyMS0zMS41NzIgNS43MjQ5LTQyLjkzNSAxNy4zNTRsLTE4OC45OSAxOTMuNDFjLTYzLjg2OCA3OS4wOTMgNDMuNDY5IDY5LjkxIDg5LjQ4MSA5Mi42OTEgMTYuNTA1IDE2Ljg3MS02My4yNTIgMjkuMjYtNDYuNzQ3IDQ2LjE0NSAxNi41MDUgMTYuODcxIDk5LjczMiAzMi40ODQgMTE2LjI2IDQ5LjM1NSAxNi41MDUgMTYuODcxLTMzLjc1OSAzNC43OTEtMTcuMjU0IDUxLjY2MiAxNi41MDUgMTYuODcxIDU0LjY0NiAwLjg3NjgzIDYxLjc5NCAzOS44MjUgNS4wOTM3IDI3LjgzMiA2OC44NjEgMTEuOTYxIDEwMC4wMS0xMC44MzQgMTYuNTA1LTE2Ljg4NS0zMS41NTItMTUuMjMtMTUuMDQ3LTMyLjEwMSA0MS4wNDUtNDEuOTc0IDc5LjI1LTE1LjMyMiA5My4yOTMtNTcuMzggNi45MzY5LTIwLjc4My02MC40NzEtMzEuOTgyLTQzLjkzOC00OC44NTMgNDcuNDg5LTI3LjczNCAyMTEuNi00NS44MDYgMTMzLjcyLTEyMy42OWwtMTk1LjkxLTIwMC4yM2MtMTEuOTgxLTExLjUwMy0yNy45MDQtMTcuMzIzLTQzLjczNy0xNy4zNTR6bTEuNjA1IDE4LjM1OGMxMS4zMDQgMC4wNTk3IDIyLjU4NCA0LjMyMTkgMzAuNjk2IDEyLjUzOWw3NC44MzUgNzUuOTM4YzcuMDkxNyA3LjI0NjUgNi45Nzc0IDIxLjI0MSAzLjAwOTQgMjUuMjc5bC0zNy4xMTYtMjkuNjkzLTcuMzIzIDQ0LjAzOC0zMC45OTctMTYuMzUxLTQ5Ljc1NiAzMS4yOTgtMTYuNDUyLTY2LjEwNy0yNi42ODQgNDYuMTQ1aC00MC43MjhjLTE2LjYzMiAwLTE4LjYyMy0yMS4xMDItMy41MTEtMzYuMjE0IDI2LjM5Ny0yOC40OTQgNTYuNjY3LTU3LjUwNCA3My4xMjktNzQuMzMzIDguMjczNy04LjQ1NjYgMTkuNTkzLTEyLjU5OSAzMC44OTctMTIuNTM5em0tODkuNzgyIDI5NS41M2M1LjA1MTUgMy4xMzc4IDgxLjQ0MiAxOC42NzMgMTAwLjExIDIxLjc2OCA2LjQ3MjYgMS4zNjQ5IDEuODk4OSA4LjAzNjctNy4wMjIgMTIuNTM5LTIwLjEyMSA1LjM0Ny0xMTcuNzItMzQuMzA4LTkzLjA5Mi0zNC4zMDh6bTI5Ny4xMyA1My4xNjdjLTE1LjM3MiAwLjUyOTQxLTMwLjUzIDguMzQ3Mi0zNC43MDkgMjMuMDcyIDAgOS41OTY0IDcwLjYyMiAxNS45NDUgNzAuNjIyLTIuMjA2OS01LjAzNzQtMTQuNTc3LTIwLjU0LTIxLjM5NS0zNS45MTMtMjAuODY1em0tMzI0LjIyIDQxLjUzYy0yMi4xNTktMC4yMDU0NC00OC4xMDUgMTYuMDQ3LTI4Ljk5MSAzMi42MDIgMTYuNzQ0IDE0LjQ3OSA0Mi42MDUtMy42NjkxIDUwLjM1OC0yMy44NzUtNC41NjI5LTYuMDYyOC0xMi42OTYtOC42NDctMjEuMzY3LTguNzI3NHptMjgwLjU4IDEuMzA0MWMtMjEuNTg1IDE5LjM2MiAyLjM5OTEgMzguOTkyIDIzLjY3NCAyNi40ODMgNC43NDE5LTQuODEyMi0wLjEwNTYxLTIxLjY3MS0yMy42NzQtMjYuNDgzeiIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMiIgc3Ryb2tlLXdpZHRoPSI1MC4zNDUiLz4KICA8cGF0aCBkPSJtNTA3LjkgMjQxLjk0Yy0xNy4zNzMtMC4wMzUyLTM0LjY0NCA2LjI4MTgtNDcuMTExIDE5LjA0M2wtMjA3LjM4IDIxMi4yMmMtNzAuMDgxIDg2Ljc4NiA0Ny42OTcgNzYuNzExIDk4LjE4NSAxMDEuNzEgMTguMTExIDE4LjUxMi02OS40MDUgMzIuMTA2LTUxLjI5NCA1MC42MzQgMTguMTExIDE4LjUxMiAxMDkuNDMgMzUuNjQ0IDEyNy41NyA1NC4xNTYgMTguMTExIDE4LjUxMi0zNy4wNDMgMzguMTc2LTE4LjkzMyA1Ni42ODggMTguMTExIDE4LjUxMiA1OS45NjIgMC45NjIxMiA2Ny44MDUgNDMuNjk5IDUuNTg5MiAzMC41NCA3NS41NTkgMTMuMTI0IDEwOS43NC0xMS44ODggMTguMTExLTE4LjUyNy0zNC42MjItMTYuNzExLTE2LjUxMS0zNS4yMjMgNDUuMDM3LTQ2LjA1NyA4Ni45NTktMTYuODEzIDEwMi4zNy02Mi45NjIgNy42MTE3LTIyLjgwNC02Ni4zNTQtMzUuMDkzLTQ4LjIxMi01My42MDYgNTIuMTA5LTMwLjQzMiAyMzIuMTktNTAuMjYxIDE0Ni43My0xMzUuNzJsLTIxNC45Ny0yMTkuNzFjLTEzLjE0Ny0xMi42MjItMzAuNjE4LTE5LjAwOC00Ny45OTItMTkuMDQzem0xLjc2MTIgMjAuMTQzYzEyLjQwNCAwLjA2NTUgMjQuNzgxIDQuNzQyNCAzMy42ODIgMTMuNzU5bDgyLjExNCA4My4zMjVjNy43ODE2IDcuOTUxNCA3LjY1NjIgMjMuMzA3IDMuMzAyMiAyNy43MzhsLTQwLjcyNy0zMi41ODItOC4wMzUzIDQ4LjMyMi0zNC4wMTMtMTcuOTQyLTU0LjU5NiAzNC4zNDMtMTguMDUyLTcyLjUzOC0yOS4yNzkgNTAuNjM0aC00NC42OWMtMTguMjUgMC0yMC40MzUtMjMuMTU0LTMuODUyNS0zOS43MzYgMjguOTY1LTMxLjI2NSA2Mi4xNzktNjMuMDk4IDgwLjI0My04MS41NjQgOS4wNzg1LTkuMjc5MiAyMS40OTktMTMuODI1IDMzLjkwMi0xMy43NTl6bS05OC41MTUgMzI0LjI3YzUuNTQyOCAzLjQ0MyA4OS4zNjQgMjAuNDg5IDEwOS44NSAyMy44ODYgNy4xMDIyIDEuNDk3NyAyLjA4MzYgOC44MTg0LTcuNzA1MSAxMy43NTktMjIuMDc5IDUuODY3MS0xMjkuMTctMzcuNjQ1LTEwMi4xNS0zNy42NDV6bTMyNi4wNCA1OC4zMzljLTE2Ljg2OCAwLjU4MDkxLTMzLjUgOS4xNTkyLTM4LjA4NSAyNS4zMTcgMCAxMC41MyA3Ny40OTEgMTcuNDk2IDc3LjQ5MS0yLjQyMTYtNS41Mjc0LTE1Ljk5NS0yMi41MzgtMjMuNDc2LTM5LjQwNi0yMi44OTV6bS0zNTUuNzYgNDUuNTdjLTI0LjMxNS0wLjIyNTQyLTUyLjc4NSAxNy42MDgtMzEuODExIDM1Ljc3NCAxOC4zNzMgMTUuODg3IDQ2Ljc0OS00LjAyNiA1NS4yNTctMjYuMTk3LTUuMDA2OC02LjY1MjYtMTMuOTMxLTkuNDg4MS0yMy40NDYtOS41NzY0em0zMDcuODcgMS40MzFjLTIzLjY4NCAyMS4yNDUgMi42MzI0IDQyLjc4NSAyNS45NzcgMjkuMDU5IDUuMjAzMi01LjI4MDMtMC4xMTU4OC0yMy43NzktMjUuOTc3LTI5LjA1OXoiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iNTUuMjQyIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"inkscape,inkscape\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.inkscape.Inkscape.desktop\"\nLABEL oc.launch=\"org.inkscape.Inkscape.Inkscape\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"inkscape\"\nLABEL oc.displayname=\"inkscape\"\nLABEL oc.path=\"/usr/bin/inkscape\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/svg+xml;image/svg+xml-compressed;application/vnd.corel-draw;application/pdf;application/postscript;image/x-eps;application/illustrator;image/cgm;image/x-wmf;application/x-xccx;application/x-xcgm;application/x-xcdt;application/x-xsk1;application/x-xcmx;image/x-xcdr;application/visio;application/x-visio;application/vnd.visio;application/visio.drawing;application/vsd;application/x-vsd;image/x-vsd;\"\nLABEL oc.fileextensions=\"ai;cdr\"\nLABEL oc.legacyfileextensions=\"ai;cdr\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"inkscape\"\nENV APPBIN \"/usr/bin/inkscape\"\nENV APP \"/usr/bin/inkscape\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/inkscape/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/inkscape/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application inkscape

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/inkscape.d\n
"},{"location":"applications/inkscape/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f inkscape.d -t inkscape .\n
"},{"location":"applications/inkscape/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect inkscape > inkscape.json\ndocker image save inkscape -o inkscape.tar\nctr -n k8s.io images import inkscape.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @inkscape.json\n\n
"},{"location":"applications/jupyter/","title":"jupyter","text":""},{"location":"applications/jupyter/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.20.04

"},{"location":"applications/jupyter/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/jupyter/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
"},{"location":"applications/jupyter/#arguments","title":"Arguments","text":"

\"--disable-factory --class=jupyter -- /usr/local/bin/startjupyter.sh\"

"},{"location":"applications/jupyter/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/jupyter/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/jupyter/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/jupyter/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.jupyter\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/jupyter/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/jupyter/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\nRUN pip3 install torch\nRUN pip3 install jupyterlab\nRUN pip install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\n
"},{"location":"applications/jupyter/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\n
"},{"location":"applications/jupyter/#json-dump","title":"JSON dump","text":"

json source file jupyter.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN add-apt-repository ppa:mozillateam/ppa\",\n        \"COPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\",\n        \"RUN pip3 install torch\",\n        \"RUN pip3 install jupyterlab\",\n        \"RUN pip install jupyterlab-nvdashboard\",\n        \"RUN # jupyter labextension install jupyterlab-nvdashboard\"\n    ],\n    \"debpackage\": \"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n    \"icon\": \"jupyter.svg\",\n    \"keyword\": \"jupyter\",\n    \"launch\": \"gnome-terminal-server.jupyter\",\n    \"name\": \"jupyter\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=jupyter -- /usr/local/bin/startjupyter.sh\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.20.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\",\n        \"COPY startjupyter.sh /usr/local/bin/startjupyter.sh\"\n    ]\n}\n
"},{"location":"applications/jupyter/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output jupyter.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyter.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyter.d.3.0.json\n\n
"},{"location":"applications/jupyter/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.20.04:$TAG\nUSER root\nRUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes sudo && apt-get clean\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 curl libcurl4-openssl-dev libssl-dev firefox wget && apt-get clean\nRUN pip3 install torch\nRUN pip3 install jupyterlab\nRUN pip install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"jupyter.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDQiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCA0NCA1MSIgdmVyc2lvbj0iMi4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpmaWdtYT0iaHR0cDovL3d3dy5maWdtYS5jb20vZmlnbWEvbnMiPgo8dGl0bGU+R3JvdXAuc3ZnPC90aXRsZT4KPGRlc2M+Q3JlYXRlZCB1c2luZyBGaWdtYSAwLjkwPC9kZXNjPgo8ZyBpZD0iQ2FudmFzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0MCAtMjQ1MykiIGZpZ21hOnR5cGU9ImNhbnZhcyI+CjxnIGlkPSJHcm91cCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9Ikdyb3VwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0iR3JvdXAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGg5IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoMF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQwLjU0IDI0NzQuMzYpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTAgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGgxX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDUuNjggMjQ3NC4zNykiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxMSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDJfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY1My4zOSAyNDc0LjI2KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDEyIGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoM19maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjYwLjQzIDI0NzQuMzkpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTMgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg0X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NjcuNTUgMjQ3Mi41NCkiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDVfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3Mi40NyAyNDc0LjI5KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE1IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoNl9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjc5Ljk4IDI0NzQuMjQpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNiBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDdfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3My40OCAyNDUzLjY5KSIgZmlsbD0iIzc2NzY3NyIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE3IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoOF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQzLjIxIDI0ODQuMjcpIiBmaWxsPSIjRjM3NzI2IiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTggZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg5X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjEgMjQ1Ny44OCkiIGZpbGw9IiNGMzc3MjYiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxOSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDEwX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjggMjQ5Ni4wOSkiIGZpbGw9IiM5RTlFOUUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgyMCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDExX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDEuODcgMjQ1OC40MykiIGZpbGw9IiM2MTYyNjIiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxkZWZzPgo8cGF0aCBpZD0icGF0aDBfZmlsbCIgZD0iTSAxLjc0NDk4IDUuNDc1MzNDIDEuNzQ0OTggNy4wMzMzNSAxLjYyMDM0IDcuNTQwODIgMS4yOTk4MyA3LjkxNDc0QyAwLjk0MzExOSA4LjIzNTk1IDAuNDgwMDI0IDguNDEzNTggMCA4LjQxMzMxTCAwLjEyNDY0MiA5LjMwMzZDIDAuODY4ODQgOS4zMTM2NiAxLjU5MDk1IDkuMDUwNzggMi4xNTQ1MiA4LjU2NDY2QyAyLjQ1Nzc1IDguMTk0ODcgMi42ODM0IDcuNzY3ODEgMi44MTggNy4zMDg5M0MgMi45NTI2MSA2Ljg1MDA1IDIuOTkzNDEgNi4zNjg3NiAyLjkzNzk4IDUuODkzNzdMIDIuOTM3OTggMEwgMS43NDQ5OCAwTCAxLjc0NDk4IDUuNDM5NzJMIDEuNzQ0OTggNS40NzUzM1oiLz4KPHBhdGggaWQ9InBhdGgxX2ZpbGwiIGQ9Ik0gNS41MDIwNCA0Ljc2MzA5QyA1LjUwMjA0IDUuNDMwODEgNS41MDIwNCA2LjAyNzMxIDUuNTU1NDUgNi41NDM2OEwgNC40OTYgNi41NDM2OEwgNC40MjQ3OCA1LjQ4NDIzQyA0LjIwMzE4IDUuODU5MDkgMy44ODYyNyA2LjE2ODU4IDMuNTA2MjggNi4zODEyNUMgMy4xMjYyOCA2LjU5MzkyIDIuNjk2NzUgNi43MDIxOSAyLjI2MTM1IDYuNjk1MDNDIDEuMjI4NjEgNi42OTUwMyAwIDYuMTM0MTUgMCAzLjg0NjA4TCAwIDAuMDQ0NTE0OUwgMS4xOTMgMC4wNDQ1MTQ5TCAxLjE5MyAzLjYwNTdDIDEuMTkzIDQuODQzMjIgMS41NzU4MyA1LjY3MTE5IDIuNjUzMDkgNS42NzExOUMgMi44NzQ3MiA1LjY3MzU4IDMuMDk0NTkgNS42MzE2OCAzLjI5OTgyIDUuNTQ3OTZDIDMuNTA1MDUgNS40NjQyNCAzLjY5MTQ5IDUuMzQwMzkgMy44NDgyMiA1LjE4MzY2QyA0LjAwNDk0IDUuMDI2OTQgNC4xMjg4IDQuODQwNDkgNC4yMTI1MiA0LjYzNTI3QyA0LjI5NjIzIDQuNDMwMDQgNC4zMzgxMyA0LjIxMDE2IDQuMzM1NzUgMy45ODg1M0wgNC4zMzU3NSAwTCA1LjUyODc0IDBMIDUuNTI4NzQgNC43Mjc0OEwgNS41MDIwNCA0Ljc2MzA5WiIvPgo8cGF0aCBpZD0icGF0aDJfZmlsbCIgZD0iTSAwLjA1MzQxNzggMi4yNzI2NEMgMC4wNTM0MTc4IDEuNDQ0NjYgMC4wNTM0MTc4IDAuNzY4MDM2IDAgMC4xNTM3MzFMIDEuMDY4MzYgMC4xNTM3MzFMIDEuMTIxNzcgMS4yNjY2QyAxLjM1OTggMC44NjQ1MzUgMS43MDI0NyAwLjUzNDU5NCAyLjExMzI1IDAuMzExOTU0QyAyLjUyNDA0IDAuMDg5MzE0NSAyLjk4NzU0IC0wLjAxNzY3ODYgMy40NTQzNSAwLjAwMjM4MDk1QyA1LjAzOTA4IDAuMDAyMzgwOTUgNi4yMzIwOCAxLjMyODkyIDYuMjMyMDggMy4zMDUzOEMgNi4yMzIwOCA1LjYzNzk2IDQuNzk4NyA2Ljc5NTM1IDMuMjQ5NTggNi43OTUzNUMgMi44NTMwOSA2LjgxMzA0IDIuNDU4NzQgNi43MjgxIDIuMTA0NjkgNi41NDg3NEMgMS43NTA2NCA2LjM2OTM3IDEuNDQ4ODggNi4xMDE2NiAxLjIyODYxIDUuNzcxNTFMIDEuMjI4NjEgNS43NzE1MUwgMS4yMjg2MSA5LjMzMjY5TCAwLjA1MzQxNzggOS4zMzI2OUwgMC4wNTM0MTc4IDIuMjk5MzVMIDAuMDUzNDE3OCAyLjI3MjY0Wk0gMS4yMjg2MSA0LjAwODcyQyAxLjIzMTg0IDQuMTcwMjYgMS4yNDk3MiA0LjMzMTE3IDEuMjgyMDMgNC40ODk0OEMgMS4zODMwNCA0Ljg4NDc5IDEuNjEyOTkgNS4yMzUxMyAxLjkzNTQ4IDUuNDg1MDZDIDIuMjU3OTggNS43MzUgMi42NTQ2MSA1Ljg3MDI2IDMuMDYyNjIgNS44Njk0NEMgNC4zMTc5NCA1Ljg2OTQ0IDUuMDU2ODkgNC44NDU2IDUuMDU2ODkgMy4zNTg4QyA1LjA1Njg5IDIuMDU4OTcgNC4zNjI0NiAwLjk0NjA5NiAzLjEwNzE0IDAuOTQ2MDk2QyAyLjYxMDM2IDAuOTg2Nzc3IDIuMTQ1NDggMS4yMDcyNiAxLjc5OTY1IDEuNTY2MkMgMS40NTM4MiAxLjkyNTE0IDEuMjUwNzkgMi4zOTc5IDEuMjI4NjEgMi44OTU4NUwgMS4yMjg2MSA0LjAwODcyWiIvPgo8cGF0aCBpZD0icGF0aDNfZmlsbCIgZD0iTSAxLjMxNzY0IDAuMDE3ODA1OUwgMi43NTEwMiAzLjg1NDk5QyAyLjkwMjM3IDQuMjgyMzMgMy4wNjI2MiA0Ljc5ODcgMy4xNjk0NiA1LjE4MTUzQyAzLjI5NDEgNC43ODk4IDMuNDI3NjQgNC4yOTEyMyAzLjU4NzkgMy44MjgyOEwgNC44ODc3MyAwLjAxNzgwNTlMIDYuMTQzMDUgMC4wMTc4MDU5TCA0LjM2MjQ2IDQuNjQ3MzVDIDMuNDcyMTYgNi44NzMwOSAyLjkyOTA4IDguMDIxNTggMi4xMSA4LjcxNjAxQyAxLjY5NzQ1IDkuMDkyODMgMS4xOTQ0OCA5LjM1NjU4IDAuNjQ5OTE3IDkuNDgxNjZMIDAuMzU2MTE5IDguNDg0NTNDIDAuNzM2ODg2IDguMzU5NDIgMS4wOTAzOCA4LjE2MzA0IDEuMzk3NzcgNy45MDU4NEMgMS44MzIxIDcuNTUxODggMi4xNzY3OCA3LjEwMDQ0IDIuNDAzOCA2LjU4ODJDIDIuNDUyMzkgNi40OTk0OSAyLjQ4NTUxIDYuNDAzMTQgMi41MDE3MyA2LjMwMzNDIDIuNDkxNjEgNi4xOTU4NiAyLjQ2NDU3IDYuMDkwNyAyLjQyMTYxIDUuOTkxN0wgMCAwTCAxLjI5OTgzIDBMIDEuMzE3NjQgMC4wMTc4MDU5WiIvPgo8cGF0aCBpZD0icGF0aDRfZmlsbCIgZD0iTSAyLjE5MDEzIDBMIDIuMTkwMTMgMS44Njk2MkwgMy44OTk1IDEuODY5NjJMIDMuODk5NSAyLjc1OTkyTCAyLjE5MDEzIDIuNzU5OTJMIDIuMTkwMTMgNi4yNjc2OUMgMi4xOTAxMyA3LjA2ODk2IDIuNDIxNjEgNy41MzE5MSAzLjA4MDQzIDcuNTMxOTFDIDMuMzE0NDIgNy41MzU3NCAzLjU0Nzg5IDcuNTA4OCAzLjc3NDg2IDcuNDUxNzlMIDMuODI4MjggOC4zNDIwOEMgMy40ODc5NCA4LjQ1OTk5IDMuMTI4ODEgOC41MTQzMSAyLjc2ODgyIDguNTAyMzRDIDIuNTMwNDIgOC41MTcyNiAyLjI5MTYxIDguNDgwNDMgMi4wNjg3OCA4LjM5NDM3QyAxLjg0NTk1IDguMzA4MzEgMS42NDQzOCA4LjE3NTA2IDEuNDc3ODkgOC4wMDM3N0MgMS4xMTUyNSA3LjUxODczIDAuOTQ5ODI2IDYuOTE0MzEgMS4wMTQ5NCA2LjMxMjIxTCAxLjAxNDk0IDIuNzUxMDJMIDAgMi43NTEwMkwgMCAxLjg2MDcyTCAxLjAzMjc0IDEuODYwNzJMIDEuMDMyNzQgMC4yNzU5OTJMIDIuMTkwMTMgMFoiLz4KPHBhdGggaWQ9InBhdGg1X2ZpbGwiIGQ9Ik0gMS4xNzcxNiAzLjU3ODk5QyAxLjE1MyAzLjg4MDkzIDEuMTk0NjggNC4xODQ1MSAxLjI5OTMzIDQuNDY4NzZDIDEuNDAzOTggNC43NTMwMSAxLjU2OTEgNS4wMTExNCAxLjc4MzI5IDUuMjI1MzJDIDEuOTk3NDcgNS40Mzk1MSAyLjI1NTYgNS42MDQ2MyAyLjUzOTg1IDUuNzA5MjhDIDIuODI0MSA1LjgxMzkzIDMuMTI3NjggNS44NTU2MSAzLjQyOTYyIDUuODMxNDVDIDQuMDQwMzMgNS44NDUxMSA0LjY0NzA2IDUuNzI5ODMgNS4yMTAyMSA1LjQ5MzEzTCA1LjQxNDk4IDYuMzgzNDNDIDQuNzIzOTMgNi42NjgwOSAzLjk4MDg1IDYuODA0NTggMy4yMzM3NSA2Ljc4NDA2QyAyLjc5ODIxIDYuODEzODggMi4zNjEzOCA2Ljc0OTE0IDEuOTUzMjIgNi41OTQyN0MgMS41NDUwNSA2LjQzOTQxIDEuMTc1MjIgNi4xOTgwOSAwLjg2OTA3MSA1Ljg4Njg4QyAwLjU2MjkyOCA1LjU3NTY2IDAuMzI3NzIzIDUuMjAxOSAwLjE3OTU5MSA0Ljc5MTI1QyAwLjAzMTQ1ODQgNC4zODA1OSAtMC4wMjYwOTYyIDMuOTQyNzYgMC4wMTA4NzQ4IDMuNTA3NzdDIDAuMDEwODc0OCAxLjU0OTEyIDEuMTc3MTYgMCAzLjA4MjQgMEMgNS4yMTkxMSAwIDUuNzUzMjkgMS44Njk2MiA1Ljc1MzI5IDMuMDYyNjJDIDUuNzY0NzEgMy4yNDY0NCA1Ljc2NDcxIDMuNDMwNzkgNS43NTMyOSAzLjYxNDYxTCAxLjE1MDQ2IDMuNjE0NjFMIDEuMTc3MTYgMy41Nzg5OVpNIDQuNjY3MTMgMi42ODg3QyA0LjcwMTQ5IDIuNDUwNjcgNC42ODQ0MyAyLjIwODA1IDQuNjE3MDkgMS45NzcxOEMgNC41NDk3NiAxLjc0NjMxIDQuNDMzNzIgMS41MzI1NSA0LjI3NjggMS4zNTAzMUMgNC4xMTk4NyAxLjE2ODA4IDMuOTI1NzEgMS4wMjE2IDMuNzA3MzkgMC45MjA3NDRDIDMuNDg5MDcgMC44MTk4OSAzLjI1MTY2IDAuNzY3MDA2IDMuMDExMTggMC43NjU2NTZDIDIuNTIyMDEgMC44MDEwNjQgMi4wNjM3MSAxLjAxNzg4IDEuNzI2MDkgMS4zNzM2MkMgMS4zODg0NyAxLjcyOTM1IDEuMTk1ODggMi4xOTgzNSAxLjE4NjA3IDIuNjg4N0wgNC42NjcxMyAyLjY4ODdaIi8+CjxwYXRoIGlkPSJwYXRoNl9maWxsIiBkPSJNIDAuMDUzNDE3OCAyLjE5MjI4QyAwLjA1MzQxNzggMS40MjY2MyAwLjA1MzQxNzggMC43Njc4MDYgMCAwLjE2MjQwNEwgMS4wNjgzNiAwLjE2MjQwNEwgMS4wNjgzNiAxLjQzNTUzTCAxLjEyMTc3IDEuNDM1NTNDIDEuMjMzOTEgMS4wNDI1OSAxLjQ2NTYgMC42OTQzMTQgMS43ODQ2OCAwLjQzOTA0OUMgMi4xMDM3NiAwLjE4Mzc4MyAyLjQ5NDQgMC4wMzQxOTYgMi45MDIzNyAwLjAxMTA1MzhDIDMuMDE0NjYgLTAuMDAzNjg0NTkgMy4xMjgzOSAtMC4wMDM2ODQ1OSAzLjI0MDY4IDAuMDExMDUzOEwgMy4yNDA2OCAxLjEyMzkzQyAzLjEwNDYyIDEuMTA4MTcgMi45NjcyIDEuMTA4MTcgMi44MzExNCAxLjEyMzkzQyAyLjQyNyAxLjEzOTU4IDIuMDQyMzcgMS4zMDE4MiAxLjc0OTEgMS41ODAzNUMgMS40NTU4MyAxLjg1ODg3IDEuMjczOTggMi4yMzQ2MiAxLjIzNzUxIDIuNjM3NDNDIDEuMjA0MjIgMi44MTk2IDEuMTg2MzUgMy4wMDQyNSAxLjE4NDEgMy4xODk0MUwgMS4xODQxIDYuNjUyNjdMIDAuMDA4OTAyOTcgNi42NTI2N0wgMC4wMDg5MDI5NyAyLjIwMTE4TCAwLjA1MzQxNzggMi4xOTIyOFoiLz4KPHBhdGggaWQ9InBhdGg3X2ZpbGwiIGQ9Ik0gNi4wMzA1OSAyLjgzNTY1QyA2LjA2NzE1IDMuNDMzNzYgNS45MjQ4NSA0LjAyOTIxIDUuNjIxOCA0LjU0NjE1QyA1LjMxODc1IDUuMDYzMSA0Ljg2ODY5IDUuNDc4MTMgNC4zMjg5MyA1LjczODM5QyAzLjc4OTE3IDUuOTk4NjQgMy4xODQxNiA2LjA5MjMzIDIuNTkwOTcgNi4wMDc1M0MgMS45OTc3OCA1LjkyMjcyIDEuNDQzMjYgNS42NjMyNiAwLjk5ODA0OCA1LjI2MjE5QyAwLjU1MjgzNyA0Ljg2MTEzIDAuMjM3MDkgNC4zMzY2MSAwLjA5MTAzMDcgMy43NTU0NkMgLTAuMDU1MDI4NyAzLjE3NDMxIC0wLjAyNDc4OTEgMi41NjI4MyAwLjE3Nzg5NyAxLjk5ODkzQyAwLjM4MDU4MyAxLjQzNTAzIDAuNzQ2NTQxIDAuOTQ0MjIxIDEuMjI5MTUgMC41ODkwMzdDIDEuNzExNzYgMC4yMzM4NTMgMi4yODkxOCAwLjAzMDM2ODYgMi44ODc4NCAwLjAwNDUwNTQzQyAzLjI4MDM1IC0wLjAxNzA5MzIgMy42NzMyNiAwLjAzOTExNDQgNC4wNDM5NiAwLjE2OTg5NkMgNC40MTQ2NyAwLjMwMDY3NyA0Ljc1NTg3IDAuNTAzNDUzIDUuMDQ3OTQgMC43NjY1NjFDIDUuMzQgMS4wMjk2NyA1LjU3NzE4IDEuMzQ3OTIgNS43NDU4MiAxLjcwMzAxQyA1LjkxNDQ2IDIuMDU4MSA2LjAxMTI0IDIuNDQzMDMgNi4wMzA1OSAyLjgzNTY1TCA2LjAzMDU5IDIuODM1NjVaIi8+CjxwYXRoIGlkPSJwYXRoOF9maWxsIiBkPSJNIDE4LjY5NjIgNy4xMjIzOEMgMTAuNjgzNiA3LjEyMjM4IDMuNjQxMzEgNC4yNDY3MiAwIDBDIDEuNDEyODQgMy44MjA0MSAzLjk2MjE1IDcuMTE2MyA3LjMwNDc5IDkuNDQ0MDRDIDEwLjY0NzQgMTEuNzcxOCAxNC42MjMgMTMuMDE5NiAxOC42OTYyIDEzLjAxOTZDIDIyLjc2OTUgMTMuMDE5NiAyNi43NDUgMTEuNzcxOCAzMC4wODc3IDkuNDQ0MDRDIDMzLjQzMDMgNy4xMTYzIDM1Ljk3OTYgMy44MjA0MSAzNy4zOTI1IDQuMDQ4NmUtMTNDIDMzLjc2MDEgNC4yNDY3MiAyNi43NDQ1IDcuMTIyMzggMTguNjk2MiA3LjEyMjM4WiIvPgo8cGF0aCBpZD0icGF0aDlfZmlsbCIgZD0iTSAxOC42OTYyIDUuODk3MjVDIDI2LjcwODkgNS44OTcyNSAzMy43NTEyIDguNzcyOTEgMzcuMzkyNSAxMy4wMTk2QyAzNS45Nzk2IDkuMTk5MjIgMzMuNDMwMyA1LjkwMzMzIDMwLjA4NzcgMy41NzU1OUMgMjYuNzQ1IDEuMjQ3ODUgMjIuNzY5NSA0LjA0ODZlLTEzIDE4LjY5NjIgMEMgMTQuNjIzIDQuMDQ4NmUtMTMgMTAuNjQ3NCAxLjI0Nzg1IDcuMzA0NzkgMy41NzU1OUMgMy45NjIxNSA1LjkwMzMzIDEuNDEyODQgOS4xOTkyMiAwIDEzLjAxOTZDIDMuNjQxMzEgOC43NjQwMSAxMC42NDggNS44OTcyNSAxOC42OTYyIDUuODk3MjVaIi8+CjxwYXRoIGlkPSJwYXRoMTBfZmlsbCIgZD0iTSA3LjU5NTc2IDMuNTY2NTZDIDcuNjQyNzYgNC4zMTk5MiA3LjQ2NDQyIDUuMDcwMjIgNy4wODM0NyA1LjcyMTg2QyA2LjcwMjUxIDYuMzczNSA2LjEzNjE5IDYuODk2OTggNS40NTY2NiA3LjIyNTYxQyA0Ljc3NzEzIDcuNTU0MjQgNC4wMTUxNSA3LjY3MzE0IDMuMjY3ODEgNy41NjcxNkMgMi41MjA0NiA3LjQ2MTE3IDEuODIxNTggNy4xMzUxMSAxLjI2MDIxIDYuNjMwNTFDIDAuNjk4ODM5IDYuMTI1OTEgMC4zMDAzOTQgNS40NjU2MSAwLjExNTYzNyA0LjczMzc1QyAtMC4wNjkxMTkxIDQuMDAxODggLTAuMDMxODIxOSAzLjIzMTU5IDAuMjIyNzc3IDIuNTIwOTlDIDAuNDc3Mzc2IDEuODEwNCAwLjkzNzc1IDEuMTkxNjkgMS41NDUyNCAwLjc0MzY4NUMgMi4xNTI3NCAwLjI5NTY3OCAyLjg3OTg1IDAuMDM4NjU5NSAzLjYzMzk0IDAuMDA1Mzc1ODlDIDQuMTI3OTMgLTAuMDIxMDQ3MSA0LjYyMjI5IDAuMDUwMTE3MyA1LjA4ODc4IDAuMjE0ODAzQyA1LjU1NTI2IDAuMzc5NDkgNS45ODQ3MyAwLjYzNDQ3IDYuMzUyNjQgMC45NjUxNzlDIDYuNzIwNTUgMS4yOTU4OSA3LjAxOTcxIDEuNjk1ODQgNy4yMzMgMi4xNDIyQyA3LjQ0NjMgMi41ODg1NSA3LjU2OTU3IDMuMDcyNTYgNy41OTU3NiAzLjU2NjU2TCA3LjU5NTc2IDMuNTY2NTZaIi8+CjxwYXRoIGlkPSJwYXRoMTFfZmlsbCIgZD0iTSAyLjI1MDYxIDQuMzc5NDNDIDEuODE4ODYgNC4zOTEzNSAxLjM5MzIyIDQuMjc1MzUgMS4wMjcyMiA0LjA0NjAyQyAwLjY2MTIyNCAzLjgxNjY4IDAuMzcxMjA2IDMuNDg0MjQgMC4xOTM2NDEgMy4wOTA1MkMgMC4wMTYwNzYyIDIuNjk2NzkgLTAuMDQxMTA3OCAyLjI1OTM1IDAuMDI5MjgwNCAxLjgzMzIxQyAwLjA5OTY2ODYgMS40MDcwNyAwLjI5NDQ4NiAxLjAxMTI1IDAuNTg5MjMzIDAuNjk1NTQyQyAwLjg4Mzk4MSAwLjM3OTgzIDEuMjY1NSAwLjE1ODMxNiAxLjY4NTgxIDAuMDU4ODU3N0MgMi4xMDYxMSAtMC4wNDA2MDA1IDIuNTQ2NDQgLTAuMDEzNTYyMiAyLjk1MTQzIDAuMTM2NTcyQyAzLjM1NjQxIDAuMjg2NzA3IDMuNzA3OTYgMC41NTMyMzQgMy45NjE4NiAwLjkwMjYzNkMgNC4yMTU3NyAxLjI1MjA0IDQuMzYwNyAxLjY2ODcyIDQuMzc4NDIgMi4xMDAyN0MgNC4zOTUyOSAyLjY4MzggNC4xODEzMSAzLjI1MDQ0IDMuNzgyOTMgMy42NzcxNUMgMy4zODQ1NSA0LjEwMzg3IDIuODMzOTIgNC4zNTYyMyAyLjI1MDYxIDQuMzc5NDNaIi8+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"jupyter,jupyter\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.jupyter\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.20.04\"\nENV ARGS=\"--disable-factory  --class=jupyter -- /usr/local/bin/startjupyter.sh\"\nLABEL oc.name=\"jupyter\"\nLABEL oc.displayname=\"jupyter\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"jupyter\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=jupyter -- /usr/local/bin/startjupyter.sh\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/jupyter/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/jupyter/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application jupyter

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyter.d\n
"},{"location":"applications/jupyter/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f jupyter.d -t jupyter .\n
"},{"location":"applications/jupyter/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect jupyter > jupyter.json\ndocker image save jupyter -o jupyter.tar\nctr -n k8s.io images import jupyter.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyter.json\n\n
"},{"location":"applications/jupyternvidia/","title":"jupyternvidia","text":""},{"location":"applications/jupyternvidia/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.nvidia.22.04

"},{"location":"applications/jupyternvidia/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/jupyternvidia/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
"},{"location":"applications/jupyternvidia/#arguments","title":"Arguments","text":"

\"--disable-factory --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"

"},{"location":"applications/jupyternvidia/#displayname","title":"Displayname","text":"
jupyter nvidia\n
"},{"location":"applications/jupyternvidia/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/jupyternvidia/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/jupyternvidia/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/jupyternvidia/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.jupyternvidia\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/jupyternvidia/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/jupyternvidia/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\nCOPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\nRUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\nRUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\nENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\nRUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\nRUN pip3 install torch\nRUN pip3 install tensorflow-gpu\nRUN pip3 install jupyter notebook\nRUN pip3 install jupyterlab\nRUN pip3 install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\n
"},{"location":"applications/jupyternvidia/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\n
"},{"location":"applications/jupyternvidia/#json-dump","title":"JSON dump","text":"

json source file jupyternvidia.d.3.0.json

{\n    \"comment\": \"https://stackoverflow.com/questions/51002045/how-to-make-jupyter-notebook-to-run-on-gpu\",\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN add-apt-repository ppa:mozillateam/ppa\",\n        \"COPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\",\n        \"COPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\",\n        \"RUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\",\n        \"ENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\n        \"ENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\",\n        \"RUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\",\n        \"RUN pip3 install torch\",\n        \"RUN pip3 install tensorflow-gpu\",\n        \"RUN pip3 install jupyter notebook\",\n        \"RUN pip3 install jupyterlab\",\n        \"RUN pip3 install jupyterlab-nvdashboard\",\n        \"RUN # jupyter labextension install jupyterlab-nvdashboard\"\n    ],\n    \"debpackage\": \"gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n    \"icon\": \"jupyter.svg\",\n    \"keyword\": \"jupyter\",\n    \"launch\": \"gnome-terminal-server.jupyternvidia\",\n    \"name\": \"jupyternvidia\",\n    \"displayname\": \"jupyter nvidia\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory  --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.nvidia.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\",\n        \"COPY startjupyter.sh /usr/local/bin/startjupyter.sh\"\n    ]\n}\n
"},{"location":"applications/jupyternvidia/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output jupyternvidia.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyternvidia.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyternvidia.d.3.0.json\n\n
"},{"location":"applications/jupyternvidia/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.nvidia.22.04:$TAG\nUSER root\nRUN add-apt-repository ppa:mozillateam/ppa\nCOPY etc/apt/preferences.d/mozilla-firefox /etc/apt/preferences.d/mozilla-firefox\nRUN apt-get update && apt-get install --no-install-recommends --yes firefox wget sudo && apt-get clean\nCOPY cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb /tmp\nRUN apt-get update && apt-get install --no-install-recommends --yes -f /tmp/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb && apt-get clean\nRUN cp /var/cudnn-local-repo-ubuntu2204-8.7.0.84/cudnn-local-BF23AD8A-keyring.gpg /usr/share/keyrings/\nENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nENV LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64\nRUN apt-get update && apt-get install --no-install-recommends --yes build-essential python3.9 python3-pip python-is-python3 libcurl4-openssl-dev libssl-dev wget && apt-get clean\nRUN # wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh -O /tmp/anaconda3.sh && bash /tmp/anaconda3.sh -b -p /usr/local/anaconda\nRUN pip3 install torch\nRUN pip3 install tensorflow-gpu\nRUN pip3 install jupyter notebook\nRUN pip3 install jupyterlab\nRUN pip3 install jupyterlab-nvdashboard\nRUN # jupyter labextension install jupyterlab-nvdashboard\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"jupyter.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDQiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCA0NCA1MSIgdmVyc2lvbj0iMi4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpmaWdtYT0iaHR0cDovL3d3dy5maWdtYS5jb20vZmlnbWEvbnMiPgo8dGl0bGU+R3JvdXAuc3ZnPC90aXRsZT4KPGRlc2M+Q3JlYXRlZCB1c2luZyBGaWdtYSAwLjkwPC9kZXNjPgo8ZyBpZD0iQ2FudmFzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0MCAtMjQ1MykiIGZpZ21hOnR5cGU9ImNhbnZhcyI+CjxnIGlkPSJHcm91cCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9Ikdyb3VwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0iR3JvdXAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGg5IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoMF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQwLjU0IDI0NzQuMzYpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTAgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGgxX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDUuNjggMjQ3NC4zNykiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxMSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDJfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY1My4zOSAyNDc0LjI2KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDEyIGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoM19maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjYwLjQzIDI0NzQuMzkpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTMgZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg0X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NjcuNTUgMjQ3Mi41NCkiIGZpbGw9IiM0RTRFNEUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDVfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3Mi40NyAyNDc0LjI5KSIgZmlsbD0iIzRFNEU0RSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE1IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoNl9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjc5Ljk4IDI0NzQuMjQpIiBmaWxsPSIjNEU0RTRFIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxnIGlkPSJnIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxNiBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDdfZmlsbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY3My40OCAyNDUzLjY5KSIgZmlsbD0iIzc2NzY3NyIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiLz4KPC9nPgo8L2c+CjxnIGlkPSJwYXRoIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0iZ3JvdXAiPgo8ZyBpZD0icGF0aDE3IGZpbGwiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJ2ZWN0b3IiPgo8dXNlIHhsaW5rOmhyZWY9IiNwYXRoOF9maWxsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjQzLjIxIDI0ODQuMjcpIiBmaWxsPSIjRjM3NzI2IiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIvPgo8L2c+CjwvZz4KPGcgaWQ9InBhdGgiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7IiBmaWdtYTp0eXBlPSJncm91cCI+CjxnIGlkPSJwYXRoMTggZmlsbCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9InZlY3RvciI+Cjx1c2UgeGxpbms6aHJlZj0iI3BhdGg5X2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjEgMjQ1Ny44OCkiIGZpbGw9IiNGMzc3MjYiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgxOSBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDEwX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDMuMjggMjQ5Ni4wOSkiIGZpbGw9IiM5RTlFOUUiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8ZyBpZD0icGF0aCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbDsiIGZpZ21hOnR5cGU9Imdyb3VwIj4KPGcgaWQ9InBhdGgyMCBmaWxsIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6bm9ybWFsOyIgZmlnbWE6dHlwZT0idmVjdG9yIj4KPHVzZSB4bGluazpocmVmPSIjcGF0aDExX2ZpbGwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2NDEuODcgMjQ1OC40MykiIGZpbGw9IiM2MTYyNjIiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpub3JtYWw7Ii8+CjwvZz4KPC9nPgo8L2c+CjwvZz4KPC9nPgo8L2c+CjxkZWZzPgo8cGF0aCBpZD0icGF0aDBfZmlsbCIgZD0iTSAxLjc0NDk4IDUuNDc1MzNDIDEuNzQ0OTggNy4wMzMzNSAxLjYyMDM0IDcuNTQwODIgMS4yOTk4MyA3LjkxNDc0QyAwLjk0MzExOSA4LjIzNTk1IDAuNDgwMDI0IDguNDEzNTggMCA4LjQxMzMxTCAwLjEyNDY0MiA5LjMwMzZDIDAuODY4ODQgOS4zMTM2NiAxLjU5MDk1IDkuMDUwNzggMi4xNTQ1MiA4LjU2NDY2QyAyLjQ1Nzc1IDguMTk0ODcgMi42ODM0IDcuNzY3ODEgMi44MTggNy4zMDg5M0MgMi45NTI2MSA2Ljg1MDA1IDIuOTkzNDEgNi4zNjg3NiAyLjkzNzk4IDUuODkzNzdMIDIuOTM3OTggMEwgMS43NDQ5OCAwTCAxLjc0NDk4IDUuNDM5NzJMIDEuNzQ0OTggNS40NzUzM1oiLz4KPHBhdGggaWQ9InBhdGgxX2ZpbGwiIGQ9Ik0gNS41MDIwNCA0Ljc2MzA5QyA1LjUwMjA0IDUuNDMwODEgNS41MDIwNCA2LjAyNzMxIDUuNTU1NDUgNi41NDM2OEwgNC40OTYgNi41NDM2OEwgNC40MjQ3OCA1LjQ4NDIzQyA0LjIwMzE4IDUuODU5MDkgMy44ODYyNyA2LjE2ODU4IDMuNTA2MjggNi4zODEyNUMgMy4xMjYyOCA2LjU5MzkyIDIuNjk2NzUgNi43MDIxOSAyLjI2MTM1IDYuNjk1MDNDIDEuMjI4NjEgNi42OTUwMyAwIDYuMTM0MTUgMCAzLjg0NjA4TCAwIDAuMDQ0NTE0OUwgMS4xOTMgMC4wNDQ1MTQ5TCAxLjE5MyAzLjYwNTdDIDEuMTkzIDQuODQzMjIgMS41NzU4MyA1LjY3MTE5IDIuNjUzMDkgNS42NzExOUMgMi44NzQ3MiA1LjY3MzU4IDMuMDk0NTkgNS42MzE2OCAzLjI5OTgyIDUuNTQ3OTZDIDMuNTA1MDUgNS40NjQyNCAzLjY5MTQ5IDUuMzQwMzkgMy44NDgyMiA1LjE4MzY2QyA0LjAwNDk0IDUuMDI2OTQgNC4xMjg4IDQuODQwNDkgNC4yMTI1MiA0LjYzNTI3QyA0LjI5NjIzIDQuNDMwMDQgNC4zMzgxMyA0LjIxMDE2IDQuMzM1NzUgMy45ODg1M0wgNC4zMzU3NSAwTCA1LjUyODc0IDBMIDUuNTI4NzQgNC43Mjc0OEwgNS41MDIwNCA0Ljc2MzA5WiIvPgo8cGF0aCBpZD0icGF0aDJfZmlsbCIgZD0iTSAwLjA1MzQxNzggMi4yNzI2NEMgMC4wNTM0MTc4IDEuNDQ0NjYgMC4wNTM0MTc4IDAuNzY4MDM2IDAgMC4xNTM3MzFMIDEuMDY4MzYgMC4xNTM3MzFMIDEuMTIxNzcgMS4yNjY2QyAxLjM1OTggMC44NjQ1MzUgMS43MDI0NyAwLjUzNDU5NCAyLjExMzI1IDAuMzExOTU0QyAyLjUyNDA0IDAuMDg5MzE0NSAyLjk4NzU0IC0wLjAxNzY3ODYgMy40NTQzNSAwLjAwMjM4MDk1QyA1LjAzOTA4IDAuMDAyMzgwOTUgNi4yMzIwOCAxLjMyODkyIDYuMjMyMDggMy4zMDUzOEMgNi4yMzIwOCA1LjYzNzk2IDQuNzk4NyA2Ljc5NTM1IDMuMjQ5NTggNi43OTUzNUMgMi44NTMwOSA2LjgxMzA0IDIuNDU4NzQgNi43MjgxIDIuMTA0NjkgNi41NDg3NEMgMS43NTA2NCA2LjM2OTM3IDEuNDQ4ODggNi4xMDE2NiAxLjIyODYxIDUuNzcxNTFMIDEuMjI4NjEgNS43NzE1MUwgMS4yMjg2MSA5LjMzMjY5TCAwLjA1MzQxNzggOS4zMzI2OUwgMC4wNTM0MTc4IDIuMjk5MzVMIDAuMDUzNDE3OCAyLjI3MjY0Wk0gMS4yMjg2MSA0LjAwODcyQyAxLjIzMTg0IDQuMTcwMjYgMS4yNDk3MiA0LjMzMTE3IDEuMjgyMDMgNC40ODk0OEMgMS4zODMwNCA0Ljg4NDc5IDEuNjEyOTkgNS4yMzUxMyAxLjkzNTQ4IDUuNDg1MDZDIDIuMjU3OTggNS43MzUgMi42NTQ2MSA1Ljg3MDI2IDMuMDYyNjIgNS44Njk0NEMgNC4zMTc5NCA1Ljg2OTQ0IDUuMDU2ODkgNC44NDU2IDUuMDU2ODkgMy4zNTg4QyA1LjA1Njg5IDIuMDU4OTcgNC4zNjI0NiAwLjk0NjA5NiAzLjEwNzE0IDAuOTQ2MDk2QyAyLjYxMDM2IDAuOTg2Nzc3IDIuMTQ1NDggMS4yMDcyNiAxLjc5OTY1IDEuNTY2MkMgMS40NTM4MiAxLjkyNTE0IDEuMjUwNzkgMi4zOTc5IDEuMjI4NjEgMi44OTU4NUwgMS4yMjg2MSA0LjAwODcyWiIvPgo8cGF0aCBpZD0icGF0aDNfZmlsbCIgZD0iTSAxLjMxNzY0IDAuMDE3ODA1OUwgMi43NTEwMiAzLjg1NDk5QyAyLjkwMjM3IDQuMjgyMzMgMy4wNjI2MiA0Ljc5ODcgMy4xNjk0NiA1LjE4MTUzQyAzLjI5NDEgNC43ODk4IDMuNDI3NjQgNC4yOTEyMyAzLjU4NzkgMy44MjgyOEwgNC44ODc3MyAwLjAxNzgwNTlMIDYuMTQzMDUgMC4wMTc4MDU5TCA0LjM2MjQ2IDQuNjQ3MzVDIDMuNDcyMTYgNi44NzMwOSAyLjkyOTA4IDguMDIxNTggMi4xMSA4LjcxNjAxQyAxLjY5NzQ1IDkuMDkyODMgMS4xOTQ0OCA5LjM1NjU4IDAuNjQ5OTE3IDkuNDgxNjZMIDAuMzU2MTE5IDguNDg0NTNDIDAuNzM2ODg2IDguMzU5NDIgMS4wOTAzOCA4LjE2MzA0IDEuMzk3NzcgNy45MDU4NEMgMS44MzIxIDcuNTUxODggMi4xNzY3OCA3LjEwMDQ0IDIuNDAzOCA2LjU4ODJDIDIuNDUyMzkgNi40OTk0OSAyLjQ4NTUxIDYuNDAzMTQgMi41MDE3MyA2LjMwMzNDIDIuNDkxNjEgNi4xOTU4NiAyLjQ2NDU3IDYuMDkwNyAyLjQyMTYxIDUuOTkxN0wgMCAwTCAxLjI5OTgzIDBMIDEuMzE3NjQgMC4wMTc4MDU5WiIvPgo8cGF0aCBpZD0icGF0aDRfZmlsbCIgZD0iTSAyLjE5MDEzIDBMIDIuMTkwMTMgMS44Njk2MkwgMy44OTk1IDEuODY5NjJMIDMuODk5NSAyLjc1OTkyTCAyLjE5MDEzIDIuNzU5OTJMIDIuMTkwMTMgNi4yNjc2OUMgMi4xOTAxMyA3LjA2ODk2IDIuNDIxNjEgNy41MzE5MSAzLjA4MDQzIDcuNTMxOTFDIDMuMzE0NDIgNy41MzU3NCAzLjU0Nzg5IDcuNTA4OCAzLjc3NDg2IDcuNDUxNzlMIDMuODI4MjggOC4zNDIwOEMgMy40ODc5NCA4LjQ1OTk5IDMuMTI4ODEgOC41MTQzMSAyLjc2ODgyIDguNTAyMzRDIDIuNTMwNDIgOC41MTcyNiAyLjI5MTYxIDguNDgwNDMgMi4wNjg3OCA4LjM5NDM3QyAxLjg0NTk1IDguMzA4MzEgMS42NDQzOCA4LjE3NTA2IDEuNDc3ODkgOC4wMDM3N0MgMS4xMTUyNSA3LjUxODczIDAuOTQ5ODI2IDYuOTE0MzEgMS4wMTQ5NCA2LjMxMjIxTCAxLjAxNDk0IDIuNzUxMDJMIDAgMi43NTEwMkwgMCAxLjg2MDcyTCAxLjAzMjc0IDEuODYwNzJMIDEuMDMyNzQgMC4yNzU5OTJMIDIuMTkwMTMgMFoiLz4KPHBhdGggaWQ9InBhdGg1X2ZpbGwiIGQ9Ik0gMS4xNzcxNiAzLjU3ODk5QyAxLjE1MyAzLjg4MDkzIDEuMTk0NjggNC4xODQ1MSAxLjI5OTMzIDQuNDY4NzZDIDEuNDAzOTggNC43NTMwMSAxLjU2OTEgNS4wMTExNCAxLjc4MzI5IDUuMjI1MzJDIDEuOTk3NDcgNS40Mzk1MSAyLjI1NTYgNS42MDQ2MyAyLjUzOTg1IDUuNzA5MjhDIDIuODI0MSA1LjgxMzkzIDMuMTI3NjggNS44NTU2MSAzLjQyOTYyIDUuODMxNDVDIDQuMDQwMzMgNS44NDUxMSA0LjY0NzA2IDUuNzI5ODMgNS4yMTAyMSA1LjQ5MzEzTCA1LjQxNDk4IDYuMzgzNDNDIDQuNzIzOTMgNi42NjgwOSAzLjk4MDg1IDYuODA0NTggMy4yMzM3NSA2Ljc4NDA2QyAyLjc5ODIxIDYuODEzODggMi4zNjEzOCA2Ljc0OTE0IDEuOTUzMjIgNi41OTQyN0MgMS41NDUwNSA2LjQzOTQxIDEuMTc1MjIgNi4xOTgwOSAwLjg2OTA3MSA1Ljg4Njg4QyAwLjU2MjkyOCA1LjU3NTY2IDAuMzI3NzIzIDUuMjAxOSAwLjE3OTU5MSA0Ljc5MTI1QyAwLjAzMTQ1ODQgNC4zODA1OSAtMC4wMjYwOTYyIDMuOTQyNzYgMC4wMTA4NzQ4IDMuNTA3NzdDIDAuMDEwODc0OCAxLjU0OTEyIDEuMTc3MTYgMCAzLjA4MjQgMEMgNS4yMTkxMSAwIDUuNzUzMjkgMS44Njk2MiA1Ljc1MzI5IDMuMDYyNjJDIDUuNzY0NzEgMy4yNDY0NCA1Ljc2NDcxIDMuNDMwNzkgNS43NTMyOSAzLjYxNDYxTCAxLjE1MDQ2IDMuNjE0NjFMIDEuMTc3MTYgMy41Nzg5OVpNIDQuNjY3MTMgMi42ODg3QyA0LjcwMTQ5IDIuNDUwNjcgNC42ODQ0MyAyLjIwODA1IDQuNjE3MDkgMS45NzcxOEMgNC41NDk3NiAxLjc0NjMxIDQuNDMzNzIgMS41MzI1NSA0LjI3NjggMS4zNTAzMUMgNC4xMTk4NyAxLjE2ODA4IDMuOTI1NzEgMS4wMjE2IDMuNzA3MzkgMC45MjA3NDRDIDMuNDg5MDcgMC44MTk4OSAzLjI1MTY2IDAuNzY3MDA2IDMuMDExMTggMC43NjU2NTZDIDIuNTIyMDEgMC44MDEwNjQgMi4wNjM3MSAxLjAxNzg4IDEuNzI2MDkgMS4zNzM2MkMgMS4zODg0NyAxLjcyOTM1IDEuMTk1ODggMi4xOTgzNSAxLjE4NjA3IDIuNjg4N0wgNC42NjcxMyAyLjY4ODdaIi8+CjxwYXRoIGlkPSJwYXRoNl9maWxsIiBkPSJNIDAuMDUzNDE3OCAyLjE5MjI4QyAwLjA1MzQxNzggMS40MjY2MyAwLjA1MzQxNzggMC43Njc4MDYgMCAwLjE2MjQwNEwgMS4wNjgzNiAwLjE2MjQwNEwgMS4wNjgzNiAxLjQzNTUzTCAxLjEyMTc3IDEuNDM1NTNDIDEuMjMzOTEgMS4wNDI1OSAxLjQ2NTYgMC42OTQzMTQgMS43ODQ2OCAwLjQzOTA0OUMgMi4xMDM3NiAwLjE4Mzc4MyAyLjQ5NDQgMC4wMzQxOTYgMi45MDIzNyAwLjAxMTA1MzhDIDMuMDE0NjYgLTAuMDAzNjg0NTkgMy4xMjgzOSAtMC4wMDM2ODQ1OSAzLjI0MDY4IDAuMDExMDUzOEwgMy4yNDA2OCAxLjEyMzkzQyAzLjEwNDYyIDEuMTA4MTcgMi45NjcyIDEuMTA4MTcgMi44MzExNCAxLjEyMzkzQyAyLjQyNyAxLjEzOTU4IDIuMDQyMzcgMS4zMDE4MiAxLjc0OTEgMS41ODAzNUMgMS40NTU4MyAxLjg1ODg3IDEuMjczOTggMi4yMzQ2MiAxLjIzNzUxIDIuNjM3NDNDIDEuMjA0MjIgMi44MTk2IDEuMTg2MzUgMy4wMDQyNSAxLjE4NDEgMy4xODk0MUwgMS4xODQxIDYuNjUyNjdMIDAuMDA4OTAyOTcgNi42NTI2N0wgMC4wMDg5MDI5NyAyLjIwMTE4TCAwLjA1MzQxNzggMi4xOTIyOFoiLz4KPHBhdGggaWQ9InBhdGg3X2ZpbGwiIGQ9Ik0gNi4wMzA1OSAyLjgzNTY1QyA2LjA2NzE1IDMuNDMzNzYgNS45MjQ4NSA0LjAyOTIxIDUuNjIxOCA0LjU0NjE1QyA1LjMxODc1IDUuMDYzMSA0Ljg2ODY5IDUuNDc4MTMgNC4zMjg5MyA1LjczODM5QyAzLjc4OTE3IDUuOTk4NjQgMy4xODQxNiA2LjA5MjMzIDIuNTkwOTcgNi4wMDc1M0MgMS45OTc3OCA1LjkyMjcyIDEuNDQzMjYgNS42NjMyNiAwLjk5ODA0OCA1LjI2MjE5QyAwLjU1MjgzNyA0Ljg2MTEzIDAuMjM3MDkgNC4zMzY2MSAwLjA5MTAzMDcgMy43NTU0NkMgLTAuMDU1MDI4NyAzLjE3NDMxIC0wLjAyNDc4OTEgMi41NjI4MyAwLjE3Nzg5NyAxLjk5ODkzQyAwLjM4MDU4MyAxLjQzNTAzIDAuNzQ2NTQxIDAuOTQ0MjIxIDEuMjI5MTUgMC41ODkwMzdDIDEuNzExNzYgMC4yMzM4NTMgMi4yODkxOCAwLjAzMDM2ODYgMi44ODc4NCAwLjAwNDUwNTQzQyAzLjI4MDM1IC0wLjAxNzA5MzIgMy42NzMyNiAwLjAzOTExNDQgNC4wNDM5NiAwLjE2OTg5NkMgNC40MTQ2NyAwLjMwMDY3NyA0Ljc1NTg3IDAuNTAzNDUzIDUuMDQ3OTQgMC43NjY1NjFDIDUuMzQgMS4wMjk2NyA1LjU3NzE4IDEuMzQ3OTIgNS43NDU4MiAxLjcwMzAxQyA1LjkxNDQ2IDIuMDU4MSA2LjAxMTI0IDIuNDQzMDMgNi4wMzA1OSAyLjgzNTY1TCA2LjAzMDU5IDIuODM1NjVaIi8+CjxwYXRoIGlkPSJwYXRoOF9maWxsIiBkPSJNIDE4LjY5NjIgNy4xMjIzOEMgMTAuNjgzNiA3LjEyMjM4IDMuNjQxMzEgNC4yNDY3MiAwIDBDIDEuNDEyODQgMy44MjA0MSAzLjk2MjE1IDcuMTE2MyA3LjMwNDc5IDkuNDQ0MDRDIDEwLjY0NzQgMTEuNzcxOCAxNC42MjMgMTMuMDE5NiAxOC42OTYyIDEzLjAxOTZDIDIyLjc2OTUgMTMuMDE5NiAyNi43NDUgMTEuNzcxOCAzMC4wODc3IDkuNDQ0MDRDIDMzLjQzMDMgNy4xMTYzIDM1Ljk3OTYgMy44MjA0MSAzNy4zOTI1IDQuMDQ4NmUtMTNDIDMzLjc2MDEgNC4yNDY3MiAyNi43NDQ1IDcuMTIyMzggMTguNjk2MiA3LjEyMjM4WiIvPgo8cGF0aCBpZD0icGF0aDlfZmlsbCIgZD0iTSAxOC42OTYyIDUuODk3MjVDIDI2LjcwODkgNS44OTcyNSAzMy43NTEyIDguNzcyOTEgMzcuMzkyNSAxMy4wMTk2QyAzNS45Nzk2IDkuMTk5MjIgMzMuNDMwMyA1LjkwMzMzIDMwLjA4NzcgMy41NzU1OUMgMjYuNzQ1IDEuMjQ3ODUgMjIuNzY5NSA0LjA0ODZlLTEzIDE4LjY5NjIgMEMgMTQuNjIzIDQuMDQ4NmUtMTMgMTAuNjQ3NCAxLjI0Nzg1IDcuMzA0NzkgMy41NzU1OUMgMy45NjIxNSA1LjkwMzMzIDEuNDEyODQgOS4xOTkyMiAwIDEzLjAxOTZDIDMuNjQxMzEgOC43NjQwMSAxMC42NDggNS44OTcyNSAxOC42OTYyIDUuODk3MjVaIi8+CjxwYXRoIGlkPSJwYXRoMTBfZmlsbCIgZD0iTSA3LjU5NTc2IDMuNTY2NTZDIDcuNjQyNzYgNC4zMTk5MiA3LjQ2NDQyIDUuMDcwMjIgNy4wODM0NyA1LjcyMTg2QyA2LjcwMjUxIDYuMzczNSA2LjEzNjE5IDYuODk2OTggNS40NTY2NiA3LjIyNTYxQyA0Ljc3NzEzIDcuNTU0MjQgNC4wMTUxNSA3LjY3MzE0IDMuMjY3ODEgNy41NjcxNkMgMi41MjA0NiA3LjQ2MTE3IDEuODIxNTggNy4xMzUxMSAxLjI2MDIxIDYuNjMwNTFDIDAuNjk4ODM5IDYuMTI1OTEgMC4zMDAzOTQgNS40NjU2MSAwLjExNTYzNyA0LjczMzc1QyAtMC4wNjkxMTkxIDQuMDAxODggLTAuMDMxODIxOSAzLjIzMTU5IDAuMjIyNzc3IDIuNTIwOTlDIDAuNDc3Mzc2IDEuODEwNCAwLjkzNzc1IDEuMTkxNjkgMS41NDUyNCAwLjc0MzY4NUMgMi4xNTI3NCAwLjI5NTY3OCAyLjg3OTg1IDAuMDM4NjU5NSAzLjYzMzk0IDAuMDA1Mzc1ODlDIDQuMTI3OTMgLTAuMDIxMDQ3MSA0LjYyMjI5IDAuMDUwMTE3MyA1LjA4ODc4IDAuMjE0ODAzQyA1LjU1NTI2IDAuMzc5NDkgNS45ODQ3MyAwLjYzNDQ3IDYuMzUyNjQgMC45NjUxNzlDIDYuNzIwNTUgMS4yOTU4OSA3LjAxOTcxIDEuNjk1ODQgNy4yMzMgMi4xNDIyQyA3LjQ0NjMgMi41ODg1NSA3LjU2OTU3IDMuMDcyNTYgNy41OTU3NiAzLjU2NjU2TCA3LjU5NTc2IDMuNTY2NTZaIi8+CjxwYXRoIGlkPSJwYXRoMTFfZmlsbCIgZD0iTSAyLjI1MDYxIDQuMzc5NDNDIDEuODE4ODYgNC4zOTEzNSAxLjM5MzIyIDQuMjc1MzUgMS4wMjcyMiA0LjA0NjAyQyAwLjY2MTIyNCAzLjgxNjY4IDAuMzcxMjA2IDMuNDg0MjQgMC4xOTM2NDEgMy4wOTA1MkMgMC4wMTYwNzYyIDIuNjk2NzkgLTAuMDQxMTA3OCAyLjI1OTM1IDAuMDI5MjgwNCAxLjgzMzIxQyAwLjA5OTY2ODYgMS40MDcwNyAwLjI5NDQ4NiAxLjAxMTI1IDAuNTg5MjMzIDAuNjk1NTQyQyAwLjg4Mzk4MSAwLjM3OTgzIDEuMjY1NSAwLjE1ODMxNiAxLjY4NTgxIDAuMDU4ODU3N0MgMi4xMDYxMSAtMC4wNDA2MDA1IDIuNTQ2NDQgLTAuMDEzNTYyMiAyLjk1MTQzIDAuMTM2NTcyQyAzLjM1NjQxIDAuMjg2NzA3IDMuNzA3OTYgMC41NTMyMzQgMy45NjE4NiAwLjkwMjYzNkMgNC4yMTU3NyAxLjI1MjA0IDQuMzYwNyAxLjY2ODcyIDQuMzc4NDIgMi4xMDAyN0MgNC4zOTUyOSAyLjY4MzggNC4xODEzMSAzLjI1MDQ0IDMuNzgyOTMgMy42NzcxNUMgMy4zODQ1NSA0LjEwMzg3IDIuODMzOTIgNC4zNTYyMyAyLjI1MDYxIDQuMzc5NDNaIi8+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"jupyternvidia,jupyter\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.jupyternvidia\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.nvidia.22.04\"\nENV ARGS=\"--disable-factory  --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"\nLABEL oc.name=\"jupyternvidia\"\nLABEL oc.displayname=\"jupyter nvidia\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"jupyternvidia\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory  --class=jupyternvidia -- /usr/local/bin/startjupyter.sh\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nCOPY startjupyter.sh /usr/local/bin/startjupyter.sh\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/jupyternvidia/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/jupyternvidia/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application jupyternvidia

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/jupyternvidia.d\n
"},{"location":"applications/jupyternvidia/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f jupyternvidia.d -t jupyternvidia .\n
"},{"location":"applications/jupyternvidia/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect jupyternvidia > jupyternvidia.json\ndocker image save jupyternvidia -o jupyternvidia.tar\nctr -n k8s.io images import jupyternvidia.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @jupyternvidia.json\n\n
"},{"location":"applications/kalzium/","title":"Kalzium","text":""},{"location":"applications/kalzium/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/kalzium/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kalzium/#alpine-packages","title":"Alpine packages","text":"
kalzium\n
"},{"location":"applications/kalzium/#path","title":"Path","text":"
/usr/bin/kalzium\n
"},{"location":"applications/kalzium/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/kalzium/#wm_class","title":"WM_CLASS","text":"
kalzium.kalzium\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/kalzium/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.kde.kalzium.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/kalzium/#json-dump","title":"JSON dump","text":"

json source file kalzium.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"kalzium\",\n    \"icon\": \"kalzium.svg\",\n    \"keyword\": \"kalzium\",\n    \"launch\": \"kalzium.kalzium\",\n    \"name\": \"Kalzium\",\n    \"path\": \"/usr/bin/kalzium\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.kalzium.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/kalzium/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output kalzium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kalzium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kalzium.d.3.0.json\n\n
"},{"location":"applications/kalzium/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kalzium\nLABEL oc.icon=\"kalzium.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiCiAgIHdpZHRoPSIxMjgiCiAgIGhlaWdodD0iMTI4IgogICBpZD0ic3ZnMjQyNSIKICAgdmlld0JveD0iMCAwIDEyOCAxMjgiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnMyNDI4Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTk4NjEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMTk4NjMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNTAxOTYwODEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxOTg2NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE1MDAyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzQzYmFmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDE1MDA0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjk4NGZmO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAuNTE4NTE4NTEiCiAgICAgICAgIGlkPSJzdG9wMjU3MDEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwZjRmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxNTAwNiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDEzMDU0Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEzMDU2IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojM2MzYzNjO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMTMwNTgiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjA3MyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxMjA3NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzQ1NDU0NTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDEyMDc3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTAxMjUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzgzODM4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMTAxMjciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwZjBmMGY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMDEyOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyMDAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYWVhZWFlO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNzIwMiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJmMmYyZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjkyNTkyNTkxIgogICAgICAgICBpZD0ic3RvcDcyMDQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2MTYxNjE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A3MjA2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzE4NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A3MTg3IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmJmYmZiO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuMTUwMDAwMDEiCiAgICAgICAgIGlkPSJzdG9wNzE4OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2U5ZTllOTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjQ0OTk5OTk5IgogICAgICAgICBpZD0ic3RvcDcxOTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjOGM4Yzg7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC42NDk5OTk5OCIKICAgICAgICAgaWQ9InN0b3A3MTkzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojODA4MDgwO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNzE5NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTI5MjkyO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNjIxMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzRkNGQ0ZDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjY4NTE4NTE5IgogICAgICAgICBpZD0ic3RvcDYyMTIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MjE0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE4NiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjY2RhZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MTg4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTg4NWZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzIwNTYwOTciCiAgICAgICAgIGlkPSJzdG9wNTE5MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMGViMTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDUxOTIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTc0Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDUxNzYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmYmZiZmI7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4xOTgwNDUyNSIKICAgICAgICAgaWQ9InN0b3A1MTc4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZDdlNWZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNDQiCiAgICAgICAgIGlkPSJzdG9wNTE4MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izk3YzZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjY5ODA0NTI1IgogICAgICAgICBpZD0ic3RvcDUxODIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2Mzk2ZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A1MTg0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE2NiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4OWMxZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MTY4IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTM4MmZmO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNTcyNjI1OTQiCiAgICAgICAgIGlkPSJzdG9wNTE3MCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzA4MDBkYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDUxNzIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MzM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDQzNDAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZhZjU7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC4yIgogICAgICAgICBpZD0ic3RvcDkwNjIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmM4YmQ7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC41IgogICAgICAgICBpZD0ic3RvcDQzNDgiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZjc0NjM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMC44MDAwMDAwMSIKICAgICAgICAgaWQ9InN0b3A5MDY5IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmYyMTA5O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNDM0MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM0MzIiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZhNWExO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzQzNCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ExMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjk0NDQ0NDQyIgogICAgICAgICBpZD0ic3RvcDM0MzYiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMTAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzNDM4IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzAyMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmNTZmNmE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AzMDIzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmYxNzE2O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNTcyNjI1OTQiCiAgICAgICAgIGlkPSJzdG9wMzAzMSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzZjMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDMwMjUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExNi43NTkyMiIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE2Ljc1OTIyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MzAyNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDMwMjEiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS41NDk3MzA2LDAsMCwxLjU0OTQ5NDgsLTUyLjI4OTAzMSwtNjQuMTU4NTcxKSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iOTUuMTQ3NDM4IgogICAgICAgeTE9IjEyMS43ODY4IgogICAgICAgeDI9Ijk1LjE0NzQzOCIKICAgICAgIHkyPSI3MC4wMzc3MjciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNDE4IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzAyMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExOC4zMTY5NSIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE4LjMxNjk1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MzQzMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM0MzIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi41NzM2OTIiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMyLjU3MzY5MiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDYyOTgiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0MzM4IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoODI0MCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODI5ODYwNSwwLDAsMC45NjEwOTI2LDE1LjQ0MDE0NywtMzkuMjg5NjUpIgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgaWQ9InBhdGg4MjQyIiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTYuNzU5MjIiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExNi43NTkyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDkyMTkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzMDIxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNzQxNDM2NiwwLDAsMS42NTQ4NTI5LC03MC41MjM2MzMsLTc2LjQ2MDExNikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi4yNDcwNyIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzAuMzAxMDE0IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50OTIyMSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNTY4MzI1LC0xLjk2MzU5MzllLTcsMS41OTk4MTE3ZS03LDEuMjY0MTc3NCwtMTQuODAwOTg1LC03LjU0MDkwOTkpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjIyNSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxNzQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjI0NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NzE5NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iODUuNzg4OTc5IgogICAgICAgeTE9IjU4LjA0MjQzNSIKICAgICAgIHgyPSIxMDEuMDgxNTUiCiAgICAgICB5Mj0iNTcuNTg0NjM3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTAxMzEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMDEyNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iNTcuMTg0MTEzIgogICAgICAgeTE9IjkzLjIwMDI0OSIKICAgICAgIHgyPSI2My4xNzU5NjEiCiAgICAgICB5Mj0iODAuMDE1NzAxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTIwNzkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjA3MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iNDIuMjEyNjAxIgogICAgICAgeTE9IjI3LjI0NzE3MSIKICAgICAgIHgyPSI2NS4wNDM4ODQiCiAgICAgICB5Mj0iNTEuNTY1NDc5IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTMwNjAiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMzA1NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTIuMjczMDE4IgogICAgICAgY3k9IjQzLjE5MjY0NiIKICAgICAgIHI9IjguNDIzNjc3NCIKICAgICAgIGZ4PSI5Mi4yNzMwMTgiCiAgICAgICBmeT0iNDMuMTkyNjQ2IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTUwMDgiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxNTAwMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE5ODkzMjIsLTAuMzYxOTI5MSwwLjIxOTI2OTQsMC43MjYzNTUsLTI3LjU1NzA3Niw0NS45NDM2NTIpIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjE3OTE3Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjE3OTE5IgogICAgICAgICBzdGREZXZpYXRpb249IjAuMzk0ODkwMDUiCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDwvZmlsdGVyPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNDAuMjgzNDI0IgogICAgICAgY3k9IjgwLjcwOTgwOCIKICAgICAgIHI9IjguMTA5Nzg3OSIKICAgICAgIGZ4PSI0MC4yODM0MjQiCiAgICAgICBmeT0iODAuNzA5ODA4IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTk4NjciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxOTg2MSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMS40NzEzODEzLC0xLjMyNDgzNzQsMS40MDQzNTMzLC0xLjU1OTY5MjMsLTExLjgzMjE4NSwyNTIuMjI2MikiIC8+CiAgICA8ZmlsdGVyCiAgICAgICBpZD0iZmlsdGVyMjE4MDciPgogICAgICA8ZmVHYXVzc2lhbkJsdXIKICAgICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyMjE4MDkiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC4zOTE4ODQyNCIKICAgICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPC9maWx0ZXI+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI2Ni4wMDQ5NzQiCiAgICAgICBjeT0iMzkuNDI0NTE1IgogICAgICAgcj0iNy4yNjg5NTc2IgogICAgICAgZng9IjY2LjAwNDk3NCIKICAgICAgIGZ5PSIzOS40MjQ1MTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNDcyNiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE1MDAyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzkwNjQ1MywtMS4wOTEyMjkxLDEuNjE2NjQ0MywwLjU3ODczNjUsLTIxLjM2NjE0OCw4OC45NzE3MDkpIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjI1Njk3Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjI1Njk5IgogICAgICAgICBzdGREZXZpYXRpb249IjAuMzc1NDAzMzUiCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDwvZmlsdGVyPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjcwNDkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMi41NzM2OTIiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMyLjU3MzY5MiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI3MDYwIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NjgyMzMsMCwwLDEuMDU2MzkxOCwtMTUuNzQzODYsLTAuNzk4NTY2NykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzIuNTczNjkyIgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMi41NzM2OTIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNzA3MSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xNjY4MjMzLDAsMCwxLjA1NjM5MTgsLTE1Ljc0Mzg2LC0wLjc5ODU2NjcpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMyLjU3MzY5MiIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzIuNTczNjkyIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MjcwOTIiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTc0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTY2ODIzMywwLDAsMS4wNTYzOTE4LC0xNS43NDM4NiwtMC43OTg1NjY3KSIgLz4KICAgIDxmaWx0ZXIKICAgICAgIGlkPSJmaWx0ZXI5MDY0Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjkwNjYiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC40NDYyOTY5MyIKICAgICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPC9maWx0ZXI+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MDcxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzIuNTczNjkyIgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMi41NzM2OTIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MDgzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE3NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjE2NjgyMzMsMCwwLDEuMDU2MzkxOCwtMTUuNzQzODYsLTAuNzk4NTY2NykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ5MTAxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDMzOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE2Ljc1OTIyIgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTYuNzU5MjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA2NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxNjYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTU3MTYsMCwwLDEuODIwNDY3MiwtODcuMTAwNjY5LC05NS43OTcxMTYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA2NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUxODYiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk0LjM3NDQ1OCIKICAgICAgIGN5PSIzMC45Mzc4NzQiCiAgICAgICByPSIxOC4zOTE4NzIiCiAgICAgICBmeD0iOTQuMzc0NDU4IgogICAgICAgZnk9IjMzLjQ1ODA5OSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDExMDY5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE3NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjExMTQyMDIsNC42OTQ0NDI1ZS04LC0zLjYyNTk4NzFlLTgsMS4xNTE0Mzg4LC0xMC41MTUyMjEsLTMuOTQ1NjU2NCkiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA4MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTYuNzU5MjIiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExNi43NTkyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDExMDg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjIwOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjc3MzE3OTYsMCwwLDEuNjg1MDE3NiwtNzMuNTQyOTQ3LC03OS45ODIxMjYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMTA4NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQzMzgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4xMTE0MjAyLDQuNjk0NDQyNWUtOCwtMy42MjU5ODcxZS04LDEuMTUxNDM4OCwtMTAuNTE1MjIxLC0zLjk0NTY1NjQpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTQuMzc0NDU4IgogICAgICAgY3k9IjMwLjkzNzg3NCIKICAgICAgIHI9IjE4LjM5MTg3MiIKICAgICAgIGZ4PSI5NC4zNzQ0NTgiCiAgICAgICBmeT0iMzMuNDU4MDk5IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTIwNzAiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MTg1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDY2MDA3OSwwLDAsMS4xMDQzOTE0LC02LjIyOTQ2NDUsLTIuNDkwMTA1MikiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NC4zNzQ0NTgiCiAgICAgICBjeT0iMzAuOTM3ODc0IgogICAgICAgcj0iMTguMzkxODcyIgogICAgICAgZng9Ijk0LjM3NDQ1OCIKICAgICAgIGZ5PSIzMy40NTgwOTkiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODMwMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxODUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMDczOTY2LDAsMCwxLjA0MzY2OTcsLTAuNjk4MDUzNSwtMC42MTE1MDQ0KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTguMzE2OTUiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExOC4zMTY5NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE4NTY3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE4NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjYwMjE5NjYsLTIuNzk2NjQ0NWUtMiwyLjc5NjIxOWUtMiwxLjYwMTk1MjgsLTYwLjU4Nzg3MiwtNjcuNzA1MTQ2KSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iOTUuMTE3NTYxIgogICAgICAgY3k9IjExOC4zMTY5NSIKICAgICAgIHI9IjI2Ljc1MTgxNCIKICAgICAgIGZ4PSI5NS4xMTc1NjEiCiAgICAgICBmeT0iMTE4LjMxNjk1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTg1NzIiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNDMyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNjAyMTk2NiwtMi43OTY2NDQ1ZS0yLDIuNzk2MjE5ZS0yLDEuNjAxOTUyOCwtNjAuNTg3ODcyLC02Ny43MDUxNDYpIgogICAgICAgc3ByZWFkTWV0aG9kPSJwYWQiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI5NS4xMTc1NjEiCiAgICAgICBjeT0iMTE4LjMxNjk1IgogICAgICAgcj0iMjYuNzUxODE0IgogICAgICAgZng9Ijk1LjExNzU2MSIKICAgICAgIGZ5PSIxMTguMzE2OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxODU3NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS42MDIxOTY2LC0yLjc5NjY0NDVlLTIsMi43OTYyMTllLTIsMS42MDE5NTI4LC02MC41ODc4NzIsLTY3LjcwNTE0NikiCiAgICAgICBzcHJlYWRNZXRob2Q9InBhZCIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9Ijk1LjExNzU2MSIKICAgICAgIGN5PSIxMTguMzE2OTUiCiAgICAgICByPSIyNi43NTE4MTQiCiAgICAgICBmeD0iOTUuMTE3NTYxIgogICAgICAgZnk9IjExOC4zMTY5NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDE4NTc5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTE4NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjY0OTYxNDksLTIuODc5NDEzNGUtMiwyLjg3ODk3NTNlLTIsMS42NDkzNjM5LC03My45MzkyMSwtMTM2LjY0MzY3KSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPGZpbHRlcgogICAgICAgaWQ9ImZpbHRlcjE5NTUxIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjE5NTUzIgogICAgICAgICBzdGREZXZpYXRpb249IjAuNTg2ODc1IgogICAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgPGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaWQ9ImxheWVyMiI+CiAgICA8ZwogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgaWQ9ImxheWVyOSI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02LjgxODI4OTIsLTYxLjM2NzY0NSkiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODM5OSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBkPSJNIDg2LjM3NSw1LjE4NzUgQyA3MS4xNzA5NTgsNS4xODc1IDU4Ljg0Mzc1LDE3LjUxNDcwOSA1OC44NDM3NSwzMi43MTg3NSBDIDU4Ljg0Mzc1LDM0LjQwMjU5NyA1OC45OTE0MTksMzYuMDU1NTQ0IDU5LjI4MTI1LDM3LjY1NjI1IEMgNTUuMDAyMzk3LDQxLjQ3NzQ3MiA1Mi4yNjQ3ODUsNDMuOTIyMjkxIDQ3LjU5Mzc1LDQ4LjA5Mzc1IEMgNDMuMjQ0NzU5LDQ1LjIzMjgwMiAzOC4wNTk5MTQsNDMuNTYyNSAzMi40Njg3NSw0My41NjI1IEMgMTcuMjMxMDI3LDQzLjU2MjUgNC44NDM3NDk5LDU1LjkxODUzIDQuODQzNzUsNzEuMTU2MjUgQyA0Ljg0Mzc1LDg2LjM5Mzk3MSAxNy4yMzEwMjYsOTguNzgxMjUxIDMyLjQ2ODc1LDk4Ljc4MTI1IEMgMzkuOTY2NDQ2LDk4Ljc4MTI1IDQ2Ljc0MjQ1Nyw5NS43NjMzMDMgNTEuNzE4NzUsOTAuOTA2MjUgQyA1OC41MzU4NDEsOTMuNjU1MDc3IDYwLjg3NTk5LDk0LjYxNzg0IDY3LjA5Mzc1LDk3LjEyNSBDIDY4LjA5OTE5NCwxMTEuNDEyNDQgODAuMDIwNTc1LDEyMi42ODc1IDk0LjU2MjUsMTIyLjY4NzUgQyAxMDkuNzYyODUsMTIyLjY4NzUgMTIyLjA5Mzc1LDExMC4zNTY0NiAxMjIuMDkzNzUsOTUuMTU2MjUgQyAxMjIuMDkzNzUsODIuMDc3ODUgMTEyLjk1MDUzLDcxLjE0ODI2OSAxMDAuNzE4NzUsNjguMzQzNzUgQyAxMDAuNTQ3Myw2My43MDk3NyAxMDAuNDkyNTYsNjIuMjExNTIxIDEwMC4yODEyNSw1Ni41IEMgMTA4LjQzNzk5LDUxLjcxNjU0NiAxMTMuOTA2MjUsNDIuODUxNTQgMTEzLjkwNjI1LDMyLjcxODc1IEMgMTEzLjkwNjI1LDE3LjUxNDcwOCAxMDEuNTc5MDQsNS4xODc1IDg2LjM3NSw1LjE4NzUgeiBNIDY1LjU5Mzc1LDUwLjgxMjUgQyA3MC42MDYwNTEsNTYuNTY5OTM2IDc3Ljk3MzI4NCw2MC4xOTQ0NzMgODYuMTg3NSw2MC4yNSBDIDg2LjI2OTI0MSw2NC41NTU4NjEgODYuMjc4NzMsNjUuNDQ5OTI1IDg2LjM0Mzc1LDY4Ljg3NSBDIDc5LjE4NzUyNSw3MS4xMTA4NDggNzMuMjk2NjQsNzYuMTgzMzA0IDY5Ljk2ODc1LDgyLjc4MTI1IEMgNjUuMTc2MTgsODAuODkxMjIyIDY0LjI2OTI0Miw4MC41NTMzNjMgNTkuMDYyNSw3OC41IEMgNTkuNzA1NTg1LDc2LjE2MzgzNSA2MC4wNjI1LDczLjY5NTg3MSA2MC4wNjI1LDcxLjE1NjI1IEMgNjAuMDYyNSw2Ni43MjE4OTkgNTkuMDE2ODYsNjIuNTI2NTY3IDU3LjE1NjI1LDU4LjgxMjUgQyA2MC4zODExMzYsNTUuNzU0MTE3IDYxLjU4MzgyMiw1NC42MTUzOTQgNjUuNTkzNzUsNTAuODEyNSB6ICIKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4LDYyLjU0OTM1NykiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC41ODgyMzUyOTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjE5NTUxKSIKICAgICAgICAgICBpZD0icGF0aDE4NDAxIiAvPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MS44MTY4ODEsLTI0LjE4MzExOSkiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODQxNSIgLz4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY3Mjg0LDAsMCwxLjAwNjcxOTIsLTAuNDUxODY4LC0wLjgyMzU0NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcxODQzNSIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI1Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgsLTYyLjU0OTM1NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9Imc5MDg1Ij4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA4MzMzLDAsMCwxLjAyMDgzMzMsLTIuNzI0NzIxOSwtMy40NTkxMTk1KSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDY3KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICBpZD0icGF0aDkwODciIC8+CiAgICAgICAgPGcKICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxNTUwMzksMCwwLDEuMDE1NTAzOSwtMS40NjMxNjk5LC0xLjQ3ODI0NjIpIgogICAgICAgICAgIGlkPSJnOTA4OSI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMjEuODY5MzggOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgNjguMzY1NzQ3LDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDEyMS44NjkzOCA5Ni43ODk1NTEgeiIKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODk1ODMzMywwLDAsMC44OTU4MzMzLDkuMTY0OTczNCw4LjYzOTU3NDUpIgogICAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTA2NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTM1MjExMzI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjAuNTAxOTYwNzgiCiAgICAgICAgICAgICBpZD0icGF0aDkwOTEiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMTEuNzY0MDcsMzguNDU1NzM0IEMgMTExLjc2NDA3LDQ1LjgxMjIyMiAxMDYuMzEyMTMsNTEuNzgyNzA0IDk0LjM3NDQ1OCw1MS43ODI3MDQgQyA4Mi42MDM4MzEsNTEuNzgyNzA0IDc2Ljk4NDg0Niw0NS44MTIyMjIgNzYuOTg0ODQ2LDM4LjQ1NTczNCBDIDc2Ljk4NDg0NiwzMS4wOTkyNDcgODQuNzc1MzkyLDI1LjEyODc2NCA5NC4zNzQ0NTgsMjUuMTI4NzY0IEMgMTAzLjk3MzUyLDI1LjEyODc2NCAxMTEuNzY0MDcsMzEuMDk5MjQ3IDExMS43NjQwNywzOC40NTU3MzQgeiAiCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA3OTQ5ODcsMCwwLDAuOTMyMDk4OCwtNy41MDI2NDU2LDQ1LjI2MTQxKSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxMTA2OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDkwOTMiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAxMjEuNjg3NTYgOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDY4LjU0NzU2Miw5Ni43ODk1NTEgQSAyNi41NyAyNi41NyAwIDEgMSAgMTIxLjY4NzU2IDk2Ljc4OTU1MSB6IgogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTkyNDU1LDAsMCwwLjk5MjQ1NSwyLjg5Mzk2NjdlLTIsLTAuODQ1NDgzNCkiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMwMDA5OGY7c3Ryb2tlLXdpZHRoOjIuMjc4MTI5NTg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgICAgaWQ9InBhdGg5MDk1IiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgaWQ9ImxheWVyOCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gNzUuMDQ1NjcyLDMxLjMwNjk2NiBDIDY2LjI1NDAzMywyNS4wMDAxNTEgNjAuMDk5MzkxLDMzLjkxMDE5MiA2Ni4zMDgwMzcsNDEuMDI0NTIzIEMgNzQuOTY1OTA1LDUxLjY4MDM2MSA4Mi43NTU3OSwzNi44Mzc5MzYgNzUuMDQ1NjcyLDMxLjMwNjk2NiB6ICIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0NzI2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4xO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyMjU2OTcpIgogICAgICAgICBpZD0icGF0aDIxODExIiAvPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDQwLjkxNzEwMyw1NC4wNjQzNDkgQyA0MC45MTcxMDMsNTQuMDY0MzQ5IDY1LjEzMDcwNSwzMi40NDA0MzYgNjUuMTMwNzA1LDMyLjQ0MDQzNiBDIDY1LjU5MzkxOSwzMS45MTEwNDggNjkuODYyMzYxLDMwLjIxMjgwNCA3My40MTc3MTQsMzQuNDQ3NDQ2IEMgNzYuNjkyNjczLDM4LjM0ODEyMiA3NS4zNzE0MzEsNDEuNDkyOTAyIDc0Ljg0MjA0Myw0Mi4wMjIyOSBDIDc0Ljg0MjA0Myw0Mi4wMjIyOSA1MS4wMTY4OTQsNjQuNjE3MzM1IDUxLjAxNjg5NCw2NC42MTczMzUgTCA0MC45MTcxMDMsNTQuMDY0MzQ5IHogIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MTMwNjApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgaWQ9InBhdGgxMjA4MyIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI2Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTYxLjgxNjg4MSwtMjQuMTgzMTE5KSIKICAgICAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgICAgICBpZD0iZzExMDcxIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMjA4MzMzLDAsMCwxLjAyMDgzMzMsLTIuNzI0NzIxOSwtMy40NTkxMTk1KSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDgzKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICBpZD0icGF0aDExMDczIiAvPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTU1MDM5LDAsMCwxLjAxNTUwMzksLTEuNDYzMTY5OSwtMS40NzgyNDYyKSIKICAgICAgICAgICBpZD0iZzExMDc1Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJNIDEyMS44NjkzOCA5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICA2OC4zNjU3NDcsOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgMTIxLjg2OTM4IDk2Ljc4OTU1MSB6IgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTU4MzMzLDAsMCwwLjg5NTgzMzMsOS4xNjQ5NzM0LDguNjM5NTc0NSkiCiAgICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDExMDg1KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41MzUyMTEzMjtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC41MDE5NjA3OCIKICAgICAgICAgICAgIGlkPSJwYXRoMTEwNzciIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgZD0iTSAxMTEuNzY0MDcsMzguNDU1NzM0IEMgMTExLjc2NDA3LDQ1LjgxMjIyMiAxMDYuMzEyMTMsNTEuNzgyNzA0IDk0LjM3NDQ1OCw1MS43ODI3MDQgQyA4Mi42MDM4MzEsNTEuNzgyNzA0IDc2Ljk4NDg0Niw0NS44MTIyMjIgNzYuOTg0ODQ2LDM4LjQ1NTczNCBDIDc2Ljk4NDg0NiwzMS4wOTkyNDcgODQuNzc1MzkyLDI1LjEyODc2NCA5NC4zNzQ0NTgsMjUuMTI4NzY0IEMgMTAzLjk3MzUyLDI1LjEyODc2NCAxMTEuNzY0MDcsMzEuMDk5MjQ3IDExMS43NjQwNywzOC40NTU3MzQgeiAiCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA3OTQ5ODcsMCwwLDAuOTMyMDk4OCwtNy41MDI2NDU2LDQ1LjI2MTQxKSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxODMwMCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDExMDc5IiAvPgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjY4NzU2IDk2Ljc4OTU1MSBBIDI2LjU3IDI2LjU3IDAgMSAxICA2OC41NDc1NjIsOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDEyMS42ODc1NiA5Ni43ODk1NTEgeiIKICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5MjQ1NDgsMCwwLDAuOTkyNDU0OCwtMi4xODQ0NDEyZS0yLC0wLjcxNjAwMDcpIgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjI3ODE0MjkzO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICAgIGlkPSJwYXRoMTEwODEiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI3Ij4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA5My40Mzg2OTIsNDcuNTIxNzI3IEMgMTA0LjI4MDg3LDQ2LjI1NTcyOCAxMDIuNTg0NDgsMzIuODI4NjIyIDkyLjA0Mjc3MSwzMy41MjQyMTIgQyA4MS44MjA0NTcsMzQuMTk4NzI4IDgxLjExNTY1Nyw0OC45NjA2NDEgOTMuNDM4NjkyLDQ3LjUyMTcyNyB6ICIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE1MDA4KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4xO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyMTc5MTcpIgogICAgICAgICBpZD0icGF0aDEzMDYyIiAvPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDg1Ljg1MTEzOSw0My4xMzQzODEgQyA4NS44NTExMzksNDMuMTM0MzgxIDg2LjUyMzYwNiw3OC41NTc5NCA4Ni41MjM2MDYsNzguNTU3OTQgTCAxMDEuMDgxNTUsNzguMDA4NTg0IEMgMTAxLjA4MTU1LDc4LjAwODU4NCA5OS43NDI3OTQsNDEuODIzNDQ0IDk5Ljc0Mjc5NCw0MS44MjM0NDQgQyA5OS4yMzk1MzIsMzkuMDE5MTY0IDk2LjE2MjAwNSwzNi4yMDQ1NyA5Mi42ODM0NTIsMzYuNDQzNzIgQyA4OC44MzcyNTUsMzYuNzA4MTQ2IDg1LjM5OTc4MSw0MC4wMzUwNDggODUuODUxMTM5LDQzLjEzNDM4MSB6ICIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMDEzMSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBpZD0icGF0aDkxNTQiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMzIuODk4NDc2LDczLjg3Njg4MyBDIDI3LjYyNjcwMyw4MC45Njg5NjggMzcuODk3OTE5LDkyLjU1NDI0NSA0NS4xMzYzODYsODMuMjQ2MjAxIEMgNTIuNjk3ODc4LDczLjUyMjc3NCAzOC44NjY0NjQsNjUuODQ4MTgyIDMyLjg5ODQ3Niw3My44NzY4ODMgeiAiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxOTg2Nyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxO2ZpbHRlcjp1cmwoI2ZpbHRlcjIxODA3KSIKICAgICAgICAgaWQ9InBhdGgxNzkyMSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSA0My42NzM4Miw3Mi40MjM0NjIgQyA0My42NzM4Miw3Mi40MjM0NjIgODIuNjc4MTExLDg3LjgwNTQzNiA4Mi42NzgxMTEsODcuODA1NDM2IEwgNzguMjgzMjYyLDEwMS42MzA5IEMgNzguMjgzMjYyLDEwMS42MzA5IDM4LjU0NjQ5NSw4NS42MDgwMTIgMzguNTQ2NDk1LDg1LjYwODAxMiBDIDM0LjQ3MjEwMyw4My4zNjQ4MDcgMzMuNDU2NzQ4LDgwLjI5NjMzMyAzNC43MDEwMDIsNzYuNzI2NzUyIEMgMzYuMDk3MjgyLDcyLjcyMTAzIDQxLjI3MDM4Niw3MS41MDc4NjggNDMuNjczODIsNzIuNDIzNDYyIHogIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MTIwNzkpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgaWQ9InBhdGgxMDEzMyIgLz4KICAgIDwvZz4KICAgIDxnCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgICBpZD0ibGF5ZXI0Ij4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDY3Mjg0LDAsMCwxLjAwNjcxOTIsLTAuNDUxODY4LC0wLjgyMzU0NykiCiAgICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9ImcyMTk5Ij4KICAgICAgICA8cGF0aAogICAgICAgICAgIGQ9Ik0gMTIxLjg2OTM4IDk2Ljc4OTU1MSBBIDI2Ljc1MTgxNCAyNi43NTE4MTQgMCAxIDEgIDY4LjM2NTc0Nyw5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICAxMjEuODY5MzggOTYuNzg5NTUxIHoiCiAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45OTM0NTI5LDAsMCwwLjk5MzQ1MjksLTAuMTIwMzY2NCwtMC44MDg5ODQzKSIKICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDM0MzApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjUzNTIxMTMyO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4IgogICAgICAgICAgIGlkPSJwYXRoMzQyOCIgLz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDA4NzA3OCwwLDAsMS4wMDg3MDc4LC0wLjgyODM0NDEsLTAuODIzNzAxMSkiCiAgICAgICAgICAgaWQ9Imc5MjE1Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBkPSJNIDEyMS44NjkzOCA5Ni43ODk1NTEgQSAyNi43NTE4MTQgMjYuNzUxODE0IDAgMSAxICA2OC4zNjU3NDcsOTYuNzg5NTUxIEEgMjYuNzUxODE0IDI2Ljc1MTgxNCAwIDEgMSAgMTIxLjg2OTM4IDk2Ljc4OTU1MSB6IgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTU4MzMzLDAsMCwwLjg5NTgzMzMsOS4xNjQ5NzM0LDguNjM5NTc0NSkiCiAgICAgICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDkyMTkpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjUzNTIxMTMyO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4IgogICAgICAgICAgICAgaWQ9InBhdGgyNDM0IiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gMTExLjc2NDA3LDM4LjQ1NTczNCBDIDExMS43NjQwNyw0NS44MTIyMjIgMTA2LjMxMjEzLDUxLjc4MjcwNCA5NC4zNzQ0NTgsNTEuNzgyNzA0IEMgODIuNjAzODMxLDUxLjc4MjcwNCA3Ni45ODQ4NDYsNDUuODEyMjIyIDc2Ljk4NDg0NiwzOC40NTU3MzQgQyA3Ni45ODQ4NDYsMzEuMDk5MjQ3IDg0Ljc3NTM5MiwyNS4xMjg3NjQgOTQuMzc0NDU4LDI1LjEyODc2NCBDIDEwMy45NzM1MiwyNS4xMjg3NjQgMTExLjc2NDA3LDMxLjA5OTI0NyAxMTEuNzY0MDcsMzguNDU1NzM0IHogIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wNzk0OTg3LDAsMCwwLjkzMjA5ODgsLTcuNTAyNjQ1Niw0NS4yNjE0MSkiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50OTA3MSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eTowLjUwMTk2MDc4O2ZpbHRlcjp1cmwoI2ZpbHRlcjkwNjQpIgogICAgICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoODI0MCkiCiAgICAgICAgICAgICBpZD0icGF0aDUzMjEiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAxMjEuNjg3NTYgOTYuNzg5NTUxIEEgMjYuNTcgMjYuNTcgMCAxIDEgIDY4LjU0NzU2Miw5Ni43ODk1NTEgQSAyNi41NyAyNi41NyAwIDEgMSAgMTIxLjY4NzU2IDk2Ljc4OTU1MSB6IgogICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTg1ODIyLDAsMCwwLjk4NTgyMiwwLjU4MTMzMTEsLTkuODg0MjY0MmUtMikiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2ODAwMDA7c3Ryb2tlLXdpZHRoOjIuMjc4MTM5NTk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgICAgaWQ9InBhdGg4MjQ0IiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"kalzium,kalzium\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kalzium.desktop\"\nLABEL oc.launch=\"kalzium.kalzium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Kalzium\"\nLABEL oc.displayname=\"Kalzium\"\nLABEL oc.path=\"/usr/bin/kalzium\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Kalzium\"\nENV APPBIN \"/usr/bin/kalzium\"\nENV APP \"/usr/bin/kalzium\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kalzium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kalzium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Kalzium

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Kalzium.d\n
"},{"location":"applications/kalzium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Kalzium.d -t Kalzium .\n
"},{"location":"applications/kalzium/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Kalzium > Kalzium.json\ndocker image save Kalzium -o Kalzium.tar\nctr -n k8s.io images import Kalzium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Kalzium.json\n\n
"},{"location":"applications/kdiamond/","title":"kDiamond","text":""},{"location":"applications/kdiamond/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/kdiamond/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kdiamond/#alpine-packages","title":"Alpine packages","text":"
kdiamond\n
"},{"location":"applications/kdiamond/#path","title":"Path","text":"
/usr/games/kdiamond\n
"},{"location":"applications/kdiamond/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/kdiamond/#wm_class","title":"WM_CLASS","text":"
kdiamond.kdiamond\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/kdiamond/#json-dump","title":"JSON dump","text":"

json source file kdiamond.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"kdiamond\",\n    \"icon\": \"kdiamond.svg\",\n    \"keyword\": \"kdiamond\",\n    \"launch\": \"kdiamond.kdiamond\",\n    \"name\": \"kDiamond\",\n    \"path\": \"/usr/games/kdiamond\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/kdiamond/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output kdiamond.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kdiamond.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kdiamond.d.3.0.json\n\n
"},{"location":"applications/kdiamond/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kdiamond\nLABEL oc.icon=\"kdiamond.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgaGVpZ2h0PSI0OCIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxNiIgeDI9IjciIHkxPSIyMCIgeTI9IjciPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNiZjQyMzEiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZjU4MjczIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjM5IiB4Mj0iMzAiIHkxPSIyMCIgeTI9IjciPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmE5MmQiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZjMTY5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE3IiB4Mj0iMTAiIHkxPSI0MC4xMjQiIHkyPSIyOCI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzNiYjU2NiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM3Y2VjYTQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMzgiIHgyPSIzMCIgeTE9IjQyIiB5Mj0iMjkiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMzYjg1YjUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjN2NiY2VjIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8Zz4KICAgIDxwYXRoIGQ9Im0xMi45OTkwNzQgNC4wMDAwMDQ4Yy0uMjQyNTE4IDAtLjQ4NDk2NS4wOTIxMTgtLjY3MDc5NC4yNzc5MzY5bC04LjA0OTUzMDUgOC4wNTA5MDgzYy0uMzcxNjU5Ny4zNzE2MzgtLjM3MTY1OTcuOTY5ODcxIDAgMS4zNDE1MDlsOC4wNDk1MzA1IDguMDUwOTA4Yy4zNzE2NTkuMzcxNjM4Ljk3MTc4MS4zNzE2MzggMS4zNDM0NCAwbDguMDQ5NTMtOC4wNTA5MDhjLjM3MTY2MS0uMzcxNjM4LjM3MTY2MS0uOTY5ODcxIDAtMS4zNDE1MDlsLTguMDQ5NTMtOC4wNTA5MDgzYy0uMTg1ODI5LS4xODU4MTg5LS40MzAxMjktLjI3NzkzNjktLjY3MjY0Ni0uMjc3OTM2OXoiIGZpbGw9InVybCgjYSkiLz4KICAgIDxwYXRoIGQ9Im0zNC45OTkwNzQgNC4wMDAwMDQ4Yy0uMjQyNTE4IDAtLjQ4NDk2NS4wOTIxMTgtLjY3MDc5NC4yNzc5MzY5bC04LjA0OTUzMSA4LjA1MDkwODNjLS4zNzE2NTkuMzcxNjM4LS4zNzE2NTkuOTY5ODcxIDAgMS4zNDE1MDlsOC4wNDk1MzEgOC4wNTA5MDhjLjM3MTY1OS4zNzE2MzguOTcxNzgxLjM3MTYzOCAxLjM0MzQ0IDBsOC4wNDk1My04LjA1MDkwOGMuMzcxNjYxLS4zNzE2MzguMzcxNjYxLS45Njk4NzEgMC0xLjM0MTUwOWwtOC4wNDk1My04LjA1MDkwODNjLS4xODU4MjktLjE4NTgxODktLjQzMDEyOS0uMjc3OTM2OS0uNjcyNjQ2LS4yNzc5MzY5eiIgZmlsbD0idXJsKCNiKSIvPgogICAgPHBhdGggZD0ibTEyLjk5OTA3NCAyNi4wMDAwMDVjLS4yNDI1MTggMC0uNDg0OTY1LjA5MjEyLS42NzA3OTQuMjc3OTM3bC04LjA0OTUzMDUgOC4wNTA5MDhjLS4zNzE2NTk3LjM3MTYzOC0uMzcxNjU5Ny45Njk4NzEgMCAxLjM0MTUwOWw4LjA0OTUzMDUgOC4wNTA5MDhjLjM3MTY1OS4zNzE2MzguOTcxNzgxLjM3MTYzOCAxLjM0MzQ0IDBsOC4wNDk1My04LjA1MDkwOGMuMzcxNjYxLS4zNzE2MzguMzcxNjYxLS45Njk4NzEgMC0xLjM0MTUwOWwtOC4wNDk1My04LjA1MDkwOGMtLjE4NTgyOS0uMTg1ODE5LS40MzAxMjktLjI3NzkzNy0uNjcyNjQ2LS4yNzc5Mzd6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCBkPSJtMzQuOTk5MDc0IDI2LjAwMDAwNWMtLjI0MjUxOCAwLS40ODQ5NjUuMDkyMTItLjY3MDc5NC4yNzc5MzdsLTguMDQ5NTMxIDguMDUwOTA4Yy0uMzcxNjU5LjM3MTYzOC0uMzcxNjU5Ljk2OTg3MSAwIDEuMzQxNTA5bDguMDQ5NTMxIDguMDUwOTA4Yy4zNzE2NTkuMzcxNjM4Ljk3MTc4MS4zNzE2MzggMS4zNDM0NCAwbDguMDQ5NTMtOC4wNTA5MDhjLjM3MTY2MS0uMzcxNjM4LjM3MTY2MS0uOTY5ODcxIDAtMS4zNDE1MDlsLTguMDQ5NTMtOC4wNTA5MDhjLS4xODU4MjktLjE4NTgxOS0uNDMwMTI5LS4yNzc5MzctLjY3MjY0Ni0uMjc3OTM3eiIgZmlsbD0idXJsKCNkKSIvPgogICAgPHBhdGggZD0ibTQuMTY2MDE1NiAxMi41Yy0uMjMzNDk3OS4zNjcxMjEtLjIwNzcyMTUuODQ4OTM4LjExMzI4MTMgMS4xNjk5MjJsOC4wNDg4MjgxIDguMDUwNzgxYy4zNzE2NTkuMzcxNjM4Ljk3MjA5MS4zNzE2MzggMS4zNDM3NSAwbDguMDQ4ODI4LTguMDUwNzgxYy4zMjEwMDQtLjMyMDk4NC4zNDY3OC0uODAyODAxLjExMzI4MS0xLjE2OTkyMi0uMDM2NjY1LjA1NzQyOS0uMDYzMDI0LjExOTY2OC0uMTEzMjgxLjE2OTkyMmwtOC4wNDg4MjggOC4wNTA3ODFjLS4zNzE2NTkuMzcxNjM4LS45NzIwOTEuMzcxNjM4LTEuMzQzNzUgMGwtOC4wNDg4MjgxLTguMDUwNzgxYy0uMDUwMjU2Ni0uMDUwMjU0LS4wNzY2MTYzLS4xMTI0OTMtLjExMzI4MTMtLjE2OTkyMnptMjIuMDAwMDAwNCAwYy0uMjMzNDk4LjM2NzEyMS0uMjA3NzIxLjg0ODkzOC4xMTMyODEgMS4xNjk5MjJsOC4wNDg4MjggOC4wNTA3ODFjLjM3MTY1OS4zNzE2MzguOTcyMDkxLjM3MTYzOCAxLjM0Mzc1IDBsOC4wNDg4MjgtOC4wNTA3ODFjLjMyMTAwNC0uMzIwOTg0LjM0Njc4LS44MDI4MDEuMTEzMjgxLTEuMTY5OTIyLS4wMzY2NjUuMDU3NDI5LS4wNjMwMjQuMTE5NjY4LS4xMTMyODEuMTY5OTIybC04LjA0ODgyOCA4LjA1MDc4MWMtLjM3MTY1OS4zNzE2MzgtLjk3MjA5MS4zNzE2MzgtMS4zNDM3NSAwbC04LjA0ODgyOC04LjA1MDc4MWMtLjA1MDI1Ny0uMDUwMjU0LS4wNzY2MTYtLjExMjQ5My0uMTEzMjgxLS4xNjk5MjJ6bS0yMi4wMDAwMDA0IDIyYy0uMjMzNDk3OS4zNjcxMjEtLjIwNzcyMTUuODQ4OTM4LjExMzI4MTMgMS4xNjk5MjJsOC4wNDg4MjgxIDguMDUwNzgxYy4zNzE2NTkuMzcxNjM4Ljk3MjA5MS4zNzE2MzggMS4zNDM3NSAwbDguMDQ4ODI4LTguMDUwNzgxYy4zMjEwMDQtLjMyMDk4NC4zNDY3OC0uODAyODAxLjExMzI4MS0xLjE2OTkyMi0uMDM2NjY1LjA1NzQyOS0uMDYzMDI0LjExOTY2OC0uMTEzMjgxLjE2OTkyMmwtOC4wNDg4MjggOC4wNTA3ODFjLS4zNzE2NTkuMzcxNjM4LS45NzIwOTEuMzcxNjM4LTEuMzQzNzUgMGwtOC4wNDg4MjgxLTguMDUwNzgxYy0uMDUwMjU2Ni0uMDUwMjU0LS4wNzY2MTYzLS4xMTI0OTMtLjExMzI4MTMtLjE2OTkyMnptMjIuMDAwMDAwNCAwYy0uMjMzNDk4LjM2NzEyMS0uMjA3NzIxLjg0ODkzOC4xMTMyODEgMS4xNjk5MjJsOC4wNDg4MjggOC4wNTA3ODFjLjM3MTY1OS4zNzE2MzguOTcyMDkxLjM3MTYzOCAxLjM0Mzc1IDBsOC4wNDg4MjgtOC4wNTA3ODFjLjMyMTAwNC0uMzIwOTg0LjM0Njc4LS44MDI4MDEuMTEzMjgxLTEuMTY5OTIyLS4wMzY2NjUuMDU3NDI5LS4wNjMwMjQuMTE5NjY4LS4xMTMyODEuMTY5OTIybC04LjA0ODgyOCA4LjA1MDc4MWMtLjM3MTY1OS4zNzE2MzgtLjk3MjA5MS4zNzE2MzgtMS4zNDM3NSAwbC04LjA0ODgyOC04LjA1MDc4MWMtLjA1MDI1Ny0uMDUwMjU0LS4wNzY2MTYtLjExMjQ5My0uMTEzMjgxLS4xNjk5MjJ6IiBvcGFjaXR5PSIuMTUiLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"kdiamond,kdiamond\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"kdiamond.kdiamond\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"kDiamond\"\nLABEL oc.displayname=\"kDiamond\"\nLABEL oc.path=\"/usr/games/kdiamond\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kDiamond\"\nENV APPBIN \"/usr/games/kdiamond\"\nENV APP \"/usr/games/kdiamond\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kdiamond/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kdiamond/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application kDiamond

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kDiamond.d\n
"},{"location":"applications/kdiamond/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f kDiamond.d -t kDiamond .\n
"},{"location":"applications/kdiamond/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect kDiamond > kDiamond.json\ndocker image save kDiamond -o kDiamond.tar\nctr -n k8s.io images import kDiamond.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kDiamond.json\n\n
"},{"location":"applications/kgeography/","title":"Kgeography","text":""},{"location":"applications/kgeography/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/kgeography/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kgeography/#alpine-packages","title":"Alpine packages","text":"
kgeography\n
"},{"location":"applications/kgeography/#path","title":"Path","text":"
/usr/bin/kgeography\n
"},{"location":"applications/kgeography/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/kgeography/#wm_class","title":"WM_CLASS","text":"
kgeography.kgeography\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/kgeography/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.kde.kgeography.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/kgeography/#json-dump","title":"JSON dump","text":"

json source file kgeography.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"kgeography\",\n    \"icon\": \"kgeography.svg\",\n    \"keyword\": \"kgeography,geography\",\n    \"launch\": \"kgeography.kgeography\",\n    \"name\": \"Kgeography\",\n    \"path\": \"/usr/bin/kgeography\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/org.kde.kgeography.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/kgeography/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output kgeography.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kgeography.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kgeography.d.3.0.json\n\n
"},{"location":"applications/kgeography/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kgeography\nLABEL oc.icon=\"kgeography.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB5Mj0iMTUuODI3IiB4Mj0iMTAuNDY3IiB5MT0iNDIuNTI2IiB4MT0iMTAuNzk1IiBpZD0iMCI+PHN0b3Agc3RvcC1jb2xvcj0iIzE5N2NmMSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzIwYmNmYSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeTE9IjQyLjQ3NSIgeDI9IjAiIHkyPSIyOC44OTkiPjxzdG9wIHN0b3AtY29sb3I9IiNjNTI4MjgiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZjU0NTQiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAyMTIxIDAgMCAxLjAyMTIxLS4wNC0uMzY2KSI+PHBhdGggZD0ibS0xLjM0NiAxNS40NThoMjIuODA4Yy44OTYgMCAxLjYxOC43NDcgMS42MTggMS42NzR2MjMuNTk3YzAgLjkyNy0uNzIyIDEuNjc0LTEuNjE4IDEuNjc0aC0yMi44MDhjLS44OTYgMC0xLjYxOC0uNzQ3LTEuNjE4LTEuNjc0di0yMy41OTdjMC0uOTI3LjcyMi0xLjY3NCAxLjYxOC0xLjY3NCIgZmlsbD0idXJsKCMwKSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09Im1hdHJpeCgxLjc3MzU2IDAgMCAxLjcxNDI2IDYuMTA4LTI1Ljk4NikiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz48cGF0aCBkPSJtMTEuNDA2IDYuNDY5bC4zNS0uMzcxaDIuMDk2bC43NTkuNjcyLS4wNDYgMS4wNDYuNjQuNTg4LS41MzIuMzgxLjExOSAxLjM3NS0xLjkgMi4zMDN2Mi4xNjNsMS4wMTguNDkzdjEuOTQybC45ODcgMS42NjkuNzg3LjExOS4xMDEtLjU3NC0uOTMxLTEuNDQ1LS4xODUtMS40MDdoLjU1M2wuMjM0IDEuNDQ5IDEuMzU4IDEuOTgxLS4zNjQuNjMzLjg3MSAxLjMyNiAyLjE0OS41MzJ2LS4zNWwuODU3LjEyMi0uMDc3LjYxNmMuNzU2LjEyMi41MjUuMDczIDEuNzE1LjQwMmwxLjQ3IDEuNjc2IDEuODc2LjE0My4xODIgMS41MzMtMS4yODguOTAzLS4wNjMgMS4zNjEtLjE3OC44NCAxLjg1NSAyLjMyNC4xNDMuNzk4YzAgMCAuNjc1LjE4Mi43NDkuMTgyLjA4IDAgMS41MTUgMS4wOTIgMS41MTUgMS4wOTJ2NC4xOTJsLjUxMS4xNS0uMzU3IDEuOTI1Ljg2MSAxLjEzNy0uMTU0IDEuOTI1IDEuMTMgMS45OTEgMS40NTYgMS4yNjcgMS40NTYuMDMyLjE0Ny0uNDY5LTEuMDcxLS45MDZjLjA4LS41NTMuMDI1LS4zNDMuMjU5LTEuMDFsLjA0Mi0uNTQ5LS43MzEtLjAyNS0uMzc0LS40NTUuNjA1LS41ODQuMDg0LS40MzQtLjY3NS0uMTg5LjAzOC0uNDEzLjk1OS0uMTQzIDEuNDU5LS42OTZjLjY1NC0xLjIuOTc2LTEuNTIyIDIuMDIzLTIuODU5bC0uMzUtMS41MjkuNDY5LS44MTUgMS40MDcuMDM1Ljk0NS0uNzM4LjMwOC0yLjk2MSAxLjA1LTEuMzQ0LjE4OS0uODUtLjk2Mi0uMzExLS42My0xLjAzNi0yLjE2Ni0uMDI0LTEuNzE1LS42NTQtLjA4LTEuMjI4LS41NzQtLjk5Ny0xLjU0LS4wMjEtLjg5OS0xLjQxLS43OTgtLjM3OC0uMDQyLjQyLTEuNDQ1LjA5MS0uNTMyLS43MzUtMS41MTUtLjMwOC0xLjI0NiAxLjQzMS0xLjk1Ni0uMzI5LS4xNDMtMi4yMDgtMS40MzEtLjI0NS41NzQtMS4wODgtLjE2NC0uNjEyLTEuODcyIDEuMjU2LTEuMTc5LS4xNDMtLjQzLS45MzFjLjMyMi0xLjE3Mi4xMjktLjcxLjkxNy0yLjE1NmwxLjQ5OC0uNzYzaDIuODk4bC0uMDA3Ljg4MiAxLjA0My40OS0uMDg0LTEuNTA4Yy43OTgtLjgwMS41NTYtLjYyNiAyLjI2NC0xLjc1bC4wOTgtLjY5NiAxLjUxNS0xLjU3NSAxLjYxLS44ODUtLjE0My0uMTE1IDEuMDg1LTEuMDI1LjQwMi4xMDUuMTg1LjIzMS40MTMtLjQ2Mi4wOTQtLjA0OWMtLjU0Ni0uMDczLS4zNS0uMDI0LS45MDMtLjIxM3YtLjQ0NGwuMjQxLS4xOTloLjUzOWwuMjQ4LjEwOC4yMS40MjcuMjU5LS4wMzh2LS4wMjRsLjA3Ny4wMjEuNzQ5LS4xMTkuMTA1LS4zNjcuNDIuMTA1di4zOTVsLS4zOTUuMjc2LjA1OS40NDEgMS4zNjguNDJjMCAwIC4wMDMuMDA3LjAwMy4wMTRsLjMxMS0uMDI0LjAyMS0uNTg4LTEuMDgxLS40OTMtLjA2My0uMjkuODk2LS4zMDguMDM4LS44NS0uOTM0LS41NzQtLjA2My0xLjQ0NS0xLjI5NS42M2gtLjQ2OWwuMTI2LTEuMTAyLTEuNzQzLS40MTYtLjcyOC41NDZ2MS42NzZsLTEuMzAyLjQwNi0uNTI1IDEuMDkyLS41NjMuMDg3di0xLjM4OWwtMS4yMjEtLjE3NS0uNjEyLS4zOTUtLjI0OC0uODk5IDIuMTkxLTEuMjg0IDEuMDcxLS4zMjUuMTA1LjcxNy42MDItLjAyOC4wNDktLjM2NC42MjMtLjA4Ny4wMDctLjEyMi0uMjYyLS4xMTItLjA2My0uMzgxLjc2Ni0uMDY2LjQ2Mi0uNDgzLjAzNS0uMDM1di4wMDRsLjE0My0uMTQ3IDEuNjEzLS4yMDMuNzEuNjA1LTEuODc2Ljk5NyAyLjM4My41Ni4zMDQtLjc5OGgxLjA0NmwuMzY0LS42OTMtLjczMS0uMTgydi0uODc1bC0yLjMwNi0xLjAyMi0xLjU5Mi4xODItLjkwMy40NjkuMDcgMS4xNDQtLjk0MS0uMTQzLS4xNDMtLjYzLjg4OS0uODE1LTEuNjI0LS4wODQtLjQ2OS4xMzYtLjIxLjU1My42MTYuMTA1LS4xMjYuNjEyLTEuMDM2LjA2My0uMTY0LjQwMi0xLjUxOS4wNDJjMCAwLS4wMzUtLjg1Ny0uMDk0LS44NTctLjA2MyAwIDEuMTgzLS4wMTcgMS4xODMtLjAxN2wuODk5LS44NzgtLjQ5LS4yNDgtLjY1NC42MzctMS4wODUtLjA1OS0uNjQ3LS44OTloLTEuMzg5bC0xLjQ1MiAxLjA4NWgxLjMzbC4xMjIuMzg4LS4zNS4zMjUgMS40Ny4wNDIuMjI3LjUzMi0xLjY1NS0uMDY2LS4wOC0uNDA5LTEuMDM5LS4yMjctLjU1My0uMzAxLTIuNDUuMDI0LS43NTIuNzMxLS41MTQtLjA0Mi0uNTctLjMzMi0xLjY5NC0uNTA0aC0zLjEwMWwtMS43OTUgMS4yMjEtMS4yMDQuMTg1LS41NTMuNDMuODU3LjEyNnYuMzQzaC0xLjgzbC0uNzE3LjUxMS45MTcuNzc3IDIuNTA5LjAyMW0xNS40NjggNi4xMTdoLS43OGwuMTIyLS41MzIuMzY3LS4wMzkuMDg0LS4xODIuNTYtLjA3N3YuNDc2aC4wMDNsLS4zNTcuMzUzbS41NDMtMS4zMTZsLS4zNjcuMjM4LS40NjIuMDhjMCAwIDAtLjcyOCAwLS44MDVoLjgyOXYuNDg2bS42OTYtLjU2M2wuMzc4LjIzMS0uMzA0LjI0OC0uMjktLjI0OC4yMTctLjIzMW0tLjQ5Ny42MDloLjA1OWwuOTM4LjI3M3YuNDc5aC0uNzg3bC0uMjEtLjMwOGMwIDAgMC0uNDQ0IDAtLjQ0NG0tLjYwOS0xLjMxNmwuNTA3LjQ2Mi0uNTA3LjEyMnYtLjU4NG0tMi4xNDkuMDc3bC43MDctLjI5aC45Njl2LjI5aC4yMXYuNTA3aC0xLjQ3N2wtLjU0Ni0uMTUuMTM2LS4zNTdtLS4xMzMgMS4zMTZsLjU2LS42MDloLjgxMmwtMS4wMzkgMS40NTItLjQzNC0uMjMxLjEwMS0uNjEybS0uNzUyLTMuNDU4bC41NzcuMTMzLS4xOTkuNzg0LS42MjMuMjAzLS4zOTItLjgxNS42MzctLjMwNG0tMi45MDUtMy43MDN2LS4wNDVoLjUzNWwuMDQ5LS4xODVoLjg3OHYuMzg1bC0uMjU5LjMzMmgtMS4yMDR2LS40ODZ6bS44NSAxLjE5M2MwIDAgLjUzOS0uMDk0LjU4MS0uMDk0LjA0MiAwIDAgLjUzOSAwIC41MzlsLTEuMjA3LjA3Ny0uMjI3LS4yNzMuODU0LS4yNDgiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjg1MSIvPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNTcyNjcgMCAwIDEuNTcyNjctMTQuMTQtMjEuMTQpIj48Y2lyY2xlIGN5PSIzNS44NTgiIGN4PSIxNi42MTQiIHI9IjcuNjAxIiBmaWxsPSJ1cmwoIzEpIi8+PHBhdGggZD0ibTE2LjQ5OCAzMS4zODhjLTEuODA5IDAtMy4yNzUgMS40NjYtMy4yNzUgMy4yNzUgMCAuMTM4LjAxMS4yNzMuMDI4LjQwNy4yOCAyLjU1OCAzLjAzNSA1LjUwNyAzLjAzNSA1LjUwNy4wNDkuMDU1LjA5Ni4wODkuMTQyLjExM2guMDAybC4wOTIuMDI5LjA5Mi0uMDI5aC4wMDJjLjA0Ni0uMDI1LjA5My0uMDYuMTQyLS4xMTMgMCAwIDIuNzE1LTIuOTU0IDIuOTg4LTUuNTEzLjAxNi0uMTMyLjAyNy0uMjY2LjAyNy0uNDAyIDAtMS44MDgtMS40NjYtMy4yNzUtMy4yNzUtMy4yNzVtMCA1LjM4MmMtMS4xNjEgMC0yLjEwNy0uOTQ1LTIuMTA3LTIuMTA3IDAtMS4xNjEuOTQ1LTIuMTA3IDIuMTA3LTIuMTA3IDEuMTYxIDAgMi4xMDYuOTQ1IDIuMTA2IDIuMTA3IDAgMS4xNjEtLjk0NSAyLjEwNy0yLjEwNiAyLjEwNyIgZmlsbD0iI2ZhZmFmYSIgZmlsbC1vcGFjaXR5PSIuOTAzIiBzdHJva2Utd2lkdGg9IjEuMzE3Ii8+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"kgeography,kgeography,geography\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kgeography.desktop\"\nLABEL oc.launch=\"kgeography.kgeography\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Kgeography\"\nLABEL oc.displayname=\"Kgeography\"\nLABEL oc.path=\"/usr/bin/kgeography\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Kgeography\"\nENV APPBIN \"/usr/bin/kgeography\"\nENV APP \"/usr/bin/kgeography\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kgeography/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kgeography/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Kgeography

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Kgeography.d\n
"},{"location":"applications/kgeography/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Kgeography.d -t Kgeography .\n
"},{"location":"applications/kgeography/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Kgeography > Kgeography.json\ndocker image save Kgeography -o Kgeography.tar\nctr -n k8s.io images import Kgeography.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Kgeography.json\n\n
"},{"location":"applications/kigo/","title":"kigo","text":""},{"location":"applications/kigo/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/kigo/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/kigo/#ubuntu-packages","title":"Ubuntu packages","text":"
dbus-x11 dbus-user-session gnugo kigo\n
"},{"location":"applications/kigo/#displayname","title":"Displayname","text":"
kigo\n
"},{"location":"applications/kigo/#path","title":"Path","text":"
/usr/games/kigo\n
"},{"location":"applications/kigo/#mimetype","title":"Mimetype","text":"
application/x-go-sgf;\n
"},{"location":"applications/kigo/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/kigo/#wm_class","title":"WM_CLASS","text":"
kigo.kigo\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/kigo/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.kde.kigo.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/kigo/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

COPY composer/init.d/init.kigo /composer/init.d/init.kigo\n
"},{"location":"applications/kigo/#json-dump","title":"JSON dump","text":"

json source file kigo.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"args\": \"\",\n    \"debpackage\": \"dbus-x11 dbus-user-session gnugo kigo\",\n    \"icon\": \"kigo.svg\",\n    \"keyword\": \"go,kigo,gnugo\",\n    \"launch\": \"kigo.kigo\",\n    \"name\": \"kigo\",\n    \"mimetype\": \"application/x-go-sgf;\",\n    \"displayname\": \"kigo\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"path\": \"/usr/games/kigo\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.kigo.desktop\",\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.kigo /composer/init.d/init.kigo\"\n    ]\n}\n
"},{"location":"applications/kigo/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output kigo.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kigo.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kigo.d.3.0.json\n\n
"},{"location":"applications/kigo/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.kigo /composer/init.d/init.kigo\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus-x11 dbus-user-session gnugo kigo && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"kigo.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQ4IDQ4LjAwMDAwMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTAxIiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyLjg3NzllLTE1IiB5Mj0iNi4xMjMyZS0xNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojODJiMzM5IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6IzhkYzEzZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMy45NDllLTUpIj4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHptMCAwLjV2MC41YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC41YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgc3R5bGU9Im9wYWNpdHk6LjAyIi8+CiAgPHBhdGggZD0ibTEgNDMuMjV2MC4yNWMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTAuMjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMDUiLz4KICA8cGF0aCBkPSJtMSA0M3YwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIHN0eWxlPSJvcGFjaXR5Oi4xIi8+CiA8L2c+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSgtOTApIiB4PSItNDciIHk9IjEiIHdpZHRoPSI0NiIgaGVpZ2h0PSI0NiIgcng9IjQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0NTAxKSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEwMDQuNCkiPgogICA8cGF0aCBkPSJtMSAxMDQzLjR2NGMwIDIuMjE2IDEuNzg0IDQgNCA0aDM4YzIuMjE2IDAgNC0xLjc4NCA0LTR2LTRjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBzdHlsZT0ib3BhY2l0eTouMSIvPgogIDwvZz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTEpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMSkiPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLDEpIj4KICAgIDxnIHN0eWxlPSJvcGFjaXR5Oi4xIj4KICAgICA8cGF0aCBkPSJtMjMgMzAuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIvPgogICAgIDxwYXRoIGQ9Im0zNiAzMC41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41Ii8+CiAgICAgPHBhdGggZD0ibTIzIDE3LjVjMCAzLjAzOS0yLjQ2MSA1LjUtNS41IDUuNXMtNS41LTIuNDYxLTUuNS01LjUgMi40NjEtNS41IDUuNS01LjUgNS41IDIuNDYxIDUuNSA1LjUiLz4KICAgICA8cGF0aCBkPSJtMzYgMTcuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogIDxwYXRoIGQ9Im0yMyAzMC41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41IiBzdHlsZT0iZmlsbDojMmQyZDJkIi8+CiAgPHBhdGggZD0ibTM2IDMwLjVjMCAzLjAzOS0yLjQ2MSA1LjUtNS41IDUuNXMtNS41LTIuNDYxLTUuNS01LjUgMi40NjEtNS41IDUuNS01LjUgNS41IDIuNDYxIDUuNSA1LjUiIHN0eWxlPSJmaWxsOiNmOWY5ZjkiLz4KICA8cGF0aCBkPSJtMjMgMTcuNWMwIDMuMDM5LTIuNDYxIDUuNS01LjUgNS41cy01LjUtMi40NjEtNS41LTUuNSAyLjQ2MS01LjUgNS41LTUuNSA1LjUgMi40NjEgNS41IDUuNSIgc3R5bGU9ImZpbGw6I2Y5ZjlmOSIvPgogIDxwYXRoIGQ9Im0zNiAxNy41YzAgMy4wMzktMi40NjEgNS41LTUuNSA1LjVzLTUuNS0yLjQ2MS01LjUtNS41IDIuNDYxLTUuNSA1LjUtNS41IDUuNSAyLjQ2MSA1LjUgNS41IiBzdHlsZT0iZmlsbDojMmQyZDJkIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"kigo,go,kigo,gnugo\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.kde.kigo.desktop\"\nLABEL oc.launch=\"kigo.kigo\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"kigo\"\nLABEL oc.displayname=\"kigo\"\nLABEL oc.path=\"/usr/games/kigo\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-go-sgf;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kigo\"\nENV APPBIN \"/usr/games/kigo\"\nENV APP \"/usr/games/kigo\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kigo/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kigo/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application kigo

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kigo.d\n
"},{"location":"applications/kigo/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f kigo.d -t kigo .\n
"},{"location":"applications/kigo/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect kigo > kigo.json\ndocker image save kigo -o kigo.tar\nctr -n k8s.io images import kigo.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kigo.json\n\n
"},{"location":"applications/klickety/","title":"Klickety","text":""},{"location":"applications/klickety/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/klickety/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/klickety/#ubuntu-packages","title":"Ubuntu packages","text":"
breeze-icon-theme dbus-x11 dbus-user-session klickety\n
"},{"location":"applications/klickety/#path","title":"Path","text":"
/usr/games/klickety\n
"},{"location":"applications/klickety/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/klickety/#wm_class","title":"WM_CLASS","text":"
klickety.klickety\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/klickety/#json-dump","title":"JSON dump","text":"

json source file klickety.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"breeze-icon-theme dbus-x11 dbus-user-session klickety\",\n    \"icon\": \"klickety.svg\",\n    \"keyword\": \"klickety\",\n    \"launch\": \"klickety.klickety\",\n    \"name\": \"Klickety\",\n    \"path\": \"/usr/games/klickety\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/klickety/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output klickety.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klickety.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klickety.d.3.0.json\n\n
"},{"location":"applications/klickety/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends breeze-icon-theme dbus-x11 dbus-user-session klickety && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"klickety.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6bnMxPSJodHRwOi8vc296aS5iYWllcm91Z2UuZnIiCiAgICB4bWxuczpjYz0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvIgogICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgICBpZD0ic3ZnMSIKICAgIHNvZGlwb2RpOmRvY25hbWU9ImtsaWNrZXR5LnN2ZyIKICAgIHZpZXdCb3g9IjAgMCA2MCA2MCIKICAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgICBfU1ZHRmlsZV9fZmlsZW5hbWU9Im9sZHNjYWxlL2FwcHMva2xpY2tldHkuc3ZnIgogICAgdmVyc2lvbj0iMS4wIgogICAgeT0iMCIKICAgIHg9IjAiCiAgICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQwIgogICAgc29kaXBvZGk6ZG9jYmFzZT0iL2hvbWUvZGFubnkvd29yay9mbGF0L1NWRy9tb25vL3NjYWxhYmxlL2FwcHMiCiAgPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICAgaWQ9ImJhc2UiCiAgICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI2OTkiCiAgICAgIGlua3NjYXBlOnpvb209IjUuMzE1Nzc5NSIKICAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMSIKICAgICAgaW5rc2NhcGU6Y3g9IjU0LjcwNjc3MSIKICAgICAgaW5rc2NhcGU6Y3k9IjIwLjY3MTY0MyIKICAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMDI0IgogICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogIC8+CiAgPHBhdGgKICAgICAgaWQ9InBhdGgxMTAwIgogICAgICBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZTojZmZmZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS13aWR0aDo4LjEyNTtmaWxsOm5vbmUiCiAgICAgIGQ9Im0xMC4wNTEgNC42ODcydjUwLjYyNmgzOS44OTh2LTUwLjYyNiIKICAvPgogIDxnCiAgICAgIGlkPSJnMTA4MSIKICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoLjkzMTU4IDAgMCAuOTMxNTggMi4xNzI2IDEuOTMyMykiCiAgICA+CiAgICA8cmVjdAogICAgICAgIGlkPSJyZWN0OTMxIgogICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6My4xMjU7ZmlsbDojZmZmZmZmIgogICAgICAgIHJ4PSIxLjYxMzQiCiAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS45MzgyIC0uMzU5ODkpIgogICAgICAgIGhlaWdodD0iNTQuNzA0IgogICAgICAgIHdpZHRoPSI0My4wMDciCiAgICAgICAgeT0iMi45NTcyIgogICAgICAgIHg9IjIuNTE5MiIKICAgIC8+CiAgICA8cGF0aAogICAgICAgIGlkPSJwYXRoOTMyIgogICAgICAgIHN0eWxlPSJzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjMuMzU0NTtmaWxsOm5vbmUiCiAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtLjM1OTg5KSIKICAgICAgICBkPSJtOC40NTc1IDMuMzE3MXY1NC4zNDRoNDIuODI4bC0wLjAwMS01NC4zNDQiCiAgICAvPgogICAgPGcKICAgICAgICBpZD0iZzk0NSIKICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSguMDI3MzEwKSIKICAgICAgPgogICAgICA8ZwogICAgICAgICAgaWQ9Imc5MzIiCiAgICAgICAgPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTMzIgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTgzNDtmaWxsOiMwMDAwMDAiCiAgICAgICAgICAgIGQ9Im0xMi42OTYgNDUuNjA0Yy0wLjU1NCAwLTEgMC40NDYtMSAxdjYuODE4YzAgMC41NTQgMC40NDYgMSAxIDFoNi44MThjMC41NTQgMCAxLTAuNDQ2IDEtMXYtNi44MThjMC0wLjU1NC0wLjQ0Ni0xLTEtMWgtNi44MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxNDggMCAwIDEuMDE0OCAuMDE2NDYxIC0xLjE3MjcpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5MzQiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45ODM0O2ZpbGw6IzAwMDAwMCIKICAgICAgICAgICAgZD0ibTIzLjUwNiA0NS4yNDRjLTAuNTU0IDAtMSAwLjQ0Ni0xIDF2Ni44MThjMCAwLjU1NCAwLjQ0NiAxIDEgMWg2LjgxOGMwLjU1NCAwIDEtMC40NDYgMS0xdi02LjgxOGMwLTAuNTU0LTAuNDQ2LTEtMS0xaC02LjgxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDE0OCAwIDAgMS4wMTQ4IC0xLjk5MjIgLS44MDc1MikiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDkzNSIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjk4MzQ7ZmlsbDojMDAwMDAwIgogICAgICAgICAgICBkPSJtMzQuMTM2IDQ1LjI0NGMtMC41NTQgMC0xIDAuNDQ2LTEgMXY2LjgxOGMwIDAuNTU0IDAuNDQ2IDEgMSAxaDYuODE4YzAuNTU0IDAgMS0wLjQ0NiAxLTF2LTYuODE4YzAtMC41NTQtMC40NDYtMS0xLTFoLTYuODE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTQ4IDAgMCAxLjAxNDggLTMuODE4MiAtLjgwNzUyKSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTM3IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im0yMy41MyA0NS4xMDVjLTAuNTYyIDAtMS4wMTQgMC40NTMtMS4wMTQgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MiAxLjAxNSAxLjAxNCAxLjAxNWg2LjkxOGMwLjU2MyAwIDEuMDE1LTAuNDUzIDEuMDE1LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUyLTEuMDE1LTEuMDE1LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgMSAwIC02LjA3MDggNzYuNTMyKSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTM4IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im0zMi40OTEgNDUuMTA1Yy0wLjU2MiAwLTEuMDE1IDAuNDUzLTEuMDE1IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTMgMS4wMTUgMS4wMTUgMS4wMTVoNi45MThjMC41NjIgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1My0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwIC0xIDEgMCAtNi4wNzA4IDc2LjUzMikiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDkzOSIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAxMjc7ZmlsbDojZmZmZmZmIgogICAgICAgICAgICBkPSJtNDEuNDUyIDQ1LjEwNWMtMC41NjIgMC0xLjAxNSAwLjQ1My0xLjAxNSAxLjAxNXY2LjkxOGMwIDAuNTYyIDAuNDUzIDEuMDE1IDEuMDE1IDEuMDE1aDYuOTE4YzAuNTYyIDAgMS4wMTUtMC40NTMgMS4wMTUtMS4wMTV2LTYuOTE4YzAtMC41NjItMC40NTMtMS4wMTUtMS4wMTUtMS4wMTVoLTYuOTE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAtMSAxIDAgLTYuMDcwOCA3Ni41MzIpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDAiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibS00NC4wNCAyOC40MDRjLTAuNTYzIDAtMS4wMTUgMC40NTMtMS4wMTUgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MiAxLjAxNSAxLjAxNSAxLjAxNWg2LjkxOGMwLjU2MiAwIDEuMDE0LTAuNDUzIDEuMDE0LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUyLTEuMDE1LTEuMDE0LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgMSAwIDEuNDM5NiAwKSIKICAgICAgICAvPgogICAgICA8L2cKICAgICAgPgogICAgICA8ZwogICAgICAgICAgaWQ9Imc5NDAiCiAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtLjMyMzQ0KSIKICAgICAgICA+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDEiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibTEyLjkgMTMuMjE1Yy0wLjU2MiAwLTEuMDE0IDAuNDUzLTEuMDE0IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTIgMS4wMTUgMS4wMTQgMS4wMTVoNi45MThjMC41NjMgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1Mi0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTh6IgogICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwIDEgLTEgMCAzNC4zNzIgLTYuOTExNSkiCiAgICAgICAgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBpZD0icmVjdDk0MiIKICAgICAgICAgICAgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAxMjc7ZmlsbDojZmZmZmZmIgogICAgICAgICAgICBkPSJtMjEuODYxIDEzLjIxNWMtMC41NjIgMC0xLjAxNSAwLjQ1My0xLjAxNSAxLjAxNXY2LjkxOGMwIDAuNTYyIDAuNDUzIDEuMDE1IDEuMDE1IDEuMDE1aDYuOTE4YzAuNTYyIDAgMS4wMTUtMC40NTMgMS4wMTUtMS4wMTV2LTYuOTE4YzAtMC41NjItMC40NTMtMS4wMTUtMS4wMTUtMS4wMTVoLTYuOTE4eiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAxIC0xIDAgMzQuMzcyIC02LjkxMTUpIgogICAgICAgIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgaWQ9InJlY3Q5NDMiCiAgICAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi4wMTI3O2ZpbGw6I2ZmZmZmZiIKICAgICAgICAgICAgZD0ibTMwLjgyMiAxMy4yMTVjLTAuNTYyIDAtMS4wMTUgMC40NTMtMS4wMTUgMS4wMTV2Ni45MThjMCAwLjU2MiAwLjQ1MyAxLjAxNSAxLjAxNSAxLjAxNWg2LjkxOGMwLjU2MiAwIDEuMDE1LTAuNDUzIDEuMDE1LTEuMDE1di02LjkxOGMwLTAuNTYyLTAuNDUzLTEuMDE1LTEuMDE1LTEuMDE1aC02LjkxOHoiCiAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAgMSAtMSAwIDM0LjM3MiAtNi45MTE1KSIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgIGlkPSJyZWN0OTQ0IgogICAgICAgICAgICBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMDEyNztmaWxsOiNmZmZmZmYiCiAgICAgICAgICAgIGQ9Im01Ljk4ODktMzEuNzg3Yy0wLjU2MjIgMC0xLjAxNDcgMC40NTMtMS4wMTQ3IDEuMDE1djYuOTE4YzAgMC41NjIgMC40NTI1IDEuMDE1IDEuMDE0NyAxLjAxNWg2LjkxODFjMC41NjIgMCAxLjAxNS0wLjQ1MyAxLjAxNS0xLjAxNXYtNi45MThjMC0wLjU2Mi0wLjQ1My0xLjAxNS0xLjAxNS0xLjAxNWgtNi45MTgxeiIKICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMCAxIC0xIDAgLTEuMjU5NiAwKSIKICAgICAgICAvPgogICAgICA8L2cKICAgICAgPgogICAgPC9nCiAgICA+CiAgPC9nCiAgPgogIDxtZXRhZGF0YQogICAgPgogICAgPHJkZjpSREYKICAgICAgPgogICAgICA8Y2M6V29yawogICAgICAgID4KICAgICAgICA8ZGM6Zm9ybWF0CiAgICAgICAgICA+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0CiAgICAgICAgPgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiCiAgICAgICAgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbi8iCiAgICAgICAgLz4KICAgICAgICA8ZGM6cHVibGlzaGVyCiAgICAgICAgICA+CiAgICAgICAgICA8Y2M6QWdlbnQKICAgICAgICAgICAgICByZGY6YWJvdXQ9Imh0dHA6Ly9vcGVuY2xpcGFydC5vcmcvIgogICAgICAgICAgICA+CiAgICAgICAgICAgIDxkYzp0aXRsZQogICAgICAgICAgICAgID5PcGVuY2xpcGFydDwvZGM6dGl0bGUKICAgICAgICAgICAgPgogICAgICAgICAgPC9jYzpBZ2VudAogICAgICAgICAgPgogICAgICAgIDwvZGM6cHVibGlzaGVyCiAgICAgICAgPgogICAgICA8L2NjOldvcmsKICAgICAgPgogICAgICA8Y2M6TGljZW5zZQogICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4vIgogICAgICAgID4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zI1JlcHJvZHVjdGlvbiIKICAgICAgICAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjRGlzdHJpYnV0aW9uIgogICAgICAgIC8+CiAgICAgICAgPGNjOnBlcm1pdHMKICAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNEZXJpdmF0aXZlV29ya3MiCiAgICAgICAgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"klickety,klickety\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"klickety.klickety\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Klickety\"\nLABEL oc.displayname=\"Klickety\"\nLABEL oc.path=\"/usr/games/klickety\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Klickety\"\nENV APPBIN \"/usr/games/klickety\"\nENV APP \"/usr/games/klickety\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/klickety/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/klickety/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Klickety

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Klickety.d\n
"},{"location":"applications/klickety/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Klickety.d -t Klickety .\n
"},{"location":"applications/klickety/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Klickety > Klickety.json\ndocker image save Klickety -o Klickety.tar\nctr -n k8s.io images import Klickety.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Klickety.json\n\n
"},{"location":"applications/klotski/","title":"klotski","text":""},{"location":"applications/klotski/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/klotski/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/klotski/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-klotski\n
"},{"location":"applications/klotski/#path","title":"Path","text":"
/usr/games/gnome-klotski\n
"},{"location":"applications/klotski/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/klotski/#wm_class","title":"WM_CLASS","text":"
gnome-klotski.Gnome-klotski\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/klotski/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/gnome-klotski.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/klotski/#json-dump","title":"JSON dump","text":"

json source file klotski.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-klotski\",\n    \"icon\": \"circle_gnome-klotski.svg\",\n    \"keyword\": \"gnome klotski,game klotski,klotski\",\n    \"launch\": \"gnome-klotski.Gnome-klotski\",\n    \"name\": \"klotski\",\n    \"host_config\": {\n        \"mem_limit\": \"384M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    },\n    \"path\": \"/usr/games/gnome-klotski\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/gnome-klotski.desktop\"\n}\n
"},{"location":"applications/klotski/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output klotski.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klotski.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klotski.d.3.0.json\n\n
"},{"location":"applications/klotski/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-klotski && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-klotski.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTYuOTMzIDE2LjkzMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcyBpZD0iZGVmczE4Ij4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA1OCI+CiAgIDxzdG9wIGlkPSJzdG9wMTA1NCIgc3RvcC1jb2xvcj0iIzEzNmRlMiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wMTA1NiIgc3RvcC1jb2xvcj0iIzI2YmJjZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA0MiI+CiAgIDxzdG9wIGlkPSJzdG9wMTAzOCIgc3RvcC1jb2xvcj0iI2ZmYjYzNiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wMTA0MCIgc3RvcC1jb2xvcj0iI2VlZWQ1MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjIiIHN0ZERldmlhdGlvbj0iMC4yMzgxMjAzMiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjkuMjYwMyIgeDI9IjkuMjYwMyIgeTE9Ii0uMjYyNDkiIHkyPSIxNS42MTIiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS43OTM4NCAuNzkxNjQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wNSIgc3RvcC1jb2xvcj0iIzJlMzIzZSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wNyIgc3RvcC1jb2xvcj0iIzUwNTY2NCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXIxMDMyIiB4PSItLjA2IiB5PSItLjA2IiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgaWQ9ImZlR2F1c3NpYW5CbHVyMTAzNCIgc3RkRGV2aWF0aW9uPSIwLjYiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA0NCIgeDE9IjM4LjgzOCIgeDI9IjM4Ljg3NSIgeTE9IjMxLjgyOSIgeTI9IjE1LjU5OCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNDIiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA1MiIgeDE9IjE2IiB4Mj0iMzEuMzU5IiB5MT0iMzkuMDQiIHkyPSIzOS4wNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNDIiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA2MCIgeDE9IjI5LjkxOSIgeDI9IjI5Ljk3NSIgeTE9IjM0Ljc2NyIgeTI9IjI1LjMzOSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDEwNTgiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTA2OCIgeDE9IjE3LjQ0MyIgeDI9IjE3LjcxIiB5MT0iMjIuNTAyIiB5Mj0iMTMuNDk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTA1OCIvPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlMjAiIGN4PSI4LjQ2NjUiIGN5PSI4LjQ2NjUiIHI9IjcuOTM3MyIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjk2Mjk5IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPGNpcmNsZSBpZD0iY2lyY2xlMjIiIGN4PSI4LjQ2NjUiIGN5PSI4LjQ2NjUiIHI9IjcuOTM3MyIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIuOTYyOTkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+CiA8ZyBpZD0iZzMzIiB0cmFuc2Zvcm09Im1hdHJpeCguMzM4NjYgMCAwIC4zMzg2NiAuNTA3OTkgLjUwNzk5KSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjEwMzIpIiBvcGFjaXR5PSIuMjUiPgogIDxwYXRoIGlkPSJwYXRoMjEiIGQ9Im0xNS4zMzIgMTRoNS4zMzZjMC43MzQgMCAxLjMzMiAwLjU5OCAxLjMzMiAxLjMzMnY1LjMzNmMwIDAuNzM0LTAuNTk4IDEuMzMyLTEuMzMyIDEuMzMyaC01LjMzNmMtMC43MzQgMC0xLjMzMi0wLjU5OC0xLjMzMi0xLjMzMnYtNS4zMzZjMC0wLjczNCAwLjU5OC0xLjMzMiAxLjMzMi0xLjMzMiIvPgogIDxwYXRoIGlkPSJwYXRoMjMiIGQ9Im0yNy4zMzIgMjZoNS4zMzZjMC43MzggMCAxLjMzMiAwLjU5OCAxLjMzMiAxLjMzMnY1LjMzNmMwIDAuNzM4LTAuNTk0IDEuMzMyLTEuMzMyIDEuMzMyaC01LjMzNmMtMC43MzQgMC0xLjMzMi0wLjU5NC0xLjMzMi0xLjMzMnYtNS4zMzZjMC0wLjczNCAwLjU5OC0xLjMzMiAxLjMzMi0xLjMzMiIvPgogIDxwYXRoIGlkPSJwYXRoMjUiIGQ9Im0xNCAyNGMtMS4xMDkgMC0yIDAuODkxLTIgMnY4YzAgMS4xMDkgMC44OTEgMiAyIDJoOGMxLjEwOSAwIDItMC44OTEgMi0ydi04YzAtMS4xMDktMC44OTEtMi0yLTJtLTggMWg4YzAuNTU1IDAgMSAwLjQ0NSAxIDF2OGMwIDAuNTU1LTAuNDQ1IDEtMSAxaC04Yy0wLjU1NSAwLTEtMC40NDUtMS0xdi04YzAtMC41NTUgMC40NDUtMSAxLTEiLz4KICA8cGF0aCBpZD0icGF0aDI3IiBkPSJtMTUgMjZoNmMwLjU1MSAwIDEgMC40NDkgMSAxdjZjMCAwLjU1MS0wLjQ0OSAxLTEgMWgtNmMtMC41NTEgMC0xLTAuNDQ5LTEtMXYtNmMwLTAuNTUxIDAuNDQ5LTEgMS0xIi8+CiAgPHBhdGggaWQ9InBhdGgyOSIgZD0ibTI2IDEyYy0xLjEwOSAwLTIgMC44OTEtMiAydjhjMCAxLjEwOSAwLjg5MSAyIDIgMmg4YzEuMTA5IDAgMi0wLjg5MSAyLTJ2LThjMC0xLjEwOS0wLjg5MS0yLTItMm0tOCAxaDhjMC41NTUgMCAxIDAuNDQ1IDEgMXY4YzAgMC41NTUtMC40NDUgMS0xIDFoLThjLTAuNTU1IDAtMS0wLjQ0NS0xLTF2LThjMC0wLjU1NSAwLjQ0NS0xIDEtMSIvPgogIDxwYXRoIGlkPSJwYXRoMzEiIGQ9Im0yNyAxNGg2YzAuNTUxIDAgMSAwLjQ0OSAxIDF2NmMwIDAuNTUxLTAuNDQ5IDEtMSAxaC02Yy0wLjU1MSAwLTEtMC40NDktMS0xdi02YzAtMC41NTEgMC40NDktMSAxLTEiLz4KIDwvZz4KIDxnIGlkPSJnNTkiIHRyYW5zZm9ybT0ibWF0cml4KC4zMzg2NiAwIDAgLjMzODY2IC4xNjkzMyAuMTY5MzMpIj4KICA8ZyBpZD0iZzU3Ij4KICAgPGcgaWQ9Imc1NSI+CiAgICA8cGF0aCBpZD0icGF0aDQzIiBkPSJtMTUuMzMyIDE0aDUuMzM2YzAuNzM0IDAgMS4zMzIgMC41OTggMS4zMzIgMS4zMzJ2NS4zMzZjMCAwLjczNC0wLjU5OCAxLjMzMi0xLjMzMiAxLjMzMmgtNS4zMzZjLTAuNzM0IDAtMS4zMzItMC41OTgtMS4zMzItMS4zMzJ2LTUuMzM2YzAtMC43MzQgMC41OTgtMS4zMzIgMS4zMzItMS4zMzIiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQxMDY4KSIvPgogICAgPHBhdGggaWQ9InBhdGg0NSIgZD0ibTI3LjMzMiAyNmg1LjMzNmMwLjczOCAwIDEuMzMyIDAuNTk4IDEuMzMyIDEuMzMydjUuMzM2YzAgMC43MzgtMC41OTQgMS4zMzItMS4zMzIgMS4zMzJoLTUuMzM2Yy0wLjczNCAwLTEuMzMyLTAuNTk0LTEuMzMyLTEuMzMydi01LjMzNmMwLTAuNzM0IDAuNTk4LTEuMzMyIDEuMzMyLTEuMzMyIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MTA2MCkiLz4KICAgIDxwYXRoIGlkPSJwYXRoNDciIHRyYW5zZm9ybT0ibWF0cml4KC43ODEyNSAwIDAgLjc4MTI1IC0uNSAtLjUpIiBkPSJtMTguNTYxIDMxLjM1OWMtMS40MTk1IDAtMi41NjA1IDEuMTQxLTIuNTYwNSAyLjU2MDV2MTAuMjRjMCAxLjQxOTUgMS4xNDEgMi41NjA1IDIuNTYwNSAyLjU2MDVoMTAuMjRjMS40MTk1IDAgMi41NTg2LTEuMTQxIDIuNTU4Ni0yLjU2MDV2LTEwLjI0YzAtMS40MTk1LTEuMTM5MS0yLjU2MDUtMi41NTg2LTIuNTYwNWgtMTAuMjR6bTAgMS4yODEyaDEwLjI0YzAuNzEwNCAwIDEuMjc5MyAwLjU2ODkgMS4yNzkzIDEuMjc5M3YxMC4yNGMwIDAuNzEwNC0wLjU2ODkgMS4yNzkzLTEuMjc5MyAxLjI3OTNoLTEwLjI0Yy0wLjcxMDQgMC0xLjI4MTItMC41Njg5LTEuMjgxMi0xLjI3OTN2LTEwLjI0YzAtMC43MTA0IDAuNTcwODUtMS4yNzkzIDEuMjgxMi0xLjI3OTN6bTEuMjc5MyAxLjI3OTNjLTAuNzA1MjggMC0xLjI3OTMgMC41NzQwMi0xLjI3OTMgMS4yNzkzdjcuNjgxNmMwIDAuNzA1MjggMC41NzQwMiAxLjI3OTMgMS4yNzkzIDEuMjc5M2g3LjY3OTdjMC43MDUyOCAwIDEuMjgxMi0wLjU3NDAyIDEuMjgxMi0xLjI3OTN2LTcuNjgxNmMwLTAuNzA1MjgtMC41NzU5Ny0xLjI3OTMtMS4yODEyLTEuMjc5M2gtNy42Nzk3eiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDEwNTIpIi8+CiAgICA8cGF0aCBpZD0icGF0aDUxIiB0cmFuc2Zvcm09Im1hdHJpeCguNzgxMjUgMCAwIC43ODEyNSAtLjUgLS41KSIgZD0ibTMzLjkyIDE2Yy0xLjQxOTUgMC0yLjU2MDUgMS4xNDEtMi41NjA1IDIuNTYwNXYxMC4yNGMwIDEuNDE5NSAxLjE0MSAyLjU1ODYgMi41NjA1IDIuNTU4NmgxMC4yNGMxLjQxOTUgMCAyLjU2MDUtMS4xMzkxIDIuNTYwNS0yLjU1ODZ2LTEwLjI0YzAtMS40MTk1LTEuMTQxLTIuNTYwNS0yLjU2MDUtMi41NjA1aC0xMC4yNHptMCAxLjI3OTNoMTAuMjRjMC43MTA0IDAgMS4yNzkzIDAuNTcwODUgMS4yNzkzIDEuMjgxMnYxMC4yNGMwIDAuNzEwNC0wLjU2ODkgMS4yNzkzLTEuMjc5MyAxLjI3OTNoLTEwLjI0Yy0wLjcxMDQgMC0xLjI3OTMtMC41Njg5LTEuMjc5My0xLjI3OTN2LTEwLjI0YzAtMC43MTA0IDAuNTY4OS0xLjI4MTIgMS4yNzkzLTEuMjgxMnptMS4yNzkzIDEuMjgxMmMtMC43MDUyOCAwLTEuMjc5MyAwLjU3NDAyLTEuMjc5MyAxLjI3OTN2Ny42Nzk3YzAgMC43MDUyOCAwLjU3NDAyIDEuMjgxMiAxLjI3OTMgMS4yODEyaDcuNjgxNmMwLjcwNTI4IDAgMS4yNzkzLTAuNTc1OTcgMS4yNzkzLTEuMjgxMnYtNy42Nzk3YzAtMC43MDUyOC0wLjU3NDAyLTEuMjc5My0xLjI3OTMtMS4yNzkzaC03LjY4MTZ6IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MTA0NCkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"klotski,gnome klotski,game klotski,klotski\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-klotski.desktop\"\nLABEL oc.launch=\"gnome-klotski.Gnome-klotski\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"klotski\"\nLABEL oc.displayname=\"klotski\"\nLABEL oc.path=\"/usr/games/gnome-klotski\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"384M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"klotski\"\nENV APPBIN \"/usr/games/gnome-klotski\"\nENV APP \"/usr/games/gnome-klotski\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/klotski/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/klotski/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application klotski

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/klotski.d\n
"},{"location":"applications/klotski/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f klotski.d -t klotski .\n
"},{"location":"applications/klotski/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect klotski > klotski.json\ndocker image save klotski -o klotski.tar\nctr -n k8s.io images import klotski.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @klotski.json\n\n
"},{"location":"applications/konsole/","title":"konsole","text":""},{"location":"applications/konsole/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/konsole/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/konsole/#alpine-packages","title":"Alpine packages","text":"
konsole, sudo\n
"},{"location":"applications/konsole/#path","title":"Path","text":"
/usr/bin/konsole\n
"},{"location":"applications/konsole/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/konsole/#wm_class","title":"WM_CLASS","text":"
konsole.konsole\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/konsole/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
"},{"location":"applications/konsole/#json-dump","title":"JSON dump","text":"

json source file konsole.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n    ],\n    \"icon\": \"konsole.svg\",\n    \"apkpackage\": \"konsole, sudo\",\n    \"keyword\": \"ksonsole,console,shell,bash,sh\",\n    \"launch\": \"konsole.konsole\",\n    \"name\": \"konsole\",\n    \"path\": \"/usr/bin/konsole\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"quick\": true\n}\n
"},{"location":"applications/konsole/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output konsole.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/konsole.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @konsole.d.3.0.json\n\n
"},{"location":"applications/konsole/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update konsole, sudo\nLABEL oc.icon=\"konsole.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyOCIgaGVpZ2h0PSIxMjgiPgogIDxkZWZzPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJvIiB4Mj0iMSIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMxMTEiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNTU1Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJuIiB4MT0iNTUuOTUiIHgyPSI1NS45NSIgeTE9IjgxIiB5Mj0iODAiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wODggMCAwIDEgMy4zNjQgMTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI0ZGRiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFRUUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0NCIgeDI9IjQ0IiB5MT0iNDQiIHkyPSI0MCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSIjRkZGIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0VFRUVFQyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjI0IiB4Mj0iMjQiIHkxPSI0MCIgeTI9IjIwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9IiNGRkYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRUVFRUVDIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iOSIgeDI9IjEwNi41NiIgeTE9IjI0LjMyIiB5Mj0iNTMuNjYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNTU1NzUzIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iLjYzIiBzdG9wLWNvbG9yPSIjMkUyRTJFIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzJFMkUyRSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjU2IiB4Mj0iNTYiIHkxPSI4MSIgeTI9IjciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wODIgMCAwIDEuMDE0IDMuNDMgNy45MDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI0JCQiIvPgogICAgICA8c3RvcCBvZmZzZXQ9Ii41OSIgc3RvcC1jb2xvcj0iIzlGOUY5RiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM4ODgiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJpIiB4MT0iMjQiIHgyPSIyNCIgeTE9IjQwIiB5Mj0iMjAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2IiIGlkPSJqIiB4MT0iNDQiIHgyPSI0NCIgeTE9IjQ0IiB5Mj0iNDAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2EiIGlkPSJsIiB4MT0iMjQiIHgyPSIyNCIgeTE9IjQwIiB5Mj0iMjAiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNCAxNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2MiIGlkPSJmIiB4MT0iOCIgeDI9IjEyMCIgeTE9IjQwLjY3IiB5Mj0iNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOCAwIC05LjE4OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8bGluZWFyR3JhZGllbnQgeGxpbms6aHJlZj0iI2QiIGlkPSJwIiB4MT0iNjQiIHgyPSI2NCIgeTE9IjE3LjM2IiB5Mj0iNjUuODciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMS4wOCAwIC05LjE4OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+CiAgICA8ZmlsdGVyIGlkPSJrIiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjQ4IiB4PSItLjEiIHk9Ii0uMiI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii40Ii8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9Im0iIHdpZHRoPSIxLjIyIiBoZWlnaHQ9IjEuMTciIHg9Ii0uMSIgeT0iLS4xIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjcyIi8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9ImUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjA4Ii8+CiAgICA8L2ZpbHRlcj4KICAgIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjUyIiBjeT0iLTMxIiByPSIxMzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50IGlkPSJjIiBjeD0iNTIiIGN5PSItMzEiIHI9IjEzNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNjNmM2YzYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIuNTIiIHN0b3AtY29sb3I9IiNFRUUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYzZjNmM2Ii8+CiAgICA8L3JhZGlhbEdyYWRpZW50PgogIDwvZGVmcz4KICA8cGF0aCBkPSJNMyAwQzEuNCAwIDAgMS40IDAgM3Y5MGMwIDEuNiAxLjQgMyAzIDNoMTA2YzEuNiAwIDMtMS40IDMtM1YzYzAtMS42LTEuNC0zLTMtM0gzeiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuNSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMzYgMCAwIDEuMTM1IDYgNykiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2YpIiBkPSJNMTEgOGMtMS42IDAtMyAxLjUtMyAzLjN2OTdjMCAyIDEuNCAzLjQgMyAzLjRoMTA2YzEuNiAwIDMtMS41IDMtMy4zdi05N2MwLTItMS40LTMuMy0zLTMuM0gxMXoiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2cpIiBkPSJNMTIgMTVjLS41IDAtMSAuNS0xIDF2NzNjMCAuNi41IDEgMSAxaDEwNGMuNSAwIDEtLjUgMS0xVjE2YzAtLjYtLjUtMS0xLTFIMTJ6Ii8+CiAgPHBhdGggZD0iTTEyIDE2aDEwNHY4MEgxMnoiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2gpIiBkPSJNMTAzIDc2YzAgMS42LTEuNCAzLTMgM0gxMmMtMS42IDAtMy0xLjQtMy0zVjEyYzAtMS42IDEuNC0zIDMtM2g4OGMxLjYgMCAzIDEuNCAzIDN2NjR6IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjA4NSAwIDAgMS4xMTQgMy4yMzQgNi45NykiLz4KICA8cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTMgNTNjNDItMjIuNCA4Mi4yLTI3LjYgMTAyLTI4LjdWMTdIMTN2MzZ6IiBvcGFjaXR5PSIuMDUiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI2kpIiBkPSJtMzYgNDgtMTYgOHYtNC4zTDMwLjcgNDYgMjAgNDAuM1YzNmwxNiA4LjNWNDh6IiBvcGFjaXR5PSIuOSIvPgogIDxwYXRoIGZpbGw9InVybCgjaikiIGQ9Ik01NiA2MEg0MHYtNGgxNnY0eiIgb3BhY2l0eT0iLjkiLz4KICA8cGF0aCBmaWxsPSIjZmZmIiBkPSJNNjAgNjBINDR2LTRoMTZ2NHoiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjIiIHRyYW5zZm9ybT0ibWF0cml4KDEuMTI1IDAgMCAxLjUgLTEwLjUgLTI5KSIvPgogIDxwYXRoIGZpbGw9InVybCgjbCkiIGQ9Im0zNiA0OC0xNiA4di00LjNMMzAuNyA0NiAyMCA0MC4zVjM2bDE2IDguM1Y0OHoiIGZpbHRlcj0idXJsKCNtKSIgb3BhY2l0eT0iLjQiLz4KICA8cGF0aCBmaWxsPSJ1cmwoI24pIiBkPSJtMTE3LjIgOTYuNy0uNi0uN0gxMmwtLjguNmMuMi4yLjUuNC44LjRoMTA0LjVjLjMgMCAuNSAwIC43LS4zeiIvPgogIDxnIGZpbGw9InVybCgjbykiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDggMTUpIj4KICAgIDxjaXJjbGUgY3g9IjEwMSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxMDQiIGN5PSI4OSIgcj0iMSIvPgogICAgPGNpcmNsZSBjeD0iMTAzIiBjeT0iOTIiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9Ijk3IiBjeT0iODYiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjEwMCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI4MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI3MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI2MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1OSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0OSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1MSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0OCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0NCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI0MCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzOSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyOSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzNSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIzMSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyOCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMSIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyNCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMyIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIyMCIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxMyIgY3k9Ijg2IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxOSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNiIgY3k9Ijg5IiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSIxNSIgY3k9IjkyIiByPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI5IiBjeT0iODYiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iODkiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjExIiBjeT0iOTIiIHI9IjEiLz4KICAgIDxjaXJjbGUgY3g9IjgiIGN5PSI4OSIgcj0iMSIvPgogIDwvZz4KICA8cGF0aCBmaWxsPSJ1cmwoI3ApIiBkPSJNMTEgOGMtMS42IDAtMyAxLjUtMyAzLjN2OTdjMCAxIC40IDIgMSAyLjZWMTIuM2MwLTEuOCAxLjMtMy4yIDMtMy4yaDEwNGMxLjcgMCAzIDEuNCAzIDMuMi43IDI1IDAgOTguMiAwIDk4LjJ2LjNjLjYtLjcgMS0xLjYgMS0yLjV2LTk3YzAtMS44LTEuNC0zLjItMy0zLjJIMTF6IiBvcGFjaXR5PSIuOSIvPgo8L3N2Zz4=\"\nLABEL oc.keyword=\"konsole,ksonsole,console,shell,bash,sh\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"konsole.konsole\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"konsole\"\nLABEL oc.displayname=\"konsole\"\nLABEL oc.path=\"/usr/bin/konsole\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"konsole\"\nENV APPBIN \"/usr/bin/konsole\"\nENV APP \"/usr/bin/konsole\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/konsole/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/konsole/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application konsole

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/konsole.d\n
"},{"location":"applications/konsole/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f konsole.d -t konsole .\n
"},{"location":"applications/konsole/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect konsole > konsole.json\ndocker image save konsole -o konsole.tar\nctr -n k8s.io images import konsole.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @konsole.json\n\n
"},{"location":"applications/ksquares/","title":"kSquares","text":""},{"location":"applications/ksquares/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu

"},{"location":"applications/ksquares/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/ksquares/#ubuntu-packages","title":"Ubuntu packages","text":"
dbus-x11 dbus-user-session ksquares\n
"},{"location":"applications/ksquares/#path","title":"Path","text":"
/usr/games/ksquares\n
"},{"location":"applications/ksquares/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/ksquares/#wm_class","title":"WM_CLASS","text":"
ksquares.ksquares\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/ksquares/#json-dump","title":"JSON dump","text":"

json source file ksquares.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"dbus-x11 dbus-user-session ksquares\",\n    \"icon\": \"ksquares.svg\",\n    \"keyword\": \"ksquares\",\n    \"launch\": \"ksquares.ksquares\",\n    \"name\": \"kSquares\",\n    \"path\": \"/usr/games/ksquares\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu\"\n}\n
"},{"location":"applications/ksquares/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output ksquares.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/ksquares.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @ksquares.d.3.0.json\n\n
"},{"location":"applications/ksquares/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus-x11 dbus-user-session ksquares && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"ksquares.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTowLjIiIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCIgeD0iLTMxIiB5PSItMzAiIHJ4PSIxLjQiIHJ5PSIxLjQiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHg9Ii0zMCIgeT0iLTMwIiByeD0iMS40IiByeT0iMS40IiB0cmFuc2Zvcm09Im1hdHJpeCgwLC0xLC0xLDAsMCwwKSIgc3R5bGU9ImZpbGw6IzhlOGU4ZSIvPgogPHBhdGggc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzNmM2YzZjtzdHJva2Utd2lkdGg6MiIgZD0iTSA2LDIwIEggMTYgViAxMiBIIDI2Ii8+CiA8cGF0aCBkPSJtIDE2LDExIGEgMiwyIDAgMCAwIC0yLDIgMiwyIDAgMCAwIDIsMiAyLDIgMCAwIDAgMiwtMiAyLDIgMCAwIDAgLTIsLTIgeiBtIDEwLDAgYSAyLDIgMCAwIDAgLTIsMiAyLDIgMCAwIDAgMiwyIDIsMiAwIDAgMCAyLC0yIDIsMiAwIDAgMCAtMiwtMiB6IE0gNiwxOSBhIDIsMiAwIDAgMCAtMiwyIDIsMiAwIDAgMCAyLDIgMiwyIDAgMCAwIDIsLTIgMiwyIDAgMCAwIC0yLC0yIHogbSAxMCwwIGEgMiwyIDAgMCAwIC0yLDIgMiwyIDAgMCAwIDIsMiAyLDIgMCAwIDAgMiwtMiAyLDIgMCAwIDAgLTIsLTIgeiIgc3R5bGU9Im9wYWNpdHk6MC4yIi8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmIiBkPSJNIDE2IDEwIEEgMiAyIDAgMCAwIDE0IDEyIEEgMiAyIDAgMCAwIDE2IDE0IEEgMiAyIDAgMCAwIDE4IDEyIEEgMiAyIDAgMCAwIDE2IDEwIHogTSAyNiAxMCBBIDIgMiAwIDAgMCAyNCAxMiBBIDIgMiAwIDAgMCAyNiAxNCBBIDIgMiAwIDAgMCAyOCAxMiBBIDIgMiAwIDAgMCAyNiAxMCB6IE0gNiAxOCBBIDIgMiAwIDAgMCA0IDIwIEEgMiAyIDAgMCAwIDYgMjIgQSAyIDIgMCAwIDAgOCAyMCBBIDIgMiAwIDAgMCA2IDE4IHogTSAxNiAxOCBBIDIgMiAwIDAgMCAxNCAyMCBBIDIgMiAwIDAgMCAxNiAyMiBBIDIgMiAwIDAgMCAxOCAyMCBBIDIgMiAwIDAgMCAxNiAxOCB6Ii8+CiA8cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmO29wYWNpdHk6MC4xIiBkPSJNIDMuNDAwMzkwNiAyIEMgMi42MjQ3OTA2IDIgMiAyLjYyNDc5MDYgMiAzLjQwMDM5MDYgTCAyIDQuNDAwMzkwNiBDIDIgMy42MjQ3OTA2IDIuNjI0NzkwNiAzIDMuNDAwMzkwNiAzIEwgMjguNTk5NjA5IDMgQyAyOS4zNzUyMDkgMyAzMCAzLjYyNDc5MDYgMzAgNC40MDAzOTA2IEwgMzAgMy40MDAzOTA2IEMgMzAgMi42MjQ3OTA2IDI5LjM3NTIwOSAyIDI4LjU5OTYwOSAyIEwgMy40MDAzOTA2IDIgeiIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"ksquares,ksquares\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"ksquares.ksquares\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu\"\nLABEL oc.name=\"kSquares\"\nLABEL oc.displayname=\"kSquares\"\nLABEL oc.path=\"/usr/games/ksquares\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kSquares\"\nENV APPBIN \"/usr/games/ksquares\"\nENV APP \"/usr/games/ksquares\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/ksquares/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/ksquares/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application kSquares

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kSquares.d\n
"},{"location":"applications/ksquares/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f kSquares.d -t kSquares .\n
"},{"location":"applications/ksquares/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect kSquares > kSquares.json\ndocker image save kSquares -o kSquares.tar\nctr -n k8s.io images import kSquares.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kSquares.json\n\n
"},{"location":"applications/kturtle/","title":"kTurtle","text":""},{"location":"applications/kturtle/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/kturtle/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/kturtle/#alpine-packages","title":"Alpine packages","text":"
kturtle mesa-dri-gallium\n
"},{"location":"applications/kturtle/#path","title":"Path","text":"
/usr/bin/kturtle\n
"},{"location":"applications/kturtle/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/kturtle/#wm_class","title":"WM_CLASS","text":"
kturtle.kturtle\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/kturtle/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.kde.kturtle.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/kturtle/#json-dump","title":"JSON dump","text":"

json source file kturtle.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"kturtle mesa-dri-gallium\",\n    \"icon\": \"kturtle.svg\",\n    \"keyword\": \"kturtle\",\n    \"launch\": \"kturtle.kturtle\",\n    \"name\": \"kTurtle\",\n    \"path\": \"/usr/bin/kturtle\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.kturtle.desktop\"\n}\n
"},{"location":"applications/kturtle/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output kturtle.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kturtle.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kturtle.d.3.0.json\n\n
"},{"location":"applications/kturtle/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update kturtle mesa-dri-gallium\nLABEL oc.icon=\"kturtle.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZlcnNpb249IjEuMCIKICAgeD0iMC4wMDAwMDAwIgogICB5PSIwLjAwMDAwMDAiCiAgIHdpZHRoPSIyNTYuMDAwMDAiCiAgIGhlaWdodD0iMjU2LjAwMDAwIgogICB2aWV3Qm94PSIwIDAgMjU2IDI1NiIKICAgaWQ9InN2ZzE0MzIiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiPjxkZWZzCiAgIGlkPSJkZWZzMTUzNiI+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDc4NSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwNjdhMDc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMCIKICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgaWQ9InN0b3A0Nzg3IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYTllZWE4O3N0b3Atb3BhY2l0eTowLjc1NjM0NTE1IgogICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICBpZD0ic3RvcDQ3ODkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICB4MT0iLTIwMi40NjUxMiIKICAgICB5MT0iNTIuMDQ2NTUxIgogICAgIHgyPSItNzYuMjUyMzEyIgogICAgIHkyPSIyNDguMzc1MzciCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDc5MSIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0Nzg1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wNTczMTAsMC4wMDAwMDAsMC4wMDAwMDAsMS4wNTczMTAsMjk4LjE2MzUsNy4wMjA2MTMpIiAvPjwvZGVmcz4KCQo8cGF0aAogICBkPSJNIDEwNy41Mjg0MCw1LjE3MDM2MzMgTCAxMDcuNTI4NDAsMjUuNjQxOTY5IEwgODcuMDU2ODAwLDI1LjY0MTk2OSBMIDg3LjA1NjgwMCw0Ni4xMTM1NzUgTCA4Ny4wNTY4MDAsNjYuNTg1MTgxIEwgMTA3LjUyODQwLDY2LjU4NTE4MSBMIDEwNy41Mjg0MCw4Ny4wNTY3ODYgTCA4Ny4wNTY4MDAsODcuMDU2Nzg2IEwgODcuMDU2ODAwLDEwNy41MjgzOSBMIDY2LjU4NTE5NCwxMDcuNTI4MzkgTCA2Ni41ODUxOTQsMTI4LjAwMDAwIEwgNDYuMTEzNTg4LDEyOC4wMDAwMCBMIDQ2LjExMzU4OCwxNDguNDcxNjEgTCA0Ni4xMTM1ODgsMTY4Ljk0MzIwIEwgNDYuMTEzNTg4LDE4OS40MTQ4MiBMIDY2LjU4NTE5NCwxODkuNDE0ODIgTCA2Ni41ODUxOTQsMjA5Ljg4NjQxIEwgODcuMDU2ODAwLDIwOS44ODY0MSBMIDg3LjA1NjgwMCwyMzAuMzU4MDMgTCAxMDcuNTI4NDAsMjMwLjM1ODAzIEwgMTI4LjAwMDAwLDIzMC4zNTgwMyBMIDE0OC40NzE2MSwyMzAuMzU4MDMgTCAxNjguOTQzMjAsMjMwLjM1ODAzIEwgMTY4Ljk0MzIwLDIwOS44ODY0MSBMIDE4OS40MTQ4MywyMDkuODg2NDEgTCAxODkuNDE0ODMsMTg5LjQxNDgyIEwgMjA5Ljg4NjQzLDE4OS40MTQ4MiBMIDIwOS44ODY0MywxNjguOTQzMjAgTCAyMDkuODg2NDMsMTQ4LjQ3MTYxIEwgMjA5Ljg4NjQzLDEyOC4wMDAwMCBMIDE4OS40MTQ4MywxMjguMDAwMDAgTCAxODkuNDE0ODMsMTA3LjUyODM5IEwgMTY4Ljk0MzIwLDEwNy41MjgzOSBMIDE2OC45NDMyMCw4Ny4wNTY3ODYgTCAxNDguNDcxNjEsODcuMDU2Nzg2IEwgMTQ4LjQ3MTYxLDY2LjU4NTE4MSBMIDE2OC45NDMyMCw2Ni41ODUxODEgTCAxNjguOTQzMjAsNDYuMTEzNTc1IEwgMTY4Ljk0MzIwLDI1LjY0MTk2OSBMIDE0OC40NzE2MSwyNS42NDE5NjkgTCAxNDguNDcxNjEsNS4xNzAzNjMzIEwgMTI4LjAwMDAwLDUuMTcwMzYzMyBMIDEwNy41Mjg0MCw1LjE3MDM2MzMgeiBNIDE4OS40MTQ4MywxMDcuNTI4MzkgTCAyMDkuODg2NDMsMTA3LjUyODM5IEwgMjA5Ljg4NjQzLDg3LjA1Njc4NiBMIDIzMC4zNTgwMiw4Ny4wNTY3ODYgTCAyMzAuMzU4MDIsNjYuNTg1MTgxIEwgMjA5Ljg4NjQzLDY2LjU4NTE4MSBMIDE4OS40MTQ4Myw2Ni41ODUxODEgTCAxODkuNDE0ODMsODcuMDU2Nzg2IEwgMTg5LjQxNDgzLDEwNy41MjgzOSB6IE0gMTg5LjQxNDgzLDIwOS44ODY0MSBMIDE4OS40MTQ4MywyMzAuMzU4MDMgTCAxODkuNDE0ODMsMjUwLjgyOTY0IEwgMjA5Ljg4NjQzLDI1MC44Mjk2NCBMIDIzMC4zNTgwMiwyNTAuODI5NjQgTCAyMzAuMzU4MDIsMjMwLjM1ODAzIEwgMjA5Ljg4NjQzLDIzMC4zNTgwMyBMIDIwOS44ODY0MywyMDkuODg2NDEgTCAxODkuNDE0ODMsMjA5Ljg4NjQxIHogTSA2Ni41ODUxOTQsMjA5Ljg4NjQxIEwgNDYuMTEzNTg4LDIwOS44ODY0MSBMIDQ2LjExMzU4OCwyMzAuMzU4MDMgTCAyNS42NDE5ODMsMjMwLjM1ODAzIEwgMjUuNjQxOTgzLDI1MC44Mjk2NCBMIDQ2LjExMzU4OCwyNTAuODI5NjQgTCA2Ni41ODUxOTQsMjUwLjgyOTY0IEwgNjYuNTg1MTk0LDIzMC4zNTgwMyBMIDY2LjU4NTE5NCwyMDkuODg2NDEgeiBNIDY2LjU4NTE5NCwxMDcuNTI4MzkgTCA2Ni41ODUxOTQsODcuMDU2Nzg2IEwgNjYuNTg1MTk0LDY2LjU4NTE4MSBMIDQ2LjExMzU4OCw2Ni41ODUxODEgTCAyNS42NDE5ODMsNjYuNTg1MTgxIEwgMjUuNjQxOTgzLDg3LjA1Njc4NiBMIDQ2LjExMzU4OCw4Ny4wNTY3ODYgTCA0Ni4xMTM1ODgsMTA3LjUyODM5IEwgNjYuNTg1MTk0LDEwNy41MjgzOSB6ICIKICAgc3R5bGU9Im9wYWNpdHk6MS4wMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQ3OTEpO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjguNDk5OTk4MTtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO292ZXJmbG93OnZpc2libGUiCiAgIGlkPSJwYXRoNDA1NyIgLz48L3N2Zz4=\"\nLABEL oc.keyword=\"kturtle,kturtle\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.kturtle.desktop\"\nLABEL oc.launch=\"kturtle.kturtle\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"kTurtle\"\nLABEL oc.displayname=\"kTurtle\"\nLABEL oc.path=\"/usr/bin/kturtle\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"kTurtle\"\nENV APPBIN \"/usr/bin/kturtle\"\nENV APP \"/usr/bin/kturtle\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/kturtle/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/kturtle/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application kTurtle

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/kTurtle.d\n
"},{"location":"applications/kturtle/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f kTurtle.d -t kTurtle .\n
"},{"location":"applications/kturtle/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect kTurtle > kTurtle.json\ndocker image save kTurtle -o kTurtle.tar\nctr -n k8s.io images import kTurtle.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @kTurtle.json\n\n
"},{"location":"applications/leocad/","title":"Leocad","text":""},{"location":"applications/leocad/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/leocad/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/leocad/#ubuntu-packages","title":"Ubuntu packages","text":"
leocad\n
"},{"location":"applications/leocad/#arguments","title":"Arguments","text":"

\"-l /usr/bin/leocad.library.bin\"

"},{"location":"applications/leocad/#path","title":"Path","text":"
/usr/bin/leocad\n
"},{"location":"applications/leocad/#mimetype","title":"Mimetype","text":"
application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\n
"},{"location":"applications/leocad/#file-extensions","title":"File extensions","text":"

\"lcd\"

"},{"location":"applications/leocad/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"lcd\"

"},{"location":"applications/leocad/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/leocad/#wm_class","title":"WM_CLASS","text":"
leocad.Leocad\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/leocad/#json-dump","title":"JSON dump","text":"

json source file leocad.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"args\": \"-l /usr/bin/leocad.library.bin\",\n    \"cat\": \"games\",\n    \"debpackage\": \"leocad\",\n    \"icon\": \"leocad.svg\",\n    \"keyword\": \"cad,lego\",\n    \"launch\": \"leocad.Leocad\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"Leocad\",\n    \"path\": \"/usr/bin/leocad\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\",\n    \"fileextensions\": \"lcd\",\n    \"legacyfileextensions\": \"lcd\"\n}\n
"},{"location":"applications/leocad/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output leocad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/leocad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @leocad.d.3.0.json\n\n
"},{"location":"applications/leocad/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends leocad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"leocad.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSIwIiB4MT0iMjcuNDU2IiB5MT0iNDcuMzkiIHgyPSIyNi40NDIiIHkyPSIxLjAxNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNlMWUxZTEiLz48c3RvcCBzdG9wLWNvbG9yPSIjZjRmNGZmIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iMSIgeDE9IjI0LjE0IiB5MT0iNDAuNjgzIiB4Mj0iMjMuODYiIHkyPSI2LjMxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2M1MjgyOCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZjU0NTQiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxwYXRoIGQ9Im0yLjk4LS4wMDJoNDIuMDRjMS42NTIgMCAyLjk4MiAxLjMzIDIuOTgyIDIuOTgydjQyLjA0YzAgMS42NTItMS4zMyAyLjk4Mi0yLjk4MiAyLjk4MmgtNDIuMDRjLTEuNjUyIDAtMi45ODItMS4zMy0yLjk4Mi0yLjk4MnYtNDIuMDRjMC0xLjY1MiAxLjMzLTIuOTgyIDIuOTgyLTIuOTgyIiBmaWxsPSJ1cmwoIzApIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBkPSJtMjQuMTcgN2MtMS43MSAwLTIuOTk5Ljc0NS0zIDEuNzMydjEuMjU0Yy0uMDI2LjAwMS0uMDUzLjAwOS0uMDc4LjAyMWwtMS45MzggMWMtLjA4My4wNDMtLjE1Mi4xMDItLjIwOS4xNjgtLjQ5MS0uMjAyLTEuMDk2LS4zMjItMS43NzMtLjMyMi0xLjcwOSAwLTIuOTk4Ljc0My0yLjk5OCAxLjczdjEuMDY4Yy0uMTA4LjAwMy0uMjE2LjAyMy0uMzE2LjA3OGwtMy43MDEgMi4wMWMtLjEyOC4wNjktLjIxNC4xNzctLjI3Ny4yOTctLjAxOC4wMjctLjAyOS4wNTMtLjA0My4wODItLjAxMi4wMzQtLjAyLjA2Ny0uMDI3LjEwMi0uMDIuMDY2LS4wNTMuMTI4LS4wNTMuMTk5djE2LjI5M2MwIC4yNTUuMTM4LjQ5MS4zNjEuNjE3bDEzLjQ1OSA3LjU3NmMuMDA5LjAwNS4wMi4wMDMuMDI5LjAwOC4wOTEuMDQ2LjE4OS4wNzIuMjg5LjA3Ni4wMDEgMCAuMDE5LjAwOC4wMjkuMDA4LjA4OSAwIC4xNzEtLjAzOC4yNTQtLjA3LjAzLS4wMTIuMDY1LS4wMDcuMDk0LS4wMjNsLjAwNC0uMDAyYy4wMDItLjAwMDEuMDA0LS4wMDAxLjAwNi0uMDAyLjAwMi0uMDAwMS4wMDItLjAwMy4wMDQtLjAwNGwxMy41OC03LjYyNWMuMjI0LS4xMjUuMzYxLS4zNjIuMzYxLS42MTdsLjAxNC0xNi4yMDVjMC0uMjUxLS4xMzItLjQ4NS0uMzUtLjYxMS0uMDIzLS4wMTQtLjA1Mi0uMDExLS4wNzYtLjAyMS0uMDMyLS4wMjUtLjA1NS0uMDU2LS4wOTItLjA3NmwtMy43MDMtMi4wMWMtLjAxNi0uMDA5LS4wMzMtLjAwOC0uMDQ5LS4wMTZ2LTEuMTQzYzAtLjk4OC0xLjI4OS0xLjczMi0yLjk5OC0xLjczMi0uNzI2IDAtMS4zNjcuMTM5LTEuODc1LjM2OS0uMDM1LS4wMjgtLjA2NC0uMDYyLS4xMDUtLjA4NGwtMS43NjItLjkxYy0uMDItLjAwMS0uMDQyLS4wMDktLjA2My0uMDE4di0xLjQ2NWMwLS45ODgtMS4yODktMS43MzItMi45OTgtMS43MzJtLTEuOTM4IDMuMDYzYy41MTcuMjQ4IDEuMTgxLjM5OCAxLjkzOC4zOTguNzU2IDAgMS40MTktLjE1MSAxLjkzNi0uMzk4djEuOTYzYzAgLjIwNS0uNzMxLjY3LTEuOTM2LjY3LTEuMjA1IDAtMS45MzgtLjQ2NS0xLjkzOC0uNjd2LTEuOTYzbS0xLjA2MyAxLjQ5OHYuNDY1YzAgLjk4NyAxLjI5IDEuNzMgMyAxLjczIDEuNzExIDAgMi45OTktLjc0MyAyLjk5OC0xLjczdi0uMjVsLjg2MS40NDVjLS4wMzcuMTEzLS4wNTcuMjMtLjA1Ny4zNTJ2My4yOTNjMCAuOTg3IDEuMjkgMS43MyAzIDEuNzMgMS43MSAwIDIuOTk5LS43NDMgMi45OTgtMS43M3YtLjU1MWwyLjEgMS4xNDMtMTIuMTQzIDYuNzk5LTEyLjA0LTYuODQyIDIuMjkxLTEuMjQ2di43MDljMCAuOTg3IDEuMjg5IDEuNzMyIDIuOTk4IDEuNzMyIDEuNzA5IDAgMi45OTgtLjc0NSAyLjk5OC0xLjczMnYtMy4yOTNjMC0uMTU5LS4wNDQtLjMwOS0uMTA3LS40NTNsMS4xMDctLjU3bTcuODY1IDIuMzQyYy41MTYuMjQ4IDEuMTgxLjQgMS45MzguNC43NTYgMCAxLjQxOS0uMTUzIDEuOTM2LS40djEuOTYzYzAgLjE5NC0uNjc4LjY2OC0xLjkzNi42NjgtMS4yMDUgMC0xLjkzOC0uNDYzLTEuOTM4LS42Njh2LTEuOTYzbS0xMy44MDEuMDEyYy41MTcuMjQ4IDEuMTgxLjQgMS45MzguNC43NTUgMCAxLjQxOS0uMTUxIDEuOTM2LS4zOTh2MS45NjFjMCAuMTk0LS42NzguNjctMS45MzYuNjctMS4yNTggMC0xLjkzOC0uNDc2LTEuOTM4LS42N3YtMS45NjNtOC44OTEuNzIxYy0xLjcwOSAwLTMgLjc0NS0zIDEuNzMydjMuMjkzYzAgLjk4NyAxLjI5MSAxLjczMiAzIDEuNzMyIDEuNzA5IDAgMi45OTYtLjc0NSAyLjk5Ni0xLjczMnYtMy4yOTNjMC0uOTg3LTEuMjg3LTEuNzMyLTIuOTk2LTEuNzMybS0xLjkzOCAzLjA2MmMuNTE3LjI0OCAxLjE4MS40IDEuOTM4LjQuNzU1IDAgMS40MTgtLjE1MSAxLjkzNC0uMzk4djEuOTYxYzAgLjE5NC0uNjc2LjY3LTEuOTM0LjY3LTEuMjA1IDAtMS45MzgtLjQ2NS0xLjkzOC0uNjd2LTEuOTYzIiBmaWxsPSJ1cmwoIzEpIi8+PC9zdmc+Cg==\"\nLABEL oc.keyword=\"leocad,cad,lego\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"leocad.Leocad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"-l /usr/bin/leocad.library.bin\"\nLABEL oc.name=\"Leocad\"\nLABEL oc.displayname=\"Leocad\"\nLABEL oc.path=\"/usr/bin/leocad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.leocad;application/x-ldraw;application/x-multi-part-ldraw;application/x-ldlite;\"\nLABEL oc.fileextensions=\"lcd\"\nLABEL oc.legacyfileextensions=\"lcd\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Leocad\"\nENV APPBIN \"/usr/bin/leocad\"\nLABEL oc.args=\"-l /usr/bin/leocad.library.bin\"\nENV APP \"/usr/bin/leocad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/leocad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/leocad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Leocad

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Leocad.d\n
"},{"location":"applications/leocad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Leocad.d -t Leocad .\n
"},{"location":"applications/leocad/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Leocad > Leocad.json\ndocker image save Leocad -o Leocad.tar\nctr -n k8s.io images import Leocad.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Leocad.json\n\n
"},{"location":"applications/librecad/","title":"LibreCAD","text":""},{"location":"applications/librecad/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/librecad/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/librecad/#ubuntu-packages","title":"Ubuntu packages","text":"
librecad\n
"},{"location":"applications/librecad/#path","title":"Path","text":"
/usr/bin/librecad\n
"},{"location":"applications/librecad/#mimetype","title":"Mimetype","text":"
image/vnd.dxf;\n
"},{"location":"applications/librecad/#file-extensions","title":"File extensions","text":"

\"dxf;dwg\"

"},{"location":"applications/librecad/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"dxf;dwg\"

"},{"location":"applications/librecad/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/librecad/#wm_class","title":"WM_CLASS","text":"
librecad.Librecad\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/librecad/#json-dump","title":"JSON dump","text":"

json source file librecad.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"librecad\",\n    \"icon\": \"librecad.svg\",\n    \"keyword\": \"librecad,modeling\",\n    \"launch\": \"librecad.Librecad\",\n    \"name\": \"LibreCAD\",\n    \"path\": \"/usr/bin/librecad\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"image/vnd.dxf;\",\n    \"fileextensions\": \"dxf;dwg\",\n    \"legacyfileextensions\": \"dxf;dwg\"\n}\n
"},{"location":"applications/librecad/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output librecad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/librecad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @librecad.d.3.0.json\n\n
"},{"location":"applications/librecad/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends librecad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"librecad.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIj48dGl0bGU+TGlicmVDQUQgSWNvbjwvdGl0bGU+PHBhdGggZmlsbD0iIzhlZDkwMCIgZD0iTTAgMGgxMi4xMzh2MTIuMTRIMHoiLz48cGF0aCBmaWxsPSIjOGVkOTAwIiBkPSJNMCA4Ny44NjJoMTIuMTM4djEyLjE0SDB6Ii8+PHBhdGggZmlsbD0iIzhlZDkwMCIgZD0iTTg3Ljg2IDBIMTAwdjEyLjE0SDg3Ljg2eiIvPjxwYXRoIGZpbGw9IiM4ZWQ5MDAiIGQ9Ik04Ny44NiA4Ny44NjJIMTAwdjEyLjE0SDg3Ljg2eiIvPjxwYXRoIGQ9Ik01MCAuMDMyQzIyLjM4Ni4wMzIgMCAyMi4zODYgMCA1MGMwIDI3LjYxNSAyMi4zODYgNTAgNTAgNTBzNTAtMjIuMzg1IDUwLTUwQzEwMCAyMi4zODYgNzcuNjE0LjAzMiA1MCAuMDMyem0wIDEyYzIwLjk4NyAwIDM4IDE2Ljk4MiAzOCAzNy45NjggMCAyMC45ODctMTcuMDEzIDM4LjAzMi0zOCAzOC4wMzItMjAuOTg2IDAtMzgtMTcuMDQ1LTM4LTM4LjAzMiAwLTIwLjk4NiAxNy4wMTQtMzcuOTY4IDM4LTM3Ljk2OHoiIGZpbGw9IiM4ZWQ5MDAiLz48cGF0aCBmaWxsPSIjNGQ0ZDRkIiBkPSJNMTAwIDU2SDI0djZIMFYzOGgyNHY2aDc2eiIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"librecad,librecad,modeling\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"librecad.Librecad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"LibreCAD\"\nLABEL oc.displayname=\"LibreCAD\"\nLABEL oc.path=\"/usr/bin/librecad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/vnd.dxf;\"\nLABEL oc.fileextensions=\"dxf;dwg\"\nLABEL oc.legacyfileextensions=\"dxf;dwg\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"LibreCAD\"\nENV APPBIN \"/usr/bin/librecad\"\nENV APP \"/usr/bin/librecad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/librecad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/librecad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application LibreCAD

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/LibreCAD.d\n
"},{"location":"applications/librecad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f LibreCAD.d -t LibreCAD .\n
"},{"location":"applications/librecad/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect LibreCAD > LibreCAD.json\ndocker image save LibreCAD -o LibreCAD.tar\nctr -n k8s.io images import LibreCAD.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @LibreCAD.json\n\n
"},{"location":"applications/list/","title":"Application list","text":"

This array describe the application list ready to use with abcdesktop.

icon displayname comment description json file 2048 (alpine gtk) Obtain the 2048 tile 2048-alpine.md 2048-alpine.d.3.0.json 2048 (ubuntu qt) The 2048 number game implemented in Qt 2048-ubuntu.md 2048-ubuntu.d.3.0.json Apache Directory Studio no comment apachedirectorystudio.md apachedirectorystudio.d.3.0.json astromenace hardcore 3D space shooter with spaceship upgrade possibilities astromenace.md astromenace.d.3.0.json Base Manage databases, create queries and reports to track and manage your information by using Base. base.md base.d.3.0.json Beekeeper-studio An easy-to use SQL query editor and database UI for Mac, Windows, and Linux beekeeperstudio.md beekeeperstudio.d.3.0.json Blender 3D modeling, animation, rendering and post-production blender.md blender.d.3.0.json Bless Edit binary files bless.md bless.d.3.0.json blobby no comment blobby.md blobby.d.3.0.json Gnome-boxes View and use virtual machines boxes.md boxes.d.3.0.json Brackets no comment brackets.md brackets.d.3.0.json calculator Perform arithmetic, scientific or financial calculations calculator.md calculator.d.3.0.json chess Play the classic two-player board game of chess chess.md chess.d.3.0.json Chrome Access the Internet chrome.md chrome.d.3.0.json chromium (alpine) no comment chromium.md chromium.d.3.0.json citrix-client no comment citrix.md citrix.d.3.0.json Cloud Foundry cli no comment cloudfoundry.md cloudfoundry.d.3.0.json cmd.exe wine (alpine) no comment cmd.exe.md cmd.exe.d.3.0.json corsix-th Open source clone of Theme Hospital corsix-th.md corsix-th.d.3.0.json cuda Use the command line cuda.md cuda.d.3.0.json cuda demo Use the command line cudademo.md cudademo.d.3.0.json cuda developper Use the command line cudadev.md cudadev.d.3.0.json Dia Edit your Diagrams dia.md dia.d.3.0.json Doom no comment doom.md doom.d.3.0.json Draw Create and edit drawings, flow charts and logos by using Draw. draw.md draw.d.3.0.json draw.io draw.io desktop drawio.md drawio.d.3.0.json Microsoft Edge Access the Internet edge.md edge.d.3.0.json eog Browse and rotate images eog.md eog.d.3.0.json Evince View multi-page documents evince.md evince.d.3.0.json Evolution Manage your email, contacts and schedule evolution.md evolution.d.3.0.json file-roller Create and modify an archive file-roller.md file-roller.d.3.0.json Filelight View disk usage information filelight.md filelight.d.3.0.json filezilla (alpine) Download and upload files via FTP, FTPS and SFTP filezilla.md filezilla.d.3.0.json Firefox (esr alpine) Browse the World Wide Web firefox-esr.md firefox-esr.d.3.0.json Firefox (alpine) Browse the World Wide Web firefox.md firefox.d.3.0.json flare A single player, 2D-isometric, action Role-Playing Game flare.md flare.d.3.0.json frozen-bubble no comment frozen-bubble.md frozen-bubble.d.3.0.json GCompris no comment gcompris.md gcompris.d.3.0.json Geany A fast and lightweight IDE using GTK+ geany.md geany.d.3.0.json Gedit no comment gedit.md gedit.d.3.0.json gElemental View the periodic table of elements gelemental.md gelemental.d.3.0.json Geogebra no comment geogebra.md geogebra.d.3.0.json Gimp Create images and edit photographs gimp.md gimp.d.3.0.json Gnumerix (alpine) Calculation, Analysis, and Visualization of Information gnumeric.md gnumeric.d.3.0.json Golly no comment golly.md golly.d.3.0.json hyper A terminal built on web technologies hyper.md hyper.d.3.0.json Impress Create and edit presentations for slideshows, meeting and Web pages by using Impress. impress.md impress.d.3.0.json inkscape no comment inkscape.md inkscape.d.3.0.json jupyter Use the command line jupyter.md jupyter.d.3.0.json jupyter nvidia Use the command line jupyternvidia.md jupyternvidia.d.3.0.json Kalzium KDE Periodic Table of Elements kalzium.md kalzium.d.3.0.json kDiamond no comment kdiamond.md kdiamond.d.3.0.json Kgeography A Geography Learning Program kgeography.md kgeography.d.3.0.json kigo no comment kigo.md kigo.d.3.0.json Klickety no comment klickety.md klickety.d.3.0.json klotski no comment klotski.md klotski.d.3.0.json konsole no comment konsole.md konsole.d.3.0.json kSquares no comment ksquares.md ksquares.d.3.0.json kTurtle Educational Programming Environment kturtle.md kturtle.d.3.0.json Leocad no comment leocad.md leocad.d.3.0.json LibreCAD no comment librecad.md librecad.d.3.0.json mahjongg no comment mahjongg.md mahjongg.d.3.0.json maps A simple maps application maps.md maps.d.3.0.json Math Create and edit scientific formulas and equations by using Math. math.md math.d.3.0.json Mathwar no comment mathwar.md mathwar.d.3.0.json minecraft Official Minecraft Launcher minecraft.md minecraft.d.3.0.json gnome-mines (alpine) Clear hidden mines from a minefield mines.md mines.d.3.0.json FileManager Access and organize files nautilus.md nautilus.d.3.0.json Notepad Wine (alpine) no comment notepad-wine.md notepad-wine.d.3.0.json notepadqq Edit source code files notepadqq.md notepadqq.d.3.0.json octave no comment octave.md octave.d.3.0.json OnlyOffice Edit office documents onlyoffice.md onlyoffice.d.3.0.json Pinta (alpine) Easily create and edit images pinta.md pinta.d.3.0.json Planner no comment planner.md planner.d.3.0.json Postman no comment postman.md postman.d.3.0.json Powershell no comment powershell.md powershell.d.3.0.json Putty Unix no comment putty-unix.md putty-unix.d.3.0.json Putty Wine (alpine) no comment putty-wine.md putty-wine.d.3.0.json qElectrotech no comment qelectrotech.md qelectrotech.d.3.0.json Remarkable A free, fully featured markdown editor for Linux. remarkable.md remarkable.d.3.0.json Remmina Access remote desktops with Remmina remmina.md remmina.d.3.0.json RemoteDesktop no comment remotedesktopmanager.md remotedesktopmanager.d.3.0.json rhythmbox Play and organize your music collection rhythmbox.md rhythmbox.d.3.0.json Robots no comment robots.md robots.d.3.0.json Shotcut Shotcut is a free, open source, cross-platform video editor. shotcut.md shotcut.d.3.0.json Stellarium Planetarium stellarium.md stellarium.d.3.0.json Step Simulate physics experiments step.md step.d.3.0.json stress no comment stress.md stress.d.3.0.json sublime-Text Sophisticated text editor for code, markup and prose sublime-text.md sublime-text.d.3.0.json sudoku Test your logic skills in this number grid puzzle sudoku.md sudoku.d.3.0.json supertux2 Play a classic 2D platform game supertux2.md supertux2.d.3.0.json swell-foop Clear the screen by removing groups of colored and shaped tiles swell-foop.md swell-foop.d.3.0.json taquin Slide tiles to their correct places taquin.md taquin.d.3.0.json Microsoft Teams Microsoft Teams for Linux is your chat-centered workspace in Office 365. teams.md teams.d.3.0.json Terminal sudo Use the command line terminal.md terminal.d.3.0.json Terminal [ephemeral container] Use the command line terminalephemeral.md terminalephemeral.d.3.0.json Terminal [Pod] Use the command line terminalpod.md terminalpod.d.3.0.json Tetravex no comment tetravex.md tetravex.d.3.0.json Thunderbird Send and receive mail with Thunderbird thunderbird.md thunderbird.d.3.0.json Commodore64 vice.md vice.d.3.0.json videolan Read, capture, broadcast your multimedia streams vlc.md vlc.d.3.0.json vmmacos no comment vmmacos.md vmmacos.d.3.0.json VMRC Connect to remote virtual machines vmrc.md vmrc.d.3.0.json vmubuntu no comment vmubuntu.md vmubuntu.d.3.0.json VSCode Code Editing. Redefined. vscode.md vscode.d.3.0.json weather Show weather conditions and forecast weather.md weather.d.3.0.json whatsdesk unofficial whatsapp client for linux whatsdesk.md whatsdesk.d.3.0.json Winefile Wine (alpine) no comment winefile-wine.md winefile-wine.d.3.0.json WineMine Wine (alpine) no comment winemine-wine.md winemine-wine.d.3.0.json Winhelp Wine no comment winhelp-wine.md winhelp-wine.d.3.0.json WinSCP no comment winscp-wine.md winscp-wine.d.3.0.json wireshark (alpine) Network traffic analyzer wireshark.md wireshark.d.3.0.json Writer alpine Create and edit text and graphics in letters, reports, documents and Web pages by using Writer. writer.md writer.d.3.0.json Xclock no comment xclock.md xclock.d.3.0.json Xedit no comment xedit.md xedit.d.3.0.json xeyes no comment xeyes.md xeyes.d.3.0.json Xman no comment xman.md xman.d.3.0.json Xpad Jot down notes for later xpad.md xpad.d.3.0.json Xterm (sudo) standard terminal emulator for the X window system xterm.md xterm.d.3.0.json"},{"location":"applications/mahjongg/","title":"mahjongg","text":""},{"location":"applications/mahjongg/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/mahjongg/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/mahjongg/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-mahjongg\n
"},{"location":"applications/mahjongg/#path","title":"Path","text":"
/usr/games/gnome-mahjongg\n
"},{"location":"applications/mahjongg/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/mahjongg/#wm_class","title":"WM_CLASS","text":"
gnome-mahjongg.Gnome-mahjongg\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/mahjongg/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/gnome-mahjongg.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/mahjongg/#json-dump","title":"JSON dump","text":"

json source file mahjongg.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-mahjongg\",\n    \"icon\": \"circle_gnome-mahjongg.svg\",\n    \"keyword\": \"gnome mahjongg,game mahjongg,mahjongg\",\n    \"launch\": \"gnome-mahjongg.Gnome-mahjongg\",\n    \"name\": \"mahjongg\",\n    \"path\": \"/usr/games/gnome-mahjongg\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/gnome-mahjongg.desktop\"\n}\n
"},{"location":"applications/mahjongg/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output mahjongg.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mahjongg.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mahjongg.d.3.0.json\n\n
"},{"location":"applications/mahjongg/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-mahjongg && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-mahjongg.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnNzgiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMzgiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBpZD0ic3RvcDIiIHN0b3AtY29sb3I9IiMzODg5ZTkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDQiIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI3IiBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTEyIiB4MT0iMzAuNzY1IiB4Mj0iMzEuMTA2IiB5MT0iNTYuOTkzIiB5Mj0iNy4zNjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMjQ0LjY1IDAgMCAyMjguMzQgMTUyLjY2IC0xMTMuNjUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wMzMiIHN0b3AtY29sb3I9IiM2MjYyNjIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDM1IiBzdG9wLWNvbG9yPSIjMzgzODM4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjkzMiIgeD0iLS4wNzE1MzgiIHk9Ii0uMDUxNjY3IiB3aWR0aD0iMS4xNDMxIiBoZWlnaHQ9IjEuMTAzMyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjkzNCIgc3RkRGV2aWF0aW9uPSIwLjc3NSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBpZD0iY2lyY2xlNDAiIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgaWQ9Imc0OCIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgaWQ9ImNpcmNsZTQyIiBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDkxMikiLz4KICA8Y2lyY2xlIGlkPSJjaXJjbGU0NCIgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgaWQ9ImNpcmNsZTQ2IiBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KIDwvZz4KIDxnPgogIDxyZWN0IGlkPSJyZWN0OTE0IiB4PSIxOSIgeT0iMTQiIHdpZHRoPSIyNiIgaGVpZ2h0PSIzNiIgcng9IjIiIHJ5PSIyIiBmaWx0ZXI9InVybCgjZmlsdGVyOTMyKSIgb3BhY2l0eT0iLjUiLz4KICA8cmVjdCBpZD0icmVjdDg5NCIgeD0iMTkiIHk9IjE0IiB3aWR0aD0iMjYiIGhlaWdodD0iMzYiIHJ4PSIyIiByeT0iMiIgZmlsbD0iI2YyZjJmMiIvPgogIDxwYXRoIGlkPSJwYXRoNCIgZD0ibTI5LjAyIDIwLjUyNWMtMC4yMDg4MiAwLjE1MzUyLTAuMjYxMDggMC4zODM1Ny0wLjI2MTA4IDAuNjUyMzUgMCAwLjQ5ODg4IDAuMjA4ODIgMS4xMTI4IDAuMzEzMjUgMS4zNDMxIDAgMCAwLjE1NjYyIDIuNjg2MiAwLjIwODg0IDIuOTkzMi0wLjQ2OTg4IDAuMDM4MzctMS4zMDUyIDAuMDc2NzYtMS42MTg0IDAuMTUzNWgtMC40MTc2NmMtMC44ODc1NCAwLjAzODUtMS43MjI4IDAuMDc2NzYtMi4wODg0IDAuMzQ1MzFsLTAuMTU2NjMgMC4xMTUxMiAwLjE1NjYzIDAuMTUzNWMwLjI2MTAzIDAuMjMwMjQgMC4zNjU0NyAwLjg4MjYxIDAuNDY5ODggMS41NzM0IDAuMjYxMDMgMS40MTk4IDAuNTc0MjggMy4xODUgMi4xNDA2IDMuODc1OWwwLjMxMzI1IDAuMTE1MTJ2LTAuMjY4NjJzMC4wNTIzLTAuMTE1MTIgMC4wNTIzLTAuMjY4NjJjMC0wLjExNTEyLTAuMDUyMy0wLjMwNy0wLjEwNDM2LTAuNTc1NjIgMC40MTc2NiAwLjAzODM3IDEuMzA1MiAwLjExNTEyIDEuNjE4NCAwLjExNTEyIDAuMDUyMjYgMC4zMDcwNSAxLjQwOTcgMTIuODE4IDEuNDA5NyAxMi44MThoMC41MjIxNnMwLjU3NDMxLTEyLjM1NiAwLjU3NDMxLTEyLjc0YzAuMzY1NDQgMCAxLjk4MzkgMC4wMzgzNSAyLjQ1MzggMC4wNzY3Ni0wLjEwNDI5IDAuMjMwMjgtMC41MjE5MyAxLjE4OTctMC41MjE5MyAxLjE4OTdsMC43MzA3NS0wLjQ5ODgzYzAuMjA4ODItMC4xMTUyNiA0Ljc1MDgtMy4xNDY3IDQuMTI1NS01LjE0MjMtMC4yMDk5OC0wLjY1MjM1LTAuOTQwMjctMS4xMTI5LTIuMTQxOC0xLjM0M2gtMC4xMDQ2NmMtMC42Nzg3MiAwLTIuNzY3MSAwLjAzODM3LTQuMzMzNCAwLjExNTEyIDAuMDUyMzQtMC45OTc3MyAwLjA1MjM0LTEuNTM1IDAuMDUyMzQtMS44MDM3di0wLjM0NTM4YzAtMC4xOTE4OCAwLjI2MTAzLTAuNDYwNSAwLjQ2OTg4LTAuNjUyMzggMC4yMDg4NC0wLjIzMDI0IDAuNDY5OS0wLjQyMjEyIDAuNDY5OS0wLjY1MjM4IDAtMC4wNzY3Ni0wLjA1MjMxLTAuMTUzNS0wLjEwNDM2LTAuMjMwMjQtMC4zMTI0MS0wLjM0NTU0LTIuNjA5Ni0xLjIyODItMy42MDE1LTEuMzA0OS0wLjMxMzM0IDAuMDM4MjYtMC41MjIxNiAwLjA3Njc2LTAuNjI2NjkgMC4xOTE3OHptMC4wNTIzMiA2LjI5MzVoMC4yNjEwM2MwIDAuMzQ1MzggMC4xNTY2MyAyLjc2MjkgMC4yMDg4MiAzLjEwODItMC40MTc2NC0wLjAzODUtMS40MDk1LTAuMTE1MjYtMS43MjI4LTAuMTE1MjYtMC4xNTY3OS0wLjQ5ODgzLTAuMjA4ODItMS4wMzYyLTAuMjYxMDgtMS41NzMzLTAuMDUyMjYtMC40NjA1Ny0wLjEwNDI5LTAuOTIxMTQtMC4yMDg4Mi0xLjM0MzIgMC40Njk4OCAwIDEuNzIyOS0wLjA3Njc2IDEuNzIyOS0wLjA3Njc2em0zLjE4NDggMS4xODk0czAuMDUyMTctMC45MjEgMC4wNTIxNy0xLjIyOGMwLjY3ODcgMC4wNzY3NiAxLjU2NjIgMC4xMTUxMiAyLjQwMTUgMC4xMTUxMmgwLjkzOTc1YzAgMC4xNTM1LTAuMDUyMzIgMC4zNDUzOC0wLjA1MjMyIDAuMzQ1MzgtMC4xMDQzNiAwLjg0NDIzLTAuMjYxMDMgMS44NDE5LTAuNzMwOTQgMi44Mzk3LTAuMzEzMjMgMC0yLjI0NDktMC4wNzY3Ni0yLjY2MjYtMC4xMTUxMiAwLTAuMjY4NjIgMC4wNTIzMi0xLjk1NzEgMC4wNTIzMi0xLjk1NzF6IiBmaWxsPSIjZTY0YzRjIiBzdHJva2Utd2lkdGg9IjIuMzMzMiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"mahjongg,gnome mahjongg,game mahjongg,mahjongg\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-mahjongg.desktop\"\nLABEL oc.launch=\"gnome-mahjongg.Gnome-mahjongg\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"mahjongg\"\nLABEL oc.displayname=\"mahjongg\"\nLABEL oc.path=\"/usr/games/gnome-mahjongg\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"mahjongg\"\nENV APPBIN \"/usr/games/gnome-mahjongg\"\nENV APP \"/usr/games/gnome-mahjongg\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/mahjongg/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mahjongg/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application mahjongg

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mahjongg.d\n
"},{"location":"applications/mahjongg/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f mahjongg.d -t mahjongg .\n
"},{"location":"applications/mahjongg/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect mahjongg > mahjongg.json\ndocker image save mahjongg -o mahjongg.tar\nctr -n k8s.io images import mahjongg.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mahjongg.json\n\n
"},{"location":"applications/maps/","title":"maps","text":""},{"location":"applications/maps/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/maps/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/maps/#alpine-packages","title":"Alpine packages","text":"
gnome-maps\n
"},{"location":"applications/maps/#path","title":"Path","text":"
/usr/bin/gnome-maps\n
"},{"location":"applications/maps/#mimetype","title":"Mimetype","text":"
application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\n
"},{"location":"applications/maps/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/maps/#wm_class","title":"WM_CLASS","text":"
org.gnome.Maps.org.gnome.Maps\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/maps/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Maps.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/maps/#json-dump","title":"JSON dump","text":"

json source file maps.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"apkpackage\": \"gnome-maps\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"icon\": \"org.gnome.Maps.svg\",\n    \"keyword\": \"maps\",\n    \"launch\": \"org.gnome.Maps.org.gnome.Maps\",\n    \"name\": \"maps\",\n    \"path\": \"/usr/bin/gnome-maps\",\n    \"mimetype\": \"application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Maps.desktop\"\n}\n
"},{"location":"applications/maps/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output maps.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/maps.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @maps.d.3.0.json\n\n
"},{"location":"applications/maps/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-maps\nLABEL oc.icon=\"org.gnome.Maps.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjIzOS4zOSIgeDI9IjI0Mi45NSIgeTE9Ii0xMDEuNDQiIHkyPSItNTg1LjU1IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMTEuMTYgODMuOTQzKSBzY2FsZSgxLjI0NDkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzE3MTkxZCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzUzNTk2MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSI1NDAiIHgyPSI1MzIuODMiIHkxPSI0IiB5Mj0iNjk0LjM2IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0uNTQ2IC0uNTQ2KSBzY2FsZSguMDYzNTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzI4YjE2MiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzM1ZTk4MSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMi4yMTMiIHgyPSIzMS45MzkiIHkxPSI2Mi4wNjIiIHkyPSIyMy40OTgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjM2E3YWYwIiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjNDNhZGYxIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjMxLjc5MSIgeDI9IjMyIiB5MT0iNDYuMTU5IiB5Mj0iMiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNlMWU3ZjIiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz48L2ZpbHRlcj48ZmlsdGVyIGlkPSJlIiB4PSItLjE0NSIgeT0iLS4xMDIiIHdpZHRoPSIxLjI5MSIgaGVpZ2h0PSIxLjIwNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyNS43MjIiLz48L2ZpbHRlcj48L2RlZnM+PHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS41NDYgLS41NDYpIHNjYWxlKC4wNjM1NikiIGQ9Ik05NjYuMSAzNzguNDVjLTIuNS04Ljc1LTUuMzUtMTcuNi04LjQ1LTI2LjM1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNC0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1Qzc3My4yNSAxMDUuNyA2ODguNyA2MS42NSA1OTIuMiA0Ni4yNWMtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LS41NS0xOS44NS0uODUtMzAuMS0uODUtOS4zNSAwLTE4LjYuMjUtMjcuOS43NS0xMTguMzUgNi4xLTIyMC4zIDUxLjk1LTMwNS44NSAxMzcuNVE0MC4wNSAzMTYuNTUgNDAuMDUgNTEyLjA1YzAgMTMwLjM1IDQ2LjEgMjQxLjY1IDEzOC4yNSAzMzMuOCA4NS41NSA4NS41IDE4Ny41IDEzMS4zNSAzMDUuODUgMTM3LjVoLjRjOC41LjQ1IDE2LjYuNyAyNC41LjdoOC40NWM4LjU1LS4xIDE2LjgtLjQgMjQuNjUtLjggMi41LS4xNSA0Ljc1LS4zIDYuOTUtLjQ1IDIwLjItMS40NSAzOS45LTQuMDUgNTguNy03LjcgNy45NS0xLjU1IDE1LjgtMy4zIDIzLjQtNS4xNSA4MC44LTIwLjMgMTUyLjE1LTYxLjYgMjE0LjY1LTEyNC4xIDQ4LjYtNDguNiA4NC40LTEwMi41IDEwNy4zNS0xNjEuOCAxNi42LTQyLjkgMjYuNTUtODguNjUgMjkuNzUtMTM3LjQ1LjM1LTUuMi42LTEwLjYuOC0xNi4wNS4yLTYuMDUuMy0xMi4yNS4zLTE4LjV2LTNjLS4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42eiIgZmlsdGVyPSJ1cmwoI2EpIiBvcGFjaXR5PSIuMjUiLz48cGF0aCBkPSJNNjAuODU5IDIzLjUwOWEyOC40MSAyOC40MSAwIDAgMC0yLjAwOC01LjA4NWMtLjI0Mi0uNDctLjUwNi0uOTUtLjc4Mi0xLjQyNC0xLjI5LTIuMTkyLTIuOTExLTQuMjctNC44NTMtNi4yMTItNC42MTQtNC42MTUtOS45ODgtNy40MTUtMTYuMTIyLTguMzkzYTMwLjc0NCAzMC43NDQgMCAwIDAtMy4xODEtLjM0IDMzLjk4NCAzMy45ODQgMCAwIDAtMy42ODctLjAwN2MtNy41MjIuMzg4LTE0LjAwMiAzLjMwMi0xOS40NCA4Ljc0UTIgMTkuNTc1IDIgMzJjMCA4LjI4NSAyLjkzIDE1LjM1OSA4Ljc4NyAyMS4yMTYgNS40MzggNS40MzQgMTEuOTE3IDguMzQ4IDE5LjQ0IDguNzM5aC4wMjZjLjU0LjAyOSAxLjA1NS4wNDQgMS41NTcuMDQ0aC41MzdhNDAuMDA5IDQwLjAwOSAwIDAgMCAxLjU2Ny0uMDVsLjQ0MS0uMDI5YTMxLjQ0MSAzMS40NDEgMCAwIDAgMy43MzEtLjQ5Yy41MDYtLjA5OCAxLjAwNS0uMjEgMS40ODgtLjMyNyA1LjEzNS0xLjI5IDkuNjctMy45MTUgMTMuNjQzLTcuODg3IDMuMDg5LTMuMDkgNS4zNjQtNi41MTUgNi44MjMtMTAuMjg0IDEuMDU1LTIuNzI3IDEuNjg3LTUuNjM1IDEuODktOC43MzdBMzMuNyAzMy43IDAgMCAwIDYyIDMydi0uMTlhMzEuMjA5IDMxLjIwOSAwIDAgMC0uOTA4LTcuNDM3Yy0uMDctLjI3Ni0uMTUtLjU3Mi0uMjMyLS44NjR6IiBmaWxsPSJ1cmwoI2IpIi8+PHBhdGggZD0iTTMyIDJjLS41OTQgMC0xLjE4Mi4wMTUtMS43NzMuMDQ3LTcuNTIzLjM4OC0xNC4wMDIgMy4zMDMtMTkuNDQgOC43NEM0LjkzIDE2LjY0NSAyIDIzLjcxNyAyIDMyYzAgMi41NDkuMjggNC45ODIuODM0IDcuM0w2MC45MiAyMy43MzhjLS4wMi0uMDc3LS4wMzgtLjE1MS0uMDYtLjIyOWEyOC4zNjUgMjguMzY1IDAgMCAwLTIuMDA4LTUuMDg0Yy0uMjQxLS40Ny0uNTA3LS45NS0uNzgzLTEuNDIzLTEuMjktMi4xOTMtMi45MS00LjI3Mi00Ljg1Mi02LjIxMy00LjYxNC00LjYxNS05Ljk5LTcuNDE0LTE2LjEyMy04LjM5M2EzMC43MTUgMzAuNzE1IDAgMCAwLTMuMTgtLjM0IDM0LjAwNyAzNC4wMDcgMCAwIDAtMS45MTMtLjA1NHoiIGZpbGw9InVybCgjYykiLz48cGF0aCBkPSJNMTkuNDEgNC42NzRjLTIuNDMgMS4xMy00LjcxMyAyLjYxOS02Ljg0OCA0LjQ2N2wyMC4wNzQgMjAuMDc0LTMwLjIgOC4wOWEyOC4xOTUgMjguMTk1IDAgMCAwIDIuNDA0IDcuNjRsMzQuMzI4LTkuMi40MjctLjExNCAyMi4zMTgtNS45OGEzMC41NiAzMC41NiAwIDAgMC0uODIyLTUuMjc4IDI4LjM2NSAyOC4zNjUgMCAwIDAtLjc3LTIuNTM5Yy0uMDAzLS4wMTItLjAxLS4wMjItLjAxMy0uMDMzTDQxLjU2IDI2LjgyNCAxOS40MSA0LjY3NHoiIGZpbGw9InVybCgjZCkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiLz48ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDQ3MTMgMCAwIC4wNDQ4NyAyMi45ODMgNDYuNjk3KSIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMzUiIHN0cm9rZS13aWR0aD0iLjk3MyI+PHBhdGggZD0iTTE5MS4zLTY0NS4wMmMtMTE3LjE3IDAtMjEyLjE2IDk0Ljk5MS0yMTIuMTYgMjEyLjE2IDAgOC45Ny43MiAxNy43MTEgMS44MTYgMjYuMzc3IDE4LjEzIDE2NS43MiAxOTYuNTcgMzU2LjczIDE5Ni41NyAzNTYuNzMgMy4xOCAzLjU1OCA2LjI0NSA1Ljc1MyA5LjE5NiA3LjM0MWwuMTUyLjA3NiA1Ljk0MiAxLjg5MyA1Ljk0Mi0xLjg5My4xNTItLjA3NmMyLjk1Mi0xLjU5IDYuMDE4LTMuODk3IDkuMTk2LTcuMzQxIDAgMCAxNzUuODctMTkxLjM0IDE5My41OC0zNTcuMSAxLjA2LTguNTUzIDEuNzgtMTcuMjIgMS43OC0yNi4wMzgtLjA0LTExNy4xMy05NC45OTItMjEyLjEyLTIxMi4xNi0yMTIuMTJ6bTAgMzQ4LjYzYy03NS4yMzYgMC0xMzYuNDctNjEuMjMzLTEzNi40Ny0xMzYuNDdzNjEuMjMzLTEzNi40NyAxMzYuNDctMTM2LjQ3IDEzNi40MyA2MS4yMzMgMTM2LjQzIDEzNi40Ny02MS4xOTUgMTM2LjQ3LTEzNi40MyAxMzYuNDd6Ii8+PC9nPjxwYXRoIGQ9Ik0xOTEuMy02NDUuMDJjLTExNy4xNyAwLTIxMi4xNiA5NC45OTEtMjEyLjE2IDIxMi4xNiAwIDguOTcuNzIgMTcuNzExIDEuODE2IDI2LjM3NyAxOC4xMyAxNjUuNzIgMTk2LjU3IDM1Ni43MyAxOTYuNTcgMzU2LjczIDMuMTggMy41NTggNi4yNDUgNS43NTMgOS4xOTYgNy4zNDFsLjE1Mi4wNzYgNS45NDIgMS44OTMgNS45NDItMS44OTMuMTUyLS4wNzZjMi45NTItMS41OSA2LjAxOC0zLjg5NyA5LjE5Ni03LjM0MSAwIDAgMTc1Ljg3LTE5MS4zNCAxOTMuNTgtMzU3LjEgMS4wNi04LjU1MyAxLjc4LTE3LjIyIDEuNzgtMjYuMDM4LS4wNC0xMTcuMTMtOTQuOTkyLTIxMi4xMi0yMTIuMTYtMjEyLjEyem0wIDM0OC42M2MtNzUuMjM2IDAtMTM2LjQ3LTYxLjIzMy0xMzYuNDctMTM2LjQ3czYxLjIzMy0xMzYuNDcgMTM2LjQ3LTEzNi40NyAxMzYuNDMgNjEuMjMzIDEzNi40MyAxMzYuNDctNjEuMTk1IDEzNi40Ny0xMzYuNDMgMTM2LjQ3eiIgZmlsbD0idXJsKCNmKSIgdHJhbnNmb3JtPSJtYXRyaXgoLjA0NzEzIDAgMCAuMDQ3MTMgMjIuOTgzIDQ4LjE1NSkiIHN0cm9rZS13aWR0aD0iLjk1Ii8+PC9zdmc+\"\nLABEL oc.keyword=\"maps,maps\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Maps.desktop\"\nLABEL oc.launch=\"org.gnome.Maps.org.gnome.Maps\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"maps\"\nLABEL oc.displayname=\"maps\"\nLABEL oc.path=\"/usr/bin/gnome-maps\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.geo+json;x-scheme-handler/geo;application/vnd.google-earth.kml+xml;application/gpx+xml;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"maps\"\nENV APPBIN \"/usr/bin/gnome-maps\"\nENV APP \"/usr/bin/gnome-maps\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/maps/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/maps/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application maps

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/maps.d\n
"},{"location":"applications/maps/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f maps.d -t maps .\n
"},{"location":"applications/maps/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect maps > maps.json\ndocker image save maps -o maps.tar\nctr -n k8s.io images import maps.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @maps.json\n\n
"},{"location":"applications/math/","title":"math","text":""},{"location":"applications/math/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.libreoffice

"},{"location":"applications/math/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/math/#alpine-packages","title":"Alpine packages","text":"
libreoffice-gnome\n
"},{"location":"applications/math/#arguments","title":"Arguments","text":"

\"--math\"

"},{"location":"applications/math/#displayname","title":"Displayname","text":"
Math\n
"},{"location":"applications/math/#path","title":"Path","text":"
/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/math/#uniquerunkey","title":"uniquerunkey","text":"

\"libreoffice\"

"},{"location":"applications/math/#mimetype","title":"Mimetype","text":"
application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\n
"},{"location":"applications/math/#file-extensions","title":"File extensions","text":"

\"odf;odc\"

"},{"location":"applications/math/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"odf;odc\"

"},{"location":"applications/math/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/math/#wm_class","title":"WM_CLASS","text":"
libreoffice.libreoffice-math\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/math/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/libreoffice-math.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/math/#json-dump","title":"JSON dump","text":"

json source file math.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_math.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-math\",\n    \"name\": \"math\",\n    \"displayname\": \"Math\",\n    \"args\": \"--math\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\",\n    \"fileextensions\": \"odf;odc\",\n    \"legacyfileextensions\": \"odf;odc\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-math.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/math/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output math.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/math.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @math.d.3.0.json\n\n
"},{"location":"applications/math/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_math.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSIzMi4wMiIgeDI9IjMyLjAyIiB5MT0iMi4wNDMiIHkyPSI2Mi4wNDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9IjMyIiB4Mj0iMzIiIHkxPSI3IiB5Mj0iNTciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZTdlNyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iNDUuNTAxIiB4Mj0iNDUuNTAxIiB5MT0iNy4xMDU1IiB5Mj0iMjkuODk2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmNWY1ZjUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImsiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjc1Ii8+CiAgPC9maWx0ZXI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJkIiBjeD0iMzguMDY2IiBjeT0iMjYuMTkyIiByPSIyNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtLjggM2UtOCAtMS45MjY1ZS04IC0uOTQwMzQgODAuNDUzIDM4LjYyOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFlMzUzYyIgc3RvcC1vcGFjaXR5PSIuNDg1MzgiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTkxOTE5IiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iMzYxOC40IiB4Mj0iMzYxOC40IiB5MT0iLTc1OC42NCIgeTI9Ii03NzIuNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS44NzUgMCAwIDIgLTY3NTkuMiAxNTYzLjMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaCIgeDE9IjM3MTYuMiIgeDI9IjM3MTYuMiIgeTE9IjY4My45OCIgeTI9IjcwNS4xMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJqIiB4MT0iMTk1Ljc1IiB4Mj0iMTk1Ljc1IiB5MT0iMTAxNi4yIiB5Mj0iMTAzMi4yIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDM0MzUuNSwtMTg5MS41KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsIiB4MT0iMTk1Ljc1IiB4Mj0iMTk1Ljc1IiB5MT0iMTAxNi4yIiB5Mj0iMTAzMi4yIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0xLDAsMCwxLDM4MzAuNSwtMTg5MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibSIgeDE9IjM3MTYuMiIgeDI9IjM3MTYuMiIgeTE9IjY4My45OCIgeTI9IjcwNS4xMyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk0NTkgMCAwIDEgMjAuMDM5IC0uMTMwNTcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8ZmlsdGVyIGlkPSJvIiB4PSItLjA1OCIgeT0iLS4wNjIxNDMiIHdpZHRoPSIxLjExNiIgaGVpZ2h0PSIxLjEyNDMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzI1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibiIgeD0iLS4wNTI4MjYiIHk9Ii0uMDY5NDI4IiB3aWR0aD0iMS4xMDU3IiBoZWlnaHQ9IjEuMTM4OSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC40MDQ5OTYyMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSB0cmFuc2Zvcm09Im1hdHJpeCgyLjE0MjkgMCAwIDIuMTQyOSAtODI2LjM2IC0xMTA3LjUpIiBjeD0iNDAwLjU3IiBjeT0iNTMxLjgiIHI9IjE0IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIgc3Ryb2tlLXdpZHRoPSIuNzMzMzMiLz4KIDxnIHN0cm9rZS13aWR0aD0iMS41NzE1Ij4KICA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsPSJ1cmwoI2cpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGwtb3BhY2l0eT0iMCIvPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIwIiBmaWxsPSJ1cmwoI2IpIi8+CiAgPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2YpIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjI1IDAgMCAxLjI1IC00NTA1LjUgMTExNS4zKSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIgc3Ryb2tlLXdpZHRoPSIuOCI+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjggMCAwIC44IDM2MDQuNCAtODkyLjI0KSIgZD0ibTE5IDE4Yy0xLjEwOCAwLTIgMC44OTE5OS0yIDJ2MjRjMCAxLjEwOCAwLjg5MTk5IDIgMiAyaDI2YzEuMTA4IDAgMi0wLjg5MTk5IDItMnYtMTljMC0zLTUtNy04LTdoLTIweiIgZmlsdGVyPSJ1cmwoI28pIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMSIvPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC44IDAgMCAuOCAzNjA0LjQgLTg5Mi4yNCkiIGQ9Im0xOSAxOGMtMS4xMDggMC0yIDAuODkxOTktMiAydjI0YzAgMS4xMDggMC44OTE5OSAyIDIgMmgyNmMxLjEwOCAwIDItMC44OTE5OSAyLTJ2LTE5YzAtMy01LTctOC03aC0yMHoiIGZpbGw9InVybCgjaSkiIHN0cm9rZS13aWR0aD0iMSIvPgogIDxnIGZpbGw9IiNmMDllNmYiPgogICA8cmVjdCB4PSIzNjE4IiB5PSItODU3Ljg0IiB3aWR0aD0iMjQiIGhlaWdodD0iLjc5OTk4Ii8+CiAgIDxyZWN0IHg9IjM2MTgiIHk9Ii04NzYuMjQiIHdpZHRoPSIyNCIgaGVpZ2h0PSIuODAwMDMiLz4KICAgPHJlY3QgdHJhbnNmb3JtPSJyb3RhdGUoOTApIiB4PSItODc3Ljg0IiB5PSItMzYyMC40IiB3aWR0aD0iMjIuNCIgaGVpZ2h0PSIuOCIvPgogICA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIHg9Ii04NzcuODQiIHk9Ii0zNjQwLjQiIHdpZHRoPSIyMi40IiBoZWlnaHQ9Ii43OTk5MiIvPgogIDwvZz4KICA8ZyBmaWx0ZXI9InVybCgjbikiIG9wYWNpdHk9Ii4yNSI+CiAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuNTA0MSwwLDAsMS41MDQxLC0xOTYzLjksLTE5MTQuMikiIGQ9Im0zNzI0LjkgNjkxLjY2djEuOTk0NWgtMC45OTE4di0wLjkzMDc4aC02LjE0OTZsLTEuMzg4NyA4LjI0NDFoLTEuNTg2OWwtMS4zMjI1LTQuMTg4NWgtMC43OTM2di0xLjEzMDJsMS42NTMyIDJlLTUgMS4xNTcxIDMuMzI0MiAxLjE1NzItNy4zMTMzIiBzdHJva2Utd2lkdGg9Ii44Ii8+CiAgIDxwYXRoIGQ9Im0zNjM3LTg2Ny42NC03IDciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogICA8cGF0aCBkPSJtMzYzMC04NjcuNjQgNyA3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KICA8L2c+CiAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS41MDQxIDAgMCAxLjUwNDEgLTE5NjMuOSAtMTkxNC4yKSIgZmlsbD0idXJsKCNoKSI+CiAgIDxwYXRoIGQ9Im0zNzI0LjkgNjkxLjY2djEuOTk0NWgtMC45OTE4di0wLjkzMDc4aC02LjE0OTZsLTEuMzg4NyA4LjI0NDFoLTEuNTg2OWwtMS4zMjI1LTQuMTg4NWgtMC43OTM2di0xLjEzMDJsMS42NTMyIDJlLTUgMS4xNTcxIDMuMzI0MiAxLjE1NzItNy4zMTMzIiBmaWxsPSJ1cmwoI20pIiBzdHJva2Utd2lkdGg9Ii44Ii8+CiAgPC9nPgogIDxwYXRoIGQ9Im0zNjM3LTg2Ny42NC03IDciIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNqKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogIDxwYXRoIGQ9Im0zNjMwLTg2Ny42NCA3IDciIGZpbGw9Im5vbmUiIHN0cm9rZT0idXJsKCNsKSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjEuNiIvPgogPC9nPgogPHBhdGggZD0ibTMyIDdhMjUgMjUgMCAwIDAtMjUgMjUgMjUgMjUgMCAwIDAgMjUgMjUgMjUgMjUgMCAwIDAgMjUtMjUgMjUgMjUgMCAwIDAtMC4xMDM1Mi0yLjEwMzVsLTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAtMi4xMDU1LTAuMTA1NDd6IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTU2Ljg5NiAyOS44OTYtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMCAyMi43OTEgMjIuNzkxeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"math,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-math.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-math\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--math\"\nLABEL oc.name=\"math\"\nLABEL oc.displayname=\"Math\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.formula;application/vnd.sun.xml.math;application/vnd.oasis.opendocument.formula-template;text/mathml;application/mathml+xml;\"\nLABEL oc.fileextensions=\"odf;odc\"\nLABEL oc.legacyfileextensions=\"odf;odc\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"math\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--math\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/math/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/math/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application math

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/math.d\n
"},{"location":"applications/math/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f math.d -t math .\n
"},{"location":"applications/math/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect math > math.json\ndocker image save math -o math.tar\nctr -n k8s.io images import math.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @math.json\n\n
"},{"location":"applications/mathwar/","title":"Mathwar","text":""},{"location":"applications/mathwar/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/mathwar/#distribution","title":"Distribution","text":"

ubuntu

"},{"location":"applications/mathwar/#ubuntu-packages","title":"Ubuntu packages","text":"
mathwar\n
"},{"location":"applications/mathwar/#path","title":"Path","text":"
/usr/games/mathwar\n
"},{"location":"applications/mathwar/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/mathwar/#wm_class","title":"WM_CLASS","text":"
mathwar.Mathwar\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/mathwar/#json-dump","title":"JSON dump","text":"

json source file mathwar.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"mathwar\",\n    \"icon\": \"mathwar.svg\",\n    \"keyword\": \"mathwar,math\",\n    \"launch\": \"mathwar.Mathwar\",\n    \"name\": \"Mathwar\",\n    \"path\": \"/usr/games/mathwar\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/mathwar/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output mathwar.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mathwar.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mathwar.d.3.0.json\n\n
"},{"location":"applications/mathwar/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends mathwar && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"mathwar.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjY0IgogICBoZWlnaHQ9IjY0IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ3IHIyMjU4MyIKICAgc29kaXBvZGk6ZG9jbmFtZT0ibWF0aHdhci5zdmciPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIzLjYyMDM4NjciCiAgICAgaW5rc2NhcGU6Y3g9Ii0zNS4wNzUzMzkiCiAgICAgaW5rc2NhcGU6Y3k9IjgzLjA3MDU0MSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXI0IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEyODAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iOTM0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTkxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTkzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkM2Q3Y2Y7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxOTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2QzZDdjZjtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTcxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MTczIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTU1NzUzO3N0b3Atb3BhY2l0eTowLjg3ODQzMTM3OyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDcxODUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjAuNzU2ODYyNzU7IgogICAgICAgICBvZmZzZXQ9IjAuNSIKICAgICAgICAgaWQ9InN0b3A3MTgzIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcxNzUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzU1NTc1MztzdG9wLW9wYWNpdHk6MC41MTIwNDgxODsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1NTI3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1NTI5IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4ODhhODU7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU1MzEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izg4OGE4NTtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1NDY1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A1NDY3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDU0NjkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUxMCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyODI0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4NjMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzcyMyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTM3NDEtMyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzc0MS0wOSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTA5NiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzNzQxLTIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg0MyIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUzODQzLTciIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg0My04IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTM4NDMtNzEiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEwMjYuNjA2NyIKICAgICAgIHgyPSIxNzU3LjAzMTYiCiAgICAgICB5MT0iMTAyNi42MDY3IgogICAgICAgeDE9IjEyMjcuODQ1NSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDU1MzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1NTI3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NDMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTU0My00IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTEwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTEyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuMjA4NzI5NzQiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjYWRiZWQ7c3RvcC1vcGFjaXR5OjAuNDk4MDM5MjI7IgogICAgICAgICBpZD0ic3RvcDM1NDkiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzU1MSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2FmYzllNDtzdG9wLW9wYWNpdHk6MC43NDkwMTk2MTsiCiAgICAgICAgIG9mZnNldD0iMC40MjAwMTUwNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwLjYzMzU0NzI1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eTowLjg3NDUwOTgxOyIKICAgICAgICAgaWQ9InN0b3AzNTUzIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuODMzMzMyNiIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzRmN2ZiZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIGlkPSJzdG9wMzUyMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTIyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzQ2NWE0O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzUzMyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzUzNSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTQ1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzQ2NWE0O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzU1NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzIwNGE4NztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIGlkPSJzdG9wMzU1NyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTcxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWJiY2RiO3N0b3Atb3BhY2l0eTowLjQ5ODAzOTIyOyIKICAgICAgICAgb2Zmc2V0PSIwLjY1NTYwNTk3IiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAuODA4NDY4NCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzcyOWZjZjtzdG9wLW9wYWNpdHk6MC4yNDcwNTg4MjsiCiAgICAgICAgIGlkPSJzdG9wMzU3MyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNTc1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTZlZmY2O3N0b3Atb3BhY2l0eTowLjEyMTU2ODYzOyIKICAgICAgICAgb2Zmc2V0PSIwLjg3NSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwLjg3NTQ0MzA0IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjJmNmZhO3N0b3Atb3BhY2l0eTowLjA1ODgyMzUzOyIKICAgICAgICAgaWQ9InN0b3AzNTc3IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM1NzkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmOGZhZmM7c3RvcC1vcGFjaXR5OjAuMDI3NDUwOTg7IgogICAgICAgICBvZmZzZXQ9IjAuOTU3ODcyODciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMC45ODQzNzUiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmYmZjZmQ7c3RvcC1vcGFjaXR5OjAuMDExNzY0NzE7IgogICAgICAgICBpZD0ic3RvcDM1ODEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzU4MyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZkZmRmZTtzdG9wLW9wYWNpdHk6MC4wMDM5MjE1NzsiCiAgICAgICAgIG9mZnNldD0iMC45ODQzNzUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIGlkPSJzdG9wMzU2NyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzMTkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDMzMjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzMyMyIKICAgICAgICAgb2Zmc2V0PSIwLjU3NDI0MDYyIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjE0MzgzNTYyOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzMzI1IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAyNCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI0OCA6IDI0IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNCA6IDE2IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU2NTUiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTc2OCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NzY4LTIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTc2OC0xIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU3NjgtNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1ODkxIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU4OTEtMSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1OTM0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU5MzQtNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU1OTM0LTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNTkzNC0wNSIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU2MDI5IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjIiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtOSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTYiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTciCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTg5IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTkxIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTkzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5NSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjIwNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS05IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0My02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0wIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxODktOCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE5MS0zIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTkzLTYiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2MTk1LTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS00IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE0My00IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0zIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNjIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTYiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTg5LTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTMiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxOTEtOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5My05IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjE5NS03IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTYxODEtMiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtNSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi0yIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTYxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjE4OS02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0yIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTkxLTQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTMtNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTUtNTgiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtOSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjE4MS0yNiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxNDMtNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMzciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItMzciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtMCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtOCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxODktMyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMzciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYxOTEtMzgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTMtNyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDYxOTUtMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0zNyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDYyMDQtNyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MzkzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0MDEiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjQxMCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjIiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjU0OCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi0yLTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTktMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItMi0xIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTgtOCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNjEtMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjU1NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjU1OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY1NjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItMi0xIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjU2OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjYxMyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0MTAtMiIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NjIyIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI0IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjYyNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYzMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjYxMy02IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjQxMC02IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi03IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYyMi0xIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI0LTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2NjI2LTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2MzItMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjcwOCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTktMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC02LTciCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcxNyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjcxOSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3MjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOS0xIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjcyOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjc3MyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjA0LTIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTktMyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC02LTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMjciCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3ODIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY3ODQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2Nzg2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTktMyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3OTMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTY4MzgiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjYzMi0yMiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTItMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNzctNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg0NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjg0OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY4NTEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg1NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNjkwMCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi05LTMtMiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3OTMtNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItOS0zLTIiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtNi05LTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTctMjctOCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkwOSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjkxMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY5MTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItOS0zLTIiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTIwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmU2OTY1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC04IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njg1Ny03IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC0yLTEtMiIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVlZWVjO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjYtNzctNi0yIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTc0Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc2IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjk3OCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5ODQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTY5NjUtNCIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY4NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTkiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDcyNjQtMi0xLTgiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3LTYtNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk3NC04Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc2LTIiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A2OTc4LTEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTkiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTg0LTciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTI9IjEyNjMuNDcyIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTcwNjAiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5ODQtNy04IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkyPSIxMjYzLjQ3MiIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS02Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY0LTItMS04LTAiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MjY2LTc3LTYtNy0wIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMGIwYjA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDY5Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDcxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzA3MyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS02IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA3OSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlNzA2MC02IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTg0LTctNiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2NC0yLTEtOC03IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZWVlZWM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzI2Ni03Ny02LTctNiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjBiMGIwO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA2OS02Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDcxLTAiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZWVlYztzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3MDczLTYiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IwYjBiMDtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwNzktNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5Mj0iMTI2My40NzIiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYxIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjY1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjkiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI3MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNzciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzU4IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYyIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzM3MCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNzQiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTQiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3Mzc0LTYzNCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNC04MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTgyIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDA1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQwNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNzItNzQ3IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTQ5NyIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS00LTQ5NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQxMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MTMiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzcwLTczNyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNi0zNjAiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNi0zNjAiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MTciCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDE5IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjMmMyYzI7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iMTI2My40NzIiCiAgICAgICB4Mj0iMTE3MS41NTMyIgogICAgICAgeTE9IjEyNjMuNDcyIgogICAgICAgeDE9Ijk5MS43MTc0NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzM2OC0zNDMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTYtNTIzIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC05LTYtNTIzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDIzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQyNSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjkzMS42NDg5OSIKICAgICAgIHgyPSIxODA4LjE3MzEiCiAgICAgICB5MT0iOTMxLjY0ODk5IgogICAgICAgeDE9IjEyMDUuMTEyMSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNzgwNzk1MSwwLDAsMC4wNzgwNzk1MSwtODUuODMzNTY3LDk0OC41Njk3OSkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDMxMzgtNzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1ODQ5LTM4OCIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTg0OS0zODgiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0MjkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJhYWYxODtzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQzMSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMmFhZjE4O3N0b3Atb3BhY2l0eTowOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSI5MzEuNjQ4OTkiCiAgICAgICB4Mj0iMTgwOC4xNzMxIgogICAgICAgeTE9IjkzMS42NDg5OSIKICAgICAgIHgxPSIxMjA1LjExMjEiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDc4MDc5NTEsMCwwLDAuMDc4MDc5NTEsLTg1LjgzMzU2Nyw5NDguNTY5NzkpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMTQwLTI4NSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM4ODctMjcxIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzODg3LTI3MSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQzNSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDM3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjYtNjYyIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03NjAiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcyNjItNS00LTktNzYwIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDQxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ0MyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNjQtNTM2IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03MSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtOS03MSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ0NyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NDkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYyLTY3MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTgtNTI0IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC04LTUyNCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ1MyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NTUiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzYwLTc1NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTgtMTIwIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC04LTEyMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ1OSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NjEiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2MyYzJjMjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHkyPSIxMjYzLjQ3MiIKICAgICAgIHgyPSIxMTcxLjU1MzIiCiAgICAgICB5MT0iMTI2My40NzIiCiAgICAgICB4MT0iOTkxLjcxNzQ3IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MzU4LTk4NCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcyNjItNS00LTIyNSIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzI2Mi01LTQtMjI1Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDY1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ2NyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYzJjMmMyO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeTI9IjEyNjMuNDcyIgogICAgICAgeDI9IjExNzEuNTUzMiIKICAgICAgIHkxPSIxMjYzLjQ3MiIKICAgICAgIHgxPSI5OTEuNzE3NDciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDczNTYtNDg1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzI2Mi01LTQtNDQ3IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MjYyLTUtNC00NDciPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM0NzEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDczIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjMmMyYzI7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB5Mj0iNzc3LjM2MjE4IgogICAgICAgeDI9IjMxMTguNTcxNSIKICAgICAgIHkxPSI5MDkuNTA1MDciCiAgICAgICB4MT0iMzExOC41NzE1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjA3ODA3OTUxLDAsMCwwLjA3ODA3OTUxLC0yMTIuNjYwMSw5NjMuMDgyMjgpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzMTI4LTg5OSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcxOTktODUyIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTk5LTg1MiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzQ3NyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMzgzZTQ5O3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNDc5IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzODNlNDk7c3RvcC1vcGFjaXR5OjA7IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMzg4MyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZSAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTk4OC4zNjIxOCkiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlkPSJsYXllcjEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpbmtzY2FwZTpsYWJlbD0iQ2FwYSAxIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMyIKICAgICBpZD0ibGF5ZXI1IgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiIC8+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC05ODguMzYyMTgpIgogICAgIHN0eWxlPSJkaXNwbGF5Om5vbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMSIKICAgICBpZD0ibGF5ZXIzIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzgxMSIKICAgICAgIGQ9Im0gMTIxNi45MzA4LDk2MS42MzQwMyA1NTYuOTAzNCwtMS4zNjA2NiAtOS41MDgsMzIuNjU1ODMgLTIzLjA5MTEsOC4xNjQgLTYuNzkxNiw1MC4zNDQzIC01MS42MTU0LDI5LjkzNDYgLTQzLjQ2NTcsOS41MjQ2IC0zMjUuOTkyMiwxLjM2MDcgLTI5Ljg4MjcsLTM1LjM3NzIgLTE3LjY1NzksLTQuMDgyIC0xNi4yOTk2LC0zNS4zNzcyIC0zMS4yNDA5LC0xMy42MDY1IC0xLjM1ODMsLTQyLjE4MDQ3IHoiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNTU1NzUzO3N0cm9rZS13aWR0aDo5LjUxNjM1OTMzO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgPC9nPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTpub25lIgogICAgIGlua3NjYXBlOmxhYmVsPSJDYXBhIzQiCiAgICAgaWQ9ImxheWVyNiIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIj4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU0NDIiCiAgICAgICBkPSJtIDE3NDUuNTQzNiw5NzMuNTcwMjggYyAtMTcyLjA2MjcsLTAuMzM2NzIgLTM0NC4xMjUzLC0wLjY3MzQzIC01MTYuMTg4LC0xLjAxMDE1IC0wLjMzNjcsNy4wNzEwNyAtMC42NzM0LDE0LjE0MjEzIC0xLjAxMDEsMjEuMjEzMiAxMC43NzUsNC43MTQwNiAyMS41NDk5LDkuNDI4MDcgMzIuMzI0OSwxNC4xNDIxNyA0LjM3NzMsMTIuMTIxOCA4Ljc1NDcsMjQuMjQzNyAxMy4xMzIsMzYuMzY1NSA5LjE1OTgsMy41MTYgMTkuNDExMiw1LjU1NCAyNy45MDQsOS45NzMxIDYuNTI0Myw5LjEzNDIgMTMuMDQ4NywxOC4yNjgzIDE5LjU3MzEsMjcuNDAyNSAxMDQuNzE5MiwtMC42NzM0IDIwOS40MzgzLC0xLjM0NjkgMzE0LjE1NzUsLTIuMDIwMyAxNi4zNDc3LC00LjYzNTIgMzMuNDA1MywtNy42MTEzIDQ5LjMxNSwtMTMuMjcwNSAxMi44NTYxLC04LjAzNSAyNS43MTIxLC0xNi4wNzAxIDM4LjU2ODIsLTI0LjEwNTEgMi4zNTcsLTE2LjQ5OTIgNC43MTQxLC0zMi45OTgzIDcuMDcxMSwtNDkuNDk3NTIgNy4wMzkyLC0zLjU1ODcxIDE1LjUxOTksLTUuNTg4NSAyMS42OTc4LC0xMC4wNjA2MyAzLjAwMzYsLTUuOTg5NDkgOS4xNzYsLTE0LjMxOTM2IC0xLjkwNjIsLTkuOTA1NDkgLTEuNTQ2NCwwLjI1Nzc0IC0zLjA5MjksMC41MTU0OCAtNC42MzkzLDAuNzczMjIgeiIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1NTMzKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogIDwvZz4KICA8ZwogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTk4OC4zNjIxOCkiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlua3NjYXBlOmxhYmVsPSJDYXBhIzUiCiAgICAgaWQ9ImxheWVyNyIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEiCiAgICAgaWQ9ImxheWVyMiIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTg4LjM2MjE4KSIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaW5rc2NhcGU6bGFiZWw9IkNhcGEjMiIKICAgICBpZD0ibGF5ZXI0IgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNzIwNy0wIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MiCiAgICAgICBkPSJtIDU0LjQwNDg3NiwxMDI5Ljc3NDcgMTIuNzk5MDU3LDAgLTAuNTg1NTc0LDAuOTczMSAtMy4xMDYzMTYsMS41MTM2IC0yLjc0NTM3LDAuNTQwNiAtNC4yNDUxNzcsMi4xNjI0IC0yLjQzNTE3OCwwLjEwODEgLTMuMTA2NDg3LDEuNTEzOCAtNC44MTcxMTUsMS4wODExIC0zLjMxNDgzLDAuODY1IC0yLjg4NDM1NiwwLjEwODIgLTIuOTM1MTk4LDAuNjQ4NyAtMjcuOTEyOTk2NSwtMC4yMTYzIC0wLjI3Nzk2NSwtMC44NjQ5IDAuMjQwNzM4LC0wLjY0ODggLTEuOTg2MTc0LDAuMTA4MSAxLjEyMDIxOSwtMS40MDU1IC0xLjMzMTE1OSwtMC42NDg4IC0wLjE3MzYyNCwtMC41NDA2IDYuODMyODY3NSwtMy44OTIzIDUuMTk2ODQxLC0xLjI5NzUgNC42ODA2MjUsLTAuMTA4IDIuNzYxNTc0LC0xLjE4OTQgNS4xNzgxNTYsLTIuMDU0MyAyLjk4NjAyNSwtMS4xODkzIDMuMTk0NDY2LC0wLjU0MDYgMi42OTQ1MzYsMCAxLjk2NzU2NiwtMC44NjUgMy41NTc5ODksLTAuMTA4MSAtMS42NzM0ODksMS4wODExIDEuNTM3MDA2LC0wLjEwOCAxLjU1MzE5NywtMC43NTY5IDEwLjEzOTI0MSwwLjEwODEgLTEuMzI4NTcxLDAuNzU2OCA5LjY3MTUzNCwtMC42NDg3IDYuODM4MDE5LC0xLjA4MTIgNi42MTM0NywtMS4wODEyIC0xLjg2MzMwOSwxLjE4OTQgLTEyLjEzOTAyNCwyLjA1NDMgLTcuMjUyMzgsMS4xODkzIC0zLjgzMDg4NCwyLjA1NDMgMC4zODIwNSwxLjE4OTQgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuMjk4MDM5MjI7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg3MjA3IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MiCiAgICAgICBkPSJtIDQzLjU1NTMzNSwxMDE3LjM1MjcgMTIuNzE1ODEyLDAgMS4xMTU0MiwyLjAwNzggLTAuNDQ2MTcsMy4xMjMxIC0xLjc4NDY3MSwxLjExNTQgLTAuNDQ2MTcsNC40NjE3IC0yLjIzMDg0LDAuMjIzIC0wLjQ0NjE3MSwzLjEyMzMgLTIuOTAwMDk5LDIuMjMwOCAtMS43ODQ2NzEsMS43ODQ3IC0yLjY3NzAxMSwwLjIyMzEgLTEuNzg0Njc5LDEuMzM4NSAtMjguMTA4NjI0LC0wLjQ0NjIgLTEuNzg0NjcyLC0xLjc4NDYgLTAuODkyMzM5LC0xLjMzODYgLTEuNzg0NjcyLDAuMjIzMSAtMS4zMzg1MDg5LC0yLjkwMDEgLTIuNDUzOTI5OCwtMS4zMzg1IC0xLjExNTQyMDYsLTEuMTE1NSAwLC04LjAzMDkgMi45MDAwOTk2LC0yLjY3NzEgNC40NjE2ODI3LC0wLjIyMyAwLjY2OTI1OCwtMi40NTQgMS41NjE1OSwtNC4yMzg2IDAuODkyMzMyLC0yLjQ1MzkgMi4yMzA4NDgsLTEuMTE1NCAyLjY3NzAxMSwwIDAuNDQ2MTcsLTEuNzg0NyAzLjM0NjI2MiwtMC4yMjMxIDAuMjIzMDgsMi4yMzA4IDEuMzM4NTEsLTAuMjIzIDAuMjIzMDgxLC0xLjU2MTYgMTAuMjYxODgxLDAuMjIzMSAwLDEuNTYxNSA4LjQ3NzIwMiwtMS4zMzg1IDQuOTA3ODU5LC0yLjIzMDggNC42ODQ3NzEsLTIuMjMwOCAwLjIyMzA4MSwyLjQ1MzkgLTguNDc3MjAyLDQuMjM4NiAtNS4xMzA5NCwyLjQ1MzkgLTAuMjIzMDgxLDQuMjM4NiAyLjQ1MzkyMSwyLjQ1NCB6IgogICAgICAgc3R5bGU9ImZpbGw6I2NiZmY4NztmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzJhYWYxODtzdHJva2Utd2lkdGg6MS41NjE1OTAzMTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzg4NSIKICAgICAgIGQ9Im0gMTkuMTQ1MzUzLDEwMDkuNjc4OCAtMS4yNjE5NTIsMS4xODMyIC0yLjgzOTQsOS4yMjggLTUuNDQyMTgxNywwLjMxNTUgLTEuMjYxOTYwMiwxLjM0MDggLTAuMDc4ODY4LDUuODM2NSAyLjkxODI2ODksMS4xMDQzIDEuMDI1MzQsMi40NDQ5IDEuNzM1MTkyLC0wLjIzNjUgMi42ODE2NTYsMy43MDcgMjUuNjMzNDY2LDAgMi4yMDg0MjQsLTEuNDk4NiAyLjI4NzI5MiwwLjIzNjYgMy42MjgxMjEsLTMuMzEyNiAwLjU1MjEwOCwtMy42MjgxIDIuMjA4NDI1LC0wLjcwOTkgMC4zOTQzNTYsLTIuNjgxNyAwLjMxNTQ5NSwtMC44Njc1IDEuNDk4NTczLC0wLjk0NjUgLTAuMDc4ODcsLTEuMTgzMSAtMC4wNzg4NywtMC41NTIxIC0xMS41OTQyMjIsMC4xNTc3IC0xLjE4MzA4NSwwLjA3OSAtMi45MTgyNjgsLTMuNjI4MSAtMC41NTIxMDgsLTAuNzA5OSAwLjMxNTQ4OCwtNC45Njg5IDAuMDc4ODcsLTAuODY3NiAxLjM0MDgyOCwtMC41NTIxIC01LjM2MzMxMywxLjAyNTMgLTAuNjMwOTc2LC0xLjk3MTcgLTUuODM2NTQ1LDAgLTEuMTgzMDg1LDEuODE0IC0zLjg2NDc0LC0wLjA3OSAtMC4zOTQzNTYsLTAuOTQ2NSAtMC41NTIxMDgsMCAtMC44Njc1OTYsMS4wMjU0IC0yLjgzOTQwMSwtMC4xNTc4IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50MzEzOC03Myk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQzMTQwLTI4NSk7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtkaXNwbGF5OmlubGluZSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU3NTQiCiAgICAgICBkPSJtIDE5Ljg1MjYyOSwxMDE2LjIzNzIgYyAwLjcyNTAyMywtMC4xNjcyIDMuOTAzOTc1LC0zLjIzNDcgMy45MDM5NzUsLTMuMjM0NyAwLDAgNC41MTc0NjIsLTIuMTc1IDQuMTgyODM3LDEuMTcxMiAtMC4zMzQ2MzQsMy4zNDYyIC03LjMwNjAxNyw2LjEzNDkgLTcuMzA2MDE3LDYuMTM0OSAwLDAgLTQuOTYzNjI0LC0xLjQ1MDEgLTIuODQ0MzE5LC0yLjc4ODcgMi4xMTkyOTYsLTEuMzM4NSAyLjAwNzc1MSwtMS4zMzg1IDIuMDYzNTI0LC0xLjI4MjcgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMyYWFmMTg7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg1NzU2IgogICAgICAgZD0ibSAzMi40MDExMjMsMTAxNS44NDY4IGMgLTEuMTcxMTkzLDMuMTc5IC01Ljg1NTk2NCwyLjA2MzYgLTAuOTQ4MTA0LDMuMzQ2MyA0LjkwNzg1MiwxLjI4MjcgMi41NjU0NjYsMi4xNzUxIDQuOTA3ODUyLDEuMjI2OSAyLjM0MjM4NSwtMC45NDgxIDEuNzI4OTA2LDEuMzM4NSAyLjM0MjM4NSwtMC45NDgxIDAuNjEzNDc5LC0yLjI4NjYgMi4wNjM1MzIsMS4xNzEzIDAuNjEzNDc5LC0yLjI4NjYgLTEuNDUwMDQ2LC0zLjQ1NzcgLTEuNzI4ODk5LC0yLjIzMDggLTEuNDUwMDQ2LC0zLjUxMzUgMC4yNzg4NTMsLTEuMjgyOCAtNS40MDk3OTQsMi4xMTkzIC01LjQ2NTU2NiwyLjE3NSB6IgogICAgICAgc3R5bGU9ImZpbGw6IzJhYWYxODtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDU3NTgiCiAgICAgICBkPSJtIDQ0LjA1NzI3OCwxMDIxLjIwMDkgYyA1Ljg1NTk2MywwLjUwMiAwLjM5MDM5NywxLjcyODkgMC4zOTAzOTcsMS43Mjg5IDAsMCAtMy41NjkzNSwtMS4xMTU1IC0yLjUwOTY5NCwtMS44NDA1IDEuMDU5NjQ5LC0wLjcyNSAyLjExOTI5NywwLjExMTYgMi4xMTkyOTcsMC4xMTE2IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMmFhZjE4O3N0cm9rZTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNTgxOCIKICAgICAgIGQ9Im0gMjQuNjY2NDEsMTAxNC40OSBjIDEuMTc0MzQ3LDIuNTYxOCAzLjQyOTA3Myw0LjYxNDIgNi4xMDU0NzUsNS41MDc3IC0wLjA2MDU5LDAuOTI0IDEuMzkwOSwzLjE0NzMgMS4yNDc2OTUsMS4wMDMzIDAuMTA0NTY0LC0xLjg5MSAtMC4wMjMyMiwtNi4wNTMgLTIuOTEwNjAxLC00Ljc5MzEgLTEuOTU1NzM2LDAuNTM0NCAtMi4zNzU3MTEsLTIuODIyNyAtNC4xMzAxMSwtMi4wODU3IGwgLTAuMTcyMzI5LDAuMTYxIC0wLjE0MDEzLDAuMjA2OCAwLDAgeiIKICAgICAgIHN0eWxlPSJmaWxsOiMyYWFmMTg7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg1ODI5IgogICAgICAgZD0ibSAzMy4xMDU3NDQsMTAxMC43MDQyIGMgLTAuMDI2MywwIC0wLjA1NTM2LC0wLjAxMiAtMC4wNzg4NywwIC0wLjA4NDc5LDAuMDQyIC0wLjE0OTQ5MSwwLjEyMDMgLTAuMjM2NjIsMC4xNTc4IC0wLjA5OTYzLDAuMDQzIC0wLjIxMzk4NSwwLjA0MSAtMC4zMTU0ODgsMC4wNzkgLTAuMTEwMDg0LDAuMDQxIC0wLjIwNzQxOSwwLjExMTQgLTAuMzE1NDg4LDAuMTU3NyAtMC4wNzY0MSwwLjAzMyAtMC4xNTk0MjMsMC4wNDggLTAuMjM2NjEyLDAuMDc5IC0wLjA1NDU5LDAuMDIxIC0wLjEwMDA5OSwwLjA2NyAtMC4xNTc3NDUsMC4wNzkgLTAuMzEyNjIyLDAuMDYyIC0wLjE1MzI0NiwtMC4wODIgLTAuMzk0MzY0LDAuMDc5IC0wLjAzMDkzLDAuMDIxIC0wLjA2MjI1LDAuMDQ2IC0wLjA3ODg3LDAuMDc5IC0wLjAxMTc1LDAuMDIzIDAuMDExNzYsMC4wNTYgMCwwLjA3OSAtMC4wMTY2MiwwLjAzMyAtMC4wNjIyNSwwLjA0NiAtMC4wNzg4NiwwLjA3OSAtMC4wMDgxLDAuMDE3IC0wLjAxMTEzLDAuMjI1NSAwLDAuMjM2NyAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODYsMCAwLjAyNjM5LDAuMDI2IC0wLjAyNjM4LDAuMTMxMyAwLDAuMTU3NyAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODcsMCAwLjAzNzE4LDAuMDM3IC0wLjAzNzE5LDAuMTIwNSAwLDAuMTU3NyAwLjAxODU5LDAuMDE5IDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ3OTQsMC4wNTkgMC4wNzg4OCwwLjA3OSAwLjA0ODkyLDAuMDMyIDAuMTE2MTc0LDAuMDM3IDAuMTU3NzQ0LDAuMDc5IDAuMDQxNTcsMC4wNDIgMC4wNDYyNiwwLjEwODkgMC4wNzg4NywwLjE1NzggMC4wNDc4NiwwLjA3MSAwLjIwMTY1NywwLjE2NjcgMC4yMzY2MTIsMC4yMzY2IDAuMDExNzYsMC4wMjQgLTAuMDExNzYsMC4wNTYgMCwwLjA3OSAwLjAzMzI2LDAuMDY2IDAuMTI0NDkxLDAuMDkxIDAuMTU3NzQ1LDAuMTU3OCAwLjAxMTc2LDAuMDIzIC0wLjAxODU5LDAuMDYxIDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMzcxOSwwLjAzNyAtMC4wMzcxOSwwLjEyMDYgMCwwLjE1NzggMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg2LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTg1OSwwLjA2MSAwLDAuMDc5IDAuMTYzMTk0LDAuMTYzMiAtMC4wMDY0LC0wLjI0OTQgMC4xNTc3NDQsMC4wNzkgMC4wMTE3NiwwLjAyMyAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDMzMjYsMC4wNjYgMC4xMTY1MDMsMC4wOTYgMC4xNTc3NDQsMC4xNTc4IDAuMDc2NjMsMC4xMTQ5IDAuMDQ5MjQsMC4xNjQyIDAuMTU3NzQ0LDAuMjM2NiAwLjA0ODkyLDAuMDMyIDAuMTA4ODM1LDAuMDQ2IDAuMTU3NzQ0LDAuMDc5IDAuMDMwOTQsMC4wMiAwLjA1MjU4LDAuMDUzIDAuMDc4ODcsMC4wNzkgMC4wMjYyOSwwLjAyNiAwLjA2MjI1LDAuMDQ2IDAuMDc4ODcsMC4wNzkgMC4wMjMyNiwwLjA0NyAtMC4wMTgwOSwwLjE4MjQgMCwwLjIzNjYgMC4wMTg1OCwwLjA1NiAwLjA2MDI4LDAuMTAyIDAuMDc4ODYsMC4xNTc4IDAuMDE0MjMsMC4wNDMgMCwwLjI4ODYgMCwwLjMxNTQgMCwwLjA2NyAwLjAxNDE0LDAuMjczMSAwLDAuMzE1NSAtMC4wMTE3NiwwLjAzNSAtMC4wNzg4NiwwLjA0MiAtMC4wNzg4NiwwLjA3OSAwLDAuMDU5IDAuMDYwMjgsMC4xMDIgMC4wNzg4NiwwLjE1NzggMC4wMTY2MywwLjA1IDAsMC4xMDUxIDAsMC4xNTc3IDAsMC4xMzE1IDAsMC4yNjI5IDAsMC4zOTQ0IDAsMC4wNTMgMCwwLjEwNTEgMCwwLjE1NzcgMCwwLjAyNiAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDMzMjYsMC4wNjYgMC4xMTY0OTUsMC4wOTYgMC4xNTc3NDQsMC4xNTc3IDAuMDMyNjEsMC4wNDkgMC4wMzczLDAuMTE2MiAwLjA3ODg4LDAuMTU3OCAwLjAxODU5LDAuMDE5IDAuMDYwMjgsLTAuMDE5IDAuMDc4ODcsMCAwLjAxODU5LDAuMDE5IC0wLjAxODU5LDAuMDYxIDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA1MjU4LDAgMC4wNzg4NywwIDAuMDI2MjksMCAwLjA1MjU4LDAgMC4wNzg4NywwIDAuMjg5MTk5LDAgMC41NzgzOTgsMCAwLjg2NzU5NiwwIDAuNjAxNjg5LDAgLTAuMDYyMjIsMC4wMzUgMC4zOTQzNjQsLTAuMDc5IDAuMDUxMDEsLTAuMDEzIDAuMTA2NzI4LDAuMDEzIDAuMTU3NzQ1LDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY0IDAuMTU3NzQ0LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNzg1OSwwLjAxNyAwLjE1Nzc0NCwwIDAuMDM1MjcsLTAuMDEyIDAuMDQzNiwtMC4wNjcgMC4wNzg4NiwtMC4wNzkgMCwtMWUtNCAwLjIzNjU0MiwxMGUtNSAwLjIzNjYyLDAgMC4wMTg1OSwtMC4wMTkgLTAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IC0wLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAwLjAxODU5LC0wLjAxOSAwLjA2MDI4LDAuMDE5IDAuMDc4ODcsMCAwLjAxODU5LC0wLjAxOSAtMC4wMTE3NiwtMC4wNTYgMCwtMC4wNzkgMC4wMzMyNiwtMC4wNjYgMC4xMjQ0OSwtMC4wOTEgMC4xNTc3NDQsLTAuMTU3NyAwLjAxMTc1LC0wLjAyNCAtMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgMC4wMTg1OSwtMC4wMTkgMC4wNjAyOCwwLjAxOCAwLjA3ODg3LDAgMC4wMTg1OSwtMC4wMTkgLTAuMDExNzUsLTAuMDU2IDAsLTAuMDc5IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODgsLTAuMDc5IDAuMDIzNTIsLTAuMDQ3IC0wLjAyMzUyLC0wLjExMDcgMCwtMC4xNTc3IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODcsLTAuMDc5IDAuMDAxNywwIDAuMDAxNywtMC41NDg3IDAsLTAuNTUyMSAtMC4wMzMyNiwtMC4wNjYgLTAuMTE2NTAyLC0wLjA5NiAtMC4xNTc3NTIsLTAuMTU3NyAtMC4wNDgwMywtMC4wNzIgLTAuMDY3MzIsLTAuMTkxNCAtMC4xNTc3NDQsLTAuMjM2NiAtMC4wMjM1MSwtMC4wMTIgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg3LDAgLTAuMDM3MTksLTAuMDM3IDAuMDM3MTksLTAuMTIwNiAwLC0wLjE1NzggLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg3LDAgLTAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IDAsLTAuMDI2IC0wLjAxODU5LC0wLjA2IDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IC0wLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAwLjE2MzE5NCwtMC4xNjMyIC0wLjAwNjQsMC4yNDk0IDAuMTU3NzQ0LC0wLjA3OSAwLjAxMTc2LC0wLjAyMyAtMC4wMDgzLC0wLjA1NCAwLC0wLjA3OSAwLjAxODU5LC0wLjA1NiAwLjA2MDI4LC0wLjEwMiAwLjA3ODg3LC0wLjE1NzggMC4wMDgzLC0wLjAyNCAtMC4wMTE3NiwtMC4wNTYgMCwtMC4wNzkgMC4wMTY2MywtMC4wMzMgMC4wNjIyNSwtMC4wNDYgMC4wNzg4NywtMC4wNzkgMC4wMTE3NSwtMC4wMjMgLTAuMDExNzUsLTAuMDU2IDAsLTAuMDc5IDAuMDQ3MzMsLTAuMDk1IDAuMTg5Mjk2LC0wLjE0MiAwLjIzNjYyLC0wLjIzNjUgMC4wMTE3NiwtMC4wMjQgLTAuMDExNzYsLTAuMDU2IDAsLTAuMDc5IDAuMDM0OTYsLTAuMDcgMC4xODg3NSwtMC4xNjQ4IDAuMjM2NjIsLTAuMjM2NiAwLjEyMzU5MywwLjA2MSAwLjA2NDEzLC0wLjIwNzEgMC4wNzg4NywtMC4yMzY2IDAuMDE2NjMsLTAuMDMzIDAuMDYyMjUsLTAuMDQ2IDAuMDc4ODcsLTAuMDc5IDAuMDExNzUsLTAuMDIzIC0wLjAxMTc2LC0wLjA1NiAwLC0wLjA3OSAwLjAxNjYyLC0wLjAzMyAwLjA2MjI1LC0wLjA0NiAwLjA3ODg2LC0wLjA3OSAwLjAxMiwtMC4wMjQgMCwtMC4yNjEgMCwtMC4zMTU0IDAsLTAuMTU3OCAwLC0wLjMxNTUgMCwtMC40NzMzIDAsLTAuMDI2IDAsLTAuMDUzIDAsLTAuMDc5IDAsLTAuMDI2IDAuMDExNzYsLTAuMDU2IDAsLTAuMDc5IC0wLjAxNjYyLC0wLjAzMyAtMC4wNjIyNSwtMC4wNDYgLTAuMDc4ODYsLTAuMDc5IC0wLjAxNTY0LC0wLjAzMSAwLjAxNjEyLC0wLjIyMDUgMCwtMC4yMzY3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAzNzE5LC0wLjAzNyAwLjAzNzE5LC0wLjEyMDUgMCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOCAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAzNzE4LC0wLjAzNyAwLjAzNzE5LC0wLjEyMDUgMCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAxODU5LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODYsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTE3NSwtMC4wNTYgMCwtMC4wNzkgLTAuMDMzMjYsLTAuMDY3IC0wLjEyNDQ5MSwtMC4wOTEgLTAuMTU3NzQ1LC0wLjE1NzggLTAuMDExNzYsLTAuMDI0IDAuMDE4NTgsLTAuMDYxIDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNTUzNiwwLjAxMiAtMC4wNzg4NywwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDU2MiwtMC4wNjMgLTAuMDc4ODgsLTAuMDc5IC0wLjAyMzUxLC0wLjAxMiAtMC4wNTUzNSwwLjAxMiAtMC4wNzg4NiwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDU2MiwtMC4wNjIgLTAuMDc4ODcsLTAuMDc5IC0wLjA0Mjc4LC0wLjAyMSAtMC4yOTM5MDYsMC4wMjIgLTAuMzE1NDg4LDAgLTAuMDE4NTksLTAuMDE5IDAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNTI1OCwwIC0wLjA3ODg3LDAgLTAuMTU3NzQzLDAgLTAuMzE1NDg3LDAgLTAuNDczMjMxLDAgLTAuMDI2MywwIC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg4LDAgLTAuMDE4NTksLTAuMDE5IDAuMDE4NTksLTAuMDYgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA1MjU4LDAgLTAuMDc4ODcsMCAtMC4xODQwNDEsMCAtMC4zNjgwNzQsMCAtMC41NTIxMDcsMCAtMC4xODQwMzQsMCAtMC4zNjgwNzUsMCAtMC41NTIxMDksMCAtMC4wMjYyOSwwIC0wLjA2MDI4LC0wLjAxOSAtMC4wNzg4NiwwIC0wLjAxODU5LDAuMDE5IDAuMDE4NTksMC4wNjEgMCwwLjA3OSAtMC4wMzk0NCwwLjAzOSAtMC4xOTcxODMsLTAuMDM5IC0wLjIzNjYyMSwwIC0wLjAxODU5LDAuMDE5IDAuMDE4NTksMC4wNjEgMCwwLjA3OSAtMC4wMzcxOSwwLjAzNyAtMC4xMTA3MTcsLTAuMDI0IC0wLjE1Nzc0NCwwIC0wLjAzMzI2LDAuMDE3IC0wLjA0NTYyLDAuMDYyIC0wLjA3ODg2LDAuMDc5IC0wLjAyMzUyLDAuMDEyIC0wLjA3ODg3LDAuMDI2IC0wLjA3ODg3LDAgMCwtMC4wMjYgMC4wNjUzNCwtMC4wMjMgMC4wNzg4NywwIDAuMDcyODQsMC4xMjE0IDAuMTA1MTU4LDAuMjYyOSAtMC4xNTc3NDQsMC4zOTQzIHoiCiAgICAgICBzdHlsZT0iZmlsbDojMmFhZjE4O3N0cm9rZTpub25lO2Rpc3BsYXk6aW5saW5lIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoNTgzMyIKICAgICAgIGQ9Im0gMTYuNzc5MTkzLDEwMjAuNTYzMiBjIDAuMDI2MjksMCAwLjA1NywwLjAxNSAwLjA3ODg2LDAgMC4wNjE4OCwtMC4wNDEgMC4wOTM5OSwtMC4xMTk1IDAuMTU3NzQ1LC0wLjE1NzcgMC4wNzEyOSwtMC4wNDMgMC4xNTk0MywtMC4wNDggMC4yMzY2MiwtMC4wNzkgMC4yMTAzMjMsLTAuMDg0IDAuMTMyNzc0LC0wLjEwNTQgMC4zOTQzNjQsLTAuMTU3OCAwLjA1MTU2LC0wLjAxIDAuMTA2NzI3LDAuMDEzIDAuMTU3NzQ0LDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY0IDAuMTU3NzQ0LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNzg1OSwwLjAxNyAwLjE1Nzc0MywwIDAuMDM1MjcsLTAuMDEyIDAuMDQ1NjIsLTAuMDYyIDAuMDc4ODcsLTAuMDc5IDAuMDQ3MDMsLTAuMDI0IDAuMTIwNTYzLDAuMDM3IDAuMTU3NzQ1LDAgMC4wMTg1OSwtMC4wMTkgLTAuMDE4NTksLTAuMDYxIDAsLTAuMDc5IDAuMDE4NTksLTAuMDE5IDAuMDYwMjgsMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IDAuMDI2MjksMCAwLjA1NTM2LDAuMDEyIDAuMDc4ODcsMCAwLjA2NjUyLC0wLjAzMyAwLjA4NzIsLTAuMTM0MyAwLjE1Nzc0NCwtMC4xNTc4IDAuMDQ5ODksLTAuMDE3IDAuMTA2NzM1LDAuMDEzIDAuMTU3NzUyLDAgMC4wNTcwMywtMC4wMTUgMC4xMDA3MDcsLTAuMDY1IDAuMTU3NzQ1LC0wLjA3OSAwLjA1MTAxLC0wLjAxMyAwLjEwNjcyNiwwLjAxMyAwLjE1Nzc0MywwIDAuMTE0MDY3LC0wLjAyOCAwLjIwMTQyMiwtMC4xMjkzIDAuMzE1NDg4LC0wLjE1NzcgMC4wNTEwMSwtMC4wMTMgMC4xMDc4NTksMC4wMTcgMC4xNTc3NDUsMCAwLjAzNTI3LC0wLjAxMiAwLjA0NzkzLC0wLjA1OSAwLjA3ODg3LC0wLjA3OSAwLjAzOTcxLC0wLjE3MzcgMC4xNjIyNTcsLTAuMDQyIDAuMjM2NjE5LC0wLjA3OSAwLjAzMzI2LC0wLjAxNyAwLjA0NTYyLC0wLjA2MiAwLjA3ODg3LC0wLjA3OSAwLjAyMzUyLC0wLjAxMiAwLjA1NTM2LDAuMDEyIDAuMDc4ODgsMCAwLjAzMzI2LC0wLjAxNyAwLjA0NTYyLC0wLjA2MyAwLjA3ODg3LC0wLjA3OSAwLjAyMzUyLC0wLjAxMiAwLjA1NTM2LDAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LC0wLjAxNyAwLjA0MzU5LC0wLjA2NyAwLjA3ODg4LC0wLjA3OSAwLjA5OTc2LC0wLjAzMyAwLjIxNTcxOCwwLjAzMyAwLjMxNTQ4OCwwIDAuMDM1MjcsLTAuMDEyIDAuMDQzNTksLTAuMDY3IDAuMDc4ODcsLTAuMDc5IDAuMDE5NjYsLTAuMDEgMC4zODYyMzYsMC4wMSAwLjM5NDM2NCwwIDAuMDE4NTksLTAuMDE4IC0wLjAxODU5LC0wLjA2IDAsLTAuMDc5IDAuMDAzNiwwIDAuMzU3MTc1LDAgMC4zOTQzNTYsMCAwLjE1Nzc0NSwwIDAuMzE1NDk2LDAgMC40NzMyNCwwIDAuMDI2MjksMCAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTE3NiwwLjA1NiAwLDAuMDc5IDAuMDQ1MjEsMC4wOSAwLjE2NDU2OSwwLjEwOTggMC4yMzY2MjEsMC4xNTc3IDAuMDcxNzksMC4wNDggMC4xNjY3MDcsMC4yMDE4IDAuMjM2NjEyLDAuMjM2NyAwLjAyMzUyLDAuMDEyIDAuMDUzOTMsLTAuMDEgMC4wNzg4NywwIDAuNTcxMywwLjE5MDQgLTAuMTI0MzQ5LC0wLjAyMiAwLjIzNjYxMiwwLjE1NzggMC4wMjM1MiwwLjAxMiAwLjA2MDI4LC0wLjAxOSAwLjA3ODg4LDAgMC4wMTg1OSwwLjAxOCAtMC4wMTg1OSwwLjA2IDAsMC4wNzkgMC4wMTg1OSwwLjAxOSAwLjA2MDI4LC0wLjAxOSAwLjA3ODg3LDAgMC4wMTg1OSwwLjAxOSAtMC4wMTE3NSwwLjA1NiAwLDAuMDc5IDAuMDE2NjMsMC4wMzMgMC4wNjIyNSwwLjA0NiAwLjA3ODg3LDAuMDc5IDAuMDExNzYsMC4wMjMgLTAuMDE4NTksMC4wNiAwLDAuMDc5IDAuMDE4NTksMC4wMTkgMC4wNjAyOCwtMC4wMTkgMC4wNzg4NywwIDAuMDE4NTksMC4wMTkgLTAuMDExNzUsMC4wNTYgMCwwLjA3OSAwLjA0NTIyLDAuMDkxIDAuMTY0NTY4LDAuMTA5OCAwLjIzNjYyLDAuMTU3OCAwLjA2MTg3LDAuMDQxIDAuMDk1ODgsMC4xMTY1IDAuMTU3NzQ0LDAuMTU3NyAwLjM0NDQ3OSwwLjIyOTcgLTAuMDI2LC0wLjAzNSAwLjMxNTQ4OCwwLjA3OSAwLjAzNTI4LDAuMDEyIDAuMDQ1NjIsMC4wNjIgMC4wNzg4NywwLjA3OSAwLjAyMzUxLDAuMDEyIDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ1NjIsMC4wNjIgMC4wNzg4OCwwLjA3OSAwLjAyMzUxLDAuMDEyIDAuMDU1MzYsLTAuMDEyIDAuMDc4ODcsMCAwLjAzMzI2LDAuMDE3IDAuMDQ1NjIsMC4wNjMgMC4wNzg4NywwLjA3OSAwLjA0NzAyLDAuMDIzIDAuMTEwNzA5LC0wLjAyNCAwLjE1Nzc0NCwwIDAuMDMzMjYsMC4wMTcgMC4wNDU2MiwwLjA2MiAwLjA3ODg2LDAuMDc5IDAuMDUwNDEsMC4wMjUgMC4yNTIwMSwtMC4wMjEgMC4zMTU0ODksMCAwLjA1NTc3LDAuMDE5IDAuMTAxOTc5LDAuMDYxIDAuMTU3NzUxLDAuMDc5IDAuMDI0OTQsMC4wMSAwLjA1NTM1LC0wLjAxMiAwLjA3ODg3LDAgMC4wMzMyNiwwLjAxNyAwLjA0MzU5LDAuMDY3IDAuMDc4ODcsMC4wNzkgMC4wMzYwNywwLjAxMiAwLjI4MDM5MSwtMC4wMTggMC4zMTU0ODksMCAwLjAyNjQ5LDAuMDE0IDAuMTMxMjUxLDAuMTQ0NSAwLjE1Nzc0NCwwLjE1NzggMC4wMjM1MSwwLjAxMiAwLjA1NTM2LC0wLjAxMiAwLjA3ODg3LDAgMC4wMzMyNiwwLjAxNyAwLjA0NTYyLDAuMDYyIDAuMDc4ODgsMC4wNzkgMC4wMjM1MSwwLjAxMiAwLjA1NTM2LC0wLjAxMiAwLjA3ODg2LDAgMC4wMzMyNiwwLjAxNyAwLjA0NTYyLDAuMDYzIDAuMDc4ODgsMC4wNzkgMC4wNDcwMiwwLjAyMyAwLjEyMDU2MywtMC4wMzcgMC4xNTc3NDQsMCAwLjAwMzYsMCAwLDAuMzU3MiAwLDAuMzk0NCAwLDAuMDE5IDAuMDAyNSwwLjIzNDEgMCwwLjIzNjYgLTAuMDE4NTksMC4wMTkgLTAuMDU1MzYsLTAuMDEyIC0wLjA3ODg3LDAgLTAuMDc3NjIsMC4wMzkgLTAuMjM3ODc3LDAuMjc2NiAtMC4zMTU0ODgsMC4zMTU1IC0wLjAyMzUxLDAuMDEyIC0wLjA2MDI4LC0wLjAxOSAtMC4wNzg4NywwIC0wLjAxODU5LDAuMDE5IDAuMDExNzUsMC4wNTYgMCwwLjA3OSAtMC4wODcyLDAuMTc0NCAtMC4wNDg5NiwwLjAyNSAtMC4xNTc3NDQsMC4wNzkgLTAuMDMzMjYsMC4wMTcgLTAuMDQ1NjIsMC4wNjIgLTAuMDc4ODgsMC4wNzkgLTAuMDIzNTIsMC4wMTIgLTAuMDUyNTgsMCAtMC4wNzg4NiwwIC0wLjA1MjU4LDAgLTAuMTA2NzM1LC0wLjAxMyAtMC4xNTc3NDUsMCAtMC4xNDI3NiwtMC4wNDggLTAuMTQ2Njg3LDAuMTI3NyAtMC4yMzY2MiwwLjE1NzcgLTAuMDQ5ODksMC4wMTcgLTAuMTA2NzM0LC0wLjAxMyAtMC4xNTc3NDQsMCAtMC4wNTcwMywwLjAxNSAtMC4xMDA3MTUsMC4wNjUgLTAuMTU3NzQzLDAuMDc5IC0wLjA1MTAxLDAuMDEzIC0wLjEwNjczNSwtMC4wMTMgLTAuMTU3NzQ0LDAgLTAuMDU3MDQsMC4wMTUgLTAuMTAwNzE1LDAuMDY0IC0wLjE1Nzc0NSwwLjA3OSAtMC4wNTk5OCwwLjAxNSAtMC4zMjgzMTYsMCAtMC4zOTQzNjQsMCAtMC4xMzE0NTQsMCAtMC4yNjI5MDksMCAtMC4zOTQzNTYsMCAtMC4wMjYzLDAgLTAuMDUyNTgsMCAtMC4wNzg4OCwwIC0wLjAyNjI5LDAgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODgsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYyIC0wLjA3ODg2LC0wLjA3OSAtMC4wNDcwMiwtMC4wMjMgLTAuMTEwNzE3LDAuMDIzIC0wLjE1Nzc0NCwwIC0wLjAyMTEsLTAuMDExIC0wLjEzNjYzOSwtMC4xNDcxIC0wLjE1Nzc0NCwtMC4xNTc3IC0wLjAyMzUyLC0wLjAxMiAtMC4wNTUzNiwwLjAxMiAtMC4wNzg4OCwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNTI1OCwtMC4wNTMgLTAuMDc4ODYsLTAuMDc5IC0wLjA5MDI1LC0wLjA5IC0wLjA5MzM2LC0wLjExIC0wLjIzNjYyLC0wLjE1NzcgLTAuMDI0OTMsLTAuMDEgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMjA5NCwtMC4wMTEgLTAuMjI2MTUsLTAuMjE1NyAtMC4yMzY2MjEsLTAuMjM2NyAtMC4wMTE3NiwtMC4wMjMgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYyIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDU1MzYsMC4wMTIgLTAuMDc4ODcsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg4LC0wLjA3OSAtMC4wMjM1MiwtMC4wMTIgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OCwtMC4wMTkgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMzcxOCwtMC4wMzcgLTAuMTEwNzEsMC4wMjMgLTAuMTU3NzQ0LDAgLTAuMDMzMjYsLTAuMDE3IC0wLjA0NTYyLC0wLjA2MiAtMC4wNzg4NywtMC4wNzkgLTAuMDQ5NzYsLTAuMDI0IC0wLjM0NDYwNCwwLjAyNCAtMC4zOTQzNjMsMCAtMC4wMzMyNiwtMC4wMTcgLTAuMDQ1NjIsLTAuMDYzIC0wLjA3ODg3LC0wLjA3OSAtMC4wMjg1MiwtMC4wMTUgLTAuMzM5NTA2LDAgLTAuMzk0MzY0LDAgLTAuMDI2MjksMCAtMC4wNjAyOCwtMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwwLjAxOSAwLjAyMzUxLDAuMDY3IDAsMC4wNzkgLTAuMTU3NzQ0LDAuMDc5IC0wLjExODMxNCwtMC4wMzkgLTAuMjM2NjIsMCAtMC4wNTU3NywwLjAxOSAtMC4xMDA3MTUsMC4wNjQgLTAuMTU3NzQ0LDAuMDc5IC0wLjA1MTAxLDAuMDEzIC0wLjEwNzg1OSwtMC4wMTcgLTAuMTU3NzQ1LDAgLTAuMDM1MjgsMC4wMTIgLTAuMDQ1NjIsMC4wNjIgLTAuMDc4ODcsMC4wNzkgLTAuMDMxMjcsMC4wMTYgLTAuMjIwNDg5LC0wLjAxNiAtMC4yMzY2MTIsMCAtMC4wMTg1OSwwLjAxOSAwLjAyMzUxLDAuMDY3IDAsMC4wNzkgLTAuMDQ3MDMsMC4wMjMgLTAuMTEwNzE4LC0wLjAyNCAtMC4xNTc3NDQsMCAtMC4wMjM1MiwwLjAxMiAwLjAxODU5LDAuMDYxIDAsMC4wNzkgLTAuMDM3MTksMC4wMzcgLTAuMTEwNzE3LC0wLjAyMyAtMC4xNTc3NDUsMCAtMC4wMzMyNiwwLjAxNyAtMC4wNDU2MiwwLjA2MiAtMC4wNzg4NywwLjA3OSAtMC4wMjQwMSwwLjAxMiAtMC4yMDEwOTQsMCAtMC4yMzY2MTIsMCAtMC4xODQwNDIsMCAtMC4zNjgwNzUsMCAtMC41NTIxMDksMCAtMC4yNjI5MDksMCAtMC41MjU4MTgsMCAtMC43ODg3MiwwIC0wLjAyNjMsMCAtMC4wNTI1OCwwIC0wLjA3ODg4LDAgLTAuMDI2MjksMCAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NiwwIC0wLjAxODU5LC0wLjAxOCAwLjAxODU5LC0wLjA2IDAsLTAuMDc5IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4OCwwIC0wLjAxODU5LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMzcxOSwtMC4wMzcgLTAuMTEwNzE3LDAuMDIzIC0wLjE1Nzc0NCwwIC0wLjAzMzI2LC0wLjAxNyAtMC4wNDE2OSwtMC4wNzkgLTAuMDc4ODcsLTAuMDc5IC0wLjAyNjMsMCAwLjAyNjI5LDAuMDc5IDAsMC4wNzkgLTAuMTY0MTMxLDAgLTAuMDMxNzQsLTAuMTEwNiAtMC4wNzg4OCwtMC4xNTc3IC0wLjAxODU5LC0wLjAxOSAtMC4wNjAyOCwwLjAxOSAtMC4wNzg4NywwIC0wLjAxODU4LC0wLjAxOSAwLjAxODU5LC0wLjA2MSAwLC0wLjA3OSAtMC4wMTg1OCwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODcsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNiAwLC0wLjA3OSAtMC4wMTg1OSwtMC4wMTkgLTAuMDYwMjgsMC4wMTkgLTAuMDc4ODgsMCAtMC4wMTg1OSwtMC4wMTkgMC4wMTg1OSwtMC4wNjEgMCwtMC4wNzkgLTAuMDE4NTksLTAuMDE5IC0wLjA2MDI4LDAuMDE5IC0wLjA3ODg2LDAgLTAuMDE4NTksLTAuMDE5IDAsLTAuMDUzIDAsLTAuMDc5IC0wLjEzMTQ1NSwtMC4xMDUyIC0wLjI2MjkxLC0wLjIxMDMgMCwtMC42MzEgeiIKICAgICAgIHN0eWxlPSJmaWxsOiNjYmZmODc7c3Ryb2tlOm5vbmU7ZGlzcGxheTppbmxpbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGg3MTY5IgogICAgICAgZD0ibSAxMC4zMTI2ODcsMTAyMS40OTE3IC0xLjAwMzg4NDUsMS4zMzg1IC0wLjIyMzA4MSwzLjc5MjQgMi43ODg1NTQ1LDEuNzg0NyAwLjU1NzcwNywyLjAwNzggMi4xMTkzMDQsMCAyLjQ1MzkzMSwzLjY4MDkgMjQuNjUwODE4LDAgMi4yMzA4NDEsLTEuNjczMSAyLjM0MjM4NiwwLjExMTUgMy43OTI0MzEsLTIuNzg4NSAwLjY2OTI1MSwtMy4xMjMzIDEuMDAzODg0LC0wLjg5MjMgMC44OTIzMzgsLTEuMjI2OSAtMC4yMjMwODgsLTEuNTYxNiAtMi4wMDc3NiwtMS4wMDM5IC00MC4wNDM2MzIsLTAuNDQ2MiB6IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDMxMjgtODk5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yNDguMjMyMjUsOTUwLjI4MzUpIgogICAgICAgaWQ9Imc2NDAzLTMtMCIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIxMzIzLjI5OTgiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIxMzc2LjYyMTEiCiAgICAgICAgIHNvZGlwb2RpOnJ4PSI1Ny41Nzg2OTMiCiAgICAgICAgIHNvZGlwb2RpOnJ5PSI1Ny41Nzg2OTMiCiAgICAgICAgIGQ9Im0gMTM4MC44Nzg1LDEzNzYuNjIxMSBjIDAsMzEuNzk5OCAtMjUuNzc4OSw1Ny41Nzg3IC01Ny41Nzg3LDU3LjU3ODcgLTMxLjc5OTgsMCAtNTcuNTc4NywtMjUuNzc4OSAtNTcuNTc4NywtNTcuNTc4NyAwLC0zMS43OTk4IDI1Ljc3ODksLTU3LjU3ODcgNTcuNTc4NywtNTcuNTc4NyAzMS43OTk4LDAgNTcuNTc4NywyNS43Nzg5IDU3LjU3ODcsNTcuNTc4NyB6IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzEzLjcyNDgsLTI5OC45ODQxMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnNTc0NS00LTQtOC0zLTciCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzU4LTk4NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02IgogICAgICAgICAgIGQ9Im0gMTA4MC4wNjYyLDExNzUuNTk4NiBjIC04Ljg3NzksMC4xNDYgLTQuNjU5MiwxNy4yMTYzIC0xMy4zMzc5LDE5LjA5MTUgLTguNjc4OCwxLjg3NTIgLTExLjk5MTUsLTE1LjMwMSAtMjAuMTM3NywtMTEuNzY4NyAtOC4xNDYyLDMuNTMyMiAyLjMzMTUsMTcuNjk5MiAtNC45NjksMjIuNzUyOSAtNy4zMDA2LDUuMDUzNiAtMTYuODQwMSwtOS43ODA3IC0yMy4wMTQ1LC0zLjM5OTkgLTYuMTc0Myw2LjM4MDggOC43MzM4LDE1LjU1MTcgMy45MjMsMjMuMDE0NSAtNC44MTA5LDcuNDYyNyAtMTkuNDkwNCwtMi4yNDI4IC0yMi43NTI5Nyw2LjAxNTEgLTMuMjYyNSw4LjI1NzkgMTQuMTQyMTcsMTAuODc4OSAxMi41NTMzNywxOS42MTQ2IC0xLjU4ODgsOC43MzU3IC0xOC43MTQ0Nyw1LjI0NDcgLTE4LjU2ODQ3LDE0LjEyMjUgMC4xNDYsOC44Nzc4IDE3LjIxNjM3LDQuNjU5MSAxOS4wOTE0NywxMy4zMzc5IDEuODc1Miw4LjY3ODggLTE1LjMwMDk3LDExLjk5MTUgLTExLjc2ODcsMjAuMTM3NyAzLjUzMjMsOC4xNDYyIDE3LjY5OTIsLTIuMzMxNiAyMi43NTI5LDQuOTY5IDUuMDUzNyw3LjMwMDUgLTkuNzgwNywxNi44NDAxIC0zLjM5OTksMjMuMDE0NCA2LjM4MDgsNi4xNzQ0IDE1LjU1MTcsLTguNzMzOCAyMy4wMTQ1LC0zLjkyMjkgNy40NjI4LDQuODEwOSAtMi4yNDI4LDE5LjQ5MDQgNi4wMTUxLDIyLjc1MyA4LjI1OCwzLjI2MjUgMTAuODc4OSwtMTQuMTQyMiAxOS42MTQ2LC0xMi41NTM0IDguNzM1OCwxLjU4ODggNS4yNDQ3LDE4LjcxNDUgMTQuMTIyNSwxOC41Njg1IDguODc3OSwtMC4xNDYgNC42NTkyLC0xNy4yMTY0IDEzLjMzNzksLTE5LjA5MTUgOC42Nzg4LC0xLjg3NTIgMTEuOTkxNSwxNS4zMDEgMjAuMTM3NywxMS43Njg3IDguMTQ2MiwtMy41MzIzIC0yLjMzMTUsLTE3LjY5OTMgNC45NjksLTIyLjc1MjkgNy4zMDA2LC01LjA1MzcgMTYuODQwMSw5Ljc4MDcgMjMuMDE0NSwzLjM5OTggNi4xNzQzLC02LjM4MDggLTguNzMzOCwtMTUuNTUxNiAtMy45MjMsLTIzLjAxNDQgNC44MTA5LC03LjQ2MjggMTkuNDkwNCwyLjI0MjggMjIuNzUzLC02LjAxNTEgMy4yNjI1LC04LjI1OCAtMTQuMTQyMiwtMTAuODc4OSAtMTIuNTUzNCwtMTkuNjE0NiAxLjU4ODgsLTguNzM1OCAxOC43MTQ1LC01LjI0NDcgMTguNTY4NSwtMTQuMTIyNSAtMC4xNDYsLTguODc3OSAtMTcuMjE2NCwtNC42NTkyIC0xOS4wOTE1LC0xMy4zMzggLTEuODc1MiwtOC42Nzg3IDE1LjMwMSwtMTEuOTkxNCAxMS43Njg3LC0yMC4xMzc2IC0zLjUzMjMsLTguMTQ2MiAtMTcuNjk5MiwyLjMzMTUgLTIyLjc1MjksLTQuOTY5IC01LjA1MzcsLTcuMzAwNiA5Ljc4MDcsLTE2Ljg0MDEgMy4zOTk5LC0yMy4wMTQ1IC02LjM4MDksLTYuMTc0MyAtMTUuNTUxNyw4LjczMzggLTIzLjAxNDUsMy45MjI5IC03LjQ2MjgsLTQuODEwOCAyLjI0MjgsLTE5LjQ5MDQgLTYuMDE1MSwtMjIuNzUyOSAtOC4yNTgsLTMuMjYyNSAtMTAuODc4OSwxNC4xNDIyIC0xOS42MTQ2LDEyLjU1MzQgLTguNzM1OCwtMS41ODg4IC01LjI0NDcsLTE4LjcxNDUgLTE0LjEyMjUsLTE4LjU2ODUgeiBtIDEuNTY5MSw0MC44NzAyIGMgMjUuNDA4LDAgNDcuMDAzMiwyMS41OTUyIDQ3LjAwMzIsNDcuMDAzMSAwLDI1LjQwOCAtMjEuNTk1Miw0Ny4wMDMxIC00Ny4wMDMyLDQ3LjAwMzEgLTI1LjQwNzksMCAtNDcuMDAzMSwtMjEuNTk1MSAtNDcuMDAzMSwtNDcuMDAzMSAwLC0yNS40MDc5IDIxLjU5NTIsLTQ3LjAwMzEgNDcuMDAzMSwtNDcuMDAzMSB6IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzU2LTQ4NSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLXdpZHRoOjQuMDg3MjI2Mzk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yMzcuOTE0NjEsOTUwLjExNjE4KSIKICAgICAgIGlkPSJnNjQwMy0zLTAtNCIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy00IgogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjY5NjY3NzQ5LDAsMCwwLjY5NjY3NzQ5LDI4ODIuOTMxNSwxOTguMjUwMTEpIgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2Mi02NzMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS1vcGFjaXR5OjE7ZGlzcGxheTppbmxpbmUiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc2Njc3NzYyIKICAgICAgICAgICBpZD0icGF0aDU2NjUtOS00LTUtMzEtNi04IgogICAgICAgICAgIGQ9Im0gMTA4MC4wNjYyLDExNzUuNTk4NiBjIC04Ljg3NzksMC4xNDYgLTQuNjU5MiwxNy4yMTYzIC0xMy4zMzc5LDE5LjA5MTUgLTguNjc4OCwxLjg3NTIgLTExLjk5MTUsLTE1LjMwMSAtMjAuMTM3NywtMTEuNzY4NyAtOC4xNDYyLDMuNTMyMiAyLjMzMTUsMTcuNjk5MiAtNC45NjksMjIuNzUyOSAtNy4zMDA2LDUuMDUzNiAtMTYuODQwMSwtOS43ODA3IC0yMy4wMTQ1LC0zLjM5OTkgLTYuMTc0Myw2LjM4MDggOC43MzM4LDE1LjU1MTcgMy45MjMsMjMuMDE0NSAtNC44MTA5LDcuNDYyNyAtMTkuNDkwNCwtMi4yNDI4IC0yMi43NTI5Nyw2LjAxNTEgLTMuMjYyNSw4LjI1NzkgMTQuMTQyMTcsMTAuODc4OSAxMi41NTMzNywxOS42MTQ2IC0xLjU4ODgsOC43MzU3IC0xOC43MTQ0Nyw1LjI0NDcgLTE4LjU2ODQ3LDE0LjEyMjUgMC4xNDYsOC44Nzc4IDE3LjIxNjM3LDQuNjU5MSAxOS4wOTE0NywxMy4zMzc5IDEuODc1Miw4LjY3ODggLTE1LjMwMDk3LDExLjk5MTUgLTExLjc2ODcsMjAuMTM3NyAzLjUzMjMsOC4xNDYyIDE3LjY5OTIsLTIuMzMxNiAyMi43NTI5LDQuOTY5IDUuMDUzNyw3LjMwMDUgLTkuNzgwNywxNi44NDAxIC0zLjM5OTksMjMuMDE0NCA2LjM4MDgsNi4xNzQ0IDE1LjU1MTcsLTguNzMzOCAyMy4wMTQ1LC0zLjkyMjkgNy40NjI4LDQuODEwOSAtMi4yNDI4LDE5LjQ5MDQgNi4wMTUxLDIyLjc1MyA4LjI1OCwzLjI2MjUgMTAuODc4OSwtMTQuMTQyMiAxOS42MTQ2LC0xMi41NTM0IDguNzM1OCwxLjU4ODggNS4yNDQ3LDE4LjcxNDUgMTQuMTIyNSwxOC41Njg1IDguODc3OSwtMC4xNDYgNC42NTkyLC0xNy4yMTY0IDEzLjMzNzksLTE5LjA5MTUgOC42Nzg4LC0xLjg3NTIgMTEuOTkxNSwxNS4zMDEgMjAuMTM3NywxMS43Njg3IDguMTQ2MiwtMy41MzIzIC0yLjMzMTUsLTE3LjY5OTMgNC45NjksLTIyLjc1MjkgNy4zMDA2LC01LjA1MzcgMTYuODQwMSw5Ljc4MDcgMjMuMDE0NSwzLjM5OTggNi4xNzQzLC02LjM4MDggLTguNzMzOCwtMTUuNTUxNiAtMy45MjMsLTIzLjAxNDQgNC44MTA5LC03LjQ2MjggMTkuNDkwNCwyLjI0MjggMjIuNzUzLC02LjAxNTEgMy4yNjI1LC04LjI1OCAtMTQuMTQyMiwtMTAuODc4OSAtMTIuNTUzNCwtMTkuNjE0NiAxLjU4ODgsLTguNzM1OCAxOC43MTQ1LC01LjI0NDcgMTguNTY4NSwtMTQuMTIyNSAtMC4xNDYsLTguODc3OSAtMTcuMjE2NCwtNC42NTkyIC0xOS4wOTE1LC0xMy4zMzggLTEuODc1MiwtOC42Nzg3IDE1LjMwMSwtMTEuOTkxNCAxMS43Njg3LC0yMC4xMzc2IC0zLjUzMjMsLTguMTQ2MiAtMTcuNjk5MiwyLjMzMTUgLTIyLjc1MjksLTQuOTY5IC01LjA1MzcsLTcuMzAwNiA5Ljc4MDcsLTE2Ljg0MDEgMy4zOTk5LC0yMy4wMTQ1IC02LjM4MDksLTYuMTc0MyAtMTUuNTUxNyw4LjczMzggLTIzLjAxNDUsMy45MjI5IC03LjQ2MjgsLTQuODEwOCAyLjI0MjgsLTE5LjQ5MDQgLTYuMDE1MSwtMjIuNzUyOSAtOC4yNTgsLTMuMjYyNSAtMTAuODc4OSwxNC4xNDIyIC0xOS42MTQ2LDEyLjU1MzQgLTguNzM1OCwtMS41ODg4IC01LjI0NDcsLTE4LjcxNDUgLTE0LjEyMjUsLTE4LjU2ODUgeiBtIDEuNTY5MSw0MC44NzAyIGMgMjUuNDA4LDAgNDcuMDAzMiwyMS41OTUyIDQ3LjAwMzIsNDcuMDAzMSAwLDI1LjQwOCAtMjEuNTk1Miw0Ny4wMDMxIC00Ny4wMDMyLDQ3LjAwMzEgLTI1LjQwNzksMCAtNDcuMDAzMSwtMjEuNTk1MSAtNDcuMDAzMSwtNDcuMDAzMSAwLC0yNS40MDc5IDIxLjU5NTIsLTQ3LjAwMzEgNDcuMDAzMSwtNDcuMDAzMSB6IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzYwLTc1NCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLXdpZHRoOjQuMDg3MjI2Mzk7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjA3MzYyODA3LDAsMCwwLjA3MzYyODA3LC0yMjcuODc1ODEsOTUwLjExNjE4KSIKICAgICAgIGlkPSJnNjQwMy0zLTAtMyIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIxMzIzLjI5OTgiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIxMzc2LjYyMTEiCiAgICAgICAgIHNvZGlwb2RpOnJ4PSI1Ny41Nzg2OTMiCiAgICAgICAgIHNvZGlwb2RpOnJ5PSI1Ny41Nzg2OTMiCiAgICAgICAgIGQ9Im0gMTM4MC44Nzg1LDEzNzYuNjIxMSBjIDAsMzEuNzk5OCAtMjUuNzc4OSw1Ny41Nzg3IC01Ny41Nzg3LDU3LjU3ODcgLTMxLjc5OTgsMCAtNTcuNTc4NywtMjUuNzc4OSAtNTcuNTc4NywtNTcuNTc4NyAwLC0zMS43OTk4IDI1Ljc3ODksLTU3LjU3ODcgNTcuNTc4NywtNTcuNTc4NyAzMS43OTk4LDAgNTcuNTc4NywyNS43Nzg5IDU3LjU3ODcsNTcuNTc4NyB6IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzEzLjcyNDgsLTI5OC45ODQxMSkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnNTc0NS00LTQtOC0zLTctNiIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42OTY2Nzc0OSwwLDAsMC42OTY2Nzc0OSwyODgyLjkzMTUsMTk4LjI1MDExKSIKICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDczNjYtNjYyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzM0Njc0YjtzdHJva2Utb3BhY2l0eToxO2Rpc3BsYXk6aW5saW5lIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NjY3Nzc2MiCiAgICAgICAgICAgaWQ9InBhdGg1NjY1LTktNC01LTMxLTYtMCIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2NC01MzYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNDc4MDk2NywwLDAsMC4wNDc4MDk2NywtMTI2LjU3MDExLDk3Ni4wMDg4OCkiCiAgICAgICBpZD0iZzY0MDMtMy0wLTMtNiIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQtNiIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy02LTYiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MzcwLTczNyk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02LTAtMiIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM2OC0zNDMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNTEzNzA4MywwLDAsMC4wNTEzNzA4MywtMTc0LjMyMTM1LDk3MC4xNjA0OCkiCiAgICAgICBpZD0iZzY0MDMtMy0wLTMtMSIKICAgICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6IzM4M2U0OTtmaWxsLW9wYWNpdHk6MC42MzUxOTMxMTtzdHJva2U6bm9uZTtkaXNwbGF5OmlubGluZSIKICAgICAgICAgaWQ9InBhdGg1OTE2LTctMS01LTgtNTQtNSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjEzMjMuMjk5OCIKICAgICAgICAgc29kaXBvZGk6Y3k9IjEzNzYuNjIxMSIKICAgICAgICAgc29kaXBvZGk6cng9IjU3LjU3ODY5MyIKICAgICAgICAgc29kaXBvZGk6cnk9IjU3LjU3ODY5MyIKICAgICAgICAgZD0ibSAxMzgwLjg3ODUsMTM3Ni42MjExIGMgMCwzMS43OTk4IC0yNS43Nzg5LDU3LjU3ODcgLTU3LjU3ODcsNTcuNTc4NyAtMzEuNzk5OCwwIC01Ny41Nzg3LC0yNS43Nzg5IC01Ny41Nzg3LC01Ny41Nzg3IDAsLTMxLjc5OTggMjUuNzc4OSwtNTcuNTc4NyA1Ny41Nzg3LC01Ny41Nzg3IDMxLjc5OTgsMCA1Ny41Nzg3LDI1Ljc3ODkgNTcuNTc4Nyw1Ny41Nzg3IHoiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzMTMuNzI0OCwtMjk4Ljk4NDExKSIgLz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NzQ1LTQtNC04LTMtNy02LTgiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjk2Njc3NDksMCwwLDAuNjk2Njc3NDksMjg4Mi45MzE1LDE5OC4yNTAxMSkiCiAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3Mzc0LTYzNCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMzNDY3NGI7c3Ryb2tlLW9wYWNpdHk6MTtkaXNwbGF5OmlubGluZSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzY2Nzc3NjIgogICAgICAgICAgIGlkPSJwYXRoNTY2NS05LTQtNS0zMS02LTAtOSIKICAgICAgICAgICBkPSJtIDEwODAuMDY2MiwxMTc1LjU5ODYgYyAtOC44Nzc5LDAuMTQ2IC00LjY1OTIsMTcuMjE2MyAtMTMuMzM3OSwxOS4wOTE1IC04LjY3ODgsMS44NzUyIC0xMS45OTE1LC0xNS4zMDEgLTIwLjEzNzcsLTExLjc2ODcgLTguMTQ2MiwzLjUzMjIgMi4zMzE1LDE3LjY5OTIgLTQuOTY5LDIyLjc1MjkgLTcuMzAwNiw1LjA1MzYgLTE2Ljg0MDEsLTkuNzgwNyAtMjMuMDE0NSwtMy4zOTk5IC02LjE3NDMsNi4zODA4IDguNzMzOCwxNS41NTE3IDMuOTIzLDIzLjAxNDUgLTQuODEwOSw3LjQ2MjcgLTE5LjQ5MDQsLTIuMjQyOCAtMjIuNzUyOTcsNi4wMTUxIC0zLjI2MjUsOC4yNTc5IDE0LjE0MjE3LDEwLjg3ODkgMTIuNTUzMzcsMTkuNjE0NiAtMS41ODg4LDguNzM1NyAtMTguNzE0NDcsNS4yNDQ3IC0xOC41Njg0NywxNC4xMjI1IDAuMTQ2LDguODc3OCAxNy4yMTYzNyw0LjY1OTEgMTkuMDkxNDcsMTMuMzM3OSAxLjg3NTIsOC42Nzg4IC0xNS4zMDA5NywxMS45OTE1IC0xMS43Njg3LDIwLjEzNzcgMy41MzIzLDguMTQ2MiAxNy42OTkyLC0yLjMzMTYgMjIuNzUyOSw0Ljk2OSA1LjA1MzcsNy4zMDA1IC05Ljc4MDcsMTYuODQwMSAtMy4zOTk5LDIzLjAxNDQgNi4zODA4LDYuMTc0NCAxNS41NTE3LC04LjczMzggMjMuMDE0NSwtMy45MjI5IDcuNDYyOCw0LjgxMDkgLTIuMjQyOCwxOS40OTA0IDYuMDE1MSwyMi43NTMgOC4yNTgsMy4yNjI1IDEwLjg3ODksLTE0LjE0MjIgMTkuNjE0NiwtMTIuNTUzNCA4LjczNTgsMS41ODg4IDUuMjQ0NywxOC43MTQ1IDE0LjEyMjUsMTguNTY4NSA4Ljg3NzksLTAuMTQ2IDQuNjU5MiwtMTcuMjE2NCAxMy4zMzc5LC0xOS4wOTE1IDguNjc4OCwtMS44NzUyIDExLjk5MTUsMTUuMzAxIDIwLjEzNzcsMTEuNzY4NyA4LjE0NjIsLTMuNTMyMyAtMi4zMzE1LC0xNy42OTkzIDQuOTY5LC0yMi43NTI5IDcuMzAwNiwtNS4wNTM3IDE2Ljg0MDEsOS43ODA3IDIzLjAxNDUsMy4zOTk4IDYuMTc0MywtNi4zODA4IC04LjczMzgsLTE1LjU1MTYgLTMuOTIzLC0yMy4wMTQ0IDQuODEwOSwtNy40NjI4IDE5LjQ5MDQsMi4yNDI4IDIyLjc1MywtNi4wMTUxIDMuMjYyNSwtOC4yNTggLTE0LjE0MjIsLTEwLjg3ODkgLTEyLjU1MzQsLTE5LjYxNDYgMS41ODg4LC04LjczNTggMTguNzE0NSwtNS4yNDQ3IDE4LjU2ODUsLTE0LjEyMjUgLTAuMTQ2LC04Ljg3NzkgLTE3LjIxNjQsLTQuNjU5MiAtMTkuMDkxNSwtMTMuMzM4IC0xLjg3NTIsLTguNjc4NyAxNS4zMDEsLTExLjk5MTQgMTEuNzY4NywtMjAuMTM3NiAtMy41MzIzLC04LjE0NjIgLTE3LjY5OTIsMi4zMzE1IC0yMi43NTI5LC00Ljk2OSAtNS4wNTM3LC03LjMwMDYgOS43ODA3LC0xNi44NDAxIDMuMzk5OSwtMjMuMDE0NSAtNi4zODA5LC02LjE3NDMgLTE1LjU1MTcsOC43MzM4IC0yMy4wMTQ1LDMuOTIyOSAtNy40NjI4LC00LjgxMDggMi4yNDI4LC0xOS40OTA0IC02LjAxNTEsLTIyLjc1MjkgLTguMjU4LC0zLjI2MjUgLTEwLjg3ODksMTQuMTQyMiAtMTkuNjE0NiwxMi41NTM0IC04LjczNTgsLTEuNTg4OCAtNS4yNDQ3LC0xOC43MTQ1IC0xNC4xMjI1LC0xOC41Njg1IHogbSAxLjU2OTEsNDAuODcwMiBjIDI1LjQwOCwwIDQ3LjAwMzIsMjEuNTk1MiA0Ny4wMDMyLDQ3LjAwMzEgMCwyNS40MDggLTIxLjU5NTIsNDcuMDAzMSAtNDcuMDAzMiw0Ny4wMDMxIC0yNS40MDc5LDAgLTQ3LjAwMzEsLTIxLjU5NTEgLTQ3LjAwMzEsLTQ3LjAwMzEgMCwtMjUuNDA3OSAyMS41OTUyLC00Ny4wMDMxIDQ3LjAwMzEsLTQ3LjAwMzEgeiIKICAgICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzM3Mi03NDcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMzQ2NzRiO3N0cm9rZS13aWR0aDo0LjA4NzIyNjM5O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"mathwar,mathwar,math\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"mathwar.Mathwar\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Mathwar\"\nLABEL oc.displayname=\"Mathwar\"\nLABEL oc.path=\"/usr/games/mathwar\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Mathwar\"\nENV APPBIN \"/usr/games/mathwar\"\nENV APP \"/usr/games/mathwar\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/mathwar/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mathwar/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Mathwar

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Mathwar.d\n
"},{"location":"applications/mathwar/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Mathwar.d -t Mathwar .\n
"},{"location":"applications/mathwar/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Mathwar > Mathwar.json\ndocker image save Mathwar -o Mathwar.tar\nctr -n k8s.io images import Mathwar.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Mathwar.json\n\n
"},{"location":"applications/minecraft/","title":"minecraft","text":""},{"location":"applications/minecraft/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/minecraft/#path","title":"Path","text":"
/usr/bin/minecraft-launcher\n
"},{"location":"applications/minecraft/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/minecraft/#wm_class","title":"WM_CLASS","text":"
minecraft-launcher.Minecraft Launcher\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/minecraft/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/minecraft-launcher.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/minecraft/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\nCOPY composer/init.d/init.minecraft-launcher /composer/init.d\n
"},{"location":"applications/minecraft/#json-dump","title":"JSON dump","text":"

json source file minecraft.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_minecraft.svg\",\n    \"keyword\": \"minecraft\",\n    \"launch\": \"minecraft-launcher.Minecraft Launcher\",\n    \"name\": \"minecraft\",\n    \"path\": \"/usr/bin/minecraft-launcher\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktop\": \"minecraft-launcher.desktop\",\n    \"host_config\": {\n        \"mem_limit\": \"4G\",\n        \"shm_size\": \"2G\",\n        \"cpu_period\": 200000,\n        \"cpu_quota\": 200000,\n        \"ipc_mode\": \"shareable\"\n    },\n    \"desktopfile\": \"/usr/share/applications/minecraft-launcher.desktop\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\",\n        \"COPY composer/init.d/init.minecraft-launcher /composer/init.d\"\n    ]\n}\n
"},{"location":"applications/minecraft/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output minecraft.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/minecraft.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @minecraft.d.3.0.json\n\n
"},{"location":"applications/minecraft/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libflite1 openjdk-8-jre at-spi2-core dbus-x11 orca libsecret-1-0 && curl -Ls 'https://launcher.mojang.com/download/Minecraft.deb' -o /tmp/Minecraft.deb && apt-get install --yes /tmp/Minecraft.deb && rm /tmp/Minecraft.deb && rm -rf /var/lib/apt/lists/*\nCOPY composer/init.d/init.minecraft-launcher /composer/init.d\nLABEL oc.icon=\"circle_minecraft.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYgMCAwIDEuMzI3NiAtNTEwLjY0IC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDU4ODgzIiB5PSItLjA2MTE2MSIgd2lkdGg9IjEuMTE3OCIgaGVpZ2h0PSIxLjEyMjMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEwLjU2MjM3OSIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjg4OTcyNDQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZiIgeD0iLS4wNjQ2NjYiIHk9Ii0uMDU2MDAyIiB3aWR0aD0iMS4xMjkzIiBoZWlnaHQ9IjEuMTEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjY2MTQ0MzYzIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMjUuNjgiIHgyPSIyNi40NDgiIHkxPSIzOS4zOTUiIHkyPSIxNy4zNzYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM0NWYyOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1OWE0NDYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMTUuNzA3IiB4Mj0iMjUuNjgiIHkxPSIzMi41NjEiIHkyPSIzOS4zOTUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2FkN2M1OSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4MzViNDEiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjAxMTUgMCAwIDEuMDExNSAtMzg5LjMyIC00ODkuOTIpIiB4PSIzODYuODUiIHk9IjQ4Ni4zMSIgd2lkdGg9IjU5LjMxNSIgaGVpZ2h0PSI1OS4zMTUiIHJ5PSIyOS42NTciIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cmVjdCB4PSIxLjk4MjYiIHk9IjEuOTc4NCIgd2lkdGg9IjU5Ljk5NyIgaGVpZ2h0PSI1OS45OTciIHJ5PSIyOS45OTgiIGZpbGw9InVybCgjYikiIHN0cm9rZS13aWR0aD0iMS4wMTE1Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwMzUgMCAwIDEuMzE3IC0xLjQ3NTIgLTYuNTUxMSkiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iLjEiPgogIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuMDIyOSAwIDAgMS4wMTI0IC44NzU5OSA0Ljk3NDEpIiBkPSJtMjUgMTEtMTIgN3YxNGwxMiA3IDEyLTd2LTE0eiIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwMzUgMCAwIDEuMzE3IC0yLjQ3NDcgLTcuODg0MSkiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgPHBhdGggZD0ibTE0LjE3MyAyMy4yIDEyLjI3NSAyMS4yNTcgMTIuMjczLTIxLjI1Ny0xMi4yNzMtNy4wOSIgZmlsbD0idXJsKCNlKSIvPgogIDxwYXRoIGQ9Im0xNC4xNzMgMjMuMnYzLjU0M2wxMi4yNzQgNy4wOSAxZS0zIC0zLjU0N3oiIGZpbGw9IiM1OWE4NDkiLz4KICA8cGF0aCBkPSJtMjYuNDQ4IDMzLjgyNyAxMi4yNzQtNy4wODd2LTMuNTQzbC0xMi4yNzQgNy4wODZ6IiBmaWxsPSIjM2U3MjMxIi8+CiAgPHBhdGggZD0ibTE0LjE3MyAyNi43NHYxMC42M2wxMi4yNzQgNy4wODd2LTEwLjYzeiIgZmlsbD0idXJsKCNhKSIvPgogIDxwYXRoIGQ9Im0yNi40NDggMzMuODI3IDEyLjI3NC03LjA4N3YxMC42M2wtMTIuMjc0IDcuMDg3eiIgZmlsbD0iIzU3M2QyYiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"minecraft,minecraft\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"minecraft-launcher.desktop\"\nLABEL oc.launch=\"minecraft-launcher.Minecraft Launcher\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"minecraft\"\nLABEL oc.displayname=\"minecraft\"\nLABEL oc.path=\"/usr/bin/minecraft-launcher\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"4G\\\",\\\"shm_size\\\":\\\"2G\\\",\\\"cpu_period\\\":200000,\\\"cpu_quota\\\":200000,\\\"ipc_mode\\\":\\\"shareable\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"minecraft\"\nENV APPBIN \"/usr/bin/minecraft-launcher\"\nENV APP \"/usr/bin/minecraft-launcher\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/minecraft/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/minecraft/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application minecraft

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/minecraft.d\n
"},{"location":"applications/minecraft/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f minecraft.d -t minecraft .\n
"},{"location":"applications/minecraft/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect minecraft > minecraft.json\ndocker image save minecraft -o minecraft.tar\nctr -n k8s.io images import minecraft.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @minecraft.json\n\n
"},{"location":"applications/mines/","title":"Mines","text":""},{"location":"applications/mines/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/mines/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/mines/#alpine-packages","title":"Alpine packages","text":"
gnome-mines\n
"},{"location":"applications/mines/#displayname","title":"Displayname","text":"
gnome-mines (alpine)\n
"},{"location":"applications/mines/#path","title":"Path","text":"
/usr/bin/gnome-mines\n
"},{"location":"applications/mines/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/mines/#wm_class","title":"WM_CLASS","text":"
gnome-mines.Gnome-mines\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/mines/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Mines.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/mines/#json-dump","title":"JSON dump","text":"

json source file mines.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"displayname\": \"gnome-mines (alpine)\",\n    \"apkpackage\": \"gnome-mines\",\n    \"icon\": \"circle_gnome-mines.svg\",\n    \"keyword\": \"gnome mines,game mines,mines\",\n    \"launch\": \"gnome-mines.Gnome-mines\",\n    \"name\": \"Mines\",\n    \"path\": \"/usr/bin/gnome-mines\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Mines.desktop\"\n}\n
"},{"location":"applications/mines/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output mines.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/mines.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @mines.d.3.0.json\n\n
"},{"location":"applications/mines/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-mines\nLABEL oc.icon=\"circle_gnome-mines.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQXBwcy1WaXN1YWwtU3R1ZGlvLUNvZGUiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQ5OS45NSIgeDI9IjQ5OS45NSIgeTE9IjIuMDA3OCIgeTI9IjEwMjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMiAyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSI1MTIuMDEiIGN5PSI1MTIuMDEiIHI9IjQ3MC4xNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTc2MjUgMCAwIC45NzYyNSAxMi4xNTIgMTIuMTQxKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLW9wYWNpdHk9Ii41MjU5MyIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJjIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTUuMjk5NzE1Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjEzIiB5Mj0iNTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDYzODI5IiB5PSItLjA1NjYwNCIgd2lkdGg9IjEuMTI3NyIgaGVpZ2h0PSIxLjExMzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODk2MjM0MzIiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNTg4MjUgMCAwIC4wNTg4MjUgMS44ODE4IDEuODgyNSkiPgogIDxwYXRoIGQ9Im05ODQuODggMzE2Ljc1cS05LjI5MjMtMjIuNTI5LTIwLjk2Mi00NC4xMzljLTQuMzc2LTguMTU3OC05LjAyMjItMTYuMjYxLTEzLjkzOC0yNC4yMDMtMjEuMTI0LTM0LjI1Mi00Ni44OTQtNjYuNjE0LTc3LjMxMS05Ny4wMjktOTkuNTY4LTk5LjU2OC0yMTkuODMtMTQ5LjM4LTM2MC42Ny0xNDkuMzgtMTQwLjg1IDAtMjYxLjA1IDQ5LjgxMS0zNjAuNjEgMTQ5LjM4LTk5LjU2OSA5OS41NzItMTQ5LjM4IDIxOS43OC0xNDkuMzggMzYwLjYxczQ5LjgxMSAyNjEuMTEgMTQ5LjM4IDM2MC42N2M5OS41NjggOTkuNTY4IDIxOS43OCAxNDkuMzIgMzYwLjYxIDE0OS4zMiAxNDAuODQgMCAyNjEuMTEtNDkuNzU4IDM2MC42Ny0xNDkuMzIgNTQuODM2LTU0Ljg5IDk0LjU5OC0xMTYuMDQgMTE5LjIzLTE4My40MiAyMC4wNDMtNTQuOTQzIDMwLjA5Mi0xMTMuOTkgMzAuMDkyLTE3Ny4yNSAwLTQ4LjUxNS01Ljg4ODgtOTQuNTk4LTE3LjcyLTEzOC4yNS0xLjM1MDctNC45MTYzLTIuNzU1My05LjgzMjYtNC4yMTM5LTE0LjY5NS00LjQzMDItMTQuMzcxLTkuNTA4NS0yOC40NzEtMTUuMTgxLTQyLjMwMnoiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE4LjM2OCIvPgogIDxwYXRoIGlkPSJwYXRoIiBkPSJtOTg0Ljg4IDMxNi43NXEtOS4yOTIzLTIyLjUyOS0yMC45NjItNDQuMTM5Yy00LjM3Ni04LjE1NzgtOS4wMjIyLTE2LjI2MS0xMy45MzgtMjQuMjAzLTIxLjEyNC0zNC4yNTItNDYuODk0LTY2LjYxNC03Ny4zMTEtOTcuMDI5LTk5LjU2OC05OS41NjgtMjE5LjgzLTE0OS4zOC0zNjAuNjctMTQ5LjM4LTE0MC44NSAwLTI2MS4wNSA0OS44MTEtMzYwLjYxIDE0OS4zOC05OS41NjkgOTkuNTcyLTE0OS4zOCAyMTkuNzgtMTQ5LjM4IDM2MC42MXM0OS44MTEgMjYxLjExIDE0OS4zOCAzNjAuNjdjOTkuNTY4IDk5LjU2OCAyMTkuNzggMTQ5LjMyIDM2MC42MSAxNDkuMzIgMTQwLjg0IDAgMjYxLjExLTQ5Ljc1OCAzNjAuNjctMTQ5LjMyIDU0LjgzNi01NC44OSA5NC41OTgtMTE2LjA0IDExOS4yMy0xODMuNDIgMjAuMDQzLTU0Ljk0MyAzMC4wOTItMTEzLjk5IDMwLjA5Mi0xNzcuMjUgMC00OC41MTUtNS44ODg4LTk0LjU5OC0xNy43Mi0xMzguMjUtMS4zNTA3LTQuOTE2My0yLjc1NTMtOS44MzI2LTQuMjEzOS0xNC42OTUtNC40MzAyLTE0LjM3MS05LjUwODUtMjguNDcxLTE1LjE4MS00Mi4zMDJ6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9IjE4LjM2OCIvPgogIDxjaXJjbGUgY3g9IjUxMiIgY3k9IjUxMS45OSIgcj0iNDU4Ljk5IiBjb2xvcj0iIzAwMDAwMCIgZW5hYmxlLWJhY2tncm91bmQ9ImFjY3VtdWxhdGUiIGZpbGw9IiM2NjYiIHN0cm9rZS13aWR0aD0iMzguNDI2Ii8+CiAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTExLjk5IiByPSI0NTguOTkiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0iYWNjdW11bGF0ZSIgZmlsbD0idXJsKCNhKSIgc3Ryb2tlLXdpZHRoPSIzOC40MjYiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zMS45MjQgMTNjLTEuMzUwNyAwLTIuMjEyMyAwLjk5MTcyLTIuMjk3NiAyLjMwMnYyLjY3YzAuMTIxMTYgMS4xOTgxIDEuMTQ0MyAyLjE1NCAyLjM3MzggMi4xNTRhMi40MjMyIDIuNDIzMiAwIDAgMCAwLjg4ODUxLTAuMTUyNTcgMi40Mjc3IDIuNDI3NyAwIDAgMCAxLjQ4MDgtMi4wMDE0di0yLjU5ODJhMi40MTQyIDIuNDE0MiAwIDAgMC0yLjQ0NTYtMi4zNzM4em0tNC41OTk2IDUuNTY0NGExNC44NDQgMTQuODQ0IDAgMCAwLTQuMzA3OSAyLjQ1MDEgNC4zOTc3IDQuMzk3NyAwIDAgMSAxLjMzNzMgMS40ODA4YzAuMDEzNDYgMC4wMTc5Ni0wLjAwOTEgMC4wNTgzMyAwIDAuMDc2MjlhNC4yNTg2IDQuMjU4NiAwIDAgMSAwLjM3MjQ2IDAuODkzYzAuMDA5MSAwLjAyMjQ0IDAgMC4wNDkzNyAwIDAuMDcxOGE0LjU0NTggNC41NDU4IDAgMCAxIDAuMDc2MjkgMS45Mjk2Yy0wLjA1ODM0IDAuMjg3Mi0wLjE4ODQ3IDAuNTU2NDQtMC4yOTYxNyAwLjgxNjcxYTQuMjU4NiA0LjI1ODYgMCAwIDEtMy45MzU1IDIuNjcgMy45MjY1IDMuOTI2NSAwIDAgMS0yLjIyNTgtMC42Njg2M2MtMC4wOTQyMyAwLjI2OTI0LTAuMjM3ODMgMC41Mjk1Mi0wLjI5NjE3IDAuODE2NzF2MC4wNzYyOGMtMC4wODk3NCAwLjQzOTc3LTAuMTc5NSAwLjg3OTU0LTAuMjI0MzcgMS4zMzI4djAuMDc2MjhjLTAuMDQ0ODggMC40NTc3Mi0wLjA3MTggMC45NDIzNi0wLjA3MTggMS40MDkxdjAuMTQ4MDhjMCAwLjQ0NDI2IDAuMDMxNDEgMC45MDY0NiAwLjA3MTggMS4zMzczdjAuMTQ4MDljMC4wNDkzNyAwLjQyNjMgMC4xMzQ2MiAwLjg0MzY0IDAuMjI0MzcgMS4yNjEgMC4wODA3NyAwLjQxMjg0IDAuMTc5NSAwLjc5NDI4IDAuMjk2MTcgMS4xODkyYTUuOTIzNCA1LjkyMzQgMCAwIDEgMi41MjE5LTAuNzQ0OTFjMC44NjE1OS0wLjA0NDg4IDEuNjYwMyAwLjIwNjQyIDIuMzAyIDAuNjczMTFhMy45NDQ0IDMuOTQ0NCAwIDAgMSAxLjQwOTEgMS44NDg4IDQuNjMxIDQuNjMxIDAgMCAxIDAuMjk2MTcgMS43MDUyYzAgMS4yMDcxLTAuOTg3MjMgMi43OTEyLTEuNzA1MiAzLjU2NzUgMC4yOTE2OCAwLjIyNDM3IDAuNTc0MzkgMC40NTc3MiAwLjg4ODUxIDAuNjY0MTQgMC4zNzY5NCAwLjI1MTMgMC43MTc5OSAwLjUyOTUyIDEuMTEyOSAwLjc0NDkxIDAuNTY1NDIgMC4zMDUxNCAxLjE3NTcgMC41ODMzNiAxLjc4MTUgMC44MTY3MSAwLjExNjY3IDAuMDQ0ODggMC4yNDY4MSAwLjA1Mzg1IDAuMzcyNDYgMC4wNzE4YTIuNTEzIDIuNTEzIDAgMCAxLTAuMDc2MjktMC41MjA1NGMwLTEuODg0NyAyLjEyNy0zLjQxMDQgNC43NTIyLTMuNDEwNCAyLjYyMDcgMCA0Ljc0NzcgMS41MjU3IDQuNzQ3NyAzLjQxMDQgMCAwLjE3MDUyLTAuMDQ0ODggMC4zNTg5OS0wLjA3NjI4IDAuNTIwNTQgMC43MTc5OS0wLjI0NjgxIDEuNDIyNS0wLjUzODQ5IDIuMDc3Ny0wLjg4ODUxIDAuNTA3MDgtMC4yNjkyNCAwLjk0MjM2LTAuNTY5OSAxLjQxMzUtMC44OTMgMC4xNDM2LTAuMDk4NzIgMC4zMDUxNC0wLjE4ODQ3IDAuNDQ0MjYtMC4yOTYxNyAwLjExMjE4LTAuMDgwNzcgMC4xODg0Ny0wLjIwNjQyIDAuMjk2MTctMC4yOTYxN2E0LjU5MDYgNC41OTA2IDAgMCAxLTAuODE2NzEtMC44MTY3MSAzLjg5NTEgMy44OTUxIDAgMCAxLTAuODE2NzEtMS43ODE1IDUuMDkzMiA1LjA5MzIgMCAwIDEtMC4wNzE4LTAuODg4NTFjMC0wLjU3ODg4IDAuMTMwMTQtMS4xNDQzIDAuMjk2MTctMS42MzM0IDAuMDA0NS0wLjAyMjQ0LTAuMDA5MS0wLjA1Mzg1IDAtMC4wNzYyOWEzLjY3OTcgMy42Nzk3IDAgMCAxIDAuMjk2MTctMC42NjQxNGMwLjEzNDYyLTAuMjI0MzcgMC4yNzgyMi0wLjQwMzg3IDAuNDQ4NzQtMC41OTY4MyAwLjE3NTAxLTAuMjA2NDIgMC4zNzY5NC0wLjM1NDUgMC41OTIzNC0wLjUxNjA1YTMuNjM0OCAzLjYzNDggMCAwIDEgMS4zMzI4LTAuNjczMTEgNC4zNTczIDQuMzU3MyAwIDAgMSAwLjgxNjcxLTAuMTQzNmMwLjY2ODYzLTAuMDQwMzkgMS43OTUgMC4yMjg4NiAyLjY3IDAuNzQwNDIgMC4xMDc3LTAuMzcyNDYgMC4yMjQzNy0wLjcyNjk2IDAuMzAwNjYtMS4xMTI5IDAuMDg1MjYtMC40MTczMyAwLjE3MDUyLTAuODM0NjYgMC4yMjQzNy0xLjI2MSAwLTAuMDQ5MzYtMC4wMDkxLTAuMDk4NzMgMC0wLjE0ODA5YTE0Ljk0MyAxNC45NDMgMCAwIDAgMC0yLjk3MDdjLTAuMDQ5MzctMC40NDg3NC0wLjEzNDYyLTAuODkzLTAuMjI0MzctMS4zMzI4LTAuMDA5MS0wLjAyMjQ0IDAtMC4wNTM4NiAwLTAuMDc2MjktMC4wNjczLTAuMzE0MTItMC4xOTI5Ni0wLjU5NjgzLTAuMzAwNjYtMC44ODg1MWEzLjkyMiAzLjkyMiAwIDAgMS0yLjIyNTggMC42Njg2MiA0LjIzMTYgNC4yMzE2IDAgMCAxLTMuMDQyNS0xLjI2MSA0LjUwOTkgNC41MDk5IDAgMCAxLTAuNTE2MDUtMC42NzMxMSA0LjI0OTYgNC4yNDk2IDAgMCAxLTAuMjI0MzctNC40NTE1IDQuMjQ5NiA0LjI0OTYgMCAwIDEgMC41MjA1NC0wLjgxMjIyIDQuNTMyMyA0LjUzMjMgMCAwIDEgMC43NDA0Mi0wLjY3MzEyIDE0LjE4IDE0LjE4IDAgMCAwLTQuMjI3Mi0yLjQ0NTZjMC4wMzE0MSAwLjE2NjA0IDAuMDcxNzkgMC4zNTAwMiAwLjA3MTc5IDAuNTIwNTQgMCAxLjg4NDctMi4xMjcgMy40MTA0LTQuNzQ3NyAzLjQxMDQtMS42NDI0IDAtMy4wNzg0LTAuNTc0MzktMy45MzU1LTEuNDgwOGEzLjQxMDQgMy40MTA0IDAgMCAxLTAuNDQ0MjctMC41OTIzMiAyLjYyNTEgMi42MjUxIDAgMCAxLTAuMzY3OTctMS4zMzczYzAtMC4xNzA1MiAwLjA0MDM5LTAuMzU4OTkgMC4wNzE4LTAuNTIwNTR6bS0xMC4zMTcgMS42MzM0YTIuNDcyNiAyLjQ3MjYgMCAwIDAtMS40ODA4IDEuMTEyOSAyLjQyMzIgMi40MjMyIDAgMCAwIDAuNzQwNDIgMy4zMzg2bDEuOTI5NiAxLjE4OTIgMC43NDA0MiAwLjQ0NDI1YTIuOTE2OCAyLjkxNjggMCAwIDAgMC45NjQ4IDAuMjI0MzcgMi44NDA1IDIuODQwNSAwIDAgMCAxLjg1NzgtMC43NDQ5MSAyLjMzMzUgMi4zMzM1IDAgMCAwIDAuNzQwNDMtMS43MDUyIDIuNDc3MSAyLjQ3NzEgMCAwIDAtMC44MTY3MS0xLjg1NzhsLTAuODg4NTEtMC41MTYwNi0yLjAwNTktMS4xODkyYTIuMzA2NSAyLjMwNjUgMCAwIDAtMS43ODE1LTAuMjk2MTd6bTI5LjA5MiAwYTIuMzE1NSAyLjMxNTUgMCAwIDAtMC44OTMgMC4yOTYxN2wtMi4wMDE0IDEuMTg5Mi0wLjg5MyAwLjUyMDU0Yy0wLjAyNjkzIDAuMDE3OTUtMC4wNDQ4OCAwLjA0NDg4LTAuMDcxNzkgMC4wNzE4YTIuMTA5MSAyLjEwOTEgMCAwIDAtMC43NDQ5MSAxLjcwNTIgMi4zMzM1IDIuMzMzNSAwIDAgMCAwLjc0NDkxIDEuNzA1MiAyLjgzNjEgMi44MzYxIDAgMCAwIDIuODE4MSAwLjU5MjM0bDAuNzQwNDMtMC40Mzk3NyAxLjkyOTYtMS4xODkyYTIuNDIzMiAyLjQyMzIgMCAwIDAgMC43NDQ5MS0zLjMzODYgMi4zNTU5IDIuMzU1OSAwIDAgMC0yLjM3ODMtMS4xMTI5em0tMTQuMDk5IDcuMDQ5N2E0Ljc0OTkgNC43NDk5IDAgMSAxIDAgOS40OTk5Yy0xLjMxNDggMC0yLjQ4MTUtMC41NTE5NS0zLjMzODYtMS40MTM1LTAuMjE1NC0wLjIxMDkxLTAuNDI2MzEtMC40MTI4NC0wLjU5NjgzLTAuNjY0MTRhNC43ODM2IDQuNzgzNiAwIDAgMS0wLjgxNjcxLTIuNjc0NWMwLTAuMzI3NTggMC4wMTM0Ny0wLjY1NTE2IDAuMDc2MjktMC45NjQ4IDAuNDQ0MjUtMi4xNjI5IDIuMzc4My0zLjc4MjkgNC42NzU5LTMuNzgyOXptMCAyLjM3ODNjLTAuOTg3MjMgMC0xLjc5NSAwLjYyODI0LTIuMTU0IDEuNDgwOGEyLjIzMDMgMi4yMzAzIDAgMCAwLTAuMjI0MzcgMC44ODg1MSAyLjM3MzggMi4zNzM4IDAgMSAwIDIuMzc4My0yLjM3Mzh6bS0xMi4wOTggNy45MzgzYy0wLjU1MTk1IDAuMDU4MzMtMC43MDAwNCAwLjE5NzQ1LTAuOTY0OCAwLjI5NjE3bC0wLjUxNjA1IDAuMjk2MTctMS45Mjk2IDEuMTg0N2EyLjQyMzIgMi40MjMyIDAgMCAwLTAuNzQ0OTEgMy4zNDMxIDIuNDQ1NiAyLjQ0NTYgMCAwIDAgMy4zMzg2IDAuODEyMjJsMS45Mjk2LTEuMTg0NyAwLjY3MzExLTAuNDQ4NzRhMi43NTUzIDIuNzU1MyAwIDAgMCAwLjczNTk0LTEuMTg0NyAxLjQ4NTMgMS40ODUzIDAgMCAwIDAuMDc2MjktMC40NDg3NCAyLjg2MyAyLjg2MyAwIDAgMC0wLjc0MDQyLTEuODUzMyAyLjYwMjcgMi42MDI3IDAgMCAwLTAuODE2NzEtMC42NjQxNCAyLjA2NDIgMi4wNjQyIDAgMCAwLTEuMDQxMS0wLjE0ODA4em0yNC4yNjggMC4xNDgwOGEyLjUzMDkgMi41MzA5IDAgMCAwLTIuNTI2NCAyLjUyMTljMCAwLjY1MDY4IDAuMTgzOTggMS4xMjE5IDAuNTk2ODMgMS41NTcxbDAuNzQwNDMgMC41MjA1NCAxLjkyOTYgMS4xODQ3YTIuNDQ1NiAyLjQ0NTYgMCAwIDAgMy4zMzg2LTAuODEyMjIgMi40MjMyIDIuNDIzMiAwIDAgMC0wLjc0MDQyLTMuMzQzMWwtMS45Mjk2LTEuMTg0N2MtMC4xNzA1Mi0wLjA5ODczLTAuMzMyMDctMC4yMTA5MS0wLjUyMDU0LTAuMjk2MTdhMi43NTUzIDIuNzU1MyAwIDAgMC0wLjg4ODUxLTAuMTQ4MDh6bS0xMi4xNyA2LjE1NjdhMi40NDU2IDIuNDQ1NiAwIDAgMC0wLjg5MyAwLjE0ODA4IDMuMDkxOCAzLjA5MTggMCAwIDAtMC44MTY3MSAwLjUyMDU0IDIuMTk4OCAyLjE5ODggMCAwIDAtMC44MTIyMiAxLjQ4MDh2Mi42MDcyYzAgMS4zMTAzIDEuMDk0OSAyLjM3MzggMi40NDU2IDIuMzczOGEyLjQxNDIgMi40MTQyIDAgMCAwIDIuNDUwMS0yLjM3ODN2LTIuNTkzN2EyLjQwOTcgMi40MDk3IDAgMCAwLTIuMzc4My0yLjE1NHoiIGZpbHRlcj0idXJsKCNlKSIgb3BhY2l0eT0iLjc1IiBzdHJva2Utd2lkdGg9IjMuNzc5NiIvPgogPHBhdGggZD0ibTMxLjkyNCAxM2MtMS4zNTA3IDAtMi4yMTIzIDAuOTkxNzItMi4yOTc2IDIuMzAydjIuNjdjMC4xMjExNiAxLjE5ODEgMS4xNDQzIDIuMTU0IDIuMzczOCAyLjE1NGEyLjQyMzIgMi40MjMyIDAgMCAwIDAuODg4NTEtMC4xNTI1NyAyLjQyNzcgMi40Mjc3IDAgMCAwIDEuNDgwOC0yLjAwMTR2LTIuNTk4MmEyLjQxNDIgMi40MTQyIDAgMCAwLTIuNDQ1Ni0yLjM3Mzh6bS00LjU5OTYgNS41NjQ0YTE0Ljg0NCAxNC44NDQgMCAwIDAtNC4zMDc5IDIuNDUwMSA0LjM5NzcgNC4zOTc3IDAgMCAxIDEuMzM3MyAxLjQ4MDhjMC4wMTM0NiAwLjAxNzk2LTAuMDA5MSAwLjA1ODMzIDAgMC4wNzYyOWE0LjI1ODYgNC4yNTg2IDAgMCAxIDAuMzcyNDYgMC44OTNjMC4wMDkxIDAuMDIyNDQgMCAwLjA0OTM3IDAgMC4wNzE4YTQuNTQ1OCA0LjU0NTggMCAwIDEgMC4wNzYyOSAxLjkyOTZjLTAuMDU4MzQgMC4yODcyLTAuMTg4NDcgMC41NTY0NC0wLjI5NjE3IDAuODE2NzFhNC4yNTg2IDQuMjU4NiAwIDAgMS0zLjkzNTUgMi42NyAzLjkyNjUgMy45MjY1IDAgMCAxLTIuMjI1OC0wLjY2ODYzYy0wLjA5NDIzIDAuMjY5MjQtMC4yMzc4MyAwLjUyOTUyLTAuMjk2MTcgMC44MTY3MXYwLjA3NjI4Yy0wLjA4OTc0IDAuNDM5NzctMC4xNzk1IDAuODc5NTQtMC4yMjQzNyAxLjMzMjh2MC4wNzYyOGMtMC4wNDQ4OCAwLjQ1NzcyLTAuMDcxOCAwLjk0MjM2LTAuMDcxOCAxLjQwOTF2MC4xNDgwOGMwIDAuNDQ0MjYgMC4wMzE0MSAwLjkwNjQ2IDAuMDcxOCAxLjMzNzN2MC4xNDgwOWMwLjA0OTM3IDAuNDI2MyAwLjEzNDYyIDAuODQzNjQgMC4yMjQzNyAxLjI2MSAwLjA4MDc3IDAuNDEyODQgMC4xNzk1IDAuNzk0MjggMC4yOTYxNyAxLjE4OTJhNS45MjM0IDUuOTIzNCAwIDAgMSAyLjUyMTktMC43NDQ5MWMwLjg2MTU5LTAuMDQ0ODggMS42NjAzIDAuMjA2NDIgMi4zMDIgMC42NzMxMWEzLjk0NDQgMy45NDQ0IDAgMCAxIDEuNDA5MSAxLjg0ODggNC42MzEgNC42MzEgMCAwIDEgMC4yOTYxNyAxLjcwNTJjMCAxLjIwNzEtMC45ODcyMyAyLjc5MTItMS43MDUyIDMuNTY3NSAwLjI5MTY4IDAuMjI0MzcgMC41NzQzOSAwLjQ1NzcyIDAuODg4NTEgMC42NjQxNCAwLjM3Njk0IDAuMjUxMyAwLjcxNzk5IDAuNTI5NTIgMS4xMTI5IDAuNzQ0OTEgMC41NjU0MiAwLjMwNTE0IDEuMTc1NyAwLjU4MzM2IDEuNzgxNSAwLjgxNjcxIDAuMTE2NjcgMC4wNDQ4OCAwLjI0NjgxIDAuMDUzODUgMC4zNzI0NiAwLjA3MThhMi41MTMgMi41MTMgMCAwIDEtMC4wNzYyOS0wLjUyMDU0YzAtMS44ODQ3IDIuMTI3LTMuNDEwNCA0Ljc1MjItMy40MTA0IDIuNjIwNyAwIDQuNzQ3NyAxLjUyNTcgNC43NDc3IDMuNDEwNCAwIDAuMTcwNTItMC4wNDQ4OCAwLjM1ODk5LTAuMDc2MjggMC41MjA1NCAwLjcxNzk5LTAuMjQ2ODEgMS40MjI1LTAuNTM4NDkgMi4wNzc3LTAuODg4NTEgMC41MDcwOC0wLjI2OTI0IDAuOTQyMzYtMC41Njk5IDEuNDEzNS0wLjg5MyAwLjE0MzYtMC4wOTg3MiAwLjMwNTE0LTAuMTg4NDcgMC40NDQyNi0wLjI5NjE3IDAuMTEyMTgtMC4wODA3NyAwLjE4ODQ3LTAuMjA2NDIgMC4yOTYxNy0wLjI5NjE3YTQuNTkwNiA0LjU5MDYgMCAwIDEtMC44MTY3MS0wLjgxNjcxIDMuODk1MSAzLjg5NTEgMCAwIDEtMC44MTY3MS0xLjc4MTUgNS4wOTMyIDUuMDkzMiAwIDAgMS0wLjA3MTgtMC44ODg1MWMwLTAuNTc4ODggMC4xMzAxNC0xLjE0NDMgMC4yOTYxNy0xLjYzMzQgMC4wMDQ1LTAuMDIyNDQtMC4wMDkxLTAuMDUzODUgMC0wLjA3NjI5YTMuNjc5NyAzLjY3OTcgMCAwIDEgMC4yOTYxNy0wLjY2NDE0YzAuMTM0NjItMC4yMjQzNyAwLjI3ODIyLTAuNDAzODcgMC40NDg3NC0wLjU5NjgzIDAuMTc1MDEtMC4yMDY0MiAwLjM3Njk0LTAuMzU0NSAwLjU5MjM0LTAuNTE2MDVhMy42MzQ4IDMuNjM0OCAwIDAgMSAxLjMzMjgtMC42NzMxMSA0LjM1NzMgNC4zNTczIDAgMCAxIDAuODE2NzEtMC4xNDM2YzAuNjY4NjMtMC4wNDAzOSAxLjc5NSAwLjIyODg2IDIuNjcgMC43NDA0MiAwLjEwNzctMC4zNzI0NiAwLjIyNDM3LTAuNzI2OTYgMC4zMDA2Ni0xLjExMjkgMC4wODUyNi0wLjQxNzMzIDAuMTcwNTItMC44MzQ2NiAwLjIyNDM3LTEuMjYxIDAtMC4wNDkzNi0wLjAwOTEtMC4wOTg3MyAwLTAuMTQ4MDlhMTQuOTQzIDE0Ljk0MyAwIDAgMCAwLTIuOTcwN2MtMC4wNDkzNy0wLjQ0ODc0LTAuMTM0NjItMC44OTMtMC4yMjQzNy0xLjMzMjgtMC4wMDkxLTAuMDIyNDQgMC0wLjA1Mzg2IDAtMC4wNzYyOS0wLjA2NzMtMC4zMTQxMi0wLjE5Mjk2LTAuNTk2ODMtMC4zMDA2Ni0wLjg4ODUxYTMuOTIyIDMuOTIyIDAgMCAxLTIuMjI1OCAwLjY2ODYyIDQuMjMxNiA0LjIzMTYgMCAwIDEtMy4wNDI1LTEuMjYxIDQuNTA5OSA0LjUwOTkgMCAwIDEtMC41MTYwNS0wLjY3MzExIDQuMjQ5NiA0LjI0OTYgMCAwIDEtMC4yMjQzNy00LjQ1MTUgNC4yNDk2IDQuMjQ5NiAwIDAgMSAwLjUyMDU0LTAuODEyMjIgNC41MzIzIDQuNTMyMyAwIDAgMSAwLjc0MDQyLTAuNjczMTIgMTQuMTggMTQuMTggMCAwIDAtNC4yMjcyLTIuNDQ1NmMwLjAzMTQxIDAuMTY2MDQgMC4wNzE3OSAwLjM1MDAyIDAuMDcxNzkgMC41MjA1NCAwIDEuODg0Ny0yLjEyNyAzLjQxMDQtNC43NDc3IDMuNDEwNC0xLjY0MjQgMC0zLjA3ODQtMC41NzQzOS0zLjkzNTUtMS40ODA4YTMuNDEwNCAzLjQxMDQgMCAwIDEtMC40NDQyNy0wLjU5MjMyIDIuNjI1MSAyLjYyNTEgMCAwIDEtMC4zNjc5Ny0xLjMzNzNjMC0wLjE3MDUyIDAuMDQwMzktMC4zNTg5OSAwLjA3MTgtMC41MjA1NHptLTEwLjMxNyAxLjYzMzRhMi40NzI2IDIuNDcyNiAwIDAgMC0xLjQ4MDggMS4xMTI5IDIuNDIzMiAyLjQyMzIgMCAwIDAgMC43NDA0MiAzLjMzODZsMS45Mjk2IDEuMTg5MiAwLjc0MDQyIDAuNDQ0MjVhMi45MTY4IDIuOTE2OCAwIDAgMCAwLjk2NDggMC4yMjQzNyAyLjg0MDUgMi44NDA1IDAgMCAwIDEuODU3OC0wLjc0NDkxIDIuMzMzNSAyLjMzMzUgMCAwIDAgMC43NDA0My0xLjcwNTIgMi40NzcxIDIuNDc3MSAwIDAgMC0wLjgxNjcxLTEuODU3OGwtMC44ODg1MS0wLjUxNjA2LTIuMDA1OS0xLjE4OTJhMi4zMDY1IDIuMzA2NSAwIDAgMC0xLjc4MTUtMC4yOTYxN3ptMjkuMDkyIDBhMi4zMTU1IDIuMzE1NSAwIDAgMC0wLjg5MyAwLjI5NjE3bC0yLjAwMTQgMS4xODkyLTAuODkzIDAuNTIwNTRjLTAuMDI2OTMgMC4wMTc5NS0wLjA0NDg4IDAuMDQ0ODgtMC4wNzE3OSAwLjA3MThhMi4xMDkxIDIuMTA5MSAwIDAgMC0wLjc0NDkxIDEuNzA1MiAyLjMzMzUgMi4zMzM1IDAgMCAwIDAuNzQ0OTEgMS43MDUyIDIuODM2MSAyLjgzNjEgMCAwIDAgMi44MTgxIDAuNTkyMzRsMC43NDA0My0wLjQzOTc3IDEuOTI5Ni0xLjE4OTJhMi40MjMyIDIuNDIzMiAwIDAgMCAwLjc0NDkxLTMuMzM4NiAyLjM1NTkgMi4zNTU5IDAgMCAwLTIuMzc4My0xLjExMjl6bS0xNC4wOTkgNy4wNDk3YTQuNzQ5OSA0Ljc0OTkgMCAxIDEgMCA5LjQ5OTljLTEuMzE0OCAwLTIuNDgxNS0wLjU1MTk1LTMuMzM4Ni0xLjQxMzUtMC4yMTU0LTAuMjEwOTEtMC40MjYzMS0wLjQxMjg0LTAuNTk2ODMtMC42NjQxNGE0Ljc4MzYgNC43ODM2IDAgMCAxLTAuODE2NzEtMi42NzQ1YzAtMC4zMjc1OCAwLjAxMzQ3LTAuNjU1MTYgMC4wNzYyOS0wLjk2NDggMC40NDQyNS0yLjE2MjkgMi4zNzgzLTMuNzgyOSA0LjY3NTktMy43ODI5em0wIDIuMzc4M2MtMC45ODcyMyAwLTEuNzk1IDAuNjI4MjQtMi4xNTQgMS40ODA4YTIuMjMwMyAyLjIzMDMgMCAwIDAtMC4yMjQzNyAwLjg4ODUxIDIuMzczOCAyLjM3MzggMCAxIDAgMi4zNzgzLTIuMzczOHptLTEyLjA5OCA3LjkzODNjLTAuNTUxOTUgMC4wNTgzMy0wLjcwMDA0IDAuMTk3NDUtMC45NjQ4IDAuMjk2MTdsLTAuNTE2MDUgMC4yOTYxNy0xLjkyOTYgMS4xODQ3YTIuNDIzMiAyLjQyMzIgMCAwIDAtMC43NDQ5MSAzLjM0MzEgMi40NDU2IDIuNDQ1NiAwIDAgMCAzLjMzODYgMC44MTIyMmwxLjkyOTYtMS4xODQ3IDAuNjczMTEtMC40NDg3NGEyLjc1NTMgMi43NTUzIDAgMCAwIDAuNzM1OTQtMS4xODQ3IDEuNDg1MyAxLjQ4NTMgMCAwIDAgMC4wNzYyOS0wLjQ0ODc0IDIuODYzIDIuODYzIDAgMCAwLTAuNzQwNDItMS44NTMzIDIuNjAyNyAyLjYwMjcgMCAwIDAtMC44MTY3MS0wLjY2NDE0IDIuMDY0MiAyLjA2NDIgMCAwIDAtMS4wNDExLTAuMTQ4MDh6bTI0LjI2OCAwLjE0ODA4YTIuNTMwOSAyLjUzMDkgMCAwIDAtMi41MjY0IDIuNTIxOWMwIDAuNjUwNjggMC4xODM5OCAxLjEyMTkgMC41OTY4MyAxLjU1NzFsMC43NDA0MyAwLjUyMDU0IDEuOTI5NiAxLjE4NDdhMi40NDU2IDIuNDQ1NiAwIDAgMCAzLjMzODYtMC44MTIyMiAyLjQyMzIgMi40MjMyIDAgMCAwLTAuNzQwNDItMy4zNDMxbC0xLjkyOTYtMS4xODQ3Yy0wLjE3MDUyLTAuMDk4NzMtMC4zMzIwNy0wLjIxMDkxLTAuNTIwNTQtMC4yOTYxN2EyLjc1NTMgMi43NTUzIDAgMCAwLTAuODg4NTEtMC4xNDgwOHptLTEyLjE3IDYuMTU2N2EyLjQ0NTYgMi40NDU2IDAgMCAwLTAuODkzIDAuMTQ4MDggMy4wOTE4IDMuMDkxOCAwIDAgMC0wLjgxNjcxIDAuNTIwNTQgMi4xOTg4IDIuMTk4OCAwIDAgMC0wLjgxMjIyIDEuNDgwOHYyLjYwNzJjMCAxLjMxMDMgMS4wOTQ5IDIuMzczOCAyLjQ0NTYgMi4zNzM4YTIuNDE0MiAyLjQxNDIgMCAwIDAgMi40NTAxLTIuMzc4M3YtMi41OTM3YTIuNDA5NyAyLjQwOTcgMCAwIDAtMi4zNzgzLTIuMTU0eiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIzLjc3OTYiLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"mines,gnome mines,game mines,mines\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Mines.desktop\"\nLABEL oc.launch=\"gnome-mines.Gnome-mines\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Mines\"\nLABEL oc.displayname=\"gnome-mines (alpine)\"\nLABEL oc.path=\"/usr/bin/gnome-mines\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Mines\"\nENV APPBIN \"/usr/bin/gnome-mines\"\nENV APP \"/usr/bin/gnome-mines\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/mines/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/mines/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Mines

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Mines.d\n
"},{"location":"applications/mines/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Mines.d -t Mines .\n
"},{"location":"applications/mines/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Mines > Mines.json\ndocker image save Mines -o Mines.tar\nctr -n k8s.io images import Mines.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Mines.json\n\n
"},{"location":"applications/nautilus/","title":"nautilus","text":""},{"location":"applications/nautilus/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/nautilus/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/nautilus/#ubuntu-packages","title":"Ubuntu packages","text":"
dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs\n
"},{"location":"applications/nautilus/#displayname","title":"Displayname","text":"
FileManager\n
"},{"location":"applications/nautilus/#path","title":"Path","text":"
/usr/bin/nautilus\n
"},{"location":"applications/nautilus/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/nautilus/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/nautilus/#wm_class","title":"WM_CLASS","text":"
org.gnome.Nautilus.Org.gnome.Nautilus\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/nautilus/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Nautilus.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/nautilus/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\nCOPY composer/node /composer/node\nRUN cd /composer/node/ocdownload && npm install\nCOPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\nCOPY composer/desktop_download.py /composer/desktop_download.py\nENV NAUTILUS_PYTHON_DEBUG=misc\n
"},{"location":"applications/nautilus/#json-dump","title":"JSON dump","text":"

json source file nautilus.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"preruncommands\": [\n        \"RUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\",\n        \"COPY composer/node /composer/node\",\n        \"RUN cd /composer/node/ocdownload && npm install\",\n        \"COPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\",\n        \"COPY composer/desktop_download.py /composer/desktop_download.py\",\n        \"ENV NAUTILUS_PYTHON_DEBUG=misc\"\n    ],\n    \"debpackage\": \"dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs\",\n    \"icon\": \"circle_filemanager.svg\",\n    \"keyword\": \"file,manager,nautilus\",\n    \"launch\": \"org.gnome.Nautilus.Org.gnome.Nautilus\",\n    \"name\": \"nautilus\",\n    \"displayname\": \"FileManager\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/nautilus\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Nautilus.desktop\",\n    \"usedefaultapplication\": true,\n    \"quick\": true\n}\n
"},{"location":"applications/nautilus/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output nautilus.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/nautilus.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @nautilus.d.3.0.json\n\n
"},{"location":"applications/nautilus/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN mkdir -p /run/user/4096 /var/run/dbus/ chown balloon:balloon /run/user/4096 /var/run/dbus\nCOPY composer/node /composer/node\nRUN cd /composer/node/ocdownload && npm install\nCOPY composer/init.d/init.nautilus /composer/init.d/init.nautilus\nCOPY composer/desktop_download.py /composer/desktop_download.py\nENV NAUTILUS_PYTHON_DEBUG=misc\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus gnome-icon-theme gnome-icon-theme-symbolic numix-gtk-theme numix-icon-theme gnome-font-viewer dbus-x11 python3-nautilus python3-shellescape nautilus desktop-file-utils shared-mime-info xdg-user-dirs && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_filemanager.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIGlkPSJDYWxjdWxhdG9yIgogICB3aWR0aD0iNjQiCiAgIGhlaWdodD0iNjQiCiAgIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIKICAgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIgogICB2ZXJzaW9uPSIxLjEiCiAgIHZpZXdCb3g9IjAgMCA2NCA2NCIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZmlsZW1hbmFnZXIuc3ZnIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjUgKDIwNjBlYzFmOWYsIDIwMjAtMDQtMDgpIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGEyNDQ1NSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxNDQwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjYxNSIKICAgICBpZD0ibmFtZWR2aWV3MjQ0NTMiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjMuNjkiCiAgICAgaW5rc2NhcGU6Y3g9Ii0xNC4wNzA0NjEiCiAgICAgaW5rc2NhcGU6Y3k9IjMyIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iQ2FsY3VsYXRvciIgLz4KICA8ZGVmcwogICAgIGlkPSJkZWZzMjQ0MTMiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiMyZjVmZGQiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDM5MiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzFhN2ZkNCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI0Mzk0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjUyMCIKICAgICAgIHgyPSI1MjAiCiAgICAgICB5MT0iNCIKICAgICAgIHkyPSIxMDI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNDQwMSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiNmZWM1ODkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNDM5NyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iI2YzNGYxNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI0Mzk5IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImQiCiAgICAgICB4MT0iNTIwIgogICAgICAgeDI9IjUyMCIKICAgICAgIHkxPSI0IgogICAgICAgeTI9IjEwMjQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNjA4NjI3MywwLDAsMC4wNjA1NDkwMiwwLjc4MzE2OCwwLjkxODY2OTUpIj4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzExMSIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI0NDAzIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjM2IzYjNiIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjQ0MDUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYyIKICAgICAgIHgxPSI1MjAiCiAgICAgICB4Mj0iNTIwIgogICAgICAgeTE9IjQiCiAgICAgICB5Mj0iMTAyNCIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4wNjk0NTI0NCwwLDAsMC4wNjk0NTI0NCwtMy41MjYyMDYzLC0zLjU5NTY2NSkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHhsaW5rOmhyZWY9IiNhIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYiIKICAgICAgIHgxPSI3NjAiCiAgICAgICB4Mj0iNzYwIgogICAgICAgeTE9IjQiCiAgICAgICB5Mj0iMTAyNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeGxpbms6aHJlZj0iI2EiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDYyNzQ1LDAsMCwwLjA2Mjc0NSwtMC4xMjU0OSwtMC4xMjU0OSkiIC8+CiAgICA8ZmlsdGVyCiAgICAgICBpZD0iZSIKICAgICAgIHg9Ii0uMDM2IgogICAgICAgeT0iLS4wMzYiCiAgICAgICB3aWR0aD0iMS4wNzIiCiAgICAgICBoZWlnaHQ9IjEuMDcyIgogICAgICAgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5IgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXIyNDQxMCIgLz4KICAgIDwvZmlsdGVyPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYy0xIgogICAgICAgeDE9Ii0yNi4yMDEiCiAgICAgICB4Mj0iLTI2LjIwMSIKICAgICAgIHkxPSIxMDcwLjIiCiAgICAgICB5Mj0iMTA4Mi42IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjNzhjM2ZkIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTQzOSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzdiYzZmZiIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDU0NDEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iYi04IgogICAgICAgeDE9Ii05LjkxMTk5OTciCiAgICAgICB4Mj0iLTkuOTExOTk5NyIKICAgICAgIHkxPSIxMDgxLjQiCiAgICAgICB5Mj0iMTEzOS44IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjMzVhNWZjIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTQ0NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzQ1YzBmZiIKICAgICAgICAgb2Zmc2V0PSIuNSIKICAgICAgICAgaWQ9InN0b3A1NDQ2IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjNGRhY2Y2IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNTQ0OCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJhLTciCiAgICAgICB4MT0iLTkuNjE2OTk5NiIKICAgICAgIHgyPSItOS42MTY5OTk2IgogICAgICAgeTE9IjExMzguNCIKICAgICAgIHkyPSIxMTQwLjIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3Atb3BhY2l0eT0iLjA0Njc4NCIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDU0NTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A1NDUzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImQtOSIKICAgICAgIHgxPSI4IgogICAgICAgeDI9IjgiCiAgICAgICB5MT0iMiIKICAgICAgIHkyPSIxNCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzAzYjZlYyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI2OTI1IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdG9wLWNvbG9yPSIjMTNjMGY3IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjY5MjciIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0iZC0zIgogICAgICAgeDE9IjEwMS4xOCIKICAgICAgIHgyPSIxMDEuMTgiCiAgICAgICB5MT0iOTIxLjQ4OTk5IgogICAgICAgeTI9IjEwMDAuMiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4yMjMxNjc5NiwwLDAsMC4yMTcyMDYyNCw4LjMwMjQzMTEsLTE3NC4xMTE0NCkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiMwM2I2ZWMiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyOTMwMiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3RvcC1jb2xvcj0iIzEzYzBmNyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI5MzA0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPGNpcmNsZQogICAgIGlkPSJjaXJjbGUyNDQxNSIKICAgICBzdHlsZT0ib3BhY2l0eTowLjI1O3N0cm9rZS13aWR0aDoxNS45Mzc5OTk3MztwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsO2ZpbHRlcjp1cmwoI2UpIgogICAgIHI9IjQ3OC4xMiIKICAgICBjeT0iNTEyIgogICAgIGN4PSI1MTIiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNjI3NDUsMCwwLDAuMDYyNzQ1LC0wLjEyNTQ5LC0wLjEyNTQ5KSIgLz4KICA8ZwogICAgIHN0eWxlPSJzdHJva2Utd2lkdGg6MTUuOTM3OTk5NzMiCiAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjA2MjQ5OTY3KSIKICAgICBpZD0ic2hhZG93IiAvPgogIDxjaXJjbGUKICAgICBjeD0iMzEuOTk5OTUiCiAgICAgY3k9IjMxLjk5OTk1IgogICAgIHI9IjI5Ljk5OTY0IgogICAgIHN0eWxlPSJmaWxsOnVybCgjYyk7c3Ryb2tlLXdpZHRoOjEuMDAwMDI5ODtwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIgogICAgIGlkPSJjaXJjbGUyNDQxOCIgLz4KICA8ZWxsaXBzZQogICAgIGN4PSIzMS45MTQ0NTUiCiAgICAgY3k9IjMxLjk1MDA0MyIKICAgICBzdHlsZT0iZmlsbDp1cmwoI2QpO3N0cm9rZS13aWR0aDowLjk2NzUyNzAzO3BhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiCiAgICAgaWQ9ImNpcmNsZTI0NDIwIgogICAgIHJ4PSIyNi4yODg0NDEiCiAgICAgcnk9IjI2LjE1MjkzOSIgLz4KICA8ZwogICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMTg0NDA1MjUsMCwwLDAuMTg0NDE0MTgsMTMuNDQ3NDEzLDEzLjA3MzQ3NSkiCiAgICAgaWQ9Imc1NDY2Ij4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2MtMSkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4yMTM5LDAsMCwyLjIxMzksMTA5LjUsLTIzNDQuOSkiCiAgICAgICBkPSJtIC00NC43NjIsMTA3MC4yIGggMjIuMTMxIGMgMy4yODcsMCA0LjY1Miw3LjA3MSA3LjcyOCw3LjA3MSBoIDUxLjUyMiBhIDMuMjc2LDMuMjc2IDAgMCAxIDMuMjgzLDMuMjgzIHYgNTAuNTA4IGMgMCwxLjgxOSAtMS40NjQsLTIuMDIgLTMuMjgzLC0yLjAyIGggLTgxLjM4IGEgMy4yNzYsMy4yNzYgMCAwIDEgLTMuMjgzLC0zLjI4MyB2IC01Mi4yNzUgYSAzLjI3NiwzLjI3NiAwIDAgMSAzLjI4MywtMy4yODMgeiIKICAgICAgIGlkPSJwYXRoNTQ1OCIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2ItOCkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4yMTM5LDAsMCwyLjIxMzksMTA5LjUsLTIzNDQuOSkiCiAgICAgICBkPSJtIC00NC43NjIsMTA4MS4zIGggODEuMzggYSAzLjI3NiwzLjI3NiAwIDAgMSAzLjI4MywzLjI4MyB2IDUyLjI3NSBhIDMuMjc2LDMuMjc2IDAgMCAxIC0zLjI4MywzLjI4MyBoIC04MS4zOCBhIDMuMjc2LDMuMjc2IDAgMCAxIC0zLjI4MywtMy4yODMgdiAtNTIuMjc1IGEgMy4yNzYsMy4yNzYgMCAwIDEgMy4yODMsLTMuMjgzIHoiCiAgICAgICBpZD0icGF0aDU0NjAiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGQ9Im0gMy4xNiwxNjUuODQgdiAyLjIxNCBIIDE5Ny44NCBWIDE2NS44NCBIIDMuMTUgWiBtIDAsNC44NyB2IDEuMTc2IGMgMCwwLjM1OSAwLjAxOSwwLjY5NCAwLjA2OCwxLjAzOCBoIDE5NC41NSBjIDAuMDUsLTAuMzQ0IDAuMDY5LC0wLjY3OSAwLjA2OSwtMS4wMzggViAxNzAuNzEgSCAzLjE1NyBaIgogICAgICAgc3R5bGU9InRleHQtaW5kZW50OjA7dGV4dC10cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjAuMDc5OTk5OTgiCiAgICAgICBpZD0icGF0aDU0NjIiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMjEzOSwwLDAsMi4yMTM5LDEwOS41LC0yMzQ0LjkpIgogICAgICAgZD0ibSAtNDcuNzUsMTEzOC4yIGEgMy4yOCwzLjI4IDAgMCAwIDMsMS45MzggaCA4MS4zNzUgYyAxLjM0LDAgMi40ODgsLTAuNzkzIDMsLTEuOTM4IHoiCiAgICAgICBzdHlsZT0idGV4dC1pbmRlbnQ6MDt0ZXh0LXRyYW5zZm9ybTpub25lO29wYWNpdHk6MC4yNTtmaWxsOnVybCgjYS03KSIKICAgICAgIGlkPSJwYXRoNTQ2NCIgLz4KICA8L2c+CiAgPHBhdGgKICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgIGQ9Im0gMjUuNjQ1NjcsMjYuMDI1NzM2IGEgMC42MDI0NTU0OCwwLjU4NjM1NzU4IDAgMCAwIC0wLjYwMjM4OCwwLjU4NjI5MSB2IDE1LjkwMzMzOSBhIDAuNjAyNDU1NDgsMC41ODYzNTc1OCAwIDAgMCAwLjYwMjM4OCwwLjU4NjI2OSBoIDEyLjEyMzI5NyBhIDAuNjAyNDU1NDgsMC41ODYzNTc1OCAwIDAgMCAwLjYwMjM4OCwtMC41ODYyNjkgViAzMi4yNDYxNTIgbCAtNi4zOTA5MTYsLTYuMjIwMTA1IHogbSAwLjYwMjM4OCwxLjE3MjYwNCBoIDQuMzg4NTI3IGMgMC42ODkzNTQsMC4wNTc5OCAxLjE0NTk1MiwwLjM0NjYwMiAxLjE0NTk1MiwxLjgxMzg2NSB2IDIuODU4MjM1IGggMy4wMzA3MDkgYyAwLjczNzcxLDAgMi4wNjk4ODMsLTAuMDI2NjQgMi4zNTMxNzUsMC43Njk0OTYgdiA5LjI4OTA5NSBIIDI2LjI0Nzk4NiBaIgogICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO3RleHQtaW5kZW50OjA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC1kZWNvcmF0aW9uLWxpbmU6bm9uZTt0ZXh0LWRlY29yYXRpb24tc3R5bGU6c29saWQ7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOiMwMDAwMDA7dGV4dC10cmFuc2Zvcm06bm9uZTt3aGl0ZS1zcGFjZTpub3JtYWw7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO3NvbGlkLWNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2QtMyk7c3Ryb2tlLXdpZHRoOjIuMjU3NDA1MDQ7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG8iCiAgICAgaWQ9InBhdGgyOTMxOSIgLz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"nautilus,file,manager,nautilus\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"org.gnome.Nautilus.desktop\"\nLABEL oc.launch=\"org.gnome.Nautilus.Org.gnome.Nautilus\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"nautilus\"\nLABEL oc.displayname=\"FileManager\"\nLABEL oc.path=\"/usr/bin/nautilus\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"nautilus\"\nENV APPBIN \"/usr/bin/nautilus\"\nENV APP \"/usr/bin/nautilus\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/nautilus/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/nautilus/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application nautilus

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/nautilus.d\n
"},{"location":"applications/nautilus/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f nautilus.d -t nautilus .\n
"},{"location":"applications/nautilus/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect nautilus > nautilus.json\ndocker image save nautilus -o nautilus.tar\nctr -n k8s.io images import nautilus.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @nautilus.json\n\n
"},{"location":"applications/netbeans/","title":"Netbeans","text":""},{"location":"applications/netbeans/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk

"},{"location":"applications/netbeans/#use-ubuntu-package","title":"use ubuntu package","text":"

netbeans

"},{"location":"applications/netbeans/#display-name","title":"Display name","text":"

\"Netbeans\"

"},{"location":"applications/netbeans/#path","title":"path","text":"

\"/usr/bin/netbeans\"

"},{"location":"applications/notepad-wine/","title":"notepad-wine","text":""},{"location":"applications/notepad-wine/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.wine

"},{"location":"applications/notepad-wine/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/notepad-wine/#alpine-packages","title":"Alpine packages","text":"
wine\n
"},{"location":"applications/notepad-wine/#displayname","title":"Displayname","text":"
Notepad Wine (alpine)\n
"},{"location":"applications/notepad-wine/#path","title":"Path","text":"
/usr/bin/notepad\n
"},{"location":"applications/notepad-wine/#mimetype","title":"Mimetype","text":"
application/text;\n
"},{"location":"applications/notepad-wine/#file-extensions","title":"File extensions","text":"

\"txt;log;\"

"},{"location":"applications/notepad-wine/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/notepad-wine/#wm_class","title":"WM_CLASS","text":"
notepad.exe.notepad.exe\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/notepad-wine/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
"},{"location":"applications/notepad-wine/#json-dump","title":"JSON dump","text":"

json source file notepad-wine.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n    ],\n    \"apkpackage\": \"wine\",\n    \"icon\": \"notepad.svg\",\n    \"keyword\": \"wine,notepad,text\",\n    \"launch\": \"notepad.exe.notepad.exe\",\n    \"name\": \"notepad-wine\",\n    \"displayname\": \"Notepad Wine (alpine)\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\": \"txt;log;\",\n    \"path\": \"/usr/bin/notepad\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/notepad-wine/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output notepad-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepad-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepad-wine.d.3.0.json\n\n
"},{"location":"applications/notepad-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"notepad.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMjU2IgogICBoZWlnaHQ9IjI1NiIKICAgaWQ9InN2ZzQ3NDIiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40NyByMjI1ODMiCiAgIHNvZGlwb2RpOmRvY25hbWU9Im5vdGVwYWQuc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDc0NCI+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9Ijc0NC4wOTQ0OCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzcyLjA0NzI0IDogMzUwLjc4NzM5IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTQ3NTAiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTQ4MjAiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTM1MiIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1Mzc0IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTUzOTkiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTQzMCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NDUyIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjIiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTU2Mi0zIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjItOCIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTYyLTM4IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1NjItNSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTYyLTAiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxwYXR0ZXJuCiAgICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgd2lkdGg9IjExNC44OTQ2OCIKICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgcGF0dGVyblRyYW5zZm9ybT0idHJhbnNsYXRlKDI4LjAzMzg4Niw5MTQuMzUzODYpIgogICAgICAgaWQ9InBhdHRlcm41NjgwIj4KICAgICAgPGcKICAgICAgICAgaWQ9Imc1NjQ3IgogICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjguMDMzODg2LC05MTQuMzUzODYpIj4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDEyNy4xNDI4NiwxMjMuODU3MTQgYyA4LjI1MDc4LDAuMDIzNiAxMy42NDMwNCwzLjQ0MTc0IDE0LjI4NTcxLDEyLjUgbCAtMC4zNTcxNCw4MS43ODU3MiBjIC0wLjY2MzI4LDEyLjA5OCAtNy4xNzQ4OSwxMS45Njc2NSAtMTIuODU3MTQsMTMuNTcxNDMgbCAtNTEuOTY0Mjg5LDAuMTc4NTcgQyA2Ni40MDYyMTYsMjMwLjg1NzI1IDYxLjUwMTAyOCwyMjcuMDA5NjkgNTkuODIxNDI4LDIxNy4yNSBsIDAuODkyODU4LC03OS44MjE0MyBjIDAuNDAwODQxLC01Ljk4MTU2IDIuMjQyOTA2LC0xMC43ODM5NCA3Ljg1NzE0MywtMTIuNSBsIDU4LjU3MTQzMSwtMS4wNzE0MyB6IgogICAgICAgICAgIGlkPSJwYXRoNDgyNiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiCiAgICAgICAgICAgaWQ9InBhdGg0ODMwIgogICAgICAgICAgIGQ9Im0gMTI5LjkyMDc4LDEyNC4xMDk2OCAtMTcuMzg2MTYsODAuMTQzNTggYyAtMi45MzYxMiwxMS41OTI5MyAtOS40NDc3MywxMC40NTI0MiAtMTUuNjM1MDU5LDExLjA0NjA1IGwgLTM3LjAyOTk0MSwtMC4yMDc1NCAwLjg0NDY2NiwtNzcuNjYzMiBjIDAuNDAwODQxLC01Ljk4MTU2IDIuMjQyOTA2LC0xMC43ODM5NCA3Ljg1NzE0MywtMTIuNSBsIDYxLjM0OTM1MSwtMC44MTg4OSB6IgogICAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjYxODAyNTg7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjkuNzAwNTI2LDEwMTUuOTk2NyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjkuMzIxNzE5LDEwMDYuMDIxNCA2MC4zNTY2MTEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDItMiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTYiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Ik0gNjkuMTMyMzE2LDk4NS44ODE1IDEyOS40ODg5Myw5ODUuNjI5IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTEiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDUzNDItMCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2Ny45NjQzMjYsOTY1LjM5NDMzIDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTYiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTYtMSIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2Ny43NzQ5MjMsOTQ1LjI1NDQxIDYwLjM1NjYxNywtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTM0Mi0yLTEtNSIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6IzVmZDVkNDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMzcuMTQyODU4LDk5MC41NzY0NyBjIC0xMC44NDI4MTUsLTIuOTU5MzUgLTcuNjkxMTg2LC04Ljg5NzQxIC01LjA2MTI3NiwtMTQuOTgyMDYgTCA1Ni42MTI0LDkyNy45NTM5MiBjIDEuNTM1NTgyLC00LjI0MzI3IDcuNDI3MjYyLC03LjI0OTE1IDExLjI0NDc0MywtNi42NjMxNiBsIDYwLjM1NzE0NywtMC4zNTcxNSBjIDMuNzA5MjcsMC44NjA0OSA4Ljc4Nzc2LDAuODA4MTYgNC4yODU3MSw3LjE0Mjg2IGwgLTI3LjQ1NjY3LDUzLjY5Mzk4IGMgLTEuMDI0MjMsNS44MDg2OSAtNy42NDMyNjMsOC43NjE1MSAtMTEuNDk3MjgyLDguOTEwNjIgbCAtNTYuNDAzMTksLTAuMTA0NiB6IgogICAgICAgICAgIGlkPSJwYXRoNDgyOCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY1LjUzNTk3OSw5MzcuODQ1NTcgNDUuNzEzNzYxLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTkiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1MzQyLTktNCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxnCiAgICAgICAgICAgaWQ9Imc1NTUwIj4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1NDY4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1NDY2IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMC40Njg5MDEsMC40NjMxNjA3NSkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTEiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMyNjI3MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIKICAgICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2Ni05IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMS4yMDQ4NTEsMC40NTk0NDM3NCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTkiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiMyNjI3MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIKICAgICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2Ni04IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZwogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zMi4xMTAzOTksMC43MTE5ODE4OCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTUiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjgtMDkiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjYtNiIKICAgICAgICAgICAgIGQ9Im0gMTIyLjMyMTQzLDEyOC41ODkyOSBjIC03LjAzNjgsLTcuMzIxNDggMy4yNjY3NywtMTMuNzQ3MzQgNC4yODU3MSwtNi4yNSIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM4MzgzODI7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIgLz4KICAgICAgICA8L2c+CiAgICAgICAgPGcKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDIuNjgwNDY4LDAuOTIxMTkxMzMpIgogICAgICAgICAgIGlkPSJnNTU1MC01NiI+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi4wNDUxMTI4LDAsMCwxLjQ3MzY4NDIsLTEyNy4zMTgxNSw3MzUuNDIyNCkiCiAgICAgICAgICAgICBkPSJtIDEyMi45ODYwNywxMjguNzgzOTIgYyAwLDAuNjYyNSAtMC4zOTU3MywxLjE5OTU2IC0wLjg4Mzg4LDEuMTk5NTYgLTAuNDg4MTYsMCAtMC44ODM4OSwtMC41MzcwNiAtMC44ODM4OSwtMS4xOTk1NiAwLC0wLjY2MjUgMC4zOTU3MywtMS4xOTk1NiAwLjg4Mzg5LC0xLjE5OTU2IDAuNDg4MTUsMCAwLjg4Mzg4LDAuNTM3MDYgMC44ODM4OCwxLjE5OTU2IHoiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeT0iMS4xOTk1NTYxIgogICAgICAgICAgICAgc29kaXBvZGk6cng9IjAuODgzODgzNDgiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeT0iMTI4Ljc4MzkyIgogICAgICAgICAgICAgc29kaXBvZGk6Y3g9IjEyMi4xMDIxOSIKICAgICAgICAgICAgIGlkPSJwYXRoNTQ2OC0xIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1NDY2LTEiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1NTUwLTk4Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1NDY4LTQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU0NjYtODEiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICA8L3BhdHRlcm4+CiAgICA8cGF0dGVybgogICAgICAgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHdpZHRoPSIxMjQuMjQ4NzYiCiAgICAgICBoZWlnaHQ9IjEyNC4yNDg3NiIKICAgICAgIHBhdHRlcm5UcmFuc2Zvcm09InRyYW5zbGF0ZSgyMi4yMjMzNTYsOTA5LjkzMDY2KSIKICAgICAgIGlkPSJwYXR0ZXJuNTg0NCI+CiAgICAgIDxyZWN0CiAgICAgICAgIHk9IjEuMTM2ODY4NGUtMTMiCiAgICAgICAgIHg9IjAiCiAgICAgICAgIGhlaWdodD0iMTI0LjI0ODc2IgogICAgICAgICB3aWR0aD0iMTI0LjI0ODc2IgogICAgICAgICBpZD0icmVjdDU4NDIiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGlkPSJyZWN0NTcxNCIKICAgICAgICAgeT0iNC40MjMyMTc4IgogICAgICAgICB4PSI1LjgxMDUyOTciCiAgICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgICB3aWR0aD0iMTE0Ljg5NDY4IgogICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTpub25lIiAvPgogICAgICA8ZwogICAgICAgICBpZD0iZzU3NzgiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMi4yMjMzNTYsLTkwOS45MzA2NikiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMTI3LjE0Mjg2LDEyMy44NTcxNCBjIDguMjUwNzgsMC4wMjM2IDEzLjY0MzA0LDMuNDQxNzQgMTQuMjg1NzEsMTIuNSBsIC0wLjM1NzE0LDgxLjc4NTcyIGMgLTAuNjYzMjgsMTIuMDk4IC03LjE3NDg5LDExLjk2NzY1IC0xMi44NTcxNCwxMy41NzE0MyBsIC01MS45NjQyODksMC4xNzg1NyBDIDY2LjQwNjIxNiwyMzAuODU3MjUgNjEuNTAxMDI4LDIyNy4wMDk2OSA1OS44MjE0MjgsMjE3LjI1IGwgMC44OTI4NTgsLTc5LjgyMTQzIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNTguNTcxNDMxLC0xLjA3MTQzIHoiCiAgICAgICAgICAgaWQ9InBhdGg1NzgwIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIKICAgICAgICAgICBpZD0icGF0aDU3ODIiCiAgICAgICAgICAgZD0ibSAxMjkuOTIwNzgsMTI0LjEwOTY4IC0xNy4zODYxNiw4MC4xNDM1OCBjIC0yLjkzNjEyLDExLjU5MjkzIC05LjQ0NzczLDEwLjQ1MjQyIC0xNS42MzUwNTksMTEuMDQ2MDUgbCAtMzcuMDI5OTQxLC0wLjIwNzU0IDAuODQ0NjY2LC03Ny42NjMyIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNjEuMzQ5MzUxLC0wLjgxODg5IHoiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNjE4MDI1ODtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS43MDA1MjYsMTAxNS45OTY3IDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTc4NCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS4zMjE3MTksMTAwNi4wMjE0IDYwLjM1NjYxMSwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTc4NiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzg4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJNIDY5LjEzMjMxNiw5ODUuODgxNSAxMjkuNDg4OTMsOTg1LjYyOSIKICAgICAgICAgICBpZD0icGF0aDU3OTAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU3OTIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjcuOTY0MzI2LDk2NS4zOTQzMyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU3OTQiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzk2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY3Ljc3NDkyMyw5NDUuMjU0NDEgNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1Nzk4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDojNWZkNWQ0O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSAzNy4xNDI4NTgsOTkwLjU3NjQ3IGMgLTEwLjg0MjgxNSwtMi45NTkzNSAtNy42OTExODYsLTguODk3NDEgLTUuMDYxMjc2LC0xNC45ODIwNiBMIDU2LjYxMjQsOTI3Ljk1MzkyIGMgMS41MzU1ODIsLTQuMjQzMjcgNy40MjcyNjIsLTcuMjQ5MTUgMTEuMjQ0NzQzLC02LjY2MzE2IGwgNjAuMzU3MTQ3LC0wLjM1NzE1IGMgMy43MDkyNywwLjg2MDQ5IDguNzg3NzYsMC44MDgxNiA0LjI4NTcxLDcuMTQyODYgbCAtMjcuNDU2NjcsNTMuNjkzOTggYyAtMS4wMjQyMyw1LjgwODY5IC03LjY0MzI2Myw4Ljc2MTUxIC0xMS40OTcyODIsOC45MTA2MiBsIC01Ni40MDMxOSwtMC4xMDQ2IHoiCiAgICAgICAgICAgaWQ9InBhdGg1ODAwIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzE3MTcxODtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjUuNTM1OTc5LDkzNy44NDU1NyA0NS43MTM3NjEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU4MDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1ODA0IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzU4MDYiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MDgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTAiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwLjQ2ODkwMSwwLjQ2MzE2MDc1KSIKICAgICAgICAgICBpZD0iZzU4MTIiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MTYiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjIwNDg1MSwwLjQ1OTQ0Mzc0KSIKICAgICAgICAgICBpZD0iZzU4MTgiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjIiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMyLjExMDM5OSwwLjcxMTk4MTg4KSIKICAgICAgICAgICBpZD0iZzU4MjQiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MjgiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyLjY4MDQ2OCwwLjkyMTE5MTMzKSIKICAgICAgICAgICBpZD0iZzU4MzAiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MzIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU4MzQiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1ODM2Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1ODM4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1ODQwIgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgPC9wYXR0ZXJuPgogICAgPHBhdHRlcm4KICAgICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB3aWR0aD0iMTI0LjI0ODc2IgogICAgICAgaGVpZ2h0PSIxMjQuMjQ4NzYiCiAgICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMi4xMDU2OTEyLDAsMCwyLjEwNTY5MTIsLTkuMDkxMzcyOSw3OTMuNzYzMTEpIgogICAgICAgaWQ9InBhdHRlcm41OTUwIj4KICAgICAgPHJlY3QKICAgICAgICAgaWQ9InJlY3Q1ODgwIgogICAgICAgICB5PSIxLjEzNjg2ODRlLTEzIgogICAgICAgICB4PSIwIgogICAgICAgICBoZWlnaHQ9IjEyNC4yNDg3NiIKICAgICAgICAgd2lkdGg9IjEyNC4yNDg3NiIKICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6bm9uZSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgeT0iMS4xMzY4Njg0ZS0xMyIKICAgICAgICAgeD0iMCIKICAgICAgICAgaGVpZ2h0PSIxMjQuMjQ4NzYiCiAgICAgICAgIHdpZHRoPSIxMjQuMjQ4NzYiCiAgICAgICAgIGlkPSJyZWN0NTg4MiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIGlkPSJyZWN0NTg4NCIKICAgICAgICAgeT0iNC40MjMyMTc4IgogICAgICAgICB4PSI1LjgxMDUyOTciCiAgICAgICAgIGhlaWdodD0iMTE1LjQwMTE4IgogICAgICAgICB3aWR0aD0iMTE0Ljg5NDY4IgogICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTpub25lIiAvPgogICAgICA8ZwogICAgICAgICBpZD0iZzU4ODYiCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMi4yMjMzNTYsLTkwOS45MzA2NikiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gMTI3LjE0Mjg2LDEyMy44NTcxNCBjIDguMjUwNzgsMC4wMjM2IDEzLjY0MzA0LDMuNDQxNzQgMTQuMjg1NzEsMTIuNSBsIC0wLjM1NzE0LDgxLjc4NTcyIGMgLTAuNjYzMjgsMTIuMDk4IC03LjE3NDg5LDExLjk2NzY1IC0xMi44NTcxNCwxMy41NzE0MyBsIC01MS45NjQyODksMC4xNzg1NyBDIDY2LjQwNjIxNiwyMzAuODU3MjUgNjEuNTAxMDI4LDIyNy4wMDk2OSA1OS44MjE0MjgsMjE3LjI1IGwgMC44OTI4NTgsLTc5LjgyMTQzIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNTguNTcxNDMxLC0xLjA3MTQzIHoiCiAgICAgICAgICAgaWQ9InBhdGg1ODg4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIgogICAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNzk2LjM2MjE4KSIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjYyIKICAgICAgICAgICBpZD0icGF0aDU4OTAiCiAgICAgICAgICAgZD0ibSAxMjkuOTIwNzgsMTI0LjEwOTY4IC0xNy4zODYxNiw4MC4xNDM1OCBjIC0yLjkzNjEyLDExLjU5MjkzIC05LjQ0NzczLDEwLjQ1MjQyIC0xNS42MzUwNTksMTEuMDQ2MDUgbCAtMzcuMDI5OTQxLC0wLjIwNzU0IDAuODQ0NjY2LC03Ny42NjMyIGMgMC40MDA4NDEsLTUuOTgxNTYgMi4yNDI5MDYsLTEwLjc4Mzk0IDcuODU3MTQzLC0xMi41IGwgNjEuMzQ5MzUxLC0wLjgxODg5IHoiCiAgICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4yNjE4MDI1ODtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS43MDA1MjYsMTAxNS45OTY3IDYwLjM1NjYxNCwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTg5MiIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS4zMjE3MTksMTAwNi4wMjE0IDYwLjM1NjYxMSwtMC4yNTI1IgogICAgICAgICAgIGlkPSJwYXRoNTg5NCIKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzY0NjQ2NDtzdHJva2Utd2lkdGg6Mi41O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSA2OS41MTExMjMsOTk1Ljg1NjggNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1ODk2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJNIDY5LjEzMjMxNiw5ODUuODgxNSAxMjkuNDg4OTMsOTg1LjYyOSIKICAgICAgICAgICBpZD0icGF0aDU4OTgiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMzQzMTMzLDk3NS4zNjk2MyA2MC4zNTY2MTcsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MDAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjcuOTY0MzI2LDk2NS4zOTQzMyA2MC4zNTY2MTQsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MDIiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM2NDY0NjQ7c3Ryb2tlLXdpZHRoOjIuNTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjguMTUzNzMsOTU1LjIyOTcxIDYwLjM1NjYyLC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTA0IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojNjQ2NDY0O3N0cm9rZS13aWR0aDoyLjU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDY3Ljc3NDkyMyw5NDUuMjU0NDEgNjAuMzU2NjE3LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTA2IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzdHlsZT0iZmlsbDojNWZkNWQ0O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgICAgICAgZD0ibSAzNy4xNDI4NTgsOTkwLjU3NjQ3IGMgLTEwLjg0MjgxNSwtMi45NTkzNSAtNy42OTExODYsLTguODk3NDEgLTUuMDYxMjc2LC0xNC45ODIwNiBMIDU2LjYxMjQsOTI3Ljk1MzkyIGMgMS41MzU1ODIsLTQuMjQzMjcgNy40MjcyNjIsLTcuMjQ5MTUgMTEuMjQ0NzQzLC02LjY2MzE2IGwgNjAuMzU3MTQ3LC0wLjM1NzE1IGMgMy43MDkyNywwLjg2MDQ5IDguNzg3NzYsMC44MDgxNiA0LjI4NTcxLDcuMTQyODYgbCAtMjcuNDU2NjcsNTMuNjkzOTggYyAtMS4wMjQyMyw1LjgwODY5IC03LjY0MzI2Myw4Ljc2MTUxIC0xMS40OTcyODIsOC45MTA2MiBsIC01Ni40MDMxOSwtMC4xMDQ2IHoiCiAgICAgICAgICAgaWQ9InBhdGg1OTA4IgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzE3MTcxODtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgICAgIGQ9Im0gNjUuNTM1OTc5LDkzNy44NDU1NyA0NS43MTM3NjEsLTAuMjUyNSIKICAgICAgICAgICBpZD0icGF0aDU5MTAiCiAgICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgICAgICA8cGF0aAogICAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMxNzE3MTg7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZSIKICAgICAgICAgICBkPSJtIDU4LjkyODgzNCw5NDYuNDE3MDEgNDUuNzEzNzY2LC0wLjI1MjUiCiAgICAgICAgICAgaWQ9InBhdGg1OTEyIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICAgICAgPGcKICAgICAgICAgICBpZD0iZzU5MTQiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MTgiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwLjQ2ODkwMSwwLjQ2MzE2MDc1KSIKICAgICAgICAgICBpZD0iZzU5MjAiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjQiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjIwNDg1MSwwLjQ1OTQ0Mzc0KSIKICAgICAgICAgICBpZD0iZzU5MjYiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MjgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzAiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMyLjExMDM5OSwwLjcxMTk4MTg4KSIKICAgICAgICAgICBpZD0iZzU5MzIiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5MzYiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQyLjY4MDQ2OCwwLjkyMTE5MTMzKSIKICAgICAgICAgICBpZD0iZzU5MzgiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuMDQ1MTEyOCwwLDAsMS40NzM2ODQyLC0xMjcuMzE4MTUsNzM1LjQyMjQpIgogICAgICAgICAgICAgZD0ibSAxMjIuOTg2MDcsMTI4Ljc4MzkyIGMgMCwwLjY2MjUgLTAuMzk1NzMsMS4xOTk1NiAtMC44ODM4OCwxLjE5OTU2IC0wLjQ4ODE2LDAgLTAuODgzODksLTAuNTM3MDYgLTAuODgzODksLTEuMTk5NTYgMCwtMC42NjI1IDAuMzk1NzMsLTEuMTk5NTYgMC44ODM4OSwtMS4xOTk1NiAwLjQ4ODE1LDAgMC44ODM4OCwwLjUzNzA2IDAuODgzODgsMS4xOTk1NiB6IgogICAgICAgICAgICAgc29kaXBvZGk6cnk9IjEuMTk5NTU2MSIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ4PSIwLjg4Mzg4MzQ4IgogICAgICAgICAgICAgc29kaXBvZGk6Y3k9IjEyOC43ODM5MiIKICAgICAgICAgICAgIHNvZGlwb2RpOmN4PSIxMjIuMTAyMTkiCiAgICAgICAgICAgICBpZD0icGF0aDU5NDAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojMjYyNzJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiCiAgICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDc5Ni4zNjIxOCkiCiAgICAgICAgICAgICBpZD0icGF0aDU5NDIiCiAgICAgICAgICAgICBkPSJtIDEyMi4zMjE0MywxMjguNTg5MjkgYyAtNy4wMzY4LC03LjMyMTQ4IDMuMjY2NzcsLTEzLjc0NzM0IDQuMjg1NzEsLTYuMjUiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojODM4MzgyO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0LjA5NDgxLDEuMDQ3NDYwNCkiCiAgICAgICAgICAgaWQ9Imc1OTQ0Ij4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjA0NTExMjgsMCwwLDEuNDczNjg0MiwtMTI3LjMxODE1LDczNS40MjI0KSIKICAgICAgICAgICAgIGQ9Im0gMTIyLjk4NjA3LDEyOC43ODM5MiBjIDAsMC42NjI1IC0wLjM5NTczLDEuMTk5NTYgLTAuODgzODgsMS4xOTk1NiAtMC40ODgxNiwwIC0wLjg4Mzg5LC0wLjUzNzA2IC0wLjg4Mzg5LC0xLjE5OTU2IDAsLTAuNjYyNSAwLjM5NTczLC0xLjE5OTU2IDAuODgzODksLTEuMTk5NTYgMC40ODgxNSwwIDAuODgzODgsMC41MzcwNiAwLjg4Mzg4LDEuMTk5NTYgeiIKICAgICAgICAgICAgIHNvZGlwb2RpOnJ5PSIxLjE5OTU1NjEiCiAgICAgICAgICAgICBzb2RpcG9kaTpyeD0iMC44ODM4ODM0OCIKICAgICAgICAgICAgIHNvZGlwb2RpOmN5PSIxMjguNzgzOTIiCiAgICAgICAgICAgICBzb2RpcG9kaTpjeD0iMTIyLjEwMjE5IgogICAgICAgICAgICAgaWQ9InBhdGg1OTQ2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzI2MjcyYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIgogICAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw3OTYuMzYyMTgpIgogICAgICAgICAgICAgaWQ9InBhdGg1OTQ4IgogICAgICAgICAgICAgZD0ibSAxMjIuMzIxNDMsMTI4LjU4OTI5IGMgLTcuMDM2OCwtNy4zMjE0OCAzLjI2Njc3LC0xMy43NDczNCA0LjI4NTcxLC02LjI1IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgzODM4MjtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICAgIDwvZz4KICAgICAgPC9nPgogICAgPC9wYXR0ZXJuPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMC45ODk5NDk0OSIKICAgICBpbmtzY2FwZTpjeD0iMTA0Ljk4MzQ4IgogICAgIGlua3NjYXBlOmN5PSIxMjkuNDQ4MzgiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI4NTEiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNjU3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIzMTIiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NzQ3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC03OTYuMzYyMTgpIj4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3BhdHRlcm41OTUwKTtzdHJva2U6bm9uZSIKICAgICAgIHdpZHRoPSIyNjEuNjI5NTIiCiAgICAgICBoZWlnaHQ9IjI2MS42Mjk1MiIKICAgICAgIHg9Ii05LjA5MTM3MjUiCiAgICAgICB5PSI3OTMuNzYzMTIiCiAgICAgICBpZD0icmVjdDU5ODciIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"notepad-wine,wine,notepad,text\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"notepad.exe.notepad.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"notepad-wine\"\nLABEL oc.displayname=\"Notepad Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/notepad\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/text;\"\nLABEL oc.fileextensions=\"txt;log;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"notepad-wine\"\nENV APPBIN \"/usr/bin/notepad\"\nENV APP \"/usr/bin/notepad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/notepad-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/notepad-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application notepad-wine

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepad-wine.d\n
"},{"location":"applications/notepad-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f notepad-wine.d -t notepad-wine .\n
"},{"location":"applications/notepad-wine/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect notepad-wine > notepad-wine.json\ndocker image save notepad-wine -o notepad-wine.tar\nctr -n k8s.io images import notepad-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepad-wine.json\n\n
"},{"location":"applications/notepadqq/","title":"notepadqq","text":""},{"location":"applications/notepadqq/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/notepadqq/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/notepadqq/#ubuntu-packages","title":"Ubuntu packages","text":"
notepadqq\n
"},{"location":"applications/notepadqq/#path","title":"Path","text":"
/usr/bin/notepadqq\n
"},{"location":"applications/notepadqq/#mimetype","title":"Mimetype","text":"
text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\n
"},{"location":"applications/notepadqq/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/notepadqq/#wm_class","title":"WM_CLASS","text":"
notepadqq-bin.Notepadqq\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/notepadqq/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/notepadqq.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/notepadqq/#json-dump","title":"JSON dump","text":"

json source file notepadqq.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,development\",\n    \"debpackage\": \"notepadqq\",\n    \"icon\": \"notepadqq.svg\",\n    \"keyword\": \"notepad,plus,editor\",\n    \"launch\": \"notepadqq-bin.Notepadqq\",\n    \"name\": \"notepadqq\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\",\n    \"host_config\": {\n        \"mem_limit\": \"512M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    },\n    \"path\": \"/usr/bin/notepadqq\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/notepadqq.desktop\"\n}\n
"},{"location":"applications/notepadqq/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output notepadqq.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepadqq.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepadqq.d.3.0.json\n\n
"},{"location":"applications/notepadqq/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends notepadqq && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"notepadqq.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzIiCiAgIHZpZXdCb3g9IjAgMCAxOTIgMTkxLjk5OTk5IgogICBoZWlnaHQ9IjE5MiIKICAgd2lkdGg9IjE5MiI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0Mjk2Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A0Mjk4IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2NDY0NjQ7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNDMwMCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNjQ2NDY0O3N0b3Atb3BhY2l0eTowIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9Ik9tYnJhXzEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDI4NCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDQyODYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00LjAwMDAwNTYsLTIuOTY4NzUpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICB5Mj0iMTAzNi41NzkzIgogICAgICAgeDI9Ijk4LjM2MzQ4IgogICAgICAgeTE9Ijk5OS4zMjk0MSIKICAgICAgIHgxPSI1OS4xMjUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MjgwIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDI5NiIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDcuNjIyMTgyNmUtOCwxLjMzODA2MzQsLTEuNzExOTA1NCw5Ljc1MTc0NjhlLTgsLTI1Ny4xMjQxNSw4MjkuMjczNDQpIgogICAgICAgcj0iNjUuMDAwMDA4IgogICAgICAgZnk9Ii0xNjYuMTk2MTciCiAgICAgICBmeD0iMjguNzI2MDEzIgogICAgICAgY3k9Ii0xNjYuMTk2MTciCiAgICAgICBjeD0iMjguNzI2MDEzIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDE5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNPbWJyYV8xIiAvPgogICAgPGZpbHRlcgogICAgICAgeD0iLTAuMDUwMDAwMDAwMDAwMDAwMDAzIgogICAgICAgd2lkdGg9IjEuMTAwMDAwMDAwMDAwMDAwMSIKICAgICAgIHk9Ii0wLjAyOTk5OTk5OTk5OTk5OTk5OSIKICAgICAgIGhlaWdodD0iMS4wNjAwMDAwMDAwMDAwMDAxIgogICAgICAgaWQ9ImZpbHRlcjQ2NTMiCiAgICAgICBzdHlsZT0iY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOnNSR0I7Ij4KICAgICAgPGZlRmxvb2QKICAgICAgICAgaWQ9ImZlRmxvb2Q0NjU1IgogICAgICAgICByZXN1bHQ9ImZsb29kIgogICAgICAgICBmbG9vZC1jb2xvcj0icmdiKDAsMCwwKSIKICAgICAgICAgZmxvb2Qtb3BhY2l0eT0iMC40NTAwMDAwMDAwMDAwMDAwMSIgLz4KICAgICAgPGZlQ29tcG9zaXRlCiAgICAgICAgIGlkPSJmZUNvbXBvc2l0ZTQ2NTciCiAgICAgICAgIHJlc3VsdD0iY29tcG9zaXRlMSIKICAgICAgICAgb3BlcmF0b3I9ImluIgogICAgICAgICBpbjI9IlNvdXJjZUdyYXBoaWMiCiAgICAgICAgIGluPSJmbG9vZCIgLz4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGR5PSIzIgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0NjU5IgogICAgICAgICByZXN1bHQ9ImJsdXIiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMSAxLjUiCiAgICAgICAgIGluPSJjb21wb3NpdGUxIiAvPgogICAgICA8ZmVPZmZzZXQKICAgICAgICAgaWQ9ImZlT2Zmc2V0NDY2MSIKICAgICAgICAgcmVzdWx0PSJvZmZzZXQiCiAgICAgICAgIGR5PSIzIgogICAgICAgICBkeD0iMCIgLz4KICAgICAgPGZlQ29tcG9zaXRlCiAgICAgICAgIGlkPSJmZUNvbXBvc2l0ZTQ2NjMiCiAgICAgICAgIHJlc3VsdD0iY29tcG9zaXRlMiIKICAgICAgICAgb3BlcmF0b3I9Im92ZXIiCiAgICAgICAgIGluMj0ib2Zmc2V0IgogICAgICAgICBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC04NjAuMzYyMikiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtNC00IgogICAgICAgZD0ibSAxMzYsODY3LjM2MDIzIHYgMC4wMDQgaCAtNjQuNjU4MTgxIC0zMy4zMTA1NSAtNS4zNzEwOSBjIC0yLjU3MjcsMCAtNC42NDQ1NCwyLjA2NjE5IC00LjY0NDU0LDQuNjMyODIgdiAzNi41OTc2NSBjIDAsMC4wMzI3IDAuMDA1OCwwLjA2NDIgMC4wMDk4LDAuMDk1NyBsIC0wLjAwMiwxNC42NzE4NyBoIC0wLjAyMzQ0IHYgOSAxIDEwIDM1IDEgMSA2Ljg1OTM4IDEuMTQwNjIgMSBoIDAuMDA5OCB2IDAuMDAyIGwgLTAuMDAzOSwxOS43NDYwMyBoIC0wLjAwNTkgdiAwIDMxLjY4NzUgYyAwLDIuNTI4OSAyLjA0OTAxLDQuNTY0NCA0LjU5Mzc1LDQuNTY0NCBoIDUuNDUzMTMgMzMuMzMyMDMgNzIuNTY2MzgxIGMgMS4zODgwOSwwIDIuNzQzNTMsLTAuMTQ3NCA0LjA1MDc4LC0wLjQyNTcgMC4zMjY5NiwtMC4wNyAwLjY1MTc5LC0wLjE0NjUgMC45NzI2NiwtMC4yMzI1IDAuNjQxMTMsLTAuMTcxNyAxLjI3MDQzLC0wLjM3NjkgMS44ODQ3NywtMC42MTEzIDAuMzA3NDQsLTAuMTE3MyAwLjYxMTk5LC0wLjI0MjYgMC45MTIxLC0wLjM3NSA0LjIwMTUxLC0xLjg1MyA3LjY2NDI1LC01LjE1NzggOS44MjAzMiwtOS4zMjAzIDAuNjE2MDIsLTEuMTg5MyAxLjEyNjE1LC0yLjQ0ODIgMS41MTU2MiwtMy43NjM3IDAuNTg0MjEsLTEuOTczMiAwLjg5ODQ0LC02LjI1MTkgMC44OTg0NCwtNi4yNTE5IHYgLTEuMTQ2NSAtMTQuMTI3IC0yMC43NDc5OCAtOCAtMSAtNDYgLTEgLTcuODYxMzMgLTEuMTM4NjcgLTMzLjg3MzA1IGMgMCwtMC4yMjQzNyAtMC4wMDksLTAuNDQ3MjcgLTAuMDE1NiwtMC42Njk5MiB2IC0wLjAwMiAtMC4zOTI1OCBjIDAsLTIuMTg3NiAtMC4zMTQyMywtNC4yOTY1NiAtMC44OTg0NCwtNi4yNzczNCAtMC4zODk0NywtMS4zMjA1MiAtMC44OTk2MSwtMi41ODM1MSAtMS41MTU2MywtMy43NzczNSAtMi4zMTAzNiwtNC40Nzc0NCAtNi4xMjAwNCwtNy45NjU5OCAtMTAuNzMyNDIsLTkuNzMyNDIgLTAuMzA3NDUsLTAuMTE3NzggLTAuNjE3MjgsLTAuMjI3ODIgLTAuOTMxNjQsLTAuMzMwMDggLTAuNjI5MzIsLTAuMjA0NyAtMS4yNzEyMiwtMC4zNzc2OSAtMS45MjU3OCwtMC41MTc1OCAtMC4zMjY5NiwtMC4wNjk5IC0wLjY1NTY0LC0wLjEzMjQ2IC0wLjk4ODI4LC0wLjE4NTU0IC0wLjk3NTMxLC0wLjE1NTY0IC0xLjk3NTA2LC0wLjIzNDYzIC0yLjk5MjE5LC0wLjIzODI4IHYgLTAuMDA2IGggLTggeiIKICAgICAgIHN0eWxlPSJmaWxsOiM2NDY0NjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyNDY1MykiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtNCIKICAgICAgIGQ9Im0gMjguMDAwMDI0LDEwMDkuMTExNiB2IDMxLjY4ODEgYyAwLDIuNTI4OSAyLjA0ODE1LDQuNTY0NSA0LjU5Mjg5LDQuNTY0NSBoIDUuNDUzNyAzMy4zMzEyMSA3Mi41NjgwOTYgYyAxMS4xMSwwIDIwLjA1NDE0LC0yMC45Nzk5IDIwLjA1NDE0LC0yMC45Nzk5IHYgLTE1LjI3MjcgeiIKICAgICAgIHN0eWxlPSJmaWxsOiM2NDY0NjQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InJlY3Q0MTM2LTQtMy0zIgogICAgICAgZD0ibSAzMi42NTkyNTksODY3LjM2NDE4IGMgLTIuNTcyNywwIC00LjY0MzY0LDIuMDY2MDggLTQuNjQzNjQsNC42MzI3MSB2IDM2LjU5ODIxIGMgMCwwLjA1IDAuMDA5LDAuMDk3IDAuMDEzNywwLjE0NiBIIDE2My45ODQwOCB2IC0yMC4zMTY1NSBjIDAsLTExLjY2NzIgLTguOTQ0MTcsLTIxLjA2MDM3IC0yMC4wNTQxOCwtMjEuMDYwMzcgaCAtNzIuNTg5MTcxIC0zMy4zMDk3NCAtNS4zNzE3MiB6IgogICAgICAgc3R5bGU9ImZpbGw6IzkxOTE5MTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icmVjdDQxMzYtNDAiCiAgICAgICBkPSJtIDMyLjY3NDg3NCw4NjguMzY2NzkgYyAtMi41NzI2OSwwIC00LjY0MzY1LDIuMDcyMTMgLTQuNjQzNjUsNC42NDYzIGwgLTAuMDMxMiwxNjYuNzUxODEgYyAwLDIuNTQ2MSAyLjA0ODE2LDQuNTk1NSA0LjU5MjksNC41OTU1IGggNS40NTM3IDMzLjMzMTIxIDcyLjU2ODA4NiBjIDExLjExLDAgMjAuMDU0MTQsLTkuNDIwOCAyMC4wNTQxNCwtMjEuMTIyMyBWIDg4OS40ODkwMSBjIDAsLTExLjcwMTQ2IC04Ljk0NDE0LC0yMS4xMjIyMiAtMjAuMDU0MTQsLTIxLjEyMjIyIGggLTcyLjU4OTU1NiAtMzMuMzA5NzQgLTUuMzcxNzIgeiIKICAgICAgIHN0eWxlPSJmaWxsOiM3NTc1NzU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5MTkuNTAyNTYiCiAgICAgICB4PSIyNy45OTk5OTgiCiAgICAgICBoZWlnaHQ9IjYzLjg1OTYzOCIKICAgICAgIHdpZHRoPSIxMzUuOTk5OTgiCiAgICAgICBpZD0icmVjdDQxNjctMS0zIgogICAgICAgc3R5bGU9ImZpbGw6IzcwYmY3MztmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIG1hc2s9Im5vbmUiCiAgICAgICBjbGlwLXBhdGg9Im5vbmUiCiAgICAgICBpZD0icmVjdDQxMzYtNDAtOSIKICAgICAgIGQ9Im0gMjguMDA3NzgzLDk5My4zNjE1NyA1MS41ODc4MTMsNTAuOTk3NTMgaCA2NC4zMzgwNTQgYyA0LjE0ODgyLDAgNy45OTU3MywtMS4zMTQ3IDExLjE4NzUsLTMuNTcwMyBsIDUuNzA3MDMsLTYuMTcxOSBjIDEuOTkxOTksLTMuMjgyNyAzLjE2MDE1LC03LjE3OTggMy4xNjAxNSwtMTEuMzgwOCBsIDhlLTUsLTI5Ljg3NDUzIGggLTAuMDA4IC0xMzUuOTcyODE3IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDI4MCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5NDcuMzYyMTgiCiAgICAgICB4PSIyNy45OTk5OTgiCiAgICAgICBoZWlnaHQ9IjQ2IgogICAgICAgd2lkdGg9IjEzNS45OTk5OCIKICAgICAgIGlkPSJyZWN0NDE2Ny0xLTEiCiAgICAgICBzdHlsZT0iZmlsbDojNDQ5NjRiO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5MjAuMzYyMTgiCiAgICAgICB4PSIyOC4wMDAwMDYiCiAgICAgICBoZWlnaHQ9IjcxLjk5OTk5MiIKICAgICAgIHdpZHRoPSIxMzUuOTk5OTgiCiAgICAgICBpZD0icmVjdDQxNjctMSIKICAgICAgIHN0eWxlPSJmaWxsOiM0Y2FmNTA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxyZWN0CiAgICAgICB5PSI4NjcuMzYxODIiCiAgICAgICB4PSIxMzYiCiAgICAgICBoZWlnaHQ9IjE3OC4wMDA3MyIKICAgICAgIHdpZHRoPSI4IgogICAgICAgaWQ9InJlY3Q0MzA3LTUiCiAgICAgICBzdHlsZT0iZmlsbDojNDI0MjQyO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgPC9nPgogIDxnCiAgICAgc3R5bGU9ImRpc3BsYXk6bm9uZSIKICAgICBpZD0ibGF5ZXIyIj4KICAgIDx0ZXh0CiAgICAgICBpZD0idGV4dDQzMDMtMCIKICAgICAgIHk9Ijk2OC40NDgxMiIKICAgICAgIHg9IjQ3LjcyNDYwOSIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2xpbmUtaGVpZ2h0OjAlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtODYwLjM2MjIpIj48dHNwYW4KICAgICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjQ1cHg7bGluZS1oZWlnaHQ6MS4yNTtmb250LWZhbWlseTpWZXJkYW5hOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246VmVyZGFuYTtsZXR0ZXItc3BhY2luZzowcHg7ZmlsbDojZTBlMGUwO2ZpbGwtb3BhY2l0eToxIgogICAgICAgICB5PSI5NjguNDQ4MTIiCiAgICAgICAgIHg9IjQ3LjcyNDYwOSIKICAgICAgICAgaWQ9InRzcGFuNDMwNS04Ij5ucXE8L3RzcGFuPjwvdGV4dD4KICA8L2c+CiAgPGcKICAgICBpZD0iZzUzMTYiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj4KICAgIDxnCiAgICAgICBpZD0idGV4dDUzMTQiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6NDBweDtsaW5lLWhlaWdodDoxMjUlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC04NjAuMzYyMikiCiAgICAgICBhcmlhLWxhYmVsPSJucXEiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDUzMTgiCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0NXB4O2ZvbnQtZmFtaWx5OlZlcmRhbmE7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpWZXJkYW5hO2xldHRlci1zcGFjaW5nOjBweDtmaWxsOiNlMGUwZTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gNzIuMzEyMDEyLDk2OC40NDgxMiBoIC00LjEzMDg2IHYgLTEzLjk3NDYxIHEgMCwtMS42OTE4OSAtMC4xOTc3NTQsLTMuMTY0MDYgLTAuMTk3NzUzLC0xLjQ5NDE0IC0wLjcyNTA5NywtMi4zMjkxIC0wLjU0OTMxNywtMC45MjI4NSAtMS41ODIwMzEsLTEuMzYyMzEgLTEuMDMyNzE1LC0wLjQ2MTQyIC0yLjY4MDY2NSwtMC40NjE0MiAtMS42OTE4OTQsMCAtMy41Mzc1OTcsMC44MzQ5NiAtMS44NDU3MDMsMC44MzQ5NiAtMy41Mzc1OTgsMi4xMzEzNCB2IDE4LjMyNTIgaCAtNC4xMzA4NTkgdiAtMjQuNTQzNDYgaCA0LjEzMDg1OSB2IDIuNzI0NjEgcSAxLjkzMzU5NCwtMS42MDQgMy45OTkwMjQsLTIuNTA0ODggMi4wNjU0MjksLTAuOTAwODggNC4yNDA3MjIsLTAuOTAwODggMy45NzcwNTEsMCA2LjA2NDQ1MywyLjM5NTAyIDIuMDg3NDAzLDIuMzk1MDIgMi4wODc0MDMsNi44OTk0MSB6IiAvPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDUzMjAiCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0NXB4O2ZvbnQtZmFtaWx5OlZlcmRhbmE7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpWZXJkYW5hO2xldHRlci1zcGFjaW5nOjBweDtmaWxsOiNlMGUwZTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICAgIGQ9Im0gMTAwLjE3MzM0LDk3Ny41MDA4NSBoIC00LjEzMDg2IHYgLTExLjgyMTI4IHEgLTEuOTExNjIxLDEuNjQ3OTQgLTMuODAxMjY5LDIuNDYwOTMgLTEuODg5NjQ5LDAuNzkxMDIgLTQuMDg2OTE0LDAuNzkxMDIgLTQuMzcyNTU5LDAgLTYuOTg3MzA1LC0zLjM2MTgyIC0yLjU5Mjc3MywtMy4zODM3OSAtMi41OTI3NzMsLTkuMzE2NCAwLC0zLjE2NDA3IDAuOTAwODc5LC01LjU4MTA2IDAuOTIyODUxLC0yLjQzODk2IDIuNDE2OTkyLC00LjA4NjkxIDEuNDUwMTk1LC0xLjYwNDAxIDMuNDA1NzYyLC0yLjQ4MjkxIDEuOTU1NTY2LC0wLjg3ODkxIDQuMTMwODU5LC0wLjg3ODkxIDEuOTc3NTM5LDAgMy40OTM2NTIsMC40Mzk0NSAxLjUzODA4NiwwLjQzOTQ2IDMuMTIwMTE3LDEuMjk2MzkgbCAwLjI2MzY3MiwtMS4wNTQ2OSBoIDMuODY3MTg4IHogbSAtNC4xMzA4NiwtMTUuMjkyOTYgdiAtMTMuODg2NzIgcSAtMS43MTM4NjcsLTAuNzY5MDUgLTMuMDMyMjI2LC0xLjA3NjY2IC0xLjMxODM1OSwtMC4zMDc2MiAtMi44NTY0NDUsLTAuMzA3NjIgLTMuNTgxNTQzLDAgLTUuNDQ5MjE5LDIuNDM4OTYgLTEuODY3Njc2LDIuNDE3IC0xLjg2NzY3Niw2LjY3OTY5IDAsNC4zMDY2NCAxLjQ5NDE0MSw2LjYzNTc0IDEuNTE2MTEzLDIuMzA3MTMgNC43NDYwOTMsMi4zMDcxMyAxLjgwMTc1OCwwIDMuNjAzNTE2LC0wLjc2OTA0IDEuODAxNzU4LC0wLjc5MTAyIDMuMzYxODE2LC0yLjAyMTQ4IHoiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoNTMyMiIKICAgICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjQ1cHg7Zm9udC1mYW1pbHk6VmVyZGFuYTstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlZlcmRhbmE7bGV0dGVyLXNwYWNpbmc6MHB4O2ZpbGw6I2UwZTBlMDtmaWxsLW9wYWNpdHk6MSIKICAgICAgICAgZD0ibSAxMjguMjEwNDUsOTc3LjUwMDg1IGggLTQuMTMwODYgdiAtMTEuODIxMjggcSAtMS45MTE2MiwxLjY0Nzk0IC0zLjgwMTI3LDIuNDYwOTMgLTEuODg5NjUsMC43OTEwMiAtNC4wODY5MSwwLjc5MTAyIC00LjM3MjU2LDAgLTYuOTg3MzEsLTMuMzYxODIgLTIuNTkyNzcsLTMuMzgzNzkgLTIuNTkyNzcsLTkuMzE2NCAwLC0zLjE2NDA3IDAuOTAwODgsLTUuNTgxMDYgMC45MjI4NSwtMi40Mzg5NiAyLjQxNjk5LC00LjA4NjkxIDEuNDUwMTksLTEuNjA0MDEgMy40MDU3NiwtMi40ODI5MSAxLjk1NTU3LC0wLjg3ODkxIDQuMTMwODYsLTAuODc4OTEgMS45Nzc1NCwwIDMuNDkzNjUsMC40Mzk0NSAxLjUzODA5LDAuNDM5NDYgMy4xMjAxMiwxLjI5NjM5IGwgMC4yNjM2NywtMS4wNTQ2OSBoIDMuODY3MTkgeiBtIC00LjEzMDg2LC0xNS4yOTI5NiB2IC0xMy44ODY3MiBxIC0xLjcxMzg3LC0wLjc2OTA1IC0zLjAzMjIzLC0xLjA3NjY2IC0xLjMxODM2LC0wLjMwNzYyIC0yLjg1NjQ0LC0wLjMwNzYyIC0zLjU4MTU0LDAgLTUuNDQ5MjIsMi40Mzg5NiAtMS44Njc2OCwyLjQxNyAtMS44Njc2OCw2LjY3OTY5IDAsNC4zMDY2NCAxLjQ5NDE0LDYuNjM1NzQgMS41MTYxMiwyLjMwNzEzIDQuNzQ2MSwyLjMwNzEzIDEuODAxNzYsMCAzLjYwMzUxLC0wLjc2OTA0IDEuODAxNzYsLTAuNzkxMDIgMy4zNjE4MiwtMi4wMjE0OCB6IiAvPgogICAgPC9nPgogIDwvZz4KICA8ZwogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICBpZD0ibGF5ZXIzIj4KICAgIDxwYXRoCiAgICAgICBpZD0icmVjdDQxMzYtNC00LTUiCiAgICAgICBkPSJtIDMyLjY2MDAyNCw4NjcuMzY0MTcgYyAtMi41NzI3LDAgLTQuNjQ0NTMsMi4wNjYxOCAtNC42NDQ1Myw0LjYzMjgxIHYgMzYuNTk3NjYgYyAwLDAuMDMyNyAwLjAwNiwwLjA2NDIgMC4wMSwwLjA5NTcgbCAtMC4wMDQsMjMuNjcxODggaCAtMC4wMjE1IHYgMSA0NSAxIDEgaCAwLjAxMTczIGwgLTAuMDA2LDI4Ljc0OTk4IGggLTAuMDA2IHYgMzEuNjg3NSBjIDAsMi41Mjg5IDIuMDQ5LDQuNTY0NSA0LjU5Mzc0LDQuNTY0NSBoIDUuNDUzMTUgMzMuMzMyMDIgNzIuNTY2Njc2IGMgMTEuMTEsMCAyMC4wNTQ2OCwtMjAuOTgwNSAyMC4wNTQ2OCwtMjAuOTgwNSB2IC0xLjE0NjUgLTQyLjg3NDk4IGggMi44ZS00IHYgLTEgLTQ2IC0xIGggLTIuOGUtNCB2IC00Mi44NzMwNSBjIDAsLTAuMjI0NzcgLTAuMDA5LC0wLjQ0Njg4IC0wLjAxNTYsLTAuNjY5OTIgdiAtMC4zOTQ1MyBjIDAsLTExLjY2NzIgLTguOTQ0NjgsLTIxLjA2MDU1IC0yMC4wNTQ2OSwtMjEuMDYwNTUgaCAtNzIuNTg4MTY2IC0zMy4zMTA1NSAtNS4zNzEwOCB6IgogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtODYwLjM2MjIpIiAvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"notepadqq,notepad,plus,editor\"\nLABEL oc.cat=\"utilities,development\"\nLABEL oc.desktopfile=\"notepadqq.desktop\"\nLABEL oc.launch=\"notepadqq-bin.Notepadqq\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"notepadqq\"\nLABEL oc.displayname=\"notepadqq\"\nLABEL oc.path=\"/usr/bin/notepadqq\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/plain;text/html;text/x-php;text/x-c;text/x-shellscript;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"512M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"notepadqq\"\nENV APPBIN \"/usr/bin/notepadqq\"\nENV APP \"/usr/bin/notepadqq\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/notepadqq/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/notepadqq/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application notepadqq

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/notepadqq.d\n
"},{"location":"applications/notepadqq/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f notepadqq.d -t notepadqq .\n
"},{"location":"applications/notepadqq/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect notepadqq > notepadqq.json\ndocker image save notepadqq -o notepadqq.tar\nctr -n k8s.io images import notepadqq.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @notepadqq.json\n\n
"},{"location":"applications/octave/","title":"octave","text":""},{"location":"applications/octave/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/octave/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/octave/#ubuntu-packages","title":"Ubuntu packages","text":"
octave\n
"},{"location":"applications/octave/#path","title":"Path","text":"
/usr/bin/octave\n
"},{"location":"applications/octave/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/octave/#wm_class","title":"WM_CLASS","text":"
octave-gui.octave-gui\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/octave/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/www.octave.org-octave.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/octave/#json-dump","title":"JSON dump","text":"

json source file octave.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"octave\",\n    \"icon\": \"Gnu-octave-logo.svg\",\n    \"keyword\": \"octave\",\n    \"launch\": \"octave-gui.octave-gui\",\n    \"name\": \"octave\",\n    \"path\": \"/usr/bin/octave\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktop\": \"www.octave.org-octave.desktop.desktop\",\n    \"desktopfile\": \"/usr/share/applications/www.octave.org-octave.desktop\"\n}\n
"},{"location":"applications/octave/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output octave.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/octave.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @octave.d.3.0.json\n\n
"},{"location":"applications/octave/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends octave && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"Gnu-octave-logo.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iMjgzLjI4OTEyIgogICBoZWlnaHQ9IjI4My4yODgzMyIKICAgaWQ9InN2ZzI4NzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDcgcjIyNTgzIgogICBzb2RpcG9kaTpkb2NuYW1lPSJkcmF3aW5nLnN2ZyI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMjk0MiI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI2NDAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNDgzIgogICAgIGlkPSJuYW1lZHZpZXcyOTQwIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIwLjIyNDI1NzM5IgogICAgIGlua3NjYXBlOmN4PSIxMzguNjkxOCIKICAgICBpbmtzY2FwZTpjeT0iMTQ3LjgyNTI1IgogICAgIGlua3NjYXBlOndpbmRvdy14PSI2NDgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjE0NCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzI4NzIiIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczI4NzQiPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iMTgyLjk4MzciCiAgICAgICBjeT0iMzk1LjA0ODcxIgogICAgICAgcj0iMTQ4Ljk1MzA5IgogICAgICAgZng9IjE4Mi45ODM3IgogICAgICAgZnk9IjM5NS4wNDg3MSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDMwMzMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzU1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMjI5MTQzMzQsLTAuMjQ5MDE0NzksMC43NjQzNTcyLDAuODMwNjQyNjgsLTI3Mi44NTMzNywtMTU5LjY5NDgyKSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc1NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1NyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwOGNiZTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTkiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiMmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxnCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjMzLjM1NTQ0LC0zOTAuNzE4MDIpIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjQ1MTk3MjMsMCwwLDguNDUxOTcyMywtMjc4LjQ1MDEyLC00MDMuODI5NzUpIgogICAgICAgaWQ9ImczMDI1Ij4KICAgICAgPHBhdGgKICAgICAgICAgZD0ibSA2Ni40MzIxMDMsOTcuNDg4Njc5IGMgLTUuMTk1ODQsNS42NDY0MzEgLTMuOTM2NjEsMTYuMTY5MDMxIDIuODExMDcsMjMuNTAxODcxIDYuNzQ3NjgsNy4zMzI4NSAxNi40Mjg5OCw4LjY5OTU1IDIxLjYyNDgzLDMuMDUzMTIgNS4xOTU4NSwtNS42NDY0MyAzLjk0MDIsLTE2LjE2OTQ2IC0yLjgwNzQ5LC0yMy41MDIzIC02Ljc0NzY4LC03LjMzMjg2MSAtMTYuNDMyNTYsLTguNjk5MTMxIC0yMS42Mjg0MSwtMy4wNTI2OTEgeiBtIDQuNzExNDksMi4zNDU1MyBjIDQuMDgyNTYsLTQuNDM2NTkgMTEuNTg5LC0zLjQ3MTUyIDE2Ljc2NzQxLDIuMTU1OTYxIDUuMTc4NDIsNS42Mjc1IDYuMDY2NDcsMTMuNzg0OTEgMS45ODM5MSwxOC4yMjE1IC00LjA4MjU2LDQuNDM2NTggLTExLjU5MDk3LDMuNDczNjkgLTE2Ljc2OTM5LC0yLjE1MzgxIC01LjE3ODQyLC01LjYyNzUgLTYuMDY0NDksLTEzLjc4NzA0IC0xLjk4MTkzLC0xOC4yMjM2NTEgeiIKICAgICAgICAgaWQ9InBhdGg1ODc0IgogICAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzAzMyk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHdpZHRoPSI0LjM0OTg1NCIKICAgICAgICAgaGVpZ2h0PSI0LjM0OTg1NCIKICAgICAgICAgcng9IjAuNzY5NTg5NjYiCiAgICAgICAgIHJ5PSIwLjc2OTU4OTY2IgogICAgICAgICB4PSI4NS4zODE1NjEiCiAgICAgICAgIHk9Ijk5LjQ5Mzg4MSIKICAgICAgICAgaWQ9InJlY3Q1ODc2IgogICAgICAgICBzdHlsZT0iZmlsbDojZmY3ZjJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZDQ1NTAwO3N0cm9rZS13aWR0aDowLjc0NDAzNzk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgICA8cmVjdAogICAgICAgICB3aWR0aD0iMTAuMjQ1NDM2IgogICAgICAgICBoZWlnaHQ9IjEwLjI0NTQzNiIKICAgICAgICAgcng9IjEuODEyNjU0NSIKICAgICAgICAgcnk9IjEuODEyNjU0NSIKICAgICAgICAgeD0iNjAuOTI2NTkiCiAgICAgICAgIHk9IjEwNS4yMjQ1IgogICAgICAgICBpZD0icmVjdDU4NzgiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZjdmMmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNkNDU1MDA7c3Ryb2tlLXdpZHRoOjAuNzQ0MDM3OTk7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmUiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHdpZHRoPSI2LjE4OTc1MzEiCiAgICAgICAgIGhlaWdodD0iNi4xODk3NTMxIgogICAgICAgICByeD0iMS4wOTUxMTAyIgogICAgICAgICByeT0iMS4wOTUxMTAyIgogICAgICAgICB4PSI4Ny40MDQ3MzkiCiAgICAgICAgIHk9IjExOC42MzcwNSIKICAgICAgICAgaWQ9InJlY3Q1ODgwIgogICAgICAgICBzdHlsZT0iZmlsbDojZmY3ZjJhO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZDQ1NTAwO3N0cm9rZS13aWR0aDowLjc0NDAzNzk5O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIiAvPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"octave,octave\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"www.octave.org-octave.desktop\"\nLABEL oc.launch=\"octave-gui.octave-gui\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"octave\"\nLABEL oc.displayname=\"octave\"\nLABEL oc.path=\"/usr/bin/octave\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"octave\"\nENV APPBIN \"/usr/bin/octave\"\nENV APP \"/usr/bin/octave\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/octave/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/octave/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application octave

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/octave.d\n
"},{"location":"applications/octave/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f octave.d -t octave .\n
"},{"location":"applications/octave/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect octave > octave.json\ndocker image save octave -o octave.tar\nctr -n k8s.io images import octave.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @octave.json\n\n
"},{"location":"applications/onlyoffice/","title":"onlyoffice","text":""},{"location":"applications/onlyoffice/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/onlyoffice/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/onlyoffice/#ubuntu-packages","title":"Ubuntu packages","text":"
onlyoffice-desktopeditors\n
"},{"location":"applications/onlyoffice/#licence","title":"Licence","text":"

** This application is NO FREE. ** You need to build it manually.

"},{"location":"applications/onlyoffice/#displayname","title":"Displayname","text":"
OnlyOffice\n
"},{"location":"applications/onlyoffice/#path","title":"Path","text":"
/usr/bin/desktopeditors\n
"},{"location":"applications/onlyoffice/#mimetype","title":"Mimetype","text":"
application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\n
"},{"location":"applications/onlyoffice/#file-extensions","title":"File extensions","text":"

\"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\"

"},{"location":"applications/onlyoffice/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/onlyoffice/#wm_class","title":"WM_CLASS","text":"
DesktopEditors.DesktopEditors\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/onlyoffice/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/onlyoffice-desktopeditors.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/onlyoffice/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\" > /etc/apt/sources.list.d/onlyoffice.list\nRUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/onlyoffice/#json-dump","title":"JSON dump","text":"

json source file onlyoffice.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"preruncommands\": [\n        \"RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\",\n        \"RUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\\\" > /etc/apt/sources.list.d/onlyoffice.list\",\n        \"RUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"debpackage\": \"onlyoffice-desktopeditors\",\n    \"icon\": \"onlyoffice-desktopeditors.svg\",\n    \"installrecommends\": true,\n    \"keyword\": \"office,onlyoffice,desktop,editor\",\n    \"launch\": \"DesktopEditors.DesktopEditors\",\n    \"name\": \"onlyoffice\",\n    \"displayname\": \"OnlyOffice\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/desktopeditors\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\",\n    \"args\": \"\",\n    \"fileextensions\": \"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\",\n    \"desktopfile\": \"/usr/share/applications/onlyoffice-desktopeditors.desktop\",\n    \"licence\": \"non-free\"\n}\n
"},{"location":"applications/onlyoffice/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output onlyoffice.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/onlyoffice.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @onlyoffice.d.3.0.json\n\n
"},{"location":"applications/onlyoffice/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\nRUN echo \"deb [arch=$(dpkg --print-architecture)] https://download.onlyoffice.com/repo/debian squeeze main\" > /etc/apt/sources.list.d/onlyoffice.list\nRUN apt-get update && apt-get install --yes libgl1 libnss3 qt5dxcb-plugin && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y onlyoffice-desktopeditors && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"onlyoffice-desktopeditors.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNzIiIGhlaWdodD0iNjciIHZpZXdCb3g9IjAgMCA3MiA2NyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zMS41MDMzIDY1Ljc3NDJMMS44OTE4NCA1Mi4xODA1Qy0wLjYzMDYxNSA1MC45OTM3IC0wLjYzMDYxNSA0OS4xNTk2IDEuODkxODQgNDguMDgwOEwxMi4yMDEgNDMuMzMzN0wzMS4zOTM2IDUyLjE4MDVDMzMuOTE2MSA1My4zNjcyIDM3Ljk3NCA1My4zNjcyIDQwLjM4NjggNTIuMTgwNUw1OS41Nzk0IDQzLjMzMzdMNjkuODg4NiA0OC4wODA4QzcyLjQxMSA0OS4yNjc1IDcyLjQxMSA1MS4xMDE2IDY5Ljg4ODYgNTIuMTgwNUw0MC4yNzcxIDY1Ljc3NDJDMzcuOTc0IDY2Ljg1MyAzMy45MTYxIDY2Ljg1MyAzMS41MDMzIDY1Ljc3NDJaIiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXIpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzEuNTAzMyA0OS4wNTE2TDEuODkxODQgMzUuNDU3OEMtMC42MzA2MTUgMzQuMjcxMSAtMC42MzA2MTUgMzIuNDM3IDEuODkxODQgMzEuMzU4MUwxMS45ODE3IDI2LjcxOUwzMS41MDMzIDM1LjY3MzZDMzQuMDI1OCAzNi44NjAzIDM4LjA4MzYgMzYuODYwMyA0MC40OTY0IDM1LjY3MzZMNjAuMDE4MSAyNi43MTlMNzAuMTA3OSAzMS4zNTgxQzcyLjYzMDQgMzIuNTQ0OSA3Mi42MzA0IDM0LjM3OSA3MC4xMDc5IDM1LjQ1NzhMNDAuNDk2NCA0OS4wNTE2QzM3Ljk3NCA1MC4yMzgzIDMzLjkxNjEgNTAuMjM4MyAzMS41MDMzIDQ5LjA1MTZaIiBmaWxsPSJ1cmwoI3BhaW50MV9saW5lYXIpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzEuNTAzMyAzMi43NjA2TDEuODkxODQgMTkuMTY2OUMtMC42MzA2MTUgMTcuOTgwMSAtMC42MzA2MTUgMTYuMTQ2IDEuODkxODQgMTUuMDY3MkwzMS41MDMzIDEuNDczNDRDMzQuMDI1OCAwLjI4NjY4NSAzOC4wODM2IDAuMjg2Njg1IDQwLjQ5NjQgMS40NzM0NEw3MC4xMDc5IDE1LjA2NzJDNzIuNjMwNCAxNi4yNTM5IDcyLjYzMDQgMTguMDg4IDcwLjEwNzkgMTkuMTY2OUw0MC40OTY0IDMyLjc2MDZDMzcuOTc0IDMzLjgzOTUgMzMuOTE2MSAzMy44Mzk1IDMxLjUwMzMgMzIuNzYwNloiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcikiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhciIgeDE9IjM1Ljk3NDMiIHkxPSI3OC42NTk0IiB4Mj0iMzUuOTc0MyIgeTI9IjI5LjAzMDIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0ZDQzJCMSIvPgo8c3RvcCBvZmZzZXQ9IjAuODg0OCIgc3RvcC1jb2xvcj0iI0Q5NDIwQiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXIiIHgxPSIzNS45NzQzIiB5MT0iNTcuMTcxMyIgeDI9IjM1Ljk3NDMiIHkyPSIyNC41MzE2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNERUVEQzkiLz4KPHN0b3Agb2Zmc2V0PSIwLjY2MDYiIHN0b3AtY29sb3I9IiM4QkJBMjUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyIiB4MT0iMzUuOTc0MyIgeTE9IjQzLjk1NDciIHgyPSIzNS45NzQzIiB5Mj0iLTAuNDYwODYyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNDMkVCRkEiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMjZBOERFIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"onlyoffice,office,onlyoffice,desktop,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"onlyoffice-desktopeditors.desktop\"\nLABEL oc.launch=\"DesktopEditors.DesktopEditors\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"onlyoffice\"\nLABEL oc.displayname=\"OnlyOffice\"\nLABEL oc.path=\"/usr/bin/desktopeditors\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroenabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroenabled.12;application/vnd.ms-excel.sheet.binary.macroenabled.12;text/csv;text/spreadsheet;application/csv;application/excel;application/x-excel;application/x-msexcel;application/x-ms-excel;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;\"\nLABEL oc.fileextensions=\"doc;docx;odt;rtf;txt;xls;xlsx;ods;csv;ppt;pptx;odp\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"onlyoffice\"\nENV APPBIN \"/usr/bin/desktopeditors\"\nENV APP \"/usr/bin/desktopeditors\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/onlyoffice/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/onlyoffice/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application onlyoffice

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/onlyoffice.d\n
"},{"location":"applications/onlyoffice/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f onlyoffice.d -t onlyoffice .\n
"},{"location":"applications/onlyoffice/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect onlyoffice > onlyoffice.json\ndocker image save onlyoffice -o onlyoffice.tar\nctr -n k8s.io images import onlyoffice.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @onlyoffice.json\n\n
"},{"location":"applications/openshift/","title":"openshift","text":""},{"location":"applications/openshift/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/openshift/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.3 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.3 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/openshift/#ubuntu-packages","title":"Ubuntu packages","text":"
rhc gnome-terminal\n
"},{"location":"applications/openshift/#arguments","title":"Arguments","text":"

\"--disable-factory --class openshift.cli\"

"},{"location":"applications/openshift/#displayname","title":"Displayname","text":"
OpenShift cli\n
"},{"location":"applications/openshift/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/openshift/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/openshift/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.openshift.cli\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/openshift/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN cd /tmp && wget \"https://cli.run.pivotal.io/stable?release=linux64-binary\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\n
"},{"location":"applications/openshift/#json-dump","title":"JSON dump","text":"

json source file

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN cd /tmp && wget \\\"https://cli.run.pivotal.io/stable?release=linux64-binary\\\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\"\n    ],\n    \"debpackage\": \"rhc gnome-terminal\",\n    \"icon\": \"openshift.svg\",\n    \"keyword\": \"oc,openshift\",\n    \"launch\": \"gnome-terminal-server.openshift.cli\",\n    \"name\": \"openshift\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"displayname\": \"OpenShift cli\",\n    \"args\": \"--disable-factory --class openshift.cli\",\n    \"quick\": true\n}\n
"},{"location":"applications/openshift/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output openshift.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/openshift.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @openshift.json\n\n
"},{"location":"applications/openshift/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN cd /tmp && wget \"https://cli.run.pivotal.io/stable?release=linux64-binary\" -O pivotal.tgz && tar -xvf pivotal.tgz && mv cf /usr/local/bin\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends rhc gnome-terminal && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"openshift.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIGJ5IE1hcnN1cGlsYW1pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNzE5IgogICBoZWlnaHQ9Ijc2OCIKICAgdmlld0JveD0iLTEuNzMzODY3MSAtMS43MzM4NjcxIDYxLjI2MzMwNDIgNjUuNDA4MjI5MiIKICAgaWQ9InN2ZzQ1NDUzIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNDU0NTUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDU0LjIyNzgyLDExLjk4NjYxNSBjIC0wLjU3MjUsLTEuMTgyNSAtMS4yMzUsLTIuMzIzNzUwNCAtMi4wMDM3NSwtMy40MDAwMDA0IGwgLTguMjEyNSwyLjk4ODc1MDQgYyAwLjk1NSwwLjk3NzUgMS43NTc1LDIuMDc2MjUgMi40MTM3NSwzLjI1MTI1IGwgNy44MDI1LC0yLjg0IHogbSAtMzYuMzAyODcsOS4wODMzOCAtOC4yMTUsMi45ODg3NSBjIDAuMTA1LDEuMzE3NSAwLjMzMjUsMi42MTg3NSAwLjY1MTI1LDMuODkzNzUgbCA3LjgwMzc1LC0yLjg0MTI1IGMgLTAuMjUzNzUsLTEuMzIgLTAuMzQzNzUsLTIuNjggLTAuMjQsLTQuMDQxMjUiCiAgICAgaWQ9InBhdGg0NDU2MCIKICAgICBzdHlsZT0iZmlsbDojYzIyMTMzO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSAzNi4xNTYyLDkuNjYwMTE0NiBjIDEuNzA4NzUsMC43OTc1MDA0IDMuMTg4NzUsMS44ODUwMDA0IDQuNDM3NSwzLjE2MDAwMDQgbCA4LjIxMjUsLTIuOTg4NzUwNCBjIC0yLjI3NSwtMy4xOTI1IC01LjM3Mzc1LC01Ljg2IC05LjE3LC03LjYzMTI1IC0xMS43NDEyNSwtNS40NzUgLTI1Ljc0ODc1LC0wLjM3NzUgLTMxLjIyMjUsMTEuMzYyNTAwNCAtMS43NzI1LDMuNzk4NzUgLTIuNDMxMjUsNy44MzM3NSAtMi4xMjEyNSwxMS43NDEyNSBsIDguMjEzNzUsLTIuOTg4NzUgYyAwLjEzNjI1LC0xLjc4IDAuNTcsLTMuNTYzNzUgMS4zNjYyNSwtNS4yNzM3NSBDIDE5LjQyOTk1LDkuNDEzODY0NiAyOC41Mjg3LDYuMTAzODY0NiAzNi4xNTYyLDkuNjYwMTE0NiIKICAgICBpZD0icGF0aDQ0NTY0IgogICAgIHN0eWxlPSJmaWxsOiNkYjIxMmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDQ0LjkxNTgyLDI0LjY2ODI0NSBjIC0wLjEzMTI1LDEuNzc4NzUgLTAuNTgsMy41NjI1IC0xLjM3ODc1LDUuMjczNzUgLTMuNTU2MjUsNy42Mjg3NSAtMTIuNjU2MjUsMTAuOTM4NzUgLTIwLjI4MjUsNy4zODI1IC0xLjcxMTI1LC0wLjc5ODc1IC0zLjIwMjUsLTEuODc3NSAtNC40NDYyNSwtMy4xNTUgbCAtOC4xOTYyNSwyLjk4MjUgYyAyLjI3LDMuMTkyNSA1LjM2NSw1Ljg2MTI1IDkuMTYzNzUsNy42MzM3NSAxMS43NDEyNSw1LjQ3Mzc1IDI1Ljc0NjI1LDAuMzc2MjUgMzEuMjIxMjUsLTExLjM2NSAxLjc3Mzc1LC0zLjc5NjI1IDIuNDI3NSwtNy44MzEyNSAyLjExNSwtMTEuNzM1IGwgLTguMTk2MjUsMi45ODI1IHoiCiAgICAgaWQ9InBhdGg0NDU3MiIKICAgICBzdHlsZT0iZmlsbDojZGIyMTJlO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSA0Ni45MzU0NSwxNC42NDExMTUgLTcuODAzNzUsMi44NCBjIDEuNDUsMi41OTc1IDIuMTM1LDUuNTg3NSAxLjkxLDguNTk1IGwgOC4xOTYyNSwtMi45ODEyNSBjIC0wLjIzNSwtMi45NDEyNSAtMS4wMTg3NSwtNS44MTI1IC0yLjMwMjUsLTguNDUzNzUgbSAtMzYuMDYyNzUsMTMuMTI0IC03LjgwMzc1LDIuODQyNSBjIDAuNzE2MjUsMi44NDUgMS45Niw1LjU0ODc1IDMuNjcsNy45NTUgbCA4LjE5NSwtMi45ODM3NSBjIC0yLjEwMzc1LC0yLjE2IC0zLjUwMjUsLTQuODkzNzUgLTQuMDYxMjUsLTcuODEzNzUiCiAgICAgaWQ9InBhdGg0NDU3NiIKICAgICBzdHlsZT0iZmlsbDojZWIyMTI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgogIDxwYXRoCiAgICAgZD0ibSA1My4wMzgzMiw5LjgyMjk5NDYgYyAtMC4yNTg3NSwtMC40MiAtMC41Mjc1LC0wLjgzMzc1IC0wLjgxMzc1LC0xLjIzNjI1IGwgLTguMjEyNSwyLjk4ODc1MDQgYyAwLjM2MTI1LDAuMzcgMC42OTM3NSwwLjc2MjUgMS4wMTEyNSwxLjE2NSBsIDguMDE1LC0yLjkxNzUwMDQgeiBNIDE3Ljg5MzU3LDIyLjcxOTM2NSBjIC0wLjAyLC0wLjU0NzUgLTAuMDExMywtMS4wOTc1IDAuMDMxMiwtMS42NDg3NSBsIC04LjIxNSwyLjk4ODc1IGMgMC4wNDI1LDAuNTI2MjUgMC4xMDg3NSwxLjA0ODc1IDAuMTg3NSwxLjU3IGwgNy45OTYyNSwtMi45MSB6IgogICAgIGlkPSJwYXRoNDQ1ODQiCiAgICAgc3R5bGU9ImZpbGw6I2FkMjEzYjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz4KICA8cGF0aAogICAgIGQ9Im0gNTMuMTExNTcsMjEuNjg1NjE1IC04LjE5NjI1LDIuOTgyNSBjIC0wLjA4NjMsMS4xOCAtMC4zMTYyNSwyLjM2MjUgLTAuNjkyNSwzLjUyNSBsIDguOTIxMjUsLTMuMjUyNSBjIDAuMDYzOCwtMS4wOSAwLjA1MzcsLTIuMTc3NSAtMC4wMzI1LC0zLjI1NSBtIC00Mi40OTg3NSwxNS40Njc1IGMgMC42MzEyNSwwLjg4ODc1IDEuMzMsMS43MzYyNSAyLjA4ODc1LDIuNTM2MjUgbCA4LjkyMjUsLTMuMjUzNzUgYyAtMS4wNDI1LC0wLjY1MjUgLTEuOTg1LC0xLjQxMzc1IC0yLjgxNjI1LC0yLjI2NjI1IGwgLTguMTk1LDIuOTgzNzUgeiIKICAgICBpZD0icGF0aDQ0NTg4IgogICAgIHN0eWxlPSJmaWxsOiNiYTIxMzM7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+CiAgPHBhdGgKICAgICBkPSJtIDUyLjY4OTMyLDU0LjUzMjExNSAwLDAuNzQgMi4xNDYyNSwwIDAsNi41NTM3NSAwLjgxMjUsMCAwLC02LjU1Mzc1IDIuMTQ3NSwwIDAsLTAuNzQgLTUuMTA2MjUsMCB6IG0gLTQuOTI4NSwwLjczOTM4IDAsMi40MTc1IDIsMCAwLDAuNzQgLTIsMCAwLDMuMzk2MjUgLTAuODEyNSwwIDAsLTcuMjkyNSA0LjI4MjUsMCAwLDAuNzM4NzUgLTMuNDcsMCB6IG0gLTMuNzE3NzUsLTAuNzM4NSAwLjgxMjUsMCAwLDcuMjkzNzUgLTAuODEyNSwwIDAsLTcuMjkzNzUgeiBtIC0yLjkwNDI1LDcuMjkyODcgMCwtMy40Mzg3NSAtMy42MjYyNSwwIDAsMy40Mzg3NSAtMC44MTI1LDAgMCwtNy4yOTM3NSAwLjgxMjUsMCAwLDMuMTE2MjUgMy42MjYyNSwwIDAsLTMuMTE2MjUgMC44MTI1LDAgMCw3LjI5Mzc1IC0wLjgxMjUsMCB6IG0gLTguNjY2NzUsMC4xMTQ2MyBjIC0wLjk5LDAgLTEuODc2MjUsLTAuNDI3NSAtMi40NDg3NSwtMS4wMSBsIDAuNTQyNSwtMC42MDUgYyAwLjU1MTI1LDAuNTMxMjUgMS4xODc1LDAuODc2MjUgMS45Mzc1LDAuODc2MjUgMC45Njg3NSwwIDEuNTczNzUsLTAuNDggMS41NzM3NSwtMS4yNTEyNSAwLC0wLjY3NzUgLTAuNDA2MjUsLTEuMDYyNSAtMS43NCwtMS41NDI1IC0xLjU3Mzc1LC0wLjU2MjUgLTIuMTA1LC0xLjA3MjUgLTIuMTA1LC0yLjEyNSAwLC0xLjE2NzUgMC45MTYyNSwtMS44NjYyNSAyLjI4MTI1LC0xLjg2NjI1IDAuOTgsMCAxLjYwNSwwLjI5MjUgMi4yMiwwLjc4MjUgbCAtMC41MjEyNSwwLjYzNSBjIC0wLjUzMTI1LC0wLjQzNzUgLTEuMDIxMjUsLTAuNjc3NSAtMS43NSwtMC42Nzc1IC0xLjAwMTI1LDAgLTEuNDE3NSwwLjUgLTEuNDE3NSwxLjA3Mzc1IDAsMC42MDUgMC4yNzEyNSwwLjk0NzUgMS43MywxLjQ3IDEuNjE1LDAuNTgyNSAyLjExNSwxLjEyNSAyLjExNSwyLjIwODc1IDAsMS4xNDYyNSAtMC44OTYyNSwyLjAzMTI1IC0yLjQxNzUsMi4wMzEyNSBtIC01Ljc0MTUsLTAuMTE0NjMgLTIuNjc3NSwtMy45OCBjIC0wLjE3NzUsLTAuMjcxMjUgLTAuNDE3NSwtMC42MzYyNSAtMC41MTEyNSwtMC44MjM3NSAwLDAuMjcxMjUgMC4wMjEyLDEuMTg3NSAwLjAyMTIsMS41OTM3NSBsIDAsMy4yMSAtMS40Mzg3NSwwIDAsLTcuMjkzNzUgMS4zOTYyNSwwIDIuNTg1LDMuODU1IGMgMC4xNzc1LDAuMjcxMjUgMC40MTYyNSwwLjYzNjI1IDAuNTEsMC44MjM3NSAwLC0wLjI3MTI1IC0wLjAyLC0xLjE4NzUgLTAuMDIsLTEuNTk1IGwgMCwtMy4wODM3NSAxLjQzNzUsMCAwLDcuMjkzNzUgLTEuMzAyNSwwIHogbSAtMTEuNTAxMTIsMCAwLC03LjI5Mzc1IDUuMDYzNzUsMCAwLDEuNDI3NSAtMy42MDUsMCAwLDEuMjYxMjUgMi4wOTUsMCAwLDEuNDE2MjUgLTIuMDk1LDAgMCwxLjc2MTI1IDMuNzYxMjUsMCAwLDEuNDI3NSAtNS4yMiwwIHogbSAtNC4xNDQ3NSwtMi41ODM2MiAtMS42MDUsMCAwLDIuNTgzNzUgLTEuNDU4NzUsMCAwLC03LjI5Mzc1IDMuMTg4NzUsMCBjIDEuMzc1LDAgMi41MTEyNSwwLjc2MTI1IDIuNTExMjUsMi4zMTI1IDAsMS42ODg3NSAtMS4xMjUsMi4zOTc1IC0yLjYzNjI1LDIuMzk3NSBtIDAuMDczOCwtMy4yOTI1IC0xLjY3ODc1LDAgMCwxLjg3NSAxLjY5ODc1LDAgYyAwLjY3NzUsMCAxLjA0MjUsLTAuMzEzNzUgMS4wNDI1LC0wLjk0ODc1IDAsLTAuNjM1IC0wLjQxNzUsLTAuOTI2MjUgLTEuMDYyNSwtMC45MjYyNSBNIDMuMjEsNjEuOTQwNDk1IGMgLTEuOTA3NSwwIC0zLjIxLC0xLjM5NjI1IC0zLjIxLC0zLjc1MTI1IDAsLTIuMzU1IDEuMzIzNzUsLTMuNzcyNSAzLjIzMTI1LC0zLjc3MjUgMS44OTYyNSwwIDMuMTk4NzUsMS4zOTc1IDMuMTk4NzUsMy43NTI1IDAsMi4zNTUgLTEuMzIzNzUsMy43NzEyNSAtMy4yMiwzLjc3MTI1IG0gLTAuMDEsLTYuMDc1IGMgLTEuMDIxMjUsMCAtMS42OTg3NSwwLjgyMzc1IC0xLjY5ODc1LDIuMzAzNzUgMCwxLjQ4IDAuNzA4NzUsMi4zMjI1IDEuNzMsMi4zMjI1IDEuMDIxMjUsMCAxLjY5NzUsLTAuODIyNSAxLjY5NzUsLTIuMzAyNSAwLC0xLjQ4IC0wLjcwNzUsLTIuMzIzNzUgLTEuNzI4NzUsLTIuMzIzNzUiCiAgICAgaWQ9InBhdGg0NDYyMiIKICAgICBzdHlsZT0iZmlsbDojMjQxZjIxO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4KPCEtLSB2ZXJzaW9uOiAyMDExMDMxMSwgb3JpZ2luYWwgc2l6ZTogNTcuNzk1NTcgNjEuOTQwNDk1LCBib3JkZXI6IDMlIC0tPgo=\"\nLABEL oc.keyword=\"openshift,oc,openshift\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"gnome-terminal-server.openshift.cli\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nENV ARGS=\"--disable-factory --class openshift.cli\"\nLABEL oc.name=\"openshift\"\nLABEL oc.displayname=\"OpenShift cli\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"openshift\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class openshift.cli\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/openshift/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/openshift/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application openshift

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/openshift.d\n
"},{"location":"applications/openshift/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f openshift.d -t openshift .\n
"},{"location":"applications/openshift/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect openshift > openshift.json\ndocker image save openshift -o openshift.tar\nctr -n k8s.io images import openshift.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @openshift.json\n\n
"},{"location":"applications/pinta/","title":"Pinta","text":""},{"location":"applications/pinta/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/pinta/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/pinta/#alpine-packages","title":"Alpine packages","text":"
pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\n
"},{"location":"applications/pinta/#displayname","title":"Displayname","text":"
Pinta (alpine)\n
"},{"location":"applications/pinta/#path","title":"Path","text":"
/usr/bin/pinta\n
"},{"location":"applications/pinta/#mimetype","title":"Mimetype","text":"
image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\n
"},{"location":"applications/pinta/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/pinta/#wm_class","title":"WM_CLASS","text":"
Pinta.Pinta\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/pinta/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/pinta.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/pinta/#json-dump","title":"JSON dump","text":"

json source file pinta.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"displayname\": \"Pinta (alpine)\",\n    \"apkpackage\": \"pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\",\n    \"icon\": \"pinta.svg\",\n    \"keyword\": \"pinta,paint\",\n    \"launch\": \"Pinta.Pinta\",\n    \"name\": \"Pinta\",\n    \"path\": \"/usr/bin/pinta\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\",\n    \"desktopfile\": \"/usr/share/applications/pinta.desktop\"\n}\n
"},{"location":"applications/pinta/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output pinta.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/pinta.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @pinta.d.3.0.json\n\n
"},{"location":"applications/pinta/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update pinta pinta-lang adwaita-icon-theme libadwaita font-noto font-xfree86-type1\nLABEL oc.icon=\"pinta.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL2lua3NjYXBlLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iOTAuMDAwMDAwIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iOTAuMDAwMDAwIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9Ii9ob21lL2FuZHJlYXMvcHJvamVrdC9iaWxkL3RhbmdvL3NjYWxhYmxlL2RyYXctcGVuY2lsMy5wbmciCiAgIHdpZHRoPSI0OHB4IgogICBoZWlnaHQ9IjQ4cHgiCiAgIGlkPSJzdmc5MTIxIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQzK2RldmVsIgogICBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS90aWdlcnQvY3ZzL2ZyZWVkZXNrdG9wLm9yZy90YW5nby1pY29uLXRoZW1lL3NjYWxhYmxlL2NhdGVnb3JpZXMiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImFwcGxpY2F0aW9ucy1ncmFwaGljcy5zdmciCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzMyI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY4MzUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY4MzciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjgzOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3NDgiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY3NTAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMyYjU1ODI7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjc1MiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3MjEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI5ZmNmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY3MjMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzYzc0YjE7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjcyNSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2NTEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjJmMmYyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY2NTMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjM2MzYzM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjY1NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY2MjkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYWVhZWFlO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY2MzEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjNGM0YzQ7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjYzMyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDI0NDYiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI0NDgiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjQ1MCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NzUiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NzciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk3OSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NjMiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNjk2OTY5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NjUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk2NyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NTEiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNmUzZDA5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDY5NTMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNjk1OSIKICAgICAgICAgb2Zmc2V0PSIwLjI0MjQyNDI1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWE4MTEzO3N0b3Atb3BhY2l0eToxOyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzVjMzMwNztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMC42MjEyMTIxMiIKICAgICAgICAgaWQ9InN0b3A2OTYxIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTA3YzEyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDY5NTUiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTM5Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2JkYmRiZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A2OTQxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDY5NDciCiAgICAgICAgIG9mZnNldD0iMC4zMzMzMzMzNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UyZTJlMjtzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhM2EzYTM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAuNjY2NjY2NjkiCiAgICAgICAgIGlkPSJzdG9wNjk0OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RkZGRkZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2OTQzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkzOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5NDUiCiAgICAgICB4MT0iMTkuMzk0NzM1IgogICAgICAgeTE9IjMwLjAwMTMzMSIKICAgICAgIHgyPSIyMy4xMDkzMzEiCiAgICAgICB5Mj0iMzMuNDM4ODMxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0zLjkwNjk1LC0xLjgwMjg1NikiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5NTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTU3IgogICAgICAgeDE9IjI4LjA1ODYzMiIKICAgICAgIHkxPSIxOC44Njc3NjciCiAgICAgICB4Mj0iMzMuNDM2OTg1IgogICAgICAgeTI9IjIzLjc0Mjc2NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMy45MDY5NSwtMS44MDI4NTYpIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTYzIgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50Njk2OSIKICAgICAgIGN4PSIxNS40MTUxMDEiCiAgICAgICBjeT0iMzUuMzU2NTA2IgogICAgICAgZng9IjE1LjQxNTEwMSIKICAgICAgIGZ5PSIzNS4zNTY1MDYiCiAgICAgICByPSI3LjU3OTE1NjEiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTk0NjU1LDMuMjYyODc2ZS0xNiw2LjU2NDU0NmUtMTMsMC45NjkzMjIsLTQuNTgzMDE3LDAuMTY1OTE5KSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTc1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50Njk4MSIKICAgICAgIGN4PSIyNi43ODE2NyIKICAgICAgIGN5PSI0Mi4zNDMxNDciCiAgICAgICBmeD0iMjYuNzgxNjciCiAgICAgICBmeT0iNDIuMzQzMTQ3IgogICAgICAgcj0iMTQuNDA3MzAxIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjI4MjIwOSwxLjY3OTIxMmUtMTUsMzAuMzkzNTUpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI0NDYiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNDUyIgogICAgICAgeDE9IjEzLjIzNjE1NSIKICAgICAgIHkxPSIzNy43NTIyNDciCiAgICAgICB4Mj0iNy43NTIxMDkxIgogICAgICAgeTI9IjQyLjI4MjE0NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjg1MjI5OCwwLDAsMC44NTIyOTgsLTEuNjc1MTA3LDMuNzUzOTc3KSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njk3NSIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDY5MDMiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC4yODIyMDksMi45MzYxMjhlLTE1LDMwLjM5MzU1KSIKICAgICAgIGN4PSIyNi43ODE2NyIKICAgICAgIGN5PSI0Mi4zNDMxNDciCiAgICAgICBmeD0iMjYuNzgxNjciCiAgICAgICBmeT0iNDIuMzQzMTQ3IgogICAgICAgcj0iMTQuNDA3MzAxIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2ODM1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAwNSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjQ4LjI1IgogICAgICAgeTE9IjU0Ljc1IgogICAgICAgeDI9IjQ4LjI1IgogICAgICAgeTI9IjcxLjI1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjcxODkxNCwwLDAsMC43MTg5MTQsLTEuODk3MTAzLC0yMC42ODYwNikiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY2NTEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDEwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNzM3MzA3LDAsMCwwLjc3MDg1NCwtOC41MzIwMjMsNy4xMjE2MzYpIgogICAgICAgeDE9IjYwLjE2ODc2NiIKICAgICAgIHkxPSI0MC4xMTk3OTciCiAgICAgICB4Mj0iNjAuNDQwOTk0IgogICAgICAgeTI9IjQzLjg2OTc5NyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njc0OCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMTQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC43MTg5MTQsMCwwLDAuNzE4OTE0LC0xLjg5NzEwMywtMjIuNDI0ODEpIgogICAgICAgeDE9IjQ5Ljg1MzAzNyIKICAgICAgIHkxPSI2NC4yNTk2MjMiCiAgICAgICB4Mj0iNjIuNzY4MjIxIgogICAgICAgeTI9IjY0LjI1OTYyMyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjYyOSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMTciCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44ODg2MTksMCwwLDAuNzE4OTE0LC0xOC4yOTc2OCw5LjQ3MTcyOCkiCiAgICAgICB4MT0iNjEuODcxODQ1IgogICAgICAgeTE9IjI5LjYxNTIyMyIKICAgICAgIHgyPSI2MS44NzE4NDUiCiAgICAgICB5Mj0iNDEuNDU5MjYzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NjUxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAyMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjcxOTQ0LDAsMCwwLjcxODkxNCwtNy42OTYyNTIsOS40NzE3MjgpIgogICAgICAgeDE9IjUzLjE2ODc2NiIKICAgICAgIHkxPSIyNC4yNDQ3OTciCiAgICAgICB4Mj0iNjkuNjkwOTk0IgogICAgICAgeTI9IjI0LjI0NDc5NyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjcyMSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMjUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44NjI0ODIsMCwwLDAuNTgwNzE4LC0xNi4yNTY5NywxMS4wMTM0OCkiCiAgICAgICB4MT0iNTIuNzE3OTM2IgogICAgICAgeTE9IjIuMzE2MTYzOCIKICAgICAgIHgyPSI2Ny40NjU5ODgiCiAgICAgICB5Mj0iMi4zMTYxNjM4IiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjAuMTcyNTQ5MDIiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjQiCiAgICAgaW5rc2NhcGU6Y3g9IjYxLjAzNjM2MyIKICAgICBpbmtzY2FwZTpjeT0iMjUuODYzOTA2IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBzaG93Z3VpZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMjk1IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjExNTEiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjQ3MiIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iZmFsc2UiCiAgICAgc3Ryb2tlPSIjMjA0YTg3IgogICAgIGZpbGw9IiMzNDY1YTQiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+R3JhcGhpY3MgQ2F0ZWdvcnk8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlIC8+CiAgICAgICAgPGRjOmNyZWF0b3I+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZT5KYWt1YiBTdGVpbmVyPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxjYzpsaWNlbnNlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjAvIiAvPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+Z3JhcGhpY3M8L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5jYXRlZ29yeTwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnBpeGVsPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+dmVjdG9yPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+ZWRpdG9yPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+ZHJhdzwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPnBhaW50PC9yZGY6bGk+CiAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgIDxkYzpzb3VyY2U+aHR0cDovL3RhbmdvLXByb2plY3Qub3JnPC9kYzpzb3VyY2U+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjAvIj4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvUmVwcm9kdWN0aW9uIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EaXN0cmlidXRpb24iIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9Ob3RpY2UiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9BdHRyaWJ1dGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGVyaXZhdGl2ZVdvcmtzIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvU2hhcmVBbGlrZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPHBhdGgKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDY5MjI0LDAsMCwxLjEyMjk3NSw1Ljc2OTAyOCwtNy4xMTYxNikiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGQ9Ik0gNDEuMTg4OTcxIDQyLjM0MzE0NyBBIDE0LjQwNzMwMSA0LjA2NTg2NDEgMCAxIDEgIDEyLjM3NDM2OSw0Mi4zNDMxNDcgQSAxNC40MDczMDEgNC4wNjU4NjQxIDAgMSAxICA0MS4xODg5NzEgNDIuMzQzMTQ3IHoiCiAgICAgICBzb2RpcG9kaTpyeT0iNC4wNjU4NjQxIgogICAgICAgc29kaXBvZGk6cng9IjE0LjQwNzMwMSIKICAgICAgIHNvZGlwb2RpOmN5PSI0Mi4zNDMxNDciCiAgICAgICBzb2RpcG9kaTpjeD0iMjYuNzgxNjciCiAgICAgICBpZD0icGF0aDY5MDEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjM7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ2OTAzKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDY5NTcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNjczOTA3O3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGQ9Ik0gMTkuNjUxNjgyLDIyLjU4NjczNSBMIDIzLjcxNzU0NiwyNi4zODc0MzMgQyAzMC45MDUwNDUsMTkuMzI0OTM0IDQxLjUwMDYwNiwyLjQxMDE0NTUgNDEuNTAwNjA2LDIuNDEwMTQ1NSBDIDQxLjkzMDA5NiwxLjE4NTY5OTMgNDAuNDEzMzYxLDAuNDE0MjUyNjQgMzkuNjU0MjU0LDEuMjM5NjUwNSBDIDM5LjY1NDI1NCwxLjIzOTY1MDUgMjUuOTY0MTgxLDE1LjMzNjczNiAxOS42NTE2ODIsMjIuNTg2NzM1IHogIgogICAgICAgaWQ9InBhdGg2OTM3IgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ2OTQ1KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6Izg4OGE4NTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDEyLjA1MDI4NSwzMi44MTM4OTQgTCAxNC4yOTY2MDUsMzQuNzQ3NzE0IEwgMjIuNzg5MzcxLDI3LjM4MDY4MyBMIDIzLjA2NDQzMiwyNi42NzQ4NTUgTCAyNC4xNTg4MzcsMjYuNjU3MDQgQyAyMy43MjEzMzcsMjUuMDk0NTQgMjEuMjE3MzIzLDIyLjI3MzU4NSAxOS4zNDIzMjMsMjIuMjczNTg1IEwgMTkuNDI0MzQyLDIzLjM2MzY2IEwgMTguNzU0MzUxLDIzLjc0MzY4NyBMIDEyLjA1MDI4NSwzMi44MTM4OTQgeiAiCiAgICAgICBpZD0icGF0aDY5MzUiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDY5ODEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGlkPSJwYXRoNjk3MyIKICAgICAgIHNvZGlwb2RpOmN4PSIyNi43ODE2NyIKICAgICAgIHNvZGlwb2RpOmN5PSI0Mi4zNDMxNDciCiAgICAgICBzb2RpcG9kaTpyeD0iMTQuNDA3MzAxIgogICAgICAgc29kaXBvZGk6cnk9IjQuMDY1ODY0MSIKICAgICAgIGQ9Ik0gNDEuMTg4OTcxIDQyLjM0MzE0NyBBIDE0LjQwNzMwMSA0LjA2NTg2NDEgMCAxIDEgIDEyLjM3NDM2OSw0Mi4zNDMxNDcgQSAxNC40MDczMDEgNC4wNjU4NjQxIDAgMSAxICA0MS4xODg5NzEgNDIuMzQzMTQ3IHoiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzM4MzcsMCwwLDEsLTIwLjkyNjQsLTMuNDA5MDExKSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50Njk2OSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuMjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDEuNzU3NzA5LDQwLjcyMzkxNSBDIDguMzYzMDIxNiw0MC43MjM5MTUgMTMuMzc1ODk2LDQxLjUxMDUxNiAxNC4zMjQ5MzQsMzYuNzA0ODQyIEMgMTUuMDg5NzI3LDMyLjgzMjEzMyA5Ljc2NDYwOTYsMzAuOTc2NDgyIDcuMTI1ODAyNiwzNC40MzM3OTEgQyA0LjU4Mzc5OSwzNy43NjQyNyAxLjc1NzcwOSw0MC43MjM5MTUgMS43NTc3MDksNDAuNzIzOTE1IHogIgogICAgICAgaWQ9InBhdGg2OTMzIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc2MiIC8+CiAgICA8cGF0aAogICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC41Mjc3Nzc4Mjtjb2xvcjojMDAwMDAwO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBpZD0icGF0aDY5NzEiCiAgICAgICBzb2RpcG9kaTpjeD0iNy42MjQ5OTkiCiAgICAgICBzb2RpcG9kaTpjeT0iMzcuNzUiCiAgICAgICBzb2RpcG9kaTpyeD0iMS4yNDk5OTk5IgogICAgICAgc29kaXBvZGk6cnk9IjEuMjQ5OTk5OSIKICAgICAgIGQ9Ik0gOC44NzQ5OTg5IDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgNi4zNzQ5OTkyLDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgOC44NzQ5OTg5IDM3Ljc1IHoiCiAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODUyMjk4LDAsMCwwLjg1MjI5OCwzLjczMzU1NCwyLjU3NTYwNCkiIC8+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC43ODc4NjcsMCwwLDAuNzg3ODY3LDE0LjI2NTM4LC00LjcyMzM2NikiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGQ9Ik0gOC44NzQ5OTg5IDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgNi4zNzQ5OTkyLDM3Ljc1IEEgMS4yNDk5OTk5IDEuMjQ5OTk5OSAwIDEgMSAgOC44NzQ5OTg5IDM3Ljc1IHoiCiAgICAgICBzb2RpcG9kaTpyeT0iMS4yNDk5OTk5IgogICAgICAgc29kaXBvZGk6cng9IjEuMjQ5OTk5OSIKICAgICAgIHNvZGlwb2RpOmN5PSIzNy43NSIKICAgICAgIHNvZGlwb2RpOmN4PSI3LjYyNDk5OSIKICAgICAgIGlkPSJwYXRoNjk4MyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgZD0iTSAxOC45NDE0MzgsMjYuMzk4MTU0IEwgMTMuNjM4MTM3LDMyLjU0MTE0NCIKICAgICAgIGlkPSJwYXRoNjk4NSIKICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNDI3Nzc3NzY7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyNDUyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICBkPSJNIDMuMDcwODg3Miw0MC4wNjg5NzYgQyAzLjA3MDg4NzIsNDAuMDY4OTc2IDYuNDExOTk4NiwzOC40MjcxNTUgNy44MzU3MTU2LDM1Ljk4MjE0NyBDIDguMzM5NDIyNiwzNS4xMTcxMSA5LjQ4MDA4ODYsMzUuODU1MzExIDguNzc3MzgxNiwzNi43MTY2NDYgQyA3LjI1OTU1MzYsMzguNTc3MTA0IDMuMDcwODg3Miw0MC4wNjg5NzYgMy4wNzA4ODcyLDQwLjA2ODk3NiB6ICIKICAgICAgIGlkPSJwYXRoMTU3MSIKICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjc3NjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNTMzMzMzMjc7Y29sb3I6IzAwMDAwMDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgaWQ9InBhdGgyNDU0IgogICAgICAgc29kaXBvZGk6Y3g9IjcuNjI0OTk5IgogICAgICAgc29kaXBvZGk6Y3k9IjM3Ljc1IgogICAgICAgc29kaXBvZGk6cng9IjEuMjQ5OTk5OSIKICAgICAgIHNvZGlwb2RpOnJ5PSIxLjI0OTk5OTkiCiAgICAgICBkPSJNIDguODc0OTk4OSAzNy43NSBBIDEuMjQ5OTk5OSAxLjI0OTk5OTkgMCAxIDEgIDYuMzc0OTk5MiwzNy43NSBBIDEuMjQ5OTk5OSAxLjI0OTk5OTkgMCAxIDEgIDguODc0OTk4OSAzNy43NSB6IgogICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjIzNzg2NywwLDAsMC4yMzc4NjcsMzguNDMzODksLTcuMTAxMDI4KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzcwMzgiPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3NjIgogICAgICAgICBpZD0icGF0aDY2NTkiCiAgICAgICAgIGQ9Ik0gMzUuMTI2OTQsNy4zNTAwNzU5IEMgMzIuMDY5MDg0LDcuNDM3MzY0OCAyOS42NDI1NTEsOC40MDYxNTg0IDI5LjY0MjU1MSw5LjU3NDQwOTUgQyAyOS42NDI1NTEsOS44NTIxMDg1IDI5LjY0MjU1MSwxMi44NjY4MjkgMjkuNjQyNTUxLDEzLjE0NDUyOCBDIDI5LjY0MjU1MSwxNC4zNzAyMzQgMzIuMzEzNDgzLDE1LjM2ODg2MSAzNS41ODM5NzEsMTUuMzY4ODYxIEMgMzguODU0NDU3LDE1LjM2ODg2MSA0MS41LDE0LjM3MDIzNCA0MS41LDEzLjE0NDUyOCBDIDQxLjUsMTIuODY2ODI5IDQxLjUsOS44NTIxMDg1IDQxLjUsOS41NzQ0MDk1IEMgNDEuNSw4LjM0ODcwMzMgMzguODU0NDU3LDcuMzUwMDc1OSAzNS41ODM5NzEsNy4zNTAwNzU5IEMgMzUuNDMwNjY2LDcuMzUwMDc1OSAzNS4yNzczMjUsNy4zNDU3ODI2IDM1LjEyNjk0LDcuMzUwMDc1OSB6ICIKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzAyNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMyMDRhODc7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8cGF0aAogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjg4NjI3OCwwLDAsMC40Njg5MTQsLTEwLjQ0MzkyLC05LjcxODg1OSkiCiAgICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICAgIGlua3NjYXBlOnJfY3g9InRydWUiCiAgICAgICAgIGQ9Ik0gNTcuMzc1IDQ5Ljc1IEEgNS4zNzUgMS41IDAgMSAxICA0Ni42MjUsNDkuNzUgQSA1LjM3NSAxLjUgMCAxIDEgIDU3LjM3NSA0OS43NSB6IgogICAgICAgICBzb2RpcG9kaTpyeT0iMS41IgogICAgICAgICBzb2RpcG9kaTpyeD0iNS4zNzUiCiAgICAgICAgIHNvZGlwb2RpOmN5PSI0OS43NSIKICAgICAgICAgc29kaXBvZGk6Y3g9IjUyIgogICAgICAgICBpZD0icGF0aDY3MjkiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6IzM0NjVhNDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC45OTk5OTk4MjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpZD0icGF0aDY2MTciCiAgICAgICAgIGQ9Ik0gMjcuOTI2NDQ3LDM5LjE1NTQ2NyBMIDI4Ljk3MzQ1NiwxNy44MDYwMzIgTCAzMS40NjAxMDIsMTQuMTQyNTIgQyAzMy40MzEzOTQsMTMuNTA3MDgzIDM4LjE4NjUyOSwxMy41MDcwODMgMzkuOTY3MDUsMTQuMTQyNTIgTCA0Mi40NTM2OTcsMTcuMTc0MzkzIEwgNDUuMDcxMjIsMzkuNjYwNzggTCAyNy45MjY0NDcsMzkuMTU1NDY3IHogIgogICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ3MDIwKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzVhNWE1YTtzdHJva2Utd2lkdGg6MS4wMDAwMDAzNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3pjYyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2NjE5IgogICAgICAgICBkPSJNIDI4LjgyODQ5NSwzOC44OTYxMDggQyAyOC44Mjg0OTUsMzguODk2MTA4IDMxLjQxOTE2OCwyOS4zNjQ1NjUgMzYuMzY4NjgzLDI5LjM2NDU2NSBDIDQxLjQ3NTI4NCwyOS4zNjQ1NjUgNDQuNTM3MjE4LDM5LjI3NzM3IDQ0LjUzNzIxOCwzOS4yNzczNyBMIDI4LjgyODQ5NSwzOC44OTYxMDggeiAiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTcpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2NjQxIgogICAgICAgICBkPSJNIDI5LjE4MDEzOCwyMC40OTg3MDggTCAyOC44ODQyMjUsMjYuOTczNDUgQyAzMC41NDY3MTQsMjUuODk1MDc5IDQwLjg3NjczNiwyNS43MDg5NjQgNDMuMjI3ODUsMjcuMzYxMDk4IEwgNDIuNTI2MzAyLDIwLjc2Mzc4NSBDIDQxLjEyODM0MiwxOS44MTA2MzEgMzEuOTQzNDY0LDE5LjI4NTU0IDI5LjE4MDEzOCwyMC40OTg3MDggeiAiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC41OTQ0NDQzO2NvbG9yOiMwMDAwMDA7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojZmZmZmZmO3N0cm9rZS13aWR0aDoxLjAwMDAwMDEyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgZD0iTSAyOS4wNDg3NjIsMzguMjIyMDk2IEwgMjkuOTI2MjU5LDE4LjAyNzc4NCBMIDMxLjc2NjIyNiwxNC45OTQ5NDkgQyAzMy41ODQ3ODIsMTQuNDAyNzc0IDM3Ljk3MTQ4NCwxNC40MDI3NzQgMzkuNjE0MDQ5LDE0Ljk5NDk0OSBMIDQxLjU3NDUzLDE3LjUyNzUzNSBMIDQ0LjAyNjc1NCwzOC43NzU5IEwgMjkuMDQ4NzYyLDM4LjIyMjA5NiB6ICIKICAgICAgICAgaWQ9InBhdGg2NjcwIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHJ5PSIwLjg4Mzg4MzY2IgogICAgICAgICByeD0iMC44ODM4ODQxMyIKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgeT0iMzcuNTM2MTMzIgogICAgICAgICB4PSIyNi41MTI3ODkiCiAgICAgICAgIGhlaWdodD0iMy45Mjc3NTI1IgogICAgICAgICB3aWR0aD0iMTkuOTc0NDEzIgogICAgICAgICBpZD0icmVjdDU3NDIiCiAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDcwMTApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNWE1YTVhO3N0cm9rZS13aWR0aDoxLjAwMDAwMDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8cGF0aAogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICBpbmtzY2FwZTpyX2N4PSJ0cnVlIgogICAgICAgICBpZD0icGF0aDY2NjgiCiAgICAgICAgIGQ9Ik0gMjkuMzk1MjE5LDE3Ljk5NjQ1MSBDIDMxLjI2OTc1NiwxNi42MzAyNjMgMzguNDkzMTUzLDE2LjM0MTI3NyA0Mi4xMTUxMzksMTcuMzg5NzQ3IEwgMzkuNzc3NzMzLDE0LjUwNDEyNCBDIDM3LjI5OTUzMiwxMy44MzY5MTYgMzMuODUzMzg2LDE0LjEyODM1OCAzMS41MDIyNzIsMTQuNTczMTY0IEwgMjkuMzk1MjE5LDE3Ljk5NjQ1MSB6ICIKICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIgLz4KICAgICAgPHBhdGgKICAgICAgICAgaW5rc2NhcGU6cl9jeT0idHJ1ZSIKICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgaWQ9InBhdGg2ODMzIgogICAgICAgICBkPSJNIDMxLjE3Mjk0MSwxNy40MTYzODIgTCAzMS4xNzI5NDEsMzIuODczMDMzIEwgMzQuNDA4MDU0LDI5LjI3ODQ2MyBMIDM0LjA0ODU5NywxNi42OTc0NjggTCAzMS4xNzI5NDEsMTcuNDE2MzgyIHogIgogICAgICAgICBzdHlsZT0ib3BhY2l0eTowLjg2MTExMTA5O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NzAwNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICA8ZwogICAgICAgICBzdHlsZT0ib3BhY2l0eTowLjU3Nzc3Nzc4IgogICAgICAgICBpZD0iZzcwMzMiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZTZlN2U2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtvcGFjaXR5OjAuNDExMTExMTEiCiAgICAgICAgICAgZD0iTSAzMS4wMDkzOTEsOS4zODA5NzM4IEwgMzEuMDA5MzkxLDEyLjYyMTAwOSBDIDMxLjAwOTM5MSwxMi42MjEwMDkgMzEuNjIwNTgsMTIuMjczMzIzIDMyLDEyLjI1OTY4OCBMIDMyLDkgQyAzMS41MTg0MjgsOS4wNjk0NjI2IDMxLjAwOTM5MSw5LjM4MDk3MzggMzEuMDA5MzkxLDkuMzgwOTczOCB6ICIKICAgICAgICAgICBpZD0icGF0aDY2NjYiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgICAgIGlua3NjYXBlOnJfY3k9InRydWUiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpZD0icGF0aDcwMjkiCiAgICAgICAgICAgZD0iTSAzMy4wMDkzOTEsOC43NTk5NjQ4IEwgMzMuMDA5MzkxLDEyIEMgMzMuMDA5MzkxLDEyIDMzLjYyMDU4LDExLjkxNzQ3OSAzNCwxMS45MDM4NDQgTCAzNCw4LjU4ODkxMzMgQyAzMy40ODgzOTksOC42MTQ3MTc5IDMzLjAwOTM5MSw4Ljc1OTk2NDggMzMuMDA5MzkxLDguNzU5OTY0OCB6ICIKICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNlNmU3ZTY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlIiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojZTZlN2U2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtvcGFjaXR5OjAuNDQ0NDQ0NDQiCiAgICAgICAgICAgZD0iTSAzNS4wMDkzOTEsOC41NjEwOTEgTCAzNS4wMDkzOTEsMTEuODU2MzY5IEMgMzUuMDA5MzkxLDExLjg1NjM2OSAzNS41NjUzMzcsMTEuODUxMTg3IDM2LDExLjg3MDY5OCBMIDM2LDguNTMzNjcwNiBDIDM1LjQ5OTQ0OCw4LjQ4MjEzNTQgMzUuMDA5MzkxLDguNTYxMDkxIDM1LjAwOTM5MSw4LjU2MTA5MSB6ICIKICAgICAgICAgICBpZD0icGF0aDcwMzEiCiAgICAgICAgICAgaW5rc2NhcGU6cl9jeD0idHJ1ZSIKICAgICAgICAgICBpbmtzY2FwZTpyX2N5PSJ0cnVlIgogICAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"pinta,pinta,paint\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"pinta.desktop\"\nLABEL oc.launch=\"Pinta.Pinta\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Pinta\"\nLABEL oc.displayname=\"Pinta (alpine)\"\nLABEL oc.path=\"/usr/bin/pinta\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/svg+xml;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/x-targa;image/x-tga;image/openraster;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Pinta\"\nENV APPBIN \"/usr/bin/pinta\"\nENV APP \"/usr/bin/pinta\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/pinta/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/pinta/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Pinta

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Pinta.d\n
"},{"location":"applications/pinta/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Pinta.d -t Pinta .\n
"},{"location":"applications/pinta/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Pinta > Pinta.json\ndocker image save Pinta -o Pinta.tar\nctr -n k8s.io images import Pinta.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Pinta.json\n\n
"},{"location":"applications/planner/","title":"Planner","text":""},{"location":"applications/planner/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/planner/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/planner/#ubuntu-packages","title":"Ubuntu packages","text":"
planner\n
"},{"location":"applications/planner/#path","title":"Path","text":"
/usr/bin/planner\n
"},{"location":"applications/planner/#mimetype","title":"Mimetype","text":"
application/x-planner;\n
"},{"location":"applications/planner/#file-extensions","title":"File extensions","text":"

\"mpp;mpx\"

"},{"location":"applications/planner/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"mpp;mpx\"

"},{"location":"applications/planner/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/planner/#wm_class","title":"WM_CLASS","text":"
planner.Planner\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/planner/#json-dump","title":"JSON dump","text":"

json source file planner.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"planner\",\n    \"icon\": \"planner.svg\",\n    \"launch\": \"planner.Planner\",\n    \"name\": \"Planner\",\n    \"path\": \"/usr/bin/planner\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"application/x-planner;\",\n    \"fileextensions\": \"mpp;mpx\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"legacyfileextensions\": \"mpp;mpx\"\n}\n
"},{"location":"applications/planner/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output planner.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/planner.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @planner.d.3.0.json\n\n
"},{"location":"applications/planner/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends planner && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"planner.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDQ5MCA0OTAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ5MCA0OTA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxnPg0KCQk8ZyBpZD0iWE1MSURfODFfIj4NCgkJCTxnPg0KCQkJCTxwb2x5Z29uIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiBwb2ludHM9IjQ4MCwyOTcuNSA0MTUsMzYyLjUgNDE1LDI5Ny41IAkJCQkiLz4NCgkJCQk8cG9seWdvbiBzdHlsZT0iZmlsbDojRkZGRkZGOyIgcG9pbnRzPSI0ODAsNTIuNSA0ODAsMjk3LjUgNDE1LDI5Ny41IDQxNSwzNjIuNSAxMCwzNjIuNSAxMCw1Mi41IAkJCQkiLz4NCgkJCTwvZz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiBkPSJNNDkwLDUyLjVjMC01LjUyMi00LjQ3Ny0xMC0xMC0xMEgxMGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMHYzMTBjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGg0MDVsMCwwDQoJCQkJYzIuNjAyLTAuMDAxLDUuMTU5LTEuMDE2LDcuMDcxLTIuOTI5bDY1LTY1YzEuOTEyLTEuOTEzLDIuOTA0LTQuNDcsMi45MDUtNy4wNzFINDkwVjUyLjV6IE00MTUsMjg3LjVjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTANCgkJCQl2NTVIMjB2LTI5MGg0NTB2MjI1SDQxNXogTTQyNSwzMzguMzU3VjMwNy41aDMwLjg1OEw0MjUsMzM4LjM1N3oiLz4NCgkJPC9nPg0KCTwvZz4NCgk8Zz4NCgkJPGcgaWQ9IlhNTElEXzgyXyI+DQoJCQk8Zz4NCgkJCQk8cmVjdCB4PSI2MCIgeT0iOTcuNSIgc3R5bGU9ImZpbGw6I0FGQjZCQjsiIHdpZHRoPSIxMjAiIGhlaWdodD0iNjAiLz4NCgkJCQk8cmVjdCB4PSIyNTAiIHk9IjEwMi41IiBzdHlsZT0iZmlsbDojQUZCNkJCOyIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI1MCIvPg0KCQkJCTxyZWN0IHg9IjI1MCIgeT0iMTgyLjUiIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjUwIi8+DQoJCQkJPHJlY3QgeD0iMjUwIiB5PSIyNjIuNSIgc3R5bGU9ImZpbGw6I0FGQjZCQjsiIHdpZHRoPSIxMDAiIGhlaWdodD0iNTAiLz4NCgkJCTwvZz4NCgkJCTxwYXRoIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiBkPSJNMjUwLDE2Mi41aDEwMGM1LjUyMywwLDEwLTQuNDc4LDEwLTEwdi01MGMwLTUuNTIyLTQuNDc3LTEwLTEwLTEwSDI1MGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMA0KCQkJCXYxNWgtMjVjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTB2NzVoLTgwdi0zNWg1NWM1LjUyMywwLDEwLTQuNDc4LDEwLTEwdi02MGMwLTUuNTIyLTQuNDc3LTEwLTEwLTEwSDYwYy01LjUyMywwLTEwLDQuNDc4LTEwLDEwDQoJCQkJdjYwYzAsNS41MjIsNC40NzcsMTAsMTAsMTBoNDV2NDVjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGg5MHY3MGMwLDUuNTIyLDQuNDc3LDEwLDEwLDEwaDI1djEwYzAsNS41MjIsNC40NzcsMTAsMTAsMTBoMTAwDQoJCQkJYzUuNTIzLDAsMTAtNC40NzgsMTAtMTB2LTUwYzAtNS41MjItNC40NzctMTAtMTAtMTBIMjUwYy01LjUyMywwLTEwLDQuNDc4LTEwLDEwdjIwaC0xNXYtNjBoMTV2MTBjMCw1LjUyMiw0LjQ3NywxMCwxMCwxMGgxMDANCgkJCQljNS41MjMsMCwxMC00LjQ3OCwxMC0xMHYtNTBjMC01LjUyMi00LjQ3Ny0xMC0xMC0xMEgyNTBjLTUuNTIzLDAtMTAsNC40NzgtMTAsMTB2MjBoLTE1di02NWgxNXYxNQ0KCQkJCUMyNDAsMTU4LjAyMiwyNDQuNDc3LDE2Mi41LDI1MCwxNjIuNXogTTI2MCwxMTIuNWg4MHYzMGgtODBWMTEyLjV6IE03MCwxMDcuNWgxMDB2NDBINzBWMTA3LjV6IE0yNjAsMjcyLjVoODB2MzBoLTgwVjI3Mi41eg0KCQkJCSBNMjYwLDE5Mi41aDgwdjMwaC04MFYxOTIuNXoiLz4NCgkJPC9nPg0KCTwvZz4NCgk8Zz4NCgkJPHJlY3QgeD0iNTAiIHk9IjI0Ny41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9Ijc1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI1MCIgeT0iMjc3LjUiIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiB3aWR0aD0iNzUiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjUwIiB5PSIzMDcuNSIgc3R5bGU9ImZpbGw6IzIzMUYyMDsiIHdpZHRoPSIxMzAiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjEzNSIgeT0iMjQ3LjUiIHN0eWxlPSJmaWxsOiMyMzFGMjA7IiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiLz4NCgk8L2c+DQoJPGc+DQoJCTxyZWN0IHg9IjM4MCIgeT0iOTIuNSIgc3R5bGU9ImZpbGw6IzIzMUYyMDsiIHdpZHRoPSIyNSIgaGVpZ2h0PSIyMCIvPg0KCTwvZz4NCgk8Zz4NCgkJPHJlY3QgeD0iNDIwIiB5PSI5Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjEyMi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjEyMi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjE1Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjE1Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSIzODAiIHk9IjE4Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8cmVjdCB4PSI0MjAiIHk9IjE4Mi41IiBzdHlsZT0iZmlsbDojMjMxRjIwOyIgd2lkdGg9IjI1IiBoZWlnaHQ9IjIwIi8+DQoJPC9nPg0KCTxnPg0KCQk8ZyBpZD0iWE1MSURfODNfIj4NCgkJCTxnPg0KCQkJCTxwb2x5Z29uIHN0eWxlPSJmaWxsOiNFN0VDRUQ7IiBwb2ludHM9IjQ4MCw0MTcuNSA0MjAsNDM3LjUgNDIwLDM5Ny41IAkJCQkiLz4NCgkJCQk8cmVjdCB4PSIxMCIgeT0iMzk3LjUiIHN0eWxlPSJmaWxsOiNBRkI2QkI7IiB3aWR0aD0iNjAiIGhlaWdodD0iNDAiLz4NCgkJCQk8cmVjdCB4PSI3MCIgeT0iMzk3LjUiIHN0eWxlPSJmaWxsOiNGRkQyNDg7IiB3aWR0aD0iMzUwIiBoZWlnaHQ9IjQwIi8+DQoJCQk8L2c+DQoJCQk8cGF0aCBzdHlsZT0iZmlsbDojMjMxRjIwOyIgZD0iTTQ4My4xNjIsNDA4LjAxM2wtNjAtMjBjLTEuMDMzLTAuMzQ0LTIuMS0wLjQ5OC0zLjE2Mi0wLjQ5OFYzODcuNUgxMGMtNS41MjMsMC0xMCw0LjQ3OC0xMCwxMHY0MA0KCQkJCWMwLDUuNTIyLDQuNDc3LDEwLDEwLDEwaDQxMGwwLDBoMC4wMDFjMS4wNjEsMCwyLjEyOS0wLjE2OSwzLjE2MS0wLjUxM2w2MC0yMGM0LjA4My0xLjM2MSw2LjgzOC01LjE4Myw2LjgzOC05LjQ4Nw0KCQkJCUM0OTAsNDEzLjE5Niw0ODcuMjQ2LDQwOS4zNzQsNDgzLjE2Miw0MDguMDEzeiBNNjAsNDI3LjVIMjB2LTIwaDQwVjQyNy41eiBNNDEwLDQwNy41djIwSDgwdi0yMEg0MTB6IE00MzAsNDIzLjYyNnYtMTIuMjUyDQoJCQkJbDE4LjM3Nyw2LjEyNkw0MzAsNDIzLjYyNnoiLz4NCgkJPC9nPg0KCTwvZz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K\"\nLABEL oc.keyword=\"planner\"\nLABEL oc.cat=\"office\"\nLABEL oc.launch=\"planner.Planner\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Planner\"\nLABEL oc.displayname=\"Planner\"\nLABEL oc.path=\"/usr/bin/planner\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-planner;\"\nLABEL oc.fileextensions=\"mpp;mpx\"\nLABEL oc.legacyfileextensions=\"mpp;mpx\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Planner\"\nENV APPBIN \"/usr/bin/planner\"\nENV APP \"/usr/bin/planner\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/planner/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/planner/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Planner

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Planner.d\n
"},{"location":"applications/planner/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Planner.d -t Planner .\n
"},{"location":"applications/planner/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Planner > Planner.json\ndocker image save Planner -o Planner.tar\nctr -n k8s.io images import Planner.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Planner.json\n\n
"},{"location":"applications/postman/","title":"postman","text":""},{"location":"applications/postman/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/postman/#displayname","title":"Displayname","text":"
Postman\n
"},{"location":"applications/postman/#path","title":"Path","text":"
/usr/local/bin/Postman/app/Postman\n
"},{"location":"applications/postman/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/postman/#wm_class","title":"WM_CLASS","text":"
postman.Postman\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/postman/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin  libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\n
"},{"location":"applications/postman/#json-dump","title":"JSON dump","text":"

json source file postman.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin  libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\",\n        \"RUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\"\n    ],\n    \"cat\": \"development\",\n    \"debpackage\": \"\",\n    \"installrecommends\": false,\n    \"icon\": \"circle_postman.svg\",\n    \"keyword\": \"http,post,json\",\n    \"launch\": \"postman.Postman\",\n    \"displayname\": \"Postman\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"postman\",\n    \"path\": \"/usr/local/bin/Postman/app/Postman\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\"\n}\n
"},{"location":"applications/postman/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output postman.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/postman.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @postman.d.3.0.json\n\n
"},{"location":"applications/postman/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes libgtk-3-0 libatk-bridge2.0-0 libx11-6 libxi6 libxxf86vm1 libxfixes3 libxrender1 libgl1 libnss3 qt5dxcb-plugin  libxss1 libasound2 libx11-xcb1 libxcb-dri3-0 libdrm2  libdrm-common libgbm1 libasound2-plugins libgail-common libgtk2.0-bin && apt-get clean\nRUN curl -Ls -o /tmp/postman.tar.gz https://dl.pstmn.io/download/latest/linux64 && gunzip -d /tmp/postman.tar.gz && cd /usr/local/bin && tar -xvf /tmp/postman.tar && rm -rf /tmp/blender.tar\nLABEL oc.icon=\"circle_postman.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0ic3ZnMzciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzMjEiPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijk5LjAzNiIgeDI9Ijk5LjAzNiIgeTE9Ii0uNTA0NzIiIHkyPSIxOTkuODQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjMgMCAwIC4zIDIgMi4wMDE1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBpZD0ic3RvcDIiIHN0b3AtY29sb3I9IiNmZjUxMjIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDQiIHN0b3AtY29sb3I9IiNmZmFmMjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI3IiBzdGREZXZpYXRpb249IjE0LjA1OTg2MyIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4NzAiIHgxPSI1MS41NzkiIHgyPSI1My4yNzEiIHkxPSItMzYuOTUxIiB5Mj0iNzcuNjQ3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wODY0IiBzdG9wLWNvbG9yPSIjZmVlMGQ1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A4NjYiIHN0b3AtY29sb3I9IiNmYmZhYmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZmlsdGVyODg4IiB4PSItLjA0OCIgeT0iLS4wNDgiIHdpZHRoPSIxLjA5NiIgaGVpZ2h0PSIxLjA5NiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjg5MCIgc3RkRGV2aWF0aW9uPSIyLjU0OTkxNjMiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgaWQ9ImNpcmNsZTIzIiB0cmFuc2Zvcm09Im1hdHJpeCguMDY0MDEyIDAgMCAuMDY0MDEyIC0uNzQyMjYgLTIuNjIpIiBjeD0iNTExLjUiIGN5PSI1NDAuODYiIHI9IjQ2OC42NiIgY29sb3I9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjYyMiIvPgogPGNpcmNsZSBpZD0iY2lyY2xlMjUiIGN4PSIzMiIgY3k9IjMyLjAwMiIgcj0iMzAiIGNvbG9yPSIjMDAwMDAwIiBmaWxsPSJ1cmwoI2EpIi8+CiA8ZyBpZD0iZzg3NCIgdHJhbnNmb3JtPSJtYXRyaXgoLjM3NjQ5IDAgMCAuMzc2NDkgMTEuNzgzIDIzLjg2KSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjg4OCkiIG9wYWNpdHk9Ii4xNSI+CiAgPHBhdGggaWQ9InBhdGg4NzIiIHRyYW5zZm9ybT0ibWF0cml4KDIuNjU2MSAwIDAgMi42NTYxIC0zMS4yOTcgLTYzLjM3NCkiIGQ9Im0zMS4zODkgOC4wMDU5Yy0xMS42NDggMC4yNzA0MS0yMS42NjMgOS4wMjE3LTIzLjE5MSAyMC45MzQtMS42ODYzIDEzLjE0NCA3LjU5NjEgMjUuMTc3IDIwLjc0IDI2Ljg2MyAxMy4xNDQgMS42ODYzIDI1LjE2NS03LjU5NDEgMjYuODY1LTIwLjczOCAxLjY4NjMtMTMuMTQ0LTcuNTk1My0yNS4xNzktMjAuNzU0LTI2Ljg2NS0xLjIzMjMtMC4xNTk0NC0yLjQ1NTItMC4yMjEzMy0zLjY2MDItMC4xOTMzNnptMTEuODU5IDkuMDI3M2MwLjg1NTc0LTAuMDM2MDMxIDEuNzI0MSAwLjIzMjEgMi40Mzc1IDAuODA4NTlsLTMuMjI4NSAzLjIxMjljLTAuMDg2NDc1IDAuMTAwODktMC4wODY0NzUgMC4yNDQ4MSAwIDAuMzQ1N2wyLjUwNzggMi40OTQxYy0xLjQxMjQgMC42OTE4LTMuMTEzNiAwLjQwMzQ3LTQuMjA5LTAuNzIwN2wwLjAxMzY3MiAwLjAyOTI5N2MtMS4zOTgtMS40NTU3LTEuMzQwNC0zLjc2MjEgMC4xMTUyNC01LjE2MDIgMC42NjI5Ny0wLjYzNDE1IDEuNTA3NS0wLjk3Mzc0IDIuMzYzMy0xLjAwOTh6bTIuNzgzMiAxLjEzODdjMS4zMjU5IDEuNDI2OCAxLjI4MjggMy42NDc3LTAuMTE1MjMgNS4wMzEyLTAuMTcyOTUgMC4xNTg1NC0wLjM0NzA1IDAuMzE3NTYtMC41NDg4MyAwLjQ0NzI3bC0yLjQwNjItMi40MDgyIDMuMDcwMy0zLjA3MDN6bS0wLjEyMTA5IDEuODUzNWMtMC4wNTk0NTEtMC4wMTA4MS0wLjEyMzk5LTguNzRlLTQgLTAuMTgxNjQgMC4wMzUxNTYtMC4xMjk3MSAwLjA1NzY1Mi0wLjIwMjE4IDAuMjE1OTktMC4xNDQ1MyAwLjM0NTcgMCAwLjAxNDQyIDAuMDEzNjcyIDAuMDE0ODc3IDAuMDEzNjcyIDAuMDI5Mjk3IDAuMTQ0MTIgMC4yODgyNSAwLjExNjU4IDAuNjQ3NTctMC4wOTk2MDkgMC44OTI1OC0wLjEwMDg5IDAuMTAwODktMC4xMTY1MSAwLjI3NDExLTAuMDE1NjI1IDAuMzc1bDAuMDE1NjI1IDAuMDE1NjI1YzAuMDU3NjUgMC4wMTQ0MiAwLjEyOTg1IDAuMDE0NDIgMC4xODc1IDAgMC4wNzIwNjIgMCAwLjE1NzkzLTAuMDQzOTEgMC4yMDExNy0wLjEwMTU2IDAuMzYwMzEtMC40MTc5NiAwLjQzMTMtMS4wMDggMC4xNzE4OC0xLjQ5OC0wLjAzNjAzMS0wLjA1MDQ0NS0wLjA4ODk4Ni0wLjA4Mjk0MS0wLjE0ODQ0LTAuMDkzNzV6bS03LjI0NjEgMi41MTc2YzAuNTE1OTIgMC4wNDE2NjEgMC45MjA5NyAwLjI4NTcgMS4zMjgxIDAuNjE3MTktMC40NDY3OSAwLjAxNDQyLTAuODY0NTcgMC4xODY4My0xLjE4MTYgMC41MDM5MWwtOC45MDgyIDguOTA2Mi0xLjkwMjMtMS45MDIzYzYuNTcyMS02LjU2MTMgOS4xMTYzLTguMjUgMTAuNjY0LTguMTI1em0xLjM1NzQgMS4xNjhjMC4zMTcwOCAwIDAuNjMzODkgMC4xMTc2NiAwLjg3ODkxIDAuMzU1NDcgMC4yNDUwMSAwLjI0NTAxIDAuMzczNzkgMC41NzY3MSAwLjM1OTM4IDAuOTA4Mi0wLjAxNDQxMiAwLjM0NTktMC4xNTg1NCAwLjY2MzkzLTAuNDE3OTcgMC44OTQ1M2wtOS4zODI4IDguMjczNC0xLjE5NTMtMS4yNTM5IDguODc3LTguODIyM2MwLjI0NTAxLTAuMjM3OCAwLjU2Mzc4LTAuMzU1NDcgMC44ODA4Ni0wLjM1NTQ3em0xLjM4MjggMi4yMzA1Yy0wLjMwMjY2IDIuNjgwNy00LjA3ODEgNi40ODU0LTcuOTU1MSAxMC4xODlsLTEuNjcxOS0xLjY3MTkgOS4zODA5LTguMjU3OGMwLjA4NjQ3NS0wLjA3MjA2MSAwLjE3NDAzLTAuMTU4ODggMC4yNDYwOS0wLjI1OTc3em0tMTMuNzUgNS4wMTU2IDEuNzczNCAxLjgxNjQtNC4wMjE1IDAuODYzMjhjLTAuMDg2NDc1IDAuMDE0NDE5LTAuMTczMDktMC4wNDI0MzQtMC4xODc1LTAuMTI4OTEtMC4wMTQ0MTItMC4wNTc2NTItMi42OWUtNCAtMC4xMDEyOSAwLjA0Mjk2OS0wLjE0NDUzbDAuMDQyOTY5LTAuMDU2NjQgMi4zNDk2LTIuMzQ5NnptMi4yNzczIDIuMzQ5NiAwLjk5NDE0IDAuOTIxODgtMi4yMDUxIDAuNTYyNWMtMC4wNDMyMzcgMC4wMjg4MzktMC4wODU2NjkgMC4wMjg4MzktMC4xMjg5MSAwLTAuMDI4ODI0LTAuMDQzMjQtMC4wMjg4MjQtMC4xMDEzIDAtMC4xNDQ1M2wxLjMzOTgtMS4zMzk4em0xLjQxMjEgMS4zNjkxIDEuNzQ0MSAxLjc0MjJjLTMuMTEzMSAyLjU5NDItNi41NDI0IDQuODAxLTEwLjIwMyA2LjU0NDl2MC4wMjczNDNoLTAuMDE1NjI1Yy0wLjE4NzM2IDAuMTAwODgtMC4yODczOCAwLjMwNDA5LTAuMjQ0MTQgMC41MDU4NmwwLjQwMjM0IDEuNzI4NWMwLjAyODgyNCAwLjExNTMtMC4wMjg3NTkgMC4yMzE0MS0wLjExNTI0IDAuMjg5MDYtMC4wODY0NzUgMC4wNzIwNjQtMC4yMTUwNSAwLjA3MjA2NC0wLjI4NzExIDBsLTIuNDUxMi0yLjUyMzQgNy41MjM0LTcuNTM3MSAzLjY0NjUtMC43NzczNHptLTExLjU1OSA4LjY3NTggMi40NTEyIDIuNDM1NS00LjIwOS0wLjI3MzQ0Yy0wLjA1NzY1Mi0wLjAxNDQyLTAuMTE2NDUtMC4wNTgzMjMtMC4xMzA4Ni0wLjEwMTU2LTAuMDE0NDE5LTAuMDU3NjQ4LTAuMDE0NDE5LTAuMTE0OTYgMC0wLjE1ODJsMS44ODg3LTEuOTAyM3oiIG9wYWNpdHk9IjEiIHN0cm9rZS13aWR0aD0iLjE0NDEyIi8+CiA8L2c+CiA8ZyBpZD0iZzUzIiB0cmFuc2Zvcm09Im1hdHJpeCguMzc2NDkgMCAwIC4zNzY0OSAxMS43ODMgMjMuODYpIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50ODcwKSI+CiAgPHBhdGggaWQ9InBhdGgyMiIgdHJhbnNmb3JtPSJtYXRyaXgoMi42NTYxIDAgMCAyLjY1NjEgLTMxLjI5NyAtNjMuMzc0KSIgZD0ibTMxLjM4OSA4LjAwNTljLTExLjY0OCAwLjI3MDQxLTIxLjY2MyA5LjAyMTctMjMuMTkxIDIwLjkzNC0xLjY4NjMgMTMuMTQ0IDcuNTk2MSAyNS4xNzcgMjAuNzQgMjYuODYzIDEzLjE0NCAxLjY4NjMgMjUuMTY1LTcuNTk0MSAyNi44NjUtMjAuNzM4IDEuNjg2My0xMy4xNDQtNy41OTUzLTI1LjE3OS0yMC43NTQtMjYuODY1LTEuMjMyMy0wLjE1OTQ0LTIuNDU1Mi0wLjIyMTMzLTMuNjYwMi0wLjE5MzM2em0xMS44NTkgOS4wMjczYzAuODU1NzQtMC4wMzYwMzEgMS43MjQxIDAuMjMyMSAyLjQzNzUgMC44MDg1OWwtMy4yMjg1IDMuMjEyOWMtMC4wODY0NzUgMC4xMDA4OS0wLjA4NjQ3NSAwLjI0NDgxIDAgMC4zNDU3bDIuNTA3OCAyLjQ5NDFjLTEuNDEyNCAwLjY5MTgtMy4xMTM2IDAuNDAzNDctNC4yMDktMC43MjA3bDAuMDEzNjcyIDAuMDI5Mjk3Yy0xLjM5OC0xLjQ1NTctMS4zNDA0LTMuNzYyMSAwLjExNTI0LTUuMTYwMiAwLjY2Mjk3LTAuNjM0MTUgMS41MDc1LTAuOTczNzQgMi4zNjMzLTEuMDA5OHptMi43ODMyIDEuMTM4N2MxLjMyNTkgMS40MjY4IDEuMjgyOCAzLjY0NzctMC4xMTUyMyA1LjAzMTItMC4xNzI5NSAwLjE1ODU0LTAuMzQ3MDUgMC4zMTc1Ni0wLjU0ODgzIDAuNDQ3MjdsLTIuNDA2Mi0yLjQwODIgMy4wNzAzLTMuMDcwM3ptLTAuMTIxMDkgMS44NTM1Yy0wLjA1OTQ1MS0wLjAxMDgxLTAuMTIzOTktOC43NGUtNCAtMC4xODE2NCAwLjAzNTE1Ni0wLjEyOTcxIDAuMDU3NjUyLTAuMjAyMTggMC4yMTU5OS0wLjE0NDUzIDAuMzQ1NyAwIDAuMDE0NDIgMC4wMTM2NzIgMC4wMTQ4NzcgMC4wMTM2NzIgMC4wMjkyOTcgMC4xNDQxMiAwLjI4ODI1IDAuMTE2NTggMC42NDc1Ny0wLjA5OTYwOSAwLjg5MjU4LTAuMTAwODkgMC4xMDA4OS0wLjExNjUxIDAuMjc0MTEtMC4wMTU2MjUgMC4zNzVsMC4wMTU2MjUgMC4wMTU2MjVjMC4wNTc2NSAwLjAxNDQyIDAuMTI5ODUgMC4wMTQ0MiAwLjE4NzUgMCAwLjA3MjA2MiAwIDAuMTU3OTMtMC4wNDM5MSAwLjIwMTE3LTAuMTAxNTYgMC4zNjAzMS0wLjQxNzk2IDAuNDMxMy0xLjAwOCAwLjE3MTg4LTEuNDk4LTAuMDM2MDMxLTAuMDUwNDQ1LTAuMDg4OTg2LTAuMDgyOTQxLTAuMTQ4NDQtMC4wOTM3NXptLTcuMjQ2MSAyLjUxNzZjMC41MTU5MiAwLjA0MTY2MSAwLjkyMDk3IDAuMjg1NyAxLjMyODEgMC42MTcxOS0wLjQ0Njc5IDAuMDE0NDItMC44NjQ1NyAwLjE4NjgzLTEuMTgxNiAwLjUwMzkxbC04LjkwODIgOC45MDYyLTEuOTAyMy0xLjkwMjNjNi41NzIxLTYuNTYxMyA5LjExNjMtOC4yNSAxMC42NjQtOC4xMjV6bTEuMzU3NCAxLjE2OGMwLjMxNzA4IDAgMC42MzM4OSAwLjExNzY2IDAuODc4OTEgMC4zNTU0NyAwLjI0NTAxIDAuMjQ1MDEgMC4zNzM3OSAwLjU3NjcxIDAuMzU5MzggMC45MDgyLTAuMDE0NDEyIDAuMzQ1OS0wLjE1ODU0IDAuNjYzOTMtMC40MTc5NyAwLjg5NDUzbC05LjM4MjggOC4yNzM0LTEuMTk1My0xLjI1MzkgOC44NzctOC44MjIzYzAuMjQ1MDEtMC4yMzc4IDAuNTYzNzgtMC4zNTU0NyAwLjg4MDg2LTAuMzU1NDd6bTEuMzgyOCAyLjIzMDVjLTAuMzAyNjYgMi42ODA3LTQuMDc4MSA2LjQ4NTQtNy45NTUxIDEwLjE4OWwtMS42NzE5LTEuNjcxOSA5LjM4MDktOC4yNTc4YzAuMDg2NDc1LTAuMDcyMDYxIDAuMTc0MDMtMC4xNTg4OCAwLjI0NjA5LTAuMjU5Nzd6bS0xMy43NSA1LjAxNTYgMS43NzM0IDEuODE2NC00LjAyMTUgMC44NjMyOGMtMC4wODY0NzUgMC4wMTQ0MTktMC4xNzMwOS0wLjA0MjQzNC0wLjE4NzUtMC4xMjg5MS0wLjAxNDQxMi0wLjA1NzY1Mi0yLjY5ZS00IC0wLjEwMTI5IDAuMDQyOTY5LTAuMTQ0NTNsMC4wNDI5NjktMC4wNTY2NCAyLjM0OTYtMi4zNDk2em0yLjI3NzMgMi4zNDk2IDAuOTk0MTQgMC45MjE4OC0yLjIwNTEgMC41NjI1Yy0wLjA0MzIzNyAwLjAyODgzOS0wLjA4NTY2OSAwLjAyODgzOS0wLjEyODkxIDAtMC4wMjg4MjQtMC4wNDMyNC0wLjAyODgyNC0wLjEwMTMgMC0wLjE0NDUzbDEuMzM5OC0xLjMzOTh6bTEuNDEyMSAxLjM2OTEgMS43NDQxIDEuNzQyMmMtMy4xMTMxIDIuNTk0Mi02LjU0MjQgNC44MDEtMTAuMjAzIDYuNTQ0OXYwLjAyNzM0M2gtMC4wMTU2MjVjLTAuMTg3MzYgMC4xMDA4OC0wLjI4NzM4IDAuMzA0MDktMC4yNDQxNCAwLjUwNTg2bDAuNDAyMzQgMS43Mjg1YzAuMDI4ODI0IDAuMTE1My0wLjAyODc1OSAwLjIzMTQxLTAuMTE1MjQgMC4yODkwNi0wLjA4NjQ3NSAwLjA3MjA2NC0wLjIxNTA1IDAuMDcyMDY0LTAuMjg3MTEgMGwtMi40NTEyLTIuNTIzNCA3LjUyMzQtNy41MzcxIDMuNjQ2NS0wLjc3NzM0em0tMTEuNTU5IDguNjc1OCAyLjQ1MTIgMi40MzU1LTQuMjA5LTAuMjczNDRjLTAuMDU3NjUyLTAuMDE0NDItMC4xMTY0NS0wLjA1ODMyMy0wLjEzMDg2LTAuMTAxNTYtMC4wMTQ0MTktMC4wNTc2NDgtMC4wMTQ0MTktMC4xMTQ5NiAwLTAuMTU4MmwxLjg4ODctMS45MDIzeiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg3MCkiIHN0cm9rZS13aWR0aD0iLjE0NDEyIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"postman,http,post,json\"\nLABEL oc.cat=\"development\"\nLABEL oc.launch=\"postman.Postman\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"postman\"\nLABEL oc.displayname=\"Postman\"\nLABEL oc.path=\"/usr/local/bin/Postman/app/Postman\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"postman\"\nENV APPBIN \"/usr/local/bin/Postman/app/Postman\"\nENV APP \"/usr/local/bin/Postman/app/Postman\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/postman/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/postman/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application postman

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/postman.d\n
"},{"location":"applications/postman/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f postman.d -t postman .\n
"},{"location":"applications/postman/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect postman > postman.json\ndocker image save postman -o postman.tar\nctr -n k8s.io images import postman.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @postman.json\n\n
"},{"location":"applications/powershell/","title":"powershell","text":""},{"location":"applications/powershell/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/powershell/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/powershell/#alpine-packages","title":"Alpine packages","text":"
powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\n
"},{"location":"applications/powershell/#arguments","title":"Arguments","text":"

\"--class=powershell -- /usr/bin/pwsh\"

"},{"location":"applications/powershell/#displayname","title":"Displayname","text":"
Powershell\n
"},{"location":"applications/powershell/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/powershell/#mimetype","title":"Mimetype","text":"
application/hlp;\n
"},{"location":"applications/powershell/#file-extensions","title":"File extensions","text":"

\"hlp;\"

"},{"location":"applications/powershell/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/powershell/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.powershell\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/powershell/#json-dump","title":"JSON dump","text":"

json source file powershell.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\",\n    \"icon\": \"powershell.svg\",\n    \"keyword\": \"powershell\",\n    \"launch\": \"gnome-terminal-server.powershell\",\n    \"name\": \"powershell\",\n    \"displayname\": \"Powershell\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"application/hlp;\",\n    \"fileextensions\": \"hlp;\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--class=powershell -- /usr/bin/pwsh\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/powershell/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output powershell.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/powershell.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @powershell.d.3.0.json\n\n
"},{"location":"applications/powershell/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update powershell dbus-x11 gnome-terminal font-adobe-source-code-pro\nLABEL oc.icon=\"powershell.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IlBvd2VyU2hlbGwiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIyMDQuNjkxcHgiIGhlaWdodD0iMTU0LjUyMXB4IiB2aWV3Qm94PSIwIDAgMjA0LjY5MSAxNTQuNTIxIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMDQuNjkxIDE1NC41MjE7IgoJIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxwYXRoIHN0eWxlPSJkaXNwbGF5Om5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMjY3MUJFOyIgZD0iTS00Ny41NDcsMjI2Ljg3MgoJCWMwLTk3LjEyOSwwLjA5NC0xOTQuMjU5LTAuMTk1LTI5MS4zODdjLTAuMDIxLTYuOTgyLDEuNDA0LTguNDExLDguMzg4LTguMzg5Yzk0LjM5NywwLjI5MiwxODguNzk4LDAuMjkyLDI4My4xOTUsMAoJCWM2Ljk4NC0wLjAyMiw4LjQxLDEuNDA3LDguMzg5LDguMzg5Yy0wLjI4OSw5Ny4xMjgtMC4xOTUsMTk0LjI1OC0wLjE5NSwyOTEuMzg3Yy0zLjIzOCwyLjAwOC02LjgzNywxLjEyOS0xMC4yNjgsMS4xMzEKCQljLTkzLjAxNSwwLjA0OS0xODYuMDMxLDAuMDQ5LTI3OS4wNDcsMEMtNDAuNzExLDIyOC4wMDEtNDQuMzEsMjI4Ljg4LTQ3LjU0NywyMjYuODcyeiIvPgoJPHBhdGggc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0UwRUFGNTsiIGQ9Ik0xMjAuMTQsMC4wMzJjMjMuMDExLTAuMDA4LDQ2LjAyMy0wLjA3OCw2OS4wMzQsMC4wMTkKCQljMTMuNjgsMC4wNTYsMTcuNTM3LDQuNjI3LDE0LjU4OCwxOC4xMzdjLTguNjM2LDM5LjU2Ni0xNy40NjYsNzkuMDkyLTI2LjQxNSwxMTguNTg5Yy0yLjgzLDEyLjQ4NC05LjMzMiwxNy41OTgtMjIuNDY1LDE3LjYzNwoJCWMtNDYuMDIzLDAuMTM3LTkyLjA0NiwwLjE1Mi0xMzguMDY4LTAuMDA2Yy0xNS4wNDMtMC4wNTMtMTktNS4xNDgtMTUuNzU5LTE5LjQwNEM5Ljg0OSw5Ni4yODcsMTguNjksNTcuNTgyLDI3LjYwMiwxOC44OTIKCQlDMzAuOTk3LDQuMTQ4LDM2LjA5OSwwLjEsNTEuMTA0LDAuMDU3Qzc0LjExNi0wLjAwOCw5Ny4xMjgsMC4wNCwxMjAuMTQsMC4wMzJ6Ii8+Cgk8cGF0aCBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMjY3MUJFOyIgZD0iTTg1LjM2NSwxNDkuODEzYy0yMy4wMTQtMC4wMDgtNDYuMDI5LDAuMDk4LTY5LjA0Mi0wLjA1MwoJCWMtMTEuNjctMC4wNzYtMTMuNzkyLTIuODMtMTEuMTY1LTE0LjI0NGM4LjkwNi0zOC43MSwxOC4wOTktNzcuMzU1LDI2LjgwNy0xMTYuMTA5QzM0LjMsOS4wMTMsMzkuMzM3LDQuNDE5LDUwLjQ3Myw0LjUyMgoJCWM0Ni4wMjQsMC40MjcsOTIuMDU2LDAuMTM3LDEzOC4wODMsMC4xODRjMTEuNTQzLDAuMDExLDEzLjQ4MSwyLjQ4LDEwLjg5LDE0LjE4N2MtOC40MTMsMzguMDA3LTE2Ljg3OSw3Ni4wMDMtMjUuNDk0LDExMy45NjUKCQljLTMuMjI0LDE0LjIwNy02LjkzOCwxNi45MTgtMjEuODg1LDE2Ljk1MUMxMjkuODMzLDE0OS44NTYsMTA3LjU5OCwxNDkuODIxLDg1LjM2NSwxNDkuODEzeiIvPgoJPHBhdGggc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZERkRGRTsiIGQ9Ik0xMDQuOTQ4LDczLjk1MWMtMS41NDMtMS44MS0zLjIzNy0zLjg5NC01LjAzMS01Ljg4NgoJCWMtMTAuMTczLTExLjMtMjAuMjU2LTIyLjY4NC0zMC42MS0zMy44MTVjLTQuNzM4LTUuMDk0LTYuMjQ4LTEwLjA0MS0wLjU1OC0xNS4wNjljNS42MjMtNC45NywxMS4xNDgtNC41MywxNi4zMDYsMS4xODgKCQljMTQuMzY1LDE1LjkxOSwyOC43MTMsMzEuODU2LDQzLjMxNiw0Ny41NTZjNS40NTIsNS44NjQsNC4xODIsOS44NTEtMS44MjMsMTQuMTk2Yy0yMy4wNDksMTYuNjgzLTQ1Ljk2OCwzMy41NDctNjguODYyLDUwLjQ0MwoJCWMtNS4xNDYsMy43OTktMTAuMDUyLDQuNzUtMTQuMjA5LTAuODYxYy00LjU4Ni02LjE4OS0wLjM0My05Ljg3MSw0LjQxNC0xMy4zMzVjMTcuMDEzLTEyLjM5MiwzMy45OTMtMjQuODMsNTAuOS0zNy4zNjYKCQlDMTAxLjE0Niw3OS4yNTYsMTA0LjUyNyw3OC4yMzgsMTA0Ljk0OCw3My45NTF6Ii8+Cgk8cGF0aCBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkNGREZEOyIgZD0iTTExMi4yMzUsMTMzLjgxOWMtNi4xOTYsMC0xMi40MDEsMC4yMTMtMTguNTgzLTAuMDY4CgkJYy00LjkzMi0wLjIyMy03LjktMi45NzktNy44MzgtOC4xNzRjMC4wNi00LjkxMiwyLjUzNi04LjYwNSw3LjQ2My04LjczOGMxMy41NDItMC4zNjMsMjcuMTA0LTAuMjg1LDQwLjY1MS0wLjAyCgkJYzQuMzA1LDAuMDg0LDcuNDgzLDIuODg5LDcuNDU3LDcuMzc1Yy0wLjAzMSw1LjE0Ni0yLjczOSw5LjEzMy04LjI1LDkuNDY1Yy02Ljk0NCwwLjQyLTEzLjkzMSwwLjEwNC0yMC44OTksMC4xMDQKCQlDMTEyLjIzNSwxMzMuNzgsMTEyLjIzNSwxMzMuOCwxMTIuMjM1LDEzMy44MTl6Ii8+CjwvZz4KPC9zdmc+\"\nLABEL oc.keyword=\"powershell,powershell\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"gnome-terminal-server.powershell\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nENV ARGS=\"--class=powershell -- /usr/bin/pwsh\"\nLABEL oc.name=\"powershell\"\nLABEL oc.displayname=\"Powershell\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/hlp;\"\nLABEL oc.fileextensions=\"hlp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"powershell\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--class=powershell -- /usr/bin/pwsh\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/powershell/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/powershell/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application powershell

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/powershell.d\n
"},{"location":"applications/powershell/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f powershell.d -t powershell .\n
"},{"location":"applications/powershell/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect powershell > powershell.json\ndocker image save powershell -o powershell.tar\nctr -n k8s.io images import powershell.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @powershell.json\n\n
"},{"location":"applications/putty-unix/","title":"putty-unix","text":""},{"location":"applications/putty-unix/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/putty-unix/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/putty-unix/#alpine-packages","title":"Alpine packages","text":"
putty\n
"},{"location":"applications/putty-unix/#displayname","title":"Displayname","text":"
Putty Unix\n
"},{"location":"applications/putty-unix/#path","title":"Path","text":"
/usr/bin/putty\n
"},{"location":"applications/putty-unix/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/putty-unix/#wm_class","title":"WM_CLASS","text":"
putty.Putty\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/putty-unix/#json-dump","title":"JSON dump","text":"

json source file putty-unix.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"args\": \"\",\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"putty\",\n    \"icon\": \"circle_putty-unix.svg\",\n    \"keyword\": \"putty,ssh,terminal\",\n    \"launch\": \"putty.Putty\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"putty-unix\",\n    \"displayname\": \"Putty Unix\",\n    \"path\": \"/usr/bin/putty\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/putty-unix/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output putty-unix.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-unix.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-unix.d.3.0.json\n\n
"},{"location":"applications/putty-unix/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update putty\nLABEL oc.icon=\"circle_putty-unix.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI1MTkuMiIgeDI9IjUxOS4yIiB5MT0iMTAyNC44IiB5Mj0iNC44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wNjM1ODYgMCAwIC4wNjM1ODMgLS41NTYxNyAtLjU1Mjg1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNjA2MDYwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQxNDE0MSIgb2Zmc2V0PSIuMDE5NTUxIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTFlMWUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZyIgeD0iLS4wMzE2NTIiIHk9Ii0uMDQxOTQ3IiB3aWR0aD0iMS4wNjMzIiBoZWlnaHQ9IjEuMDgzOSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC42MTA2NTg0MiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjQwOS41NyIgeDI9IjQwOS45NCIgeTE9IjU0Mi44IiB5Mj0iNTA0LjE5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDUyMywwLDAsMS4wMjc2LC03Mi41NjgsLTguNjkzMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg2ZDBmYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNzk0ZjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iMzg2LjU5IiB4Mj0iNDE0LjQ5IiB5MT0iNTMyLjk3IiB5Mj0iNTMwLjU5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC44NTcxNyAwIDAgLjg1NzE5IC0yOTEuNDMgLTQxMi4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlYmViZWIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iaSIgeD0iLS4wNTk5OTgiIHk9Ii0uMDYwMDAyIiB3aWR0aD0iMS4xMiIgaGVpZ2h0PSIxLjEyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjY5OTk5NzkyIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iNDguNSIgeDI9IjQ4LjUiIHkxPSIzOSIgeTI9IjU4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4xNzIzMSAwIDAgLjE3MDI1IDE1LjY1MSAtMTA1LjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTc2OWNjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVlZTZmYiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoMi4xNDI5IDAgMCAyLjE0MjkgLTgyNi4zNiAtMTEwNy41KSIgY3g9IjQwMC41NyIgY3k9IjUzMS44IiByPSIxNCIgZmlsdGVyPSJ1cmwoI2MpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KIDxwYXRoIGQ9Im01MC4yNDkgOC4xOTMycS0zLjg1OTctMi45NzI1LTguNDQ0LTQuNTU1Ny00LjczNzItMS42MzczLTkuODAyMS0xLjYzNzNjLTE2LjU3IDAtMzAuMDAzIDEzLjQzMi0zMC4wMDMgMzAuMDAxIDAgMTUuMTU4IDExLjI0NSAyNy42ODQgMjUuODQ1IDI5LjcwOSAwLjcxMjE2IDAuMDk4NTUgMS40MzM5IDAuMTc0ODUgMi4xNTg3IDAuMjE5MzYgMC42NjEyOCAwLjA0MTMzIDEuMzI1OCAwLjA2OTk0IDEuOTk5OCAwLjA2OTk0IDE2LjU2NyAwIDI5Ljk5Ny0xMy40MzIgMjkuOTk3LTI5Ljk5OSAwLTEuMzA5OC0wLjA4MjY2LTIuNjAzNy0wLjI0NDgxLTMuODY1OC0wLjE4NzU4LTEuNDc1MS0wLjQ5Mjc5LTIuOTA5LTAuODgzODctNC4zMDQ2cS0xLjMyODktNC42ODkyLTQuMDgyMi04LjcyNjUtMi43MjE1LTMuOTc3MS02LjU0MDEtNi45MTEyeiIgZmlsbD0idXJsKCNlKSIgc3Ryb2tlLXdpZHRoPSIuOTk3MjQiLz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC40NjU4NiAtLjA1NTU2NiAuMDU3MjU4IC40NTIwOSAtMjExLjQxIC0xNTYuNjMpIj4KICA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjczNSAuMjEzMjUgLS4yMTMyNSAxLjczNSAtNDYuMTE3IC01MjkuNzYpIiB4PSIzMzQuMjMiIHk9IjUxMy4xMyIgd2lkdGg9IjQ2LjMwMyIgaGVpZ2h0PSIzNC45MzkiIHJ5PSIxLjY0NDIiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWxsPSJ1cmwoI2EpIi8+CiAgPGcgZmlsbD0iI2Q1ZmZmZiI+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ5OC4zNSIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODkuODMiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDgxLjMxIiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjQ2NTg2IC0uMDU1NTY2IC4wNTcyNTggLjQ1MjA5IC0yMDYuNDEgLTE0OS42MykiPgogIDxyZWN0IHRyYW5zZm9ybT0ibWF0cml4KDEuNzM1IC4yMTMyNSAtLjIxMzI1IDEuNzM1IC00Ni4xMTcgLTUyOS43NikiIHg9IjMzNC4yMyIgeT0iNTEzLjEzIiB3aWR0aD0iNDYuMzAzIiBoZWlnaHQ9IjM0LjkzOSIgcnk9IjEuNjQ0MiIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuNzUiLz4KICA8cmVjdCB0cmFuc2Zvcm09Im1hdHJpeCgxLjczNSAuMjEzMjUgLS4yMTMyNSAxLjczNSAtNDYuMTE3IC01MjkuNzYpIiB4PSIzMzQuMjMiIHk9IjUxMy4xMyIgd2lkdGg9IjQ2LjMwMyIgaGVpZ2h0PSIzNC45MzkiIHJ5PSIxLjY0NDIiIGZpbGw9InVybCgjYSkiLz4KICA8ZyBmaWxsPSIjZDVmZmZmIj4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDk4LjM1IiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ4OS44MyIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODEuMzEiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICA8L2c+CiA8L2c+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KC44NTQwOSAuMDcyNTY5IC0uMDcyODMgLjg1NDA5IC0yNTUuMzcgLTQzNS4yNikiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNpKSIgb3BhY2l0eT0iLjI1Ii8+CiA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguOTk2NDEgLjA4NDY2MiAtLjA4NDk2NCAuOTk2MzggMCAwKSIgZD0ibTYzLjkyOSA0My43ODFhMTIgMTIuMDAxIDAgMCAxLTEyIDEyLjAwMSAxMiAxMi4wMDEgMCAwIDEtMTItMTIuMDAxIDEyIDEyLjAwMSAwIDAgMSAxMi0xMi4wMDEgMTIgMTIuMDAxIDAgMCAxIDEyIDEyLjAwMXoiIGZpbGw9InVybCgjaCkiLz4KIDxwYXRoIGQ9Im01MCAzOS03IDExaDZsLTIgOCA3LTExaC02eiIgZmlsbD0idXJsKCNkKSIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"putty-unix,putty,ssh,terminal\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"putty.Putty\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"putty-unix\"\nLABEL oc.displayname=\"Putty Unix\"\nLABEL oc.path=\"/usr/bin/putty\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"putty-unix\"\nENV APPBIN \"/usr/bin/putty\"\nENV APP \"/usr/bin/putty\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/putty-unix/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/putty-unix/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application putty-unix

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-unix.d\n
"},{"location":"applications/putty-unix/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f putty-unix.d -t putty-unix .\n
"},{"location":"applications/putty-unix/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect putty-unix > putty-unix.json\ndocker image save putty-unix -o putty-unix.tar\nctr -n k8s.io images import putty-unix.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-unix.json\n\n
"},{"location":"applications/putty-wine/","title":"putty-wine","text":""},{"location":"applications/putty-wine/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.minimal

"},{"location":"applications/putty-wine/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/putty-wine/#alpine-packages","title":"Alpine packages","text":"
wine\n
"},{"location":"applications/putty-wine/#arguments","title":"Arguments","text":"

\"/composer/bin/putty.exe\"

"},{"location":"applications/putty-wine/#displayname","title":"Displayname","text":"
Putty Wine (alpine)\n
"},{"location":"applications/putty-wine/#path","title":"Path","text":"
/usr/bin/wine64\n
"},{"location":"applications/putty-wine/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/putty-wine/#wm_class","title":"WM_CLASS","text":"
putty.exe.putty.exe\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/putty-wine/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN mkdir -p /composer/bin\nRUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\n
"},{"location":"applications/putty-wine/#json-dump","title":"JSON dump","text":"

json source file putty-wine.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.minimal\",\n    \"preruncommands\": [\n        \"ENV WINEARCH=win64\",\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n        \"RUN mkdir -p /composer/bin\",\n        \"RUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\"\n    ],\n    \"args\": \"/composer/bin/putty.exe\",\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"wine\",\n    \"icon\": \"putty.svg\",\n    \"keyword\": \"wine,putty,ssh,terminal\",\n    \"launch\": \"putty.exe.putty.exe\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"putty-wine\",\n    \"displayname\": \"Putty Wine (alpine)\",\n    \"path\": \"/usr/bin/wine64\"\n}\n
"},{"location":"applications/putty-wine/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output putty-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-wine.d.3.0.json\n\n
"},{"location":"applications/putty-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN mkdir -p /composer/bin\nRUN curl -Ls -o /composer/bin/putty.exe https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"putty.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMjAwMTA5MDQvL0VOIgoiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPgo8IS0tIENyZWF0ZWQgd2l0aCBJbmtzY2FwZSAoaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvKSAtLT48c3ZnIGhlaWdodD0iMTI4LjAwMDAwcHQiIGlkPSJzdmcxMTU4IiBpbmtzY2FwZTp2ZXJzaW9uPSIwLjM5Y3ZzIiBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS9hbmR5L0Rlc2t0b3AvZXRpcXVldHRlLWljb25zLTAuMy9zY2FsYWJsZS9hcHBzIiBzb2RpcG9kaTpkb2NuYW1lPSJnbm9tZS10ZXJtaW5hbC5zdmciIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiIHdpZHRoPSIxMjguMDAwMDBwdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiPgogIDxtZXRhZGF0YT4KICAgIDxyZGY6UkRGIHhtbG5zOmNjPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPGNjOldvcmsgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzp0aXRsZT5FdGlxdWV0dGUgSWNvbnM8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkZXNjcmlwdGlvbj48L2RjOmRlc2NyaXB0aW9uPgogICAgICAgIDxkYzpzdWJqZWN0PgogICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgIDxyZGY6bGk+aGFzaDwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPjwvcmRmOmxpPgogICAgICAgICAgICA8cmRmOmxpPmFwcGxpY2F0aW9uPC9yZGY6bGk+CiAgICAgICAgICAgIDxyZGY6bGk+Y29tcHV0ZXI8L3JkZjpsaT4KICAgICAgICAgICAgPHJkZjpsaT5pY29uczwvcmRmOmxpPgogICAgICAgICAgPC9yZGY6QmFnPgogICAgICAgIDwvZGM6c3ViamVjdD4KICAgICAgICA8ZGM6cHVibGlzaGVyPgogICAgICAgICAgPGNjOkFnZW50IHJkZjphYm91dD0iaHR0cDovL3d3dy5vcGVuY2xpcGFydC5vcmciPgogICAgICAgICAgICA8ZGM6dGl0bGU+QW5keSBGaXR6c2ltb248L2RjOnRpdGxlPgogICAgICAgICAgPC9jYzpBZ2VudD4KICAgICAgICA8L2RjOnB1Ymxpc2hlcj4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkFuZHkgRml0enNpbW9uPC9kYzp0aXRsZT4KICAgICAgICAgIDwvY2M6QWdlbnQ+CiAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgIDxkYzpyaWdodHM+CiAgICAgICAgICA8Y2M6QWdlbnQ+CiAgICAgICAgICAgIDxkYzp0aXRsZT5BbmR5IEZpdHpzaW1vbjwvZGM6dGl0bGU+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6cmlnaHRzPgogICAgICAgIDxkYzpkYXRlPjwvZGM6ZGF0ZT4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+CiAgICAgICAgPGNjOmxpY2Vuc2UgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9QdWJsaWNEb21haW4iLz4KICAgICAgICA8ZGM6bGFuZ3VhZ2U+ZW48L2RjOmxhbmd1YWdlPgogICAgICA8L2NjOldvcms+CiAgICAgIDxjYzpMaWNlbnNlIHJkZjphYm91dD0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvUHVibGljRG9tYWluIj4KICAgICAgICA8Y2M6cGVybWl0cyByZGY6cmVzb3VyY2U9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjL1JlcHJvZHVjdGlvbiIvPgogICAgICAgIDxjYzpwZXJtaXRzIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGlzdHJpYnV0aW9uIi8+CiAgICAgICAgPGNjOnBlcm1pdHMgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EZXJpdmF0aXZlV29ya3MiLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMgaWQ9ImRlZnMxMTYwIj4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQxNzIyIj4KICAgICAgPHN0b3AgaWQ9InN0b3AxNzIzIiBvZmZzZXQ9IjAuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogICAgICA8c3RvcCBpZD0ic3RvcDE3MjQiIG9mZnNldD0iMS4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjAwMDAwMDA7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE3MjEiIHgxPSIwLjg1NzE0Mjg3IiB4Mj0iMC42NTUxNzI0MSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTcyMiIgeTE9Ii0wLjQ2MDkzNzUwIiB5Mj0iMC43MzQzNzUwMCIvPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MTgiPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MTkiIG9mZnNldD0iMC4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjcwMDU2NDk4OyIvPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MjAiIG9mZnNldD0iMS4wMDAwMDAwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjAwMDAwMDA7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDMwNDUiIHgxPSIwLjY3NzI5MDg2IiB4Mj0iMC41MDU5NzYwOCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTUxOCIgeTE9Ii0xLjEyOTAzMjMiIHkyPSIwLjg3MDk2Nzc1Ii8+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTU0NCI+CiAgICAgIDxzdG9wIGlkPSJzdG9wMTU0NSIgb2Zmc2V0PSIwLjAwMDAwMDAiIHN0eWxlPSJzdG9wLWNvbG9yOiMzNzUzNjc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTQ3IiBvZmZzZXQ9IjAuNDMxNTY0MjQiIHN0eWxlPSJzdG9wLWNvbG9yOiMzZTZhOGM7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTQ2IiBvZmZzZXQ9IjEuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6IzhjYzZlZTtzdG9wLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQzMDQ2IiB4MT0iMC43MDUzMTM5OCIgeDI9IjAuNzM0Mjk5NTQiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE1NDQiIHkxPSItMC4zNTkzNzUwMCIgeTI9IjEuNDM3NTAwMCIvPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MTEiPgogICAgICA8c3RvcCBpZD0ic3RvcDE1MTIiIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwMDtzdG9wLW9wYWNpdHk6MTsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxNTEzIiBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmY7c3RvcC1vcGFjaXR5OjE7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDE1MzciIHgxPSIwLjc3MjAyMDcwIiB4Mj0iMC42MDYyMTc2MiIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTUxMSIgeTE9IjMuNzk1NDU0NSIgeTI9Ii0wLjE0MzkzOTM5Ii8+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MTgwNiI+CiAgICAgIDxzdG9wIGlkPSJzdG9wMTgwNyIgb2Zmc2V0PSIwLjAwMDAwMDAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNDA3ODQzMTQ7Ii8+CiAgICAgIDxzdG9wIGlkPSJzdG9wMzI3NiIgb2Zmc2V0PSIwLjY0Nzc3NzgwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjA3OTA5NjA0MjsiLz4KICAgICAgPHN0b3AgaWQ9InN0b3AxODA4IiBvZmZzZXQ9IjEuMDAwMDAwMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MC4wMDAwMDAwOyIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudCBjeD0iMC40OTAzMjI1OSIgY3k9IjAuNTA2NDkzNTEiIGZ4PSIwLjU0MzU1NDAxIiBmeT0iMC4xOTIzMDc3MCIgaWQ9InJhZGlhbEdyYWRpZW50MTUyOCIgcj0iMC40NjAxNDI4OCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MTgwNiIvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3IGJvcmRlcmNvbG9yPSIjNjY2NjY2IiBib3JkZXJvcGFjaXR5PSIxLjAiIGlkPSJiYXNlIiBpbmtzY2FwZTpjeD0iMTY3LjIxNDkwIiBpbmtzY2FwZTpjeT0iMzAuNzMyNTc4IiBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIiBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIiBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI1OTciIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNzgzIiBpbmtzY2FwZTp3aW5kb3cteD0iLTUiIGlua3NjYXBlOndpbmRvdy15PSI3MSIgaW5rc2NhcGU6em9vbT0iMS41NDU3MzkxIiBwYWdlY29sb3I9IiNmZmZmZmYiLz4KICA8cGF0aCBkPSJNIDgyLjA1NTMxMyAxNzUuODM1MjQgQSA1Ni4xNDMxMDggNTYuMTQzMTA4IDAgMSAwIC0zMC4yMzA5MDQsMTc1LjgzNTI0IEEgNTYuMTQzMTA4IDU2LjE0MzEwOCAwIDEgMCA4Mi4wNTUzMTMgMTc1LjgzNTI0IHoiIGlkPSJwYXRoMjY3MyIgc29kaXBvZGk6Y3g9IjI1LjkxMjIwNSIgc29kaXBvZGk6Y3k9IjE3NS44MzUyNCIgc29kaXBvZGk6cng9IjU2LjE0MzEwOCIgc29kaXBvZGk6cnk9IjU2LjE0MzEwOCIgc29kaXBvZGk6dHlwZT0iYXJjIiBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MTUyOCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0OyIgdHJhbnNmb3JtPSJtYXRyaXgoMS41ODcxNzQsMC4wMDAwMDAsMC4wMDAwMDAsMC4zNTc5NzYsNDcuOTI2NzIsNTguMDE0MDQpIi8+CiAgPHBhdGggZD0iTSA4Mi4wNTUzMTMgMTc1LjgzNTI0IEEgNTYuMTQzMTA4IDU2LjE0MzEwOCAwIDEgMCAtMzAuMjMwOTA0LDE3NS44MzUyNCBBIDU2LjE0MzEwOCA1Ni4xNDMxMDggMCAxIDAgODIuMDU1MzEzIDE3NS44MzUyNCB6IiBpZD0icGF0aDI0NDkiIHNvZGlwb2RpOmN4PSIyNS45MTIyMDUiIHNvZGlwb2RpOmN5PSIxNzUuODM1MjQiIHNvZGlwb2RpOnJ4PSI1Ni4xNDMxMDgiIHNvZGlwb2RpOnJ5PSI1Ni4xNDMxMDgiIHNvZGlwb2RpOnR5cGU9ImFyYyIgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE1MjgpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDsiIHRyYW5zZm9ybT0ibWF0cml4KDEuMzIzNTEyLDAuMDAwMDAwLDAuMDAwMDAwLDAuMzE0OTU1LDM4LjI2MDYwLDYxLjcxNDQwKSIvPgogIDxwYXRoIGQ9Ik0gMjQuNDA3Mzc4LDIxLjEyNzQ5MCBDIDE3LjU1NjcwMSwyMS4xNjQxMzEgOS40MjM5MDM2LDI5LjQ4NTU4NyAxMC40OTIzODEsMzYuMjUyNDk3IEwgMjEuMzgyMzg1LDEwNS4yMjI1MiBDIDIyLjI1MjMyNCwxMTAuNzMyMTAgMjYuNjk1MDExLDExNy45OTk0NyAzMi4yNzIzODksMTE3LjkyNzUyIEwgMTI2LjA0NzM3LDExNi43MTc1MiBDIDEzMS4xODg0NSwxMTYuNjUxMTggMTM2LjQzNjc1LDExMS40NTM3NCAxMzcuNTQyMzQsMTA2LjQzMjUyIEwgMTUyLjA2MjM3LDQwLjQ4NzQ5OCBDIDE1My44MzE4NCwzMi40NTEwOTMgMTQ1Ljc3MTE4LDIwLjQ3ODQ4MiAxMzcuNTQyMzQsMjAuNTIyNDg5IEwgMjQuNDA3Mzc4LDIxLjEyNzQ5MCB6ICIgaWQ9InBhdGgyNjUzIiBzb2RpcG9kaTpub2RldHlwZXM9ImN6enp6enp6eiIgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDE1MzcpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoyLjEyNTAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIvPgogIDxwYXRoIGQ9Ik0gMjMuODAyNDA3LDM1LjY0NzQ5MyBMIDMzLjQ4MjM2OSwxMDUuODI3NTEgTCAxMzAuMjgyNDIsMTAyLjgwMjUyIEwgMTM4Ljc1MjQ5LDM1LjA0MjUwMiBMIDIzLjgwMjQwNywzNS42NDc0OTMgeiAiIGlkPSJwYXRoMjY1NCIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDMwNDYpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50MzA0NSk7c3Ryb2tlLXdpZHRoOjEuMTQ3MTk1MjtzdHJva2Utb3BhY2l0eTowLjMxMjg0OTEzOyIvPgogIDxwYXRoIGQ9Ik0gMjMuODgyNTE4LDIwLjY1MDQ2OSBDIDE0LjkxMjc4MSwyMC42ODM4OTkgMTEuMzE5MDc5LDI2Ljk4OTE1NiAxMi4zODc1NTYsMzIuOTcwNTAwIEMgMTcuODgyOTk2LDI3LjU3NjY2NyAyMC4wNTA4MzEsMjUuNDY0NTA5IDI1Ljg0ODc4MSwyNS4zNDE1MTQgTCAxMzAuMzYyNTEsMjQuNDQ1NDc2IEMgMTQxLjU1NTA0LDIzLjY3MjQxOSAxNDIuMjQxOTMsMjcuMDk4MzQ0IDE0OS40MjAwMCwzNC40NDYzNDAgQyAxNDkuNzQzNTQsMzAuOTA1NzY5IDE0NS4yNDYzMiwyMC4xOTgxMjQgMTM3LjAxNzQ3LDIwLjIyODc5NyBMIDIzLjg4MjUxOCwyMC42NTA0NjkgeiAiIGlkPSJwYXRoMjY1NSIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY3p6IiBzdHlsZT0iZmlsbDojMTkxOTE5O2ZpbGwtb3BhY2l0eTowLjIwNzU0NzE3O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoyLjEyNTAwMDA7Ii8+CiAgPHBhdGggZD0iTSAyMy4zNTg4MzksMzEuNzkxMjk2IEMgMjMuMzU4ODM5LDMxLjc5MTI5NiAzOC4xMTc2NjgsNzEuMjE5MTU3IDYyLjAzODkwOCw2NS4zNjE2NTcgQyA4NS45NjAxNDksNTkuNTA0MTU3IDExNy40MzU0OSw1NS45ODk2NjQgMTI0Ljk4OTU1LDc4LjI0ODE4MSBDIDEzMi41NDM2NCwxMDAuNTA2NjkgMTMwLjAyNTYyLDk5LjMzNTE4NyAxMzAuMDI1NjIsOTkuMzM1MTg3IEwgMzMuNTM2NDM2LDk4LjE2MzY4NyBMIDIzLjM1ODgzOSwzMS43OTEyOTYgeiAiIGlkPSJwYXRoMjY1OCIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxNzIxKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7Ii8+PHRleHQgaWQ9InRleHQxMjMyIiBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7Zm9udC1mYW1pbHk6aGVsdmV0aWNhOyIgeD0iMS4wODA3NzYxIiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIxODAuMzI4MzUiPjx0c3BhbiBpZD0idHNwYW4xMjMzIj5UZXJtaW5hbDwvdHNwYW4+PC90ZXh0Pjx0ZXh0IGlkPSJ0ZXh0MTIzNSIgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O2ZvbnQtZmFtaWx5OmhlbHZldGljYTsiIHRyYW5zZm9ybT0ic2NhbGUoMC4yNDY3MjksMC4yNDY3MjkpIiB4PSIyMy4xODgzNTEiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ijc1Mi40Mjg2NSI+PHRzcGFuIGlkPSJ0c3BhbjEyMzYiPlNWRyAgSW1hZ2UgQ3JlYXRlZCBieSBBbmRyZXcgRml0enNpbW9uPC90c3Bhbj48dHNwYW4gaWQ9InRzcGFuMjE5NSIgc29kaXBvZGk6cm9sZT0ibGluZSIgeD0iMjMuMTg4MzUxIiB5PSI3NjQuNDI4NjUiPkljb24gaW5zcGlyZWQgYnkgR2FycmV0cyBCbHVlY3VydmUgR2FpbSBpY29uPC90c3Bhbj48L3RleHQ+CiAgPHBhdGggZD0iTSA3Mi43Nzc0NjIsNjguNjkzNTY4IEwgNzIuNzc3NDYyLDczLjIzNTU4OCBMIDU3LjYwMTg5OSw3My4yMzU1ODggTCA1Ny42MDE4OTksNjguNjkzNTY4IEwgNzIuNzc3NDYyLDY4LjY5MzU2OCB6IE0gMzYuNTA3Mjk2LDQ3LjYwMzA5OCBMIDM2LjUwNzI5Niw0My4yMDE5MTYgTCA1NC43OTIxMzcsNTEuMzUyOTA2IEwgNTQuNzkyMTM3LDU1LjUwNzYyMyBMIDM2LjUwNzI5Niw2My42NTg2MTQgTCAzNi41MDcyOTYsNTkuMjU3NDMyIEwgNTAuMjcwODQ3LDUzLjQ0Nzg2OSBMIDM2LjUwNzI5Niw0Ny42MDMwOTggeiAiIGlkPSJ0ZXh0OTM3IiBzdHlsZT0iZm9udC1zaXplOjI0LjAwMDAwMDtmb250LXN0eWxlOm9ibGlxdWU7Zm9udC13ZWlnaHQ6Ym9sZDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjAuNzk4NzQyMTI7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7Ii8+Cjwvc3ZnPgoK\"\nLABEL oc.keyword=\"putty-wine,wine,putty,ssh,terminal\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"putty.exe.putty.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nENV ARGS=\"/composer/bin/putty.exe\"\nLABEL oc.name=\"putty-wine\"\nLABEL oc.displayname=\"Putty Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/wine64\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"putty-wine\"\nENV APPBIN \"/usr/bin/wine64\"\nLABEL oc.args=\"/composer/bin/putty.exe\"\nENV APP \"/usr/bin/wine64\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/putty-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/putty-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application putty-wine

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/putty-wine.d\n
"},{"location":"applications/putty-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f putty-wine.d -t putty-wine .\n
"},{"location":"applications/putty-wine/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect putty-wine > putty-wine.json\ndocker image save putty-wine -o putty-wine.tar\nctr -n k8s.io images import putty-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @putty-wine.json\n\n
"},{"location":"applications/qelectrotech/","title":"qElectrotech","text":""},{"location":"applications/qelectrotech/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/qelectrotech/#distribution","title":"Distribution","text":"

ubuntu

"},{"location":"applications/qelectrotech/#ubuntu-packages","title":"Ubuntu packages","text":"
qelectrotech\n
"},{"location":"applications/qelectrotech/#path","title":"Path","text":"
/usr/bin/qelectrotech\n
"},{"location":"applications/qelectrotech/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/qelectrotech/#wm_class","title":"WM_CLASS","text":"
qelectrotech.Qelectrotech\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/qelectrotech/#json-dump","title":"JSON dump","text":"

json source file qelectrotech.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"debpackage\": \"qelectrotech\",\n    \"icon\": \"qelectrotech.svg\",\n    \"keyword\": \"qelectrotech\",\n    \"launch\": \"qelectrotech.Qelectrotech\",\n    \"name\": \"qElectrotech\",\n    \"path\": \"/usr/bin/qelectrotech\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\n}\n
"},{"location":"applications/qelectrotech/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output qelectrotech.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/qelectrotech.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @qelectrotech.d.3.0.json\n\n
"},{"location":"applications/qelectrotech/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends qelectrotech && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"qelectrotech.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxMi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDUxNDQ4KSAgLS0+Cgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiCiAgIGlkPSJMaXZlbGxvXzEiCiAgIHdpZHRoPSIxMjgiCiAgIGhlaWdodD0iMTI4IgogICB2aWV3Qm94PSIwIDAgMTE2IDExNiIKICAgb3ZlcmZsb3c9InZpc2libGUiCiAgIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDExNiAxMTYiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYrZGV2ZWwiCiAgIHNvZGlwb2RpOmRvY25hbWU9IiBRRWxlY3Ryb1RlY2guc3ZneiIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmd6Lmlua3NjYXBlIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9Ii9ob21lL3BpbmhlaXJvL3BpY3Mvb3h5Z2VuLWljb25zL3NjYWxhYmxlL2FwcHMvUUVsZWN0cm9UZWNoMTI4LnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjM2MCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjM2MCI+PG1ldGFkYXRhCiAgIGlkPSJtZXRhZGF0YTM3NzQiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGU+PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgaWQ9ImRlZnMzNzcyIj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM0MCI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MzQyIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MzQ0IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzMDMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNTMwNSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDUzMDciIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MjY3Ij48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUyNjkiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTMxNSIKICAgICAgIG9mZnNldD0iMC42ODY4MjY5NCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAuNDk4MDM5MjI7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowLjE2NjY2NjY3OyIKICAgICAgIG9mZnNldD0iMC43ODcyNTk1OCIKICAgICAgIGlkPSJzdG9wNTMxNyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDUyNzEiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTE4MyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MTg1IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNTE4NyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTUzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UzZTNlMztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUxNTUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlM2UzZTM7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MTU3IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3NhbmRfYml0bWFwIgogICAgIGlkPSJwYXR0ZXJuNTE0OSIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTk3MzAxMSwxMTQuOTM4MzUsLTM4LjgwNjk1NikiIC8+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpzdG9ja2lkPSJTYW5kIChiaXRtYXApIgogICAgIGlkPSJwYXR0ZXJuNTY3NiIKICAgICBoZWlnaHQ9IjI1NiIKICAgICB3aWR0aD0iMjU2IgogICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjwhLS0gU2VhbWxlc3MgdGV4dHVyZSBwcm92aWRlZCBieSBGcmVlU2VhbWxlc3NUZXh0dXJlcy5jb20gLS0+PCEtLSBMaWNlbnNlOiBjcmVhdGl2ZSBjb21tb25zIGF0dHJpYnV0aW9uIC0tPjxpbWFnZQogICAgICAgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFJQUl3QWpBQUQvMndCREFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCIEFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUgvMndCREFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIgQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUgvd0FBUkNBRUVBUVFEQVNJQSBBaEVCQXhFQi84UUFIUUFBQWdJREFRRUJBQUFBQUFBQUFBQUFCZ2NGQ0FBREJBa0JBdi9FQUVJUUFBSUNBQVVEQkFFQ0JBUUZBd0VJIEF3VUdCQWNCQXdnVkZnQVhKUUlSRkNZbklUVVlKRFpGRXpFM1Jna1NRVlZXS0ZGMVpUUTRSMWRoWm1kMmhZYVYvOFFBR1FFQUFnTUIgQUFBQUFBQUFBQUFBQUFBQUFnTUFBUVFGLzhRQU94RUFBZ0lCQXdNREJBRUJCZ1VEQlFFQUFRSURFUklFRXlFQUlqRWpNa0VVUWxGaCBNME1GSkZKaWNZRTBVNUdoc1JWamNuT0N3dEhoOFAvYUFBd0RBUUFDRVFNUkFEOEFyMnlDNm5yUkxyZTM2K3p2OEZqZkpMWW4wYlpCIGdRdEMyaDN1NG9IcCt5S3JXME5iRDJCTXNiYjN3NjRFMFlXK1hrTWVBaHVyamdBQmdBcUtnOEQrd1BpU3JwSDhkRGpBdTdUNWFOajAgMlNzQzdhWGE0ZElWUFQ5YzJNSlBSYTN3WkJFeTFJVkpRQXlxMnNFRUNuczlscytLTjlKZHF2MkJnZmw5Z0Fmb3dWRkhnNi9nV28xVSBqUDAza3FmNFRXN0NZVmJPY1BtdVN4TEtLL0g2MitIVzZmTEhoMVJESDc0aDJaM2tGKzd4dmxYSS9hSUFBNThmOCtId3JjcDljdml2IGU1ZVZWdEp1NlNTaU1DUzdJOWVzbjhMNlFVS0dHRDdnbnNqNStPRDJuOXRPTGRRRTFkWFpxek9Pd1Nyamx1Z0Q1L253RHo0eVJ5WVQgR1daMmRJeklra2ZwU05BdGJJVmlYd3UzczB3OGNmbVJMRzd3UEdtQ1BOR1MyV1c0NUhlL2dZMzIwTE5mbnA1SjQ5MGdaZVRtMUxEQyBVUFlLR2t5OU45MldRWTRIYlRRNzIxcWdNT0MxekNHbnVCQ1o4Q2o5US9BK0NvYUh0bjR1NE9BUGVBQU1HLzR2aTdOTTlINVZvSitvIGUzMHJzUGxXbzJzSkF4aElpQjJoTjU1Rk1FSWI1Q2hyWWNjNFFWS3dJRnFKN040c1p3Zm0xb28vZ1BBWThCNldOVDJZRHI2NURKbXYgYmFKWnprSHE3cytCc0llcGh5aC9zM2FIZEJ3Y0VPR0h0UmdtSE9Id0ozQmlkTnRBd1lqOXJra0Y1LzMrL2RTTlowVzBYSklEMUxYMSBWMG0rU251Z1lrZ0FoMU93bUhJVVhsUmY1d3pxRXRTeUVNZWhxdEQzQldqd3lMUFp0WFpoanc3QkxSLzZIK2Zuai9VbmNSNHp4ek9yIHlvNmFoREQyTEFjTndwSXp0SE5YR1FmVG5IdHFzajFJaXpyTHBwNEZLUlBDOFdkSEhoOHdDb1NWTXFVa3h5SmRkd2FoU1VqcTlmejYgZm1EN2ZyR05USzI3UnJOa2FNN2xyZXNueHlRN0JmQU1NZ1ltQ0U5a1VCMitWS1BmSUtlalBLdXI4bTRUKy83K0ErZzRiLzJIRWR3eiBiTXZKenh1Qy9rT2xnTlhKQThsV1ZmdG44TkpSaHNhS1lIMlRXOTFtQTh4aC9rQjZsWTB6YzFkb0pvd00xVnhzSHg4QWduK0E4QjZZIFQ0NGFqSHl2NjN6V2pQc2g4VWdMSUpUbFViSXJLYlYxWHNMU0JReDBORFc0YjVNcjl3Zzgvbm5FTm1SaWdwNVJ2ellrN0IrWGQvOEEgUHIvWlVjekxWNmZhclFnVkxWM3p6RC9ZVkh1QUg1YWVCS0NZb0Z3WGpOOEovd0FPdHlEaDdrRktDdG95TnlpekJtOWhRbHFWRGJxQyBmZmorRDlpZllSS3F4c3hmMUpGVENOTWtqdjcweVl5TElQdGFTU1d1Y1FPY282d0gwNFV4MmtkbWtac3BKS3dBVjhRa1F4NW94eEpkIG5MTGl1T3A3UVUzZFhzSUMydmhLN0xHc0kzZHp4cHBQV3d3aDd1S1VOYlVXWVFYTElaSEQ4ZjhBQjIxZmJWWGpUTTBDeGlNRGRuYzAgREFQMUIxRndIWUg3QXFyTTVxRlRhekcyRG0xdXRtRnh4TjNkSHRTMmsvdVIyNTdOMUtIK0dIcmREd1ErU0hLMDdsbkxnd1dTbE5zdyB4SHBNSTdiQUE1L2l2bno2Q2dpdDRQQkN3Y3d6YjRIRmJzNW9XNUs5ZERzQmFGT3EzeUxYdGMwMnlWZXQxV3Qyb0g0K0hhbTFnQWczIEJack44M1RZN1JkdURvUFBzUDMvQUtnYndIc2xnMm8xV3FHdVpBVzR0cU5wYXAycVpIYkErbk9WTFZ6d2V2dzdJSDFJQjZUSEdFZEQgcjg5QmhpM2xvRkUyYjk3dzU5N2Y1NEFCa2tacFN4WjMzYWtKTDV4bzdVSGlqZWhuaHhrMktYYTBvSFVpWEVNbVNKZzVTMGpyT3NlUyBNelZYNHMwQ2Vlb0VkbDFQS3JNd0J5bkJ0R3E1S05wN0lEY240bnhRUGZnV3lFRStHK0xhMnRrREJ6a0VCSHJmMmFiNEdrMGMyN2M0IDJCK1FRSG4wSHJkWUdYRHErNEprQ3hrODJIN3dWTFlLdVNpT0R1WVYxZXZIeG9vZGdaRU1Qeng5SG1BZjdIdGd4REZzek53bm0xNGYgcnY4QXdGQndBZGl1NkIzd3hVc0FvMXY4MnhueGtkMmdPbmo2OVExZUxMUFNsdGdyZFA4QWgyb3lEMlN1UUpIdmdZV1ZrWHhuZkFqdCBTWno5L3dEN0JoUHRnZTZGd3BkaWJWV2NOVlF5UzJyeVBEY1Zkc2hsSmJEWEo1YnNDdHpFd05NRDEvZzg0MmZiVUV3em95dTBMTlFIIE9FdXh6Z093QVAzOWdhaXVWUnZPYnFsVmhxSXJvWDkyR1g0NXlJOGl1cHVKSzBqT01jYzZGM2UySTcrQjdzZ1AxNDV2aGcwdlY5ZDIgV0x0b1cwV1RHVks1eWFkYkhDdDNZd3ZNbW55cGJDN1NwNi9hbDJwNGREdFN2MXVDZVlFTkd1QW43L1p2ZElTUVovOEFyNCtBQVB5LyBXbFBlRS90V2t0cjVEd28xWHM1dGxoMG15TFlxZGtLVWpZZTF3MThPeVBsRGh3NDlibk5xZlBnek1Wa29MWmlmOWJkb2dCL3dHTDk3IDJFVDJ0a3I2bGlXVUd1QWxFclN3Z2t0Z3RTcTNCZU1OQ3V2RkxrVzhBOHlHeVExdFBaRWNDNDl1ZHNSaWxvak5qQ0pPK2NCUWZmMzYgWGluRHFzV1ljRTBYcUViWmxYamUwOGhxdWFTV01ORXJUZ2gxZk1JUS9lWXQvd0E0anRyQUJCek5zdzRLVDl0a2VNR0ErQSsvZTNTciBmWmxXUjhOMloyUUtNNUhqR0dMeHBhNVhaeUdReEFYazN3SktyVFJyZGU0azRvdnRyTjZPRjBhN1RaRGZqcXhjTjBjQmVZNGJOVlpKIFBNbUcyMlZkUHlSOWhUQUthd2xiR2hqekNHNEIvcjdKQm4xOVdqVVl0KzMxZFg3UWRrelp2WU4vNERib0RnSUNxSU5zdEJJMDdWN1IgWWF1Q2NPNlVwdHRndzFOVHhacjVMUTBqZm9aQ0crVEllbVBoOFBzc25nWjNCc1dobzV6dmZDZC8yRGY5L1BvUFI1VWF2WDRHUGsyWCBhRjVPeUhkd2RsRTEreURXQmVjS3Y1WWVvZUd3R0Zzd1ltTW16ZzU5WDc0SDR3TGFCak52ZFhlQTJBQWY4QmgxRHZraVdrUGhKTmdWIEtic0trWWNubEZlMkU0Y2JxOFdXRi9EWUZ0d2ZGdUd0anpFRnRzREVHeW93eDhmQmhQdWtFMk5CL2Z3QUR3QlFpTlpzQ0hsZEtkbFIgTDJhOFRHbU9XRm1rNHlzOXc0SkdUY0M5dllrbkdmbk5PREltUEdOMnZObi9BRVBRMnRzbGZ4WWV5bnJVN00xeUhweW5IaUhuVitKbSBBWHhJY25LcTAraDMyWXRoMlMwRERVZXIvVVBWYko5b1Z5Wk00azFjRU9JUDBGQjZZVFF2MkFNdFFiV21xQjJXM3k3cVpHbG1CMmhqIDlYYktBVjJGb2xJZmV6NWtOd1R4NFo0UGQ2ZmhqSG1yL3dCTjhDZWY3Ukg5L0FiQUFHNlBwTkRxV0hYekdyMlJ2MmxXcFpMWkhodTEgZ3BOYjIwbTBOWTFqSjVBd3RoM0RraWZET0hTTGJPMnlzeXF2Mnp0UkpTVFp6RS92K0gwRStBVXVXaHBhUWhtRWRvVDdrSktTUXQ2aCBjRU5QWUphSFl5Ylh0MmxEQ2VZUXc5VncwOWdXMnJ0Zjl3eEp2bkdXWjRDQkRaejhSZmZsOSs5eFpadlFHU042S1Jia01lMy9BRFZ3IGt1Ylp4akQxWXNGekpRWktPaWlaTXBXMm5HYjUwODI1NStCNmFWVmNubksvaXVRTy9KbVhYTEJNcVdLMU8weW0zeHRyMWY0M0orR0wgdHBJMzdqN0ppeUdPejVBeE9uOFJlREF3bnRpeThuTWNlRDhBUDcvKy9nUFdMVWhZRjZXcWhuNTl5RWh1bSs2WHdJV1J6RmhWUlU4UCBhN0RwRjhxdXNBOWJ2a08rR1JnM3pqN1kxSjlHNFdnTHJNbThHd2lTYnQwQnNIWG52bG80c1dMR3ZsdEtwSlBTR1JrWWEzMzVJVTAvIGRLeUZ2aGpqYmhNMDloektjSEJubUFDRDNQYTN3bXNvL20zamYrQW9KL2dMOGZlVXhIdlRUd0x1eVZQaC9NcmthcFM3QStHd01LMkIgMCt5eGJRSDVnWlc1Z2Z2QUhycWZaNzVSNGNtemZyV2U5dTNCK0FnSDcrd2ROWVJOT3VXYXpLaU9HS2VtbWRDbzN5OVM4TzQ0cGp4dyBjdUdDTjQ5TXhrQ0hUdE1xdVE5eUsrbnJOV2p4OUdSVEt1MUprOVczYjBqVU5sdU5JcThiWDJvSWxhSUV5dHFWaEk5ZTJwUjltbUt2IFBLY3BvNC9NTUI1a09hUW1jODM0Sit2QS9CcE4yQkhnQWZmUUI5K1FPcDRvVWowWU1zZzlUWmk0ekdhaHU5aE1DSG5HT3o1NW8ySDUgakJNTUdYeERtWU1pcStiQk9UM25pN1IrS3JSMlE2QVBvUDhBcEZzQjg4RjZtTDAwN3RGSjJyWDFuVUJhcmJaQzJrTUhDQ0M4SHNaWCBseWhjTndxdERodmljdHI2Zk9RN1FBbzc1eGxwUTZ6L0FON1k3L3NCL3dEejYwdHRtQjNKSDFnZHk5TWJZcTNTN0pLOUgwK05TZnc4IFhLcEdVaDJRd1RIeDhvZXEwOWdoenVIOEgvR2FIYUtNTU9PeHNKc0lEWUFGUlBwL3BDaGhjTHd1Mm1rcVpwei9BSGxHTWxkc1pxTDIgVmJIbklNT0Z4NUVzeDNIU1ZJM1Z5aWxQUkF4eHMxMzUzWUlIR05mZG4ybXlYM01zdVlCdHF3ZFMxdFpLazRWZFdVZGtHdUVTcTVWOCBXRWVpR05RT3ptRU9xekZmcllMVkxjQUY1c2dtVGZGY1k5UEFSSnBONDMrM2ZQOEFBVUVBRXgzQlBBMnc0WnRqR0tVdFVNdCtZenY0IGQ3TjR1ZWlLOHJidzc0SHJleUUvUytIVlcycjFLdWRzNEdMck1tRHE3VHhTZlB3TDloN2MrMkNIVHg1U2taaWUyNXEycE11bml0NUsgNlFXM1pnaUxjVUR3TXBXN0E0QjYzVDN4RFlKcXFQY0xMbzliV1JuS05zM3MzOSs3dXI5dUg2aTZnU0MzTnJsd3lhMHFBUHZBRmxVYiBDSHQ1S1NrVEl0akNSY1d5T1lMYkk0VnV0MkFuOER4NXdZUmthMEdnbU10VHRkL1VBRDh1b0lEcGpJc2I0UmoyMWhIK2JDazkzNm9mIEI4L0E2RWxsZmRrWEVHdHhpYWRheHh6am80L0lYdU4wUjVITWppVm9lVlVicXJXMGNPQWxkRXNqaTFURTE1VFkyaXBidHNhMnJIQU8gTDRpUkxnNGVuVTl0OWFIVEF1M2lpSDZWZ0ppN0pXTDkzZTM4NnZvVEJoOXJPc3dpNW1LdWxCOFpDUUYzeWFsc0pISlhYY0R1aHlVTSB0YmFiekJicmRiVzdIRHA1Z0dwSjlEUWJJUmxtMEdqYzNoMjV2aCtJbjRBQTVBd1B4Mm4xMkxNb2x6R0Qyb05TWk0ySkZyMm9EK2w1IGZZYjRQWEd3MlBFUTAvaldwdW42VHh0SGxhbGlRZ3cxcG5GbEJlQjN3WUszdmRDZlVMWUFBQTMxVVROTjlsMTNRNFlWVEp2U3ZBckYgSlhtaHFaTEFzeUlybnJZMUJSYTNwOFBEK3VROGJJOGVkQlF5YXh1aFBmRGxvdXh6OVVIOVQ1OCt2ZXprUUVPb2UyakNMdWJjaHgzWCBQY3Q3dHB3Y2NjUExYMDE0ZHRDeXRTVEhUMUE0SXZUdm5zYnNkK0ZxVER1TjVNT0NPVXBSWjA1V2xnV1E3VmV5YXF0T3VhMURsK095IExiZ1ZEaTNONFBVNU1Ub1FlWmF1S0dQWkora3h3OXNDWGVRbWo0UEJvMkVlR0FBZnd3NUJqMDVjdXQ2N0ZXaGttUmJJMnUwKzRhbGIgSkYyT3kvRmh2bHRNSjYwRnV2NWw4R0hDYkQrWXF2bG9xVFV5RGRRb3RXcUFZajJpYkNIT0FvTDlzQy96Nm9xNnVDT1U0dXRsSE5xVSBvZVVreGkyNUdLL0VMZGpKdGdpMWVIN3ZuNVVEajF1Q2VId0RuYUI1N29EQm1MdFNZVDkvUDdCeDgvMDRFZDBJVkJETUxjWEZKc0lwIFQ1UHZRTnIzVUFXZkdnWDhxS1lUOW50U3RvYWd3Ky9JRU5WMnlzM3dxekRIamUwcjhSWUgvd0RQZnlrVEJ2cUlvYzNhRVJ1elN4SzcgU0pqc3l1OHJ4NTRaU1lvcThaRzJGaTF4Rm1SRmRxVFR1cFdUL2x4c2ZWanErZDdGTyt4anQrMWkzUWZlRmdSN0xwOTJjbGRKcE9zVyBoVlVrZ2hYcWV3THkzVXFHa1dOWEtIYUQ3TWh1RndQakJ2a0J2dHF1ZnZLdnBmWnlZUHVpYjd1dno5OStBZTJFYkhxOTAwdE9GYjAyIG0yRU5mTlpGZXN2ZEFDK2FjR3hidTJrWGVyN1FvY2pnM2lFOWJtVmh5cWZZQ21jTUV4aFJEWmtZNGxHOU81eGc4K0F4QWIrdnM1c0ggajZ6TU1zcW9MQ05wR2JER2xrK3psV1FwdmtXWEU1UXR1Q2U0TWkyeVdvUDdjdHRmdnV6c3hNV2hqTjh3eENIQUNEejVBOXovQUVFciBkTGxLV3NUbTlWTGRBaDgxYnB4SVI3T1ExZVdZaXhXemEyUmZoNDJtSFphMkhyZ0p0SHdIaGtXVVlvTFJtWjROcE94OCszOCtBUWQvIDZJUEk2UmtOMmNZczQ5YzVTd1JuZVcrTWR5MDU1QVljWFlvcEdTcFpibVc5d2c1UnRZWEhGNkdWVTJYYUtOZGRqaE1UOHFRN1FNck8galcwN1BqSi9EODFZVU93dUVvVzJBWHhicjljTVVQRDJad1pBYzlRUFBCZ21NYUdqdStqL0FJdTJBQjkvUC81a2xnTFk4cEhwT3h0TyBWeldSZGtVeFVyWXY4a1lLOWNPMTZRVStZUnc3VncwTzRHQmtCZ2JnclNCdGd6akhuRW4vQUg4ZlFmUCtmRmN5eUhRb0NXM2ZOR2pZIGRMQjZLVTBkMlE0ekV0Z1VOaFBja1QwOWtEbUdTWVFod1VPQmROT3JheU1GK1RCbXpmQno3OC83QWdnSDdxTnR5R0tEVmdIYlJmQ1oga294SjIvdDY4V0U0SnA2c3JHRmJmTURMZHdPREp4dmdiQStLdkJobFhsSGpnL05naU9nLzJBQWc0ZENnWWJPWXhkY2x3dXdrWU1aaiBTNkY0OTFtaGQrQlhSbGxaSm9ramVkSk1EbkdaUTdTYzV1c01jc2VXZmJ3em5ERUFHeWVtZFdkZ1haZnFGWnlZTEpFZ0thWk5xYS9hIGo1UzlJOTJrMWRxWFQ2aDdPdDZrREQ0bnY2SE83UG53ZDJNM2RDaDBaWkIyalZ4dEgyRGdQK3J3RHBic2xnUTAxSGg5ME02U05RdzUgdVhHSk8xZjJhNHlyRzFIaTY1MVVKOWtUTElNVVB3K3lVZEQ1YURXMWxtS1Uyek0yOWhPRG4xOEJicDkrWHo5UmRNN3ZBVXNHbzc0ZCB3TjhFdEpaUTlUakN3V2N5VmY1UW83dmxYdzE5Yk1VUE1UMFBrZ05EWUxhQ0dPVHE2dldmaERmQjdkUG45LzhBUEgrZy9UMjJRbmRIIHptUEtySFR3TmltSTEzVXVURHY2OHlBU2w4NmM3azdYMlFoM3dudmhnaE1nd0xBbkk0ZThsbFh0QW5iN3hhUE5uallPUCszdUE2V0YgaVl4U08yeWlUUmg0WUpiajA4bk9TQmNWdjQ1NExVVFhWcXJzMHEzREpoQy92NUw1QlA4QWh4L1Z3L2tuNVhiaVY1ZTdIQTIyMDFhSCBLUDFCMTNpOWhFVnVzQVB1a2ZJSE9Yb2I5TGRUOGdqbTFoYWV2Vk95QWxzK2gzdEEyRnh6M0RPeWs5cGRUZVRMSm8rV3N4bDVmVkVnIGVyTEFuT3ZKNnliMHFmUysyenF1Wk5FZXNQSDBEOG1Ka2hDRkszUkpUVWN0QVdJL29ya3JMakxQcnBwdWhCSmNSeFIya0w2eElrdDggTVJERlFSRWpKeE1RQ2txVm5UY1A3WnYwZFVURmZwbmI4cGFZbitUNUZILy9BSENCL3dDbnRUTnBBN01BelB2QVpFMFMxYlRWWjVxeiBYSDQ2di9JT1hKWTJuL0pzdTd1TnpKZGtKTHZBSkIyQzJERlM2bHNiR1BMWThQTUQ3dzRja3JuK1FuTFpPOHZ4bU0rN082TWZ4dDNEIHdBQUFmaDA4WFhlbk80MnBETXA1S0hWN0dNdU9SdHNoVG1DeGFRcnZpZTRCK1lYWUhXMTdsVlNFS2xlSENvRmw4VnlhTWQ0VDdvUDMgNUIrL0FPZ25UbTY1K3BEQmxHUWFOQ0Y3ZmFna3RIU2F4cSt2b2NwV3VKeWlsN0FNZnF0c2xnZjArcFZYeG4zM05tdkJKMlRnTnU0diAyR0NEd0VBenJNWDF0ak9FbEp1MDYzR3Q1cXFiWWF2MUZUTEFYb2NvcHlpdWEzNDNETVB0MkJ5RjJJOEMwTGEzZ1p4ZmJDWGhFbXF6IDU4QmJ2QUxkUVVFQlVjdXcyQWJKQlN0SjdkdEZJMjB4dHNxdCs3SlFmeGZQVFpBc3JaT1V6UHVaekZIbHlvRkNLRkxybThpMVhRcXogMHBRN1JtVHg1S3l6Tll4aHRxNUNTNzd4blNLbm1PVVZocThxaGpvYUhNaHAvTUZxY2gzQlduK3I3UnlZbnduSEVIc0FBK3dZbi9BQiBOZ0VOVkdrR3hERlFKcmhVcWVta2xLd3F2YWoybjhzbmdlYnE5eTRMNGUxSEFQWkVQRVBnMi9BYW56eFl0NVdmd203Z3dIMzRCK3A3IHAyVm5EMHh1U21Tc2JXNWNCdk9EVjdWenUwTGN5aHkzUEhLd2p0U3A0K2ttUkRmSHpBZ3ljRCtmMnJXU2VuT3J5ZkJraTBjVG4wRisgOCtmQWRMRjRxY081VXVoaG90aE1qVkZtRzRpUUhRMStwdzFJZ1phSFkxUFZmRGNET204eHVDMjFnU0FHeDJRWldaUlhKL2hNMjdBeiAvZ01QYkRmNFRGcUpIVjg4RnhiRjB5Z2VRY1J1RGI2YlViVlBhMUpnSDhybDNMSWxqUUlwVDFFUXVBOXlLamNOSEltSXd5NEliSnJ4IGJqdDZjd2NXano4dGIweU1lb3BTWkRKSWFwNTl6WEs0N3hGMCsxa0JRNnJYNjNxdGF0OHhaREJNT2N3VW9LRzhqTnJSbVpIQ2JKNS8gSDNQbjE4LzBiS2NOa1hLenRydU5uTWxEcStUR3MxNEdnS2ZpQnowVjNsRkhEbUZWMG15ekszWC9BT1FYNlduTWhOR0ZGTGZabmgyTiA4SDhCd0UraFlvT0tUcmRvRm1jdlNqWEpxaHdsblpWYjNIYktkRHFaZitHQmxYeUx0QjhJTGI1eVNhSFh3Ky9PRUE0aDhadVJYWnNUIG5oQVFEZ0dQL3RBa0NIS0dSV3E4b1NRTGdQWEJKczFITUt5T1h1QURLcHdvcjhnbUxZZVpWZk1BOVYyWGFDaXE3WXpLNHZjem5DUDcgL3dEUWZzSFVLeW94a1V1ZVdMcThlQVp4TEpFN2p1ZjNiU25HdXpnVzNucGpkNFJXWkdkYUJkR3l0R2lna2pRclFyYjNXVU5rYy9OTCA0Nk1JL3IwMkxoU1lHYUt4dEc3QVMwZzJFamtnS2ZEbW9sb01WaWxGdC8yZ1BNL282ZEFyQ2ZneUl3c3BqOTQ4NWp2L0FCLzJQSU93IExFZk1yaEl2dFZpNmxXV0tBMHRPMFdMWDExdU9tK0h2OHFJQjRHUE1Keklub1V2Rmp0VEdycDhKUHczUjhlUnJ3YjNzNXo3M3dmdlogQlFHY2puSGhqUndMdStEWTF6SnFHU0xjd0FzRVFPbXhaZS9CMENXWWNERGc0T0FiOGdIb0VNWXNxNkhVRE1iZHF1ZHZ2NERZQUtDZiAzK1NYOHVsNHRObmx4RHJGa2ZMV01ha0lqUVlhYmY4QW1XMEJVME5ETU1FTndyZVlZVCtITlczendrUGJPTHZJd0c3V2liMy9BSDgrIEFxTFlOZ1pJR3lYTVl1WFJHUzdNTTRvQTVVTXR1eWFwY3NoeXRjcldPNDBJTUtvdHlxMWJXNXRZRXJWdC9pSGNDYXNHallwQTZkdzggTk50VE8wOFZVazZTN0N5bllhdks0RzRMdzJjOXB6WG1qNWhBTzRXUk1EMlJYOHljcE9DR0Q3WnZPMXJMejkyTmd3UDcvdjhBaUE2NyBJNGV4Q2luWHdITnJmSE9uekxSdGhIL2lRNUVZcm01YnV1UUN5TDYySERtSmdjZWh0WEQvQUp5R3N2Tlh0QXNZRENKSnNHQTM4L3lEIGYraVN5RWV2NnJSODVqRjhiVlFJRVlXSUhvY2RlaE5CNFNCMmNnWTVKRFpQOWhzR01HWXNqRmNvVEo3SUVkZ2VQZ05nK2c5YnRSR1kgbFVFWWZHaXk3eVNVbnZrYkVtTTQ5VjdDeVBsU2xzUGgwOHR1QzJobUZ0UHdSKzRGbGcyVEZtS0ZHWkdCaEVrMytyQi9RUDM2Q1dKZyBLQ05qVXNTeExVazIwRnlWWWxMeU43bDVSWHdzV09SWlJvVmpBdDJjbzZPcjdUNFo0VVFaWW44MGJBQzJCeVRRcG5NandyMWUyWnlsIGNqaDJsclN0KzNvZXduQ3Q5UGNPVmJTOVhNV3QrQnNoZVpOaDd4Qm4yZ0JlSWF5c3Znc21OZURac0k4YytmZ0hINmkrL05vZ2wxL2wgUGg1WFNMc0pWbFdvMGF3MmhZVEpaOU9XbTRpOVBiUkZaT04xQXQyb1loajF0Vjd3WFM3dzFubE8yTTZPa3BKdmYrUG52dndEQitSbCA2YWhVT2VRU1F4ckpiWHhTeWJSaWtGWE9NS1laOHNhNHdKNjRDRmpyWmd4eEJQMk51dkE5WE14R1dWZjZNYzRUVjNkMEFBUDcrZUFkIFJ4QnNSODU4dUN2bWk1a0N5S01tRFlrZk90U3A2Y01WS2VZWElBdHVMSjJIaG1FL2g3VTJwN2JzL0pueFhzejk3dXlqOS9md0hzQXcgUHZ5dzhqR0thVXBwbkxySnN5R0tXT1NNVUVMYmtMWlpjMEFGeDhIUElZdFl4STBtSjNZbzhWYWNEYmtTUTNraUczeEFzV2VjKzNoYSA1RDFPcjE5eXN5c29Da2h4cnpzRjJCeTJCOG9IVUJZVTBYS3JJQW1yWjhQY0ZidURJbmp3NlB1R3hvWXg1NVJ4ZzRiQ2VmOEFBQU4vIDJEcG5WbThyNmJsMm9obm1xMm5ab0d4ckNIQjJtNkY2WUxGcndHSi9xUXRoNlQreUF3TndmVCtNMmdVNE53bTBmZmY4RjhCeUEvajAgQnRDRytOdGYzOW11U3FOckVlcTIxWVk4Wk1FUzFvb2VMWEtMRGo2M01HRTk4VzA5ay9pSFQ2MHRTSHdaRHdHTFBOdlo0NEQvQU5OZyA2WVZUdm1ZaHNBNUlWN0lTU1ZsNmIxdGhZSzlwTmZFb1lzcC9GQTVjZnBNT3lNb2V5S2ZUMVY4cjlTYWc3Tnp4WEdXLytFOVBEeHlCIEFmdC9vVHJLeVRTTk1obDNVRWl4eWZVTkZCcTBraG1oa1pTMEVLUnA3UXRpSVdXdXUwRHE0cFkwazB5ZzdHb080MGVReWoyemhUdkogeGhuOERCdkJzOFgxWHRzNFg4Z3d1SHNteUU5eW1SWmEvd0RrQ0l5eFZkaGlvWWY4Vk9IekM3aERCdm45U2t5ZkZ5Zk9IYnpqK0FBQSBBQi9GQlA0UnBnSFlnWlREMW91WDhiUFpSNjR4UDRZRDE2dHhUNlJhQlNHdjQ0dUNmRG1FRnUxRks4UG5CeGd4RHdXZDhTVFpzNEFBIGZvZmZ0L3hhakFudUdVdHNvc0RNazFqbWdTVlpPRGhhbGtPOHpHbTZuUFJRNit5VS9EdURaOFBnMUw1eDhKMW5UYlFVMlBaVFp4K1EgZjl2Ny93Qll2bUt2Y21ET2dUNlROaDloQ2UxWW56RERNc1k4V0FsQS9BMjlEaDZrSVkrWjgvWVlWYi90WXlvT2JmMkRZTWNQMy9vQSBNSW5KZDN2Q3N6ZU5FZVA5YjUvMEg0NnpnQkpRWUVlVHhobXUxdVVWdXVYcXFGK2VXNlc2dURzak5LSjU2N3Irc2kxQmxuZkVUM3dDIHJzTTFYZkJJdDhNTDh4Ym1PRElZSHpJTURmbW9Qd2E1R2puSncyRWRqbjdCejRBdjlHMThEeWxRWmsydWRTVlN2MVk2aDFVSmJGb00gbVRxUWR3N2tldGdDNVF1SHJuYXU0RnRmTUk1NGdCT2UzNVFSa1k0N093UjQ0Q2ZBZlFlZmRKOWJlRmU2WS94YkJ0UjJ1Q0xXNjJKWCBqSzNXOU9PRFJVcllydERKWCtLM1Q5Y01pZlR6aGNWRDR0cVBodWRvdENNejcyYjRPZlFXQS80QkJQOEFWdEsvVzgzV1JZaVN1V3JEIGsyZHpCa3IxdzdWcDlzUHBSb0UxZkVNc0c4TGJKYWo1WU16OGdOcVA3TE9rdDhlaVlQZXpld29QSUVGK1BnSDQvbmxiWjFNSXRJNmggVDN2aUlPZkFwVHVaL3JieEtBMnhZVStOZHpUQmtrem1rbDdncTViZW5OZjhRY2hzN1hPMzc5NE05YlczVHFSRHRITURLNmZ4S3docCBpVk1rMGpITU9EaFdYeFh6VDBVbG1FOWtNZlJGdGd0UTRBci9BQU9MYXovUXhNNWFKei9yd0hmei9SV1BzUkxnQzBPZWtHRkxOK0dTIEV4MG5KWDFTWktWK2Vja3NCYk1HSm5KQjh6dEtReG5ZL3dCTDQrd1JKQ2MrWDkvL0FIOC9pMnRSRlR6SXBSUHVRTWt5UUticVFRTFkgdENqVDFvTzZIS2k2ajZ2VncvTUE1aGJNSjdBaHRTSGNFK2o1aU1NOW1abUJtL0I3K2dnSDRCejdnTlM4c3d3V015aDloRHhtcUE0RSBoSyt0c2tnc1lsdEZUaTMySFg0Y3dIY05uWDJRNVpZOVM3a1lWQTBXZ01XY1BPSEFHd2NCUGdPZkg5YWpDSVhLakllV2R6dGxNYW9WIDNabHJQeXRVUE5ta011VWg3TnUzalR6bGVaSXk4TDRyeDgva2RkaGlSbGhxUG1GQTFrQkVsM3AvVkZwN3E4UGVWZ3IwTytJcW5RNVQgY0hCRFpGdlNYTlQyVFlXQUM4N1lpdmxvakJteDlremdHb2dIZDFCZnYxdUF2ajVpa2gzTmFDdWgwbW5nZGFTM0UwajM5V05yL01sUiBTMTNLN2d3V1JEWk5HYWVoL01WZTBDbEJzZ21UVjBPek1FYzNzbEhud0Z1N0EvQU1NWDZ0TFlwbEh4MFc3TWZVTlNhczZuNUttcncxIHRIcHhEcSt4bmVtNHU0V1FINWd0d3F2Mk9CVjRFSGdNV1NqNHpMUE52Mzgvc0FBK0F3Mzg4clBMbUdXRE9NZ3Bra3haZVRHc0syQU8gbFpHWVdTeHRRUzlVcmtIc0J3TUorb1MxRnRoN3FUM0NoMVgvQUZrS0xYNXN3ZGppQ0FQMEcvUHg0K2Y2elB6Z1U4UXN1RVgvQUxpayBHV1BQL0wyVTJQT1E3UWZMQWhYdHp6ZmhpdU9PTWJVSTNKczN1VTVLME1jQ2JPVkN1azBvd2FmajlNMi9WVEkybm5FbWJpU0tPZkdDIFdIcVlvMjdGTVlQbVU4bjJwalg0ZXhxMHdVbXBiSjRYSXJzd3dIVnh2ZkQ0Qi9mZ0FEWU9ubWxuQTU1NHQ4OEJaS3VmTExzbGxpTDkga1Y2UStZS2NwY1dWWkZIOERNR0Z0YlQyU25TREFCZU83KzZQbW5vbnduN3dBUG56NkNnZ1BZK2t6allsdHJJTkF1ZGVqYmd4Y0pMdSA4V3BXN1JFY0h5TExhS3ZEc0JpWVloc2pKaXlQRjhXQmRNRmtwL2dkb1ZuWmp4dmY5ZmZRYWlBY0JBTTZISGRiVzFHVW5lZHlPMWtXIFJLbVZ1a0IyVEpyOWhyZTBOWDFaU3F2UTJBUE1jTGdxdVlBcFBZV0RmRnNtVVFueG0vZTZ1ZVAwN3Vua0FBZndrbTRyWnNxU0lJY2MgNUZEU2JrWkJqUm1zWmJ0dlJvRk1EdytYYkkvYmdPNTBtRHJHdk1rc0U5WEtpL08zdGNwZk9ZN2wrVzFEcGM0R3ArWUJnUTFKYjJGLyBZVEJoMlYrU0FTa3M4VkRqNWpKTXArR0hJQnppSDhEdHRaaXpmRFFUc3pDcnJST2UzdS9WRWZQZ04vV0l0Zk1OcFhCY2lnWFo4dVFDIGNpTUZicElmSCtJSnBMSWNYVGVuM0JRNjJIVDN4ZmhuSi9MVWZjOXJhTE1lWGhKMk1IVVhkM254L1lBUFh5WThVZlpaQkpGcm1tTnMgeVcxa3JkZ3JlNEtIMDM2MGJJbFhKcUVLV01uMTlEMmlaTXNoUFRvTDVZUHpwak1zMmdoMGI3bkFkWGVBZmovYUxnTDkxdkFNbVpQWSBLclBGT2ZyY0M4bTNaNGZIMnlIVjlqY3hmSHh4TWN3bVhDSElJYzVDc0NCekRiQ2d1MzFtcTBqZkFaOStQdno4QTJCQjZGSnUwc1hUIEJuWjJMdHQ0V0ZZZ0RGc3FqV1I3N2VJd3RkMWliSDdjL3dEd2p5cSsxYjd4V1VqUnhqLzVrL2JSZ2N5OEh4Y3NUT3pjMVBXd01CRHIgZDNqdzc0SDh3ZlBpV2hxMDRmY05WODhmQTYreUk4QnduMXk0TXlNci9qUDZUYVA0aTlzSDczdDNvOElTRk5Tc0N0NTZreVZ2WnpRZSBDV0ZwL1d6Rm9VamNFVXAyYmN0d3AvVEdZUTVuZUNIQTRmOEFBY0Ztek9MOG1SMGxKQ2ZyOSt2MUJRUUNDc2N0MGVLK3BiQmNEWFliIHA5SXlhdWQ2L2NNN2hFSW9CeGl4YlV3bVhCeVRaeDVocVViZ3RxMVE5UUxMUStMUE9Fa0k3K2ZQL1FlQTlXUFI2M2JhdlQyV1VpWk4gankxYUdnaUtQLzRsZFpGMjBRbk9kZlJJcmVPVDV0VmlMc2ZjTFRWYktRSHhyTVdjTFZ4Vlpvd1YyMk1GZ0JmcWo1Ky84OHdZQUl0eCBvOW1OcFpvbENWdENmR0tPUGVWdTY1SnR1MGdyanVYZFBCSXJMdVBwMHhtbjI0MmpVazU0UmlWcFVVaWg0M1dXN05sYm9lQWlMZGZNIHlwTXQ4YUQyU05NVHc2VHlnbFc4Z1RNRnVWaEh2aDRHSWVvUmtjSWRYaHdjK2ozMjR0cjd5SzZOWmh6bXpzOGJBZVAxRy9kZGxONWcgK3dhZnM1b3pYeTBTU2lCN0lzRmtJZGZpY0NsUzZjSzVhWnZ6S2ZEekU5a3g0TytONTVIaExKUG5peTh2R3lKSVBmei9BUFlBSFJWZSBDL0RNdmxBeThyT3FVTzBJWTBUUjhNUGJFdTdHaERzSVdCWkhBUGRrT0d0c2kvRHRUUzBQZ1RrT3pMZnZoRDJ6Wkt1NE9mQVB6OGZQIC9RY1Z1TFM3UVZ6RHNycStjazVOSTJFYUxJOHdiSHMxREtJYkZGcmt5djhBYmREWkVJUFlBZWp6dzg5T3JmYTZIRjRmU2dtTHlmd1EgZC8zL0FPZ2xJUVZYRVpQRzZiZ2FmZmtpSjlzN3lZSmx0MGNVd1hNdmVhNDl4UmJhU1ZNSEVNaU5qbXVQMUdKVzRQSnd6eVczN3d0RCB0YTdFOFl5RXV2bnl2QTZRdDZiN1BxQWJTYVFZcjBiWUJiZ1lGc0tXemc0OHdtQjNDbjArWkJnRDFKSG1MSXg4RjJZemJJRTRQc0IvIHdIUWRjT29TcjFlcDg1eU10VnRHTW5KVWw2dHlXbTlvcHpkQmJaRktzZy9aMDlrVHc2LzI0b2NncEtxMlRzd1cwVm1zbkVnMkU1OEEgUWZ2eDkrNk55bG1TT2NMWm5uZ1FPNzE0UzQvVExVdnhQaWdWOVhGaDArWStRdzh3UFBNUVZKd1F6a05HNEdMR0kyQ1RhSnM2QVgzNSBCUDdCejdxWHN3V3IvU1dOY1QxS0c1WjFTMWtqMmNxNFJLclRhbFlYS0wzUW1CL2hwL3p3NE9mUjc0RFQxbkRkSGtZRHdkdDgvVkNQIFB3SHdBeEt6bUtPcGxhU3lCRHpsSmNlNDdEakhMdG9jL1BQNFN6OXVhdENFU3MybUYxa1FWeEgreHk1OGdmNkc0dENIZFZ0bFZtQnMgWS9OMHk0TWp2bFpadG5nYXBiUjF5b05yQzJUTGlSQkIyUFBGNmVTVXFzeVdST0pDNUIyZWVnZXJLS0VXa3V5NEdjaktuUi9YNmVzNiA4a0oxck50dVJ4ak9NMDhSODRsRnlDZ1ZsbTFIREJxNmxQSncyWS9KRForUUdibkhObjVXR1NqemxHQUpsd1h1MmhCUldoTHhTQllQIHF3bVpxYW5aMG1wVTdZOVdGUlRTcnRBNHFDdEM5M21nS3Y1NU5lQWRabVk4a2drK1NZdEx5ZnovQU1OMVpNZUxXNEZCdUU5RGNJeVMgR2ZMSUV0R2RwWHBld254eXBHSUJwSXhhQ2U0VExWZkE0OFBxYVE2L3JRSFpGWkV4ZjVNQmhIYWszaEJma0Rmd1BnRUhJOWIzUVVTMiBxSzdtTEFXeWllUlIzZ2JXNmZiQmpzM2NjcVV0a0E4eGt0U3R3OW9UQWRadUVHQ0hSa1dyeWRHc3dQOEFmUUhud0hBUUhSZk15ME15IHZ1QjZMazNZazVXOWx0UEZuVEI4dUhGc1pJbEt6NHdodzZmY0VOa2NLM1ZaNCtCQk1ER2IrSE5tWmdlbmpaRWZmeitQSUQvc2ZpTzcgRnNLNk9TZUxCbVg5cUVZK2YyRjlxVHhLRUJBNm1yR2xHT1l6S3JzaUdZVDRmZW12OVBFSEFuYi9BTFZuL21rL2lJL1FhQ0FRZTd2UiBYRTJaR0JlRXFaWGQ4TTQ0N3ZTZ1lzTzIvd0NXejVIcDlBUXlCVGx0STNjRXJMMU8zY2NteDcrenRyZ0E4bStrbTRRNjNiWTVpMnErIHpqZHFTaVNrSno3SVRoN0RNRnZsWk9RRjhYekRJSVpKZ2VydzZyWmEvUHAxeFdSaFJvSjdGeloyMy9ZT2ZIOS9BZFdWekdCOHlXQ2sgelM1U2VtOGxYenNrMndZbzNSelYremk2dmJDaWIrTm9ka2FrSmdkZXdnZ2JBdW41Z3htUXhmSmdmaFAzL0ZmUDdBQTZYMlpUN281TyBoSzJoYWVFbVVqa2tvaGdDMVZ2RU1GSlREWEo0d1FaWWVOa1E0WkRaQUtlcEk2ZVRyUFRtK0RFWkhTY1VrNEF4UHZ4OC9pQXg2R282IFhBREQ2OVBjcWY2M3pVS3lDbzlxems5VG1GTGFTR2lVbi9NTWNiUTBQZUlQYjg5OHlzL29iTVRCNGZSMkQvTHord2FHRVRxVlkzZGMgM0t0RGkvNHBZN3V4N3JxalZjMnRKSFZnMkxpdmhXaTV1dk83Qkw0dmlnUERYZkZGWWVHRDNCUFE4cHF2VkpyUjJzaGhEbUxERHIwTSBxQjdjY2JjSWR3dUMzcUVaR0FPcXdMUVVwM0Jua29yck9IQ2ZObjkvNTgvSCtyVU9nZWt6THJmMEJ0dTFiczRLeURheVg2cnVDd1ZPIEg4b1RMVjYzK3lXUXlYV244d09OcS9BYWpDTlVDc0xXVmw0MUQrY3FMei9hSUI0Q29tcFJzdXd5RG9laHltY3RnVTNURzdmSXIzVHEgb0pBZXJ4YlpYTXFHUGlUSEF4TWNDRTE0eFg3TVZaak5XWXNXemI0RTV0aDkreHd4MkRya3I5Z3E4RFg5ZXZnc2JXOXdXMEhOdGtkSiBHT0ZlekdpbXhNVVgzUU1NbEQzQWhzamhWYlUrNDg0TVZtamQwT2N2QVRHaytBb1A5Z0FBRDY1QTl4eW1UQ1ozUklWeHlQRXNNakVtIHg4UnFwRmVHdjdhSlFMYnlnaE1JMHpaM2t3cXFJQVhGcnlzZ214UUhnNWNIWWM0cHEvOEFndVZoSWJJSHU3T1FLeUR3eWErNzdEZkMgOXFDbE9DK0hwK1pNaG1DSzIxUUxRUXpoaEdKdm1MendaMTlyVWZ0Z1A5b3NNRDc4ODJCMGZUelJYdVhRVXlOcGpiVW10eEsvUUlHaiA2eWhPUlIzdmlwY1BoV28rUGtORElmQTNDcFVkYlpxZ0ZxN010UEJ1N0t1T1B3Qi9ZUDhBdjFKNWh4Yk14MVZTcmtDNzE2bTJReWJPIFlxdFhYb2NxeG5jQzVCMkN5TEloaDZyRHB5SFZkbDBmeXBQclBhNnY4RzdCRWtHZTgrZlFkL3c2c0lEcXF0NzR3bVZ6cFZ2NTJRN1EgSlJsT09ucmxzVk95SVFDWFVvdGs1Sk0xT1Z2TTNEdHloc0NqY1JnbWpLNVJaWnZ4YzcxWGpzQUErL2MrNkdNQ2FSakpnSVFoM0ZrZSBrTUMwQkNVcnY4bW55WEVuMk5sUUZuYU00QSsyclA1NFUrUGp4WG41NnJTUHJNeGRPWldOTEFXclROVllBK0VZWGpPdjhna1BpYUtzIEpEdHB3WDN5SERXN2daQ0hGWHhmVXAxVmsxbG5hTE1HQStFaExVNENmQUw1L3dBQmdWVWVESDFVd1pOUVZmYlMzYmNwRDA4VmxiRjUgVEUrbkUrVUxYZ0xUTUhzaWZNeERzaEVPY1BEMUw2eTh2Z3RaSjJwNFhIRStnZ0Q2Q0F4WHdIRzJFTlNlV0d6bGRJeVg5a1Z4dmNGdyBZN3JINmhLM2ZFM2xHOFdERER1QzJodzE5UEJ0dFlQbThiWmNtMkVrZTdEZk9jZkFBTmdBQU1UQlFmTFJ6bnQxTXhkTlZBMkNCczZQIDlxTTU3dWhMRFFweXNGQmZxeFB0T3lNRVRBUmcyMWZwNWVHTjVlTVZjV3NveHgyTlk0bnp6Qmd3SDhNY0dUTEtxdUhoZkJheWRHaU8gTm14YXlTUlhkRURFbndicmk2M01wOFF3ZHpRVmZiOGkrU1c0NUhOYzMxRzNMVFhhclIrdDVyUzFMZG5TajJvaTR5QTNPcGRzVDJnVyBXUkJoZ2VZNGV0MVhNWUljNnRDTmFXcXlQUEYwTlp4cXVydnlwdjREejUvSGY1R2xIaVBiV1duMSs5MHlOczdTTlJ0eDA1YkI1SVI2IDlNYWdkVDZScDlUVSt3T0JvYjVNRC9FZUorbitsbmpEZzN2VUJMRUlEdzkwRyt6NERrREJnL2phdXlXSXBURDFmS1NleVdRQk1YcXAgcDlTMGJhRFkrSzZicWFLTkZxTDZHNEdkUGI0aEw2ZWoxb1FuM2d1V1lUdEI4ZXJNUndubk8wV3dZQU5nMkMwV29ONFI3VXQyZEZxdiBSMnphV0ZkY0hSQTloQmxpNDI5eWllaTJhdUxqcGN6QzBrK25VM0NlcHY2a3JZUEsyMGkwaDZPbkxzQ25rTDJ4UHIzL0FDK2s5SFRQIEdHWTdicnV2cDJoR3pZSW4weVRHWUZpbFVYRVVpU3d5V1ZsUnlxTUtTVXhLN1FOamNLd1NpdmZINUEveStvSTMrZjQ4Zm5JVW9zZ1cgcmdWTzRBTkdWdkowdTF5U2JWT3dERlNwNWFaWXRYcVo2MEphZStMY3dPWjI4eE9vZHdnVnd0L2FPVGM0MlIyUjhENkNBQThCMkJCZCBreDBzUVdERzNkbFdvazVXb3lqUnRJMWZVdW5VeERRd05ubGhkb010ZnA2M01XNWlnbnpFZDhJV1hUcklNWm1pK0NZeXEwa0phUGdQIFA5b3Qvd0NtTzJQa0I4MGVEYXZmS2ZVcU50NTJOUkxReWJVWDJ4dmxLMXhpNHZzbjBsak1NV1RhQVlIUTlvdmJ3bnM0dFdwcDV4M3QgSjJRQ3Y0bmtISDlUOGFUMEFXNXBDaUt6amJLU3l1Q3haZGNjbnBxeUtnYTF4bnRxSTAxZzlEcnRXNWpIY00yZTRiZ2ZBd0pwTmxaeCBydXN2TkkyaWxBc2NBR0tEWUhwOVI0OGxZOGxXTWg0OVNDSlpwSEVSeksxdWJheHpTWEhQYTR1ekxXMlFFYTJ4MEszOG9aRW1TUkFqIEtzbjhVNkFBRW5BM3RaR3VCbGJlM0hsUUVOVEU5Y3J4dnEvTnJhazRRR1k3Y3ZTYkNqbDRoNG92VzFRNGRlWkdUdFkzMG12c2x4Y1AgMUQ4YjNNb1VKakFSc0pxSHRUWVBQZ09RYkRPMWVQSUU3SFNSZ2VqUXVkUHZlN0ZQR3p0TWJSY2JpaHBwYmZqQStad01PWURENGdTdCBTQkNDWStobE1CWncyRTRPL0FENEFCd0hud0J0L3dBdlBPSitWcVdhcnNwTjNEclltd0UrWlUrMFZlNWFqNkhLUG84eE1od29hZnp6IFlTQ2ljNXlUVjJqalBDVGJ0NEFBZkFIei9zQUQxcys3NXptWmNhclcxR0paOU5HbFBCRU1BR0NaWXpqWWJQU1Q0UXc0MVpNSXpYNmUgcUlkbjFxakdHWVcwM0l0RERtRnBHMGMrL1lvSjgrd2MrNnBORTBjV3BiVHFnMUV2MUdvaWsxTTBzaVFUdnRaU2xwWGZaZ1dsOU9QQyBHUDdJMXlOcVhWa2FyU2pWVFRiVVR4eHZ0TFFPbEE3bGFqOXRxQWVTUVR3SzY3SENIcUVVcVR2SjdVb2RKMUxXanMyMkZvbmR0T29kIGdRejBTMk1CYmgzZ21XcGhaTXdnSGVNV0VDRGg0b3o0VHJQRUdGZGpYNWVxTUFBNUJoaUFyYUV1ZlZIVEZmMi9qVTFNcVNIRjFBcWIgYWdOeEljcVJFMXloeGhiMFN0NHhNcXdQTVlGdHFndUZhTkFobjNTME1lYzRjSk9JT0lERGtDQWdZbjdiT0NlcDJXK0dNTExvMVNMNiBsb2RvM0pJczViajZjQTlTMk13cHI3TTd3T0MzWkVPWi9xV1BnUVh3b3pLL0dSbFY2aCt5WnhCZnZBbjhkLzZTZFQ2c016S3ZpdDBOIFNRN0ltVmZhaEdKR3lhclYyRndWN2xiQUlHR1BEMlF0c2lFdHA1anRMYUFIL2E3UlVCUGhMc2srQTl6L0FENCtmeGFzRWo2YVdQV0YgTlpMTE04Z2pTTTZmQ05zY1lTd2ViSXJ6VGtMZDhxUG1GNHZxYzlJNGlUNlpJRll5ZlVneUtlK2FzWXNNdTJrN3VSZVhYSFgxVjBuWiBkVnA5TnZtbnVTa2k0ZDZpWEN3dFZBOXM3eHRGVHE0dFBjSENadkZKcDYrWWVEdytlY2NCbktPVGI0RXBMMlA3K2ZBY0IzL29rT0R6IElaTFc1VHZXTWthNU5TQWtWL1Vyc3JzS0VMcS9ma044SVZCZG1Ga0lmSDJUbHZ3R3BQV2VMUGd3WmlrdTNuOGYrd1lkV0VNTkY4dEcgV2V1bXVVTUpTY0NxN2pxZG9tQjVGRGJXQnNMVkFCTUwrRVF4RFQyVCtSZkhDMmdmQmhndFhSbG5lLzhBZndBQWdyK0dCL0dxTnNQayBodE9NalJZTXcyZXU0UEpkN1l1RE9ZRk14c0paeFY3VUlUSENaWkMyNEQ1anhXbFA3R3ljRzdON21qOElONC9YL3dDdno3NzBWTklDIFV6VFQ4TncrRWl5TldieVI0bXR3QmNSa2F4YXlmaWpJQjZtZmZKaUNjZkNSUnd4eG9SWjl1TEc3NURFVjIyWmp1QVB6UTU1U1NLOXEgVVBtcDVLdlNGYnJabVdZYUhLNDRvR0dRRHNqNXZDR1BUMGZWTFlDSE9tY2xGdEpUWTNaMlNRZ0JCd1FkL3dEUGdPTllzQnNnV3dobiBrT3d0aFVnTW1wekx0bkJtRHNqS3B4OGFNU0NmRFJMZ3V5Wnc5V0E0NzR5TTNlUVZ3WGhLU2sycDJpNTk0RFlFRXdaRGh5eGw4KzdxIDRFSWh2aGh0aVdRNERaREVIaWdmbEZHUmZUM0NaTW9kOFlOOGJhdmdRYTNHRE9MOXpBWnRKZGpxRGdmUDdCNERwYnVEQXI1TXdQYUUgck83TUxqSXlPNGRQTVZmTER2aXZRMm91cFh6NWdkYitGZTlvUG51UWZEaWVNL29aR3F0MmRqZUw4Qi9YbjJ3UHlXQ3ZFMFlONW9VUSAxeUoydzJTQmY2ZjVIUEY5TVVTQmtta2dmQTZsWTNLSE9rVVV5dFFYaVcxSVAyNGVHNm1FY2hUNlNZVzZXTXFxM25SY2tiY1llSFlTICs3cDR1Vk1sY0RZSWEyR2x6R1JnWks1VWs5RHRUQVlNS0ZLenFBSCtMamdESGZ2QUFGL29rcnVRK0ljeHFiYU1TU1ZCWm8xdFlhWHkgRnVPa0o0dG9ySTlYTEo5OC9oN1pEQytuM0VldEZEZUdTekt6YWJrNHljcTRJRU9Id0Z1Z2NhaTdRMUYwVlpZL1VRWnhkZ081VktxdCBGYnUvY0dabnI2UjhXMFd3Q0xNTUMzWkMzWkVPNENFemZ0SDlTempGbUUxZlRtOG95T2JTVGZBZTd0UmZmZ0hQbGp2aTJCVnh1VkFaIExJc0t4cXJDTDJrZTFFT3YwbHdLRk5RbTFoMkM0TlBlb1NrNjRXM0JrT0hxL3BhZFc2ejM0NE5abk5qWVB6L0FVSHdIUDQyWlZrYVAgY2N1eUlMQTVUR3plTGVjaHhYN3Mzd3NMSEd3bDlsb2o5dkVnTHFlMUpMN0srVGcyWEhpdVRDcERsWGhuQUNtNXRQM1pEdWxKNURjQSBlR3dMeTJldEYzcmtXeUw4T3Q2Z3BPMUUrd1ljRzI3UWJWVjhaaWZQRm1vQWZOdWNIOEVFQmJwK29rSkM2RmJzeXV6WkNaL2lucElFIERha241RFhUUEhsc0MrTUxRcjlyME9HaDF1K0J5RmtvOC9WaFV2MW0zeFpTczNrR0VTZWNXNy92NUIyRStuNi9zVGFxeVQ1VHZ1VHMgQm1KQlpmcXhia1d3eUM1Uys1U2d3L0NuM3g4REdDRXhWdG9oUTlqYm43MWZ1YVBWd1Q5L1FiZEFIL0FINTZvaWlHRkhzaDZwYTNRTCBhcTlWa3hIQlBEc0ZtODhmSWI0VVd4OHl5SWEyeVVPNGM0QXVEYk8zTjVxL25UejNScTVJUjlnZmdIdmkvZE9qM0dLczM5UkVTUWp2IGlsMmlRb2lrN2ZUVE5xVEU0Wis1c3VCN0VwWXlpcHhqSEkyRWllMGR5NG56Zi9ZOWRsbU5Hb0FXbjIxZWFSaFc0RFRTUzA4V0VIZHEgbHNsM1pHZ0MySzc1YWpBeWNEVzN4OHArWWNmTEIrRFQ2TXpjQ0prZ2JzazhIWUQ5UkgvUHYrd0d0enJkWG4zRE94QXk2QzFRNmJyVSBKTVE3Y3JBbU1qVGJTbkZQSWFnWU1HYlV1Rk9yOFJxWkE0S2JVWVdYcG41eXRkci9BR3hQOENQWVA2RGllZnA4N2wxdm5YSUJXNHNPIHlGV3RMQ1NYZm5rd2g4Tm90b3NCRnpGOURaSmxKbUhCZld3ZTRBV3BrN3YxZjNmUmtjM2FLU2IrL0lQUHQvMyt0Tms2aks3emFUTVYgeStWWGVySnFIZG0ySklkcitYM2ZkRTFzb2VVdHVGcHA0ZGJ4bVYrSCtlUVEzZjZOL29hY3RHcnF1N3VvSUEvc0NENThwQWp5S0NIdyBUM0NOTjFKTXNLWGN0TVhqbzVwaTFGMU44OVJKSFVPTTBGeVlZVE5oN01lWllhYXljN1VaOXBER3pseFpDRW50cDYwYUhyNFhVMWJ4IEo5Y1NvZ2VzYXhzbGh0UW1yNmcrZVlkdGtNdXh3OEdCYkJnVDU1cm1ER2Q4S1ZDallwV29mRklBdno5aS9ZQUQyQjdqbUQwZFhmR28gWFBKVktIYlVLcnBZK3NMSWppWEJOUTJGWDRld0o1aWg0ZkQvQUx6M1EyTmt0OFlVSzJac1pzM3NiQno0K2ZQNy93QmJiR1NHM1RvYyB5aGxCdEZLYWs2MFBWTUFmd0l4QlU3SGxKMHk5N3MwKzR5cUd2dkNySUpMMVlUN2VoMVV0WWV1bVNudUM5VldtZlUrbndYcDlIcjVCIDZjTzBySXNqS2lXMUxvSzFBbGthYjNhOVY1Z3FUT2VCVkVlekRiUXVrMkNrbVN5Tm1tSi93SUJHQXF3bm16TUgzRllCaExzNFBpZmYga0hmOFQ3OGZTUzhEWVJwSm5NaUJCSklGZ1hTNmU4R1JWUVJ4U052SENOSTEzYU51b2pBNm1DVEs1bURuYWNsakxGRWtna254TWNiUCBFaWJwZmFlbVpSaFhDOTU2TnN5SE1kOU41NEEyd3EzcG5VT3EyVExYeVZrRUVlWll4U0pLY3R2RGh6QmlXWTJkSFBWL1plOHN5elRZIHYyM3NJRU9jZjJFL3o1QlA5VnZzU3U1SE5GV2VHckZraHE1NGJFdkFDN0Q2Y3Zsb1RGNERwem1WZVljTGh1eFBReUFjSHVId1puYk4gb3VUem5DYXVPVkVmQUw2RHY1L29xU3hhVytEM1hpV3FodHJFb0hRTFpWNmY0K2tKNSswTE5pbjYzVDRiNVNaaXF3OWdPQ3J1RDVWYiBJVHhGMmc4czJ5QXpld2ZxQThCc0V3MlpsZnJsc0t0Y3JnMGxXRnF3NlRMSjlib1duZGVmSXJScUVWenlHdzRvZmVDWmFqQjg1RDRsIGFtR0t6dGU1ZytiRzBkQjJBQWYyQkIyQWtWb0dmQ1hKRmZVdXFibTVqNjI0UmRMVjd3QU5IMlhYTkE1RytvZHBaSWtqZHR1eEgyeG4gQ0tLTVlwemovSFo3ajdpUGl6MHBHbFE1Y1lEQjVwVmxnMVdxekRUUU1tVmpRMTNVd3dKNkNXQk01Y1JrTHVibjZtWjRtMDQvb3kxdSBJdXowcjF5WkJwYVBWSlByZHdVaU1RQXlRbDBGblJQbjBYVGVvTE9tbjVvN1p6aUljYkttWVYrMWFkV2JZc1piS0lqZWZpWklCdDlUIG1FbVpkZUVSZ2FVSnlNaXQxRDBRbEFRTitBY2hSZldXWkRVNlpuU3pxa1FsRHJ0c3FjVEhzaHNLeEdPVzR0aGFxNkZpK0Jab3hwNEcgcG0waFpqUlk3bms4V2EyelYwVFZtckl2bXhNV1NuMmc3dUJKRHI3VVVFczlrQXFTUVBzaEpYNnlEMXpYT3NWbnFWUElROVF0d1dveSBPRmdHTEdBM0EyNGJZc3RCU3M4ZGsxZTlxd0dPL3dDSjhBQWYra2t0cmRtTkF2T3Nxb0haYkQxZndCaHRpWWVIWEhaQ3VyaVJhdWhrIEVOa21Zc2lHNE1udHFBYmFQY09NaXhhTWpkMGZ2QjlCUCszUFQvVnpaaEE1ZDNZY2ZYSmdrdG5zNTJyRU94a25pd1RBdG9MUkhLR3YgdzZIZkZ0d3Fwd1F6bFNrTGF3VHlielYvSm5uaEtTYkIvWDhiZHgrZzFGU2RrcmNtQmVIWURWNUlsa3dLZlczZFBtYWFaQzhIdEJ5aSBOQXVZNEdOUWhpdDJSa1gzd0cyaitWSis1N1dMS0EzYndiOGcvcUErL0g3ajVWbFNKRmhoZUpvaTQzTXJzTVU5bTNJdERHVHZxejJuIG9aRWFBc0pONFRPanBJY1pZUElYRStyR004ZWVGOFhSSTRIVDRvNm8xTThsMTdjbE4yUXRyY3BWc2hUcSt3akZiaWQrdENteWx0UTYgL01USHZqYjRQaDNGZ1BRM2ozclBhL3lwc21KeTNlUUFPQSszVUN0MEhaRmcxZmJXVkFoamM1U20vTDFVVzFXeEJoRHE4bGVybFhjTCBBVzRlOFdSdUFkSHRzaFMwR1k4a3hkeTduK29SSEFBRDREOS9ZQUNsZkZ1cDgxNER1ZFMyUlcrb1N3YzRhdk1NeWs2bnNKbEZ5a2REIFBVTjh4UHZpbnk3Z25vZnp5Q0c4WWxCbG9WZWpQTnFmZG5nLzRBQWY1OTEyT2xzMzVVRmdPR1VVeVhacTBxbmpiWlU3VnBxeUxZZkogVVZlVjJsa1QzQVA4eGt3cTZIOEJQNzRRKzc1UW9UOTNaM3E1NEFWRWYyRG56OTFaU2ZISDA5UmVxUjZrVHNqZ0JQWUV5TzY2Zll1VSBlZG5sY2VWczhMTXFsNVljNFdpRGlYS1I1MnJ1UjhWRWU1WGN0TjdSM0d1dTJyNGVwU29MRWg2akxMNDNxdTA4TGNaVGoyRU5zQ3dsIHNwRnRoRGNxZkh1RU14REViaHZrQmcrRHRqTUxhQ2F6aWttK0RnUFBuOS8yQUFVZzBwZ1hFL090Vk1NVmNrNzlIN1hubHNld2h5Z3Qgc0tXTW5qekZxQjF2alpBeE80ZmlxN21UcThvVFJqbU85bkFGUW53SDBIOWV4UFpNdERyOFBseVlkYnRTYlQ2a0pZSmhKZnNLdDVWaiAwNWNuSkdDSE1EMnJEVzE4UHY0QS9PNHlzMmdMUnZOMWNiOThPQStmOC9BMG1QcE94aC95cXZhcmFmSjU1U2QzQXduSTdZNFZ6SzR1IEx0UStoL2toa2hwOE9DK0VUeXI3MlorVEtnM3BKN3FJT3dBRDU4K3dZSDJGVmFPUUNQYVFQZzBhdGNiWWxjU2kwTnVzaVNMYTdCc1YgMWNiWk9yTkk4cnAvR3puK095cGFoODVVQWVSV05jOWNaeFhUeFpTdHNwTm1jRGZNNVNkMThDNGZMK0xFaUFENjJ3UTdJVzRjMHhoeiBtQW5vY0V4eWJ0ZXpZbkhkSlNmNkJRWDd3QURxZWZFY2dMSUVseWZZS1RZVmcxWFV0ZXg2VE9oNGo0ZVY5UWl1TDVBNDk3RTlQWkNEIGhPVXJBUFBGa0V5UlFvc3MxVjdJYmVBQUFBZkFBUEFIeVFPUXk3R0gxNmtKb2RidUNmcVFKTzdCVXBpMEhldDY1bGJvbXNoQmpXNnIgTVh4TVgyUklQRDU5Y29hd1R4YVBhcTdSNzJQSDdCc0IvWU9nL01VMlFDeVdkbEtSaVN0cVRVZ0x5dk1KYzNUMHh5TFNnTXdldHJjTyB5US9lQnc1YTRQaVBNV2VVQzBVcHdud1lBQUFQNytBNkVzWkZWRWRIY1d5QjJNZWNiVmk0T0xlYU5pdTJoenowY1lWS3h6RlBHWHdmIEgxSXdjNHoybThjZ1EzSHVKeDU2WkMvZ0RhT2VQbThCRThYVzlGTHQ4TzI4TzZHZWl5eWptWUh3ekZrUXpFUDRjN2o5bDF5dDhaMnYgak85aFBQb08vbndEOWowSGc3Y0tkcjY5aTIwTlNiQ0YweUVZaCtTSElMMXdWeTBNSUdNSHhNVnYzVTVpNEIveGVCNUlNWnlndmpMdyBieDJOQkFlZjZHN1lyOUxnS2hKdDAwc2pJeUhnS1NrSzdJMVdBSlczdzlXUlNWWkRBSHJjT1lEdmxnV29xbng4OEdudkl0WEtET2NiIEpzWi8yUDhBbjlnNnRFUXR5czdWVXlVQm9UN3NySFdsTWY1Y2VIZnpCY1llME4ycStVWUlKOE5EaHZqZ1BNVnkrZTZyRDJ6N05XWUogS1NUZlBuNUJmdjdCMW1lT0k3VTB0Nm5abWpRU1E5MzB0NlU2WXBJUG1OTVE3VFdQT09BOTNXamMxTU1ld2dqaVdmMTBoMUVVUzdpUCBXTExLa2FTR2dEbHV0TFdTNFlndGtqVmRIeldPbjRhR21nV1RWRnFERDJqRTRyWVY0V0ZpS29pSlE4V1lQWkp0Sm1LM2ZQaDBlQkh0IDFWb2FNekZLdlpobmRFSmFPSDM0Ky9lQUFkUTlabkY5amVIeG90RGxvRjN3cllzNGFiN0NUMTRPTHg3b0s4TmZEb2Joczh6WjU4RDQgRUNIOURGMW16Rysxd1JINC93QUJmVC9uK2dPdjdjdnl2bkRVVm0xOHFWYytWZlp5VEVUN09xenQ2WWFJcGF1U2t4ZnJma2xWL0RjRyBTZDNoclRaeG5BME5aSnZBUUlrUEdQMS93Q0RzRXdwTURvcFptVEx0QWtFZHE1cXRrWGg5UDNZd05sa0s4cElGb2EzOE9xNmZjREV4IGZtUVR5K1BWZmQ1UXhmR1RwdTBUZmdQb1BXcG9uRDZoWlZDc1hTTVNYZWJtS0tXT05Wb0NPTWJwVkZ5YkNpYk9WREx2MjBMWXd0c28gRS9pb24ybXljalhpcTVxajF4M0JRZG0yTlg5MkdhZ1R3aklCRzF1Sjc1V0ZJRTF1MEpyWlY1NVE1SkVzaVp2Qy93QnhnTm9UenU1TCBOb1hKVUN6NFFJYzM3ZnovQVBsMHBWUGkrVlpCSmpTRU01RG5vY1lUSFNTUTkzY0hLVldTdVVpV0FZRHJmY2l5Rjh1Y3N1bjFMWjhSIGxORkNmQnpadEpCN0I1L2YvQVhMcU96Qjdrdmg4MWpoalVPdnM2eUJOZm4zQWUyZCtBTm11VVhrRGdZbWJPeUR3N1ZQK2VjRDdadWcgeDU3WEhIWjQ1OTlmUG44T2hDOUt5ZklvT3ZaK2FIakt0akhpVXIvR2RoOE1QS0tNUDA4aERaUG1HUHJjRnRIejFWd0dib3JyRE1jQyBKUDdBdi8yRGY3a2paaUVidHc4SHpsa0I4Y1ZXUDVQbnBRa1JWRFpYbDhIaXFyL1c3djhBWFFIVjdKYmp2a2ZqbDJKWk4zYVZodHNHIEt4bVd4TGh0RnRmRlRlSDl5S1RxdUVZY0RPdzg3Z3NqTThrNnYydzV3bEpCNFB5RHY1L3BrTUZ3V1lrQThtMEtxY0l3MWpMb0NRUGYgSWNlc3JJc1pYM1cyazhnbi9EY0dPWXdUSndGd0EyTnlZWjlHOEordjcvd0krL2NCRlE2bWo1Uy9rd01tc2VTWGREVzNjUG41eEN3byBibFhOZ3E3U3lENFlleU9IN2gzVTVoc2JnVDR1TFdTZXllYy8zOTduOWdqYXkwOTVsdFd4blZKS0pTVlVxaGJzSGRsdFhpVEZZV1c0IHV5WEJ5UXhodkZnR0FiYXdWS3FoOXNhVmRHSi9TUWdQZndHRy93RDY0VEJSUmQ4VUhiblY0UmloR2xXTHh0dWJGaml1T1NjWGtHQ1MgUEpSVldTN2s0M0hCeTdjK3ppaldJNStSRGp0VUN2S3pNa1htMVdrNU9hWUNWN1lLcTFSNWN3Q1VMbEhMaDRlWnpFdzRKMFA2ZUJhMSBzWnV2T2VEL0FFa0hpL2Z2K3dQM1RhMWNJOThDM0NtVmRvZHF1cG0ycTlxNHNIZkJ0SHJ6SWVLSkVYa25lQU8rR0ljUDRjNVNZQUlNIE9NZWhUUU1lWGcyYjgvNEZCMkFBQTZDRGhETXFWUG1CVTM0MWhSYkNJaXFIYWtsSHBHR1VBMkZYTVZQY0xJWkptRDVaSHpZS0hYNmsgY01JNnkrVTNVQXlxd3V5YkJ2NEEvd0RvZjZuVlpTcFZTUUZHV3AxQXhMaFBQUzRkZ04xdFdlMU9ObjQyRFp3c0xQTVZXeDFiampCaSAyS0RVVklLSEhXYzBEU1dBQjJ3cy9IMCtrQjZmZXY4QUZoOWE0cEZDSzdiMnp4UjA1eGxmaGJ4azUycXNmYStWL2JqeXo2ZnVlQStpIDVjbVFTOXVFbmFXalVXYzhLRnQyKzRkdjVGNnY5ZktFTlBNdTd0Z04yMlRzQUcxQjh0d2ZGZDNWOTRYMXU0SmhpdDNEa2dLaDJDcFYgVkQzTjh0QlpSbmcyYkNISDRBQTJEWUFDRDA0TXN1NEFSZDJjY21KTXl2aHJzcDBPNy9qSVBLaXhDaWJEWUZzdXQxdTRCK1lOUjVmYiBWWDdNTHRCR0dIQW52c0I5KzkvN0JBdURvcnFWd1E1VmZHRXF5RWdQSjR1aHVHMDlyNVVTeHhkYmorTnZpMllodUVQY1AwWkNheVV0IERIZlB1MXEvbDQ4ZlFjZC82TzJCSHJkWHJzT1pGdmthdmI5ZkZ0U3RoVld6RU1PMEFWNU5ybjZmaW5vY3hrK1o4K3dKN3d1RXlaUVggY0R5alZja2hBYjhBL29FL2dmNmlsWklvUkhtZnFFV1NFdW1HYVd0TUJreDUvSHh4K1IwYkxpU2hhTXZGVVRLaloxdGdBTVRRck96USBvMVI1UFNJbUN4OENIVExIWHkwdHpKV2RHbHVESU5ZSzlaSHlTMklZRlBJSWVvU2JEbTJwaXlBLzBPQnlieXJ0SEp2eGR3ajZDZ253IEcvNGRPRDE1WWRkRDNNaGk2OXFXN0pXb1JTMHRQREpNSTNIVzhXeG9tQlF3d01reVl0aHc2KzROVUJ3YlVjT01yTnBLTXl5OEc2dTIgTkJmcmRBUHdBK0EzOUc4c0tac2hxVHJIenBOWXFSaUxMSG1MQ2VGTXcwUGk4VTRlNG1NUDV5R1FaSndGd1BYOEhKbzNLQ2JOc215UCBBRGZ6L3R2L0FCOXdQQ3ZzelpXOWpLN3NrLzRwSlNTTFlhcGhpV3lJY1VUZHpSRC9BS2JjSzNXOFhDdWJNWUFPTElUck5vZkdaWk9PIHdUd0NDZlA3QWYzOEJIOU1yODNmY3ZiSXRWN0g1eHY1N1RkRDhkTGRZM0xTZSs4VXdBdVI4Nkd5aS9PNWozTmZaaDdXdmhWcGRicjggVXc3RktsYXJSWkxCdkw4SDVvMlBZVmJ0RXF3aGZKS3Z2aTdFTzFBNGYzZ3p5R0lOd1JtZkVyVUN5ajdKaURBSVBuMkRmd0I5eldCYyBCR242clZZRXF3bmFzVWpPQ2Z4QVZ1K0IyRXhGVGVMM0l0a0dSUDFJR0RGYi9EdFR1QTIvRFdWbmRCZ3c1NFE1d0h3RDhmUG9IU0JJIEw3NGtBL2dIbEJiTVFGdU1rYm1TVjdZaHlvZ2x5UFdvUVhFT0hkbGtXUW5oNTJtbmZweklUOHA1d0lFU2VQZ04vd0Riei9RMmpzbEYgd0pGaEN6TXdJUnlvWTFlRGgycXJpekpjb0dKRkYyUlg2M2FnZWgrWUQyU3EzeGZ3T01uT1dqN05zbkNmUG56L0FDQStBUGdDbVZuayBMcXJuY3JlVkZ5enhJd3ZsUXVOdlhCdS9pdWk3UWdWblE3U0pIcDRuYmJHMnA5b2tiMHhqeFpka3NOd0R6VG1zeVl2cTRleUxCTTFLIGtod05uSk5aRUZVRFNBaVlMcVVTK1JFTWl5Y3dEekZ0Z0QyTUJvK3k0UDVmRnE1UDhvNFdqejdmL3dCLzREMHppT1k2S1ZrV2RhR1YgeHVZQlpQbG1BOVN0Rk9MYXZVb29YYlMzOE5QUTRkYmhtRHVNQlQzeEhRK00vV1djNEVDSklOZ1Bud0cvSDJCQjZwK0R1d09lcWZFTiB6eEptT1MzVjBTdDhtd2lCZGJRMWQzbGk0YmdIbU1oaWErRU1JTStydUtyYU53TW96N0draFA2QUFIMEhwa1ZJajVRWVdlbEpxVFV0IGhWQnAyUVpmY0d4NjNMT0ZJdEFuRzJnN2pOUThMSDdxRG9iVjIvUFBEZ3NvMVg3WnNadmhDTUFQb093UHgvOEFRWkVjYmNSTzY0Mm8gdFFrZzNaSHYrTm8wdGFBcDhoWnNGT1JYVWpraTVlTm5TcStsbkRZSkZkYm00UUc5M1pqeUt4Sjg5RzFmcGJwbFpTMnBKcXE3T3g3NSBOWlYrWU1TQ3dkb3ErSlhOTncrWVRZZHdUTElJVFFiYW5nUVZxRTBaRFEyWkdCdXh2Zk5nQWIrZmZ3QUJCWkN1bjZmNStvZzhCdFdwIEszbVY4MU1rdnNPbnA0bUdlN2UzSmFLZVFyZUhXNWpnZGdUSU0vQnVOc2l5OHRIazlsQ0hEbmFMZndBQ290Z1AwelQxOXNZNkR6bWcgRFpxM1ZlcVVQcXJYa2V6bkQ0akltMjA3cHF1bnI3aFc3SXRza053Vy93RDB2dGtBTnViNHI5c3dlSVRVUHdGLzM4QUFRZkFPYU9ubyBXMTBuT2QycVNIYmRSUkpoSUhwaXUyVldMYUN5YUJmQ0FkYnNpdDVrMXdRMnFBUWJRYkl6RFB5Ly9xaWJCLzhBZnorR3dUY25jeUhkIDJ4Nm1tRWpHV0NTWFVkZ3hhS1dCYWpIbU9SWGZNRjdWTVJrUWdVeEV0QTh0cHA1bWQ0ZlFoMCtyMkYwcm1iTStwTkpPVWtpd0FqMjEgT2NoY0JVbVFzak1wRndtTGs4Q1NXM2VFeVdGVzhQNUM4dGdTaVJhT01OZlc1aTM4eUdRaGd5REJXbnc5c1YzeDVXWGdKVnpzYzMvSCBmOS9BZE8xcFpGOTNGMWk3dmdFSk1QMTZreEtQem9hK2ticEt0aVVobUhBd0hzZDhUOXdEMXo1NzVhTXMrVEovMXQ1OEFBZnRnQUFPIGhwZ21DeWo0bi9BbUlNeGRhMG1YWkNxa1hRdlE5MHNJV204ZzJlNFBtWHh2Q3Eyc0Z0SEhCbUtlK25vbWNDRzNZSGp3SDM3QjlOb08gK1dwVXVwd1BmcG1ud1ptdVllcEIza09BRWUyZkYwK3J3R3VxclgrZWN3bWNndFJxdHBmVWdiNVdmRjFmK3R1Nk5WOC9RUUhnRDZFQSBqS2pLSGtWM2RVZU4yV2FXSGNqbDJ3eW5hWmE5Z29zWHJrQ3ViRVBIR2tjVVpTQkM2c2djeE5VY1ZGWXh1d3lYam1iWmNENEJVOFVOIGxDRDRMdEJwN1A0TzlNdTllMDV3Y2E0VXZUcjVVcDUzcHdvdEVIeFBUN1VoMXU0UGtFQ1FmQWUyVysrWHc4Ly9BQUFEWVBvUFFIWGIgUlpHcVdvME03QWFqYnN4NU5rTHkvRDFSTUZoTWdHeHRQWXFMTStZR3Jmdll5Vis0VGg5ZnovbVcrekN5cU16STV6dlp2LzVkUDBIdiArd2NlWFhkcVdoUTVlNlZlRzdhVjZESE5yRFRBQzY4YkNXb3RFTnNVb29ZSjdpdHNrUGI1bW8xRHI4ODFkeTFob0tkcy93Qmt4d3czIC93QUFmQWRNaHpyQkhDM0l5T1F1Z1dTdmF2VzQybVVQa1ZMYUc4QUJWWkhzRU1jWUR6SWN5WVBtNHFUQWVuT0pQOERrOFVlclVsMk8gUDJ3UHg4QS9ZdngrS05LM3BOS2gxSnpVUzZhZmNyQ2JUeHo2YWRkdDlTdW9YNmlOcEV5MUcxUUYrcGZVYjZrQ1NWVmNSTGpNQTRDRyBPU1htTmtBOU40eGkyTHh4UTduTnJhanFQdmtKZE05NnlJTmIvd0RFS2RxeXoxVlNUMHV6SENnV2oxYWRSZW91MzFNQkRDMkJxQnNkIFJjYk5sUzJ1M0dRcEY5Q1U0V21KemM0RlkwZXZ3ekZDbm04K1JMWUMyZFhsVU5UR21NY3RnL1ZiZG54SzNaaUFOZW5RSXRwTVZHRzIgQnlWTUY0VkJWck5INUxocUNwa2l0cnRoQjRVZGxEcWtLQzdoUVdYTnpZd2w0OVVYSDBwcWJuU1BSWGhJTFVVRk80QllGZkdQNlA4QSAxL1hUZm85VGZlSnkzM2YzYlZlZVAvYS9mai9RZlBIbFlQUjc4VjBPd3BRdktKSHMwd0VsUEI2Z1VkM21BVmVzaWxJR0NCZ1BEbUdQIHZpT0JIMXBhamgrTGlpT001djhBMkFBZkFZYkEvQUxwTGF2Y21iV2JnVk0xakdHMkRTYWpVN3dCc2luNmN0U1ZwZlU1U0gyL21MUmkgK0Z1MVBPUU9XNmMrTXZOeUZWbDYvVDkvOWp3QS92OEEwc1ZzZk1zR1loeFExR29GekdlMjdEVDlZb2NoaGNYUGhDYXJzZmJkYlc0YyB4REgxV2oyV3dLUVAvUzlEWnF6Unpac0ljdDN3QjgrL0FINStoNnJYNnpYTFFNTWFRNFJxSDdNRWxQbFRTSGQ0ZlpIYStTZGszeDhzIGl0Mk9laDl5MDVENGVUR2RyOXNPSlBDVG5BYmRQZ0FDQ2ZQOU5sRWJwSnQ0R3NGMUxMRktrY3lOZFJUUEVrK0ViMGJEQTVrR2lNVDAgcEpwRWtoTFN5TzdaWUV2Q1hYRVJsc0k1Wkl0eStDMkxERWhiOGk4c2ZSdUN1RFZwbjIvS2RxdjBpMkNkc2lYWkdwdXlLZnNKUDJGZSBxYTQ2Zzdqek5RbGJwNWtkTWdnY0lCdms0ekRIQm14ZGtvM3Z4ODhmOENmeFBxdTFXRFZnWlF5VmFid3BIcXZtVnRUckFuNXpCTDRhICtDYlFybHcvMVVtT0FkZjRyUEliR3lNMkJSWEpzeU9id1NkZzU4QS9ZRC9WaXFEMUFRMUpIcmV0SzBzbGJyZHkwdXJlb1NRQkpJOXMgTFlFcmZOWDNMWkNlK1E2ckQxdUhyOFBBYlNId1RGbUUrTGpGbm14dit2a0g5RC8yQjJWY251Q2JsblExakdKT1RtVVBHcjBnWXIyMiBMNTVrTHJKWEtOOTRKL0czQkQyOWJhdjRnSjljd3lZeXJ5anc4OTBRbk9UNERnTDhBQUlQVmFNNnVSUW1vMHlSYWxIbWdnamllSnRXIEk5UHZrVHJnODBnK3BqamlrS1N5UHM1aVBNeXh6UnJjd2gwOGpTYVpwbjArQUxUQkpXZ2prMWNjTU1rZTdMSEZZZ2tuZGNsVTd1elogV0xJVldPUmZsaVFDRmV1VGFOcFBPcjYyaHRoR0dOUFh5eUhGS085b1ZKREhwNjNEMmV0dDRWancvVHh1Nk1zSzR0NVdRYVM3Sk5WbyBPL245L3dDZkh6L3dZU1R0UDcrN1dCcE10VFRPWU91dGNId0lGYkNtRjI5aWxPT2NpNGwwVGFiZmNNUmlBRjZlYmo1K3VwWk1uV0xOIGlVTzJmNjdQT0FWNndWLzFWOENZVHVNZG1RdzlqVmZiWXNvQkc1MHB3VzRpK241TGpFbUFjVk81RHhoZ0RtSzIrWXQxZk5lTVdDZUQgWkdmZEJmSmtkSlNkUER3ZmZ2ZCtQMUZ3SHJjeUNxcnlrZWpkUEhaL3N5cEtxa3czeHFvdmhQczFidERhZGhoMmhwN29kUFpLM1pIQyBHandHQnQ0MFRScms1eFdmbTNiQ29qNS93SFZUT1JKcDlPck9mcXY3cnFFUVJIWWpTRjVScUhWcDQ1Skkxd0lZUnhQamxic3ZhSHVNIDR3U1NHSlBTak9waGtVWTU3cEdhRmU2c2NGcHJOMlRpT2hXeUdpbzU5a08xalR4dEp3NjV0U0xadEhtWENwMTVEVFVOaEEyZ2hzRzggUGxKekdRZVluTnZBOTRKc3lHOXN3em13TTJFQUlPL2dPUDdCaGFGVG94UHRxNkdPb1YzZ052MmhXOXh0Y2hiR0lCWk9RNWQycHRUViBXblRNTHJxeDhXNEdJSnRyQ2ZpSFpzSHdYZ04yTkt1MUhxSkJ3QUFQMFA0VmtGdWo0R0RoMGhTaHltcFhNSk5PT0dvVFQyOEpDMktxIC9uaDZrMkJrVDdURDJtaDAvRGVLbEh6N1UzTjVxL2M5OHE2MFFod0J6N0h0RDdIK2hzRzhBNnpyKzdHT3M2bHRHSFBzaEpsOW56eXUgSmg0bEtuRnhkd2htSmlGWkc0TGZCTFE0T0dXS3pWMmpqS1ArdFZXN2JvQmYyQitma0REUVkzWmxjbk4yMm9tYXF1c2dHcXorVHhmbiA1NTZFU29GWGNPNGpjaENNY1pGeHdjbnV2SEltcTVzbXgxYTUwVDdORm85blZDR3pwTnByaUhxWnJKb3JDeUdDV251VGtrZkxyZGZ4IHNoUER1QWY0YngyUGZLNU1FOFZmRVo1dEpTZGdBQUQ2Q3dJSjhBQVRLMnJtTW9ncW1idVc3YVBDODQyV2tOUTBoRU1XTnUxY3lqQTkgRERzaUhaREl2bVBuNzk4UEZuNTRzak43Qm05LzVBZi9BTEIxRHJZdVJBVjJROEJhdFNBZW04cFNwRnBjRHc4dERxOFdqMk5LL0c5cSBYd25tRThnNEkvYi9BTGpTN3lXZVRyT3hoRGVDTy9lZlBvT0h2MDVRNUJZdmkxZFFlbURUbHB3dEI4YTBtcEY5UDBzTWZlME9CcWF2IFdBQ24rbXlHTVJDUkpqQytJMTBVOWJMU0dXN2VHVmM4a2NVbkVLY2ZjVi8xTDUvMGdUM3FYQ2xLa2MrYnVNZlVSTHl6bGhqNVhJWTEgdUErNDVVdzQ4OUxiRTVPc20xNTRta3lCeGlrazdUaXRmeFl0d2J6QitLTVFwdGhRQ3A4YzVVTmNKUjRJSklVbUhJSkNlcmxMQ2xBVSA0ZkRtTWlmYWdlZjI1YldDQThPQ0tzaTJsbTJQWXdtd2MrL3ovVVBqWEJWNGFtMDhOZkdUSkR6eVEySVBhbFV3SmhwcDV0c1lDNEVJIGtOYjRlNEw2ZXE5cjYwK1lNcURpeU04bkxSQ2V6OGZRVDRBK0E5OEZ1dDArOFh3REpQZ3VueHNPQlpGa0wwZ1BwdlQyR1krV2hFUE4gRlZML0FNeVloekE0L0ZxeEg4SFczbG0ydFovWkRaemYzNStmZ0NDL0h6OXE5T1dubTh0VHpmVzJuNFZZc3pUK01yZkpPaFFObUhVZyBKWEZPTUVSRlVqemErNW1LZTVxTWxvc3pWYzArbTRzWDYxQ2F4WnFPSHg5SG9ZbjQzWDRQTVlQU2JCUDFZVjhXYWVUUi9UT0tuZzlOIEVLMTZFcHNrN2ZHM0o5MlQyZ3JtUUNZTUYyWUp0eEk1Rk1xeThSc1RqSkh0U3g1UnlVMkxOZVdCb0FBNUNVTmtzVFQ2WTdxV1dOZHkgVEcxSk1URUNCY0dFT2VBdTR1MElZNkhRNjFqTVpGLzhsVmVlVlZzWXNvYlFNSjRZQkRZUkIvN0FmNllWc2NzZ0N3N2JWVEtON1NubiBhV25rVWtoTE1JamxUaDZWRFQ0Ykl0MVhUMXFPRU1HZTRHMVZ1ODFBK0RPTW80UTJrbktpUDRjK1A5STJaVmJ3NUorL0FaaUJmd3V0IHdsVGZEeVNGeDRYY1ZiS2JmVEZnTGRibU9IbDYvbVZ6MnZQZG54anlyMWV6RTBjNGs3R2c3QWYyRHdBQXcwLzVjT2U0YndycmFTK1cgRWVmMnpoNzRQcktZTGxSTEdjazhlR01NaGpraEFNMVBqQUJhc1NmRnhhTWpZdTNOdWZJT0dMOEFma0UvMUhkRks5MEltanZlaU10NyBlV0dESytBNytHd2ZIdG9uRTVjQ3lPMXlORzdKSzdPaGRkc2NsTWdCYlhYYlpzY0U4ZEtzUHpEL0FCTW1CeXFUREFubTFzWVBodUNRIFlhQUtuekxqK0MzOHhQWkhDWjhBZ2VhdzZ5czdXdGJHRTV2NytBZnYwUGdFL3Fra05rQ2pnNWxvWkpJRThraFZOWHI1d1Y5UGFlTHIgbHNhQ20zMC9NcCtiYWhqNFp3RGVIYXZuRnZsR2kzdk5tK0RuN2RxTHovNkw5eGdCeFRucFlIbHVjcFE3R0R1MFJvYWcrMHpMdXJDMiBCY3FZNEo5cUdFTmJoL0RzYWVRbjJNdC9sRGMyYmU2dXdPYi9BTEFBOW1EREZTc2xpTkNscGpNYVpJRmVwSml2aHdOVElUQU5nQ1RGIGpPVEM1UlM5Znd1QnpERXhnRHRRQmZmSGhqSi9mRmxHK2ttLzJBQjBySEYxMi9VMnB6RS9HTlI5aGFYN3J4b2Ruemw3aFhKSi9HKzQgeVJab1NtYlZrNkZjWXhRKy9JOTMyMTRKTkRSbGtMSWdORElCZ2JscURQUTlTRFl3WE5aMVAvRGFJb2xYK1oyVG1NaUhEVytCNzhQYiBVZVlUR0ZCWXhaQmhLdS9FUi9ZQUgwRStBbVpnTjBJTWg3TlRUcVMxV05WYVNwMmdxOTJXeDhQQVlsWG9ZWmdaTFVEc2hpSFlESmllIHE3RnF1Qm0ydnhoenpadytBdzU5MGphVGVGOWpzQVpYMEF3eU8xZzV4SmRqaDhCL0R4WlFzVTJkZnJpVzRRK04vd0Q0ZnR5cUhXZnEgNHlzK2JiSmpzSDM3ei9UeVpCMTgwaTBIaGNVODdQazlEalZsSFZUKzB3N2s0UWUwNXNpLzJUTVZXdHcyRGlwN3RMQmg3bnRZd1pzaiBzYy83QnY4QWlCQUZ1cTByS0dRVFNhWXlEVE8rTStEWUZHQ1VieXhheGZiUTVOOVFCakdzakRGSTdXUTNsakphaGsrTHhvZDN6bDRGIGNrZzhncjIrUFZhNXN0a2pEYWdQTWp2WUdkZ2pxWWRvY3JDUEM0WTlicXR3V3c3Z1BaQWUzejJwd3Q4WUw0eU1CbS95cDkrUWZQNDcgQnBiR0ZEaXFkWWdhSHdrNTJjTnJkMzdxTGNlVzROQUdKZHd0UTJlMUE2MkhzbmVEbkQ3YXhtTXl5TC9ZOWtOLzVmOEFZT21vaHRCUSB5TDFPTnRsclkyenFxVlVudWhmQklnMkdFTXBZUlFwaXd2aTJZcmNPbmtJWGJSZ1F6a3g1dC9nZVB1RWRnZ00vNzdBL0h6L1NNdnZJIGgwdzd6VmRpY05PRFUyZ1Z5a24vQUxlTEYyemJpcSsxOFpMa0FXak14RHNlTFBESFFOdnFVOE1VZW51c1VYQUc2cFdIc3dyNSszcS8gWU1HQ28ySlFtUWgwR0x5Qk5NN1h2U1ZHWlpBbERjc1lXdHJ0L3dDSnMrMlNnaFk1RkdVTGJmcWVLM2N2dDVzREg4aTcrSzUrdkFkSCBZMHVHTHJySmJWVlhyMnBVamxUVVBMQitMcWJSS2NDQmd3eU9Fd3h3TTJCcTc1NzRqSTNreG05bkt1L0VSLzhBWUFIc3dyUW1PRURNIFNXaktUZ2xuWnR0TWpDT2ZFbG8vbWlqREtUV1hlTElob2VMallFeURBcS9pcjRqSXo0cmpHWTVkZ1EyRFFUNkQ5QnczOCtoNi9iUDggSjBBbExHTXNqS3VKOFpza0FiSUhpR1FYcUNMZkVEV0JNUTlQYmhNVDJDSEFRKzdVNWJXV2ZsRE45SlNYWkgyQis0Q2Zmbi9xWUJzRSBsREozTTBXRFc3YTdCWHdIYk5UNTFoWFE4VldMQWlYSVh0OE5QZktydUNraUV5RGRWd0tRTU85TFBGMWw1T2MyQ0hmNy9pQXdBSDF5IFFPQm51NzFPNzF1eW5IY0NjWEhKRlI0RkZnMlZHZ3ZOaXJ4aWtjdkZrNk1DNlZsZ0xLRVpkOFp6RzR0aXdCejBTMksyTWtybTBvTVMgTmg2YmF1UE5HVFZZZHMrVTVTeFl0YkgyT0hyZGtxdVlRY2FkMVNwODlIWkZrWnp5My9PR3pnTStnNG9QZDBCdjU4dlJ5TFFVaHpiYSBpaDF2T2R6eEpoUHNqNVU3WW4xZkZsMXllNUFZdXd4ZkZXTFk5YlZkUEM4aC9NclBIbmd3WjlKQ1ZXL3Z6OGZRWDQvdi9TM3BxNkpDIDQ2Wk0vRkpXN1BET0ZrZkhKY0dFd3BWWHl3TmN6RjRPeVRBOHorbFVPd0xhK3M3WGFCTVlqMmpWM24vMy9DM2NlcGNlVUlXcjNDbEogdEdoQ1RSbkcyRlByR3ZYaFRaUHIxbzNKZGkvZGdkRER3cXJJaDFYVXNQZ0F6SGFBcHpsbVJuY0lrdkovNkNnZ0FCL2tDSjU4TXRLayBicjJSdVppT3g4OGlCR2Z1eHhPUjQ5dzQ2Y3NHWk1yeUkrSm1wVU4xdGJWMmVPR3pCQXJqRStiNDdaRFJXYzlzcndOYlhHMnJLcmR0IFh3NEYya1VOREtkdm5MVVl0c0h6SEMxQTlKanc5alh6L0l3MWxHS2NHV2VFbTdSZVBvSi9ZRUh6d0ZJVk10dHNDbjdHeWhxMkhUWmogdEwwenBOek5HcHBQVFRvazlMUXlOcUxhSDhRUDh6Q2ZSNmxWY01Zc29lMkRPRW0vQWUrL3YyT0hUc2tXUlErVThxZ0ZzeWRSOUF0cSA1VXp1WVpROTR6SWVGU2xkU290N0FUTElwTXV0VnV1ek1OUE9tQlNDVEdWNEZrOXRSZ2ZDTVFJSFlmb0hIL1VDV0RTZFh4YkFaQmQwIDM4cEo5akt0YmllNUhCMTViYUxhcjBEcGZjQjlrTXEyK0dIQmYyTlNyK0JYSWZrMVg5b0dZNGJ1eEpPQUVGKzMvRStBUG43RHhsWFYgQnRQZ1pKVmwwOHhPNE1iWlhjUnh0bmRNSW5rd3hVTVJrcEpHSmxrRXJENm9OL0ZKRnFJbzhjTVZUSVJuVWtoSTVaa0dSVExkWWoyRiBUcG1VK2wyV1l6bWpUNCtjMnRXd20wVFgrY3lXUkVtaTJoZWxDOFNFTk9mSWEybitEbldoQVZXUW04dmdzWjRUK2dRRy93RG53QUErIE5vY2lZaHRtMTJoTWsxSzIzTlVwWmZRcGcvWjVYMmkybjIwR1RFeGNENVcvRDJwU1FHMVZNY0c3eXJKTjRTZFBINy93RFlEL0FGZG4gVW9qNkc4cmlwblQ2U29FeG1rcFFrZVlUMGVXdDhEVTBOeXF0Z21CM0J3NUlQWkp5R1FQWVEwYkVXaWV5TzdXajc4K1ByNEEvN251ayBqWWxlU0lHWERhQ2FmWTlWcTVpbktjZUtaVDdmK0dmdTZ6VTBWWEMvV3hsdlR6TEl3R05oWHg2cnpyREVXelBKejZTOEFWOENBUVQ2IENBUDRNYVNPU29iZE56N25TZ0tyd011NzNjOGloUjV2aFdMUXNXRWVlRmNTbk93YUZxY1Z3OGMrNiszeFZtaUZxQm9iaytPemtldjYgU3RobnhKeERtS3J1Q3d0aGlxWjVEY0I0WkRwTlBaREZnV284VDAvWXd3d25UZG9MUEJ3Z1RnNEFCL3Y3ZityYUVLM2gwT3BvZGFUMSB0dUE1cWVTNE8zMlJINDBCaXRrcDhoa0poaVlZWkpoQmtzWURxUTRQL1ZDdXpJMVZtOTdxdCs0Q2YzOUJRVDNVOVc2bVlzQnNKTGlhIE5yYzlkTGpHbDEraHc3QVhwa1hGZVBPUmk0QTc1U2N5MVBaa3hReUhia1BXZTFsQ1l2bXh0SjFHSUlEbndEZ0lCQjZhanh2REhjajUgYlVESjJHMVRFYTJKQ1REc0JzY0hOTlhvdGN6V0FQeVd0cmdmTVU4NUFYeDV3UDJ6N3lkekVjSnNpUFVYZ0Q2Q2Z3NllkUmxNa0FYRiBJeGt6QVFySVpDVTJuUjRvWThOdTN5VmxrenlGRktPVkdHUkVhWm1EdkxNckxBVjdIZVQrUjNHUko4SlFyemZQUFN4eXlsbVhKcHZhIGROeDRiR3pxTlZIK1lIUTdnVHkzWnROZDN4b01XaGRscUxmd3pOd2NIYlhEWTdJRjJZcnZoTkdCdTN1YzRDaElJRHorL2hMSzhWL28gb1FxZ256czZ4ek5UWk5CWHhYK1RjeG1uUTRxVnFhT29hSVFXMldoOVNGSnkzOWwyRDRGcHJlS09oWHVUZVRnUTVpRGZqMVJNR0hBVCA3QWYwNStuK3A3SGRLeGJZbGtLUktBNEV1VUFUMWJsbVNNaHBKNU53Y0ljT3lMSTNoUFkxVUN3QUs1Vzl6dmdXczc1ZGdRSnNIdmlBIEFJT0FEcnNJSzZYTElFak1YT0Nja1EwbHNWNjkrT1doMmhUYlozR2NCNkhEWktIY0U2djZybmNQZk9OK3d0OHN3bThXanNnUHRGLy8gQUg1SWdpSVpjTk1VTGlRSXVud3hrYVdDV1JpZHc1WjdLS0JRd29ubngwWTFVOFU4VXVuazFJZFl6RVdmVVo0T0lwSVpRUFNIOU9kMSB1L3VCK09xNVpPajkvc1hJOURBd1dlaVZ4UDhBVG16aCtaV3ZxZWJ1RndxNWt4aVUzTU1vNFRKcUZ5elU3TVhWMWlrR1lJRDF4OHpOIHo4Z1Y2SXNETHo1UTJHT2w1K2RXUzlRUVpZUUJNSUZFalRHZUhMU3o2YTlUaGxtcVQxZHBoR1JhK09IRkpVUlJEbFdLbWlBY0Z3R0wgRlplYU9nejYxcnMvbnlKMDQrVENzR0J5UFlidG5SNWFlKzU0U2I1T3dCWnRiTlpuOS9KK2YzMVllY2dINm1md0Q3LzlQMStqL3dCVCAxQldKbUErQnpGZDhHcE9jMmtySUVrWWJJankzQVVtcVVXVXlkNExnaDF1dGhsLzRMNFBBMXpOWm5rcDdqRWU3QWdSSFBnQUdLRGhmIHV3b09pejBETFBsQzlMQjBsKzFDSko4R3dFSWxxWjlaNGpDYlhYUlJ3WHpGS1BnWVFaSFFyaWd2OTBJNGZIMmZjWGZERkpxNDRmeHggd1BBV0RqL1RQVDh4SHpiZ0pKcTVra2srbXh0a083aHdPeUY0eFY2WUpybXhnN0Rha0txME8xWWJCWkJ6OGxuREJQZ1l0WldUbG83SSBqZ2VBZ0QvN0FBNDE5TEx0RndFc3A4eVczVUxZSWNrcDZacGdHdjJ4d1Y0dHNKc3ZoOE95RTlQaEo3QlQ3d2gyaFBwMU9yUFQwVUtMIEt6d20wYVRCVzZmN1JJTy84L2ZpVmxTS1Znc0pjaFE3VEgzK2F4RmNWemZKdXgrT2dETkl5eE51TkQveTBYS3ZIbHNsODF4eCthOEQgclM2UTFzcGxwSzQ3Mm90bmx5MUgrc3RQL3dBT254S2ZjbG9PNzQrY2ZoaDRhZHFEY05uUjZXdUQ0QzNXWXhvRjZoUm0rWUpJTit0MiBvajl1cjREWUQ2cnZCSDFVVWpENHUrSkpzRFl3MlN3anI0MUZXQkU1bEZ0alYrZVQvbUxkVnpIQU9RbVZ6QW50dk1DYU1UYUJsbUEzIFoyQ2ZsM2dJRDhSSUtDVk9tbUNhajBua3FUNGh5WHlrV29rdld2UUtHUXMyR2VybXZiRkFtQ0V5SHc4UHVDM0JmR0NwVWN6Mnp0Qm8gZWRpTmhOOEFJRDhmNENBQWRXV2tFS3p6VXNEVURSUStvY0RBVzcxVTJCUDFJSzdEOFZ5ZGlndUg4TzdIRFVKVDh5d0ppckJ2QTlRTyBKTlpLZm84YjJFT1ZGK2lDQS9UcEJrTVZTc24xS0pOdHlDQnM1SVkrQTBycFE1am9ieVpEYkxMM05sd2NhYnR4QjAwenRDSFV5dDJTIFRpcjB1ZkZQeU1EaWR5Mk9LNDBhOW1CMVR0clJhbVV1Yy9XMjBPcFUyWXo3VXNpSk1sUGxaWGRLWksvVDlTRXd3dG1HRmJzYTJoNCsgZDR4WFF5Yk43ZHJnYjhmQUgvQVk3L08ySlNkaUhyVnJlNUswMDZza3k2UnNhMmRPeCtqY2l2VEg4UHVBdFhEcjlQaDBPcXpHS2V5UCBGMGorRDhtUm53cFppeUVkZ2wyZG9qNzkvUU8vbjYrekh5WmxXWE5ycGNyZTI1c29DRVUyaTZ5UkNJWXhhQ3dyNFpDR2htRnZnYSs0IE5RK3Y1OVZtSGxtWjBKNFprY0lsR3dtT3diOTdiQWZzelZEVmZWTUg2TUpvRm1YWFVOWFZ1Z3lUU2VrR2NBOHNwVGpCcVVFa0RaWisgcXBEbXAvMjFBc24xclR4NmhQcUY3NWo2VXQzd1lGL0ZBWU1EMi9tQTJuVUZTOCtQeklZbGNpeDduamhUTHdlV1UxOFZadGxySjZSRSBjYnZXQVFTbktpb2E5eWFTc1JWWTE1TjN4VzhoV0Nud2luM3Q0STA3U2RHWU5sZWFMM2FkWDloQldpMmRPTVo5RHdHL0Z2ZTFzeEFoIDBpZUFWa2JMa3VldEJUMCtsMVNVbEpmZWU0c0lBLzZsOWVUT290Z3ZEVDdxTGZLNnU1dkNGeW1uVjJySFQvV1dRa01Nc1hHRUpwV3EgeUNHNFdtWmg0QVBVYjk3TEJzbmN2Rm9aU250M1NlRHlDZmZzZXZzZ2V2aGtPc1pTNXlUbEJJR3cxZnFqU2JBL0hLYXZPWEcrZVZ1eSBHSWI1WUV5ZFpkb1dZanJZeTM4RmNZc25NUWwySFBBSDkrUDFGVVhVa0hVNjdLWnVjTHN0a3RHdDgwZEp0aGZUeVZzSk15S2hwRkkxIHpTWkF4RFExdmpROHhQUTJEbksyekZPQjRyT0FSSjRPZlB2MzlmYi9BTkdOeVU4K3hIWkdmL0RRam8xODVXZUxGVVRadmpPRXg5bUEgL09jZTU0cXF0aFhnMzVzbjlVVy9xc3RETWluSm1VNzV4dFY1VXQxbEhUOGhQU0UvWVphYkZNT0VORG1WWERXMkJiK2V2ei9oakNkbyBhZEVaWjdYTzFvNytBUDhBZ01mc0NDVzZMVHhiUVNuNVZoU1NXbmhrWkJNZkp0U09XdmlwV2hlQTIwbmo1aTNEVDBJdzRMYlVRVDU4IDROajRyakp3NEV4QmZyK0l2QVl1WVhaQ21hekZYS0ExaXlhYjJnbEppRHp4Z1BMbVBxYlhxYTVPTGhNVCtJTWpnUWh0U0d2OTFJYXogdGVBd21jQ2IyOEFENkRzRy93Q3dkYlVveE1BdUJnb1V5VW15QmRtMUtrVi9xaXA5UHNKYnE5RGR5aUc0RUpoaXEyU0hNWHpIWld3RiBKcURzeXpqaWpJMjlHM2J6NkRzRDgvYys2SFR5dUlaVkNQR2tjbTJxTUxkNjh2Q29vU0llTVhHUEh4MFVrY1VyeEs4a2JQTnQ3WWc5IEtPUE1keXp5RE1KSXVLZG1Kb2s4L2lldFJEWUFOSHRWdmdTVC9NTTZleHVtVmZwTzFQaVE5T1pXSWgxMHVFSnRiM0ErQjA5Z0QyTlcgbi9wWWljWnE4bldhejdXZ0UvcjRBZnczL2Y2T0k5QnFhUllGV1QyMjFEWi9UbWViWmJma3F0VE5pMjBTbmREbElaQU95Zk1oMlFRRCAxekExQVR6bjlVTkNOc2J0MnVCdjJEQjJpMkRZT254bDNyQ1Y0N1VHUElkYjB5eDE2N05pL1VrTWdXVzdIRnFjb3BhbG9Xb2hUREV3IHl2cDl4ZGp6M3cyWkdmRmRtSjJwemE2NnJRZC9BQUtpUDdCMVBHRXlHZXJ0UGlsS3JxNnlFeGpDUzZucVdZbmxwaXVldU05S01jd3MgaGtEaDAvNlBBY09WT0N5c3RHSXhHM3Y5VUh3RDl3SEErQWt4REtJdzd3elB6QXpyRXRPb1U1Z1N6eFpZWml3RDhna2ppeVFLa2huWCBDZXNROGF1VEcwYkFacElNVGVkQXFmdG9tamZHNFdEUjY1cDlrVTBocVUyVEtBdjdFd1VhQkllemswUzY1VjhDS0crQjJRek1IaG9NIDlQbm8xUGt5YlFyMW1zdkhzRTgvdi9BVDYrZlA3eWdkOEtKWVp0Q3ZoSzFGZFBmMTdHd2c1RDVoUThwdmx0d3g3SytXUVkrdnNsZEggaUI2eG9hTjdQZFpzM0Nic043Ky9jQkFBQUIvM0ZHUWhZRFJobk1hUWVDS21haHNrc2ZOZkUvdVI4VklmUDJlRlpHOFRDRDVzSStlaiB1RHl6QzFjWVRPYkpzZUw5Ky9nQUd3TUZQS0ZFMkdCWENnZFREMXBZVGFwTDh4d1gyeGJUYWJkL2loK1lVbmpNaHd5QzNWWjRoQXRSIGszUEJvZVdZNWdrNzJmOEFvSi9mOWdBQ1VkR0VqbThuUkFLcXN2SnV6NHJ4UStlZU9nK29SK3hHZUxMeXlQNXFxdnRIN3IvVS9ucU4gbUFrdElvUHZkTHVBazd1VllzaThRbG9hdnpDVStWa3JxNmZ4dER4ZklmSU9LejNDeXpoaFpHZldWaDRPQk44QUFPN3A4QjdIc1JacyBIbExHeTA4QWVtTm9FV1lOcWhCd3c0a0hBbmtobzQyUW1PRko0cDYyUjRxcEw1N0V3VFptZ29NM3czK3dNQ0NmMzhCc0hVT1VRakhhIE04Qk0xNlNjSlV4U2lHUGhoNVllTEZsbnE1WFBoMm9IWkhCd0h1RmpZc0Q0ZHA4WVRGdEc1by81UkJuMEhnUG4zNEFBbmxlUXR0RU4gUEZpNWpiM1ZEOGVNVnU0WFJ6dzloTGpTcGc4eGl0ekZ0YlgrMWQ4V0JQQnVIR1NtNXZLT0VOKzJQMzdmeitIVFN6UnZiTzZ2RzdMUCBKRTFJOVk0RldxMys4VVFNYitiQUFudXcwN0lBN0lqeG96WlNESThpU1dodUFVdGVtbEd6WGR3QlRLeVc1Ni9rMnJBV3hvZVZNdEd2IGRPOE5xSXNMSUx0QmVzYXVVOGU0TWllaGgwTWZEZzRwN2JYTGdqazFjb00yTzBmK3FCaXYvd0JnWVJUTXF1VVl5YUhzWVl0MXZkelUgTllaQmdrbjh3UTAwVHcxUElNbGJtSWNMbUJoVmdXaTJnMlFZekZCWk5HM3VycnNCbmtFK0FBZnYzVW02Wm1ZTHNCOFEzZXZVbXQzSyBaNGVZU0RyMVZ1UUhmZ0xJUGhobVNuOTRYOGE1bnNLR2oyUWpER2ovQUZ4ZDdSOXdCOStma0xud0FCMDVyWXIvQUdhcXJVMkd0MUs3IEtmMjBUUTZyTXNpV25vWjRTQmxHRjlERG1KaGlHdm1LNW9kd3JRNEhXYnhGMWNNWmdiczdKT3dIOS84QVA3QjBCa3pwTjN6M0s3TGwgSUpGeHdkM0pHZUZ0UzBvc2tYMGFsWUFYQzNWV0xxK1FQTkgvQUY4ZVNlcWM2cUE3aFl3eHhsRDBObEpWZTFScWNqdXcyUFhySWg0YiArQk1EMC91cHM1aFBjRG1uaTBQRC9hS0hLTXh3SGlrL2ZzZC9QWWJBZmMxWGc0OWxxOU1yZ2FnYXVsNVNUVGwzRDlOTmthZjFOa2NuIEpzdENVWHI3Z1lleUZ0a1R3OXFkajRFR3QyWVorTTBaNE5KSnQ0QWMrNCtBNStmNldJdFhqMXlEczZBR1pMa0d2aklnTzhmSkR1QmIgaHRTdTdSWE1NZXlURnR3VzBQallNRHdOcWhqSHBYNXlzdkFRMmJlTUFIZ04vd0NmWTNHdFNZWUExWFROKzAzcVdKVW5xTWNPYmozQyBzcTN4UXhmRXhkakxiQWh1SEc0ZGtNQWNHcE1IODR6Y1h4ZWJNKzdYYWMrZytmeHdQZ0h5YWhWVlZFWlNXWkpFaTFCZWtiK1BNdjIrIG5qa3VJeWJMSnVWSzhyR256UDFBa1JuUjQ1RzB5bktlTjBCRWJGTEYzYmdEajUvVjFYMUdXSXljMHpseWZROWJ2YjQxTzNlaHd6aDEgaFhBTGNyQ3E5cFc2L3RSUDB4dUZWMVdRRDl0TFErQ1lKb3JPVVdkOE40YzRBSC9idTVnQTM4OHJQV0pyTjFocDlKNmN3TmVxVlAxQiBVcWxmRS9KcjB4MmZRK1BKdGpjaFcwOWtXN0l0UmdtUVh4d29kSDV5c29iNXdZSTdHM2Jmejc4QVBuL1A5S1JRWHJuRHVhdHFHMHJWIGlTckZuMHBQMVVMd0ZqSUwzNGJTR2l4NGJBSG1vY090N0krRkJ4SHZqVVlHUE82ZjdKL3I0LzUvNzkwdHhFZ1BHdGNSYUY1MVhLVHEgZ1pEZU1pd3ROUVozZkVSWHRjREZjT2VieUhoaUc5bGdIb0ZsMk1IczFaYU9EckIzQTJsYi9pQjkvUG4rcTJrWmdBczVkRWpkWC9sMiBaMk5FVWNiTVZma0I3SEM0ODJqVEdRUmdSaEpYZVN5bXlrcU5oZzBiMis1Vk5sd29Ra2NuS2hjZHhaRmU3bVN6clZzWWxiVnpWZmN6IHN2VjhodUdtZVd5YnBZVnlWZnQ4d09IbXJjTndtdkdKQURWWWNteks1UVl6L3dCYkEvMy9BTno0RHF1elJlR3FUSm1KSzRtMmNFYXEgK21hbXUrRFRzNGxQRnZsT1hJaG1GOFA4UDhrTUNmdjF3UURrMFk4aThCZ3c1c2hzNStoLyt3ZE1GYlhxdjNESnNZeW51ejR1QjcrbCAvd0NERFYyR1pYTk9DZE5CNmIzVVd3OWJ1QWZlT1dqa05WaDFuMnYremIyRTkrMFgrWi9yakVTUWFSZkRWYXVrSFVoaGt6K1czSXZoIHoxZnFhZUNzYUpYS2FIWDVpM011QVFIVDFvNHBMNTZ1WEFtTUYyaGlpN0k3Y0grd0FOL0FjKzZTSTVvcy9UK28yQkhOcG9abXgwOE8geEZIR2lxMU5zK0N6SEY4N0FwY0xZM2YrSnhNWXR5Rm85UlBISnV5U1NkbnF5bkZMc2tsVSszdTdqZldBMWRmRm5HclVGZkJpcGJhNyBZbTdDSDJQUnVvQzduQkQ3c0pyNVpBNThNZk1tTXBCN2d6MkFEWTF3TXp5VUtvM0Ivd0FYSTU4QWZRV0Evd0NmUVlHd0VQTFNOUGRQIHdKZGtFZzRGa0pXRTBKTElIWDFxNVB2aXU0RVB3bVlaRERBWXRUczlXazZZOG8xb1dnVDlnbUtTZFFmdng4QjBlVVhWOTZNYTNEU2EgMG9GL1pHTkpOMDdIckhPa1dGTVZ6eW52MHh4VDVnZUdZWTdSRGc5dUF6M0FZelUyMGNtQjcyN0hPQTcrQVBuK1FQeWZxdERLVlZIMSBPSnJkazIxV0NRcXY4dFgxSUo4ZDNoOE5MVzByMlF3TFlkd2U0Y3h4WkxHQTEvc1poblpTZ3RhS0hIWUp6aC9mdlA3QUFQOEFSR0YzIEVySTlZelRXSzg3a0xSam5JY2pjSkhCdXE0dXhRbWpWUkd5bGtraFdLT1poRkdnMnBZWldaekZFdU40S29CejhraGhpVkwrNzhJYnYgWUZrYXBVM1RIVjFrSkUwWmR4QlZWcEYzVEZkWGg0SG5CZ3RTdDRhMnljZnc0azM3R2hreWFHaHN4UDhBWkRqOC9BQUhBVjhBZ2dCVyBuN1F1UzFjeFZ6YlZzNXRjQU5ialhkUHF0a1lHMWJpZ2RoaXJhKzRWWE1UN1VaTEJmT2VkcFRtMlBMUWhqRms0NnBLU2NBSC9BR0FiIEFmeDYzTWc5UHFDbDdPTXU5aFNhZjVVcFE2M3JFOUlYbHNXbWx2aWg2Zm1CNFllYW4vRGcwczRBUWQ4RFdiK0tCbVdYa0pkaVM4YisgdnYzL0FFNjJ4bXlTTHI4T3IzU24zSFc3UUF1U3Nnd0cvaUM5c0tHa2N5cXRnbVEzQ3lBK0k5YmVQMk1QemtYYUgwYzI3VmNjUG53QSBEZnovQUorMmVMRm1VSkxnNVFobEhGRk9RYk5aV2JGZkE1dndNWmxWWGlDdzZZakc1R05TVEFrZHBhaHVTQTN0cHhlVGl4MUpWQUtqIDZscVFQSkVXNXRKaDZCRGY2ZHBDSFdMZ2tyY3JVKzdJbHlYQVB1QmtMMXhUNWlBaEtvSzhRVHhpejRvVm9FOEFucGRxVEErN0FBUU0gVi9BL2lzc3dQUWR5MG5rd0VpdmJJRzAvQzFhSkR4bkRSOHNPaHlteDhRMC9oOHlHNE1uSGpKd0N3WHhYSmpncUhweVdkUXV5QkhhcSAzNC92NEJBUG9Pd00yVG1LK0xBSCtlaDZlTGFRME01YkErdDVsYnlyc1RiUXMwOUtEMkFZcCsxRnVHSC9BSjV0K2VDY0JpTlY5TnJMIE45MjRPQVA3K2cvZndIWDB4VjlickY0QVlxUmtxVVBOSkRVaXdDVU5wbG1KUUZobEM3czVndDhraWRuM0NuWUZ3VC9tRXhoUlg4R2IgOEg5QlBuei9BTG9PT1JnOGNwWkRORGpNSm95b3hqNXJKVWYrcjRBWTRxRXNjSExqU0pLQU9XT1VPMTdJaDR4N3JpaWl1cjhObDRzRSBjMmpiY2hXelBaN21BMVVub0RKcHVmTGFVK0IxTGFOWk1pRVRMQzlQdHFmRDNnd0dEZk1PSVpEZlU4bXMzSUxHSXlPRUNkcTlnZnNPIGZBRUhxeTBlK2ZsWEJZVXF3S3hHb2RYMlF5UzNESjA5bzlzR0s1RjFraHkxdGdEbUtyVzN5SFY2MmNmS3ZQV05XNk04K3l3aW81dm0gM1B0Z0FQNS8zNlpEWlgrWll5M2ZHdXZLejJSY1hBN0lwMS9jMS9jZW1SYkdyS3htZ3h5Umt1Q3Q2M1EyQndPVDEvQkh1Q29CbkYzcCBaT0cvQjRQK0hQaisvZ0FDbENNaUcwV0pNZ0ZHcC92SlNyRi9keUhBekFsRGxkN3FiQW9lOFlHSWN3T1BNVG9DKytIR1FaN29lMmYxIHNFNENmZnNRRDl2L0FGZEJqS3NMYlR1bUFTTWJUbS9tVkxhcXJ0NU4yM0lBNkdQZGorbnpYY1NHYU10TktkeUJjdjhBRE13M0RlSnkgemFRMkJqanplNWY1SmtaQktGT2hoU0JPT2NNVGkyRlpVUlpkalYrUEtOVTNNZDVveFNNSXhsT3lJUWlKbk0vcXc5QTFrQkRXdk9rZSB1UWRLQlZLT2JnSkt6blFJUXRHc3E3YUh0WFhyR3ZXbEVyRjVaV3BEcmtGcHRKTjRNQ3EyTE94c2FQa0FUWHB2c1RJekZ6MGsyd3BsIEsrUk45RXZQeUZuSkVZWldmR2crcUdKRzUwMmxQa1dmazhjbjgrT2s3akRnY0FjQVdUUS8xc2YrT3EwSEh5WmZENmt1Nkd0eGFUUSsgNklsZkpYbHlGd3BHcGQwaVRDQWVxNjNoaDF1d080d0ZmcFpxY0ZrWXJ0QXl6RGlUellHZy93QkFvT3dkVzA5ZmRSWE1RMmlLWTB1UCBsdGFZNDFaVitOdHF2MkdHbWxHRnlpcmEreUlhMkdEcDlnVEFmbnNLM1psbHBmS2cvdmdJK0JmdlBnRDUvb1BoNWpoYUNHU0ROdVRVIHRlb1kxYkUxdWh6RitzbkJ5cThURUY0a0ZyQXhERDJSdkNxZUhlWVdDYXUwSXlNRENKUE9QUDdBQUFkY1poT2VCYlFuNXJrcTF2YWkgNE5VbDZuKzFhZkVjRU9LN3M3NHQ5azNBT0haT1Boems4ZytUZU05K0ZjWnNkWE9ydHY4QXdId0hUSnlzbTRaQWt2b3k3a0IzZHg0SiBNTWR2YW1pc3lsRG5rRGhndFhrYUtLUXdYdzY2aEpwSkJJZzB6UUxJQnFkTklEcGRUcE5UL2VGN0pCcVVtanV5clJHbFpWdkhqNVZnIDVpM3BwbFY0L2g1OXpMZHNYUlc3czcyRW4wMlVZYnVsVEI5YjZrTlBZY09HcS8yVXJBYmRuck1ZVUZzeFB3bG9vKy8vQU9UOGY2UEogOXFMK1RJbU5GdERiUlpMZnlaUHlPWVBCYVlLVFVoOEF6SEJEUTYzdmdQTXhEd1ZKZ2dJOFB5bTJNeHczaWJSMEhzR0FRVUVBZVBuMyB4WUdaUzkzWG82MGhtdU5TMXU3ek5UTm1vOWUxdlg2NkhmTGEwOW5xNW1KL0pBL3c0WkNaMzRjTGErWXpVYXJsQmhOSCs3OEJQZ0Q1IDgrQVFRQURqa1dRNlFLenVBZStWamFOaFNpU1RZUmlaVzQvZ1pRV1dmRmZoNkd5SVRoalpCQXcxVkxqV25HOXI3TnJKTjROMWNiQ1cgNkF3MkIrUG4zN3BZQ3RHb0NQdlpxbHN1RzFuUXFyYmRSOGU5UFRzcXZkMFRvMlJMT2lJeU03UlJ2TkxIMllVWTFsbGJZa0dmYTY1ZSBlVlBGRzZQV2VvQzFYaEpVaGFyR1crM29ONHErdlh4b3MyR3J2a3M5S3F2NWpneUliNVc3QjdnYlFSRWVuM216S2JxOTVHVlc3QkFtIC9vTDl2L3NmZnVxclVXbnlFZ2dHWExhVys2bGFHSkxadHdjZkxjQ2wzQ1UxOGgxZUhNTGZ0REhwODdrQ0hhbkJrWVdVSnZQQ1RidjkgQmZnQjgvOEFyaXlGT2g2N1BqMitLMEhxY2hvYjR0bG1EVHExRUtjTUhnSWx5QWh4NWlaVDhNUE1UMXV4bEtybTJxNFpQdWcwUFBPRSBtcnNBWUIrUG53R0NEc0hVT0xaTHdRMlRPbjZhUTVMSlk2cmY5NGgyMHJ1OEt4azFUaWxKaS9NVzRlQWRidEJiQjRyODg1TW8wVzBWIGZabStCQWV4OC9BQUg3WVQ0RHEwWFBjRU95KzRVMjJoYVVPY2J1bmtsbndGTXZnYzg1ZUJWUGF0RzJNaXd4NUt5eU5GSkVqbkROV1cgS0NEUEdoUllpNzdRQ1RZcklhQWVVMFpNcXl3OXRXZGIrU04yOGx2RHU0eW9zdUxLcDhoYWkyeU1qSncrWkIrK0txM2NDTjJiWmlZTiAzTnBKekhnQi93REVmbnpaYkg1ZGZCMDlrbFZqR0Foc2thWERHTENZQkxJZVE2eVBSUSs4Y3doek1HQndnejAvQlZtamJNeGZCak41IHRKQi8xOS90OCtINm4xOWZ1a083TzdHcXlhOVBFdHBjRU81cENPWVBXMHZPVFJEWWVTSjh4a1F4OHdIOXRhbVFtekZFTmxyTUdrdTEgWGNCUGdOZ1BuMkRZRFZHaFdmS2NLbFBBWHgyTDJEbEcxUUFIeVovQWljcGhqYVgwOXd4cmlyRnUxR1JnTWZBWUlPSWNvVXJCWHQ4bSBETnUyT0xCVVcvc0FCZ0FiQWF1clF4aUNONDhzc0JLTUhockM4MDV2TzdIY0t4dm0rQUs0eU03bmN3eHJHRGRRNVZlRDdpK1BudC9IIFhKYURRVUZ1amhSa3FxMlMxRTJ2VUNuTFlUMnFNSlczTFVZa2JwdUQ1OHd3eVExOHdqbnRONTZEanRpdWg0a3puMG5BQmkvQU9mZUEgUXROZDRMNmt5Vmk1VzBreVNVVXhKaVZlN0VnOWhRMEk5d09MTXZENmV5T0FldjJTY0JJWUExc1p1bUZtREFuK2xaL2dQNy9pZUFGVCBXdnRHYkRQVlVrT3J2bkR5UkozL0FNYUc0V0ZNZkZkSWN2aGo1aUVIVDZyTUQzQUhBNGtxMlRabnNyK2MzdWt6bXdmdit3WXZ5cnJlIDFId0FEeVF3c2FFczVJbUxjdmVMVVIzZGtjb3JZK05FTWZETTNBaDRMYmdIT1R5QUpWTWNHNHVUSmZTZlBvT0lFKy9iK2Y2a1pLaFUgQnhkRVRkWHo0SmFlZi83NUdaeWxjWjQ1SDNFV1ZjaXdWOWx2NGc2NFZWWi9MV2ZhRDRvVU9iNE94OWJxOXExUFZlbk82Y2xBR2lrOSB0WG1BbGJhdXZiODBNS2ErUTk0cmQ4NWdIVHBrNVRRSzBCY1padHJHTElNSmFMdHYrd0h3UHV3SUtDTFRHUlBucTU2QVpKREhiS0pLIFRDcjB5MUk5M0dKUUFTTEYybzRHTzZsSmgrUUJ3ZExPRDRENHlURnEyNTQvZGdlLy93QlFIejRFQngyZzJkZ3VTWFRSbXJwSnlhMFYgUWxlcThPemg2Uk1HU2hJRm9tTDVod1phZlE1Zy93QTh3SVR2dWU2Qy9ZNTRRSHY0QUJ2NEEvMDdMTWgwUFh3LzREUnFvMDhUTGFmVSBDSmFMSUJ5SllkTnNaVEYyaGdRbUJ3OWtieGFFTkhiV0JTZ3A2d3pib3NvcU83QmNOLzd1Z09QdndIcEs2bU5HaFI1VXoxcjZpWFRxIDhXUmxrM1JMUGdwZEpJWTAzb2dpU1I4Y2tNd0xCWGZUQTdzckIwVFRKREhLVWF0cU1aYktuZzVjQ1FnOXZqOTlEN3dzMWNWMGUxbmYgNmxrWkQ1cU5YN3prWkxqWEJsMGpLMWlSTUtveEp0K0VKTnJxR3VoeHhIMUh0akdyUTBqNlIyUHFzNDBkOUdJTTk2TU0wMndlb1hjQiBnT2tZZE0yV1pjRkU4THV4YnIxWHBtdmFmMUNHYXZpbHE1MUJUQ0RLaHpMc3NnUFI1amx0d1ZLMUI4RVlvci9vN2hOaUFQd0Evd0RYIHord0tmVW93bmJCdDRGcmZPNmhCa3c5bmpvZnFFWThjbEFTMjYyS3hnVUlNeVFvaUdPdFNHOXJ3TC9tUi93RG1aaVMxaDZmVUZOcjIgS0hnd1lyeDAvaGIxdzAzMUl1U0VsTnJwcWY2cmZJWTJaZEYvWk9zaXZZWUdwWWxudEFkZm1YdTRwN0l0am9Tcldkb0tidXRyQXpGOCBHYzVDR3VjZ0FCL0UrQVFmY0F5QlpJMjlTZWFaSlpwNUFESHVTQkpKZDFJbmt6WExiTWhVTmlNckp4WHBidEhOSk5LVWhpV0xhaWtDIGtoNUhqamppYVZFcnZ6RVlMTGtOdTZ5Zkt3ZXEvRDdMVXlXdzJjeU5UR3ExY3ZWdjh4d3IxYmFJckRZL0pQbUxlOGRreDlxUWY0c1AgNGpIekJaRnREdzhuT2JPenlnOGY5MzcyMkNzWlNxNzRSdzZHazF6VmEyZWJjNk5ML3dBRmtSMGhEK1ZFc2F1UTQ5UFd6RElZRGo2ciBnOGdBdFRJVEdOSDFsSDVzYjU4QVFRRDlidm44WTI4RWNkY2xkMTdhR2FCTjFpVFc3QXMycHlTZlU2OElBeXE5S0ZIQmZ2aFBUM0JiIG1ENjNCVHlCNmN5Ym1ydEN6NXVyZ213UDJIZ0g0QUFBV0tTeCtvUzh5bWRYT2JuYjlGc2hiTER6eVRmQ25aRXFtMTRDcnVEaGZEaDMgNE1PQkRsU0dRQTJwRFp2RjhtUjNaM1NmdjJQN0FmNkdMRUlxSzZlcGtyaVJ0dVNLU0dWNDNSbzZhL2FDRGtQY1JYYlprdVc5dVBGTSByeUpISnhIVWJSdWV4a2p5cU82YXhiWFMvamxWaDVBdDNPSk5scVMzeHN6eEozSU95VHlFeEt0dVhZeFQ4SjF1K0lkOFRNRnVlaHA2IEhlQzJzczFYMDN1ZjNiei9BUDFmdmNBQnJkRjJSY0VnK0x5czQyQnpiSXVPdlE2SGN3ZVhEcVd1V0U4ZVQyQlBNVlhaRElZSWNWN2cgY3FUeWF6MnYrajJpYitndjM3K0E0RDAxTXpUbkRYS2JZNVYwbnVLMjFZUnRocSsycU5yZUxNRnhTejRydzJDWlc5a09FeUhZRU5IUCBmQWhMYXpqVisyTEx3RUNKTHh2L0FOK1BvT3dkSjl0YU5VREc4V3BsUmM2clNRRzFCbE9aK1RUS08yWXVTYnFhRjZqRnNmcHZUMlJQIEQzd1BNQTYwdUY4VlUvYkxrZldaWkIzWWtoRG13QUQ2Q3dId0FBK2NTb2pHUGNobG1HbVpKSVNZcEVUWkM3ck9YbGppbHdEb1J0U1AgN2psaGE1Z3JaTkR1cEtxSTRqQjA3ZGtjYlk3YWlQSGpIRnJKYnZ2d3RjeVFxck5RRmRJNGVlRnppSWRJczBMWnNkY3ZMUGlCNHF2WiBoL0ZPZjF4OERUVU95R0Z3T2ZsdHB4SkxUNHJlYzk3cnF4QVlBRnVnQUQ5c0dNbGxnMStVVW9jTTcyRlJWZWxMSXRwM3JZeGJWTHU5IGJ5anluYlZYOGdZOEdSa1QxdkdhY24xL3lwd0pzeXgzZlJuZkQ2T2c3QWY4K2dkUGZVK085Q3RiWmNWQnJKM3BXTlRER3BjcjArTEQgdUd2aEUwK0FVSU9PdFFQaWlHRzgvTFZKK0xCWXo0ejRxOVhyQ3hoaGc3cEhBTU1EeStmNCtBVFVoVFczRzJBUHRrbkVtZ3JDUUhkbyBaTE9ZRjRPVWl4SExqZnpGc3V5R0dSZm1IRkxpYlZ4bmRCbG1FM2ovQUZVQUlQOEFRUDJCZ3VOcDNqY05IOU84cVNKSEpsdTQ1eHZFIHgyMlZZM3JjRFZJamVLR05rOU5rMkE2aUo5MUJqdUtWeHZHV0dWZWNtcitKaDRQdUorS0lvaHc3RnFWNGFvRG1lSlhOcExoMjA3bUsgcnF1MkMzQTY0dGc4Qmh1REpNVDN5R3lkeUlGYUVIdzRoTEwxVjZHemJGdmU5Z0FBRFlPZmRiN0ltSGE1ek03TnRETytaQW1jVHZnbCBaMWJ0a09MdERSOHdmRDRlWTVoeHNIQjRIT2ZDYnlMdEFaN2IyYk9uMEUvNS9IRS8wd283STZad3M5WHhtNEgvQU9lazJrdTJBK0RyIEppTGI0bXJ6UktUeUlka2NJY09ZbnVFNVN1QURPaDhaRjRvMitjS3E3OWczL3dBLzBwWkdPVUd0eUcrTWN5TnVpMmJVMkJiemlDUjMgR1RlNDI4RVdSRFE3SURReC9ucVBJUWVjL2FGbkU0RVNMUlI2aWZnRy93RG53SFFrcUpacE1hY1F4NTR2THR0dEExaEM4anhRM3VHOSBwVnlvWjVZcmlVSHFHT0lkcVBNY1I3c04zQUg4WlZpUHhadngwMm9jeDVGcmQySWJiWG9RbFh5VGFLUThPeWVQaDNCeGVKejFEVCtCIHNuekpZOHdxd0dFOUJNRTBhaDdrL3JidWxoc0I4QWY5dVA4QVM5NUJDY2pqSXBVaUJrNU9Va3V5OVY1N0pxQmhMaTJoSVRZdk1FOHcgWWhPQ0p3OEcyajN5ZE0vYTJabSs3YkpzR0tDZlB2M2dKSkhPYWpHMjNMSmR6Tm5TWmtYVjBTM0J3RDF2ZHlmWXd0c3hhTHMyZFByZCA4aHA2Zk5lS1dZRU5xY056cTlYZWRqN3BCRWMrZzcrQTREd0xyVE1kSnJhdDlxb3RQTnVGM0V0U0REWCtjU1g3WXRWTnU2c2tQbmxmIDRoOU1iSlNabjRlL1lOdHFHTE1lYXZmTzVqd2I3cEk1L29VZktKOXh0Mlk0bU1RVFZvNW83eHpFZUJCcVJaWTZMRWRsMzNVc1phbmogYko0TXI5Y3gxSkRRajdsT2ZFWnVwWCszczdXdmlIYUYrMktIMUFWNnhtUnVKNXBEalZQY25hT0pmRTBCTHU1TlpGOTg3cVdwVzkxOCBic2J2QlBWUTZNVGFGY1lMQjhKZHVmVzc5KzJBQmowbjRaeTNDakpuR2FxTVZ1WVBUSk1zUFpBRkg0ZVV0cGhpL0Q0MjRUSENZSEh6IEoxbHI2aTFCK2M5ME9EUEJ2aEp3Ky9iL0FGRnYvSUFGNnBBZXpOT2RzREx1YlppM3A3cTk4a3RxTzdad2VJdHREUXZTbGVxMkJ3N1YgektyTUQvZ3o5U0dBTlFXVVpvYUJuKzlqaUNBZmo1OStmdGc2U2JKbVVXcEw5Vm9jVlZqVzFxZ21YR0pzaTJzNlJjWWVwYTUxQ2FYMyB3UGFFeFBob1pkOFlBN3gzUVBZTGF5TVY5ekdITmpka2QrQWZvQWZ0Z3QwTkpKQk1qYWpUU3pUUXZnb2VHVFAxSXpqTWpERVZ0eUJvIHd3Snp4TFV0WTlUVXJQRzBNTXNDWnJ1aGcwUHJzWGwzMVk5L3J1MGNxTkk5eDFrdmFiNkZiRUYwbTIycFQ2bFE5ZWtodGxua0NzcEEgMnZVK1ZnVWFCSlFwVmFlK3NqaFNhSEQ1NThCQWJaMWtFeGl0dWF5YzdvMWRnZjRDdm4vWS92NnJrWmNORFF4dVUwVEgvSEt5VUJlcSBjYTFFSGNPME9TblV2SkU5eGlVbVltTXBDWXFnYS9SUEprNnY0TWpBN1JTVGJ4L1g0RHo5UkFIWVUyT3F1ek5acHJ0dnp1SGRxbnNEIFdBdG1FZ3hYTm9VZzBIcXJIaDdJcDR4Y0hJSWRqY2VBem53bU1GMWVzakRqdHpZSGkvZUFxTUJzSFViSStQYlMrQnBLQk1DWEF1TlMgbE10QWJEcjlIbWFmWlJZWFY2ZTRMYklHbXNrSWd5SEFOZ05vTVBXYlBjbFg4bUJwTlhCUHZ3QUFmNThmNjFibnB3UnUyODhXZUV6QyBwQm50NVo4blAycmo3Y2FQbStFcU9kVGh3SGRGTVgvTTI3bzUyTWF6UEdKOCtiNTZuaGRxUGpIVWRlMUtuVlhwTDA2Nm9BNXUrYllQIFh3cjNHbm5yR21hUUZka2NERGhXN0pNaGtJZUxicUFyT2Q5NTNRWXpjMkNKTlY0bjBFQnNCOC83S1cwTFlzUytYQU9VelZzYloyYkQgVzRpdVNzN1R2VTh5TEtYa0lYL0p6R1F3bjlyNmVha01oQU9Zck52dERTekkxVnBQYTQ0QUFIMzcvd0ErY0VldTVGTFd4WjBXVWVKYyBqeUpOZTJEZVZQdEFsa3U2S3BsS0h0UWV5ZGgyUU44QXhCMitCQjROK1pPVGZkcVRPZnYvQUdpQVArSFJIVDkwVS8zczFRd0ZjYS9xIHVwc2t0MWxUNGZ0L1lUSktWMnpTcTBHUjBPMHc0ZUc0SjYzT2JWOThlREhpeWpNaXBCdWt3Zm4zNjNkL0FmZmtTWWFZVFNOdk9nZUYgSTFqL0FKRnp5TEJwZWJqV2hzeDREYkpmdWJMZzR5K3BJamlpVU9FbGxtY2pOQkhGR1pDMGNYYnQxZ1F3ellNR1UyTUtlQzFBVkhlaiBScDdBVXZiOE1rNGJNTkVXQkRkNnZFNC9GWVVPcnpEaVltVU9ZRGg3QVpLNXJTd0lDcmFpenhlMEZvWThkN2VEb1BQcmQ4QWYzOTF3IEczVTNnZHZpb0gzUFdyVEthSXd1bkF2YWQyV0RYeTFwOFBKS3hiUzBuc3dlV1hwK2FvTi9iVWh0NzI5Vm8rUG1IZFEzYUtRYnQ3SGcgT08vZWZwUlY5RDFQWTBOa3JtS2g2a0tycTg4U1NLLzNJZllWY1JRTm03Q3RweGlGNGRQcjliQmN3UDJOTS9GNVhhM2czL1FQbjhENSA4QS9nTE9CNmp1T0JSZGNha1F1Y1NaZm1LZGhCaHg3dWFZcEhVWmNWTmdYQmVxeVpNTU1reHd0Ukh1aGdudEprWU13RjJZekFqWVc3IE1WOS9BQU5nUWZmcGJSS1pRcGVGSm90VkpLalNMcXBZeEhyc0ZHRWs3Q0pwQkZES2tzY0R2dDdpTkl3R0N0bzNua2pMUjd4U2FIVGEgZVpJdnBWQWZSeExHSFAwbU1ZZ1NRcHFETnRSNFF4ek5nK0I2cDhaYUErb1lxUmZWWC9oL04xOEJjaWROWFlialh4WE9xUkxEUnhrdiBPa1FxN1cxQTJwM1FReXhGY0RaOEpPZ2tmUStUUTAyTUp5dUxEZzZubEF4MlJuVGN5Q2VxdDNGZzh5dUt5cW5OVGxVUEVSd2NaTVZkIFUzRTRNQlp4ellrTDByazlaYlFLNldERklYcmpNUTZXRUJCUmtPS2F5d2NRWEN5eEdHVDZjNjZCZlZNYldMSlNiVTVBV0RqUnJFMWYgSEg3UDVIWEVsWUxMSXNnMG00c2pxK1drRE5tcll0YmI0czNkbWhmY2FIRmJiWVpBYmtMTVdOUFE2bGNMR3pxQnFlK0tUQW83dTRLOCBWc1o0cjQ0V25aQmhsY0liaE1hdTZGbDFYOVp3ZkNiTURTZFVUdFZlQ0NlQUg3ZHhRZXR4Q24xNDhIbUFSZHBrcVoxQlExdXdzRW1zIERIdnFNUE1NcG5XeDVnd3h3M0RtR0FRODRJaHR3V1ZsV3REQW04QkxSLzdBZllLaUFQM1ZuRlpza1Nxbk1aVmZES3V1RHVkcHZlQ0ggK0NZTE9GY3VUQlNOYzNZbnd3L0pObnE4UEJBRUxhYXJVV1hrb1V2SVpnYjJUNzhmZmdCOC93QWd3UStNeXF6eklCVjFkRGpaTGM3UCArSTlQNE9XRGxIeTJOMDRmTVd3NjJ0N2dIK0JwdnZqRXp0alFVUnVjYzIvUUJ6Ny9BSEIxaDBrMjdHanAyN1hva0Zvbnl3QUlhNHBYIHh1L0I4ZkJibkhzYXJUN1RNRlZ6REk3UEVWTXNRRjRaRDFZVnpxMTVIam14eU9xOTJBdnVpa0wweHRvWWFFeWJrcVdOZksvYXR3VnUgSmZFTm9kN0dUb2ZlekY4N3FReDVnSDNBUTJvUHlZb0xHRStiZjUvWHdBQStBUG55UzNMSVpKUkFPTGZOUFp2VDIrWHh4NjBKbGtXQiBMWkpTdVdwdHlXeUhBN3RoaDA5eGNPOUsvQW5XUXNNdW96dVpadHFYWi9YeDgrZjhBZjZ4a01US3FPTlZhZ1NiSXQ3Q1MrT1ltSjloIE1oUjhFT1ZjNHNGYnJhR1ltTWpBSCtBUWdRY08yWlRkQ1J3M3ZZTS96NCtmQWJCc0ZxRi9McVNmRDJHVnFjSldkRkpTV0crQ1FHOEUgakFEWXk4NVNnL0d6Q2ZNTU1oQ1orTDhIaGs4b1U1TWNxNDI3WWdOZzM4LzdiQnJZeXg2cUE5d1NPR1NBcys3TGhINmUyQWlReVJrciAzMkpVTjJNTWU2OHltTklaSGpqaDczM0h1TEZCSTlaTTc1SEhLaGlNVDRQU1pRbm1PMFE2OVhCZE0xS25wb0VJSlI3SXlyWXZubVNIIExsQVpnK0duMlFodmxrTUNHY1VoNmtxM1l6ZHI3a1psbzRFODRnb0o5K3QzWUFHd0dwUXhsdTl1UGk1UEdraytWTVcyd3dxdXhoSWYgQ2xTc0lzOHlNQmhEcmVrMlNueDRlYWg4U1I0WlBnYjV4azU0VGZ3R3diQjUvcVQ0dXRIay9KYldNd2dXRTduNDFlMSs0V0YyOTJ2ayBJRk5XMkNHWTA5dUgxOFBCUE1FOEhocDZadUJyUDczaTg3Ky9mZjhBcFNyY3hDWEVNd3VUOXlBU29hUUpUMlE4SFhsdzhoOTBEejR2IHpPUnpJZkg0YlZBc0E4RDJ4Wi9HWk9xLy9JUHYzSC9QNHl5UnlNSWhnbmFCSEJFRmpRZzgxR3NnalM3SHNSTXZ1dWdWMXJJOUJaQmsgN0k2R1ZqY2o1R00yN3NESStOY0NTUnFKT09OdGtlSWVaWURIVzU0ZytyZURWVjh4a1U2ZkpYQXZ5NGRJZ2FjUEFaaWZEWkxnaDF1biByNGRIeDAzb2M0d3NzelJhQ3o1c0o3WWJCNEIrNmtteXNuZzg4RS8rSGhROXdVNVp6UUhiUklkSmh0TVF3VW9ld2hZRFRmWUZ3VExJIE1Na3RnaG84QmYwMDdQd1pvVi83SmFQNWRRVUhmOGVBZ0FtTzBFSEp3ZG54OGZIZFZ0QWt5V0VIU1h6dGx6MnBWTlhpaHdDM3ZBZGsgRC9NcmtDd050Y3JReFo0R1RyTUhWM0NhckFJT1BIejRBQnNBR0hydTJGZXY3YXBaRGRuOVZTTE9xV0luMFBNMUVGbHR5T3IwVVdZSCAxdUhzaWsyUVBhQWZnWkNmT0Q5aldpME5zQmhNTWNOZ1BnQUMvdjhBaDFxbmkySTRYRWFaMUcwZW1kYzl1U1NncE10ajFJTVM4MGVBIHhpRHlaSGJ4Yk5FNnM3QmplVUlsRTNKTW4rWEQ0eHYzWk5lVlVLcnEwUWlPWW4yUWVYTmhkakQ1cGR0R3ZVNDhOajJFbjIxZHp4ZkUgcFBJYk9aWkxVaHVFeWNlVHoxcUo2eVRhS3ZxRGZEWVJLT0FENS84QW9FL2owbVZkc1Q0ekpZUlJjeVdUQ3REd1N2WEJxaHlKY0tVTCBpU21nT29UTElEcDVpWXZyVUg2RzhibU1LTkZaazk4TjFkOStQNytBNThmQUdEQlZZUFRTbDFVdVh4TU5ubVJKZjRsWGtyK3Erd2tJIENyTHpSVjYzYUhlQVBXNmUrT0NjY0EyaDg1YlppZkYzblkrYlhaejdZUGRDNENmNmtjdXlPMHR1Wkl0Y1VIYjVXY05iSTRjT3JzTlAgdVVvc21pN2dYekJod1cyVkRIekZYY0h3NG4wYjR1b0daNTgyRHgvb0grL3FqaFk1OXp5S21GTHAydXF2WUxtdU5uMU1lRG5tZmJqeiBSYmNwSFZIeTdVTHJrZHcxaWk4aXR5alo1ckhnRTlRV2E2QTR0WjUxSXBDMnBHTEJ6NHp1SEFwRmdGb2I0bXU1NVh0Und0U3QyU2szIHd4WC9BSUJnbjF6Z3pMS0hxTVdSaHp6YU9nZ04vQWIvQUwvMEVwYlJTZGMwR1lzRW8rVVM0WnBoYmxrTk9xVGFDUlpHL0NISkRjSEcgSEQrSGZBZXIrSzJXd1V0OHduZVpSRDhIdlp2dEhzRnUrQVA3KzFEREFMcHZNcG1Menkyck9zYW1iYTdQb2RWOGhUOGE1SzF6YUhjRCB1cERaUHgrSHNiRk9nY2IzTVdMSjdIc2h3SHlBQi9YM2dGTEh0MnYwalQrU3FWM0RyY3Q4Vll6RElzNDg4TUljb0JZU2o0NFdBNElmIDRyWlBodkZhV0FwVldoMW1zaTN6Yk5rZHNNVDZEdjUvbndEclJHejJkd3VpRFV4dVhSOGFEaHFCWEh1UGJ4eU9pZm5FRGw5bllpWDggeHFWeEdYK1RuNDVMRTlvSFFITWo2a0txcXY1V2JEUU04eXlhaDBqdk1TOE1CcVgrSFNVbnA5UHJmZFFPNEw3SWpvWi91b3lFM25uaCBObWVYYlpIam40QkI0RGgxYUtZNk1pNU5aRDNKRkprWTNBYllTUHFFTU5GZXNnQk4rWFl3Y2l5SWRxVldoN2dIbkFTRUNEVzZNODFmIGNuR1Fic2IzMzMzOUJBZTUvcGV2aTJ3THJoTURNZDVxVm5DNmZyY3NyNXo3SGR5OW9DbUVERjI4d3RvYkluelI0Zm5sZjhWbUU4RU0gWFpudGFQQ2ZvTy83QWhZbityV2toRkVLSk5PMDFUN3EwNG9yYVlwMTFmOEFKelg2cHkxeVBwVm5mUkk0TmpwWlplMXZxOUx4eDFlZyBUVnF6cWRmR1phMzFKQitsZ3dPb0RGNmdCNzA0NTVHaWxhTU95UUpLZ2RocFhweVRWTHVWMlkyU0RpMTJlQlhMSVluSGZDdnJJKzJaIGI1ZDFpMDZScUUrTndSdWZjY2ZIZDU2ODhwRmJ2Rmd5QnNVOE5ObDdCRGtwWkJrczVYeERsQ2pERkZ6UGhwOHg4UTVnOWN0UlNZSjQgT0V6ZmZmM3YzOEIrZ0RZTmdmQytqUXoxYjV6SXI1UEcxZDJDS1pBOGVYN1laTHVwR1g4V3lPMnllNFdRWU1ENWtCU2NZQVA2eVVHRSB5Zk5naVQ1ODk0RGZ6L1NsSHZrZTFRZVVVcm1aWkJoSVcxdElhQ1JqajMzS2hueVZNc0NIYWRWbUdUaC93WHhmL25GaEdWME5aSjlyIHNYYzV2LzRqMkRZRUY4VjJ2ekxIUzdnYlhLWkdaQTFldHRleU5YVHZTNVlPQXRCVWkyMFlYekZEdmllaHA0LzV6NFFmT0JzeXkwVTMgKzk3MjhQejgvQUg3d0hUWkZ4czM3eVBTbmd0NXNjV1c1ZDBmeFNiYit3M1ZkdDJNOE16REVxTXR6enRUMWppUWU0N1p1NzQ4VlI4LyBBNDRMNDhOTUFsR2l3cERJaHBEczJLN3RuTC96SzVQRmdOYzh2RHpNWmkzRFg3Z0IxS09mRG5CMWxEZkt6S2NKU1FoeEIyQS85K2Z1IG94Z3Jld1ZMTUoxZW1yWXd4azNNTlNKRnRBVmRJbWkwTzQwT0x1SEEzeGtjTFVYK1ZjZWZPWURMTTRHTVdhclNRZ1Nxd0RBQVFmb0kgRHB5NnBaQXRqcXV0d05jekJ4N0JicHdTUG1aM2Ixd2pIV3hEc1p3K1l5R0h1MUlhK1llQUJDZkJaT2MxZUxaaGh4SnE3WXdHd2Y4QSBXb2o2bTAvNVppZVV0cTFDbFZ5VlZ0MDZxSW1RQkpHR3dNaG5vZ3UwQTdnSG9adzNpdHlFeHFQV2hkTTdrMTVLKzJJeHhKTnV3TStBIEFBRUZBZnZmclBOT3pRSzRSNXNza1FJWlZ3ckhaaE8zTEhlVnYzdGZ0Tko4RjBLcHVNbVNSKzFXTHR5OGJWbWdGZk5BazJhSXVqZGQgRFp5czBOTnpNNWNBb2NiTm5nZk1XMDRPRENZdTRwTXVSRFpDRzhQbjF2RXcxQVY4RDh6YytVRXZOL2VQUGY1UDNJREE0Y0Q0TmhLSyBabUtMNHVEUnJDcmpVT3lDeGdXc01LSEtEcDZIRFpLVE1Rc0E0T3kvZ0t2Qmhnc29UMlBlNnVCbndCLytuMzdwaFI0OXF0dEQwQ0dxIEJrb3FIWmEzR2JOUDRHalk0bFBhTGFzSURZd2R3bVdweVFQeURZN0xYL2RQNU5WNzR6REVmWk44K2c3L0FPZndQcVFmbXB5a2h5N28gV0xnSEFNcW1raWtyWnpwcGgyVUtsdTFkZTNLR25ZVnhNcUNKKzl0a0NCQnF3bldZc21OZXRsOVNRY1lFSEFCanZ3RS8xb2Q0MlVDUSB2VW05RUlsZkRQRXhXeGNxd0dOaWhpZko1NkZXT2VDc25ac1RXa1FqdXc5S1JrMSszaHI0L0g1ZjZ1cHlKOWdUTlBySFhvMkdydmhxIHZVY2tZdmlKTUEwa0o0YkRJK3kzTXROYnNCd1ZZQ2UyZ3c3Tnhkb1dhek9jSk5vNEQyOEErbjlncXZkR1pYZHlPRnRadGFUR1NodzEgdEtVT09UcjJ2MjB3TEZ5eWliTUgyUXQxdStHSmpCOEd5L2dOVXpreUVMWmtidWliQ0cveEYxWW9XaDZJSXRSekR6dmFsZjUrclFsZiArbnlobEFiUzhYK0l2Uy9odWdaUFpPOXJleVN5RGgvRXQ4Q0REWldhNUdoWlo4T0UyaHdJQWZxSUFmd1h6eDlQMkJVOGZOeXlSNVdNIDJRU256S0s3Z01tUzBDUTlYdVZaRktsUkhBd245MUZzT1E0cStWZXBWWHhtMy9zeXk4YWgvd0RxQVBuL0FPLzFFNkZ5MEpmSE9Ob1cgZE1NY0xERkJrMmFQa01KTFgya1kvZ1pJMTRWMVF2ZzZOTkZKY2h6Q2NxMkhwZ1k4anV6SjVyRVc1ZzdSYml2UjlZb1o2d3JSems2cCBHMklRUXhwQVNuMk1lcklERjI4eER0UmJaT1B1RnFQbGZiNDRNMjFxN05abHFjSmR2Y0J3SHRDQTM4QlYxeFQ3RU1zbVNtNXRrTWp0IGxEWXk5VjliMlE0TU5rTkRsMnZLUG5jaERtR09lRHBtQ0l2b1p3T1Qvd0I4NzN2aHpmOEFZRUVCc0MvMHdpakFVb2NXWlhaNEJiaHIgYnNFcjJ2M3l0NUVzdytBV0ZvK0d3TWFIY0V4a1F5Q0dEZlUrZk9jQ2RtSWF1VEdiSWJTQWFDQmZxRXdQZ09lZ0xGVlhZR1pRVmJoOSBVc293U1BabzFTczJ2NGJzSGxoLzV2VURiU2VQbVErSDhiSU9BTTlYemFqaUZsWlZ5ak16ZUVOdkhQZ0hBUUNDZnc2UVpqUU1rVGQ3IG9rbVl4M1MzdFljR3NPN2ptOGhSRkRwMnl3WXFzNVd1MW1qZWtTUWU4TzM5T1dPeHN5VTNMU2R2SFZNM0Jnc2h0dEF3K05FTWFlYUIgcmEyRUxPVmJRbHNrdE5ZSEpvNCt0MXU5dUVPcTluTnFYd0RZY1l6YldNV1FhVCttL245Zy9ZT28xNHJwTGNqQTM1NnJYRmJtVDBudSB4bkdDTXZuaDZ6WEtLWVQvQUtlaDZrTVdDdDBhQTRBZDRXV1pYN21Fd1p2WkFYUHZiZjM3M1B1RFZvNkExS3hFOHpWV2RxOVBCckNVIGtnenB2MU92Qzh0cHA3bVNHNHA4TzFGdVlZV3lFTkluMS9QcmpCR3dRMzNIOG8rYzJCKzU5Z0FRWDVCV0lNZ1YwOE9CK1VVR2pWcmggTWxoanpLZk1OaGVMVnlSYURRdDJoRFEzeFBXNFpBeHp5QlVzRncyenRlekU5a3RGSmVPZkFNRUh3R3dha0FFQ0pBbTNDYklTR0NYZiBra0pVVE8wTXF4WndUUkZvMVZaRG5rekVyZ0E2bVNaWmk4dzNuaW1FSmIyRnlhS05YZmpqSWtjbU5tOEt5RjVCMlYzWGROMVZZbHdYIFRGZkdQSnZNODNUSG0xR1Y0RXVGOFZLSkZvWWNmd05rbVREREFZeGJjTGEzZDVHSzl5TFRNY3dTQW0vMEdmQWMrZmtKKzZUTXl6SHogTnBka01nY2xBcmUydE9wc1RJc0lDNEpDSFVwNndueG9tVi9NVDJUR3lKdDRQbS9Zb2JYeVpGeEtWbXNvNFFKVjJLRHY3OEFQdjNWaiB3V25EVkhSRlo0NmxxOUJLS3RWV3FaVHZsV1hNNnBxbnJldWJRdUtpR2xhd2ZXUXZhcUdYc0J3N1oxQWVWS3NXR2dvenJMTThIRWtGIGo2ZjB3NURnQVlLdlNPY1VPNFdGWDFnOGJUMXc4L3FZQzA0ZGtXRWh5aWt0TmNqQy93QmgrNURIVzdCYWlPOTA4cEk3S3prN2t1UkcgR0E5N1NRZkg3OEFIL1lCMGxGRFJuSENlR0tvR1dNeFJ4blNSY1NCVWloWGJ4a0xweTBtV0lZWVdWSXNabUtLMmNNM05aSU9aM3h1aCBZdmR4NUgyRkI3cjRzVXBvZXBBV0RHdTc1YlZYTlF0cFVyTnRBYndkSVcyaXhwWXVyOFY4UDNVMmREcjlrOThKN3d5V2JXYjRVSmt6IGdURTMvd0R1RGY4QXFTZ1VlUXRxNUUrdnE1dUN5QnVhZW9xWGZCTDdEd01BN3E3a0g1Z3lKd2VaTUlCMVdlNHdBYko3MWVyaytEaFAgNy9idS9nQUQ4QUFRTXlzNGVWYkd6UUJxQUhiWWRXcVkvVEhiUWFJeUs4V3dwUXNQeHN4Q3JlR0hzQmJCM1NuM3djbWRqV2k1RmxaUiB3bG83SDNkWU9Bb051bnovQUU3R1NQWGJiWUZrSG9xU3RqYStjQnJ2ZkFZTlVDbTRGRVBUZ2VGd3g4UGVKaGdPUFQ2NTdnSWxqVE56IFYzekZtUndpU0UyQS9nQVA3QWZ4NmtaYU5JQ1Z5eVVGMWdoeGpNZHBzeGhNemh0Mi9kYmJtWHRUSGxya0k3SzYwaHBsREhKMmNrYnMganZTNVowbExpTUFHNU44VkxIcDhJcW4xditXbzFuVnBuVmM3MkJXNGVqMU5iS1BrUUNCY0dCUGNKbHFja3I5YngwOGI2OExid3pGQyBneDVPSktTa2c5L3FJL2gyaVFqL0FGdVYxTm5xOVhKU3Erc2hiVzJpWVN1NlFxNmtLM2R6QlJXbGkyZ1BYOHlaNGN3UWwrUEE2aklhIHp1alFqTXh6emFPL0gzN0FCei83QWJSOHUyS3FrRXFiSC9HczRXU05pVEdjN09GZXVCUThwbER6aTRWdVkrWmRnZFA1VjJ2MlBBWncgUGN5UU5KZHduUGo0REQ3OGZRZW9HWmZLL21uRlVXeGt1MktHaHY2bEhBMVdqeXc3NHI2WlNpSGFoOXdNTWxidmkyNE9HcWl0R0U4MSBHQm1vVW9MV1NlOTcyREFJQUFCYnVJRHFta3BXYlpTUzNNcWgrYmpjSmhnYS9ra3diRlB1eHZJVjBVVUtzNm5mbVIxOWpaM3lBQ09LIEhpUkk1UFBPR1BGNUNxMnJSdnRkdGFLd2NrZTZhUXBZYTdVd3FQRTZHcTZueWxKK2w5SnVaMXNaOGJDWTRSOTBNVExIYzV3d3FNV0cgdTNzTTJMNm5vd3FTWkpDSmdhaGxKTW5PdlJ4WnFLckxyUkVCMk8yUFVzcUJtcnMyQW16bVZlem9iU1lTTWh0WjVRQm5aaEdGWGdEZyBrdzUrbWJJY3N6QjBqUzNnN0ZQeEc1b0tFQ1RGbVNQVm5YT1QrMlk0bFdQWnZBQkwrcDBvdWdCZGJ4cS9OV2Y5Zk5hSlA3TWlhUjJRIDByTVdVYk9xTkFrRURuVC9BS0hTd21LZGthZmJZTVZmU3p0SnJLd1FNa3NReVdTbUx1RE9RRXNteWxzZTRkdDJSd1cyQmIzN0NmQi8gMnVUR0E2VC9BTThRQ0Rqc0FFQjFWRWhYNGR5VTZ4c3M4TnE2NE0zT3BTSmFGaFZpd05nZXViUW1XMEJ1Q3Y4QVQzeVJqd0RyMHl1WSBEaEFuUWxrWXJxN016Vlg5Sk9lMi9uK21Rd0hWOE9MeVF5NVQrbmd3TDA2dTdZcnNsaEs5aFdSY2licUVBbm1RZ1hoelE0ZjZmQlE2IHVBbk1XWW1yN1o0UEVMc0hQbjdmd0cvOVhZMDc2VTN3cnAvdFcvZjRxR1RTN2VhcWdjNHRSYnNCZW1KcXUyYVZTaUdQbUxiZ0g5dmggODhvODhEOFloN21UT1ZkVi9Cd0NDZlgrZkFQQWRDV1g2WVBPZ2hobGFZUWJzOFczRzhuOU1GczJ4dnUrRFg3NlhHQXpJamw1RktJOCBZMDcyWThqM0J6anplSzRuanczSHgxVkdzdzZlMFIyUjNxcXBkblhJZGdjd1d6RlRzSmY2UmJWU0IrZUIzeUd0MVdRbWNUcjk4ZzhHIGVVTjhabGtHa21rbndIUHVBL3IxUEo3QTBhbTE4YlE0R3E3SXNKb1czK3pRN0pxUUh1NWl4NjViSXQ4R0xRdUg3Z0htYlBCZ1lkMUwgSEdQTzEwYlptOXUzMEhmK1FmcjBnYVhtUjVVZk9GcTRHNDF0M2h5YTllR3JpOVpJY3JkbWhOWEI1aTRHWGg2Mnd2Z09mdjFWb1pNWSBocXl3TStrN0h2NThCdjREcGtTR0JneWhjT1VtM0F5YWRjcm1wWXhuV0V2aVE5Y3hteE5LVEsrV3c3Z3R3NGZ3MnB0WHp6VUhHY1hWIDJaR09iSnZ1L2dUNEQrd1ZxRitwWlpML0FMekM2blNxWnRoR2pVOHd5eTRTZG50eUdIZng3Y2VVNmVWRUtCM2NhZGdkOHh4YnNneHggQ1l4WnBuZHRmZXRmdStyT1dSYmtqVG1wdUJuVkFIR2tvcjRTbHlEMXFXUmdZcVd4cXl0Q045UERyYkpEaDhEQkhwL0IyUjVabGNYMiB6T08yeU80QSsvQVAwQWROUUpWQzJlSDl0QXkxUlMyZXNKYnMyOEE1NndMNW0wT2h5OVBvRmNYNGEyaHA4dmJwaU9CWWEwbldvak0xIFlOS3lzOEp0R3JuZ0F3WThCWHo3K0JBVjFhRnF5TmRhSFlTYnFXeVZ0a1EwTzdFaG91QjJNQ2VHdEVTMExHcmV2NjNRazdoOWJyNzUgWXo0d1FBWWY5UmRRZlNNTFIzL24zdUFBYi8wbVZQbEF2V1d0Mk03alFsa0hoc2xUcCtwU1dwQklNVktlbHBxYUhuMVducDVpbjYzbyA4UDIwK3FoL0tJZm5EZXg3L3dDZlB2eDhCc0J3TEdpUEpHNkNXRk1wNDJqRXhqOEJBSXMwM3M2ZXpsSGdSNGZQdGZJaUV4S2lTcnBKIFhDUkJqc3lON2NpNlUrT05qRVpFbkk4aXVTb2d5WllzT0JhRWgyQ1E4b3d0MWswRGJJSGlaWUZvVS9sTWxnQnpGSjN5SDVoOVNIcVEgT1p5YjdNVE9XanZmQVY5QmZuN3dCOStoNFpETWxVUFlTMnJnWDhhNUhqZnlMSXFXanBhMnIxZXZJWlNIVjhPSDhOUHVCZ21JOXQveCBEenJJWnJnNHZVQ052YVNieFBnRDZDQTREMVpXZXRQaDFKczFvVTBSY3I3dUVSMU5UNzVYWkluQ0pvdVh5Z0I4SWFoRU1Rb1dvdERwIGNGU1VDRk9yYk5XaFhrcElGZGFUYVh2N0lBQUF3SUhWUlJPc0o4cE8vd0NKcUFwTFNLT3pjeVJjU1NPcXNhcXQxcTJkTW9VV25NWkcgV1pUNVVWNkplbXZMWVliNFZUQlJHdzlUSVVSamdNNGo4Z1FNVjkvWHoyUFRsUGN4Mk44ckt0eTRCczlyL0xmWmVmOEFpYjhlT3VaViBNa2J1TlBTTElZekxqaEdTTnlRTmg2c1lwY0d4VEt6d0s1Z3Jvc1JURFVlcW9abXNWdXNUeWVNc0t0bVNIWkZtcll1MnJZVFhKOHIvIEFJZUdjRTlrSGg2NXJTMGFsUnVNOFhLUEF3SDNSQ1ZYKy84QS9nTnVxVGgySlpkaDAvbTF6THRFQytWV0VFMCt0bUdDV3lBVmVYdzIgRllBZFBjSHhidFRraU9wVi93QXFReVpOWHBzYVQvMFRCMjZnZ0Q3OTlCMkRNclVacURzVkNzN1VocUxkbEpWQTZrRzI3bGRPQVJpeSBHVVBXYUsxQlRLL2g5aGk5YnA3aGpha0RnZGNvUXhacThtOGs5ai9mOS9Yei9nRC9BRnVlSzdhS2d0Q0drTm55YXhjbFVscDdxZHFmIExnWVhCeXB1SWVGdzJBeERRN1VjT1k5bklGUHFTcTRWQlp1bk5XWmxnNWFLUzduRDREdTZBNCtmQVAyUjIzSUpJcFNqVEJERzZJNGwgaGFOc2ZxbzVEU2IwYUJZZzYwbVdRNVd1ZGtJZUtWZFJHSFZGYU5vcHl1Mjhlb1c5cmFOc1VrSkxVL09ORHRhKzJwWkI4ZUs1dkM1ayBneU5yK3lBeVRHWVYrd2p6QUpNYWpJckRLS01oQlAxSWZzM3pQZ0VQbkI3TVJrTW84MW1EQ0d6YVB2OEF3RHdIVnRMUTVSRnk0ZGpWIGZXTW5PdG9tZ0NZOVBwS2UyQjVVVmhBM0l0ajdVNDJZTVRCNWhWMjQ4RG1leXdMUmhtUGV6OU9mQUFIQWRnNjgvcUlhUSttQjB0UlkgVHIvcmRLbjZxR3hyMC9XcFc0Q1pORnByQ1RUSHRnZThMSW1CNFpBeTFBVi9EQU5naXE3NE1XZnVxUThiOTdIOS93Q3J4eU5YaW5TSiBoVksyZ1lrcDg5a0NLYS9NaWFaNm5NU2xlcDRzV0dQaG1BK0VNd3dZTlEvbHZ3K01WZHRuN0liNTkrSXQvd0FiZFBnRGtseE1TTG5FIDhUaVJvNDN4amFNMXRNcVluRE1oNzVid09vSkZramthUmtrUmt3alNhUEtlSXQ3dDFpNHl5cGNiQTlwNTZYdGZzRWNNbm1BRGxuRGMgazlDVW14SGZCcnhFRG5vdFRucFMzVjlWN3hhaWV5RDBOcTdYd0ViYkZtbTFkWjRPN0pMc2JQOEF0djhBaWd2M1JoWDlOYWlLcXZpdCAzekpobTRieHNsT0I2ZmZHaGVoNmdpa1FXVW1NQmhiVzN4Nzd3UTRKNGZBTnpCbkYzei9lM2dVRStBQUFQMzhKaDNRNFhMVTdKRnNhIFlFRzFvQjNaSE1EV0FzWXJsenZubWN4ZjVoRHVCOG1EL3dBbGowTzFGdFl3UXlpeVQzdm14dy92NERBQisvMlZxZDBVNnZjSzNpa00gaU5TZW01OEczR3ZYa3E3U0hGaTJIYTdJL25HUU80ZnJPbjEvM0hUK01pL0tkMFVrSnY4QTkrZnQvQUFBQkkrR21sS3diNkxuUFNwdSBJa1lLaVFSUzJOeHoya0pnbVpIbGE2WVk0dFRxWWlId3JiUU95K3BMSWh0RWVMSWJXVnRSems4SGpqcU9JUjdnaTF2RGQyTTh0Sjh1IHptUzQxOXFzNlJFV25LdWRVdDhETGcvaWRUazliMDN6TVZ0NGJlZXdXUW5VRFJRNnlqY0o0VGhpZnh0MStBSDM0K0E4L1dSZzFBTnQgZ0V0VUFaSlNZWUd5SFo0b2NrZVQxTlBUYWxyMDgwUTdRTUlhR3RyY3doeFU5WUFFRmc4OW0yaG1HblRsWEcvUGdELzdEdjc0dUJmVCArNmxxTWRCYyt1YXRHUTIyUjYzcjEzTFN6MHI1VjhURitadkMybnZnK1lEeFlMTG5JWXphMmhaZVhpMGppU2o4QnQxQndBUDJ3QUkxIDRxclZwUVV1eWFXVFhDcm9ZdXdvMWUyZzdhZTVEWXRORlhyelJZeUlQRDkxSVlkOEhHRldBNFFQaDhaZkNoTm0rN096eHNHL3Z4L28gNUZqYnVOenZLN3lTQnUyUjR3VXlhU1R1TGJOakVZQzl3OGpuckZKdUtwU0puS1JRaUVLelpWbUY5UW1oaEdvWHZhamoyK2VyTEw5YiB4MjNUdlVybStHRFo2MWJDSnl6QTJ0NjNpTWtwWFhnTXFIaXlHTElaSWJoOHlDaC9QM2dueWhvMnozTmhEZlBqL3dDL24wRUJwVmc4IHlqYndhVmNXN0lOZUp1TWxUVHgyck9tSXFFMFJjRmNDbnNFUjhiMUJrRER6TjRUMSsydmgxbXpiWGhqalNWWE8zUHZBL3dCQXZ3RkogMW5aSFpIVEpaMUpDME1tTmloalZlMkJ6WWVwelZkeUxSYXY5cmdRNkhtV1JNWDRjQ0FSbm84eGxKSWU2RFBkMk4rK0cvbi9mZ1BXbiBVb1VCMTg4T3hrV25xVlNyaXEycEMrSDBaaDdqdFNuTGtYZ0xsRElNakozVW1KN0I4N2g3YThHQ1pNcHlabVIvTnZBRGdHLzdCNTlPIG9WeEd5eFNDUjgyVVpMaEgyWUFsNUxiRExMZ1ltNkp2NDZlRlYxakt4K3RnaGVYTGhrbEM1UjQ0OFhpTzdJK0NhNmgwOTgwNkpCUmIgYUo3STdIb3NOMkV1RFVZRGlaaUhZNlJVc1dhdjF1SE1WdVloc0NHMVQ3QXdWVnNYeGNYem5aT0UrQTJCKzRDZUFIbGpxSUlKL3dBeSB2YlFUYTNDTGRWRFcxdHNoUHpwR3p5cmxFMDJVMUNNRzhjdzNnZ3R2RGJhQ2x5UVgrTDZnR2JJazFkeC9ZTi8zOCtmQU1oRHErd0plIFc3YWZBd2ZuWVpEWklnL0pyZmhFemRKYXVyc2hHSERyZjdKOUhRMDhGeVI1WnlqNDgyOGo5MGF0MzhCditCOCtBQUlKc3B4OU9jdnYgd3hrRld5RERrZW9xSWowL1ZaaDNtTkNKWHI1WXkyUCtHNGg1Z2RnN3FnVi9lL0pxL09jTFVTVW1yY0QvQUwvbDM4UW55Wnl3UnBnNiB1ZGlFeG9tNEV5a2pqeUxaSjUzY2d1UDJFWHpZRXdzeWdLeVlJN2FnTzV4engyN1FDbXJ4eTFtcjl0OGRWSy94Tk1Ha0hWbm5ZNmFnIElUVlBXRHMyc0xnaGdYZ3QvTXRneUtoajVpR0gxSDBtK1YrblFvREFldUpiWnhndkhhd1dPUDhBN0FNZjBQM1lzbGd0U3RKR28rQmEgdFkxZFlXVXRZMDR2bUh1dDJGT2k2ZmRLTlNsSVFBdkRRcUhNT0tkTlIyMVB3aE1pTnA3dVRIQW84SFBkM2ZmY0F3WWUrREFsQ09uTiBiZ1pSSzFjcFZRRTV6UFlDV0FsNzhrYUFKYVYrUHhFeloxdkg1bGpjZmdQR0ZtTS9qQ1lJMzk0QUh6NERmd0NEN0d4aVJIRFZQVmQzIEhyYVcwT3IrMHVOWGh6QVozY09CeS9pT0ZnVEZzeGRpZlc2OURncVE5RG5KN05XYXVyRS91eHRKd0FiQjUvZnovVm1SWGtqS24yWkIgMkZwSXNoQ2hrUWdDT1BHd1NZNGx6c1pEdEZhSUVXT0JoYmw0OTZKNHBERkxHVEpHWWxabGtpYXdNeVFvSzNpVkpOMkdjY21aaDR4aSBoNXVjU0pORmhwTFpaRU5EYUloaTBMYWx0S3VIK0hEaHpONFlKalUrVmUyMERER000dDhzell3bFhoRG4vd0JBQWJCVytIWGN3TldhIFRZd0V4OFBPbVNWTXdCbVdnSlE0aWJ1a1ZrK0lIOTArR3Z3MVZ0WHlFN2sxWml5aFJaODM3Y0Jmai91QTRBZjdBWlJiQXE2b1pESGogWkl5U3JkVE1kMmpIRDBQNVlFOHQyQVlzbFBUM0JQQVRQd2VlYW1SblpzUlpObTgyRWVBQURZTi93UDdCaTM3TkZaMzhVc3QyTjV3WSBrTlhsZkl6a2VXeVBrb1MrTkVNZ1krR3lHSmpndGc4UGdWekNKMitocS9uVW53ZS9vSUQzQWVmT0RjRmVuL0p5dHQvVCt4eng5OW5qIDR4OG0rczdjc3h6eTdHZXNhckhBVjVQblAvYkVpamQ5V1dxQk10alV6bnJkZldZOWhjNG8xVk5xWlJzMnBkUTdBb0xDZHA3eG1UY0cgNWt0U3E4RmxPRVkxTGI0RUhUNHQ1eHh4ck8xTURLUnlEMWVyRkE5TDdpZndxNFJZYnN0Mnk2VjA5YVlMNHRQS2t0ejlGdG1wVlhQSyBSSzhXVlBWNmRUcS9jVEpjTDZXSmV4c2dHZ3FWcHJXRm1JU3JlQXJIMVloUVo2M0Y5ZnhRdmJCK0swdXY2ZkZVZi9pd0xJWkxPdEFQIEdVekZoTlRoWHRrT1VwZGpTcGpCVmRrTWhpWXR1Q0Z5MGg5UDVNVVYxbG1CbXd1bmkxRCtHd1c2ZjgrQVQ5aUljZTM2WHM5OHRDMmwgc01HVDdzcWRmR29hOUs1bGR6WTBJWmp0dStXUkQ0ZHM1dzhRcVhtSDdVTUdlYk9mL3dDdnYzVjFwaTRDcW4wejhhV09STGVOelZxNCBzWTd2SE5uMkhnampxc1dDS1dZRm8zV1dTU0NXMGtqUVV6QnNlN0N4UW9lNnVPbExSOWdTSGR3R3hOYVdxN2JjNnBSdDh5TTViSHFjIHl4anhab3ZteVdDSGNGYnpLSGNMQVd3ZjVwZUE0d1lVN1BvK3lHd2h3QjREcjBhVzNubTQ4T3hvUmpoT294OHV3U1FTZFBid3d2bmQgQmVybEVaRjl3RG1BOTJMWkdZOFFHQnRhc0JtbnEwS3ZxQW5pN2NKdFh6K3dZVkY3OVZGUzBld0tRekt4MWM5NWdsaFdDSHNpSVBTWCBaZllWdXhwUW1WRk1FSWkzeU5ibUVIRUp0OEE0aDl6TjBHTEx3RSs4YitBMy9wOEM3UXkyTW00SDAxVlVwZ2J1UkV2REphakV1WktzIGFYWTEzT0E4T3lKOHkxR1FnWSt2ODRjZHNmT0RQUGhEYVA4QVlENEJnQWMrd1JJWXBKR2VKMFdGcVRoczQxQXJlaGVTaGhkeDR2aWIgcHUwWTh0aldWVUlkWHoyWld4ZmRqOU5qSHR1REhLbVdkTnd3N2FBQjd5ZXRHWXZnODFEVzAyMVZadEE1dVRYN0NPTHBKZ3Q0RlRLTiBENXM2ZkRwOWJUeUg4aFY4OEh1WXdYeWRaQm0vOXY0SUg3LzF5QzdvTVVpanRYSXc4azhwSHEzcWQ0RHJUUkUvRjl4cGtXeUdBekRXIDdJVzl3RG5MTVQrS21PY0N5Z3haNFNiL0FIL3dHSDBFQXppRmJ5SUMrSE0yWERHNmIwamhKYXR6RHRlR0hBK0psTm5JcmRidmt0RG0gcjh5MUI2K2VhZzR6dGUwREVaNENHemJ4NSszVC9VUFRlbjliY25qT2dSWEJKdFM3bXRrc0loYlZZMS9MNVFlcklDcjRqNjNEc2lHaCBzcEJ3c1p0dENCWXhqdVlMUS82SjJUM2YvUHIrd0FBQzl0QW1jeHd2aU1WZVRtaUVQSXJMODg4ZkJ2b1J1S3pGVlNaRlFpVXlKakpCIEcyRnlOSGJWN2VGeTc2SnlXdWlsVE9hWjJpNkNWeU8rUy8xV0xoMUxMSFpMVUhMQjlRVVZlQTFMTUFjOG1NamhDVHFyYWp5ZUIrWVUgR2NYOEdrK0RQWW4xOC9zQ0Qwb0ZjZkRNbEE2YTUyUktaS2x6cklkOFh5RzRXRkRybG9sb2FZWTdxWEJXNGRrMUlmREJ0dVBia3h5WiBvVnhnemhPeWJBZkFlZjhBUDlEWTlMY001d2FtMVNHMlJYcjVuTWx4MU90bmw5ZFR5Z3NTQktHUGgvRER6RkNyMDg1L0lOUmtZekZFIE1tekhFa0liT0g5Z1BnRC9BSURCVjF1WU9XTTRUQXp2bmFieG9HdlZ0M2tOV2xmVVJ2RDVTS1EwTkNkYUtHSERCMXVZNFEvbnIvQncgL2ZKWXVSR1puanpad0NBOEFmMy9BR0J5Uk5EdWw1TTBTRkk4cXgyNVBzbHJJM1Z0MjJQUHVIbnFBeGtSc3NYWXpxNnRtTGJieHNVRiBGZThHN1BQTmZIVmpIQk9UYUNjbXFyajZVbE1jZ0NXeTVNS1FuWEJTZGlDWUFrMktHbWhvbjF0VFlRSFl6WnNPUFB3OVdmSFdBYTBrIGovUm5aVUZUV3dnbVBrd2NyT3VkYXVXaDY3aUVxeVpORXVtbS9NeXQyWnNWQmx3QXRZOTRpRmQ4SCtobEtHczQ0bURBT1NyaFI2Um4gR1RKZkxUb1VHS1R6WWEzbERZeGhoT01HVVduNXVkQThnRHNHMCtSRGtGdnA2c2dxTHJjTlhmaXovd0NiMUpFektyQ2FGUVFDQm1UUSBPUEY4WFdYNEhqcXNkNnRFTXBROE9leGdiUkF3TEhTVk1oYWp0VitvK0hHUE83NUsyK3lBK0xKVmI1L1BUN0FBbkU5R2VTZ3YreWVmIGZrQUFBQUh3RDkxYWpVYllGNlpvZnVYRWFrbTRJR20vU3JwN3ArcTA4eEVUd0I3Q01VVzdSVDRiSUhzaGJJT0VJOFA1Vk1XU2ZGeG0geHU5MmNIUWYwK2c3L2pEdkQ1RHBEVC9meTVmQ1M3TldveXZodE9HS1pQQjFPSEZUWmFiekFnbm1JZGtHR1R6bGFFRkt1ZUN2SXQ4WiBsaEgvQUJjRDRDQTU5VVNDL0gzNS9haUtQYkYyeEU5Y2l2bEpub0dkVGdrT2s1MEIzN3RWellTYTBjZm1JYWZWWmRsSDRUajFnUHVKIGhaUmxmRW1UOWtrSURQc0FESHRGc0FCQkJtMG03QkFXUVRUSThpUlR4UkpJOGNVdWtqbW1oRVFqM0lJeHFFWjVTZkpRS29zbnBDQ1Ygb3BaVEl5VmdIVkdvbzdXWWt1dTRTVTRCb1k0K0d5NFNhQVFGNmthN3NJOG5Rd2xQenh0WEZ1M3Vuc09KY0x1Rnk4QU53NFcrbnJmeiBEQkJiMzZ2NTRQNnp6d21UL3dBN1VBQU8wV3dBUFB3N2pEajVyck1mTEdRNHlmU013YnhkRG8xWHJMaTVTc3BVb09QK2gxdStCeUtHIGpnVi80TGd6WW9hdnpsRzNzM2dmNUFmL0FHRFlZZExYNjNTSkFGRGQzYU5TZVYyY3RlT0J1ME83M1lCS01Ob1BqNVg3SUhodyt5ZkogQWRMRUlGVjg1Um1ncXpMSnlyZ2pzOFliK0JQNy93QmFWczVhRjB3ODVjeWhwSnF5cHFCWnR3RGNpUTJHQ2lHdzF6R1c2djVMd09HbiAvVlQxZjFvOFRHYmxGb0U5ak5oUFA3QUFxTC9mMnFKb2xXWlErcWsyM1FLMGptTjVJeEhESEhJV3BzczlwbXhyMHpZeWU3NkpsbGFPIEFzNkRMT2xpT1VhMFkvYWxMZ1RmUEp5RkRpdXBqVDJ2c2xja1ErcjdUZGNGU1BsdjFqM0NyZVpXNWhUWkh2VkJYdERnSHpaNGJJK0wgY3doWkJ4U1lHMnVZZkdmb3J6dmFSVnp3L2NCUC9Yei9BTEwxZ2ZMUU1zQ2UrTkRJL2diYXVCMnMxZlBFc2VZVzBMVXp6NHlqM0NxMiBTcTNDMUhBdzFkbjU2b3RqQ2ZQSGtadmV5UEd3ZjJEa0hXUkd0azBlMm9sYW9LMHhDNUxiV05rYWZIYzdwdnNDd2JUVHBUWStOR205IHdEV1ErSW1JZ2UrTlRZUHNxMHpEMDh2Z3dZU3g0VFY1dmo3OWh4OSt4eHdtRk13YnZPT0hzRm5UNnV5VEZoU2JZTVdyK1RURDVWN1kgNU5ESllEMzh4OHAvajlxTldualQvUDU0TUdJYXVNOEo0TSsvTDUvMzU5MElra2oxVXF2cHBCRGhEV3NWczg2enVKNHNSVWtGaktiYyA5ZmN2YmkyKzlEUm9VSzd5TE1qc0ZqZnQzSSswSklHczFsUnRjVFhIY2I2a3U3NURqNTVYbEdMUnRxaDY5Wkd1eUs5aWZXNVNKWDFvIEhsc2VJN3FLQmhQMmQ0QU1DSEJYQnZBMmZhd2RYQk1jWDdnTDhBUDQ3K2Y0aFliVmZVQ28zMFNCb2JCd3JXNnlOTzZodzlLTk1PRTAgUG9pNHl5aFA0aFpDMHlKNThQWS96OFd0WlpTWlZDR2Y2WDRtOFBmQUJqaGd3SDJyVytsZTdESURPbFVFZUpCNjBwKzQ2bnFkMnM2diA1YWVlS0x5RzVNZzlEUTdVcXR3Y0NFTUhQWDYwdFJQSnJMUUxXU1lQWTBrSHY3OGc3K2ZQNEFDUTVhbGIzYzZQbXdzanRmOEFxQ3lYIGF3azkyUFhBdkdGaDhVcWxxV0d3TWkzWkNleUo1Q2FxdHZMWUszM2ZWMWNaai9Zei93RC9BQkMvQURrMjQyYVNHMWhrZG1FZzU5YzQgZlRpdnlQVTV2bmpqcXNYa2dHY3JuQkVqS2cxSEloL2tXUk9jc3UwcWNoaFRjTmwyMVhXNDZXaDFIY0NRNVpKdHcxQXA4WlR6NnJ0byBnd3ZsalBpOVY5Y3VKQ3lMSXJkUFFzWENaQmdPTnRVN01adVVib1QrN1ZjRC9ZTmc4LzFhaXY4QWc1NWNWVU5YQTM2cWxIWnRZWTlWIHF0c1Y2WGNoY3VVZURzRGc0cC96WERBT3E3ZWVObUdZbWhxOVo3R2JTZjA5dC80Qy9uK2x1cGtDQUczRWtYS1ZBdS9OUzJwby9iR3YgNWJJVVYxNDlMaHI0ZXExdUVZWk40YXJhWDN4SFpCZ3hEVmhqTi9XeHpmOEFqLzZmcWVDbHZMWEE0ZXFuSmtsV0VCVmY1Z1BUSmhoTSBLNHVXNVZ6WkpCRDJkOGNGdGdUMnFBUVVuaGtabVpEYUZsNWQ3UnBOMk4vditBREFCdndzenlxellQMk8wcWgxeHdrZkFwZ2JQcHhVIGNJL2dzVGx6MDJNcTBjWVNOQzRSUVYwNHp0SS9mSTU3Y2NjbHhXamxiZHdybEpuS25RN3VVMDlqUEtvNFBsTFp1emFuYXU1RFloaTMgTmhsVkxNSU9ESXlJY044c0NIdnpnM0kvT1NpdU1KK0VTSFpIUVVIZiswV3diQTVzdXY1REhWOW5hWHoxYnhwaUduM1pZVjh3N1VqMSBsRGNqMVQxMGVyYjhEclRJdDhnUTdHQko1QTVXL0ppaFJaM3p6Wno5UDJBK2Z3cm9ZQjAycmtYdzhHQXU3dGxBVGxPTzhPNWtkVERKIGtxWFhLdkRYNWx3Y0RRL3JhcWVZRVBrbTJQbkJtYlpBbnNBQUFBSDdBL0g1bTFMSVlOUHJZazIvVldTTkR1OWVyZXo1T2NqcWJIRmkgM2VyeFh6ZURDSE0rR1A0TytMNEUzTUo3cGlTSmczWUpWMy9mL3dCZ0FTUjVKR2pkNUhaSXJraFpHd3VOQ2lHSmdRMzlLU1JBOThibCBsZUNwR09QWTNJeWR0L1VnbEZaWkkySVlYWXJMajROQWZQVEM4SWVLc2dHZFpCc2EyNmlpVXpFT1NNeTVrWFRuRWUzS0VRK1hzNjJ5IEo2M3hKZnJRSGdUclBIdEF6STV2ZSswUjlCQUgvd0JnUWZrT3hNd002QVRNcXp1RXhRN0pFa0hnOWZsclVmRTNFQ2U3UHA4TjgrR2ggcjh5ZFdtQ2txek1Ia28rSTNCL04wZWY4QSt2eC9vclgwOW5paCtHMStOZHJ5SU5UL01ESWFTWTVHTFYxNnhsY1BhRXhPVzRiNTdyZCA0QWJCbmcxdjZHaDIrTUJtemFTam4vUC9BTEIxSldRNFUzRnFkYlBaVHNNUFhTWXRHSVFQVWF2cjB4TlE2OXE5RGgvTU1HSVppR256IFhpbG5BODFKL0dlVUxMTWMyTkpPSDBHM1FIMzVndzZXWmR6VUxLOGpTd3kzQ0ZTTzczTWJaam54alhhSzdyUElybGdDQkhqUk1jYzcgZFRsSElZekY3R3BidlB1NDdlUE9YQ3JhYWpUTHBSNzRUTXJPZHUvR1RhUHNrdmlRcHNpZFVyRlY0dGtUdG4xVVRFTXdudzUwOGVCMiBkR0dJbkdVYnVpRE43L3Y1L2orTy92eGhNRE5GYUIyclNYY2poSnFVb2tzakNZdWJPSXFiSVV0R1hiUXVuMC9nWWNPK0dHRHR6UHE5IDhWYkplV1pZVi9ZSGovNTk3QUg1QjZKTElSN0FBcGllWm5oNzFEL1cyeGdjQTdCTGhub3FtMEsvODRZV3c2ZkQ4SFA0SFl6SXpZb2UgTE1UZURRVC9BTmo2K3diL0FOT3dwUlorZVF0cnZkTU4xS2VwOUFYdFVDMkhJWEc0TThWc1RRTU1mRGNBOVZtV1J3d2FvRndkeG9aUiBadENyeWF6c21IZ0FDLzhBOWc2dmRRU1J0T2lTWXpHZU9WMXkrbmt0UUFpOGVtT01Fc1kwZVRmRjdEQ3RyQk94STVNWXdCSWdQZG4zIGN1OTJ6LzVibzExNStsTFFNWUxiMmVLYmF0Mk95SUFuNW1kWDlaR0xRcTh0WTNkUmVEcDRlRk1tSjdJQzA4VmUyenBoTVlybFAzekUgSjlDL1lOZ1A5ZWpUUWgxRUZzQ21RekhjQkxWUlY0MnJyTjVJTnNpc29kaldndkhuSzRCN0luMVZEY0Z0dlpBUUZnZ1RuRCtsN01KZyA2dTJTcS9ZQUE1NmZQOUl4a0wzRmxhTmIrU2tpekVnUHAvTHNjV3g3QnNwWHJIQ3IybTE3dFR3OVBPTVJpd3hmR0FPMUtVK3BwK0ZGIDhwS0l3d0hoai95NFkxRnYvUGNNY0srQjA5WDR1U3lqd0dORGlqWXltNFF3d2RlaHRFVmVzYVhTYWVZV2pCZUh1REpPUHA1NXFXN00gZWV6ZFprd2Ztd2VGdWdOZ1FmMkFaV2FiYmxFbTNnOHFSU2dlb2Eyc2lraWxaSXZ0eUNPTXZrbkZhQUpVbEl2OGlJNU4rTHVoNDVyNCA2UE1jdXF4Y2dibFhkREcyUW1yWnV3bDhPN0Q3Q01GQUx2U0pSUElmTm1CbVN5RjhPMVBsWHZtSCtqaFFuOUpON0h2L0FPLzhCNmZCIGkzRnM4aDE3Sy8wMnlpVEl3MkJjR29wZ2lRejEzMmFodEUxZmNOUGRWc2t4RHNEMjNHeStOb3pOendtVDk2dWRrZjYvNEErL0FBQ2wgeEI2YjdWVjNaM1YycEEwdTJwQ0pjZ21WN1g2bytSV2hldEQ0Znc2clQ2clQvc2h3RVFiYkczUHVoOW1PSklUbkFEN0J2LzdCQXAraiBjd0dJV0VrWnBoMnAreTYzQ05qd0hRMmhUM1JEczJVckIxOHhNUTN3d251REp2emdwVWR5WjVhT01zM205amZrSDJRZGcyQUFMRGNuIDNUS2lvYXlFaHdlTDIxYWMrN243aFdKUFRIV1JJeVFhUjBqYUYrZS9UbmlNVllySHU1czNmQUZXUU80TElzeHVNTldhMDUybTlrMUQgdTF0UkE3VmN4QmV1QkVsS2I1cDlETUtmY0hKT0grQ3FXMEcwR1lSbVo3cS85ZnlpRDd1K2YzLzZESTEvcERiS1JGOFNVbmFwYmF0ViB3WkxORHcwTlBFb1pRb1dBaTZmSThrK3lUTjVWSjVBOWpNK2g4Wlp2dXhzNS9UNEIrQUFEL1VkTTFFT0NSWUV5dm1qSk4zK0crU2tWIHZaOHhmWVVORGl1NnZYS0dQRHJrT1luL0FBSEE0ZXNFQzFUTnpWeWpOdm52L3dDZkg4RC9BRTdCZG9JQlJIU2E1S0xkWEFkUzFQa3AgYkFOY1RBa3hYUDhBRXpUZG9NakF5V1JXNWdSeURZd09vRDRPQlN6RmZVWTg0SEFpU2srMi93RDcvd0NmQkoyak1TckE4TVQ3VnlNOCBTd0puZGV0SzhXNVdKdWxGRHlCWTZqUnh5c1poTWpvanNpaVM0bjdjYnlTNU1mSW9XZkhucGIxQnAwc1FVNFh4bWxBSnNheG1LbUxXIHVObUYwZGtwdXVXR3VhbFVPZVEzQmtRakE5Ym5xUjg4amlCZ3pFcU1HV3BhSE5RZXc0c0h0Z3dNSFRDSHNBZktYM0RnVkdzbFZjUGIgYW51QmJ1YU9KZkZmUkcyUlpWUHA5Vm1JbHFLRDRvVERsTDNoWmNIM3JNbytjR09CRWsyRFFQZm53QTgvdno4cTBkb2RFMlFlUGFhYiBhc2hQdmgyYlJKakp1YU92UGRYb2N0RWFFOWd1QncweFEwTjhJTWxpd1A0ZUdwYjJ4Q2FPVFdwamRxU0QrZ2dEL1VrNlphM1lJZlRyIFVDNGsyMDRacEpzaUIzRGxBa09tMXlrSWR5bUt2bUxkMlVuVDh6dXBzSSsycUJNZHN4ZE5qS2d0VGhQQi93QmdQL3NEOCtXT1Y5U3cgZWswMHJtVlpkTEpORklYTU1FVXYxQmwwOGUvSEp0UnNFWEhIdUJia0VoRTZRd1NDRW9KbzRVaFpwMzNJMTN0VVFKTk8rS1hJdStTVyBydHhBNTNPdzFRMDlNbmh4MmJwemhMZGhaUmVyeTFvUG1UVy84UWJPMFVPTFBvWStxNW1qUmptQmtDeU95emVRQjRqRmhvVjdnWlVhIHI5bHdZTi9QK3dEREVCV1NzektXMjI1bkMyaW1XVE90c1BnV2FLZlBWL0xXMml4blo4S1F5QWNPbm1BNWkwSmlxQklIdVNERmw4Zk8gTW5FbEoyUFlEMy8wQzdGZnZFT3RDQUVYcHV6blpiVFlhUzd0RnFhYjNpSTRkcFJPcUJERGowT3lGdERodmxvVlhYTDVzUDBabDA1KyBNT2NKTmd6K0huOWcrZzA1cWV2by9Zc1BtOXNhQkR6MGxiNVJNY0hDelE4dFhiSlI2WVFmREZ3SVZrVE40T2R3TEwyY21qQzFkbUorIEVkdm9KL0RIdEY1K1F5SzY3aXM2aDY3cEk4SGVpUGRIazJGWHgzTllKOXRWMVV4VlRTTFNSVmlBY2tiUEQyeVVNc2FBUGJ4eDF1TUkgOGZLU3pCVE52aEpyY0NCamFoRWNPMUdKYjUrUXJ1cHV0MStZSHJkOGhtZUgvQXNBOHFzblkxb0YyWU1CNG16WndBQTkrZkg5L1BtMiBaVzZIZHkrVGNzVStuTW16QTYzeGU3TzhIZXdYWTFUdVFzT3dUS2ZvZGJjSWEvYWxjNmg4THBCcDd5em9mSmhpTzdHL2RmQVl2eUMvIEFOL1B1WUh3UEtqMjFBcmxsU1UvRFZGVzZtaldwOGVuSWN0OFUzS3VUQ2ZjRlZQZ2VxMlFnR2VEeEQ1ME1ueWhvZVVZSFNZVDZDQVAgMjYvZUFQOEFVQzJWUEpiVnV0eDdRQnNpcFhMalphNkZVUDhBTDJKb2Q2bEYyUVFob2I0WS9NRDVPc3RQUTUyNXZQS0dXMytFOXJ0LyA3UkFGOCsvYkFmTXpKbEcwQVJIamRTcmhmVWVRMWhISXdidXo3Z3JVTUNDTVd5TlFLeXEwTXd0MHJqL0NTTDgwYnY4QTI4Zk5qcFByIGF2SGxMNnFrWlUxa1Q3TE1LUzhyMkVCdGhUY0w1S0NiSGxMZkpFUFRHbnpPWHc3RzQrMnFwaXMyYW1yNHdzd0dFOW5qWUFIN0FBMysgNEVjNXA2UEw1SlhuMTdiU3E3dURiTFlKalUwSkZxSWJScGxReWo0d1ZXNE9ESnZBOVBlTWJRcWF4dU0yWStGR1ptODN2bXdiK0EvciA3cW9zTjhkSGRUSldEZE9FYTFFT3pXU3NtaXlDVzcxWEZQWElVUFRFOE8rUGt4OFhIQzRFZ0RnZUJwNVAyS0RCaU9FQ1dqYWlDQTJBIEEvQUFIVmhNdTJGT3hpbWRaZFFUVzFQRGJsWnQ4QjJTMkdIK0phTFlSU3hueitHOXdEekUrMUNINWFZSittVHRBc3ZtRHk4bk9FM1ogcHpmZ0I4QUFQbndEOGZVc2R1akJxU0s4SW1TSjQyeXh2Y1IwTVpyQVk3VWNQazVaOXVOUnNQVnM0Ym1DbGw0a0VZc09pUDhBYm5hbCBqUjlvNE5kQjVCZm1wREFlYlQyYzdPRTZxOXBSaHJ0SUU0UGtVU3JpNGJnSGZERndVbk0rSFhKK2UrSTh6Y2tQak9HT3lCRWZFK2c4ICtmZ0FCKzYzR0RBdXZvOE9saWkzR2FqTkQxdTd5R3JPWU5tbEhoTjhDOExQNDIrV1M0SWJnK0hMTFg1NE44R2NEdEVZem5BbmcrQW4gMTlCNEMvUDNTSFR5RWgzdUJQMHQ5emxKa3N4d0M4SFBHS3ZiTzZJRjNHQUtmSWR5REZEWHhESVZ2UUo0ZUJWUkg1UVY3TWVLcjdYTyAyd2UzUCtmVzcwL3E3dXhMNHZuNmZyQkQzOGVQQjYzWGxlcGJPdGplSlVYVGcrSHNiUVpOUWxic2t5azdnd09IaysrT05yTlpxOXlQIEx6dllRSWN3ZnJkMkFBZytmY3NqUjhDVjh6V2Nha1J5UjFXTzR0UDd1Y2VmSVkvNlVJbURGQ3lNaXV5Sk5HMmNjbU9BSlUwdml4WTUgcS9QU3lITWhZcXVKekJCMDFFYlNPdENldXN6MjREN3l6TW1hUWREZy9MbnpzeG5CTTZTNEdsaHVsQzgwT1NZaE9ibkJCY3doUHpHViBYQitsVFBnekJqT290dnMrMEtLSXhhOXM2cVhHeDJvWUxoNFlNQ3RZOWFVLzZzdGNqWTVvbExISGdkb3RTMDVseWtaUEZnODBZWG5LIGE3QUdwMGxWU1FQcFp3U2dPZkczT2xoWUtIbzYxdkhNZWcwcm9mWnlqNHJrcG9VMUN3YnJvTnlZOG1sSm9rY21qd2F1aGRmQnI0SFIgNllCbFcwb0JsTVlGSnJkb3M1dDB5bzh5eU9FT0I1OTA0WXRIdk1XekZrQjc0SUxkalBsUDBQWXpJc3JLdTBkekhpcmdnUkhQdndBLyBzQ0NnMEgxdlI2cnFOU0h2ZVZhdHdWZE1WM1kzRXJlMUxDYUVpMUs1dHBJY25Od1lERlZ6S2ZxdERxK1pCdW56bko3ZnB0bzA5TElJIElFU1FaOUJmajREZ05SZXkyRjM1bVpUQU5GdVdtOVN0UURYc2RUcmZPUTdRYkxnckE5c0thSGNJZGtXUStQa3h3aDc4d0FXb3dqTTEgb0ZHYmZEZFhKS09BcUxZVUZDQUh3SFhZTHpMOG53ekN2UHpnZzFEbUJHRzZCclV3TmhpMExrU0JZcWFucC9HNjN0UXduOHFiVjl0YSBXUVdzM0pwelJpYndiNXNqOTNmb1BQaitKK2trbVZBa1VVMm43STVZaExIaEhESWUxTmhDVDJSUnFrZUdROW9iTHVvUGtsamRpenVtIG9MdXp5QkhyemppRHdhcW1BUHp5YTQ1Mnp5QXVMaGtMaklkSFBkT0VpSmFTdDJhSVUyL0NtNVVwTm1mRGZMcnBTWTNwK09CNnIwTlYgVHlaTjlLTTJMeTZwTHNEUCt5RUEvcjdxZnZCYnVROVlpZkthS05DVURtNXlrcDF1MUVpRVJhQXRDUUx0cWsxK0gyM2NBNkd2YjRwTyBFOUhYR1o1YUt2RnJKMDI3VW1jUG56NEFCdjRFQUFUTnl4TlFGU3RrSmNkejJxdVphQTJTcG8vR3c2UE1BeFpZRnltRUdVd3Q4UEQ3IHk4S1E4Q0RobEdaREtjWi8vd0FCOSs4K2JXcFhhdkZzMjVyUUFucE5ibVVrYTc1R2RSby9UZ3R4U2dpcGRuWUhBeDRlR25yZURhM2cgVGpoMnpWMmdaYjV6aElUWUgyM2VQb1BnT2p2VVR4NHpRcEdza0l0VjV2Y3g4aGdZMndDZzk4YmVTUmp6a0NZcUM4VHYyWWlTT1EyNiB5Y0JrWmE3TWFGR3puZmhjZTdzaDJCSTFOM29NMDUzVGtvRmVsQTZrcHRFMENueElhc1VzS0xWOHdleVEzQU90bVBtVnloMkJQVm9ZIHpsRFJ5WklkdGtCbi93RDRBK1lMN0lwdEZmZ1o1U3dsSVEwT0Zvc01kRHZnZ1cydG9LcGxYcmZBcGxQdnRKaHlId1FEZ2VzYmMrTHQgQ004bkRmYTdnUjgvVVd3SDlnNmNGaVUreXZrZDgxYVJlNURocU1zaXRsTWhuT0dnK1krT1ZjcENIYUVNZXR3MC9VSmNJZGdNSTZHbiBnS3JoY1pGMDVVQ01jdEdya2w0QUg4SDQrQVA3L2doNm5vdlRmbGFUMlNlNU5WWEpKNkcyM0hVOE1QMm5jWEtWYkd3cmErNEdETlZXIHBNSFF1MHZhUkhEOFphQlpNbmFudUV4eEFQMndlNEFCMGxIaWlTTWFPWkl0TzdyREdyUTd0VG5neGdtU1B4eGJlRFk3UlJ0cnhUdEwgSzJwaDNwblE2eGh1elJiZW5iR3N0cDF1UVVSSkdidzRwaUdKNmhoWTlieXJZaHhRMmNwYWhJQWQvd0REb1ZnTzc0TWlzS3ZVcmdQaCB3MXV5RnRQY0lZUDlKeTN0bkY3TVJuanVqU2UvL1FlZmJDZkFSRHBKZkZ6VkllWE5SbGUrWlpMUXM1d0pEYTNMWXlrMnZBTVdHd1REIFBhdUg1bHE3Zklmd3lZd29zZWNOOEpPZjVJT3dkTlNaWCtuOVNJTGVWWmE0MnpESUZTK1FTczZQYkJnOEwxQ1lKc05oZkU5OE1mTXMgQ1dxb2FlZW5CMFlZVTNNWThKSVREZjhBWVA4QU1CMVhzZlZkUHJGOGNjc3ZKTjJRaHpMc2lTVnV3aDh0a1ZuS1hYTDVOWDVqZ3lWcyB0M1pWNjJqZ1hDQkIzTkdLREdaR0I3NXNmZ05nMzhCN01FU2xwMkVudmhaeWdqbUtRN2VQcklrU1MrelBsV0taazhNTVQwdTJkSUkwIFhzaG1qeEc1RUt5SXYrUjQ3dkFlMitmTldMWVFOZ3ErMWEvYXUxVFVjRzE4eXRyREgwNjV5K3AyUnVqdnhka1Q0ZUNlaDJxSFh3NnIgaFlGRGd6RlpNelJ6alpOazRSejRBZkFiQmlCNnNoVjV5T2tQcjVXbVVlU1J0d1h4cUhvZlVoU1Y1TDVhcTFmYVR3c080QnpFempkMiBPQmlkOXRWY0ZuaTR1ek5qeE44NDM5KzluN0ZCN3ZDcU8yTEY4V3hwMVRhdjB4MUx5UlBrMnhVNUlrd05sYi9GMWpPV0Q0UW1WdkRNIEJ3NUFQWENsY0NHRDVNc2xMUVJtYm11OW5UNEJCZmdDRHNCL3BQNjFGTzFGZG9mTTB6eExPRjFpYktzQmluNDZRbmxFMVRxK0taY04gNFQvNXdnWS9uNEZqVEJuMWZrM2hBaHgrQUh6NERZUFA1ZFFrV3NuaDBMNmZjVFQ3T3NlbUdta0U2U3hTNmFEYStwaUU0bDJwbzlVbSBaMjRuTUQ0VFNTUnc2dE0zMGtFMm9qbWhEeTVhUm9TWW1Md05XOU1yeXd5K210SmdRaTdoWnJLNGpxeUVOUHZDNlNvSVdCem45VlY3IHNkMnh3UTFzaDJIVGE1c0o4S0xkWDJvOWg0YTI0TDZmL3dDbjg5T1QyWVlVUXhheURDWW0vdjN0NTkreDZxS3YxZlltMWpjb1hYdkogZEkyY0VVM0Myb2J4RXNnVzVSQlo1OEh6QTVoYk1HR0I4MkdyMjFIK3pib2pNMitlN3dmQWMvOEEyRHFCcnUvWmI0WVBIb3R3TGRrUyBxeENMMUg1eDU0U0Z1eG5MczEyM1lYQmJXNjNtYmd0N0N2Z1hoa0pqQmZ1VDgzK3dmdjIvODlKTEExVUE1TXlIVlZlb2JzNFdVcWt1IDRDZUJhUFlYVjloQVNoZ2V0NDJSdzlESDF1OFlFRzJEdWJNcmk3TXJMNlRzWDlnUWZBZE9pYnVjMWplS3FTZFU4YW90NENWLzd6VW4gSnlreFRkb1VuWjBrbUVLb3Q5bExabGJiZVJaSHhMbUdPS0dDNDJ4QUVaWTdWRUJtek5admltR1pFTmorWnFpbUdSc25UaFpHY1hlQyB4alMrVnU2a1NnY2Vuc2hpazN6Y0Z1MWZBdFFjbXNpN1BXQmZaT2s2dUI3L0FMOWlmZnQvNnNoVjhneFlKV3lBekc0TGVja0FrQjNlIEE5NUQ1ZGJ1WEhqMnpyL0E2ZmZMSVQyRGZPWU51enZMUHloWjJQdWpxSFIzN3RGc0cvc0hJTjBmUE9IblJQcHUzNytKSWNXeVFqQXcgSksyUWljb3hxaDhzYVpYeGVIVDhSd2wxOEhybXRkSjl0TlQzZ3pOQXRhSm5PRWhFYjZDQUFIejYvd0JCTU5rcGQzc1F3TFNLM3JlWiBhcDlraU5GaFRLL2w4OHBHc2dLdWhwN0lHZkE3NEhUNGRxUUsvYlp3YXpHWjhWM25mQWxYSlJ6OFJBVDRBQWc5UnR0V0RCbzFsampSIEp0MkdJVlI3REx0TEhzMzNZaGhObVFSMjRuSVVWcUxDRk5sNUlHZ0NVaDNCRWtvak4zZWU4QUc0eEtaVWM2V0JPT2p3cEk1N0ZjY0wgam1XV2VTZUwyb24yUVczV0s3aTdrWkI4Tng0Zk0yL0NDQkh2aU90ckJQaTZ5TTVzN1lnejREdTZmMzgrQXdtSmkyS2JkaEZwRmthayBKakd0a2l3OVBUMWRJbVZmZHp2YUI3NjNnNE1uSkNIem0wZTJnMlREYXhhelpteG16YndBMy96NkQ1OXkycERXNEVkRXNVb1lxWFRlIGh1dDF1OVhwS3EwM3hqWXozUTJBS2FSV3BpZmZGY09KRDRDbldFQnFyZG5XVmk0MlltY0M0YjRBUVdBQWdBR0JBZmtLb0FleENCNVQgRC80UWRieFVzNWJVeUV5dDlxWkdnWFU1NVhUeUh6TFUwOS9jT1ZOcENwWUsyTXQvYTl6Qjc0N2MrUWtFL3NEQWZRY2RjVEdKSlRFZCBPWE16N3Vxa2NZUmdZNHE2MTdKTGJKTDd5bzdseDZVK2JPR2xqZDBIMDg2YlhmSVl6TWtVcEVkaTlyZFJpY3VTUU9QUFRzeks3dXk3IG15azNLQmN5M3hLZ1VrdElzazhZMmNEWTFoU21oOUgxdWh1Qmh3aFdETVZaK29DZThzbkJrTzBDZXhwS1RhSVBZSDQrQUFiQnlESmcgK3M0RDVhaXVCUTNaVnRCRE4xT1FoMC9JdGlrLzVzNkxEVi9EY0hDWk1jTEE1eHlBQ0R0VGM2YTRNaW5EYnNFNTkvMUFIK3BpMEhDRyBVdlFQWUt1blhaYzFWVS9HaU1BRU84TmxWdEZjRnF2RjJRUVQzREd4M0NaeSs0cUhxKzZVZFBadjlUTVVjMzk0NTl3SDMyRHBBNXR5IExhNXFZeWJRVnhvM080UkpkMkJWQTAvWjB3OGVYb3QzV1F3Sjh5cTJTeUloR1pha0JQZ1RtVGszZVVaM1VxNjBhdU9jQlA3Qno3ZisgbHFxeEtnUkV3UkE2aU5iZDkrV1NVaFpMRy90MkZKd2p4c0dqblMwN2JoTmp2a3JKL040a1Z4eCtUODlSc2RiUzdmbVEzeXZhZnNpWSBlQXlXd3d5TWtpd2x0TkFsWXF1K0VJYjVnSGh6RStINzc4OFRIbG1GcTdOc2Z0L3NFQUFQL1FlckVyVXo4YnJsSTV0QklMSVljVkpUIFI2eHY2djhBVUpnbW5sSW9obUcrNEJESXhyYmUvd0NFRURaOXRLcTFpamxFUEgzU1FnVklZRUhrRDhlNTZnTDZVZU9ZSkZmMHl1QVggZS9RRlgyMWFJbXdKdVNQRTh5UTNkRFYxc2ZNVDRhMnR2aEFQY1VDdjU5alBpeU01UnVieFZ4dXJYaEIrK256OVJQM1I0VXJOMHRVZyBlaXNlY3lhZTdHc2hTYkY4a1NNTDB5dVFJalVaRnRRZStNZ2ZrbGJyN0kxQVNBSEFPTVp5Z3RHV2Q3U1hiRGYzN0RBQit3Z2pxRklTIEowVE5pcnRMbnY4QUMyN3J0cnQ1OGIybXQvRWZxbnJRZHdWM0lQdGJDUEhHUmF5QTdqM3gyTnVUN2NqMm0rallXTHZUTnpFTzJzckogZnhwUU9nU3VlVEI2UW5sRmRUZk1CQkNZbm1BN2lISUI2NTdmMU5Zemh3WjhWM2taK3B2WUtpZi9BS0RzSFhHMEZLVGQ5aEZsTERzaSBtYTByZW5MQ3Noa1BORHZDdHJhVHpRWTdxSWJocExaZEpZLyt3enBqTXlxOVgyK3pBd1pzMkR4N3VvUGdEKy9wa3dRYTYwTWFhWUd0IHluMzh4UzJUSnMxZ0pPRFJadHdXTjhUZEh3ZW45MUUvamJCVy9MV0huQWRaV1VQRGpHR3lkOE1lL20vOCtBY0JZVlpwZm8rWk1zR2cgb2VvZW42NXpyc3hrTGFxOEtiNUthRjQ4NVF5SHc2MzdxSWRYbUtkQXNIOG1qWGsrQzNuWTNZMmsyb2VBSCtmSHdHd0h5WjVPOGtZNSBZK2pqRSs1VmYxSGhsaUdQeHRNOTVkOVV0clJZN0o4N1RzKzcvd0F2Wng0eCtkM1B6a01BbDkyWGJnT0hxa3VtdDcrMVNid2syUWsxIGlTckloZVQ0WCtIWEt0WnIyNHNwOHhpeU9DZWhrWms3Y0FMeHRaTjhhT1RJNFJKOEEvSVA0aVA0c0hTM2gyUUhNcjhOSUY3STdiYUUgcktRWUpFTE5SQU1WSW9keVEvaHpMVU1haEdSZzRyQUhnYkdEakVZb3IzbFdXeWJJOGJBL0g4SDdZRDUvcXMyNGJPMHJvS2xDMHhlbiBVTUNGNmpKZFVMV3JaS3VHdTA0dFRyUlpLY3d1Ynl5UHl3WXhUOWpIZXJFRDY2M0lMQTMwak1QVTdJdnI5ZnBQSDhhL1FnT0dMV0lKIGVwRCtBOGtMVFZSMlEvOEFoOWtpVnNSNlpjRmZoNzQrVmxGZkxJWDRlcERlRU90MkZ3YXJwbytCZUVQa3dzWHRtSENRbS8yNzkrd1ggMEJCNml6VENXVU5BZ1JwazJHUjVSbEJKZTJYV1Y1cmtVS2NuVXJ1V0FRTVIwbVJJeXlKRTJUeGJUVExWZDZuMzNacmROOGM0QlBMWCB3NXN0TEtXV3RqVzFqVDkveldSdFlSNUt3bzhSRGNxdmxxNnVocjliaDlTQ0daUStIOXkwOTh2N2MyWjhyQ29FYkFIc213SVA5QWdQIFkvUzBQSUZyWmhxYlZld20ybnp3RzJuY2VuOGZFbUJmSG5JOCtqekMyWW1URU84R1NEUEhuamhnbXpGQmJNc2c3UndDSFA3K0ErL0EgRzB2bVhpdVZNRGFHbk53N25XV05OMGovQUlLU1BpQ0VNb3ZGSHluK056REFkeHJkeEROVGJlRSs0a05HSjRxN01UL0tKdjhBRVd3YiA5ejVCZmQzZVNvN0dxY09MdW1zZm1PV1NOWHQ0NVFXZkdoRFhud1doOERtY3dtQjEvR3hnTGVlMUZ1SGQ5b1YrYzhKZGpTT2ZvTStmIDJEWUQ0QmFNUXNnWXU2Rjl1SjBqczRSRVVyTGx3Um54enpkZkhUcFJISkxFVmsyblZBanB0UlVLcWlURWtOM2JlNE5WY0VXYkNXakwgUnp5dlQ5clY4eXBJSmNoa2xPdDRaaFBYcGprNUx6a0xmT051RXpVSWh3OW40a3YxcE9NTS9QTGtabGw0M3ZZdmFvdGgyQkJQbjJvYyB1QmdUZTdWU2dhWlNYYUtrMG13LzR5VFlEQ1lGeW9oU2tXUmcweHpIRkQxQ0orS2VxdHFnQjJmRVh0YnlNQjBtYjdWZ0FHSUQ4dW9KIC9xSEJwN1lHbVZMYlZYb2RTdzF5OGlUdkhzaWpOTjdDK3hSZFpXaFY4MGhXNGN3WW1MZGYyb2pnYS9RNElmY3hkRGpHYzRiM3pnUC8gQU1BZlZVUzNLQVI1YVVtMlVuS0x0WVdja1JFZXdRRmI0bUpMM3BRc2ZtQy9WWmQ4cml1Slk2SlhObEo5bDFZaGpHVlgwNldXeW5hVCBTSGJZQUZ1WUFRQjgvVVFBbzRxTVlrZEpLdFV3a2llM2JFcWpDT1I2eUlORTFXSm9OelZ6U1J0YU9CQmxNQ1RVc3R4dlJrZW80bS9pIEtyUUpHZTV3UmliQkZjeG1Ia3M5UFhLVGpKNVJWNURYNlRuT0RETWZHaGhLeFVNZ0dmSVloYk1MNGRWYldDZURtY1pLN25nRHE3ZTAgZmdJQSsvSHdIVDRITUdudTBHaERxV0JjeHVqUmNPN09QMXZZTnNGazk4VGFSMGxsRnNndDhraDJwQzNpZlV0NEFkVy9jeDVROXMyTyBya2syYzRDL1c3c0RBQTJCL1dveVF6Tlh6TDRLSWRGYW5MQnVhTk12aFZ0T2oyRVA4WFNJVTRId05EcDk4cE9HNEdLNXJPd0o5allEIEhrbzBDN01PQSs2T0w5aWhlL2dOL3JIZEF0Z1YyeXF5YUdIVzBtd2JnTnFhZlJ1UzNyeWVVdEIzY2ozNHJjT1NNaTJ3TGFxMjEvZEwgVXlvck9MK2pCQWdSSkJnSDZvdUF2d0R3Q2xtaW1rdERxQzhlN01zeng3MTVHTWxOM0pOd2RvNXhYR3h3YjRaaExwbFdVN01rSTJZWiBVYnVrSEJDczQvcFgzVU83T2lBUlhkUEVabElXVytIbWg4bVlVRGQxTXFUWVFBNnJxL3RqdHlldGROVjRaQmJEc2pnbnJaRG5IOFVGIHRISnZZMURxOVpHZjZXdkI4QWdyNEFBQTMvbzhiREZtVjZQckd4b3BoQWNIeFAwdXFaakpEaDhWdG9UWlordW5CZzA5aDZydml0dzkgZ1ZzMUFiZ0ExelpIdTBQak16SE82SnZZQUFBQjUvZ09DcXRSWHNSeVpHcXdXT3E0cVJsQndoYU5uSHpGbTk3cFNtTHJsODdQekE3SSBIZkxnVzdVc3V2MjIxSm1MTUwyd21jKzd2SElPUVlvTDhmNkNuV1JNVW80ZXZtaW1hMzdxdytRMkFIUFYrV2ZNVHpDcnVSaXY5TitOIGJ3NjNNTDljVUQvOXZEczVQNnl5dkdMc2NlRUZCQWZmdkFkR1kyRWtZMUtwcUVqaE9ucVZNSkgwN1kzRzAwRFF5dWFVY3pOTmpkeGkgUEo4MWJ6TGtZaHQ1UEhKaUQyTEpGbGd5SlF4ck5yRm0rT1JYTXZaZFc1TnFIaHpXL291aDJFd3lGRk93emhHcHNWWWtDeGxqS21yWSA0NWlpdzUxM0xaUjVaVXl1WlJpVlhxcXllaDFmMUloQlYvVmxJaDhLblJRdGZKT2RLZC90UzltRW1LREplUStJUWl0MTBWV1dmQUhwIEZzRTJVd1hWTU03TExzRmxNY2dPM0ZqOWd6SjB2T2lGTW80VWlrVWdRUEJWYmxnRmtZaERsOGJuVnhwcUNpRkIvYU1LRlZ3aGlnS3ggeExTWXhvdVpwRUZLT2ZIKy9Wdkp1T3puWFFBdXhZODN5U0NmREQ5L0g1L1BWamRQdXErME5PdGxxdDVMazFCczFvbURkUjBkcXJoMyBiYklPaklhdUtpWUdXVEc0SWtLbi93Q2ZIYWh3akl5MlpXSHBSeG1QcHh3QjQra0Zoamh5QmZ0NmZCdkdreXMxaEtybTM5S1VjK3JOIFpxK0xIVG5SWXNLVlE5c2lEMkFmSGdsV0Yxc3VRRGVxeTBDbURrU3k4TWFhV3ZVOE91OWVtb1FDOVVCM0gvbUFzTVJwdm1aYzl4MDAgcm1wYmNqMVNnWXhhdjJVUGl2UTY1ZktuaXJINTRyZHdRdzVqalp2K0YrdE40R0RPVUV5WVA4Sm83OS9RTkIxRjREam91UlpGeWo5USBaNmV0MjNhalIzSUxZMjFNSXIzS0pXNmFmVnUwSEN5TEl0UjgvSkZjMW9uNzR5TTFaL2lBbnpZMmtuRjgrQUFjL1A4QVRXTVVjaGpFIHN3ZU45S3pnTHRYdTd1SmJ1ZmNrT0p6azdjdTN0SFFBTXlRbHNCbjlSV0Q1MXNiQU45cTFsdUFqOFY4M3dWUjh3NGgwZnBMWTRxZlcgNTR6WVh4QjZUZVZYM3l0UGxqRm1nQ3lkeU40WkVJeDlxQTNoUzJJY25XYjRVZWJNQmhPRXZIYUkrZllINSs2RDdvSU9ESEhXN0cxZiBEU1EyMzN5MmtpMElkOEQ2OWxuZ05aQzN4d1gxdGxmSEJQWkhDWmFoNm4zeWovOEFTOFhVQXdIYUlNM1ZZQkNmOEQ0REh6K2pUWUpzIHVkWmhMTzB5NmNGRlp6U1NEWURPblVFa01TRUtzYitIVmdSSCtxYmVwNzRkMjd4M01JMVBEdTBYWmVGeHZPK2UrSVJmcjlBWDM5Q3ggUGJDMjh2THBkM1ExVmlua3EzYWdPVFYxc2FYNjlWWkZUOWthNmJFMEF0dUV5dDN3T240TDZHMUlkb1VzOFRCbG1QbG9lYzN0MjREeSBEc0dmMkRZQUN5Uk5FczdPSENHTllnc1Z4b2tzc3F4eGFkSjU0bmtUZXhtV1VIQ295cE9iQU0yNHBFbUtCM1FUSEdWbHpqZW9vSXo5IFUyUXV0b0dQampKeDl0blNZUjdjclNodytuMm9IV1RlV2dCd2Y0aEVDNFZ1cHpLYitXTGl2aEJ3c2h3VHpDZVFXOEtsdkQvY3l2M3kgWm5qZTBnR2c4QlFVSHBENmZ3Wmp1WXlMbERnYmFlMml2UWdtNkppNUdyM2hzb1RFUE1aQ3lPNmtOazdnR01XMGVQNUlUd2ZMUVdlRCBoTHNTZGdBQVA3QnY2d1Y3WU9hZUtuc21wWldUVzk0NmVEbzBTOFdFSC9LZ0cyaEpTdVVQZ2RiaDdzK1pzelVCY0ZKcTJ4NTR2V2UrIEJON0JnQUIrM2RnMy9uMWhiVWZOVUdhREd2bk5xdVd6T0h5eDd0WkFld2c2YlhJbWtkbkh3M0RTdUhNVSt3ZWZIbm9NTVlURnE1TjUgQmRyM1k0L2JCK3I5MU5OOVRJbXFMNldOTk1ydmxNaDlDZmJ4OVY1Y2ZTa2V6bERqSnRFRDFKTSswSmhFdXk2elhNbUFkY1A0WkpmYyBsNWQrT0E1N1MxK0I4ckcrUWEzYjhkUG5vZFBxV2t0REpWSXAyUWVmR0FzNE5FVnNsRktyWUxJcXV5QTdLbmtNTFVnT0Y4VG1RWHdOIFdaLzcyOGYvQUp1bjM3WUhCM1BjTDRYOG5Oc2F0MEFEUE1TWWdkSmhoMnd4RWZCTXA4VzYvY09Id3c0Y2N5VGorbStlcXA0MFpWNnUgVEp2SENlRCtmZmdIZ09rYlg5c1c0THB1amFNMCsxV2JUMGZVVTJ1NURXTU5xY3NudEZjN1dCcC90dUhZNlRaQzdCM1VVa0QrSEo4MyBPNVBjbjRRSnY3OGc4ZjJBL3dCTTNOSXcxeFBJd0FOL2FYYzhEWEZiMGxQeU53bENNVDFlNzh5TUgwS3JPUjRSTEZ0a2RQc2F4MmRtIHM5WXhLWUdqYVVEUUgxOVBnTWNWL0RvSUdkWW9ZNEUxTVNSN2tNTTBzMHJ1K3pNMFRTU1BPMHNranZnck16UzhXQlgzRzVRcnlTU2ggb1M3SkU3N0F4VHV5QUFTemhWSG16bCtCWFFJK0hOUDlxa2FTN1FVTzdNZ2JKQ2FlM2k3TW1Ra1F3SjVzS0FaaERra01PK1BqQXQ3QyB3Z2Y2WlZ4aXlUMlQyMkNva0ErZzhCNnZJMEs2L21zQjYvUXN6K0Y0RG5jaDIzSjFJZHFpbklXaG9tVitobVE5YnJlL3VFNENubm5oIGszTjhLTE9QQ1Foejh2SGo3QnNEOGdkVVZWMlZmc0taRFhEME5BenJCRzNaTHRCcXF1Unp3OXlGWGl6RzlQNDNEbVErTjhENEdqd3ggZ3hYRnN6TURDRy85L0w1OSs5MzUrN0I3WVl6WEJWZHpLM0dkczJHdHhGY2F0c0ZzR0tsT2liR2lzakFZbVF3OWtUTjRnbnZvOHhtNCBIVjdNVDRVa20vMzhBZlArQXdMVFF5eW1IUFVPVWpoYktUKzBodVIzSGpSa09TWlozNU5ZNG56bHd5YWFObWxJZ1NOOVJ1WXg2VS9UIHhqSXJacXBPVjRyeFpKOGRURHhROVVWOHZyYTVTNlRldGtYbUFxMnpWZlZRTnI4U3RnWlNSY2d1SFg1aW40YUhNaHA1ZzQyMStlZUggMFlUZkZjWThuT2JKUGFJL3NCOSs0RXY5UExVNU1xdnZRMUxvRzVrRmtWekF5N2xlK05TRlByeGNES0t5eWt3ZTRyZmVCOFR5REk4VyBYOXFwNFlNRnE2d3MrYXE3Zno1OStBSDM3cERyRkxnOGI3VldpcFJxM1gxcVZXMnFaL0F4a05qSUIxUUZqcjV5Q0l1UG5KSm04SS9iIDZBRUVNeXlWYUJnejZTazdBQXhRVCtJRGdQUjdYOVIxL3A5ck93alZmT0ExOHNGMjd4dkdmWHVvR0pha3I0bG9XTk1JSjVpbjZyMmUgcjBQODRUNTBLc3lkb0MvYTFBanRqd0UrZ2ZpSitmajRBak51NnFTUlprWkZRNU5lYzZ6ejAwa0Uvam1HTmRQS2tuOVRmY1lKdFhJcyB0L2RvNG5WMXpjU05HRngwN0loQVJvRFo4eUdlTnhYYVlrYm5MRmVLR3dTSUJpWkFVcXhRR3AzeVlzT3R6R2RnMlE3UVRLOXFYVVpWIGEvRHBORERzckl3T0RXMjhEYWpCTkdRMmdZVDN2SFl1QTcvai9rQU5jdTJMWXNaZ1pNTXFvS0JyMXlzSmtsMSt5VGEvckl3TGxXYlkgMFdrMTliY05ONjI0UGkvc1lGUG5xcUdzMllMS0RCbTkxY2JlQUI5QkFIei9BSUJnRURCU1BQUXE5dW1wYXJyY3VCNXQyUHpockF2WCBZaG4rL0FHYTRRN0lNT0JoOFlKbGpiZTJvOHhadkpvcStzM25oQ1NiK2duL0FHUG9MOGY2M1dCSWNHTzJHck4xRG1JeVN4bUZzVGdxIGh3OVRoNHRZV0ZLc2FZd0IxdnVReXA3ZzRZa0NGbGhBNnlUVjdRc3daM1IyVGY4QTc5d0ZCQVAzUzNDTGdrbVozMFY0RVNXVWJ2OEEgekMrbWdkSlpvNHNrRFNLSDJzeGFqY0ZpaG9OaTlPc3l4U0pYdHMyclhmTjBlS0h6enoxcFF5Q1cwVm5jRlhpOUs5T0hxNU1XanA3TSAzQ2Vqc1JocHU1ZVRaVGduc2t5WlQ3SmNGZjFaWEpDMER5cWhFMWxYS1BMenNudWNBQVB2MkcvNy9NWEp5elRjbFowQnRxc2JZUXVFIE5zMnA2T2gyZVd1Q2tiYVUvaTJRbnZpM2NIQXc0K3QzaDhYejFPM0Fzck8xczJ4N0hhWDZvUG4vQU4vVzIrV1FCQjhSbnVGeHBLUlcgNDBRdm1ENUQ1aFE4SkF4V1J3aFZXWWhRekhKSGlld0FaM0owYmkvZ3plTytlZjhBQWIrZjZNVEMyeWEzTFFNVkpLRHY5Mlg3YzNjSyAwYkNzSWVXVzAwb3c3Q3RmTVEzQndjSzNZSmxPbmg5TGVNN1g4R1p0bDRUaHdIZjBFK2ZQZ09qY3Z1QkhWNDRWOEY1ZDNETEd5QmdnIDU0dmtXUVAyZWdacldSNDN5MUxZMWtMamY4NXBZeUl1bDdoNUk1ODlMeW9OYmVxZEpyQzVOSEZJMG1PbzBQY21OSlYrMHV4aUxpVHcgczFvQjdoTWZiSW0yUGRiaXR6YTJIYWxxNGg0RENhRVU1elZ3TUx6MWdxSThBeFA0WW5ycHVtV3kyQzBHRWl3V1NTZW42VVVtK2RRRiAvTGRQdTYxRkthYjAyMEM1QXhhZ2RQZlU5ZzdWbmsrQUVNRENhdWhyS3p2WnRKMzlCL3I0L3Y4QTFVdS9KR295MUNDclpiNEdHZ1dpIHZnbFR4ODdVVWovTVF4ZGhBazViK0pXNkcrVEVOeFcxV0I4Q3ErZGNuRjRETjdCN0h2OEFzQUQyNjB6NUZGNVhENTZra3V0ZXEvYlogSVYxVURXN1k0bnBTOXFNUTJUNWt6VWhkbHdmemh6QWhaWnd4V1pObzR5amZka2pZQUFEZnYzOCt0RlNOWTVFTzN1V3pzL2RuSjJGbiBtbTRxOGhndUJxbU5ucHNUYjdPc3ZLTE1zRzJhU1FJRGNRZFFPM2JrVkhGazVoU3ZiV1hUZ3FPMkk5Y3JjT0tCSktLZVVyeFNweU9OIHJHeVlqaHpLdmJhbExlenpFL1RmTXRSaGNIZ0RvLzhBbmR6U1pQYzNuc2wvWDNnRUh3Q0QxTVdRSGpsQmVTcnU3VXQzOUFmQnJ1WXIgMTJIeStlV2dqZ1Zka1gxdmphZk1Na01MR243RE9jU2ZpM2xtUjdSeHcyRHRFQXQxQkFlQVNWMFdCRG5xWWV1VTJudjhGb1czNHNRaCAyY1lTRU04VWQ3R3B0OTRmRG1hZTdUaDhFTndLUG56cGJOeWZGNVpmdXdSSEFiK0FYK1FZNytieDlUYm81TDdna0JxeDAzNXdhbjlTIEZteUZ1Z1VlaGx1V1VpV00wSjdoRGNGdUhUOE93SHl1WHpUZnNjUHhiUVU5MHFycnNlRUUvai9zRUFnMWh0eUlTdWFjNU5lSVNpdGMgYzVaV2ZrVmo4M3hIY1NxVmQ4YUtrbWl4RWUzRExJOUNyd3pVVll5SnV4ZEFrcCtIZGpHajJFQnYzVUl5ZjRRR1NXcTVVSks1WlB1VCBzaUx1U2syQytQRDBudHkzT2JSL21DYk0rSWZnOWtOOW92c0FEZ0lEWUVQUmJSY2p2VjlmYVpGZlZjMnAxUUpNWnNjQUw1SFhxM3VTIHBXd1hZNGRnVzRiaHFjZXpDK1lncVhFb0tlODdYemttRENWY2tvK3dBRDREd0Q5MGFwY3l3TEFYN2FqWlZENmtBTnlhZXdsRE9EZzQgTDkzVU9yZ1VqUnZYS2ZYNWhreFpBN2dRWFA4QTFJYWQ1c3haWnU2Q3lzSExSTi83K1A4QTkvWUdUVmJBUFl6bXJUc2pxdWRxbHFwViAxSUtiQW5tS1h0aVlteWwzbVZiMmkrTWxxVS9UNGZqWU95cS9uMGV0dkt5K2YzczMrL2dEL2dNY2VyZjZlVzFhQ0grNzZtSFZhZUZWIHFPTFZpVkl1d1dhMk4wTTNuY3NEc3F5eEZlTkZwNVpOMkl4VE1aTy9VUUhIRm5jcWZkYkVERTRpK1dCNnBtRHYxSEREOVJXYVp0UjIgZkVldkt1WVhpMm1wWFhsdXIzSjNpMk0rTCtuc3gyckQ3ZXR3WHhQYlp6Z3pQUEYwWlpCL2k3ejc5YnZQa0VCMWJsQmRhNURJdEtQRyBSTHRtUlJWTU1hbWoyOXFQZ3pYejB1RVYrY29UakRlNzN4VVlUOC9LMXo0UVFreXNyTXZuMUMvU0ZPQXpTUnNPQjNIRkJBTDU5TkFqIEFPQlVZZXRHT3BaTm5TczZVV1QzYjVERGlCVGRRZ0g0akFaVzVpMnRoeDYxTzVnaGJ3c3JQYTk1M3lyblpKQmdMZFFUL1B1bStqTEYgcUJoZEJGTlFSS1BWYWFkUVVpZlh0NUdSRGkwSG5mVDZCYjhGRFRlNFM2VXF3YzRZVXZQVXE0aU14TkRXTUZsSUJtemlQaXZ2L0g4WCAwRGhnZW9Wc1hNYXVlelVNWnR1SnRzc0lRRHA0blNhV2VRWW01SWxUWnNaaHR4Y1Y2ZnRjUG1VcHRHbGt5UnA2TW9rOVNWWllvbGpmIENtamxZQnZLdDJNRFh5Nkw4eko0ZlU3S2dFaVZrSG5aa1lhL3RTdmJBVXpFdVU3bmdOOE1HRVBXQWhvY05ncDg1QWNJSEcrREs2dVQgV3Q3U2F1ZVArL24zNWdQejFCclVOamhwK29kTlNhY0pJWWhrcjFIMUZKN08yT0FGOExSUU5ianJVWkdSa3Jka3I2WTFWTFY5OGJPVSBKdmxYVm96SFBOblBvUGdOL1BuMzhqdmxOMk1MUG9aUzREYnRxMEQzSkxEdUdUY0VzektWOVFwNW90UzhMSVQ1Z2ZlRjl3bmYrb2VrIEppendPcnhuYXVydTZKellGOUI4Ky9kQWJRcncxTFVvWVRXMVBKQVpVTnRyS3YxVWEwUzYzUFNwY285V3hDSk5odUVQajYzZ2h1RUIgVm1EQ2dzV3MyWUQ4SUQ4Ly9rQWZzSXJLclRUT2U4NXpNZjhBRlJYdC9WV2ViUG54eDFBN1NPcUVJVU96QkVycG50UnJsUUJ0Y3ZQUCBDL0g0NkZTRnFYWlByUE9TTTBDYmZLMURrb2dkSlNhL3B5WlY0SFQzS3NhWUF0U3lPMWEyNEQwTlZQRDN3NCtjWnB4WEoyWnpid2YvIEFJRnNIVTh0NWJSQVlJWjYwQU5wVEZ5bVVtK2EzbXBOUHFZZnZjdlNya3JjZWhoME5rdUN5Q0hhdXRLUFBISERqTk5sUHZEc0Q0UHkgQUJVU0QzZFArL1psdGxQcVJ6SFVaWHcyVC9PYnNybUZyVVJXVzExTTdxNnVaSUlka0I0WWVZd2JHMjJCc2RWck5tYldUS0EzYnptSCBuOWd4eDJEc2RaQ25mQ0crQ3MwQzdFaDQyTFV4aDJWUjh1V2VUU3dBWGFoQXcrSjdqRER1QzNCZ0w4REdZczltMWZqSnczZ2JCL2ZqIDZEejRCMEtoUXlNb21pbCtkUUR0Nmh2YVF6U2QyY25KRHZpTXVPMGRYN00ybGxTUnhqbEc1RTJCdXhUV2xaMXlhTjBQRmMvQjYzYUYgaktkZW1aNlRvVnFXcFZyQVRwSHFVUFY0a1A4QUt0aTBLNTIreU85bGtWc251RXo0R3dmTXJTOG1uYzJiWkFteGdFSC9BQ1lOL3dBWSA0ZUhyTlhNYWU2Q3YwYWJHcHI0L3Fkb01kNVd3cHZtSXluQVBNT1NRdzZHSDI5a2Q1NDU4cDFQSm94UVdMSm8vQ1RkNFZDZkFmUVFIIFViRGJjVndZQnpWSkRTZDBBeHBaQThZY0Mxa1N1V2FmVHhoUExoMXVHSGhwL0ZZQ2VCK1k4N1dMSmsvdTIrSU93ZjM4L3dCTnF6Rk4gNGNvZGV6ODEySldjeHUwYVhYOE9aSWxoMDIycTlxOURXMDk4cXVHWW1WdXZtR284bmdXcmMzbFhLY1o1c2JDYkEvOEFkMzNRWDhBZiBqTlBESkVyRkYweVJTTVpTOWF1SjRvakZFVk9KK29qYjZoak5IY1g4YUFzY3JVd3NjMll2Ym1YQldZK3llTndNMGQrTm1zUlJ4bHlzIDhESG5mWDBPMkwzdW01enpITVVybWlvWVJoZU5RbG5LOFF4VXJRNzAybXVIYmNQcW9NVU9ua0VPeHUrRjAwN3htekh3V3NQSVQvU3Ygd0FEQS9zSFFRSHpLenNzWGNFcXRNazJCclJ3SldFSHpyT0RxYklybFBsVkt5cis4VVBka3g4VDVqVlVpZTJ3YUcvaUZLTkJOWk9KSiB1N0xVN1JIN2RQbjZEMy9vUHFlajN5TGJCNVNsNXhLMmp5UzIzR1FaSHl0MTVrNTVYb3NwREg3UC9KdzJDR2M4OUFXeGpOdWdzWWNDIGIwRFA3QmhzRDk1OWtENGJiWE15WTVWVmVWdEorYWVweGhNV0ZrMlJERHVZQ1pjajVaQSsrUGhzaTJ5T0RHOFcybjNUMlRXY2JRMUcgSTNCemYrNEg1ZjhBOHFpNmpsbzFqWm5jWklFQWRzLzR5T2ZDMWVmSTU0K2VoamE4L1R6dERHM2RqaElTdWErRGVISFBGM2ZGVVFTdCBWYkp0Y0JPYW5QV2ZwNXBnNTZtaHJpNTZYYlQ4NVo3dG40Wmg2Y1Y5YnBOenBtbXBrZ1pvK3hwSlNRK2hQV3VaZ3RmMmRpaFlReHViIEp3bUdTK2RhYXpUYlRzR3Vrb2VjdWVxSy9sMXNDeWtPS3VYb3g1OUJ6NEFiT2x5MzhDTnJKWHpsck9OSHFVV3dyM0JUNjBhRDNwaFogbXpMbnJWbGtPQlFGWlBCanM2M2pTeFVMS0UwTE1uOW43a2hQSHZmNnBjMjVGdGlMUE5Eckg5UklPTUllT1A4QWlRUEZEeHRmdi94KyA2STJTbTRjQ203VXVTalBqZHFuRFZwWnFQVzRGZ1labG9WTEVUVmRQSU9GYnNqSmNFTndmQVo3aVU0TThySGpGbm0vKy9qNERZRC9kIDNyanAvVm84QVY5d2xWVTRFcmFiYTlVbXl0M0I4VjFOUEZMSDhGdG9CNmY0SE1XMlJQcS9HY0JzQUNiV2lkWnE1Um1HUEd5R3puUGogK3dBTi9RVC9BR0lhbFY4VnN0UlNxRE9OaHlpU0RMTUZlc2xrTDB5cjN5V3J0SGIvQUo0WWZEQ2V2bUZWUzRIVmFlekRCVFFzb3p3RSBkVGFPQXFLM1YvQitmZ0ZSTCs1TFlFTlh5d3d1ektyU2FCSzNOVzh0SHlqelIzSUtORXM5cDlmRStxM3d3aHJYMlE0QjFJUUdwa3dlIFh5aHlheThVbUVxMzMrL2ZpTHJuYXZTeDZ2UnJGS0pwMGltaWsxS3g4UjZxTmJLd3pwejJiZ1NaZTQxUERHOUhDanJqMUR4U3ZKRjYgYzBrTWtLVERtU0Rjd0JraU5DcEJpQ3JmSC9mcGUyQmJEUStOQ0crVDZsR3BPVlRMYjJubUVxbmljRFYyRk5sYmVZY0szMUNPREhjRSBPZGJWUDIxaXlmOEFxZ0ZFMmI3c2J3WVBBSVBzZmZqKzZ2TEVJWGNMdG1BeHUyL0hzbC9MVndrdzZQaUdNZTdENE1ocDh4YnF2Wi9EIHprUGdjRXdzckNHMExKTUdrL1J3QURuMkIvei9BRTRLckYzZ2tWWkRNM21ZQ1oxQmFuRFphNkVNeFY4dUhVb0d6U2pRNEQ0ZU16bmsgeitlVXVCd0xVdDlHS0svc2poTms4QS9JTDhnL1lPb3hnSUExZVBYdGpJZXlFM3lhN2N3SlRFOVNEZ1VPd2hiNG40TWpKTTQ0SEltQSBhamI0RnFNRXhlMWsxa0hWK3lBd0IvRUIva2Y2SUxjU2lNSStvRUpxU0o4NDVOa2p0ak9LNU8yZllsYzBlZU9hQXhkcFp3N2FiZVhlIEJUQ1FiM0tiYVpOdVZ0dG4zSlZyK2V2dHFhYWxOSWFJY0JDUE50elpvSDRtbjhhN1NLblpFTVhiQjRXdHNCZ3hWYkl5YmhOVlI5d0EgWG1ZekxMNHJrOThkallSSDMvWUQ0RGYrcXU1akloSnNPWlBpaHlTVEYrTkVNYzJIcENIRmZJalFBbUVGdVozVXF2Y09EbjYvNXdoOCBGNVF6TElNSTdwTy8vd0JBOEI4K2FxOWdPdG9WZmNBZStIeC9ob1R0WkhLTk5NeVJkM3lxSGlYSTVQaWVZUTdVZkdRUEFEZ3dEaFBhIHY2b0tFeG05cEJ2Zi93Qmd3UDhBbisyUldZZXVWdUhsV3F5RXE5N1lxVjNNQUV4akVmSDBYZk8xbUdCYlpFK0hEN2Z3ems0ZWVWYkkgWmlmUENiTmorTHU3cjhnNGdQYy9zRGpLTVZTVXAyV3lRWjVZeHZpRmFlUEVmeVk5Z3k0Q1B5YjZEYVZIa01JZEVPM1RPbGYzaUtXTyBaYUZuTGJpRVpQSXY2ajR3NzJGWWxxTkZTMkRMU0NqNVVxR2V6bEl2SDFPQVZlelprV3hoUGNhWW5zbHFWWE1RekErMUFZRndxVTVMIC9GL2FCblJ3Z1RnNzhBUXZvSjgrQXhEN291U0d1YXVPYmhybVpENlF5RzdDTU1qVllIUEticSsrZFBveUczcDdJeU9GVnJqQXRuRzMgZ2VFeG1HWElyMW1UNzJ1d1I0UEgrQW4vQUQ0QUFXMWRxeTBtVlBWVnMxbllDTksxTVhtR294cUVhYXE0ellURW0xTlNWbmtuTTlPZiBRbFZ3NTUwMlBQZWpNSHdraXlHdTBLejlKejFoRENUaUJOQTF2TXc5UHJ3L2JwVzlQdVN2WHJIRVR5VU1DK1dndzRtR3JVQlp0ajJnIG0yRlNJdGxUMC9lTDREekhBTk9nT0NHZHJkNXQ5cGZGbXMvQ2hOZzgrd2JCNEJVVExKYlJ4dW1YMDhNY3hYMDJvdUdhUHh1VllMQ3ggVnJ5YjRPVlhXd1dTWkNkMTBScUIzS3BTYU5ZNEdtbzNmaGFzN3RQN0FDcHVtM3lBVUEwNE5NNmhIWmVSMGt3MFliWGJTK20zY1lZRCBGcTJSdzlrWURGY3oyQ0FxcDR3WDlHWnRrU2JSeEFlQTgrQXc2amJZT0F4ZDJOVlMwM25YWStNYlUvd3g0M0prVmtZcVVEcUVwR3hxIDNZSWJnbnZpZEM0MkRxVnc3akYyWlo5dTJlK2YzOEFlWC9QZ0VHU1QwK09aMFoxalh3WkRmM3lVa2pvandlemc2blc5WHhWNlUwT00gOVBNUTdzaHJiQSs3OWFHSEQreHFHK2NtU0RZUkpxdEJmajZDQVBnRUkrZmFreGJ2eTMxT3lISzBKbGZ1MWcwYlNkSTNSRGFyQWlCNiBRbGFjRTJwVEJDMUpnZUdIVDEvZzhCZnVudXFUV1doWDVNRHRJSmp3SEhZSDdZRCt3RkdaSTQzbGtmZmRwcExETGpHMUZBTXdwM0RWIDhiY3NmemxseGl1VENVd0lJbjlJcUdLRGNBMGtaNzBZZHRWa0tQTjM0NDVyR2pzQXROek02QmFCZ0kxSnNPTkxxOFBuWFI4TW1yMGkgZWNqRlh3N2dtTWlJSFg3SnZCOHdiUWNQYkVNV3MyWWoyaWt1NE0rQVArZnQzWU9yS2c5T2VzRFR6WGtPcjJLbERWWktXc1pickl4TSBUNm1VK1VXTllVV3VMSUhtRTlrbXNsa1dBWm4wUFlBQTdjQXpiQmJ5VEJtemZzQVFUNStvdVA3QWZxd1JNNnczWjh6cTYweTJTTnRSIGowcjA1YTdoU2N3enA4cCtMeUtuSmZQNExlOTNBdDJxbnNtRDVBSVU4NHZLeGhnOFlnM2JFTHgvMlh6OXZId0hSSlJkcVEyMVg3MDYgdnRWRzhadFkwNVExWGphM2pzTDVja3E3bGV1V1FkZHRWb2EzOE8wQTdVQnNDQTFHTUhrVjNNNXlFQ093UDlQQUFNRUhvakxQMnZnaiBiVHFWV3N0UUkxNVNPQThZNDJjMm8yY2UwWThncXdxbUFkMXlvRmxFWGZId3NxSGNpbHIxQXlBcVJRakxFSElLZ3JXWXRnd21MZEkyIHFrMStHbjJSYVJaSEp6SERnZFh5cGVwWlhodUV3d25tTzVLOHRuS0g0SEJUMWxtVnFiV1daNHE0M3FIT2IvVVIvRSt3Y0I2ZkdXMFggQktCMzlXbGFBVklQbEhuOWVZQUsybnhMSktDN3VBL01UMCtxNmZoMVhxRTNpRUJUNEh3eWR2MWZoOTQvRjJDQ0EyQUFBUVBicVNqayBGY29wclptTG5WdFpOZzJkSHMweGFsWW1XeXQ0dGlpUUpSYmNLM1d0UGR3UGt3YytBejNkcWQrWDFjV2pJeHp6ZFZ2d0Q2RHY0QitRIFpoVGVOUUJtMkt4S2FlRDJwQncxU3JhMkpSd09kSFU1a3BvbE9WYy9jSHhEY0E5cWZNQmNmclQ2eXM4WGViTTlqYVQ1OEI0QStnOCsgQm94cWptcFIwRHhTYmFhakVKSWtzY3J5TzIwYlNUYlZXZkViTldSSmxTdmFReHFWZGtSbzZ5Vkk4UjNWVjl4L0gvYy9ucU5rTUZmcCBGUjAvWEw1Vzl0Sk50VkxoY1ZQdFVKWCtZNUhsNjBIeFBYK0JtRnVZNEQrOFNIL0l6Qmd4b0Z2T3g3MzcvUVVIWVBQZ0lETk9hbElGIHFaMmJUYjNhSWVBeUxjdGZkcklSNGtPcFFNUk5QUXlEZ3Rybkd3N0F0L0FYcDg2R3piVzBMS01jdEUzc2V3ZXg4L3NHSUJ6MjNhZG0gUFl2a1ZsV3BaRDNyQ3p2aXROaHVBWVRXd3F1V0ZPcnJGd0V3eENleVVrbjRiRFFCREZsRzFvMDJqK3V5bk1jZC9mZ09JREZnQUxkVCBvTmtzRmx5UU0rWUVvZHR5UWRoUjY5UFBCWXh6SmhQU2pBOWtXNGVHek1HeG5sOXRCbVJpTUwzTm1lTVRiczhiL3dDQVArZjZrT2wwIDJtakc3TnFaTng1WERhK1lOSU1wbWxLSStJdU9MZEVjYTBOdUZJVXRpdWZWNms2bVdiS0tLQ0RGSWxaSVk5dVBtT0tRRUprY2FNbU4gV2JBdSthQ3JoNDFldUQ1bXpadzB3TFQ2dUVwNjIxQjdZV3hZdUloSzdJd2NsY0dSRERqL0FKMkpBOUJzZ21UNVJ0bTlwSnQ0L0xyOCBBdzU4ZjZaQ1ZXYnhVRmlKN0c1SWFsblZMa203WUlUYm1zQ0crQWFtTEN6d2RnVDk0cmU3RnNlSHJtdEI2RjcyWU1WMmdZTTVzN0d6IGlDQVh3REJ2NEJmUHhyWVBNQVVjYkZyUkRXOVBabGt0R1dHUFRLdkUwL2pjaTlja1ZQY0VKd01jd1pHQVA4OWZucXNNbitHK1M4SjUgczhId0NDZmZzQUdQVWsyTWx1ZGtsVjhmQ1VreFZTckpwd09xalNDOXpLS0pWdVNNQWRrWmFmbXJZOHdxZ2VlQTNEazc0cnJPeHBKdSBrLzdCK25nRzY2REZKWVVrdlBHRXNrMHVtMUM3bmhvVmlmdm9qdVZtL3dBTkVXZWxhVFVNOGdrTU1jVHh4dTZFL3dBSEFUSVRpaFk0IEdKK084VWI2WHFPNkE0Q25reFdOUEczWVpTVGZLSzNBTkNuZkI0REU1UStEekQ1WkZibUU4ZW5nOVBDZjdNbTV0RlhQS3ljU2JzM3ggQnhBYi9zQURvcUtWUFg1UTVEWEFObkpOL0k3VUQ3Yi9BT0NuMGpWWXQ4TEN5dW9WZm16REZrUTNER240S2t3UGxIclpONW9lK0ZsNSBCbTlrT2JBKytBKy9kSitzNGFuOGNEbTAya3V3ZlZkTXNpVkhEWlZnVTZIUFVPOEZVTXc0dm1KaW4zRHVnWXduNEhxNERyQk96ME5tIFI4VW5IdFhpdm9KNWYyRDllcXc5UVdYclJYZExXbkJJMGo1QW10ZEpHSHB0aXdsK0F4SjRzVHFDVlliZXY0WFpZOWpXbmI1K0ZnaEwgOEVKRGFGckViY0gvQURKZnFPSGZaZ1lzVjcwK2hlWGhhVEdRRkJXTlpiVU9Hblc4UU11OXRva2pqMzVVZkdQTEdCTkNWcXJ1eUs1UyBHTUJkeDNZVmxoYTBLSExIbnFVdEN0MGVWVTlWdmtDWXlYQnBwU1l0SWg3bURxNlJNcTg5TFEyaHdYN1V2aWhsdFBzZ2V0NHZnL2c5IFYyK1RWM3hac3c1M1NOOCszL0g5RUhuMGt3QzZQdjIzTWtYUmxoRXE5clRteW4yeFc1Q1F0cHJSdzIrSWRmMVVZY0tUVDdVN3FkbFYgOERhaUdqSTJOeUU3eVJ3Z1Q2Q2ZQOTNRRDkwWDZqeWkrR3FMVWhFaTZlNkwwMUpPcTViaHZBZFdrbHBsaTJPazF5cnNZOVBoNmZFVCAvbG5yVmNVUGlpY1FlUml1aDArTE5tYnNTbmpIZ0MrL0FjQUFEcjdtWFlQbFdaTXN2V1JrMlJZYnZEZHE5VjdPMDB2RllwNmErYWhBIEl0YmNHU0dHdUFPSFQxdFZVZ0FLZERxRDhEazk4Tm13bS9nQUFBQWc3QS9Id2FTWHNlT1hVMlVXUGs3Mm4xTWc0aldmVDluaTNLSGQgT0lMOEc2RWZhRWpyZ2dUTWtBeTdja1RzVkVrY2NtTDNYWmsySXZnWWl1cDNMc2pMYUljMnBjMnlMalQ1K2tVYmNhQlQ5aFBERlNmRCBSSUdtcjRjR09xNGJKWkZWOHdndHEraDF5K2NaZmNCYXk3aEFudWdzQ0RVWEFkZ2Z1cTFBclVPV1dqMCtMUElZMjRNcERiYWNxL1VqIFoxc1E4RDJuMklteGUrQzNWV0w0WTVCTXRSRHNHZjhBTTNOODBsNmVpZkNhdTdWYytRZC90MC85Qlk3VHEwRjBQV0diUWRjVndickcgcWhsMTFScTNKV2JXOVQ5K0dpa2J1VHJJWG5HSFJDZSt1QjliVm55c0I3VUd4ZVVMMkduTU8xMk9LQ3dZWTQ3OTdSekE4SWJiWmxlNiBRYUhocUxKZWVudnNNNFdSZWRMTzh0b1Z0UjdsdkRoRDVnaG9lNEo2T0JYL0FNcUxLMFVhR1lZYy9oNFNjRDZFQUFjQlBuOS9nQ1JTIG9zbW5jVEZKSkltUHNNY1cySjJpZXZVQ2g0eTNDMFdVODN3U0YzaU1vZTRnOGNjaWxhdVNXOXBTYjR5d2ZtdlB4elJmRnlKYWZiVlAgcmRmU3ErTmg0Z2NrN2gxUndhQk13V3IwaXJubkFlWVF6RkQzWXlKNjNPNGZxMEJ2aE96QmJSZVN5RDJRM2hzQy93QUJxTGYrcW96SyAwc2hJaDJReHR0ZW03Q2JWUmJiSEJxQTF2TFF3TGt2VnlMK240OTFFOE9QWks1QXI0SEJrZVNmMGI4b213aHdBZi9zRy9nTGRabGlGIE1wWE15bU1EYU5KNVJoVHNKZXM2WHg3dWhGVXdDYmRqaGZGRDArbnpId2Y4NkJSNEdjeUl2UFA5N1ZkNS93QUFCQUh3SFNaUTdjYUkgRmdNb2F4cnlDVnZGaGc2eWNBTGlQdzdjbE5SOXRGSHh3WkUrWXlXUUhUNWtHZXZvZGpTeWZGK1RjSFNRaVRnQXFJQUFYd0hnTVpBTiBSTElzUVI1RWJMUEtYMUV5bGVVTEMrQjJvd0pTdUdMY3FUbHlBRlR5UVJaeURNdW1LeGdKdVJpTWVJM2p6WExEbkZzaGRuampwekdEIEZxVWpIQWhtTlBvRWxLMUxhZUpka1Z1U3RCc0RGTEdMSnBSd3Arck40VHpBY2ZNT0FkUURhY2NFYmk2dXNqUDZKUnNYM1lNSDVBNEMgZlJvTlB2alQ3YUdTcjVSNWtWYmFhaGtTeUxnem5DbkE0RXBYcDZwYlVzRU90dUZWN1I4SnF1a2hTMWNHSGxtYU56WnVFNzN2NEIrNSA4L0lMOXNDWlF4OW9KRjV3OTBoMUxjeXZNSk1OZ0hrbnRrNFZ5aDFrZUtHQi9iZUhXK3BCY1gzQnFRMCtsbmlHTXN4WEtMRHpnYnc4IC9qK3ZuL2Q1VkdsM1JGcGV3cmsxNmtyajczTmFUWWNnUFlWYkNURG01TzhWeWIrU0xhMjRQdTNoemxMTDdiajNmR0M2dS9aSGIvVjcgd0NENTlnaGoyNU5hcVJ4aEpQcDU1YjFKZU9aNUloR1FwYWFlVkpFRUFhVkhpaXJjam95VVNyamxMRHB5OHR1ZHdDSmw5U0NNR1BiUiB5clBHMTVOUlNSdmFjZ3ZGbTNjUU9rYjhabFZpRWRzdHFyZXdnNnFZcjhTSEFwcTlZd3ZoNmZEZk5uWkNIOGd2dmtFd3pFMWNvTUZnIHpmOEFZQUMvdi83OTF4N1F5NVJpd3Q1R2tzbXIrQU5pdmt3Mml3b1pROHY3b3RqM0J3VDdVaDF0WDYyanRvK0FjaHM1TVh0aFBId2cgUStnOEJ4dzMvb0UxRU5yQWgyWUJsTkZoTXRrWlJoa1hySUx6R2lobjFYaTJ4YlJWUHNDWnZGVm9iNHZvbGpOdndIaUd6RENuak5rNyBvMVhpZi9FUjhBQlA5QkpDeUdoTnJmNVd6eVNTdmFiczEyUWVUMmdUREZpL3VRY2hEcmR3WkZ0Yjg0MmtOOTVNVEtGQ2J6NXRKMy8yIFBnRCt3ZENJMlJrbmQ1aThxSzdFU1VEK0I3ZnQ1NStiNnRtYlpNWkNBUjFTaEtrR1JXOXlTL1V2SHQ3VXg3dk9WOVJxdlpqNVh6d2sgVDZIYW5ZUEFUNHpGVzlxTGFldzR5M0xpOWpKOWZ6RTlEcCtIL3FOWmFlZUJvUzBNM1RjOWtTWFlHZ2dFSStBcVB3QitZWUpnT3Z0VyBselhKUHF1TWg1dWNObHI3Sk04eEZQTU1UeUhNS2dNSWkydjRIRU8wTGFndzFtelVOWFdWa0hWd1EyY1BnSDgrQUFlNS9xM1Y0YWIwIGRqWkhaSDVzdDJwbFUrRVhoNkhaMmw5c21SU2paS1BWWFg3SndOd3ArdHg4d0gzQVBja0dlMytXSnY4QTgrUHZ6OXdEcFYxV2gxL3EgQ3NnQ1ppMXZHcmRJRzF1dmN3MVVTQ3hoWGNxOXVTdVVPd0poZ3h2RU53UTlocDk4ZUZzWFJyNXVlK0JLU09QSGFJL3dGKzgvMHd2QSAyY3drUTcrTzg2UllZWUVZV00yeXZKcTVYR3ZtK0ZxclIra1JTSldBL0FJQVB3UHdPckthVjlBdEo2aVJWMTJLdWwzRmZyWE0xRTJhIEZwNklvSzl1YW1RL3FySVo2UVdJUDArbTBhcHNRK0JKU0JwQ1NZQTUyQlRJQXNaVEFSbHRoRWFUeUdXQzNzK2RVTXpMYXAyZ1R6WWkgSlF6L0FCRmIxSC9TYkJsTGZXYmJRN0VMalp3UUxHaCt0bEVVc1dVcThsU3dNYURsSjNvS0M4a2tVbFpDemxaTFQ2MXRxakdVQk96cSAxRktvTTFrQUFuQ3JQSE5aR3ZQUEo4SDhkVVpiSk9QbjkvOEE4Nk8yVXdodTR1eUtsWjhtcGM1a1BhaDNlbjdoY2JZTG1JdXFEVDJWIGl3NnZXcnNUekVNT1FjQWZIM3k4SHl6R1lwYUZaak82Vm9wS1A3bis3djc5MHd0TmEvUWQ4U0dSdHVTeWJhczdXdmFrWmhwZWtocXUgcG9jcTBKWjZtMDhmTXJma2pKRElHSzVzcy8yZGhrMFlvMFBTeUROSkFRR2Z3ZmorL3dDd0grcTYwK3JvOWxsYmFmQUtlTkpac01sZCAwaDJ5YS9kNFpTeHJZYUl0a1dCTWZFUVBhZ2NoRGd2bG9LU1B5Wm1WMWQ1dDlId3RJSThBSDRCdjU4L2dBUHoyWldkb09TL1JwUkR5IFgvVXNCYXFCWWJnc095VmFKTDdqVU5iVlh3OW9ocmVCaERYMCt4Z0hhVlZNYllydEJNWjV2ZkFCL3dBK0ErZ2dBV0dVcEhEQnE1a0MgUEhnMjN1K0pZcFRwMlg2YlVlbnFkb0xJUVk2TVlKV1NxQk5OSWt0VGFTQTFXY0RjeG13S1lncnpJbEhiZXV6SnUxc3VKaXQwOWtmQSBkZTZibkd3dG5xQURhTnNOQklDckZsc29VckpEaW1DRU44bUo1aUVQMk9CWUFHQ0haaGF2eVluMnUyUTV3SFlQMzhBQUtia3VqVEk3IGd6OTBaZDFyamdHaDZvWlNSWVNocDMwelBZR1RWQ0hGeGdWV24zdWhYd3Q0d3daNkJaUUpPcCt6TWFiR3ZHRHJqZzg0SDhHREZnd2YgMEY5Q3N3ZmFsalNLOVF4YktNR3U3aGFJbXdGWmtIMkZXNkdlYkhJb2hqMDRPWVE5NHNDdHppSHhLY3RreGo1VitCTTRFMUR1Mi83QiB3RS92L3VINmQ0OTBKRmR1eWFLSkRVbGNNZHZTRjVKNUNzMXZnZHhnWlZxODhaRTlidFJhWDN5eHVQdHB4YjJ4b2FFWkdlVFlNM3Y0IEFDQVBnT0E5RkJwb29jbGlXR0RjdWVlR0NsZUhWenlTUzZnZ0QrTFBKRis3UGJzWTQxMER6TTFST3J6dU9OeDVCMm9vVVJScXUyY1kgNG93cUt1UjhFOFhRWHNqTHVqTkZqWEtWTWJRTFJaQ1NXWDhUQkJlRGdRT29VQ0xEMmd0bVBoaDNBZVlCcVRBZVJnNjFXWXRvNHlkOSA3UndBUHo5K3dBTmdmME9rMys4eXJoYitsYWgxSXdoNmV3bk1EeGNld3ZtTXFrZTByaGh4Qmx1QlBXeDlXVWZaZHdIbFd0eVpOb1Y5IFBJdzVoc2h4OUFmUVQvSCtqRFZvd1dmcHptVzBCeWlTUlhyYUhrdTZQTTA5dkNRbjZnNHREVmZmSGIrN0szTWNrK3lJOWFXQUFPT0QgTlVDSHVZdzRidEZKQnZ4OCtnL3Yrd1ZRT01tdmhTbHRXanhvY0kxTTFwY0ZYYWUwOERrcjh0UHBzODJVMmVjR0JrcCsxSHhQcmNmaiB6eGdiZU43WTBQZTJJOTJHMG5Eajc4Zi9BTnZuN2xsbW5RQ0ZZWGhibFpMM1lGMGpZN2txeUtCSXNqVXVCU0NUYnhheFpYb1RGQ3JFIE1aZzZiRUt0VzN1VCtwc3ZhbVdNNGpjNFNTVEVzTWlNaGMvZm1XMFQ3TVQ3a1hLVEpRMjE5Tnk3QWhqV0NrVEZYSWRzT1N2WkJCa2YgV1N0OEpnOE40L2c5a0RDYlRWN04yck5wR0gvL0FIejlxRWNwYWpKY0ZiMldIMVVMYnJhRjhhUzJFeFlWd1hCL05LNGtDcnd5TU44byBkUFQ1akE0Yjh2bmtma3lNVmFCbjVST1dpY2ZuNEFmd0FIOGZZYk9ORmJ1N2dTVGNxMmttNXNxdHlUdlpEaFpEaHlRRFNOODZnbWh3IElPRU9xME13K01HRnhkd0xMNUpXYU0wYm16YklrblBBYkJzQUEvdjY5ckpMSVFKbE1odXpMdGZ6YkR3Yk1GdXZWLzhBbzJ6WHhEUSsgTnVGcUxiZ3RrSm41UWdWV3lMTmx0QXRHV1RtTzkrNTgvd0ErNUI1NFpBczBibDBSbndLTXpybmxtVkFOV3RZNG5pemRqa1Z5eU5kaSBTTjFkenVPcXhTSTIzVm1tTEpUWmVWb1pENStUd1NUTGtEbEsvWkE5Tnd3aWV1RXBLbThHRU5QYkhCWHNhMkZkTlpCNWpqY1BUMm4xIGVHMzZ3QjRPWVVaaGJRVFp2MlRrSC9ZT0E5YWdhZXYyMGNBNXFHN0d5VEpDK1c0QnpGa05rd1hGNTRVY0NESW5va08xQTQrWjVEMlcgNnpadnlZTXdTUWpzRC83Qy9BSDdvamZLM2JOMHVXeTIxa2YzWU5waWtzT2xiT3IyOEY3dEs1THlhNWNmaG9hNHR2aUduaDBjQ3dLVSBGa1plTDhHV1FuTmpld1B4OUJRY0QvZ0o0R25sRHltZWl6NGRYV2RYeUhHaVdBQlpDQmFZVXNZVFhOalEyQXpEbUtFTXc0TWlPaHAvIGNVUFdiTmFIYUJHM3U3S1RCLzJEWUFCOCtwVlZJMjFEK25HemwyOE5zenJoUSszUGF5UE5MbVdIQzBBWXkrb3Z4dE9qNUFWSndMcEggK3k3N2pUWFE0RmRMMDVSOTRDMXVtZFYvTUFtbDIwYmF0cXdrK3Q4bFhMVEFMa3c4OFErWWZjR1NxeC8zeXY3YU9JZjFkREp2SndJYSAzdysvWWJBdjgreFg0R2p6RFpROTZMZC9UeVFRbGFyaEdpRURKNk1wclo3NWZLRnZaNWhoT1pKZytHcW9kZ0tWSDJweG5sRE53ZjhBIHY0RHdCOWYyRS9aQTRuMHZRVGd5SkR1NFdqYlNsVXFsTEgyRmZDT2tHQmFha1BseUxhOHlKOE44UW9hK1lWWjdBcEhBL0p0Um4yYmUgM2FyamlEYnUvd0RIMEUrQTZvcnFNMUdHSW9ORHlVMndsczlhQmdLSnNnQ2sxZWtXUEY3ZXlnTmtPRXh3RG1Wc3dQMk95MDhmaFZheSB6Qy9jbjVzSmFnRHdIQWZZK2ZOV2tsRDRpbmVNeHM0NUx5UFcwSzRxOFgrVC93Qk9pMllvWDNnSDJrcnRkOHNDY1J3Y1I3cS93am5wIDJVbURYd0xKVDZtR3BrYlpFcFZzaVhwM1E1aU93NzlLMVlKc3BrSHdrL2toZ3dQaHRZRlA0ckRKazFmOHZnZ2dRM2ovQVAwRkF3YlYgbUE1aGwwU1QxZlhCYUVNODdOc1MwR3JKSHNNejVVUXB3OWhZN0hwK0h4dGc0ci9QMXluckt6cU1LYm1kN284NEFZYkFnbjBIWUQ2VCBaR1I4MUJTT1d1OXAzWlF6Unh0VHNCcVdxbnB6ZEs1TEpzVmt0QjhEOGtyY3l3R05oNGs4TWd6aTZ2ajJPQ2YxQnY4QXdGK0FlL1N4IFpJZHFHa1BUSHFIVGVTSkxIYVpKaGFFL0pqdTdnTFRSTFJWNWh3RDh3RG1BdzhNOEFSNkhjY3htdDhweGpmY1VsSmVOZ2ZqOXVuOS8gUGRIaExxSlpKdy85R1JWMGJwRWQ1MkNCRW16UnBJcnBzV2lkYkpiTU5TMGwyUkkyU3M5eXU4ZGtrZVBQWXhEVmxsVGNmYjFkY2ZhRCBRK0E3M3lseDJ0RndZNWdSZXFlN082R0ZrVkwyOTBseFJEQjlQbUxka0Q3SXJtZW4yWDNJNHlyL0FKTUIyaUVka2JueDkrUDgrZnV2IHFXUG9QS3F1OHJ6MVlYTkdoSGtPaW9rZXQ2bGdTMlI4UE80dDhjT0hwOE44aHA5Z0dQZ01DbHZDTXNsRU9zOEtyZGdsWFBCOSsvOEEgYy8wZ1d3NHRORHd0dHNwd2Y3bVBPRGF3bUxnVlhCSVE0dmNKTkF2bjVnVzVsd0J5Q0dDZ0w3YThJYnlUUTlzUnFyQ2hPY0w3OHdQdyBEOS9ZQnN3RDB2MUxxQXpyYUtEWkpLcjVqYkVNV2NOVjNlRytIbCtLK1BqZ25zZGIyUjQvNTI0S2ZKRmtZTGZiTThJN0pQOEFUK0lBIC9zQi9ySzBNZXBURUx0dVp0NWR2c2RPRnRkTXlqYjAzeHVGSVR1OW1RQVFkUEU3d3M0ZDd6UXFnWXhQRzhiNFl5T2tjc3QzUklWaWggSEpCTjlyeWRLTHl6eGdEbXE5blA3VXgyb1NkNmZhZ05UcnpKWE5qUzFlTGFZK1l0bUszbVBsb2NxdHFuN0xlSVR5TVY4ZFFvdzU5SiBCNytBL1FCNEFEbUthM2hwem9kM251d1RubWNFd2FHU0dIczJaWXd0c2xGSVh6QTdJaHpFOVBoMXlBUUlDcis2QzNuODJCSGE4TGRRIFQrd0lJRGZ3RjBqQlJnWTdBaHJrYWlCcEt1YkMwOFlXQlE5RVUrd2hoWXZUZ2h2aGdneWQ3SmpoRHdNZTJvQkUrWVR2TGdaTWw3Z3cgbkFmUC93Q1dPQUhJZUE5WDFlWUFvY00yU1NNR1NuQnpVK1dEV1JoeUExUFVvdDhubUZ1R3QzWmp3K3VRTlA4QXoyVGpQQTFuWS84QSBwNEFCdi9BZWozRkVpaVFQSnR1anEwYTVJMUdpRmV4ZDhXY2VEOGM4VzBlMVcyMVBKblVPM0xGanR5eVI4eFNvdTJUaFpJYVRJR2ppIEVETlhzNExiRHhUR3l4NnJHR2hrcGNFN0Nuci9BTXg4aWxsY3B5QmJNOHdzZ1BBaC9QWUlBUHRud1BqSXdIaWIyTS93RS84QTViL0cgNWxrVEhLMUtaYUNpVEdQSWFTeUtiVE5KYW1DeWNyNmMzY1hLbUVROTJUR1I4M0J3VmEwcjk4UjBQYTFlcjJhczNnMWh2bmdQb08vZyBPbmtQQjJlMEdIQmN6WFlKbmQxRUQ4d0FVLzVnc1d3MUtyekI4TU90bHc1ajd4VXYxV2sxa1lVNE43RysxeHp6L2dNZVFkVjFGdzZiIFY2dnM0emxYbGYyU2VzbGtyTGhOaEIySmtWOUw5aExCUmtZQTc2dGw1aWVQaC9BUDZlY0RMTVRGb1pOWk80NE94emdIOVA3L0FMQTUgZ3NpeXFqb2p5cGdxcFBWMkFTU2R2a2drVUtGMzVIU28zK25sMDAwZzNFZ2ZNbThLNVhnbW05MWY3VjROOVNSMmkvNHBiWXpxMTBSMSA3MjlxcThuNWVxOGxRSWF6ZmxJWWxvVEVOZ3Nkd1Q2clk3SXdtQTFOZzdjTGRtUE9IR1diR3JzRWtIVVFBQUEvVmZQZ0lkd1Qyd0MrIEorL1dRU2hsRTRsTGFLQnNnZzdoMDArSlRXaUd3TGNNUGpaRU1neWNTK0FxNDdZVUtNM3VrODMzOEJ2NEEvdi9BRVNWTmZsUVY3UzkgMkdiTGZCcmhmdWRWMVpWUHAxcDlmU1dRQ0JpQVhLSHc5OFpBOHd3UHNocVEzRFRTOEIxbXpVTjhac1Fac0did3c0Q3ZnUUYrOEI2NiA5VEdaYWo1UjllMk1yMWpvblR3MXdWZFoxUDN4UnREOGtQSHBjV3IwOWZ0UmsxT1RGdUV3WVRwN2dBNDJ6OG51VDlmQ0hOZ3Q3bndBIEFBUDlMMGNpaVlxNmYzbU12RVo1VWlKYmNpMDhvWlpKWm9kM0hNcVFvN2Uwa2pNVTNVUnVnRXFTN1Y3TXhXSmNMOGtSM2sxUnBaMjEgcnN0dk9YQWh1RWV3U0NxdUZIQnRzNmZrc2dtdDlua080ZXI3UWlYeVVtY1Bxc3c0SWEyd0o2cnFISHozZ09UR1BuMlpITk8zZ1A4QSBZTDl2NTkrMVBtTGJrNFBsU3E5TWttVXlIakZuZ2srUEVOOXBGellVT202VC9uSzNobUdQM1ZWSmdVWnk0TXMwWVVHV1k4SkZvcFBBIFFMOEFQbmtBQXdIMDBmVDNCRGlIdFJpYllVYVp4Vi83UExkOGNzcXROY3Bkb1hJaHNER3lWV1lFV3F3UTUyM25rYTFFWW4vVE95VmMgRVIwRStnN0FmQVB6OEFiTGhSbW1zRFhhMmRNNmhGdGIxU3RWKzJ3a0dOSzVoc3V5K0VLaG90Tm9aR0UzbUM1bnVBKzJLM09PQ09uTCBQQTN2a3gxS2RYWjRYd0NGdjYrQlg5Z05wWW1kY2RRN3phaDBTVEN0UnU1RDFTYktiV2RLQUxlOGYxeXRVa2pCVVJvRWhvUnFpbGFqIE5ZcVQzWGpqd2FGMmVCMGpxck1FTFFCdFZYbnM1MmRwK1FOM0NqY2xmc0prbEZHR1ZiVGc0VExzRHVDZlpGZ01pcUJISHZoczZ4encgWU04M2RpT0F4UDdBZlBuK3VNNkxtVnBsa29zREprd3lBMDNadGZrczVnTFE5K3IyeGtNT1FmR1R1cFZhM3ZFRjhUK0t3L3E2dXNqTiA3OS82QmZqL0FPbVBXbVpSK1dHSVowb1c3eVQwRE8ybXlEekp4T1loeWw1eWNsdGZEdUFkOFR3OWdUQWFHd3dIakRnelEwYllETjc1ICsvZ1BmMzJDSGtUQlo2M0s5UExnQkpyMHlxcmdsSEpMYlJFaHhSZTF5azc0ZmRTRytjd1QrV3I3NU8yd1o5Ry96TmcvZi81ODJMQlMgb1VIUnNBcW16N3pXMmg0UHY3cUk4WThna25vVmlqRHhHUmNOUWppUjJzc1ZqUUROcUFGMWtPTDV2cG5WUXdGREpSdkhpODhrbkhnKyAwdENUVlk5SS9pTWxXRmQyOE1DR0h0U245TVFldnpFN2IwT3VVOTVXYmthS3oyTTJrdXlPQStncisvOEFVWWx2QWhvMDhPQzVtUTM2IDJtZjhVQmx6T2s0R0U3VDdNcVlVbnY3SkMweHZrUzRIRnduVHg0RTM3ck5OcXd3bGlGeHh4QUFRR09BREFBQXhWakkyMDNYeS9ES0EgVlcvaVZYRFZLV0hNQng4U3Q0dnk5UVRRbnVFeGtRdzdJWVlERUVDblZvMUJpZktFUG5LT2JkZ20vdnlEL3E3NzRYdncxUjVldXUwdyA5eHdORkZCQXFIcHF2Nm5ENHpUTlpUSk5ZVjhCcmtNLzJQZGlIYWt4alg4QWFDdjNTMHA2eWpxNVIzck0zZ0VxOEhqanNCN0ZneHg2IEF5d2lRRk5OYVIrcXVvRUd6L0hYdVRVU1FaeVNGdStSSGFzVnlSZUN4TWxMQzMxVzRhamk1TzRJNEUrNjdYMlpWUUhma1JhMXo1NVUgdVlCbisxZEdLVGhpQmNrbHRMMkF0aldDdlU4bzVDWXRvR0Y0UFZhY1lUN1VYNGJ3ZXZDZk9tRFBkWEp2T3lKSnNHZzlvbjUrQVg1MSBaelZKY2tkOG1XMWJRb2E2dmpIVXB2QmZyR0dyeEhDdWE1WHFscS9iekFjT3lVK1hIdzJvQ3dQaXJEZVhsREtlYzgyY1BnSDQvc0gwIERyU2p4dzlHV2pUTGxtNXphaHhja0hxRU0xSkRYNWEyaEFaYWEwSWErbmgxc09ZN1h6SjF0Sjc1T1c3eXJOWFY5enF2c203QTBFK0EgdDFBMy9mOEFwd1BGTjJRbXZGNUJXaGJHMUttSGtBcXJ2bGUxL1lSZzkvWG5IdmhwK0VNejh3NDJzRUJWWkhsbUY4bUorRU5uTGRZRCArRy83QjFGUlduelp0eUhaQ3hpYVd2VG5JM2tVNEh6dHgyZjBCUTZoWm80MlRCNG5FMHJGV0ZZeUx0N2JqemVGdFk0dklXUlhTQkYzIEFEbjNSVXBxZ2c4YXZTYkl0MWtZcGs5R1hxM2ZEMFRVdlhNejRmYmQ4TVVtUE1jdUgyWGFnY1p3TlhKNEE5NzV3L2NmZnZ2d0RvYjAgOTJRMFBsNExlYUJvRzlYRFVqTWRyQzAvNU5NMHV2VE5Qb0YzUE9jTWhNdUJQWkxVbU9Fd0hTMVgxcHMvZkxGWDFNNmVuakIyOC92LyBBSUFDQTJCa05oUmtybFB0clpyZ1c0UjZaL0RMcVFxVjJxOUlyZFhQZDd1WHVENDRWdW4zeENJT0VGU1lKNk9ZUmJNYUZmOEFLZjhBIGZ3R0w5anNIQVQ4Q2x0RDRVdHlacWxxVnd2VXd4aDBpd3JRdFFPSGJERmpQaFo3aXJiQk1tR0dSd21YQWgyTVFyL1k4ZU10SEdkOHggcFFKNEFBdjcrL2JCMW5NRzVGR0dMbDVFTUtUWllmVTR5dW0xTklBMkc3R0lwVWFudzNIU205ek5CVlp5dDI3UExLWTFBV09GMWhlVyBOa1cyL3dDVzZzTEYycHNZMGJjVUZuVVMwNTEzUTdXdHJUZ3J2Q1RmTGdpdFNscWh2alVKVUYwS3I2Q0FxT1pjSVpwRTBYZUt3a04yIFZoZDg2ekNBZXg4MGZNWW5ZVFBobER6RTF5OGNHY3RuWGxWNjExQ3N5ZXpOUUhSMHA2ZzVrcXdyWHlXOXpGQmF5dXllTmMvUmFycm0gbTF0bWZEQTV1SUZqZVIvanhqa2NwSUxmNGpZdG4xNSs5Y2ZETWJ2WElrWjBZMDZnQURWVEFDZ0J4d0JoL3dEcm4vZjhjd3RxUWFiUiB3Z2c4ajhIc3NYWDY4MStmeDA3RmUxS1R0QkxNRUt2UGFoNlp5dE45dE8rb0JrRHVHbkJiMUdWelRqMitUS2ZUOFhDcTBLcSsyKy9FIEVPcTFzb1RGdm1xc21jcTRKd2hnQUgwRS93QSszOUJzVzJXeElwK3pMQ0YxVmJVbWswaGtVa2dmTVpLL3NPN2JRaTNHQmloNnZwOTggdml0Z3hnaERWUU5mMldxekZrbTBWZjJ6ZUxSQ0JLcmZuNm9YNzZEc0dDeEh5TXlxaGpVMFR5U1RWYXZXQVJlWDJScVY2OWg2Z3F2UyBMR3RCYnRCd3JkYmgxWE1JTWlPK2FmOEFVdHh0bXhGMmdzczNhNUpOblAzL0FHQkJBWXI3SXFkTDFNVDRhZm84dTUyUUxJZDNDN0N5IE80ekI1WU9kdENuTlJnSEN2OTRXMzJiaXdmQmdWKytLcklzMW1ydEducXpQN0Z6L0FHQkJmdWZZOU5FV0RmM2lSR1FhbU40M1FSRFogODdSWVJ4Umd4dzkyVWpFbW1GS0tOcVY1Q2p0RStEcnBsVUlZUkx1K3BCRlNzZFBQaklOM0pJNlhjSUl5N2JDbGZKQ3U3aStaV0RXTSBhMUxMSkVpMWdYWW41RFlZVFFPSlJvbUR2bVkxdlZaZ2hEQnFSSGxTMzR1MEdaRzl6ZUdKOCtBMy9mOEFwd0E4eWw0cWZxb296VmVTIGJUeG5tMXNMK250SkRpUTljbmw0bzVUSENHWVc5bkRzQzNCVXZPVldMNVJ1WXp0ZHNtd2Z2Ky84QndycWNPUTdHcGV2V2hjZHFsQW4gZ1FSaHE5a3A5NGxzaXVlcHg4UEtEaFNjU3Q0Y3poNjJjcVhsc0ZPWmZ4ZXpNeHdKK3dQd0RZSDdrRDkxUGJoSERWM2NFQU5aei9ueSBtcXJpMWtWWFhzaFR1Q3hsZDNpeFE0NkgyZlczQU9QTVFZRTl0VlhDekJuNXlSdGtxNTI0L3dDNTgvaDU4QW1IVHFZNjNKcy9xWkdWIDl6MlNReXRGSkV5bGUrTnFSbkZwbHdQdHN2ZlVzb1lsRVhjaFZuaFFZM0hLZlNjdnpkMDlESGpubnFCcitqbmpVT3dwK24wWGtJRGcgR1pCcnhaQmkxTG9iUGxSVjVYdEJQSHA1aHdNdzdUVCs2a0RuaHpqSXlyeGZiUDhBcmJZTmdmajZEMG1XQlR2UzBFdXNSbGwycDNnUyBFbGJVMkNzV1F3V2gyTmFDODBLOE1oTURoL3ZnL25EYW4wdGhXOW1icGdqRXpnUHpuQWZmei9UclpOS2kzZDB4RHRYVFFuMlFIRnA5IEoyRTRXb2trQ3hnQ2VkNVFHR3dUTHNRMDhQaVE5cXpUNjBuQjBZWXI4NVovTnUyQi9nSUR3SG4ySElmSmprNEFiQm51d1JrbERXUkkgcmJoUkN2SmxjZ1dIU3FMVDE4UE00MnRtWEJrYWxLME9Lekhrbnp6a3lPRVNjQWUvbnovQVQvVDBlV1RiMUNNam9FbGRYZDlxZVBIYSBzRFQwK2VmSDlWY2NSN3N1TWJMR2QzTTRUSEN1QkpCcWFCQi93WmJYL2JjL2RkQitZMEhiQktVL1BnYWRQbUJWdlM3RXA5YnIxZlNOIHFWMGhFVFlUQStVL2RreERXeC96ckxUL0FKejRNc3hvYUJuM2JtMkIvd0RZUDFBZGJiSWVLcnErME5Mcy9TKzcyUWVmRENrV2oycGUgVmtSTEl4MCtxZDhTZzZlWWhtSzNUekh6RlgrUlZVTm1SaW1DeXMrRThCdi9BRDQrZTJEcGhvOWtHTEJob2ROMXlueVZ1VlV0a1hIWiBCSnczWXhTTXFJbXl1UHNnZ3doc25JRnQ0bjh0T01oTkg5dVRBOTdkZ2V3SU9HQUFBd0g4YTZzbUZYdERBU3FxVllTU05hUGpPN3dIIGlPSHc1UUZJYUpSZ2d5T0MzRGh6Rjh4WXo0NE5yWHRoUVp0bXgvZCtlbitmZnY0RHFFWWtpWkxoMHFSckp6Nzh2YWZIYUJnYjkzbjkgZE5rWE1xc0p5bW5lUjR6NDI2MjhoWE9STmlqYTFWMStMSXI3UlpqdURBMlc1WE4yZnFDOGx1d2w5d3NKd3IyOTJqYWJHdEJQcS92eCBXNWhEcmRnaHprTlBmSnpKV1ZHdEZvTEt6UjNOdDhYMzVCZmdIOS9VaHlPeUdXZ0RWUlJFR3VGcXpHMVRhU1ZTcDY5RHNZQ0psQVEvIEpPSDJRbnA0OTdzYXlsL0duWHlzaGd2dG1UM3QyZDBmMlA4QW53QUJCUHp5M1ZjaHlIcC9QTE9sUGpia29BbEd6aVRSTDM3RVNCUXogSEd6UGRTR2hrQTg0OHZxV3pvM0E4Um14L3dDbGZQdGdRZWZkS3B3cDRIVGJwbkdmOFp0RzBQV05PV3c4Sk5QaCtlSzlqS2RqY2tYKyBTT0ZWMlFZSUIrNVk4OStyTUxReGpOVlp2K2dlZklMQisvbjFMRXhqWnJoRWhkcFkwaDhHVHNWR1pyL294ckdnNDd6WnRmSFJTU3FXIDdPOUI3WDhaZUw3ZWFyL1Uvd0RucXdESVFiS2d6TWtYY2lyWkZlaXlmNHYrV3J4REFFVzJXZ1ZEa09ZV3BEbXJpK1lSMUs4S0g1aDUgUm9zejhYWTlxN2RRWDc5LzM4K05SN29qMUFRTUdjb3c3S3JkWkZiaWU3UTB3dzFYYUF0ZVRiR1cxK3QxdStKbFBzakJNT1ZMWDArYyBZR2VLODRrcExzY0FQK0Q4Z2dEL0FFU0tkbU5sUVRJWXVWY0JKMjAwbmlRbEhBMkUwWEU0T2RYaWRSamtoajF1K0hDazJSOFgwTTVVIHBEdW9ZWnlmM21qVHFUNE0rQXh4QWMrMzgrc2N5dDZqWE9ZWVpWUDFka3NhU3R4R2pPczRPa0J4Y1g3UUhzQjhVRENlWVF4OE9DZVggMzFIcmY3NTJ5M3dJN2ZmZ0FEZ0o4QXdJSjkwa2tRaURNWGoyazA5U1o3dThKL3BybmdrVUNSTXQvdlJJSnEyMHlkY2w2b2FhZWFlTCBSUVJKTHFaTlNZMWhHMURHenhRdklpeWIwcVJ2bmd3VXRMSHQ5eEc1ZEJuTGJRSE0yQnF1c3QzMUxwTmtXcm5QNG13RW1IWkFoOEEyIGdrQWFiWkI5Sm9TRlQ0Y3dQV3diYmFGMHduQ3pOMHE5WmVYaXJqaVQvWDMvQU9tbGtNQTlYdytrNlJ0L0pxNnVMZWhza3V0OTQ1RFQgOVhwdHh2a1Y4c0Q1bGtUV1d0OFdNNDJrT0s3WU1GODVKZ3pic2I5bjVCUCtmNkd3SDhQZWF5dzdRbzBiVytKU3NkUEM5cXdBMjFZQyBRSEFGRlA0b2RmOEEyZlo2ZlQrNWRnWHhZMHdwV1NHcml5WnozMk0vdjRBQjFpUFQ0Y05wL3dCSmVvSXpYcWtxYVJ0U3RrY2dEMG5iIERZWTFMZDJMdUYxdllINUl1elRlaHI4TTRCNTVYS2Z6bXIxZXMzbzRFQ0cvUHNHd2IrZzFGaGtXV0RZVFZ4eTdhVGxwb0FkUHR5VFkgNllad3Zvekx1UzM5TXRSeUdIYzNEaTNwbTN2cHRTc3I2UXhvWm9zWXBkdWVLWkZ3ckJsbGhhU044KzZ3cmRtUGszMDJtUm9zVFE5RCAxSWFMYVdBMUxZYmJka2FuRWRxczRld3A5b2NzS1Jabkc3VUQ3eEQ0SEJVaHo0cWh5YXlyVVBaZ3paS1RObXo3OGdXNkE4QUE2YWpSIFg4eG9lRnV1V2xWWEUreTZIU2J1c2kxRStwMGlxKzQybnVyM3h3WUdSa1QyUlBXeURnRGJVOURnekVZWWhpK2N2RHQydTM4LzlmUDkgVS9NUjJSdHpEdHRKQzNKQXdLOWtwRWN3N0o1YmhzVmlWMWVHUHJlbjBOa2hoMkF4VmZNSUNOTUpqR2w4L1pEWnNHL2U1OCtBdyt2bSAwUHNtcnVDcUJTR1MwcTNTRDFTcnhBRVNYMnd5ZnRDN3RWVk5HTjRmRERnNFRmQjh3c281RHJNWVVxOW1XZUU3SWNBYkIraC96K3ZiIFVOSVlsU0h5MGdSUDVKSVl0Tkd6bmtWblZnYzRDMXRydnBDU01TU3h1cUMrQlVhOTBhY0RuYmtWSHMrY2NhRjJDUmJ6QmFsTXJHSzcgM0FicjFjRzF4TXI0bERqOGxLUG4zejhiZGszRlBtZk1PVDZQN3hHQ1dQS1AxK2tuTmdBYytBZnY2OUtJK1pGa0dHamg5YnBOSXJhUyAyMGRrbUtmTFRMa3FXWll3R0d2aHc5a0dFTndJR0p4N2xxcmlNWm53cHdibTFYWTQ0Z0Q2RHo0QnY0Q3hUd1FLYUxkUkZBeFNsaFZkIHFoc0daVGRoV0FIcXRYWGtNbzVSQ2xqUTA5Y3NoRXVDeURJNThPTnhBOGpwNHg1KzhqQVpzMmJCK0F4OEJzQitIanZqNWQwTzVrT3QgS1RHbmhWNURiRDFFTlRLbnhFTldpeEpUNEhIMnAzSW1NbmNDbm9ObHVHbmlxK0RNMVhvYnk4MVVraE9jSDBHM1FIUGdBREhwWi9raiBrWHVTVGF4T1VxRTdsZy94eVIzalFQZGQzd0ZvNU1qWm5XVlpEY3pQbkp4V0lORlJYejdXNTQvTmZtQnIrUUhyU1lIbEhsdXlFTXBYIHJzV1h5UjVYRWgrR2x2NU53bUo4eVlZaDg4ZUh4d1BmTUoxQlY1VGM2UENKSnM0ZkFQMkMvaS9BRC9YSGJDZGNqa3QwL1E3a1NwUE8gRElnMWhhQTQwalhwbUswQ1h4b21MNGN3SGNIeUc0Qi9uOHRWVnNtalZlVlJoaHdJYi9ZRC93Qit3WHo0QVB5NzBTMXhmaDgzWkRTRyBtMkgyOStHQk1NTXc5S1lVMVgzQU90aHc4d3dubUViY0ZJNHVJenkwYm04bkhaSjV6L1g3OC9IOS9QeVJnVWpsQTluU21oMlNUeTVuIFJuZ2crS3BCaGNKTGxRM01sdHcvbkU5a2hzQWV4cDYrQlI1aXlzYm9NR2ZzWnozWUFEOXlEOVZKRkZOcUJxSmY2RXJHTlBQcWJMUUYgOHY4QTZVOGk0NC9jVGZGR05OSXVqbTBrY2FDR1ZFamRVR0Z4aVdLYkUrYkc1REd3UEdJVWpuS3dIbytuL1NmYlRaRW9jb0hHNXo0dCBrbUVPU3poN3ZXNVJwMzZ1ZjZ3NUpNWlhEbkFHOEt6cXRiSmpCZFg3WjdPeHZ3Q0NmK2duei9UT1J4K2srZ3JnU1lyazdmNElZYS90IGkvYW1vclRQU08xaSswdG9KL01GdEQ0ZUhUNFlOOFQzd0hNSnJOb0lqeWpXb2svK1AxRmpnZndQcjlGWHlSUWRCWFlCUEJpVC9xY1QgSWVuaXZTR1NIVjRqSUJpbHBSNE80US91QmdPdncycm1GYVRUQ0tURjkzeGlPYmRxdUJuL0FPL253SHRkNnFHQVhZTlpxb3VwYXhqTyAxYU5Wa2JobldvdjJiY0Z5SGl6bVVaSENZSHArNEh3T3dJYlZwYVh3UGsza3FMV1hudlphSVRqNS9ZTmdQOW91dFVramxtUnAwa1NSIEkzWVJkdTNlVkxFYmJhdm5JMDJkTHd1UE9kSTJEQTdTWnBobkZJTnhPK1NHSmNoMlpWbVcrUEIveFdLdTJZRHE4OCthZFRMNHFqYWwgcHNrdDBpanZselNJa094anluWE5qSWM5YnJlMUxUTUJ4OE9kWmRnYkhNSjRGRmNZamcrRW05L1FRSFBqNkRicjhBZ2FucU9xOU9lcCBRYlN5YWtrdFlDdVNKV0VPMDlwOGUyQS9BN05pdVZxRDF1bnpFVGpkZ1Z2MmxjSHl1WHpreFFYdG15WWZxZjhBUDdCMC9TT1pvNVRRIG1wUldaNW1vYXlOVFdjMzFsVyttdXZYRmVtZ1UxVDlQSXdEaGd5UFRJdDRUSnNERjhJYzNSbWpCNlJ0NkNPcU93WXZ3RG41L0REcXUgRnVCNmZxcExkdU9nZU5tUTd2OEF6aWU0TUV4b0Y3V2VNTUNmOHhQaGh0NGVNVTlTcmtNVFdkMDkzalpEZXdZZTMzN2dBQzFaWHlvTSBNWFpDeFhDUVkxeWoyMk4vY0tQZ2M5VUk4R2dkZXpUeXlacVlwckNid1d3UmdNcXhCQnNYYmNDdWJ4NWN5YVVPV0ZWVit1R25oT3QvIG45c2R6cmdjTVdROVY2NmUyZmpjUFRHSG1WdlBtTlRhdm4rU2M1cHUwTnp3Tjcyam4vb0ovZ1BuNmRBN01GdHNQT0RKcGcyeUMzWUsgSmptTTRna1E3UXRDcDNLS3lYQnZGSkdFOHdRcXVxenllZWF6Q3lUS0ZNU1p6WkRaejNBSC9md1BSVURiQ0VTeUZXd2MyeVA4QThZciBkVGtLc05vaVRHZ0MyV01CTU1JZjRiSW9KN0JNNGlRc3RINDBURjdwdm05bXpuQVQvQVVFL2gwK0dTUmREbFVkdE82NDRFa2x5bHFWIDhoNzRzSWV3aHhWWDJFTGNqQkMxSWRWcDlQaHlFejUvTFFlMlZBVW9jWXMvZHZBdndCK1A5Ulcya0dJc3lPaVJvZTFGdThpOHROajUgRkREbWp5RDVPUlVkb2JXa2hoZklnNU8yR0dPRWRMbGZOOTR4b1dUZkJlWTByNnJLQzNqVEk3aDFKcXpiVVVxOWtNaUhVN3ZVRlMxSyBrUGpraDJCVzlielM3ZzRZTGM0RnFRK0N0bENZdmMxbmhKc0lqbnovQUlEZitmZFU2b2VPSGNpaDVEdWxxYmVCdmkwN21LOXIxZmxoIHdNb3RkK3pwOHlHdDN3SHdIdUgrK0UvRjVWMFBrMnlXaTdnd0FEWUFBQStmOXV5czNTdThveGMxMG5qekphbW9LWVNZVmRQcCtweE0gekZOK0xUZFZrSzM1ZzRXUXlNQmk0dFBBL1R4VmI0TSswTFBCd2lTa281OEI0RHdHSFRPamhsOTNaSzlGcGpJT2ZDa3dKTFQ3T1R6SSBuaHNxSlkxMzhQWkpnY08rTWkvREJuazVTbkI5UFROVjc0ODc1c2h2bitBRC92d0M0ektGQ1M0RjVDR1pvMDJrYVFWbXlvekdPUE94IFlrblhrY0ZxTkFGakplVkdkc2NWQ00yYjdmRzJrYTB0NGQyUjRza2NDdVdvbjJRMFFLdnJIS1YzMXR1d3BNcTVnWWJDQTRWazRPVlMgNldoZFN6Q0MyNFZ2TVQxdGdEMk5BcitmL1V6NHJyT0FNSWsvZnRnL2Z6L0lGNnJsQmJROGZLQXBMSmNHYTRSdTVGUHNsYmlUQ0kwRiBuS1Voa0UrR2hodzhOeGZEZ0llaHZHMkV4YlE4NzV6Yll3R3dZZ1VIejZDd2x1dDdBc2ZUM1dMSGxVK1M3Y05WeDE3VjZUazBmYkFhIExjYkRGc1o5Y082aWZkbGI4Z1d3ZDAvYXZKaThHZEZCbTBud0Q4QWZ1QStBNkNYU3M0OWZITzMyU3lEVEdWVzZBa0dLZnM1b3JIbmcgdTJFUGVDRVA0Ymg4d2VZcm0rRjQ4OE9ETXNxNVJZMk01dlp3K0FBSC9vTDhmNlZEQ3BkOFFpYmFaOWlFWlVWRkVxenhIOGd4eVNWWiBCQTdiY2U5Y3o3NTBqZGo1cXZBeWJLVnZubVNSL05xRnRzckZhZHpFTXpjbW51VlVyNVVySkZieVVTUTFMWml2VnNvQ0xIbGYrY0RoIDArSENJVEFkdE1EYURtNERLdktjbFI3UjJUei9BT3ZhSS9qMVNmTUlhZjZic3c5VlF1WmpNdWxEUUw1a1dGVllkc0RnWlVTeGdNT3cgQThPSGFqSk1YMlMxSjVEVFRCV3hqTXJxNk1NdFRBMmN4QWZsMStRUUgyQzEwTmtwZGpzQ3d3MWwzbEpKVy9ENDhZcVV3cnNPMTQyYSArUGpnUW1MWWV5T044RDRsd0lHSFJrWXB3WVlqaEVrSWo5M2RnL3I3RHJ5U3R5aDgxY2VEemxaZWRHVzN5dlg5dGtOVU5vLzJtNUFiIEk0Mkhodmhod0lUSzVudU05cVpFWlpmUHMzQ2NQMy8vQUtIOE9yZ0xUdE9JODAvaVh2aWxqemtZTnRoTnhZOGtreFlwSXQrRGFEaXcgbnJUeHdzVVNSSk04R1dXeWNOc3RrTU9QY0FPVHhZNjlhZEpuL0ZjMDhhZEUrd1U5RGZkY05HK2svYmpRN05OY3FOZTZOejZZRFppNCBkWkhmRlVERHFyakcwaUNIcllWY0RaY3RnajdsbnpoVTdOenZWNmNQWDZNbkt6cW0xaEhRdGZGUmlmT1k2WFFwNGdEQnpaeXQ2TFRiIGxCT2l5VE9kTVA4QXFMMWJLVlhXU3BPVmJOL29LK2h6WDJwUUxIRkwwU1dFbXFySlQxQkZlRENoWjFuazBtdUxzVTE4S0lXT0tiT2wgYkZiRkxsc2k2Qm9HaGZIQXZoc2VxeFJGd3ZGRkY1ZWFBRiszcHE2ZURGaTZvTlc5dFZocXVXNmtvanVGcDVsVjhCemRPRmFRNU5jcSBaTS9ESVBjU3E0WWhEUHVJU3ByUnVnM0N4WjN4Q3Q4WHZlT0tQdndFRGhoaWZBOWNkUmxMRXpVdlQzVXU4WEhRTlM5L3F5MUFaMVlNIEVwYm9jWFhya21oMTlQY0xoUTdVcmNlWHVMYjhZTEp1ZTZJMitKSVEzaHY3OXNHL253SFRzaDZnNnp0cExzNnRHM09XNnJRMnEybFAgVVF5Wk8wdURSVGVuc1dodzhHVDRkYnA4d2dIc2F0R0RnNGprMkJRbVR3TnUzK2RSY0JBYi9qMGt5aEJ3VjNCVmR3T250YkdoczVidyBzaDJWRTkzTVJEMU9DbnZ1ZzRRMCt5RU53dUF4QmdML0FCVXdNc3krTVZsNUIwbTdWZDJEQUh3RlJBRC9BT1hUZVBUSklpaU9ZMGpQIEZwdFFjOVErMURwbzJFaXNETEw3Vkl6bE9HWkMrU1NLN3J4dElYUjVjb2tsMWNja3UyYzg4U3FReVFSbXNXc0txK1JaNmdVdWt6NVMgczc0VXQrZnpDYStTYkRUMlJiSHNNT3ozS3duS20rWVhBaHZsMkliNHdUSndFZUJWYklaaWRvUGhNbWNOaE44OC9VSUEvVVQ4L2RXRCBzdERFTGxkQjgxWmlZV1NNVDVWZlUvQ0F1K282SEUxQXFUT3JxRUI4aFdQaW5USUdOUE50WVBic0l3WmFjdEZHS1dvRUMwcWJZQVFEIEJldHpIL2xRRlhxdklXSmZ0bWFqM0hOZG8xYnZjeGpZTFhKSjJOc2gwNlcyT1N0VmEvaHFFcmRiaVZ1UlpVaUN3SWNHWXNyTllGUnQgbUEwclZFa25ENEErZnhmajl1OUt4bzFFM0l1VnRUSXVVTm9xSGJWUHJkZTZSeHRlbzZuTXJtN3E5UTFkYlR3OE9IcUVEekxBL285OCBuV3ArNkkzQi9OZ3ord0gwRFlNZGdaTnhIcDVSUENpYWpVbkVNL2UyUVFHRmtvYk1qRURibXlmQ205TnI0cVAwNVhTU0o4OU5DcmtuIHRqOUlWdUxKenV4cmxjc1dLWkFwNmdycHRGSGdQWDBlYmplZFkxS0h6YkkrV1BNT0RBNzc5YUFuR0t0cjVnT0hwUGgvdytJandKeHcgV2JNYU56WnY4N1UvZjlnL2Z6eW43Y3pLSGFLWXYyQWVTYkNsT3lTMksrb1NZT2JMVXRvQ3ZWekVXL3lvSDFJZk1YOThVckFnVHZzMyBLRmtZYzdvaE5nd2ZrSEUvano3cnNPSEVPcFJaS2gyMVBvSEpsVEpLUVIwb3JjZTdvZGpGV0ZEc2F0OTRUNlRzaXQzQlBoVnkyang3IFVaWmtab0tFeGxWdXdTN1B2d0FBZjU5ajBxNFlkTHNad0dzYkhwN2RnSzVUOWIxbFYrZFlkZ1M3Z0FpNm4zNll2Sis4YWtLM2hwK0EgU0FQYmJVTU14UGk0c21ETmhPY1AzQVFHSUFCajBvSjlSWVZaaWl1eVdrWDgxMDJtZUNmTTFISkloZkxiYTlvTFhOZ21PMlVWWGhNayBpSzZzelNpT08rSFNXS1dDUGNjeHM2TXF1TnJNTVMyUUJHN1F6SFN0Q2cwRGNsMlNaalFrbXl5c05BdERZdHExU2lYeVZEMmRQcXR3IHBQdzl4ZTZrRGNDZTE4R0puQWdUZk1kL1BnTi9BYitOdWdjUll4QXhRVmd0U2s3TGpnRUxFS2ZtUnhKaFhhRjVvbEIyQmJEb2RxUTQgYkFIc1o4Y08zTmJqQmxZRkJndEhTZDhPSDhiZC9mejc5MGJLQ1d3VnBoTVkyT2gwaElzWjhHMmE4TlVPdjc1bXVSUVNydnNQdFd0TCBkMkliSXZ6RWREK2VjVCs1blBHWW4vRU83Y0gvQUgvWU4vMkJnbkdETmQ5UGI1THBhbVZ0M3pibXVOSXI5MnlVK0pEdVMwRk9yd0FmIG1CZ3hUOXFKemdIbmNmc3RVVHlhTmFEUXNvd05KN0pnd0I4L3dFLzU5K2VId2xXSkJqaE9ZUzEzbmVOTVJRcXFQRm56NTZHT05Xa2EgeWpaSmtNR3l4d3c0UEE5MlhCL1I0NTRFSStaVjZSUzlZWlI2eUpKbHRBaEMybmVHSDAvbG1Sb1Y0ajVGVHlFT3EwT3QzQXhZQzNPNyBIMlp4c25aaXZhRkcyL3duZXpoOEF3YkErL2ZnRFVUNDh5Z3J3Vzd1S0lkdFcwME9CdGVqekE5WHRZZTJuSVRGVFE3QlpFUCtUZkdDIEpCUTdnQWd3NnlNZk1MTEdXb0V0RTI4QUFHQUFCajduejRwRHpOSzhXcTArQUFwaS9xWlRYYXJsNE95T0ZmeElkamdWUFgwbXA3QlogQmlxNWtNd1FEMDdBcjhDRGNPNWpRME16TmdiMlREWUVFQWduOS9ZRDYrWHhkb0xpZlpDUTRrbHRWUFdjcFRLZWZCcWVKTUhrT0pGbCB6RSt5SzNmRU9ZWVlBNXc5ODg1TUdGTjBXU1p3NEVxNUhRUUdMOHZyNS9mOGM3WnpMSzVURjJUQm5XTFprT1FERW8rVDFoR3Nqa1VjIHNBT0xzVnRSb1lVRG9xS2dqalZIaWx0eGlWVW1OemptYm90NHhOQnVhZG1veTY2RGQ3NHV6S1VnOW8yUnBvMVhOdE9JRDRCZUpmOEEgRDRocEdvSzJsc2dIUTlabHdlOWZRL3IvQVBPREx5eGZFYmZQTm83OGZQZ0VId0dCOUd5RGpZMGF2TEl2aDhvMGJwWFYwTlNYcmdNMSA2cmxvaUdyNEhrMmlLL0RRN0hwOWtYRTliQjhmUFBBZDVLZmVmTnBQT1Y5K0FnVCtQZ01PT0cwWmxTMTNEdCsxUTZpQmlvYitKSHpGIHNQRVpMR0tjb0tQZzlrdUJDcCs3RU5nTUhGSmZiVGFmdGl1TEpqRGxYQk82Z0RqK3diKy9QM1QrYzVpZkYwdjE1Vi9iRzBZWm1zYWMgYkxZVzYzSVhIVzlvSWY4QURrZXRSUFkwTzdGc3VuOGtyaWxpQUVFWXJObWZCYk1NcXMyazRmMENnbjkvQUFPaWoyNDJpaXdtazNwSSB3elpibFNDU0tSNUtvVm1ZbEdOL3ZJMVJZeXRLTGFSQmh3bVpxa05CVUI1dkNqWjQ4amdmS2xCaTQ5bGc2M3FyS01iYmI0RWF2TDRGIFZSM2V0K0dpWXRqUThONGZJYWV5TDdLRHJUdG8xSWRaMW1VR2R6QWV5Sk8vNEFENEEvaUFBSCt4WGtMNlpJWkRPbmhEcTZ3bDFWVzMgY2dTcjIyZlBBWWhTMEpsZ0I2M3VEUm5RNGNldGc2bEhVdEJyWlpHV2hjb3orOXZHL3dEcy9IMEVCMFlPQ080T3dNYlBxNXdaRSt5bCBzYTczZzFYWXZ1NmVMUTdaZlNqNVg5YjJSMmZEM0FQK0RQOEFudkJoWktOQ3VUSm83dmFJUUhzQitvY0g0LzFJMVBEWFA0U0liUmFDIEUyVlcyTFpKckh2YzFPVkVTdW1pcUl3RlBnR0dXK0tIZTRaOWFzWnNuempuR0dhNDZjZVNuNisrT0dLL2dBd2ZtRDFNWU1pUFBMTzAgMmNqR09LT0hIVnE3MDJ6R054cWttazNIVWZkeU9NTFlRcDNZb29EdDV3eDd6enlneGlBV1pMWXAyK1YrRGY2cmxmTGR1VkdHampTbSBWYWlsa3RHSVJzSDJFcWgzZUdlVjZSeFY0ZnpBNGR3TU1nL1k3TEgyVzhCMlptVnlpTXpiMmJDWUgzL1lENEIreHg2Y0V5MUNqdWgvIDRTdlQ2a3lXZ0haUGozbGRpK2o0V05WK3dpK1BoNWkyNFF6QkRFR2hzRGJCRG93eERGc3l5RDJSMi9ZTmdQOEFnT2h0VHJ0YmFMRWEgalRjeVdRcWxMcjAzeExRU2RuWVZzV1VweUxhQ0dRbVZXK0dIQnc0ZWpUNlBQSTVoR1Jya1YyWlplTFJDZjcrL1lFRmc2NHhaVmthRiBmSmQwTmtOMHkwV3BHbHI0ZXBhSFlZYjRoTmhTa2JnSUIyUVBERG1MQlpNSURoODViV2RyN21lYk5WY2NRVCtQMzdwWnc3NHdxTTQrIG56UlpMa2lNMllYY1hEdC9qWXIzVTlONHJsaWJzYXBPVWRJbWVSQklSY2I0WUV2QzFpNUV5b05YcDVlR3pvSTJIVVpBeXI1T1ZtZ1MgV2RZS1R5eVFOeVEvK28zeFdoYklUZm1XUXl3MC9BSDRGSFpHYXMyajdPQ0NiSituMEh6L0FMbmsxYnNSb3FOYmdQbWRVcUpXaWVGRSB5S3JXeDhSYmxKdmU0cE1UM0F4TTA5c2plUVpIaERZSjd4VmF5elBtTzVnd24zZytBOEI5ZzYwbUNoQjN0QVBYTVd0NU9tOThQVmRFIGFJZWRZQmFZZUtGbWlWTUlNajQrelRLMHZoemtCUGJaeklUSmkwTjZXZkNCUForNThnNGJBQTZuckV1Z1dac0d2TXFvTlBkWGFleksgM1VyQzBXclh6eFlYS1FKYTVLYmNHRVBEY0Z0a1pDRGhCN1hXMGM0eVRhQmIwVFJ6YnRzZkFYNyt2dC9mb3dZTVNSbWtGQ0pObmN4aiBJQldKV3pGeWRwd1d2VTU1WERrWUZCR0FaVStwZG9KM2tiRk50TWZXbWFqVUVlUjNZNjc4azcxeDVVclFRVzN5WmJVdGp1d2Flbm9hIFRFdGh3dmlRMk9Ea1VhOStRMTlibUxiSlZjTWN5UVo5Z0tYMGJsQ0d6REtydXdJRUJuL0FZWUlKL3dCeVNIU2VuTmNzVjJzRUZxV0ogSWRsNmV5VERkSGJHK0Y0T1VBdGtxdWEzWDRaaGttYk9uaC9uODhnc2hNWWg3blVEdzdKUG4vdjNnUDBjMWx1bmYyM0xDMVNuZ0xhKyB6NzQzV3I5UlEybjFPeUZjQzdnWXEyUXF1R0hNTGN4Z0RxdkgxRlZXeG02Q3hqTnZlOTgrQVB6OEE0Q2Z3UG9jZlUrWXJoMVZwbjZlIHlUSkF0cEE3VDBQWVZQeThhNVBDWlVWOFR6RVBDR1ptY3c0R1E3VlRMTVdTaFNvRms1K1VRZFJIK0Fuei9JTU9tamNqWGNDdkhJRVkgeG82RVRySEdVeGpFRjkyT1JCYmNYNEdQUW95eVBTMk50RURzMDI2alNjNVNPK0NiT2RERmNYdWozZHZOdXRSRXlHTHN4MmNyNHRwUyB6dTFjbnRQTVE5TjdadWlha0liUkRyOHhXL1oreUlkZnZuUEdDZjNJWmhuRjJhczNoMjdYV29md3QwQUFRUHZ3Q3Qrbk5rc0RTcmJrIE9BeDNOSkc1VkFqUk9wQndsb0V1SFEvZU9JTEREMXNQYWdka3VBZXlVRFpkd0FVZDhHRENpSHhuL1JNRy9iRDlndzMvQUs0NnZUNmIgU0FWL0hxVnVDaXFUaVhBN01OZldFaDFlSm1LN1JVOFZYbVU4K0lRZXlGdTdGOWt0VGo4ODUvUWF1amV3UUliUi93QXU4KzM5K1FVRyBYZE8zOWw1Q3FwejlLNlNaZ1Z2YUZybUxzdWFuN2pMMmcwTUlHSXQ0bUVObFdnNWdjeUJEOUlQczViV1hqbmlNdGZka2xIUGNCUHI1IDkreEFBS2xpU1ZGU1IwS0R5RU9kMkVEV2UzRzQya1FWWjd5MzJVMXdob3lKSVVRdUtKTHlGTnVNWTV1QmcyZFdMSGIvQUttNjZqcmcgWkI2bFlCNEMrVzAydzN4d05pVS8rSlpIdGkxSEpYc0lwYlZxTUw1VDc0dHpEQTVrcXZ0ZEFWV1Y1WnF2UTBaWnczdEpCN0FmUG4zNyBuM1RPVjNoUERKeExVRWhxdWt0cUtETlBDUlg3c05SMkhhN2FwRUNMUWlIOFFtOE1qSlI0ZXVIeFBzeXVRNnl6UGlHc2pMVWR0UEZvIHZINkFQOS9IdzhvWXJPcWw4TytSYzZuQnVVMUlFUWhlV2NqMU95TkFHbkxhS0dIQ1pEVG55RytFRzlIUXg5YVBDRzhyUDhSbFpyT0Qgc2ttM2pZSDdnSi8rb0FrZkRiS3B6SFpTWEh5UUJybmNuY2ZOSlVmTG1XTktZWlQ0SFQ3c0Q2dGVOMm9BaG5BSSt5NExJTXJNcFZ5eSBqSTlYTzFvbzRBQUFQNy8rL3dBSmNxaW9QWWlxVCtheEFQNjhIam5pK2VsSUZDdTdpMFhISTM3YlBISHpkVi8yK2Vud3ZodzlRVldOIC9oeStQWVdWbk5seHEyVG5EMnh3VndSYXBRS2VubWFmY0VOd3NoZ01BNTVCdFIvdk5YcTlaak5rU2NEbmdGOUJQL1FhanJlMEM3UWIgZmhXWEtBRXNaNGVOM0FRNjlZQzB3b0FYaWprSFQvc1llSHlCa2d6Ni9mQVFjWjlvUnNOOE4vOEFUREVBZjJBQThkT2FuWGFZVU1WOCBwRTdJU2RTTHRaRERUNEZ3c2o1dHRTbE1ERjQvczZmUStudGJJTWs0Q3dQbGN2aU5qcUxGdkpNNWRuTmpoOC9VUjgrQXdQbitrRXVPIGlmRkh0UUVDN1NsdXkxdHQ0TzdWSzRkNEtSQTFQY2l1K0w2Zjh5MUliSU9zZ0dmVHdLb0gzTVdMc3pZemZlMUh2dytnZ0FIQVFDQy8gUnhXVEFTQjJ4YU5IVERPUHdyaHNtcStiRkd1Qlp2aTFYMkVTYmVtYThXeHp4ckMrTFc3c2ZJNEh6ZDlFaVdVc0JJS095dFhPZDhPQiBxS3E2WXIzblhnZDM4OXRiUnQ2R3lCOW5jUGh0UjZ3Sit6TEx5K0s0ejI1c2s3QUFBWXNHUGdEN0NxY29sTGl1cXl0VXVtL3Z3Qm1WIEsyVmZROVNvSEQ0dFgyRll3c3d3T0hMM3hrY0NIZ2JCVWdlNS9RM24raWRqNUIrdXdkUUxwYkRneDZoRU5qeWlSc01aWkFuZUJrR0IgNWxQN0RXVmNpMXRmVytOcDlrQnVTSExhcjdzNnR2Tm1ZN21NQnUyeW5INEF2b1BQdC9BOVpJVDFkajNnVVVQRE9XL0pZWGxQc0tyMCBmaS9jMG9odUxBSGh6QTVnd1FoMk1wRCtLQjFsNTVRekRQQ2I1c0h0c0cvOURHR2VPRXpMc3U2YWZVbFBmamxsMlpVbDEvaXhIejI4IGRObTIxbW1XRjk2cDNoak9PRzRZZ2dMZTVzYnpISGRYNXF5RS9wdktXSllLbXQxS2VhdGdYQTRTV3Zub2NqamNYVG5wN2FVMXdyOUQgUTdnc2plQ0JpQ1ByODhxbUNiTVVLWW94dzJFZHVBbjkvQUFOL0FBSFpIRmp1TmpTbVZaMWdjdEFxVVFmWkMzWUFtbnhjcHNpeW9ZKyBIVytHbnVaVmZKR285UjZrcTJSM2Z0R3IvQmhFbDJ3OEFnZ04vUGdENlp0bVJYYlFZRHo0dGhTVnRqU1ZLSW51Q1RJTEdGY1hYdTY3IGZDaHc1c1BtQmc0MnArK2NaKytQT3hoQWxvOEIyREJCeC9mN1VPUHlFUFIyZVZ6T0NCUUprT3BDZFRHa1ZWY0Y2SWV0Q1dMS1EyQU0gdHc2MytHdnZoeXl4N2JQaHMzS0ZjbXNnd2dUNkNBUC9BTC9oaDB5YUNkdHA0ZExDc004elFrcXRTZlp2TWt2MmJ0eDJNVFdDOGtIcCBVY3NjU01qTzVtaVF2S1ViREtpaFVFZDllR28yZVNlRGZSNW9ycis5TDRZTEN6VEljYldLYTFFa2hvckZVejJGUFBSYkNWOVFNTWdaIDh3WXNnaERlRzJ3SHVjdHJETlE3UzhveVBWM2d3QURIWUQ3NkFBZEo5d1U0N09RTVpwNmpRaUhjR1R3amJsdStONGNwVVNMU0szOE8gSnlSa01KN0pYUE1VT0FubzFaNGkzblkwazNTWndBZ24wSGYvQUw4ZzFYVDZ6RjFubUt2Y0dHYlQ0dGhqVjZ2MlRPcGN0LzhBZWEwKyBsRnRmWlRDZkRXMlVnWXFzOFErZE1zd1lodmp5TWVQdXdOQkFZZ0FIZ2VuOUl1ZzJrTWZjdE5Hb0JqS3pnamJYK05WMkJiREk1Sm9sIHlWN0lJSjhOYm1VbkRIcmM1U3ErZk9oMUF6Q2lqT3pIQW1OMkkvQWVmYkJ2NERvWWpxWW1sZFZ0Sm5WOU84QnprU0F4eFJPQTFMZ1ogeEVoQm8wVnFqVmszd2RWaEt2QS9PUWRmRmxDT2JGK0QrS3NmbnJ6QTFoM3JxM2Fya3pwajJLVnFmTnhWa0RrWVY3cEZVNk9pMWVDaiBUdlRLUGVyMUZWS1hZTW9yWGxoRTU1bWNWYzBvM2pGTHdaMDNKS1RCdzNFeDZJRWZPdmFGVjE2aGt1VTVab2dqYXRlWkRtNHpubk1yIGFocjZyeXA2d3IvMG14UWFPTldsNUl2SktaN0JIZWpZaHdrem5TcGsrS0hLWmhmY2wwUUlDeVljREp6clVvMHlLaURUZjJsU0lpak8gYVhPbFZSM1pGamthTjJ4Tm55YTZYdmFueTJyMHp0d1dkWFFLeDRKSUN4S29CcmdBQVVUeDBqMkZmWHF0cnVucmZVZ1F5Sll6WmthbyBNK0ExZXZKelBTWlRDRk0rdW4zWmZLQWlVUE5oa0dHYVptT0JwYlllNThxd29ucHJuT3lxdldvcTNYdVg2bHIxM3MwdzZlcTExUmY4IFV6VUpwL3R3R0lrSTZndzZqVUtSSlJFMnVhak9PbVFzVmRVQjRPd3V1YlZLVW1oeVozRWk0VHNUOFllRkVxcnRGZ0M0TDJzTTBQTG0gNU0vT3M2NWVzZHhISTRkZzZwQ0ZjTVF3RnZ3R3V3UDBEWFF4QUNSYUFGNnF6WEZuOG45L3Zyenl2aG5LYVg2dDB2MlRTUHBHS1ZpWCBGL3d2Z0Y4MkU1emdvaHlMbjIzVkN6dUt4Y0lMTnlYbUV5Q01oQ01BRlJYRmhFN0lGNVl4U2pnQi9yV2NCY2o1V2RKdC9kMmsra2o5IDY0V3ZncVJnN0EwTkxVY1BDaFVVVm1LY3BnOVQzbEI1aDRldUdSaGVDc2xDWitQQ3NNam5LZUFMTGtPbytIajZjbkxWTXYxS3VablcgZGFvaWYvVXlsbkI5THFRNjMydUxnNFpmRERrOEVFY25yWTZJMzlqU3N5cXpSemFYYllxQzBlV2VXQkl0Y3FHV05YUXZ3T3FmWnlvaCB0V2t0MmE4YTlUVjBrbmc0ck9uWXFZelBCNWllWmJ4Z1VrWDlhbVZ5WnVZeExZZjFsQW9ncDZGSU1haEoyWk9Hdzh5WXZ5L1JrZW5MIHdHcTBndDl2L3dERUF0V2dzeTRMbHJHcy9UcDVxNXJuQWFXc0FwV2NVeTkraHlXM2Rhc0FxUEIrakFMbk45Zk81ejF0VmRrSTRtTEcgVUo0b0FPRndjdGRDd1FtWG5XZEdwTzJPVHhIS3c1OE11R0xEL010bkUrUlpvOVlTQVBBQTRYd0srQjFmZ09qWm1RbS84V0RMZVhGdSB1eGgwWHk3OHRlaG5TOE0xZHNnOHV2c1FzNUl6VWRtakM2NTZVaWRqWlE5ZUFsblVmbHFNUVpsTW9VUWJUSVNmSkdRTUk5WWRNRi90IGhtbzZqZXM4TXRRenVvRm1MS2J6aUk1UUlpUVVrU3hYT2xabGZwdVFQYUkvcVVhN0w1SHJ6akpaQUVadVNuNXhIUHpCa1FMQ1RzZlEgcmVqT3M2Vzd1MCtweVptcWQ2eVltcnE2c212QS93Q25XdU5WV05NVkMzZDRnQytVODE1OG4vcWV2eEJRaE9iUUZtNS9wbkhJb3NDZSBRSmtKWmhFdlZDWHZRODFwWk5lMVNCdHVQR2paV1hORDJ5UlZmVm41VFk2cnhBTk9ic1p4RWN3WmM1Y0lUQVdjd1VpdEZsdXQyMU1vIG42alh3bVRUclpSWDF3TVR4VWxrQ0NCQlVGcW83TUZTRDhrd1I5Y05XZ2wycVl0QkRFNHNBaUZXcVhObkNpT0sxWDJXbTUxblRmRVUgamozTGhpMzNMWTVvK1JkQzZQUHoxVS84aC8yLy9EcmowOFYyR3ViVC9kVG95eWlBajBxNFRUMUFISnlsNkJJSkN6bzF5S0x1OW52USBSV1BRS2tSNXZxQSttY1RVRlBNek03RDFqVldmaDY1L3FMTlloZGFReVRzUXpsMXBwZlRyY0VBbHNvWmQxY0EzeUZ3NkZpNTZZRExHIENWVEpoVDBnd283YTg3NEJBVllYcjljK0FjSUc0OC9PVUZDUE85TWtUa0h4akRuV2RVNVAwK3E1UDh4LzhnZitPbHA3bC8yLzhKMTYgZHJTN0F4YkxLRkJjMGlwK2lDbmErbXlObXJKT2JDamVnNVdpdFdUZ2lmOEFNdXlzNmNuK3RkV0hlNFhaNUZvWHFYTWE5eUhIUEVzRyBDcGpQQkNzMk5UZlBpNDFUL3dBQi9TanJOWDU1d2hhTHc0MndXejFwaFkyQW5WS3Y2MmpJdExKT1JFV3YvUVRpamxESm41ZGNydVRuIFNnK2ZrRjhZR1liRDduc2pBWEd5ODZ6cEVBQmtqc1g2cUhuOGk2UCtvL1BWdDdKUDNHd1A3QnF3ZjBma2RWY3FsNk1PL3F4UmhucDkgRmFBSUZOYVZMQlhjSzFJTUFjb3F0RnlVYlcxT1hKNnd4czBhWVM4aGN0Q3ZIWW12c1NFZm1HNi9GUm9JYkJLVmxUMGo4UFRtMmNwVSBQTTFGQktKc0M1bkd5SE0xbjEvWDFsenZUalpEc3Ura215V1JETU9MajZ5UlZTT0FHZVpsem1sWmlIUTh6TlA0bTBzaktsWnlLWFdmIDhBVmdNenJPdE9wQVNLQjFBVnRwVXlYaHNIWVpKWW80dFF5VzZhaFlORHBPbUpNbXBzayt0OG0vT04rZno4OVV5dEhMSnJyN2JHbnkgT3lNZWZXa2JJUjVjZUQ2U09BUTVreXk5UXVWN1pFbkxhVlBJWFdIRDFoSHBSQVlqZlJpUXh5SklVZEZGc0dVYzlNYUpuUjdvNm05WSBseDNqU3crenBmcVVhMmY3WFhybHJWN2M2clZZSUJ4TXFhbnBTd3NUQ0Q2WFExNjJWd2djaUs2YmtjU3ora2VlaXhpS3laZHdjZVBCIGpzWHA5VURPczZWSUI5WEVhNUYwZmtmeGVEOGRQajUwT3F2bXRweCtuVVBpdy9ETFp4YnlMTkVkSmovaHhNYnJxMTBvM0VSZWJFc1ogSVl0T3RiVzRJclpycUI2WlVKaWp4U3hDaGNzamtHWmtjalBqbGhSWWZZckNOYWxQTmlaU1JZSHB5d3hpeGxsdVp3ZzA5SGJHZFg4cSBpaHV0WW5Yejg3eGkya2ExckF5cS9JRytITW5wYWNtWTFhWnNqL21zY01hVDVpMmZLd08vVGxtZzJvUUZYWEZlekJxZmdCWWgyU3RRIDhyMTUxblN0UDM2UFU1OS9yL2YzZWJ2emZtaGY1cnB1b0pqblV4a3hrM2VIYjQyNjl0Zms5YjgyZGJiRFlvL09aOVFsdU5FeHFxU3EgdlF3emoyWFY4NlNlUFJSK3FsNUh1VE5oMjB5NDdrendTeHRyaCtyTWRZN0VHTGhXc2lNWXdwcktFcUhxV3JHYVNhYVZ0UkdxaXc2NSBzTFBseGhLeVcwMWVnVVhSeEtaWHpQRkZhbVZSanpHWldnR2s5VUVab0ZJcjljVG9OZlZDanJHVURVMGl2aXJLczdPVWpzQkxOenM2IHpxUkFCWWdBQU83eHg4cDBwdjhBaW5QeWNiUHllZWtKT3FaVU9pbUNuU3ZwbXkxT3ZJTHE5amYxZ1pHY1htdmdFcnFBbkFqd3VLUHkgRlRQVW9OaExlTXIxTHcxYkZRM0NLYUpabG5jOE13bGt3dlFGWlVLdmpOSkdsMlpOYW5ObUwzRG9oMTMyOHdIMm5QVnk1d01WMGFrNyBJU3FkWDFjajZsWEp6QndPT0dPWlhxSWxwbUJPd1I4MExCa3BEd25ibTE1YkpuV2RhR0p5WGs4U3lrZm9zWXNpUHdUUXMvTkMrbHgrIDUwK3hrZ0RKOWpCZHpFTXZnaGJPSUlJRm12SjZNMTJ2am1tM1VQWFVTbXJtdWxKdzFGam9IcHRpU0lieDhHZWFuMGVBU1RLMGVEem8gUUNMS1RHTmk5ZnFNamJBT0p1YUJJdVlac2F4aFhQOEFWSE01MkhvL2NLcDE0ZHFIdU5lOUpBOU5PazlKei9adGkyVVVteENWaFc2MSBXMW9kemRVYnNRZnlVc2ZtQThvbk91QmU5UnFDMUlxOGt2QWFBWGxpUlRURWloMDdCWHpyT3NzWUIxSWNnRjNnaUx1UjNNVnl4TE41IFlyazJKSk5XYXF6MDRFL1Q2SGs4R1FEOUJ0bklEOEJxRjE1b1g0NlNPcUswUFNRUzcvUGpLM3FaUzlGSWFYZFBOOFY4SVZraU5CaUQgbjZRZXVwVG00U3k4eVdSY0p5cVhpQXMweXlwbWN6NExEZTVNTEc3dHd3NjJUbzVpRkVVc3NFYSswUTZWOVlDUTdOYTVjMDNVRGJxMyBreW8rVW9rRmdlTmthSXkxelRzcklXRGlvVkhFTWtoTG5tNittRFQrQmtMNjZ3UEVGdkxGNVU3SUVteG1kWjF1c25UNlppU1diUEppIGJacWFLcko1TldhczhXZnoxa2NBem9TQlp1LzM3ZlA1NllGWitnWmNGSFd0Y2pHSzJ0bFkzSUxSelNQVjJGMURoR1duN0kwelZoYkwgYlhaVDA0dEVvM2tycFVrMFQxV2Q2Qkp3Wk9LSThZY0ROVGlraUxpU3pGWll6VzByaVRSOXZqV1pnejJJNUlzMmxvNFZrTWtIbEdXMSA4WlpScExBbUZsTGU1REtCSG1GOExEaWVvWUxrUkpxSDZ5ZVhuRmlhV1JJRVNzaWZuV2RaazkybS9VU2dmb0FwUUg0QS9IVTFqdXVsIDFHTE10eU1UaXhGbTE1TkVXZjJlZW9XNGRaMXpoRSs2YStGK3RVSGd5dEU2Zlh3OUlHQU5uTEhDU0FzTnFlTUR5Q0FhYVA4QVVLVWkgSTJ5eWVjV1YxakxBaVBrQ1J1UUlqaUJSTnpHTmQxYUpVSWwzVWxwamxIekxVdUVyVzB5MU5mdGp6MUptTDVHVzR0NURYa0Nqa3habyBDeFNXUlRrTFJHU2txaE9SRzlDL2xHc3VhRWk1VU03Rkc1a29mSXpyT3NXcEpUVlJSb1NrYXpSNG9wS290aXpTaWxGbmswT2V1Z2lxIHdreVVOVU1sWkFHclZMcTc4L1BWb05Fdi9EZzA4YW5LVTdrdjNwWXh4MzBPVE1COU9VdXdhM3pNck5oeGN5SVU5R2NRS3R0ZHRqV2IgbTRTakV2SWpTRHJHVHhFQThnT3BnZlNKVWwxZUJDODZ6ck91M0hMS0ZVQ1NTdVB2YjhwKyt1UEpIR1hjbEVKTE1TU3FrazM1SnI5RCAvcDEvLzlrPSAiCiAgICAgICB5PSIwIgogICAgICAgeD0iMCIKICAgICAgIGlkPSJpbWFnZTU2NzgiCiAgICAgICBoZWlnaHQ9IjI2MCIKICAgICAgIHdpZHRoPSIyNjAiIC8+PC9wYXR0ZXJuPjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6c3RvY2tpZD0iU2FuZCAoYml0bWFwKSIKICAgICBpZD0icGF0dGVybjU2NTYiCiAgICAgaGVpZ2h0PSIyNTYiCiAgICAgd2lkdGg9IjI1NiIKICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIj48IS0tIFNlYW1sZXNzIHRleHR1cmUgcHJvdmlkZWQgYnkgRnJlZVNlYW1sZXNzVGV4dHVyZXMuY29tIC0tPjwhLS0gTGljZW5zZTogY3JlYXRpdmUgY29tbW9ucyBhdHRyaWJ1dGlvbiAtLT48aW1hZ2UKICAgICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVFTa1pKUmdBQkFRSUFJd0FqQUFELzJ3QkRBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQiBBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFILzJ3QkRBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCIEFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFIL3dBQVJDQUVFQVFRREFTSUEgQWhFQkF4RUIvOFFBSFFBQUFnSURBUUVCQUFBQUFBQUFBQUFBQmdjRkNBQURCQWtCQXYvRUFFSVFBQUlDQUFVREJBRUNCQVFGQXdFSSBBd1VHQkFjQkF3Z1ZGZ0FYSlFJUkZDWW5JVFVZSkRaRkV6RTNSZ2tTUVZWV0tGRjFaVFE0UjFkaFptZDJoWWFWLzhRQUdRRUFBZ01CIEFBQUFBQUFBQUFBQUFBQUFBZ01BQVFRRi84UUFPeEVBQWdJQkF3TURCQUVCQmdVREJRRUFBUUlERVJJRUV5RUFJakVqTWtFVVFsRmggTTBNRkpGSmljWUUwVTVHaHNSVmpjbk9Dd3RIaDhQL2FBQXdEQVFBQ0VRTVJBRDhBcjJ5QzZuclJMcmUzNit6djhGamZKTFluMGJaQiBnUXRDMmgzdTRvSHAreUtyVzBOYkQyQk1zYmIzdzY0RTBZVytYa01lQWh1cmpnQUJnQXFLZzhEK3dQaVNycEg4ZERqQXU3VDVhTmowIDJTc0M3YVhhNGRJVlBUOWMyTUpQUmEzd1pCRXkxSVZKUUF5cTJzRUVDbnM5bHMrS045SmRxdjJCZ2ZsOWdBZm93VkZIZzYvZ1dvMVUgalAwM2txZjRUVzdDWVZiT2NQbXVTeExLSy9INjIrSFc2ZkxIaDFSREg3NGgyWjNrRis3eHZsWEkvYUlBQTU4ZjgrSHdyY3A5Y3ZpdiBlNWVWVnRKdTZTU2lNQ1M3STllc244TDZRVUtHR0Q3Z25zajUrT0Qybjl0T0xkUUUxZFhacXpPT3dTcmpsdWdENS9ud0R6NHlSeVlUIEdXWjJkSXpJa2tmcFNOQXRiSVZpWHd1M3MwdzhjZm1STEc3d1BHbUNQTkdTMldXNDVIZS9nWTMyMExOZm5wNUo0OTBnWmVUbTFMREMgVVBZS0dreTlOOTJXUVk0SGJUUTcyMXFnTU9DMXpDR251QkNaOENqOVEvQStDb2FIdG40dTRPQVBlQUFNRy80dmk3Tk05SDVWb0orbyBlMzByc1BsV28yc0pBeGhJaUIyaE41NUZNRUliNUNoclljYzRRVkt3SUZxSjdONHNad2ZtMW9vL2dQQVk4QjZXTlQyWURyNjVESm12IGJhSlp6a0hxN3MrQnNJZXBoeWgvczNhSGRCd2NFT0dIdFJnbUhPSHdKM0JpZE50QXdZajlya2tGNS8zKy9kU05aMFcwWEpJRDFMWDEgVjBtK1NudWdZa2dBaDFPd21ISVVYbFJmNXd6cUV0U3lFTWVocXREM0JXand5TFBadFhaaGp3N0JMUi82SCtmbmovVW5jUjR6eHpPciB5bzZhaEREMkxBY053cEl6dEhOWEdRZlRuSHRxc2oxSWl6ckxwcDRGS1JQQzhXZEhIaDh3Q29TVk1xVWt4eUpkZHdhaFNVanE5Zno2IGZtRDdmckdOVEsyN1JyTmthTTdscmVzbnh5UTdCZkFNTWdZbUNFOWtVQjIrVktQZklLZWpQS3VyOG00VCsvNytBK2c0Yi8ySEVkd3ogYk12Snp4dUMva09sZ05YSkE4bFdWZnRuOE5KUmhzYUtZSDJUVzkxbUE4eGgva0I2bFkwemMxZG9Kb3dNMVZ4c0h4OEFnbitBOEI2WSBUNDRhakh5djYzeldqUHNoOFVnTElKVGxVYklyS2JWMVhzTFNCUXgwTkRXNGI1TXI5d2c4L25uRU5tUmlncDVSdnpZazdCK1hkLzhBIFByL1pVY3pMVjZmYXJRZ1ZMVjN6ekQvWVZIdUFINWFlQktDWW9Gd1hqTjhKL3dBT3R5RGg3a0ZLQ3RveU55aXpCbTloUWxxVkRicUMgZmZqK0Q5aWZZUktxeHN4ZjFKRlRDTk1ranY3MHlZeUxJUHRhU1NXdWNRT2NvNndIMDRVeDJrZG1rWnNwSkt3QVY4UWtReDVveHhKZCBuTExpdU9wN1FVM2RYc0lDMnZoSzdMR3NJM2R6eHBwUFd3d2g3dUtVTmJVV1lRWExJWkhEOGY4QUIyMWZiVlhqVE0wQ3hpTURkbmMwIERBUDFCMUZ3SFlIN0Fxck01cUZUYXpHMkRtMXV0bUZ4eE4zZEh0UzJrL3VSMjU3TjFLSCtHSHJkRHdRK1NISzA3bG5MZ3dXU2xOc3cgeEhwTUk3YkFBNS9pdm56NkNnaXQ0UEJDd2N3emI0SEZiczVvVzVLOWREc0JhRk9xM3lMWHRjMDJ5VmV0MVd0Mm9INCtIYW0xZ0FnMyBCWnJOODNUWTdSZHVEb1BQc1AzL0FLZ2J3SHNsZzJvMVdxR3VaQVc0dHFOcGFwMnFaSGJBK25PVkxWendldnc3SUgxSUI2VEhHRWREIHI4OUJoaTNsb0ZFMmI5N3c1OTdmNTRBQmtrWnBTeFozM2FrSkw1eG83VUhpamVobmh4azJLWGEwb0hVaVhFTW1TSmc1UzBqck9zZVMgTXpWWDRzMENlZW9FZGwxUEtyTXdCeW5CdEdxNUtOcDdJRGNuNG54UVBmZ1d5RUUrRytMYTJ0a0RCemtFQkhyZjJhYjRHazBjMjdjNCAyQitRUUhuMEhyZFlHWERxKzRKa0N4azgySDd3VkxZS3VTaU9EdVlWMWV2SHhvb2RnWkVNUHp4OUhtQWY3SHRneERGc3pOd25tMTRmIHJ2OEF3RkJ3QWRpdTZCM3d4VXNBbzF2ODJ4bnhrZDJnT25qNjlRMWVMTFBTbHRncmRQOEFoMm95RDJTdVFKSHZnWVdWa1h4bmZBanQgU1p6OS93RDdCaFB0Z2U2RndwZGliVldjTlZReVMycnlQRGNWZHNobEpiRFhKNWJzQ3R6RXdOTUQxL2c4NDJmYlVFd3pveXUwTE5RSCBPRXV4emdPd0FQMzlnYWl1VlJ2T2JxbFZocUlyb1g5MkdYNDV5SThpdXB1Skswak9NY2M2RjNlMkk3K0I3c2dQMTQ1dmhnMHZWOWQyIFdMdG9XMFdUR1ZLNXlhZGJIQ3QzWXd2TW1ueXBiQzdTcDYvYWwycDRkRHRTdjF1Q2VZRU5HdUFuNy9admRJU1FaLzhBcjQrQUFQeS8gV2xQZUUvdFdrdHI1RHdvMVhzNXRsaDBteUxZcWRrS1VqWWUxdzE4T3lQbERodzQ5Ym5OcWZQZ3pNVmtvTFppZjliZG9nQi93R0w5NyAyRVQydGtyNmxpV1VHdUFsRXJTd2drdGd0U3EzQmVNTkN1dkZMa1c4QTh5R3lRMXRQWkVjQzQ5dWRzUmlsb2pOakNKTytjQlFmZjM2IFhpbkRxc1dZY0UwWHFFYlpsWGplMDhocXVhU1dNTkVyVGdoMWZNSVEvZVl0L3dBNGp0ckFCQnpOc3c0S1Q5dGtlTUdBK0ErL2UzU3IgZlpsV1I4TjJaMlFLTTVIakdHTHhwYTVYWnlHUXhBWGszd0pLclRScmRlNGs0b3Z0ck42T0YwYTdUWkRmanF4Y04wY0JlWTRiTlZaSiBQTW1HMjJWZFB5UjloVEFLYXdsYkdoanpDRzRCL3I3SkJuMTlXalVZdCszMWRYN1Fka3padllOLzREYm9EZ0lDcUlOc3RCSTA3VjdSIFlhdUNjTzZVcHR0Z3cxTlR4WnI1TFEwamZvWkNHK1RJZW1QaDhQc3NuZ1ozQnNXaG81enZmQ2QvMkRmOS9Qb1BSNVVhdlg0R1BrMlggYUY1T3lIZHdkbEUxK3lEV0JlY0t2NVllb2VHd0dGc3dZbU1temc1OVg3NEg0d0xhQmpOdmRYZUEyQUFmOEJoMUR2a2lXa1BoSk5nViBLYnNLa1ljbmxGZTJFNGNicThXV0YvRFlGdHdmRnVHdGp6RUZ0c0RFR3lvd3g4ZkJoUHVrRTJOQi9md0FEd0JRaU5ac0NIbGRLZGxSIEwyYThUR21PV0ZtazR5czl3NEpHVGNDOXZZa25HZm5OT0RJbVBHTjJ2Tm4vQUVQUTJ0c2xmeFlleW5yVTdNMXlIcHluSGlIblYrSm0gQVh4SWNuS3EwK2gzMll0aDJTMEREVWVyL1VQVmJKOW9WeVpNNGsxY0VPSVAwRkI2WVRRdjJBTXRRYldtcUIyVzN5N3FaR2xtQjJoaiA5WGJLQVYyRm9sSWZlejVrTndUeDRaNFBkNmZoakhtci93Qk44Q2VmN1JIOS9BYkFBRzZQcE5EcVdIWHpHcjJSdjJsV3BaTFpIaHUxIGdwTmIyMG0wTlkxako1QXd0aDNEa2lmRE9IU0xiTzJ5c3lxdjJ6dFJKU1RaekUvditIMEUrQVV1V2hwYVFobUVkb1Q3a0pLU1F0NmggY0VOUFlKYUhZeWJYdDJsRENlWVF3OVZ3MDlnVzJydGY5d3hKdm5HV1o0Q0JEWno4UmZmbDkrOXhaWnZRR1NONktSYmtNZTMvQURWdyBrdWJaeGpEMVlzRnpKUVpLT2lpWk1wVzJuR2I1MDgyNTUrQjZhVlZjbm5LL2l1UU8vSm1YWExCTXFXSzFPMHltM3h0cjFmNDNKK0dMIHRwSTM3ajdKaXlHT3o1QXhPbjhSZURBd250aXk4bk1jZUQ4QVA3LysvZ1BXTFVoWUY2V3FobjU5eUVodW0rNlh3SVdSekZoVlJVOFAgYTdEcEY4cXVzQTlidmtPK0dSZzN6ajdZMUo5RzRXZ0xyTW04R3dpU2J0MEJzSFhudmxvNHNXTEd2bHRLcEpQU0dSa1lhMzM1SVUwLyBkS3lGdmhqamJoTTA5aHpLY0hCbm1BQ0QzUGEzd21zby9tM2pmK0FvSi9nTDhmZVV4SHZUVHdMdXlWUGgvTXJrYXBTN0ErR3dNSzJCIDAreXhiUUg1Z1pXNWdmdkFIcnFmWjc1UjRjbXpmcldlOXUzQitBZ0g3K3dkTllSTk91V2F6S2lPR0tlbW1kQ28zeTlTOE80NHBqeHcgY3VHQ040OU14a0NIVHRNcXVROXlLK25yTldqeDlHUlRLdTFKazlXM2IwalVObHVOSXE4Ylgyb0lsYUlFeXRxVmhJOWUycFI5bW1LdiBQS2NwbzQvTU1CNWtPYVFtYzgzNEordkEvQnBOMkJIZ0FmZlFCOStRT3A0b1VqMFlNc2c5VFppNHpHYWh1OWhNQ0huR096NTVvMkg1IGpCTU1HWHhEbVlNaXErYkJPVDNuaTdSK0tyUjJRNkFQb1A4QXBGc0I4OEY2bUwwMDd0RkoyclgxblVCYXJiWkMya01IQ0NDOEhzWlggbHloY053cXREaHZpY3RyNmZPUTdRQW83NXhscFE2ei9BTjdZNy9zQi93RHo2MHR0bUIzSkgxZ2R5OU1iWXEzUzdKSzlIMCtOU2Z3OCBYS3BHVWgyUXdUSHg4b2VxMDlnaHp1SDhIL0dhSGFLTU1PT3hzSnNJRFlBRlJQcC9wQ2hoY0x3dTJta3FacHovQUhsR01sZHNacUwyIFZiSG5JTU9GeDVFc3gzSFNWSTNWeWlsUFJBeHhzMTM1M1lJSEdOZmRuMm15WDNNc3VZQnRxd2RTMXRaS2s0VmRXVWRrR3VFU3E1VjggV0VlaUdOUU96bUVPcXpGZnJZTFZMY0FGNXNnbVRmRmNZOVBBUkpwTjQzKzNmUDhBQVVFQUV4M0JQQTJ3NFp0akdLVXRVTXQrWXp2NCBkN040dWVpSzhyYnc3NEhyZXlFL1MrSFZXMnIxS3VkczRHTHJNbURxN1R4U2ZQd0w5aDdjKzJDSFR4NVNrWmllMjVxMnBNdW5pdDVLIDZRVzNaZ2lMY1VEd01wVzdBNEI2M1QzeERZSnFxUGNMTG85YldSbktOczNzMzkrN3VyOXVINmk2Z1NDM05ybHd5YTBxQVB2QUZsVWIgQ0h0NUtTa1RJdGpDUmNXeU9ZTGJJNFZ1dDJBbjhEeDV3WVJrYTBHZ21NdFR0ZC9VQUQ4dW9JRHBqSXNiNFJqMjFoSCtiQ2s5MzZvZiBCOC9BNkVsbGZka1hFR3R4aWFkYXh4empvNC9JWHVOMFI1SE1qaVZvZVZVYnFyVzBjT0FsZEVzamkxVEUxNVRZMmlwYnRzYTJySEFPIEw0aVJMZzRlblU5dDlhSFRBdTNpaUg2VmdKaTdKV0w5M2UzODZ2b1RCaDlyT3N3aTVtS3VsQjhaQ1FGM3lhbHNKSEpYWGNEdWh5VU0gdGJhYnpCYnJkYlc3SERwNWdHcEo5RFFiSVJsbTBHamMzaDI1dmgrSW40QUE1QXdQeDJuMTJMTW9sekdEMm9OU1pNMkpGcjJvRCtsNSBmWWI0UFhHdzJQRVEwL2pXcHVuNlR4dEhsYWxpUWd3MXBuRmxCZUIzd1lLM3ZkQ2ZVTFlBQUEzMVVUTk45bDEzUTRZVlRKdlN2QXJGIEpYbWhxWkxBc3lJcm5yWTFCUmEzcDhQRCt1UThiSThlZEJReWF4dWhQZkRsb3V4ejlVSDlUNTgrdmV6a1FFT29lMmpDTHViY2h4M1ggUGN0N3Rwd2NjY1BMWDAxNGR0Q3l0U1RIVDFBNEl2VHZuc2JzZCtGcVREdU41TU9DT1VwUlowNVdsZ1dRN1ZleWFxdE91YTFEbCtPeSBMYmdWRGkzTjRQVTVNVG9RZVphdUtHUFpKK2t4dzlzQ1hlUW1qNFBCbzJFZUdBQWZ3dzVCajA1Y3V0NjdGV2hrbVJiSTJ1MCs0YWxiIEpGMk95L0Zodmx0TUo2MEZ1djVsOEdIQ2JEK1lxdmxvcVRVeURkUW90V3FBWWoyaWJDSE9Bb0w5c0MvejZvcTZ1Q09VNHV0bEhOcVUgb2VVa3hpMjVHSy9FTGRqSnRnaTFlSDd2bjVVRGoxdUNlSHdEbmFCNTdvREJtTHRTWVQ5L1A3Qng4LzA0RWQwSVZCRE1MY1hGSnNJcCBUNVB2UU5yM1VBV2ZHZ1g4cUtZVDludFN0b2FndysvSUVOVjJ5czN3cXpESGplMHI4UllIL3dEUGZ5a1RCdnFJb2MzYUVSdXpTeEs3IFNKanN5dThyeDU0WlNZb3E4WkcyRmkxeEZtUkZkcVRUdXBXVC9seHNmVmpxK2Q3Rk8reGp0KzFpM1FmZUZnUjdMcDkyY2xkSnBPc1cgaFZVa2doWHFld0x5M1VxR2tXTlhLSGFEN01odUZ3UGpCdmtCdnRxdWZ2S3ZwZlp5WVB1aWI3dXZ6OTkrQWUyRWJIcTkwMHRPRmIwMiBtMkVOZk5aRmVzdmRBQythY0d4YnUya1hlcjdRb2NqZzNpRTlibVZoeXFmWUNtY01FeGhSRFprWTRsRzlPNXhnOCtBeEFiK3ZzNXNIIGo2ek1Nc3FvTENOcEdiREdsayt6bFdRcHZrV1hFNVF0dUNlNE1pMnlXb1A3Y3R0ZnZ1enN4TVdoak44d3hDSEFDRHo1QTl6L0FFRXIgZExsS1dzVG05VkxkQWg4MWJweElSN09RMWVXWWl4V3phMlJmaDQybUhaYTJIcmdKdEh3SGhrV1VZb0xSbVo0TnBPeDgrMzgrQVFkLyA2SVBJNlJrTjJjWXM0OWM1U3dSbmVXK01keTA1NUFZY1hZb3BHU3BaYm1XOXdnNVJ0WVhIRjZHVlUyWGFLTmRkamhNVDhxUTdRTXJPIGpXMDdQakovRDgxWVVPd3VFb1cyQVh4YnI5Y01VUEQyWndaQWM5UVBQQmdtTWFHanUrai9BSXUyQUI5L1AvNWtsZ0xZOHBIcE94dE8gVnpXUmRrVXhVcll2OGtZSzljTzE2UVUrWVJ3N1Z3ME80R0JrQmdiZ3JTQnRnempIbkVuL0FIOGZRZlArZkZjeXlIUW9DVzNmTkdqWSBkTEI2S1UwZDJRNHpFdGdVTmhQY2tUMDlrRG1HU1lRaHdVT0JkTk9yYXlNRitUQm16ZkJ6NzgvN0FnZ0g3cU50eUdLRFZnSGJSZkNaIGtveEoyL3Q2OFdFNEpwNnNyR0ZiZk1ETGR3T0RKeHZnYkErS3ZCaGxYbEhqZy9OZ2lPZy8yQUFnNGRDZ1liT1l4ZGNsd3V3a1lNWmogUzZGNDkxbWhkK0JYUmxsWkpva2plZEpNRG5HWlE3U2M1dXNNY3NlV2Zid3puREVBR3llbWRXZGdYWmZxRlp5WUxKRWdLYVpOcWEvYSBqNVM5STkyazFkcVhUNmg3T3Q2a0RENG52NkhPN1Bud2QyTTNkQ2gwWlpCMmpWeHRIMkRnUCtyd0RwYnNsZ1EwMUhoOTBNNlNOUXc1IHVYR0pPMWYyYTR5ckcxSGk2NTFVSjlrVExJTVVQdyt5VWRENWFEVzFsbUtVMnpNMjloT0RuMThCYnA5K1h6OVJkTTd2QVVzR283NGQgd044RXRKWlE5VGpDd1djeVZmNVFvN3ZsWHcxOWJNVVBNVDBQa2dORFlMYUNHT1RxNnZXZmhEZkI3ZFBuOS84QVBIK2cvVDIyUW5kSCB6bVBLckhUd05pbUkxM1V1VER2Njh5QVNsODZjN2s3WDJRaDN3bnZoZ2hNZ3dMQW5JNGU4bGxYdEFuYjd4YVBObmpZT1ArM3VBNldGIGlZeFNPMnlpVFJoNFlKYmowOG5PU0JjVnY0NTRMVVRYVnFyczBxM0RKaEMvdjVMNUJQOEFoeC9Wdy9rbjVYYmlWNWU3SEEyMjAxYUggS1AxQjEzaTloRVZ1c0FQdWtmSUhPWG9iOUxkVDhnam0xaGFldlZPeUFscytoM3RBMkZ4ejNET3lrOXBkVGVUTEpvK1dzeGw1ZlZFZyBlckxBbk92SjZ5YjBxZlMrMnpxdVpORWVzUEgwRDhtSmtoQ0ZLM1JKVFVjdEFXSS9vcmtyTGpMUHJwcHVoQkpjUnhSMmtMNnhJa3Q4IE1SREZRUkVqSnhNUUNrcVZuVGNQN1p2MGRVVEZmcG5iOHBhWW4rVDVGSC8vQUhDQi93Q250VE5wQTdNQXpQdkFaRTBTMWJUVlo1cXogWEg0NnYvSU9YSlkybi9Kc3U3dU56SmRrSkx2QUpCMkMyREZTNmxzYkdQTFk4UE1EN3c0Y2tybitRbkxaTzh2eG1NKzdPNk1meHQzRCB3QUFBZmgwOFhYZW5PNDJwRE1wNUtIVjdHTXVPUnRzaFRtQ3hhUXJ2aWU0QitZWFlIVzE3bFZTRUtsZUhDb0ZsOFZ5YU1kNFQ3b1AzIDVCKy9BT2duVG02NStwREJsR1FhTkNGN2ZhZ2t0SFNheHErdm9jcFd1SnlpbDdBTWZxdHNsZ2YwK3BWWHhuMzNObXZCSjJUZ051NHYgMkdDRHdFQXpyTVgxdGpPRWxKdTA2M0d0NXFxYllhdjFGVExBWG9jb3B5aXVhMzQzRE1QdDJCeUYySThDMExhM2daeGZiQ1hoRW1xeiA1OEJidkFMZFFVRUJVY3V3MkFiSkJTdEo3ZHRGSTIweHRzcXQrN0pRZnhmUFRaQXNyWk9VelB1WnpGSGx5b0ZDS0ZMcm04aTFYUXF6IDBwUTdSbVR4NUt5ek5ZeGh0cTVDUzc3eG5TS25tT1VWaHE4cWhqb2FITWhwL01GcWNoM0JXbityN1J5WW53bkhFSHNBQSt3WW4vQUIgTmdFTlZHa0d4REZRSnJoVXFlbWtsS3dxdmFqMm44c25nZWJxOXk0TDRlMUhBUFpFUEVQZzIvQWFuenhZdDVXZndtN2d3SDM0QitwNyBwMlZuRDB4dVNtU3NiVzVjQnZPRFY3Vnp1MExjeWh5M1BIS3dqdFNwNCtrbVJEZkh6QWd5Y0QrZjJyV1Nlbk9yeWZCa2kwY1RuMEYrIDgrZkFkTEY0cWNPNVV1aGhvdGhNalZGbUc0aVFIUTErcHcxSWdaYUhZMVBWZkRjRE9tOHh1QzIxZ1NBR3gyUVpXWlJYSi9oTTI3QXogL2dNUGJEZjRURnFKSFY4OEZ4YkYweWdlUWNSdURiNmJVYlZQYTFKZ0g4cmwzTElsalFJcFQxRVF1QTl5S2pjTkhJbUl3eTRJYkpyeCBianQ2Y3djV2p6OHRiMHlNZW9wU1pESklhcDU5elhLNDd4RjArMWtCUTZyWDYzcXRhdDh4WkRCTU9jd1VvS0c4ak5yUm1aSENiSjUvIEgzUG4xOC8wYktjTmtYS3p0cnVObk1sRHErVEdzMTRHZ0tmaUJ6MFYzbEZIRG1GVjBteXpLM1gvQU9RWDZXbk1oTkdGRkxmWm5oMk4gOEg4QndFK2hZb09LVHJkb0ZtY3ZTalhKcWh3bG5aVmIzSGJLZERxWmYrR0JsWHlMdEI4SUxiNXlTYUhYdysvT0VBNGg4WnVSWFpzVCBuaEFRRGdHUC90QWtDSEtHUldxOG9TUUxnUFhCSnMxSE1LeU9YdUFES3B3b3I4Z21MWWVaVmZNQTlWMlhhQ2lxN1l6SzR2Y3puQ1A3IC93RFFmc0hVS3lveGtVdWVXTHE4ZUFaeExKRTdqdWYzYlNuR3V6Z1czbnBqZDRSV1pHZGFCZEd5dEdpZ2tqUXJRcmIzV1VOa2MvTkwgNDZNSS9yMDJMaFNZR2FLeHRHN0FTMGcyRWprZ0tmRG1vbG9NVmlsRnQvMmdQTS9vNmRBckNmZ3lJd3Nwajk0ODVqdi9BQi8yUElPdyBMRWZNcmhJdnRWaTZsV1dLQTB0TzBXTFgxMXVPbStIdjhxSUI0R1BNSnpJbm9VdkZqdFRHcnA4SlB3M1I4ZVJyd2IzczV6NzN3ZnZaIEJRR2NqbkhoalJ3THUrRFkxekpxR1NMY3dBc0VRT214WmUvQjBDV1ljRERnNE9BYjhnSG9FTVlzcTZIVURNYmRxdWR2djREWUFLQ2YgMytTWDh1bDR0Tm5seERyRmtmTFdNYWtJalFZYWJmOEFtVzBCVTBORE1NRU53cmVZWVQrSE5XM3p3a1BiT0x2SXdHN1dpYjMvQUg4KyBBcUxZTmdaSUd5WE1ZdVhSR1M3TU00b0E1VU10dXlhcGNzaHl0Y3JXTzQwSU1Lb3R5cTFiVzV0WUVyVnQvaUhjQ2FzR2pZcEE2ZHc4IE5OdFRPMDhWVWs2UzdDeW5ZYXZLNEc0THcyYzlwelhtajVoQU80V1JNRDJSWDh5Y3BPQ0dEN1p2TzFyTHo5Mk5nd1A3L3Y4QWlBNjcgSTRleENpblh3SE5yZkhPbnpMUnRoSC9pUTVFWXJtNWJ1dVFDeUw2MkhEbUpnY2VodFhEL0FKeUdzdk5YdEFzWURDSkpzR0EzOC95RCBmK2lTeUVldjZyUjg1akY4YlZRSUVZV0lIb2NkZWhOQjRTQjJjZ1k1SkRaUDloc0dNR1lzakZjb1RKN0lFZGdlUGdOZytnOWJ0UkdZIGxVRVlmR2l5N3lTVW52a2JFbU00OVY3Q3lQbFNsc1BoMDh0dUMyaG1GdFB3Uis0RmxnMlRGbUtGR1pHQmhFazMrckIvUVAzNkNXSmcgS0NOalVzU3hMVWsyMEZ5VllsTHlON2w1Ulh3c1dPUlpSb1ZqQXQyY282T3I3VDRaNFVRWlluODBiQUMyQnlUUXBuTWp3cjFlMlp5bCBjamgybHJTdCszb2V3bkN0OVBjT1ZiUzlYTVd0K0JzaGVaTmg3eEJuMmdCZUlheXN2Z3NtTmVEWnNJOGMrZmdISDZpKy9Ob2dsMS9sIFBoNVhTTHNKVmxXbzBhdzJoWVRKWjlPV200aTlQYlJGWk9OMUF0Mm9ZaGoxdFY3d1hTN3cxbmxPMk02T2twSnZmK1BudnZ3REIrUmwgNmFoVU9lUVNReHJKYlh4U3liUmlrRlhPTUtZWjhzYTR3SjY0Q0ZqclpneHhCUDJOdXZBOVhNeEdXVmY2TWM0VFYzZDBBQVA3K2VBZCBSeEJzUjg1OHVDdm1pNWtDeUtNbURZa2ZPdFNwNmNNVktlWVhJQXR1TEoySGhtRS9oN1UycDdicy9KbnhYc3o5N3V5ajkvZndIc0F3IFB2eXc4akdLYVVwcG5MckpzeUdLV09TTVVFTGJrTFpaYzBBRng4SFBJWXRZeEkwbUozWW84VmFjRGJrU1Eza2lHM3hBc1dlYyszaGEgNUQxT3IxOXlzeXNvQ2toeHJ6c0YyQnkyQjhvSFVCWVUwWEtySUFtclo4UGNGYnVESW5qdzZQdUd4b1l4NTVSeGc0YkNlZjhBQUFOLyAyRHBuVm04cjZibDJvaG5tcTJuWm9HeHJDSEIybTZGNllMRnJ3R0ovcVF0aDZUK3lBd053ZlQrTTJnVTROd20wZmZmOEY4QnlBL2owIEJ0Q0crTnRmMzltdVNxTnJFZXEyMVlZOFpNRVMxb29lTFhLTERqNjNNR0U5OFcwOWsvaUhUNjB0U0h3WkR3R0xQTnZaNDREL0FOTmcgNllWVHZtWWhzQTVJVjdJU1NWbDZiMXRoWUs5cE5mRW9Zc3AvRkE1Y2ZwTU95TW9leUtmVDFWOHI5U2FnN056eFhHVy8rRTlQRHh5QiBBZnQvb1RyS3lUU05NaGwzVUVpeHlmVU5GQnEwa2htaGtaUzBFS1JwN1F0aUlXV3V1MERxNHBZMGsweWc3R29PNDBlUXlqMnpoVHZKIHhobjhEQnZCczhYMVh0czRYOGd3dUhzbXlFOXltUlphL3dEa0NJeXhWZGhpb1lmOFZPSHpDN2hEQnZuOVNreWZGeWZPSGJ6aitBQUEgQUIvRkJQNFJwZ0hZZ1pURDFvdVg4YlBaUjY0eFA0WUQxNnR4VDZSYUJTR3Y0NHVDZkRtRUZ1MUZLOFBuQnhneER3V2Q4U1RaczRBQSBmb2ZmdC94YWpBbnVHVXRzb3NETWsxam1nU1ZaT0RoYWxrTzh6R202blBSUTYreVUvRHVEWjhQZzFMNXg4SjFuVGJRVTJQWlRaeCtRIGY5djcvd0JZdm1LdmNtRE9nVDZUTmg5aENlMVluekRETXNZOFdBbEEvQTI5RGg2a0lZK1o4L1lZVmIvdFl5b09iZjJEWU1jUDMvb0EgTUluSmQzdkNzemVORWVQOWI1LzBINDZ6Z0JKUVlFZVR4aG11MXVVVnV1WHFxRitlVzZXNnVEc2pOS0o1NjdyK3NpMUJsbmZFVDN3QyByc00xWGZCSXQ4TUw4eGJtT0RJWUh6SU1EZm1vUHdhNUdqbkp3MkVkam43Qno0QXY5RzE4RHlsUVprMnVkU1ZTdjFZNmgxVUpiRm9NIG1UcVFkdzdrZXRnQzVRdUhybmF1NEZ0Zk1JNTRnQk9lMzVRUmtZNDdPd1I0NENmQWZRZWZkSjliZUZlNlkveGJCdFIydUNMVzYySlggakszVzlPT0RSVXJZcnRESlgrSzNUOWNNaWZUemhjVkQ0dHFQaHVkb3RDTXo3MmI0T2ZRV0EvNEJCUDhBVnRLL1c4M1dSWWlTdVdyRCBrMmR6QmtyMXc3VnA5c1BwUm9FMWZFTXNHOExiSmFqNVlNejhnTnFQN0xPa3Q4ZWlZUGV6ZXdvUElFRitQZ0g0L25sYloxTUl0STZoIFQzdmlJT2ZBcFR1Wi9yYnhLQTJ4WVUrTmR6VEJra3pta2w3Z3E1YmVuTmY4UWNoczdYTzM3OTRNOWJXM1RxUkR0SE1ESzZmeEt3aHAgaVZNazBqSE1PRGhXWHhYelQwVWxtRTlrTWZSRnRndFE0QXIvQUFPTGF6L1F4TTVhSnovcndIZnovUldQc1JMZ0MwT2VrR0ZMTitHUyBFeDBuSlgxU1pLVitlY2tzQmJNR0puSkI4enRLUXhuWS93Qkw0K3dSSkNjK1g5Ly9BSDgvaTJ0UkZUeklwUlB1UU1reVFLYnFRUUxZIHRDalQxb082SEtpNmo2dlZ3L01BNWhiTUo3QWh0U0hjRStqNWlNTTltWm1CbS9CNytnZ0g0Qno3Z05TOHN3d1dNeWg5aER4bXFBNEUgaEsrdHNrZ3NZbHRGVGkzMkhYNGN3SGNOblgyUTVaWTlTN2tZVkEwV2dNV2NQT0hBR3djQlBnT2ZIOWFqQ0lYS2pJZVdkenRsTWFvViAzWmxyUHl0VVBObWtNdVVoN051M2pUemxlWkl5OEw0cng4L2tkZGhpUmxocVBtRkExa0JFbDNwL1ZGcDdxOFBlVmdyME8rSXFuUTVUIGNIQkRaRnZTWE5UMlRZV0FDODdZaXZsb2pCbXg5a3pnR29nSGQxQmZ2MXVBdmo1aWtoM05hQ3VoMG1uZ2RhUzNFMGozOVdOci9NbFIgUzEzSzdnd1dSRFpOR2FlaC9NVmUwQ2xCc2dtVFYwT3pNRWMzc2xIbndGdTdBL0FNTVg2dExZcGxIeDBXN01mVU5TYXM2bjVLbXJ3MSB0SHB4RHEreG5lbTR1NFdRSDVndHdxdjJPQlY0RUhnTVdTajR6TFBOdjM4L3NBQStBdzM4OHJQTG1HV0RPTWdwa2t4WmVUR3NLMkFPIGxaR1lXU3h0UVM5VXJrSHNCd01KK29TMUZ0aDdxVDNDaDFYL0FGa0tMWDVzd2RqaUNBUDBHL1B4NCtmNnpQemdVOFFzdUVYL0FMaWsgR1dQUC9MMlUyUE9RN1FmTEFoWHR6emZoaXVPT01iVUkzSnMzdVU1SzBNY0NiT1ZDdWswb3dhZmo5TTIvVlRJMm5uRW1iaVNLT2ZHQyBXSHFZbzI3Rk1ZUG1VOG4ycGpYNGV4cTB3VW1wYko0WElyc3d3SFZ4dmZENEIvZmdBRFlPbm1sbkE1NTR0ODhCWkt1ZkxMc2xsaUw5IGtWNlErWUtjcGNXVlpGSDhETUdGdGJUMlNuU0RBQmVPNys2UG1ub253bjd3QVBuejZDZ2dQWStrempZbHRySU5BdWRlamJneGNKTHUgOFdwVzdSRWNIeUxMYUt2RHNCaVlZaHNqSml5UEY4V0JkTUZrcC9nZG9WblpqeHZmOWZmUWFpQWNCQU02SEhkYlcxR1VuZWR5TzFrVyBSS21WdWtCMlRKcjlocmUwTlgxWlNxdlEyQVBNY0xncXVZQXBQWVdEZkZzbVVRbnhtL2U2dWVQMDd1bmtBQWZ3a200clpzcVNJSWNjIDVGRFNia1pCalJtc1pidHZSb0ZNRHcrWGJJL2JnTzUwbURyR3ZNa3NFOVhLaS9PM3RjcGZPWTdsK1cxRHBjNEdwK1lCZ1ExSmIyRi8gWVRCaDJWK1NBU2tzOFZEajVqSk1wK0dISUJ6aUg4RHR0Wml6ZkRRVHN6Q3JyUk9lM3UvVkVmUGdOL1dJdGZNTnBYQmNpZ1haOHVRQyBjaU1GYnBJZkgrSUpwTEljWFRlbjNCUTYySFQzeGZobkovTFVmYzlyYUxNZVhoSjJNSFVYZDNueC9ZQVBYeVk4VWZaWkJKRnJtbU5zIHlXMWtyZGdyZTRLSDAzNjBiSWxYSnFFS1dNbjE5RDJpWk1zaFBUb0w1WVB6cGpNczJnaDBiN25BZFhlQWZqL2FMZ0w5MXZBTW1aUFkgS3JQRk9mcmNDOG0zWjRmSDJ5SFY5amN4Zkh4eE1jd21YQ0hJSWM1Q3NDQnpEYkNndTMxbXEwamZBWjkrUHZ6OEEyQkI2Rkp1MHNYVCBCbloyTHR0NFdGWWdERnNxaldSNzdlSXd0ZDFpYkg3Yy93RHdqeXErMWI3eFdValJ4ai81ay9iUmdjeThIeGNzVE96YzFQV3dNQkRyIGQzanc3NEg4d2ZQaVdocTA0ZmNOVjg4ZkE2K3lJOEJ3bjF5NE15TXIvalA2VGFQNGk5c0g3M3QzbzhJU0ZOU3NDdDU2a3lWdlp6UWUgQ1dGcC9XekZvVWpjRVVwMmJjdHdwL1RHWVE1bmVDSEE0ZjhBQWNGbXpPTDhtUjBsSkNmcjkrdjFCUVFDQ3NjdDBlSytwYkJjRFhZYiBwOUl5YXVkNi9jTTdoRUlvQnhpeGJVd21YQnlUWng1aHFVYmd0cTFROVFMTFErTFBPRWtJNytmUC9RZUE5V1BSNjNiYXZUMldVaVpOIGp5MWFHZ2lLUC80bGRaRjIwUW5PZGZSSXJlT1Q1dFZpTHNmY0xUVmJLUUh4ck1XY0xWeFZab3dWMjJNRmdCZnFqNSsvODh3WUFJdHggbzltTnBab2xDVnRDZkdLT1BlVnU2NUp0dTBncmp1WGRQQklyTHVQcDB4bW4yNDJqVWs1NFJpVnBVVWloNDNXVzdObGJvZUFpTGRmTSB5cE10OGFEMlNOTVR3NlR5Z2xXOGdUTUZ1VmhIdmg0R0llb1JrY0lkWGh3YytqMzI0dHI3eUs2Tlpoem16czhiQWVQMUcvZGRsTjVnICt3YWZzNW96WHkwU1NpQjdJc0ZrSWRmaWNDbFM2Y0s1YVp2ektmRHpFOWt4NE8rTjU1SGhMSlBuaXk4dkd5SklQZnovQVBZQUhSVmUgQy9ETXZsQXk4ck9xVU8wSVkwVFI4TVBiRXU3R2hEc0lXQlpIQVBka09HdHNpL0R0VFMwUGdUa096TGZ2aEQyelpLdTRPZkFQejhmUCAvUWNWdUxTN1FWekRzcnErY2s1TkkyRWFMSTh3YkhzMURLSWJGRnJreXY4QWJkRFpFSVBZQWVqenc4OU9yZmE2SEY0ZlNnbUx5ZndRIGQvMy9BT2dsSVFWWEVaUEc2YmdhZmZraUo5czd5WUpsdDBjVXdYTXZlYTQ5eFJiYVNWTUhFTWlOam11UDFHSlc0UEp3enlXMzd3dEQgdGE3RThZeUV1dm55dkE2UXQ2YjdQcUFiU2FRWXIwYllCYmdZRnNLV3pnNDh3bUIzQ24wK1pCZ0QxSkhtTEl4OEYyWXpiSUU0UHNCLyB3SFFkY09vU3IxZXA4NXlNdFZ0R01uSlVsNnR5V205b3B6ZEJiWkZLc2cvWjA5a1R3Ni8yNG9jZ3BLcTJUc3dXMFZtc25FZzJFNThBIFFmdng5KzZOeWxtU09jTFpubmdRTzcxNFM0L1RMVXZ4UGlnVjlYRmgwK1krUXc4d1BQTVFWSndRemtORzRHTEdJMkNUYUpzNkFYMzUgQlA3Qno3cVhzd1dyL1NXTmNUMUtHNVoxUzFrajJjcTRSS3JUYWxZWEtMM1FtQi9ocC96dzRPZlI3NERUMW5EZEhrWUR3ZHQ4L1ZDUCBQd0h3QXhLem1LT3BsYVN5QkR6bEpjZTQ3RGpITHRvYy9QUDRTejl1YXRDRVNzMm1GMWtRVnhIK3h5NThnZjZHNHRDSGRWdGxWbUJzIFkvTjB5NE1qdmxaWnRuZ2FwYlIxeW9OckMyVExpUkJCMlBQRjZlU1Vxc3lXUk9KQzVCMmVlZ2VyS0tFV2t1eTRHY2pLblIvWDZlczYgOGtKMXJOdHVSeGpPTTA4Ujg0bEZ5Q2dWbG0xSERCcTZsUEp3MlkvSkRaK1FHYm5ITm41V0dTanpsR0FKbHdYdTJoQlJXaEx4U0JZUCBxd21acWFuWjBtcFU3WTlXRlJUU3J0QTRxQ3RDOTNtZ0t2NTVOZUFkWm1ZOGtnaytTWXRMeWZ6L0FNTjFaTWVMVzRGQnVFOURjSXlTIEdmTElFdEdkcFhwZXdueHlwR0lCcEl4YUNlNFRMVmZBNDhQcWFRNi9yUUhaRlpFeGY1TUJoSGFrM2hCZmtEZndQZ0VISTliM1FVUzIgcUs3bUxBV3lpZVJSM2diVzZmYkJqczNjY3FVdGtBOHhrdFN0dzlvVEFkWnVFR0NIUmtXcnlkR3N3UDhBZlFIbndIQVFIUmZNeTBNeSB2dUI2TGszWWs1VzlsdFBGblRCOHVIRnNaSWxLejR3aHc2ZmNFTmtjSzNWWjQrQkJNREdiK0hObVpnZW5qWkVmZnorUElEL3NmaU83IEZzSzZPU2VMQm1YOXFFWStmMkY5cVR4S0VCQTZtckdsR09Zektyc2lHWVQ0ZmVtdjlQRUhBbmIvQUxWbi9tay9pSS9RYUNBUWU3dlIgWEUyWkdCZUVxWlhkOE00NDd2U2dZc08yL3dDV3o1SHA5QVF5QlRsdEkzY0VyTDFPM2NjbXg3K3p0cmdBOG0ra200UTYzYlk1aTJxKyB6amRxU2lTa0p6N0lUaDdETUZ2bFpPUUY4WHpESUlaSmdlcnc2clphL1BwMXhXUmhSb0o3RnpaMjMvWU9mSDkvQWRXVnpHQjh5V0NrIHpTNVNlbThsWHpzazJ3WW8zUnpWK3ppNnZiQ2liK05vZGtha0pnZGV3Z2diQXVuNWd4bVF4ZkpnZmhQMy9GZlA3QUE2WDJaVDdvNU8gaEsyaGFlRW1Vamtrb2hnQzFWdkVNRkpURFhKNHdRWlllTmtRNFpEWkFLZXBJNmVUclBUbStERVpIU2NVazRBeFB2eDgvaUF4NkdvNiBYQURENjlQY3FmNjN6VUt5Q285cXprOVRtRkxhU0dpVW4vTU1jYlEwUGVJUGI4OTh5cy9vYk1UQjRmUjJEL0x6K3dhR0VUcVZZM2RjIDNLdERpLzRwWTd1eDdycWpWYzJ0SkhWZzJMaXZoV2k1dXZPN0JMNHZpZ1BEWGZGRlllR0QzQlBROHBxdlZKclIyc2hoRG1MRERyME0gcUI3Y2NiY0lkd3VDM3FFWkdBT3F3TFFVcDNCbmtvcnJPSENmTm45LzU4L0grclVPZ2VrekxyZjBCdHUxYnM0S3lEYXlYNnJ1Q3dWTyBIOG9UTFY2Myt5V1F5WFduOHdPTnEvQWFqQ05VQ3NMV1ZsNDFEK2NxTHovYUlCNENvbXBSc3V3eURvZWh5bWN0Z1UzVEc3ZklyM1RxIG9KQWVyeGJaWE1xR1BpVEhBeE1jQ0UxNHhYN01WWmpOV1lzV3piNEU1dGg5K3h3eDJEcmtyOWdxOERYOWV2Z3NiVzl3VzBITnRrZEogR09GZXpHaW14TVVYM1FNTWxEM0Foc2poVmJVKzQ4NE1WbWpkME9jdkFUR2srQW9QOWdBQUQ2NUE5eHltVENaM1JJVnh5UEVzTWpFbSB4OFJxcEZlR3Y3YUpRTGJ5Z2hNSTB6WjNrd3FxSUFYRnJ5c2dteFFIZzVjSFljNHBxLzhBZ3VWaEliSUh1N09RS3lEd3lhKzc3RGZDIDlxQ2xPQytIcCtaTWhtQ0syMVFMUVF6aGhHSnZtTHp3WjE5clVmdGdQOW9zTUQ3ODgyQjBmVHpSWHVYUVV5TnBqYlVtdHhLL1FJR2ogNnloT1JSM3ZpcGNQaFdvK1BrTkRJZkEzQ3BVZGJacWdGcTdNdFBCdTdLdU9Qd0IvWVA4QXYxSjVoeGJNeDFWU3JrQzcxNm0yUXliTyBZcXRYWG9jcXhuY0M1QjJDeUxJaGg2ckRweUhWZGwwZnlwUHJQYTZ2OEc3QkVrR2U4K2ZRZC93NnNJRHFxdDc0d21WenBWdjUyUTdRIEpSbE9PbnJsc1ZPeUlRQ1hVb3RrNUpNMU9Wdk0zRHR5aHNDamNSZ21qSzVSWlp2eGM3MVhqc0FBKy9jKzZHTUNhUmpKZ0lRaDNGa2Uga01DMEJDVXJ2OG1ueVhFbjJObFFGbmFNNEErMnJQNTRVK1BqeFhuNTZyU1ByTXhkT1pXTkxBV3JUTlZZQStFWVhqT3Y4Z2tQaWFLcyBKRHRwd1gzeUhEVzdnWkNIRlh4ZlVwMVZrMWxuYUxNR0ErRWhMVTRDZkFMNS93QUJnVlVlREgxVXdaTlFWZmJTM2JjcEQwOFZsYkY1IFRFK25FK1VMWGdMVE1Ic2lmTXhEc2hFT2NQRDFMNnk4dmd0WkoycDRYSEUrZ2dENkNBeFh3SEcyRU5TZVdHemxkSXlYOWtWeHZjRncgWTdySDZoSzNmRTNsRzhXREREdUMyaHcxOVBCdHRZUG04YlpjbTJFa2U3RGZPY2ZBQU5nQUFNVEJRZkxSem50MU14ZE5WQTJDQnM2UCA5cU01N3VoTERRcHlzRkJmcXhQdE95TUVUQVJnMjFmcDVlR041ZU1WY1dzb3h4Mk5ZNG56ekJnd0g4TWNHVExLcXVIaGZCYXlkR2lPIE5teGF5U1JYZEVERW53YnJpNjNNcDhRd2R6UVZmYjhpK1NXNDVITmMzMUczTFRYYXJSK3Q1clMxTGRuU2oyb2k0eUEzT3Bkc1QyZ1cgV1JCaGdlWTRldDFYTVlJYzZ0Q05hV3F5UFBGME5aeHF1cnZ5cHY0RHo1L0hmNUdsSGlQYldXbjErOTB5TnM3U05SdHgwNWJCNUlSNiA5TWFnZFQ2UnA5VFUrd09Cb2I1TUQvRWVKK24rbG5qRGczdlVCTEVJRHc5MEcrejREa0RCZy9qYXV5V0lwVEQxZktTZXlXUUJNWHFwIHA5UzBiYURZK0s2YnFhS05GcUw2RzRHZFBiNGhMNmVqMW9RbjNndVdZVHRCOGVyTVJ3bm5PMFd3WUFOZzJDMFdvTjRSN1V0MmRGcXYgUjJ6YVdGZGNIUkE5aEJsaTQyOXlpZWkyYXVManBjekMwaytuVTNDZXB2NmtyWVBLMjBpMGg2T25Mc0Nua0wyeFByMy9BQytrOUhUUCBHR1k3YnJ1dnAyaEd6WUluMHlUR1lGaWxVWEVVaVN3eVdWbFJ5cU1LU1V4SzdRTmpjS3dTaXZmSDVBL3krb0kzK2Y0OGZuSVVvc2dXIHJnVk80QU5HVnZKMHUxeVNiVk93REZTcDVhWll0WHFaNjBKYWUrTGN3T1oyOHhPb2R3Z1Z3dC9hT1RjNDJSMlI4RDZDQUE4QjJCQmQga3gwc1FXREczZGxXb2s1V295alJ0STFmVXVuVXhEUXdObmxoZG9NdGZwNjNNVzVpZ256RWQ4SVdYVHJJTVptaStDWXlxMGtKYVBnUCBQOW90L3dDbU8yUGtCODBlRGF2ZktmVXFOdDUyTlJMUXliVVgyeHZsSzF4aTR2c24wbGpNTVdUYUFZSFE5b3Zid25zNHRXcHA1eDN0IEoyUUN2NG5rSEg5VDhhVDBBVzVwQ2lLempiS1N5dUN4WmRjY25wcXlLZ2ExeG50cUkwMWc5RHJ0VzVqSGNNMmU0YmdmQXdKcE5sWnggcnVzdk5JMmlsQXNjQUdLRFlIcDlSNDhsWThsV01oNDlTQ0pacEhFUnpLMXViYXh6U1hIUGE0dXpMVzJRRWEyeDBLMzhvWkVtU1JBaiBLc244VTZBQUVuQTN0Wkd1QmxiZTNIbFFFTlRFOWNyeHZxL05yYWs0UUdZN2N2U2JDamw0aDRvdlcxUTRkZVpHVHRZMzBtdnNseGNQIDFEOGIzTW9VSmpBUnNKcUh0VFlQUGdPUWJETzFlUElFN0hTUmdlalF1ZFB2ZTdGUEd6dE1iUmNiaWhwcGJmakErWndNT1lERDRnU3QgU0JDQ1kraGxNQlp3MkU0Ty9BRDRBQndIbndCdC93QXZQT0orVnFXYXJzcE4zRHJZbXdFK1pVKzBWZTVhajZIS1BvOHhNaHdvYWZ6eiBZU0NpYzV5VFYyampQQ1RidDRBQWZBSHovc0FEMXMrNzV6bVpjYXJXMUdKWjlOR2xQQkVNQUdDWll6alliUFNUNFF3NDFaTUl6WDZlIHFJZG4xcWpHR1lXMDNJdEREbUZwRzBjKy9Zb0o4K3djKzZwTkUwY1dwYlRxZzFFdjFHb2lrMU0wc2lRVHZ0WlNscFhmWmdXbDlPUEMgR1A3STF5TnFYVmthclNqVlRUYlVUeHh2dExRT2xBN2xhajl0cUFlU1FUd0s2N0hDSHFFVXFUdko3VW9kSjFMV2pzMjJGb25kdE9vZCBnUXowUzJNQmJoM2dtV3BoWk13Z0hlTVdFQ0RoNG96NFRyUEVHRmRqWDVlcU1BQTVCaGlBcmFFdWZWSFRGZjIvalUxTXFTSEYxQXFiIGFnTnhJY3FSRTF5aHhoYjBTdDR4TXF3UE1ZRnRxZ3VGYU5BaG4zUzBNZWM0Y0pPSU9JRERrQ0FnWW43Yk9DZXAyVytHTUxMbzFTTDYgbG9kbzNKSXM1Ymo2Y0E5UzJNd3ByN003d09DM1pFT1ovcVdQZ1FYd296Sy9HUmxWNmgreVp4QmZ2QW44ZC82U2RUNnNNekt2aXQwTiBTUTdJbVZmYWhHSkd5YXJWMkZ3VjdsYkFJR0dQRDJRdHNpRXRwNWp0TGFBSC9hN1JVQlBoTHNrK0E5ei9BRDQrZnhhc0VqNmFXUFdGIE5aTExNOGdqU002ZkNOc2NZU3dlYklyelRrTGQ4cVBtRjR2cWM5STRpVDZaSUZZeWZVZ3lLZSthc1lzTXUyazd1UmVYWEhYMVYwblogZFZwOU52bW51U2tpNGQ2aVhDd3RWQTlzN3h0RlRxNHRQY0hDWnZGSnA2K1llRHcrZWNjQm5LT1RiNEVwTDJQNytmQWNCMy9va09EeiBJWkxXNVR2V01rYTVOU0FrVi9VcnNyc0tFTHEvZmtOOElWQmRtRmtJZkgyVGx2d0dwUFdlTFBnd1ppa3UzbjhmK3dZZFdFTU5GOHRHIFdldW11VU1KU2NDcTdqcWRvbUI1RkRiV0JzTFZBQk1MK0VReERUMlQrUmZIQzJnZkJoZ3RYUmxuZS84QWZ3QUFncitHQi9HcU5zUGsgaHRPTWpSWU13MmV1NFBKZDdZdURPWUZNeHNKWnhWN1VJVEhDWlpDMjRENWp4V2xQN0d5Y0c3TjdtajhJTjQvWC93Q3Z6NzcwVk5JQyBVelRUOE53K0VpeU5XYnlSNG10d0JjUmtheGF5ZmlqSUI2bWZmSmlDY2ZDUlJ3eHhvUlo5dUxHNzVERVYyMlpqdUFQelE1NVNTSzlxIFVQbXA1S3ZTRmJyWm1XWWFISzQ0b0dHUURzajV2Q0dQVDBmVkxZQ0hPbWNsRnRKVFkzWjJTUWdCQndRZC93RFBnT05Zc0JzZ1d3aG4ga093dGhVZ01tcHpMdG5CbURzaktweDhhTVNDZkRSTGd1eVp3OVdBNDc0eU0zZVFWd1hoS1NrMnAyaTU5NERZRUV3WkRoeXhsOCs3cSA0RUlodmhodGlXUTREWkRFSGlnZmxGR1JmVDNDWk1vZDhZTjhiYXZnUWEzR0RPTDl6QVp0SmRqcURnZlA3QjREcGJ1REFyNU13UGFFIHJPN01Makl5TzRkUE1WZkxEdml2UTJvdXBYejVnZGIrRmU5b1BudVFmRGllTS9vWkdxdDJkamVMOEIvWG4yd1B5V0N2RTBZTjVvVVEgMXlKMncyU0JmNmY1SFBGOU1VU0JrbWtnZkE2bFkzS0hPa1VVeXRRWGlXMUlQMjRlRzZtRWNoVDZTWVc2V01xcTNuUmNrYmNZZUhZUyArN3A0dVZNbGNEWUlhMkdsekdSZ1pLNVVrOUR0VEFZTUtGS3pxQUgrTGpnREhmdkFBRi9va3J1UStJY3hxYmFNU1NWQlpvMXRZYVh5IEZ1T2tKNHRvckk5WExKOTgvaDdaREMrbjNFZXRGRGVHU3pLemFiazR5Y3E0SUVPSHdGdWdjYWk3UTFGMFZaWS9VUVp4ZGdPNVZLcXQgRmJ1L2NHWm5yNlI4VzBXd0NMTU1DM1pDM1pFTzRDRXpmdEg5U3pqRm1FMWZUbThveU9iU1RmQWU3dFJmZmdIUGxqdmkyQlZ4dVZBWiBMSXNLeHFyQ0wya2UxRU92MGx3S0ZOUW0xaDJDNE5QZW9TazY0VzNCa09IcS9wYWRXNnozNDROWm5OallQei9BVUh3SFA0MlpWa2FQIGNjdXlJTEE1VEd6ZUxlY2h4WDdzM3dzTEhHd2w5bG9qOXZFZ0xxZTFKTDdLK1RnMlhIaXVUQ3BEbFhobkFDbTV0UDNaRHVsSjVEY0EgZUd3THkyZXRGM3JrV3lMOE90NmdwTzFFK3dZY0cyN1FiVlY4WmlmUEZtb0FmTnVjSDhFRUJicCtva0pDNkZic3l1elpDWi9pbnBJRSBEYWtuNURYVFBIbHNDK01MUXI5cjBPR2gxdStCeUZrbzgvVmhVdjFtM3haU3Mza0dFU2VjVzcvdjVCMkUrbjYvc1RhcXlUNVR2dVRzIEJtSkJaZnF4YmtXd3lDNVMrNVNndy9DbjN4OERHQ0V4VnRvaFE5amJuNzFmdWFQVndUOS9RYmRBSC9BSDU2b2lpR0ZIc2g2cGEzUUwgYXE5Vmt4SEJQRHNGbTg4ZkliNFVXeDh5eUlhMnlVTzRjNEF1RGJPM041cS9uVHozUnE1SVI5Z2ZnSHZpL2RPajNHS3MzOVJFU1FqdiBpbDJpUW9pazdmVFROcVRFNForNXN1QjdFcFl5aXB4akhJMkVpZTBkeTRuemYvWTlkbG1OR29BV24yMWVhUmhXNERUU1MwOFdFSGRxIGxzbDNaR2dDMks3NWFqQXljRFczeDhwK1ljZkxCK0RUNk16Y0NKa2dic2s4SFlEOVJIL1B2K3dHdHpyZFhuM0RPeEF5NkMxUTZiclUgSk1RN2NyQW1NalRiU25GUElhZ1lNR2JVdUZPcjhScVpBNEtiVVlXWHBuNXl0ZHIvQUd4UDhDUFlQNkRpZWZwODdsMXZuWElCVzRzTyB5Rld0TENTWGZua3doOE5vdG9zQkZ6RjlEWkpsSm1IQmZXd2U0QVdwazd2MWYzZlJrYzNhS1NiKy9JUFB0LzMrdE5rNmpLN3phVE1WIHkrVlhlckpxSGRtMkpJZHIrWDNmZEUxc29lVXR1RnBwNGRieG1WK0grZVFRM2Y2Ti9vYWN0R3JxdTd1b0lBL3NDRDU4cEFqeUtDSHcgVDNDTk4xSk1zS1hjdE1Yam81cGkxRjFOODlSSkhVT00wRnlZWVROaDdNZVpZYWF5YzdVWjlwREd6bHhaQ0VudHA2MGFIcjRYVTFieCBKOWNTb2dlc2F4c2xodFFtcjZnK2VZZHRrTXV4dzhHQmJCZ1Q1NXJtREdkOEtWQ2pZcFdvZkZJQXZ6OWkvWUFEMkI3am1EMGRYZkdvIFhQSlZLSGJVS3JwWStzTElqaVhCTlEyRlg0ZXdKNWloNGZEL0FMejNRMk5rdDhZVUsyWnNaczNzYkJ6NCtmUDcvd0JiYkdTRzNUb2MgeWhsQnRGS2FrNjBQVk1BZndJeEJVN0hsSjB5OTdzMCs0eXFHdnZDcklKTDFZVDdlaDFVdFlldW1TbnVDOVZXbWZVK253WHA5SHI1QiA2Y08wcklzaktpVzFMb0sxQWxrYWIzYTlWNWdxVE9lQlZFZXpEYlF1azJDa21TeU5tbUovd0lCR0Fxd25tek1IM0ZZQmhMczRQaWZmIGtIZjhUNzhmU1M4RFlScEpuTWlCQkpJRmdYUzZlOEdSVlFSeFNOdkhDTkkxM2FOdW9qQTZtQ1RLNW1EbmFjbGpMRkVrZ2tueE1jYlAgRWlicGZhZW1aUmhYQzk1Nk5zeUhNZDlONTRBMndxM3BuVU9xMlRMWHlWa0VFZVpZeFNKS2N0dkRoekJpV1kyZEhQVi9aZThzeXpUWSB2MjNzSUVPY2YyRS96NUJQOVZ2c1N1NUhORldlR3JGa2hxNTRiRXZBQzdENmN2bG9URjREcHptVmVZY0xodXhQUXlBY0h1SHdabmJOIG91VHpuQ2F1T1ZFZkFMNkR2NS9vcVN4YVcrRDNYaVdxaHRyRW9IUUxaVjZmNCtrSjUrMExOaW42M1Q0YjVTWmlxdzlnT0NydUQ1VmIgSVR4RjJnOHMyeUF6ZXdmcUE4QnNFdzJabGZybHNLdGNyZzBsV0ZxdzZUTEo5Ym9XbmRlZklyUnFFVnp5R3c0b2ZlQ1phakI4NUQ0bCBhbUdLenRlNWcrYkcwZEIyQUFmMkJCMkFrVm9HZkNYSkZmVXVxYm01ajYyNFJkTFY3d0FOSDJYWE5BNUcrb2RwWklramR0dXhIMnhuIENLS01ZcHpqL0haN2o3aVBpejBwR2xRNWNZREI1cFZsZzFXcXpEVFFNbVZqUTEzVXd3SjZDV0JNNWNSa0x1Ym42bVo0bTA0L295MXUgSXV6MHIxeVpCcGFQVkpQcmR3VWlNUUF5UWwwRm5SUG4wWFRlb0xPbW41bzdaemlJY2JLbVlWKzFhZFdiWXNaYktJamVmaVpJQnQ5VCBtRW1aZGVFUmdhVUp5TWl0MUQwUWxBUU4rQWNoUmZXV1pEVTZablN6cWtRbERydHNxY1RIc2hzS3hHT1c0dGhhcTZGaStCWm94cDRHIHBtMGhaalJZN25rOFdhMnpWMFRWbXJJdm14TVdTbjJnN3VCSkRyN1VVRXM5a0FxU1FQc2hKWDZ5RDF6WE9zVm5xVlBJUTlRdHdXb3kgT0ZnR0xHQTNBMjRiWXN0QlNzOGRrMWU5cXdHTy93Q0o4QUFmK2trdHJkbU5Bdk9zcW9IWmJEMWZ3Qmh0aVllSFhIWkN1cmlSYXVoayBFTmttWXNpRzRNbnRxQWJhUGNPTWl4YU1qZDBmdkI5QlArM1BUL1Z6WmhBNWQzWWNmWEpna3RuczUyckVPeGtuaXdUQXRvTFJIS0d2IHc2SGZGdHdxcHdRemxTa0xhd1R5YnpWL0pubmhLU2JCL1g4YmR4K2cxRlNka3JjbUJlSFlEVjVJbGt3S2ZXM2RQbWFhWkM4SHRCeWkgTkF1WTRHTlFoaXQyUmtYM3dHMmorVkorNTdXTEtBM2J3YjhnL3FBKy9IN2o1VmxTSkZoaGVKb2k0M01yc01VOW0zSXRER1R2cXoybiBvWkVhQXNKTjRUT2pwSWNaWVBJWEUrckdNOGVlRjhYUkk0SFQ0bzZvMU04bDE3Y2xOMlF0cmNwVnNoVHErd2pGYmlkK3RDbXlsdFE2IC9NVEh2amI0UGgzRmdQUTNqM3JQYS95cHNtSnkzZVFBT0ErM1VDdDBIWkZnMWZiV1ZBaGpjNVNtL0wxVVcxV3hCaERxOGxlcmxYY0wgQVc0ZThXUnVBZEh0c2hTMEdZOGt4ZHk3bitvUkhBQUQ0RDkvWUFDbGZGdXA4MTREdWRTMlJXK29Td2M0YXZNTXlrNm5zSmxGeWtkRCBQVU44eFB2aW55N2dub2Z6eUNHOFlsQmxvVmVqUE5xZmRuZy80QUFmNTkxMk9sczM1VUZnT0dVVXlYWnEwcW5qYlpVN1ZwcXlMWWZKIFVWZVYybGtUM0FQOHhrd3E2SDhCUDc0USs3NVFvVDkzWjNxNTRBVkVmMkRuejkxWlNmSEgwOVJlcVI2a1RzamdCUFlFeU82NmZZdVUgZWRubGNlVnM4TE1xbDVZYzRXaURpWEtSNTJydVI4VkVlNVhjdE43UjNHdXUycjRlcFNvTEVoNmpMTDQzcXUwOExjWlRqMkVOc0N3bCBzcEZ0aERjcWZIdUVNeERFYmh2a0JnK0R0ak1MYUNhemlrbStEZ1BQbjkvMkFBVWcwcGdYRS9PdFZNTVZjazc5SDdYbmxzZXdoeWd0IHNLV01uanpGcUIxdmpaQXhPNGZpcTdtVHE4b1RSam1POW5BRlFud0gwSDlleFBaTXREcjhQbHlZZGJ0U2JUNmtKWUpoSmZzS3Q1VmogMDVjbkpHQ0hNRDJyRFcxOFB2NEEvTzR5czJnTFJ2TjFjYjk4T0ErZjgvQTBtUHBPeGgveXF2YXJhZko1NVNkM0F3bkk3WTRWeks0dSBMdFEraC9raGtocDhPQytFVHlyNzJaK1RLZzNwSjdxSU93QUQ1OCt3WUgyRlZhT1FDUGFRUGcwYXRjYllsY1NpME51c2lTTGE3QnNWIDFjYlpPck5JOHJwL0d6bitPeXBhaDg1VUFlUldOYzljWnhYVHhaU3RzcE5tY0RmTTVTZDE4QzRmTCtMRWlBRDYyd1E3SVc0YzB4aHogbUFub2NFeHlidGV6WW5IZEpTZjZCUVg3d0FEcWVmRWNnTElFbHlmWUtUWVZnMVhVdGV4NlRPaDRqNGVWOVFpdUw1QTQ5N0U5UFpDRCBoT1VyQVBQRmtFeVJRb3NzMVY3SWJlQUFBQWZBQVBBSHlRT1F5N0dIMTZrSm9kYnVDZnFRSk83QlVwaTBIZXQ2NWxib21zaEJqVzZyIE1YeE1YMlJJUEQ1OWNvYXdUeGFQYXE3UjcyUEg3QnNCL1lPZy9NVTJRQ3lXZGxLUmlTdHFUVWdMeXZNSmMzVDB4eUxTZ013ZXRyY08geVEvZUJ3NWE0UGlQTVdlVUMwVXB3bndZQUFBUDcrQTZFc1pGVkVkSGNXeUIyTWVjYlZpNE9MZWFOaXUyaHp6MGNZVkt4ekZQR1h3ZiBIMUl3YzR6Mm04Y2dRM0h1Sng1NlpDL2dEYU9lUG04QkU4WFc5Rkx0OE8yOE82R2VpeXlqbVlId3pGa1F6RVA0YzdqOWwxeXQ4WjJ2IGpPOWhQUG9PL253RDlqMEhnN2NLZHI2OWkyME5TYkNGMHlFWWgrU0hJTDF3VnkwTUlHTUh4TVZ2M1U1aTRCL3hlQjVJTVp5Z3ZqTHcgYngyTkJBZWY2RzdZcjlMZ0toSnQwMHNqSXlIZ0tTa0s3STFXQUpXM3c5V1JTVlpEQUhyY09ZRHZsZ1dvcW54ODhHbnZJdFhLRE9jYiBKc1ovMlA4QW45ZzZ0RVF0eXM3VlV5VUJvVDdzckhXbE1mNWNlSGZ6QmNZZTBOMnErVVlJSjhORGh2amdQTVZ5K2U2ckQyejdOV1lKIEtTVGZQbjVCZnY3QjFtZU9JN1UwdDZuWm1qUVNROTMwdDZVNllwSVBtTk1RN1RXUE9PQTkzV2pjMU1NZXdnamlXZjEwaDFFVVM3aVAgV0xMS2thU0dnRGx1dExXUzRZZ3RralZkSHpXT240YUdtZ1dUVkZxREQyakU0cllWNFdGaUtvaUpROFdZUFpKdEptSzNmUGgwZUJIdCAxVm9hTXpGS3ZaaG5kRUphT0gzNCsvZUFBZFE5Wm5GOWplSHhvdERsb0Yzd3JZczRhYjdDVDE0T0x4N29LOE5mRG9iaHM4elo1OEQ0IEVDSDlERjFtekcrMXdSSDQvd0FCZlQvbitnT3Y3Y3Z5dm5EVVZtMThxVmMrVmZaeVRFVDdPcXp0NllhSXBhdVNreGZyZmtsVi9EY0cgU2QzaHJUWnhuQTBOWkp2QVFJa1BHUDEvd0NEc0V3cE1Eb3BabVRMdEFrRWRxNXF0a1hoOVAzWXdObGtLOHBJRm9hMzhPcTZmY0RFeCBmbVFUeStQVmZkNVF4ZkdUcHUwVGZnUG9QV3BvbkQ2aFpWQ3NYU01TWGVibUtLV09OVm9DT01icFZGeWJDaWJPVkRMdjIwTFl3dHNvIEUvaW9uMm15Y2pYaXE1cWoxeDNCUWRtMk5YOTJHYWdUd2pJQkcxdUo3NVdGSUUxdTBKclpWNTVRNUpFc2ladkMvd0J4Z05vVHp1NUwgTm9YSlVDejRRSWMzN2Z6L0FQbDBwVlBpK1ZaQkpqU0VNNURub2NZVEhTU1E5M2NIS1ZXU3VVaVdBWURyZmNpeUY4dWNzdW4xTFo4UiBsTkZDZkJ6WnRKQjdCNS9mL0FYTHFPekI3a3ZoODFqaGpVT3ZzNnlCTmZuM0FlMmQrQU5tdVVYa0RnWW1iT3lEdzdWUCtlY0Q3WnVnIHg1N1hISFo0NTk5ZlBuOE9oQzlLeWZJb092WithSGpLdGpIaVVyL0dkaDhNUEtLTVAwOGhEWlBtR1ByY0Z0SHoxVndHYm9yckRNY0MgSlA3QXYvMkRmN2tqWmlFYnR3OEh6bGtCOGNWV1A1UG5wUWtSVkRaWGw4SGlxci9XN3Y4QVhRSFY3SmJqdmtmamwySlpOM2FWaHRzRyBLeG1XeExodEZ0ZkZUZUg5eUtUcXVFWWNET3c4N2dzak04azZ2Mnc1d2xKQjRQeUR2NS9wa01Gd1dZa0E4bTBLcWNJdzFqTG9DUVBmIEljZXNySXNaWDNXMms4Z24vRGNHT1l3VEp3RndBMk55WVo5RzhKK3Y3L3dJKy9jQkZRNm1qNVMva3dNbXNlU1hkRFczY1BuNXhDd28gYmxYTmdxN1N5RDRZZXlPSDdoM1U1aHNiZ1Q0dUxXU2V5ZWMvMzk3bjlnamF5MDk1bHRXeG5WSktKU1ZVcWhic0hkbHRYaVRGWVdXNCB1eVhCeVF4aHZGZ0dBYmF3VktxaDlzYVZkR0ovU1FnUGZ3R0cvd0Q2NFRCUlJkOFVIYm5WNFJpaEdsV0x4dHViRmppdU9TY1hrR0NTIFBKUlZXUzdrNDNIQnk3Yyt6aWpXSTUrUkRqdFVDdkt6TWtYbTFXazVPYVlDVjdZS3ExUjVjd0NVTGxITGg0ZVp6RXc0SjBQNmVCYTEgc1p1dk9lRC9BRWtIaS9mdit3UDNUYTFjSTk4QzNDbVZkb2RxdXBtMnE5cTRzSGZCdEhyekllS0pFWGtuZUFPK0dJY1A0YzVTWUFJTSBPTWVoVFFNZVhnMmI4LzRGQjJBQUE2Q0RoRE1xVlBtQlUzNDFoUmJDSWlxSGFrbEhwR0dVQTJGWE1WUGNMSVpKbUQ1Wkh6WUtIWDZrIGNNSTZ5K1UzVUF5cXd1eWJCdjRBL3dEb2Y2blZaU3BWU1FGR1dwMUF4TGhQUFM0ZGdOMXRXZTFPTm40MkRad3NMUE1WV3gxYmpqQmkgMktEVVZJS0hIV2MwRFNXQUIyd3MvSDAra0I2ZmV2OEFGaDlhNHBGQ0s3YjJ6eFIwNXhsZmhieGs1MnFzZmErVi9ianl6NmZ1ZUEraSA1Y21RUzl1RW5hV2pVV2M4S0Z0Mis0ZHY1RjZ2OWZLRU5QTXU3dGdOMjJUc0FHMUI4dHdmRmQzVjk0WDF1NEpoaXQzRGtnS2gyQ3BWIFZEM044dEJaUm5nMmJDSEg0QUEyRFlBQ0QwNE1zdTRBUmQyY2NtSk15dmhyc3AwTzcvaklQS2l4Q2liRFlGc3V0MXU0QitZTlI1ZmIgVlg3TUx0QkdHSEFudnNCOSs5LzdCQXVEb3JxVndRNVZmR0VxeUVnUEo0dWh1RzA5cjVVU3h4ZGJqK052aTJZaHVFUGNQMFpDYXlVdCBESGZQdTFxL2w0OGZRY2QvNk8yQkhyZFhyc09aRnZrYXZiOWZGdFN0aFZXekVNTzBBVjVOcm42Zmlub2N4aytaOCt3Sjd3dUV5WlFYIGNEeWpWY2toQWI4QS9vRS9nZjZpbFpJb1JIbWZxRVdTRXVtR2FXdE1Ca3g1L0h4eCtSMGJMaVNoYU12RlVUS2paMXRnQU1UUXJPelEgbzFSNVBTSW1DeDhDSFRMSFh5MHR6SldkR2x1RElOWUs5Wkh5UzJJWUZQSUllb1NiRG0ycGl5QS8wT0J5YnlydEhKdnhkd2o2Q2dudyBHLzRkT0QxNVlkZEQzTWhpNjlxVzdKV29SUzB0UERKTUkzSFc4V3hvbUJRd3dNa3lZdGh3Nis0TlVCd2JVY09Nck5wS015eThHNnUyIE5CZnJkQVB3QStBMzlHOHNLWnNocVRySHpwTllxUmlMTEhtTENlRk13MFBpOFU0ZTRtTVA1eUdRWkp3RndQWDhISm8zS0NiTnNteVAgQURmei90di9BQjl3UEN2c3paVzlqSzdzay80cEpTU0xZYXBoaVd5SWNVVGR6UkQvQUtiY0szVzhYQ3ViTVlBT0xJVHJOb2ZHWlpPTyB3VHdDQ2ZQN0FmMzhCSDlNcjgzZmN2Ykl0VjdINXh2NTdUZEQ4ZExkWTNMU2UrOFV3QXVSODZHeWkvTzVqM05mWmg3V3ZoVnBkYnI4IFV3N0ZLbGFyUlpMQnZMOEg1bzJQWVZidEVxd2hmSkt2dmk3RU8xQTRmM2d6eUdJTndSbWZFclVDeWo3SmlEQUlQbjJEZndCOXpXQmMgQkduNnJWWUVxd25hc1VqT0NmeEFWdStCMkV4RlRlTDNJdGtHUlAxSUdERmIvRHRUdUEyL0RXVm5kQmd3NTRRNXdId0Q4ZlBvSFNCSSBMNzRrQS9nSGxCYk1RRnVNa2JtU1Y3WWh5b2dseVBXb1FYRU9IZGxrV1FuaDUybW5mcHpJVDhwNXdJRVNlUGdOL3dEYnovUTJqc2xGIHdKRmhDek13SVJ5b1kxZURoMnFyaXpKY29HSkZGMlJYNjNhZ2VoK1lEMlNxM3hmd09Nbk9XajdOc25DZlBuei9BQ0ErQVBnQ21WbmsgTHFybmNyZVZGeXp4SXd2bFF1TnZYQnUvaXVpN1FnVm5RN1NKSHA0bmJiRzJwOW9rYjB4anhaZGtzTndEelRtc3lZdnE0ZXlMQk0xSyBraHdObkpOWkVGVURTQWlZTHFVUytSRU1peWN3RHpGdGdEMk1Cbyt5NFA1ZkZxNVA4bzRXano3Zi93Qi80RDB6aU9ZNktWa1dkYUdWIHh1WUJaUGxtQTlTdEZPTGF2VW9vWGJTMzhOUFE0ZGJobUR1TUJUM3hIUStNL1dXYzRFQ0pJTmdQbndHL0gyQkI2cCtEdXdPZXFmRU4genhKbU9TM1YwU3Q4bXdpQmRiUTFkM2xpNGJnSG1NaGlhK0VNSU0rcnVLcmFOd01vejdHa2hQNkFBSDBIcGtWSWo1UVlXZWxKcVRVdCBoVkJwMlFaZmNHeDYzTE9GSXRBbkcyZzdqTlE4TEg3cURvYlYyL1BQRGdzbzFYN1pzWnZoQ01BUG9Pd1B4LzhBUVpFY2JjUk82NDJvIHRRa2czWkh2K05vMHRhQXA4aFpzRk9SWFVqa2k1ZU5uU3ErbG5EWUpGZGJtNFFHOTNaanlLeEo4OUcxZnBicGxaUzJwSnFxN094NzUgTlpWK1lNU0N3ZG9xK0pYTk53K1lUWWR3VExJSVRRYmFuZ1FWcUUwWkRRMlpHQnV4dmZOZ0FiK2Zmd0FCQlpDdW42ZjUrb2c4QnRXcCBLM21WODFNa3ZzT25wNG1HZTdlM0phS2VRcmVIVzVqZ2RnVElNL0J1TnNpeTh0SGs5bENIRG5hTGZ3QUNvdGdQMHpUMTlzWTZEem1nIERacTNWZXFVUHFyWGtlem5ENGpJbTIwN3BxdW5yN2hXN0l0c2tOd1cvd0QwdnRrQU51YjRyOXN3ZUlUVVB3Ri8zOEFBUWZBT2FPbm8gVzEwbk9kMnFTSGJkUlJKaElIcGl1MlZXTGFDeWFCZkNBZGJzaXQ1azF3UTJxQVFiUWJJekRQeS8vcWliQi84QWZ6K0d3VGNuY3lIZCAyeDZtbUVqR1dDU1hVZGd4YUtXQmFqSG1PUlhmTUY3Vk1Sa1FnVXhFdEE4dHBwNW1kNGZRaDArcjJGMHJtYk0rcE5KT1VraXdBajIxIE9jaGNCVW1Rc2pNcEZ3bUxrOENTVzNlRXlXRlc4UDVDOHRnU2lSYU9NTmZXNWkzOHlHUWhneURCV253OXNWM3g1V1hnSlZ6c2MzL0ggZjkvQWRPMXBaRjkzRjFpN3ZnRUpNUDE2a3hLUHpvYStrYnBLdGlVaG1IQXdIc2Q4VDl3RDF6NTc1YU1zK1RKLzF0NThBQWZ0Z0FBTyBocGdtQ3lqNG4vQW1JTXhkYTBtWFpDcWtYUXZROTBzSVdtOGcyZTRQbVh4dkNxMnNGdEhIQm1LZStub21jQ0czWUhqd0gzN0I5Tm9PICtXcFV1cHdQZnBtbndabXVZZXBCM2tPQUVlMmZGMCtyd0d1cXJYK2Vjd21jZ3RScXRwZlVnYjVXZkYxZit0dTZOVjgvUVFIZ0Q2RUEgaktqS0hrVjNkVWVOMldhV0hjamwyd3luYVphOWdvc1hya0N1YkVQSEdrY1VaU0JDNnNnY3hOVWNWRll4dXd5WGptYlpjRDRCVThVTiBsQ0Q0THRCcDdQNE85TXU5ZTA1d2NhNFV2VHI1VXA1M3B3b3RFSHhQVDdVaDF1NFBrRUNRZkFlMlcrK1h3OC8vQUFBRFlQb1BRSFhiIFJaR3FXbzBNN0FhamJzeDVOa0x5L0QxUk1GaE1nR3h0UFlxTE0rWUdyZnZZeVYrNFRoOWZ6L21XK3pDeXFNekk1enZadi81ZFAwSHYgK3djZVhYZHFXaFE1ZTZWZUc3YVY2REhOckRUQUM2OGJDV290RU5zVW9vWUo3aXRza1BiNW1vMURyODgxZHkxaG9LZHMvd0JreHd3MyAvd0FBZkFkTWh6ckJIQzNJeU9RdWdXU3Zhdlc0Mm1VUGtWTGFHOEFCVlpIc0VNY1lEekljeVlQbTRxVEFlbk9KUDhEazhVZXJVbDJPIFAyd1B4OEEvWXZ4K0tOSzNwTktoMUp6VVM2YWZjckNiVHh6NmFkZHQ5U3VvWDZpTnBFeTFHMVFGK3BmVWI2a0NTVlZjUkxqTUE0Q0cgT1NYbU5rQTlONHhpMkx4eFE3bk5yYWpxUHZrSmRNOTZ5SU5iL3dERUtkcXl6MVZTVDB1ekhDZ1dqMWFkUmVvdTMxTUJEQzJCcUJzZCBSY2JObFMydTNHUXBGOUNVNFdtSnpjNEZZMGV2d3pGQ25tOCtSTFlDMmRYbFVOVEdtTWN0Zy9WYmRueEszWmlBTmVuUUl0cE1WR0cyIEJ5Vk1GNFZCVnJOSDVMaHFDcGtpdHJ0aEI0VWRsRHFrS0M3aFFXWE56WXdsNDlVWEgwcHFiblNQUlhoSUxVVUZPNEJZRmZHUDZQOEEgMS9YVGZvOVRmZUp5MzNmM2JWZWVQL2EvZmovUWZQSGxZUFI3OFYwT3dwUXZLSkhzMHdFbFBCNmdVZDNtQVZlc2lsSUdDQmdQRG1HUCB2aU9CSDFwYWpoK0xpaU9NNXY4QTJBQWZBWWJBL0FMcExhdmNtYldiZ1ZNMWpHRzJEU2FqVTd3QnNpbjZjdFNWcGZVNVNIMi9tTFJpICtGdTFQT1FPVzZjK012TnlGVmw2L1Q5Lzlqd0EvdjhBMHNWc2ZNc0dZaHhRMUdvRnpHZTI3RFQ5WW9jaGhjWFBoQ2Fyc2ZiZGJXNGMgeERIMVdqMld3S1FQL1M5RFpxelJ6WnNJY3Qzd0I4Ky9BSDUraDZyWDZ6WExRTU1hUTRScUg3TUVsUGxUU0hkNGZaSGErU2RrM3g4cyBpdDJPZWg5eTA1RDRlVEdkcjlzT0pQQ1RuQWJkUGdBQ0NmUDlObEVicEp0NEdzRjFMTEZLa2N5TmRSVFBFaytFYjBiREE1a0dpTVQwIHBKcEVraExTeU83WllFdkNYWEVSbHNJNVpJdHkrQzJMREVoYjhpOHNmUnVDdURWcG4yL0tkcXYwaTJDZHNpWFpHcHV5S2ZzSlAyRmUgcWE0Nmc3anpOUWxicDVrZE1nZ2NJQnZrNHpESEJteGRrbzN2eDg4ZjhDZnhQcXUxV0RWZ1pReVZhYndwSHF2bVZ0VHJBbjV6Qkw0YSArQ2JRcmx3LzFVbU9BZGY0clBJYkd5TTJCUlhKc3lPYndTZGc1OEEvWUQvVmlxRDFBUTFKSHJldEswc2xicmR5MHVyZW9TUUJKSTlzIExZRXJmTlgzTFpDZStRNnJEMXVIcjhQQWJTSHdURm1FK0xqRm5teHYrdmtIOUQvMkIyVmNudUNibG5RMWpHSk9UbVVQR3IwZ1lyMjIgTDU1a0xySlhLTjk0Si9HM0JEMjliYXY0Z0o5Y3d5WXlyeWp3ODkwUW5PVDREZ0w4QUFJUFZhTTZ1UlFtbzB5UmFsSG1nZ2ppZUp0VyBJOVB2a1RyZzgwZytwamppa0tTeVBzNWlQTXl4elJyY3doMDhqU2FacG4wK0FMVEJKV2dqazFjY01Na2U3TEhGWWdrbmRjbFU3dXpaIFdMSVZXT1JmbGlRQ0ZldVRhTnBQT3I2Mmh0aEdHTlBYeXlIRktPOW9WSkRIcDYzRDJldHQ0Vmp3L1R4dTZNc0s0dDVXUWFTN0pOVm8gTy9uOS93Q2ZIei93WVNUdFA3KzdXQnBNdFRUT1lPdXRjSHdJRmJDbUYyOWlsT09jaTRsMFRhYmZjTVJpQUY2ZWJqNSt1cFpNbldMTiBpVU8yZjY3UE9BVjZ3Vi8xVjhDWVR1TWRtUXc5alZmYllzb0JHNTBwd1c0aStuNUxqRW1BY1ZPNUR4aGdEbUsyK1l0MWZOZU1XQ2VEIFpHZmRCZkprZEpTZFBEd2ZmdmQrUDFGd0hyY3lDcXJ5a2VqZFBIWi9zeXBLcWt3M3hxb3ZoUHMxYnREYWRoaDJocDdvZFBaSzNaSEMgR2p3R0J0NDBUUnJrNXhXZm0zYkNvajUvd0hWVE9SSnA5T3JPZnF2N3JxRVFSSFlqU0Y1UnFIVnA0NUpJMXdJWVJ4UGpsYnN2YUh1TSA0d1NTR0pQU2pPcGhrVVk1N3BHYUZlNnNjRnByTjJUaU9oV3lHaW81OWtPMWpUeHRKdzY1dFNMWnRIbVhDcDE1RFRVTmhBMmdoc0c4IFBsSnpHUWVZbk52QTk0SnN5Rzlzd3ptd00yRUFJTy9nT1A3QmhhRlRveFB0cTZHT29WM2dOdjJoVzl4dGNoYkdJQlpPUTVkMnB0VFYgV25UTUxycXg4VzRHSUp0ckNmaUhac0h3WGdOMk5LdTFIcUpCd0FBUDBQNFZrRnVqNEdEaDBoU2h5bXBYTUpOT09Hb1RUMjhKQzJLcSAvbmg2azJCa1Q3VEQybWgwL0RlS2xIejdVM041cS9jOThxNjBRaHdCejdIdEQ3SCtoc0c4QTZ6cis3R09zNmx0R0hQc2hKbDluenl1IEpoNGxLbkZ4ZHdobUppRlpHNExmQkxRNE9HV0t6VjJqaktQK3RWVzdib0JmMkIrZmtERFFZM1psY25OMjJvbWFxdXNnR3F6K1R4Zm4gNTU2RVNvRlhjTzRqY2hDTWNaRnh3Y251dkhJbXE1c214MWE1MFQ3TkZvOW5WQ0d6cE5wcmlIcVpySm9yQ3lHQ1dudVRra2ZMcmRmeCBzaFBEdUFmNGJ4MlBmSzVNRThWZkVaNXRKU2RnQUFENkN3SUo4QUFUSzJybU1vZ3FtYnVXN2FQQzg0MldrTlEwaEVNV051MWN5akE5IEREc2lIWkRJdm1Qbjc5OFBGbjU0c2pON0JtOS81QWYvQUxCMURyWXVSQVYyUThCYXRTQWVtOHBTcEZwY0R3OHREcThXajJOSy9HOXEgWHdubUU4ZzRJL2IvQUxqUzd5V2VUck94aERlQ08vZWZQb09IdjA1UTVCWXZpMWRRZW1EVGxwd3RCOGEwbXBGOVAwc01mZTBPQnFhdiBXQUNuK215R01SQ1JKakMrSTEwVTliTFNHVzdlR1ZjOGtjVW5FS2NmY1YvMUw1LzBnVDNxWENsS2tjK2J1TWZVUkx5emxoajVYSVkxIHVBKzQ1VXc0ODlMYkU1T3NtMTU0bWt5Qnhpa2s3VGl0ZnhZdHdiekIrS01RcHRoUUNwOGM1VU5jSlI0SUpJVW1ISUpDZXJsTENsQVUgNGZEbU1pZmFnZWYyNWJXQ0E4T0NLc2kybG0yUFl3bXdjKy96L1VQalhCVjRhbTA4TmZHVEpEenlRMklQYWxVd0pocHA1dHNZQzRFSSBrTmI0ZTRMNmVxOXI2MCtZTXFEaXlNOG5MUkNlejhmUVQ0QStBOThGdXQwKzhYd0RKUGd1bnhzT0JaRmtMMGdQcHZUMkdZK1doRVBOIEZWTC9BTXlZaHpBNC9GcXhIOEhXM2xtMnRaL1pEWnpmMzUrZmdDQy9IejlxOU9Xbm04dFR6ZlcybjRWWXN6VCtNcmZKT2hRTm1IVWcgSlhGT01FUkZVanphKzVtS2U1cU1sb3N6VmMwK200c1g2MUNheFpxT0h4OUhvWW40M1g0UE1ZUFNiQlAxWVY4V2FlVFIvVE9Lbmc5TiBFSzE2RXBzazdmRzNKOTJUMmdybVFDWU1GMllKdHhJNUZNcXk4UnNUakpIdFN4NVJ5VTJMTmVXQm9BQTVDVU5rc1RUNlk3cVdXTmR5IFRHMUpNVEVDQmNHRU9lQXU0dTBJWTZIUTYxak1aRi84bFZlZVZWc1lzb2JRTUo0WUJEWVJCLzdBZjZZVnNjc2dDdzdiVlRLTjdTbm4gYVdua1VraExNSWpsVGg2VkRUNGJJdDFYVDFxT0VNR2U0RzFWdTgxQStET01vNFEya25LaVA0YytQOUkyWlZidzVKKy9BWmlCZnd1dCB3bFRmRHlTRng0WGNWYktiZlRGZ0xkYm1PSGw2L21WejJ2UGRueGp5cjFlekUwYzRrN0dnN0FmMkR3QUF3MC81Y09lNGJ3cnJhUytXIEVlZjJ6aDc0UHJLWUxsUkxHY2s4ZUdNTWhqa2hBTTFQakFCYXNTZkZ4YU1qWXUzTnVmSU9HTDhBZmtFLzFIZEZLOTBJbWp2ZWlNdDcgZVdHREsrQTcrR3dmSHRvbkU1Y0N5TzF5Tkc3Sks3T2hkZHNjbE1nQmJYWGJac2NFOGRLc1B6RC9BQk1tQnlxVERBbm0xc1lQaHVDUSBZYUFLbnpMaitDMzh4UFpIQ1o4QWdlYXc2eXM3V3RiR0U1djcrQWZ2MFBnRS9xa2tOa0NqZzVsb1pKSUU4a2hWTlhyNXdWOVBhZUxyIGxzYUNtMzAvTXArYmFoajRad0RlSGF2bkZ2bEdpM3ZObStEbjdkcUx6LzZMOXhnQnhUbnBZSGx1Y3BRN0dEdTBSb2FnKzB6THVyQzIgQmNxWTRKOXFHRU5iaC9Ec2FlUW4yTXQvbERjMmJlNnV3T2IvQUxBQTltRERGU3NsaU5DbHBqTWFaSUZlcEppdmh3TlRJVEFOZ0NURiBqT1RDNVJTOWZ3dUJ6REV4Z0R0UUJmZkhoakovZkZsRytrbS8yQUIwckhGMTIvVTJwekUvR05SOWhhWDdyeG9kbnpsN2hYSkovRys0IHlSWm9TbWJWazZGY1l4USsvSTkzMjE0Sk5EUmxrTElnTkRJQmdibHFEUFE5U0RZd1hOWjFQL0RhSW9sWCtaMlRtTWlIRFcrQjc4UGIgVWVZVEdGQll4WkJoS3UvRVIvWUFIMEUrQW1aZ04wSU1oN05UVHFTMVdOVmFTcDJncTkyV3g4UEFZbFhvWVpnWkxVRHNoaUhZREppZSBxN0ZxdUJtMnZ4aHp6WncrQXc1OTBqYVRlRjlqc0FaWDBBd3lPMWc1eEpkamg4Qi9EeFpRc1UyZGZyaVc0UStOL3dENGZ0eXFIV2ZxIDR5cytiYkpqc0gzN3ovVHlaQjE4MGkwSGhjVTg3UGs5RGpWbEhWVCswdzdrNFFlMDVzaS8yVE1WV3R3MkRpcDd0TEJoN250WXdac2ogc2MvN0J2OEFpQkFGdXEwcktHUVRTYVl5RFRPK00rRFlGR0NVYnl4YXhmYlE1TjlRQmpHc2pERkk3V1EzbGpKYWhrK0x4b2Qzemw0RiBja2c4Z3IyK1BWYTVzdGtqRGFnUE1qdllHZGdqcVlkb2NyQ1BDNFk5YnF0d1d3N2dQWkFlM3oycHd0OFlMNHlNQm0veXA5K1FmUDQ3IEJwYkdGRGlxZFlnYUh3azUyY05yZDM3cUxjZVc0TkFHSmR3dFEyZTFBNjJIc25lRG5EN2F4bU15eUwvWTlrTi81ZjhBWU9tb2h0QlEgeUwxT050bHJZMnpxcVZVbnVoZkJJZzJHRU1wWVJRcGl3dmkyWXJjT25rSVhiUmdRemt4NXQvZ2VQdUVkZ2dNLzc3QS9Iei9TTXZ2SSBoMHc3elZkaWNOT0RVMmdWeWtuL0FMZUxGMnpiaXErMThaTGtBV2pNeERzZUxQREhRTnZxVThNVWVudXNVWEFHNnBXSHN3cjUrM3EvIFlNR0NvMkpRbVFoMEdMeUJOTTdYdlNWR1paQWxEY3NZV3RydC93Q0pzKzJTZ2hZNUZHVUxiZnFlSzNjdnQ1c0RIOGk3K0s1K3ZBZEggWTB1R0xyckpiVlZYcjJwVWpsVFVQTEIrTHFiUktjQ0Jnd3lPRXd4d00yQnE3NTc0akkza3htOW5LdS9FUi84QVlBSHN3clFtT0VETSBTV2pLVGdsblp0dE1qQ09mRWxvL21pakRLVFdYZUxJaG9lTGpZRXlEQXEvaXI0akl6NHJqR1k1ZGdRMkRRVDZEOUJ3MzgraDYvYlA4IEowQWxMR01zakt1Sjhac2tBYklIaUdRWHFDTGZFRFdCTVE5UGJoTVQyQ0hBUSs3VTViV1dmbEROOUpTWFpIMkIrNENmZm4vcVlCc0UgbERKM00wV0RXN2E3Qlh3SGJOVDUxaFhROFZXTEFpWElYdDhOUGZLcnVDa2lFeURkVndLUU1POUxQRjFsNU9jMkNIZjcvaUF3QUgxeSBRT0JudTcxTzcxdXluSGNDY1hISkZSNEZGZzJWR2d2TmlyeGlrY3ZGazZNQzZWbGdMS0VaZDhaekc0dGl3QnowUzJLMk1rcm0wb01TIE5oNmJhdVBOR1RWWWRzK1U1U3hZdGJIMk9IcmRrcXVZUWNhZDFTcDg5SFpGa1p6eTMvT0d6Z00rZzRvUGQwQnY1OHZSeUxRVWh6YmEgaWgxdk9kenhKaFBzajVVN1luMWZGbDF5ZTVBWXV3eGZGV0xZOWJWZFBDOGgvTXJQSG5nd1o5SkNWVy92ejhmUVg0L3YvUzNwcTZKQyA0NlpNL0ZKVzdQRE9Ga2ZISmNHRXdwVlh5d05jekY0T3lUQTh6K2xVT3dMYStzN1hhQk1ZajJqVjNuLzMvQzNjZXBjZVVJV3IzQ2xKIHRHaENUUm5HMkZQckd2WGhUWlByMW8zSmRpL2RnZEREd3FySWgxWFVzUGdBekhhQXB6bG1SbmNJa3ZKLzZDZ2dBQi9rQ0o1OE10S2sgYnIyUnVaaU94ODhpQkdmdXh4T1I0OXc0NmNzR1pNcnlJK0ptcFVOMXRiVjJlT0d6QkFyakUrYjQ3WkRSV2M5c3J3TmJYRzJyS3JkdCBYdzRGMmtVTkRLZHZuTFVZdHNIekhDMUE5Smp3OWpYei9JdzFsR0tjR1dlRW03UmVQb0ovWUVIendGSVZNdHRzQ243R3locTJIVFpqIHRMMHpwTnpOR3BwUFRUb2s5TFF5TnFMYUg4UVA4ekNmUjZsVmNNWXNvZTJET0VtL0FlKy92Mk9IVHNrV1JRK1U4cWdGc3lkUjlBdHEgNVV6dVlaUTk0ekllRlNsZFNvdDdBVExJcE11dFZ1dXpNTlBPbUJTQ1RHVjRGazl0UmdmQ01RSUhZZm9ISC9VQ1dEU2RYeGJBWkJkMCAzOHBKOWpLdGJpZTVIQjE1YmFMYXIwRHBmY0I5a01xMitHSEJmMk5TcitCWElmazFYOW9HWTRidXhKT0FFRiszL0UrQVBuN0R4bFhWIEJ0UGdaSlZsMDh4TzRNYlpYY1J4dG5kTUlua3d4VU1Sa3BKR0psa0VyRDZvTi9GSkZxSW84Y01WVElSblVraEk1WmtHUlRMZFlqMkYgVHBtVStsMldZem1qVDQrYzJ0V3dtMFRYK2N5V1JFbWkyaGVsQzhTRU5PZklhMm4rRG5XaEFWV1FtOHZnc1o0VCtnUUcvd0Rud0FBKyBOb2NpWWh0bTEyaE1rMUsyM05VcFpmUXBnL1o1WDJpMm4yMEdURXhjRDVXL0QycFNRRzFWTWNHN3lySk40U2RQSDcvd0RZRC9BRmRuIFVvajZHOHJpcG5UNlNvRXhta3BRa2VZVDBlV3Q4RFUwTnlxdGdtQjNCdzVJUFpKeUdRUFlRMGJFV2lleU83V2o3OCtQcjRBLzdudWsgallsZVNJR1hEYUNhZlk5VnE1aW5LY2VLWlQ3ZitHZnU2elUwVlhDL1d4bHZUekxJd0dOaFh4NnJ6ckRFV3pQSno2UzhBVjhDQVFUNiBDQVA0TWFTT1NvYmROejduU2dLcndNdTczYzhpaFI1dmhXTFFzV0VlZUZjU25Pd2FGcWNWdzhjKzYrM3hWbWlGcUJvYmsrT3prZXY2IFN0aG54SnhEbUtydUN3dGhpcVo1RGNCNFpEcE5QWkRGZ1dvOFQwL1l3d3duVGRvTFBCd2dUZzRBQi92N2YrcmFFSzNoME9wb2RhVDEgdHVBNXFlUzRPMzJSSDQwQml0a3A4aGtKaGlZWVpKaEJrc1lEcVE0UC9WQ3V6STFWbTk3cXQrNENmMzlCUVQzVTlXNm1Zc0JzSkxpYSBOcmM5ZExqR2wxK2h3N0FYcGtYRmVQT1JpNEE3NVNjeTFQWmt4UXlIYmtQV2UxbENZdm14dEoxR0lJRG53RGdJQkI2YWp4dkRIY2o1IGJVREoyRzFURWEySkNURHNCc2NITk5Yb3RjeldBUHlXdHJnZk1VODVBWHg1d1Ayejd5ZHpFY0pzaVBVWGdENkNmdzZZZFJsTWtBWEYgSXhrekFRcklaQ1UyblI0b1k4TnUzeVZsa3p5RkZLT1ZHR1JFYVptRHZMTXJMQVY3SGVUK1IzR1JKOEpRcnpmUFBTeHl5bG1YSnB2YSBkTng0Ykd6cU5WSCtZSFE3Z1R5M1p0TmQzeG9NV2hkbHFMZnd6TndjSGJYRFk3SUYyWXJ2aE5HQnUzdWM0Q2hJSUR6Ky9oTEs4Vi9vIG9RcWduenM2eHpOVFpOQlh4WCtUY3htblE0cVZxYU9vYUlRVzJXaDlTRkp5MzlsMkQ0RnByZUtPaFh1VGVUZ1E1aURmajFSTUdIQVQgN0FmMDUrbitwN0hkS3hiWWxrS1JLQTRFdVVBVDFibG1TTWhwSjVOd2NJY095TEkzaFBZMVVDd0FLNVc5enZnV3M3NWRnUUpzSHZpQSBBSU9BRHJzSUs2WExJRWpNWE9DY2tRMGxzVjY5K09XaDJoVGJaM0djQjZIRFpLSGNFNnY2cm5jUGZPTit3dDhzd204V2pzZ1B0Ri8vIEFINUlnaUlaY05NVUxpUUl1bnd4a2FXQ1dSaWR3NVo3S0tCUXdvbm54MFkxVThVOFV1bmsxSWRZekVXZlVaNE9JcElaUVBTSDlPZDEgdS91QitPcTVaT2o5L3NYSTlEQXdXZWlWeFA4QVRtemgrWld2cWVidUZ3cTVreGlVM01NbzRUSnFGeXpVN01YVjFpa0dZSUQxeDh6TiB6OGdWNklzREx6NVEyR09sNStkV1M5UVFaWVFCTUlGRWpUR2VITFN6NmE5VGhsbXFUMWRwaEdSYStPSEZKVVJSRGxXS21pQWNGd0dMIEZaZWFPZ3o2MXJzL255SjA0K1RDc0dCeVBZYnRuUjVhZSs1NFNiNU93Qlp0Yk5abjkvSitmMzFZZWNnSDZtZndENy85UDErai93QlQgMUJXSm1BK0J6RmQ4R3BPYzJrcklFa1liSWp5M0FVbXFVV1V5ZDRMZ2gxdXRobC80TDRQQTF6Tlpua3A3akVlN0FnUkhQZ0FHS0RoZiB1d29PaXowRExQbEM5TEIwbCsxQ0pKOEd3RUlscVo5WjRqQ2JYWFJSd1h6RktQZ1lRWkhRcmlndjkwSTRmSDJmY1hmREZKcTQ0Znh4IHdQQVdEai9UUFQ4eEh6YmdKSnE1a2trK214dGtPN2h3T3lGNHhWNllKcm14ZzdEYWtLcTBPMVliQlpCejhsbkRCUGdZdFpXVGxvN0kgamdlQWdELzdBQTQxOUxMdEZ3RXNwOHlXM1VMWUlja3A2WnBnR3YyeHdWNHRzSnN2aDhPeUU5UGhKN0JUN3doMmhQcDFPclBUMFVLTCBLendtMGFUQlc2ZjdSSU8vOC9maVZsU0tWZ3NKY2hRN1RIMytheEZjVnpmSnV4K09nRE5JeXhOdU5EL3kwWEt2SGxzbDgxeHgrYThEIHJTNlExc3BscEs0NzJvdG5seTFIK3N0UC93QU9ueEtmY2xvTzc0K2NmaGg0YWRxRGNOblI2V3VENEMzV1l4b0Y2aFJtK1lKSU4rdDIgb2o5dXI0RFlENnJ2QkgxVVVqRDR1K0pKc0RZdzJTd2pyNDFGV0JFNWxGdGpWK2VUL21MZFZ6SEFPUW1WekFudHZNQ2FNVGFCbG1BMyBaMkNmbDNnSUQ4UklLQ1ZPbW1DYWowbmtxVDRoeVh5a1dva3ZXdlFLR1FzMkdlcm12YkZBbUNFeUh3OFB1QzNCZkdDcFVjejJ6dEJvIGVkaU5oTjhBSUQ4ZjRDQUFkV1drRUt6elVzRFVEUlErb2NEQVc3MVUyQlAxSUs3RDhWeWRpZ3VIOE83SERVSlQ4eXdKaXJCdkE5UU8gSk5aS2ZvOGIyRU9WRitpQ0EvVHBCa01WU3NuMUtKTnR5Q0JzNUlZK0EwcnBRNWpvYnlaRGJMTDNObHdjYWJ0eEIwMHp0Q0hVeXQyUyBUaXIwdWZGUHlNRGlkeTJPSzQwYTltQjFUdHJSYW1VdWMvVzIwT3BVMll6N1VzaUpNbFBsWlhkS1pLL1Q5U0V3d3RtR0Zic2EyaDQrIGQ0eFhReWJON2RyZ2I4ZkFIL0FZNy9PMkpTZGlIclZyZTVLMDA2c2t5NlJzYTJkT3gramNpdlRIOFB1QXRYRHI5UGgwT3F6R0tleVAgRjBqK0Q4bVJud3BaaXlFZGdsMmRvajc5L1FPL242K3pIeVpsV1hOcnBjcmUyNXNvQ0VVMmk2eVJDSVl4YUN3cjRaQ0dobUZ2Z2ErNCBOUSt2NTlWbUhsbVowSjRaa2NJbEd3bU93Yjk3YkFmc3pWRFZmVk1INk1Kb0ZtWFhVTlhWdWd5VFNla0djQThzcFRqQnFVRWtEWlorIHFwRG1wLzIxQXNuMXJUeDZoUHFGNzVqNlV0M3dZRi9GQVlNRDIvbUEyblVGUzgrUHpJWWxjaXg3bmpoVEx3ZVdVMThWWnRscko2UkUgY2J2V0FRU25LaW9hOXlhU3NSVlkxNU4zeFc4aFdDbndpbjN0NEkwN1NkR1lObGVhTDNhZFg5aEJXaTJkT01aOUR3Ry9GdmUxc3hBaCAwaWVBVmtiTGt1ZXRCVDArbDFTVWxKZmVlNHNJQS82bDllVE9vdGd2RFQ3cUxmSzZ1NXZDRnltblYyckhUL1dXUWtNTXNYR0VKcFdxIHlDRzRXbVpoNEFQVWI5N0xCc25jdkZvWlNudDNTZUR5Q2Zmc2V2c2dldmhrT3NaUzV5VGxCSUd3MWZxalNiQS9IS2F2T1hHK2VWdXkgR0liNVlFeWRaZG9XWWpyWXkzOEZjWXNuTVFsMkhQQUg5K1AxRlVYVWtIVTY3S1p1Y0xzdGt0R3Q4MGRKdGhmVHlWc0pNeUtocEZJMSB6U1pBeERRMXZqUTh4UFEyRG5LMnpGT0I0ck9BUko0T2ZQdjM5ZmIvQU5HTnlVOCt4SFpHZi9EUWpvMTg1V2VMRlVUWnZqT0V4OW1BIC9PY2U1NHFxdGhYZzM1c245VVcvcXN0RE1pbkptVTc1eHRWNVV0MWxIVDhoUFNFL1laYWJGTU9FTkRtVlhEVzJCYitldnovaGpDZG8gYWRFWlo3WE8xbzcrQVA4QWdNZnNDQ1c2TFR4YlFTbjVWaFNTV25oa1pCTWZKdFNPV3ZpcFdoZUEyMG5qNWkzRFQwSXc0TGJVUVQ1OCA0Tmo0cmpKdzRFeEJmcitJdkFZdVlYWkNtYXpGWEtBMWl5YWIyZ2xKaUR6eGdQTG1QcWJYcWE1T0xoTVQrSU1qZ1FodFNHdjkxSWF6IHRlQXdtY0NiMjhBRDZEc0cvd0N3ZGJVb3hNQXVCZ29VeVVteUJkbTFLa1YvcWlwOVBzSmJxOURkeWlHNEVKaGlxMlNITVh6SFpXd0YgSnFEc3l6amlqSTI5RzNiejZEc0Q4L2MrNkhUeXVJWlZDUEdrY20ycU1MZDY4dkNvb1NJZU1YR1BIeDBVa2NVcnhLOGtiUE50N1lnOSBLT1BNZHl6eURNSkl1S2RtSm9rOC9pZXRSRFlBTkh0VnZnU1QvTU02ZXh1bVZmcE8xUGlROU9aV0loMTB1RUp0YjNBK0IwOWdEMk5XIG4vcFlpY1pxOG5XYXo3V2dFL3I0QWZ3My9mNk9JOUJxYVJZRldUMjIxRFovVG1lYlpiZmtxdFROaTIwU25kRGxJWkFPeWZNaDJRUUQgMXpBMUFUem45VU5DTnNidDJ1QnYyREIyaTJEWU9ueGwzckNWNDdVR1BJZGIweXgxNjdOaS9Va01nV1c3SEZxY29wYWxvV29oVERFdyB5dnA5eGRqejN3MlpHZkZkbUoycHphNjZyUWQvQUFLaVA3QjFQR0V5R2VydFBpbEtycTZ5RXhqQ1M2bnFXWW5scGl1ZXVNOUtNY3dzIGhrRGgwLzZQQWNPVk9DeXN0R0l4RzN2OVVId0Q5d0hBK0FreERLSXc3d3pQekF6ckV0T29VNWdTenhaWVppd0Q4Z2tqaXlRS2toblggQ2VzUThhdVRHMGJBWnBJTVRlZEFxZnRvbWpmRzRXRFI2NXA5a1UwaHFVMlRLQXY3RXdVYUJJZXprMFM2NVY4Q0tHK0IyUXpNSGhvTSA5UG5vMVBreWJRcjFtc3ZIc0U4L3YvQVQ2K2ZQN3lnZDhLSlladEN2aEsxRmRQZjE3R3dnNUQ1aFE4cHZsdHd4N0srV1FZK3ZzbGRIIGlCNnhvYU43UGRaczNDYnNONysvY0JBQUFCLzNGR1FoWURSaG5NYVFlQ0ttYWhza3NmTmZFL3VSOFZJZlAyZUZaRzhUQ0Q1c0krZWogdUR5ekMxY1lUT2JKc2VMOSsvZ0FHd01GUEtGRTJHQlhDZ2RURDFwWVRhcEw4eHdYMnhiVGFiZC9paCtZVW5qTWh3eUMzVlo0aEF0UiBrM1BCb2VXWTVnazcyZjhBb0ovZjlnQUNVZEdFam04blJBS3Fzdkp1ejRyeFErZWVPZytvUit4R2VMTHl5UDVxcXZ0SDdyL1UvbnFOIG1Ba3RJb1B2ZEx1QWs3dVZZc2k4UWxvYXZ6Q1UrVmtycTZmeHREeGZJZklPS3ozQ3l6aGhaR2ZXVmg0T0JOOEFBTzdwOEI3SHNSWnMgSGxMR3kwOEFlbU5vRVdZTnFoQnd3NGtIQW5raG80MlFtT0ZKNHA2MlI0cXBMNTdFd1RabWdvTTN3Myt3TUNDZjM4QnNIVU9VUWpIYSBNOEJNMTZTY0pVeFNpR1BoaDVZZUxGbG5xNVhQaDJvSFpIQndIdUZqWXNENGRwOFlURnRHNW8vNVJCbjBIZ1BuMzRBQW5sZVF0dEVOIFBGaTVqYjNWRDhlTVZ1NFhSenc5aExqU3BnOHhpdHpGdGJYKzFkOFdCUEJ1SEdTbTV2S09FTisyUDM3ZnorSFRTelJ2Yk82dkc3TFAgSkUxSTlZNEZXcTMrOFVRTWIrYkFBbnV3MDdJQTdJanhvelpTREk4aVNXaHVBVXRlbWxHelhkd0JUS3lXNTYvazJyQVd4b2VWTXRHdiBkTzhOcUlzTElMdEJlc2F1VThlNE1pZWhoME1mRGc0cDdiWExnamsxY29NMk8wZitxQml2L3dCZ1lSVE1xdVVZeWFIc1lZdDF2ZHpVIE5ZWkJna244d1EwMFR3MVBJTWxibUljTG1CaFZnV2kyZzJRWXpGQlpORzN1cnJzQm5rRStBQWZ2M1VtNlptWUxzQjhRM2V2VW10M0sgWjRlWVNEcjFWdVFIZmdMSVBoaG1Tbjk0WDhhNW5zS0dqMlFqREdqL0FGeGQ3Ujl3QjkrZmtMbndBQjA1cllyL0FHYXFyVTJHdDFLNyBLZjIwVFE2ck1zaVdub1o0U0JsR0Y5RERtSmhpR3ZtSzVvZHdyUTRIV2J4RjFjTVpnYnM3Sk93SDkvOEFQN0IwQmt6cE4zejNLN0xsIElKRnh3ZDNKR2VGdFMwb3NrWDBhbFlBWEMzVldMcStRUE5IL0FGOGVTZXFjNnFBN2hZd3h4bEQwTmxKVmUxUnFjanV3MlBYckloNGIgK0JNRDAvdXBzNWhQY0RtbmkwUEQvYUtIS014d0hpay9mc2QvUFliQWZjMVhnNDlscTlNcmdhZ2F1bDVTVFRsM0Q5Tk5rYWYxTmtjbiBKc3RDVVhyN2dZZXlGdGtUdzlxZGo0RUd0MllaK00wWjROSkp0NEFjKzQrQTUrZjZXSXRYajF5RHM2QUdaTGtHdmpJZ084ZkpEdUJiIGh0U3U3UlhNTWV5VEZ0d1cwUGpZTUR3TnFoakhwWDV5c3ZBUTJiZU1BSGdOL3dDZlkzR3RTWVlBMVhUTiswM3FXSlVucU1jT2JqM0Mgc3EzeFF4ZkV4ZGpMYkFodUhHNGRrTUFjR3BNSDg0emNYeGViTSs3WGFjK2crZnh3UGdIeWFoVlZWRVpTV1pKRWkxQmVrYitQTXYyKyBuamt1SXliTEp1Vks4ckduelAxQWtSblI0NUcweW5LZU4wQkViRkxGM2JnRGo1L1YxWDFHV0l5YzB6bHlmUTlidmI0MU8zZWh3emgxIGhYQUxjckNxOXBXNi90UlAweHVGVjFXUUQ5dExRK0NZSm9yT1VXZDhONGM0QUgvYnU1Z0EzODhyUFdKck4xaHA5SjZjd05lcVZQMUIgVXFsZkUvSnIweDJmUStQSnRqY2hXMDlrVzdJdFJnbVFYeHdvZEg1eXNvYjV3WUk3RzNiZno3OEFQbi9QOUtSUVhybkR1YXRxRzByViBpU3JGbjBwUDFVTHdGaklMMzRiU0dpeDRiQUhtb2NPdDdJK0ZCeEh2alVZR1BPNmY3Si9yNC81Lzc5MHR4RWdQR3RjUmFGNTFYS1RxIGdaRGVNaXd0TlFaM2ZFUlh0Y0RGY09lYnlIaGlHOWxnSG9GbDJNSHMxWmFPRHJCM0EybGIvaUI5L1BuK3Eya1pnQXM1ZEVqZFgvbDIgWjJORVVjYk1WZmtCN0hDNDgyalRHUVJnUmhKWGVTeW15a3FOaGcwYjIrNVZObHdvUWtjbktoY2R4WkZlN21TenJWc1lsYlZ6VmZjeiBzdlY4aHVHbWVXeWJwWVZ5VmZ0OHdPSG1yY053bXZHSkFEVlljbXpLNVFZei93QmJBLzMvQU56NERxdXpSZUdxVEptSks0bTJjRWFxICttYW11K0RUczRsUEZ2bE9YSWhtRjhQOFA4a01DZnYxd1FEazBZOGk4Qmd3NXNoczUraC8rd2RNRmJYcXYzREpzWXludXo0dUI3K2wgL3dDRERWMkdaWE5PQ2ROQjZiM1VXdzlidUFmZU9XamtOVmgxbjJ2K3piMkU5KzBYK1ovcmpFU1FhUmZEVmF1a0hVaGhreitXM0l2aCB6MWZxYWVDc2FKWEthSFg1aTNNdUFRSFQxbzRwTDU2dVhBbU1GMmhpaTdJN2NIK3dBTi9BYys2U0k1b3MvVCtvMkJITnBvWm14MDhPIHhGSEdpcTFOcytDekhGODdBcGNMWTNmK0p4TVl0eUZvOVJQSEp1eVNTZG5xeW5GTHNrbFUrM3U3amZXQTFkZkZuR3JVRmZCaXBiYTcgWW03Q0gyUFJ1b0M3bkJEN3NKcjVaQTU4TWZNbU1wQjdnejJBRFkxd016eVVLbzNCL3dBWEk1OEFmUVdBL3dDZlFZR3dFUExTTlBkUCB3SmRrRWc0RmtKV0UwSkxJSFgxcTVQdml1NEVQd21ZWkREQVl0VHM5V2s2WThvMW9XZ1Q5Z21LU2RRZnZ4OEIwZVVYVjk2TWEzRFNhIDBvRi9aR05KTjA3SHJIT2tXRk1WenludjB4eFQ1Z2VHWVk3UkRnOXVBejNBWXpVMjBjbUI3MjdIT0E3K0FQbitRUHlmcXRES1ZWSDEgT0pyZGsyMVdDUXF2OHRYMUlKOGQzaDhOTFcwcjJRd0xZZHdlNGN4eFpMR0ExL3NaaG5aU2d0YUtISFlKemgvZnZQN0FBUDhBUkdGMyBFckk5WXpUV0s4N2tMUmpuSWNqY0pIQnVxNHV4UW1qVlJHeWxra2hXS09aaEZHZzJwWVpXWnpGRXVONEtvQno4a2hoaVZMKzc4SWJ2IFlGa2FwVTNUSFYxa0pFMFpkeEJWVnBGM1RGZFhoNEhuQmd0U3Q0YTJ5Y2Z3NGszN0doa3lhR2hzeFA4QVpEajgvQUFIQVY4QWdnQlcgbjdRdVMxY3hWemJWczV0Y0FOYmpYZFBxdGtZRzFiaWdkaGlyYSs0VlhNVDdVWkxCZk9lZHBUbTJQTFFoakZrNDZwS1NjQUgvQUdBYiBBZng2M01nOVBxQ2w3T011OWhTYWY1VXBRNjNyRTlJWGxzV21sdmloNmZtQjRZZWFuL0RnMHM0QVFkOERXYitLQm1XWGtKZGlTOGIrIHZ2My9BRTYyeG15U0xyOE9yM1NuM0hXN1FBdVNzZ3dHL2lDOXNLR2tjeXF0Z21RM0N5QStJOWJlUDJNUHprWGFIMGMyN1ZjY1Bud0EgRGZ6L0FKKzJlTEZtVUpMZzVRaGxIRkZPUWJOWldiRmZBNXZ3TVpsVlhpQ3c2WWpHNUdOU1RBa2RwYWh1U0EzdHB4ZVRpeDFKVkFLaiA2bHFRUEpFVzV0Smg2QkRmNmRwQ0hXTGdrcmNyVSs3SWx5WEFQdUJrTDF4VDVpQWhLb0s4UVR4aXo0b1ZvRThBbnBkcVRBKzdBQVFNIFYvQS9pc3N3UFFkeTBua3dFaXZiSUcwL0MxYUpEeG5EUjhzT2h5bXg4UTAvaDh5RzRNbkhqSndDd1h4WEpqZ3FIcHlXZFF1eUJIYXEgMzQvdjRCQVBvT3dNMlRtSytMQUgrZWg2ZUxhUTBNNWJBK3Q1bGJ5cnNUYlFzMDlLRDJBWXArMUZ1R0gvQUo1dCtlQ2NCaU5WOU5yTCBOOTI0T0FQNytnL2Z3SFgweFY5YnJGNEFZcVJrcVVQTkpEVWl3Q1VOcGxtSlFGaGxDN3M1Z3Q4a2lkbjNDbllGd1QvbUV4aFJYOEdiIDhIOUJQbnovQUxvT09SZzhjcFpETkRqTUpveW94ajVySlVmK3I0QVk0cUVzY0hMalNKS0FPV09VTzE3SWg0eDdyaWlpdXI4Tmw0c0UgYzJqYmNoV3pQWjdtQTFVbm9ESnB1ZkxhVStCMUxhTlpNaUVUTEM5UHRxZkQzZ3dHRGZNT0laRGZVOG1zM0lMR0l5T0VDZHE5Z2ZzTyBmQUVIcXkwZStmbFhCWVVxd0t4R29kWDJReVMzREowOW85c0dLNUYxa2h5MXRnRG1LclczeUhWNjJjZkt2UFdOVzZNOCt5d2lvNXZtIDNQdGdBUDUvMzZaRFpYK1pZeTNmR3V2S3oyUmNYQTdJcDEvYzEvY2VtUmJHckt4bWd4eVJrdUN0NjNRMkJ3T1QxL0JIdUNvQm5GM3AgWk9HL0I0UCtIUGorL2dBQ2xDTWlHMFdKTWdGR3AvdkpTckYvZHlIQXpBbERsZDdxYkFvZThZR0ljd09QTVRvQysrSEdRWjdvZTJmMSBzRTRDZmZzUUQ5di9BRmRCaktzTGJUdW1BU01iVG0vbVZMYXFydDVOMjNJQTZHUGRqK256WGNTR2FNdE5LZHlCY3Y4QURNdzNEZUp5IHphUTJCamp6ZTVmNUprWkJLRk9oaFNCT09jTVRpMkZaVVJaZGpWK1BLTlUzTWQ1b3hTTUl4bE95SVFpSm5NL3F3OUExa0JEV3ZPa2UgdVFkS0JWS09iZ0pLem5RSVF0R3NxN2FIdFhYckd2V2xFckY1WldwRHJrRnB0Sk40TUNxMkxPeHNhUGtBVFhwdnNUSXpGejBrMndwbCBLK1JOOUV2UHlGbkpFWVpXZkdnK3FHSkc1MDJsUGtXZms4Y244K09rN2pEZ2NBY0FXVFEvMXNmK09xMEhIeVpmRDZrdTZHdHhhVFErIDZJbGZKWGx5RndwR3BkMGlUQ0FlcTYzaGgxdXdPNHdGZnBacWNGa1lydEF5ekRpVHpZR2cvd0JBb093ZFcwOWZkUlhNUTJpS1kwdVAgbHRhWTQxWlYrTnRxdjJHR21sR0Z5aXJhK3lJYTJHRHA5Z1RBZm5zSzNabGxwZktnL3ZnSStCZnZQZ0Q1L29QaDVqaGFDR1NETnVUVSB0ZW9ZMWJFMXVoekYrc25CeXE4VEVGNGtGckF4REQyUnZDcWVIZVlXQ2F1MEl5TURDSlBPUFA3QUFBZGNaaE9lQmJRbjVya3ExdmFpIDROVWw2bisxYWZFY0VPSzdzNzR0OWszQU9IWk9QaHprOGcrVGVNOStGY1pzZFhPcnR2OEF3SHdIVEp5c200WkFrdm95N2tCM2R4NEogTU1kdmFtaXN5bERua0RoZ3RYa2FLS1F3WHc2NmhKcEpCSWcwelFMSUJxZE5JRHBkVHBOVC9lRjdKQnFVbWp1eXJSR2xaVnZIajVWZyA1aTNwcGxWNC9oNTl6TGRzWFJXN3M3MkVuMDJVWWJ1bFRCOWI2a05QWWNPR3EvMlVyQWJkbnJNWVVGc3hQd2xvbysvL0FPVDhmNlBKIDlxTCtUSW1ORnREYlJaTGZ5WlB5T1lQQmFZS1RVaDhBekhCRFE2M3ZnUE14RHdWSmdnSThQeW0yTXh3M2liUjBIc0dBUVVFQWVQbjMgeFlHWlM5M1hvNjBobXVOUzF1N3pOVE5tbzllMXZYNjZIZkxhMDlucTVtSi9KQS93NFpDWjM0Y0xhK1l6VWFybEJoTkgrNzhCUGdENSA4K0FRUUFEamtXUTZRS3p1QWUrVmphTmhTaVNUWVJpWlc0L2daUVdXZkZmaDZHeUlUaGpaQkF3MVZMalduRzlyN05ySk40TjFjYkNXIDZBdzJCK1BuMzdwWUN0R29DUHZacWxzdUcxblFxcmJkUjhlOVBUc3F2ZDBUbzJSTE9pSXlNN1JSdk5MSDJZVVkxbGxiWWtHZmE2NWUgZVZQRkc2UFdlb0MxWGhKVWhhckdXKzNvTjRxK3ZYeG9zMkdydmtzOUtxdjVqZ3lJYjVXN0I3Z2JRUkVlbjNtekticTk1R1ZXN0JBbSAvb0w5di9zZmZ1cXJVV255RWdnR1hMYVcrNmxhR0pMWnR3Y2ZMY0NsM0NVMThoMWVITUxmdERIcDg3a0NIYW5Ca1lXVUp2UENUYnY5IEJmZ0I4LzhBcml5Rk9oNjdQajIrSzBIcWNob2I0dGxtRFRxMUVLY01IZ0lseUFoeDVpWlQ4TVBNVDF1eGxLcm0ycTRaUHVnMFBQT0UgbXJzQVlCK1Bud0dDRHNIVU9MWkx3UTJUT242YVE1TEpZNnJmOTRoMjBydThLeGsxVGlsSmkvTVc0ZUFkYnRCYkI0cjg4NU1vMFcwViBmWm0rQkFleDgvQUFIN1lUNERxMFhQY0VPeSs0VTIyaGFVT2NidW5rbG53Rk12Z2M4NWVCVlBhdEcyTWl3eDVLeXlORkpFam5ETldXIEtDRFBHaFJZaTc3UUNUWXJJYUFlVTBaTXF5dzl0V2RiK1NOMjhsdkR1NHlvc3VMS3A4aGFpMnlNakp3K1pCKytLcTNjQ04yYlppWU4gM05wSnpIZ0Ivd0RFZm56WmJINWRmQjA5a2xWakdBaHNrYVhER0xDWUJMSWVRNnlQUlErOGN3aHpNR0J3Z3owL0JWbWpiTXhmQmpONSB0SkIvMTkvdDgrSDZuMTlmdWtPN083R3F5YTlQRXRwY0VPNXBDT1lQVzB2T1RSRFllU0o4eGtReDh3SDl0YW1RbXpGRU5sck1Ha3UxIFhjQlBnTmdQbjJEWURWR2hXZktjS2xQQVh4MkwyRGxHMVFBSHlaL0FpY3BoamFYMDl3eHJpckZ1MUdSZ01mQVlJT0ljb1VyQlh0OG0gRE51Mk9MQlVXL3NBQmdBYkFhdXJReGlDTjQ4c3NCS01IaHJDODA1dk83SGNLeHZtK0FLNHlNN25jd3hyR0RkUTVWZUQ3aStQbnQvSCBYSmFEUVVGdWpoUmtxcTJTMUUydlVDbkxZVDJxTUpXM0xVWWticHVENTh3d3lRMTh3am50TjU2RGp0aXVoNGt6bjBuQUJpL0FPZmVBIFF0TmQ0TDZreVZpNVcwa3lTVVV4SmlWZTdFZzloUTBJOXdPTE12RDZleU9BZXYyU2NCSVlBMXNadW1GbURBbitsWi9nUDcvaWVBRlQgV3Z0R2JEUFZVa09ydm5EeVJKMy9BTWFHNFdGTWZGZEljdmhqNWlFSFQ2ck1EM0FIQTRrcTJUWm5zcitjM3Vrem13ZnYrd1l2eXJyZSAxSHdBRHlRd3NhRXM1SW1MY3ZlTFVSM2RrY29yWStORU1mRE0zQWg0TGJnSE9UeUFKVk1jRzR1VEpmU2ZQb09JRSsvYitmNmtaS2hVIEJ4ZEVUZFh6NEphZWYvNzVHWnlsY1o0NUgzRVdWY2l3VjlsdjRnNjRWVlovTFdmYUQ0b1VPYjRPeDlicTlxMVBWZW5PNmNsQUdpazkgdFhtQWxiYXV2YjgwTUthK1E5NHJkODVnSFRwazVUUUswQmNaWnRyR0xJTUphTHR2K3dId1B1d0lLQ0xUR1JQbnE1NkFaSkRIYktKSyBUQ3IweTFJOTNHSlFBU0xGMm80R082bEpoK1FCd2RMT0Q0RDR5VEZxMjU0L2RnZS8vd0JRSHo0RUJ4MmcyZGd1U1hUUm1ycEp5YTBWIFFsZXE4T3poNlJNR1NoSUZvbUw1aHdaYWZRNWcvd0E4d0lUdnVlNkMvWTU0UUh2NEFCdjRBLzA3TE1oMFBYdy80RFJxbzA4VExhZlUgQ0phTElCeUpZZE5zWlRGMmhnUW1CdzlrYnhhRU5IYldCU2dwNnd6Ym9zb3FPN0JjTi83dWdPUHZ3SHBLNm1OR2hSNVV6MXI2aVhUcSA4V1JsazNSTFBncGRKSVkwM29naVNSOGNrTXdMQlhmVEE3c3JCMFRUSkRIS1VhdHFNWmJLbmc1Y0NRZzl2ajk5RDd3czFjVjBlMW5mIDZsa1pENXFOWDd6a1pMalhCbDBqSzFpUk1Lb3hKdCtFSk5ycUd1aHh4SDFIdGpHclEwajZSMlBxczQwZDlHSU05Nk1NMDJ3ZW9YY0IgZ09rWWRNMldaY0ZFOEx1eGJyMVhwbXZhZjFDR2F2aWxxNTFCVENES2h6THNzZ1BSNWpsdHdWSzFCOEVZb3IvbzdoTmlBUHdBL3dEWCB6K3dLZlVvd25iQnQ0RnJmTzZoQmt3OW5qb2ZxRVk4Y2xBUzI2Mkt4Z1VJTXlRb2lHT3RTRzlyd0wvbVIvd0RtWmlTMWg2ZlVGTnIyIEtIZ3dZcngwL2hiMXcwMzFJdVNFbE5ycHFmNnJmSVkyWmRGL1pPc2l2WVlHcFlsbnRBZGZtWHU0cDdJdGpvU3JXZG9LYnV0ckF6RjggR2M1Q0d1Y2dBQi9FK0FRZmNBeUJaSTI5U2VhWkpacDVBREh1U0JKSmQxSW5relhMYk1oVU5pTXJKeFhwYnRITkpOS1VoaVdMYWlrQyBraDVIampqaWFWRXJ2ekVZTExrTnU2eWZLd2VxL0Q3TFV5V3cyY3lOVEdxMWN2VnY4eHdyMWJhSXJEWS9KUG1MZThka3g5cVFmNHNQIDRqSHpCWkZ0RHc4bk9iT3p5ZzhmOTM3MjJDc1pTcTc0Unc2R2sxelZhMmViYzZOTC93QUZrUjBoRCtWRXNhdVE0OVBXekRJWURqNnIgZzhnQXRUSVRHTkgxbEg1c2I1OEFRUUQ5YnZuOFkyOEVjZGNsZDE3YUdhQk4xaVRXN0FzMnB5U2ZVNjhJQXlxOUtGSEJmdmhQVDNCYiBtRDYzQlR5QjZjeWJtcnRDejV1cmdtd1AySGdINEFBQVdLU3grb1M4eW1kWE9ibmI5RnNoYkxEenlUZkNuWkVxbTE0Q3J1RGhmRGgzIDRNT0JEbFNHUUEycERadkY4bVIzWjNTZnYyUDdBZjZHTEVJcUs2ZXBrcmlSdHVTS1NHVjQzUm82YS9hQ0RrUGNSWGJaa3VXOXVQRk0gcnlKSEp4SFViUnVleGtqeXFPNmF4YlhTL2psVmg1QXQzT0pObHFTM3hzenhKM0lPeVR5RXhLdHVYWXhUOEoxdStJZDhUTUZ1ZWhwNiBIZUMyc3MxWDAzdWYzYnovQVAxZnZjQUJyZEYyUmNFZytMeXM0MkJ6Ykl1T3ZRNkhjd2VYRHFXdVdFOGVUMkJQTVZYWkRJWUljVjdnIGNxVHlhejJ2K2oyaWIrZ3YzNytBNEQwMU16VG5EWEtiWTVWMG51SzIxWVJ0aHErMnFOcmVMTUZ4U3o0cncyQ1pXOWtPRXlIWUVOSFAgZkFoTGF6alYrMkxMd0VDSkx4di9BTitQb093ZEo5dGFOVURHOFdwbFJjNnJTUUcxQmxPWitUVEtPMll1U2JxYUY2akZzZnB2VDJSUCBEM3dQTUE2MHVGOFZVL2JMa2ZXWlpCM1lraERtd0FENkN3SHdBQStjU29qR1BjaGxtR21aSklTWXBFVFpDN3JPWGxqaWx3RG9SdFNQIDdqbGhhNWdyWk5EdXBLcUk0akIwN2RrY2JZN2FpUEhqSEZySmJ2dnd0Y3lRcXJOUUZkSTRlZUZ6aUlkSXMwTFpzZGN2TFBpQjRxdlogaC9GT2YxeDhEVFVPeUdGd09mbHRweEpMVDRyZWM5N3JxeEFZQUZ1Z0FEOXNHTWxsZzErVVVvY003MkZSVmVsTEl0cDNyWXhiVkx1OSBieWp5bmJWWDhnWThHUmtUMXZHYWNuMS95cHdKc3l4M2ZSbmZENk9nN0FmOCtnZFBmVStPOUN0YlpjVkJySjNwV05UREdwY3IwK0xEIHVHdmhFMCtBVUlPT3RRUGlpR0c4L0xWSitMQll6NHo0cTlYckN4aGhnN3BIQU1NRHkrZjQrQVRVaFRXM0cyQVB0a25FbWdyQ1FIZG8gWkxPWUY0T1VpeEhMamZ6RnN1eUdHUmZtSEZMaWJWeG5kQmxtRTNqL0FGVUFJUDhBUVAyQmd1TnAzamNOSDlPOHFTSkhKbHU0NXh2RSB4MjJWWTNyY0RWSWplS0dOazlOazJBNmlKOTFCanVLVnh2R1dHVmVjbXIrSmg0UHVKK0tJb2h3N0ZxVjRhb0RtZUpYTnBMaDIwN21LIHJxdTJDM0E2NHRnOEJodURKTVQzeUd5ZHlJRmFFSHc0aExMMVY2R3piRnZlOWdBQURZT2ZkYjdJbUhhNXpNN050RE8rWkFtY1R2Z2wgWjFidGtPTHREUjh3ZkQ0ZVk1aHhzSEI0SE9mQ2J5THRBWjdiMmJPbjBFLzUvSEUvMHdvN0k2WndzOVh4bTRIL0FPZWsya3UyQStEciBKaUxiNG1yelJLVHlJZGtjSWNPWW51RTVTdUFET2g4WkY0bzIrY0txNzlnMy93QS8wcFpHT1VHdHlHK01jeU51aTJiVTJCYnppQ1IzIEdUZTQyOEVXUkRRN0lEUXgvbnFQSVFlYy9hRm5FNEVTTFJSNmlmZ0cvd0Rud0hRa3FKWnBNYWNReDU0dkx0dHRBMWhDOGp4UTN1RzkgcFZ5b1o1WXJpVUhxR09JZHFQTWNSN3NOM0FIOFpWaVB4WnZ4MDJvY3g1RnJkMkliYlhvUWxYeVRhS1E4T3llUGgzQnhlSnoxRFQrQiBzbnpKWTh3cXdHRTlCTUUwYWg3ay9yYnVsaHNCOEFmOXVQOEFTOTVCQ2NqaklwVWlCazVPVWt1eTlWNTdKcUJoTGkyaElUWXZNRTh3IFloT0NKdzhHMmozeWRNL2EyWm0rN2JKc0dLQ2ZQdjNnSkpIT2FqRzIzTEpkek5uU1prWFYwUzNCd0QxdmR5Zll3dHN4YUxzMmRQcmQgOGhwNmZOZUtXWUVOcWNOenE5WGVkajdwQkVjK2c3K0E0RHdMclRNZEpyYXQ5cW90UE51RjNFdFNERFgrY1NYN1l0Vk51NnNrUG5sZiA0aDlNYkpTWm40ZS9ZTnRxR0xNZWF2Zk81andiN3BJNS9vVWZLSjl4dDJZNG1NUVRWbzVvN3h6RWVCQnFSWlk2TEVkbDMzVXNaYW5qIGJKNE1yOWN4MUpEUWo3bE9mRVp1cFgrM3M3V3ZpSGFGKzJLSDFBVjZ4bVJ1SjVwRGpWUGNuYU9KZkUwQkx1NU5aRjk4N3FXcFc5MTggYnNidkJQVlE2TVRhRmNZTEI4SmR1Zlc3OSsyQUJqMG40WnkzQ2pKbkdhcU1WdVlQVEpNc1BaQUZINGVVdHBoaS9ENDI0VEhDWUhIeiBKMWxyNmkxQitjOTBPRFBCdmhKdysvYi9BRkZ2L0lBRjZwQWV6Tk9kc0RMdWJaaTNwN3E5OGt0cU83WndlSXR0RFF2U2xlcTJCdzdWIHpLck1EL2d6OVNHQU5RV1Vab2FCbis5amlDQWZqNTkrZnRnNlNiSm1VV3BMOVZvY1ZWalcxcWdtWEdKc2kyczZSY1llcGE1MUNhWDMgd1BhRXhQaG9aZDhZQTd4M1FQWUxheU1WOXpHSE5qZGtkK0Fmb0FmdGd0ME5KSkJNamFqVFN6VFF2Z29lR1RQMUl6ak1qREVWdHlCbyB3d0p6eExVdFk5VFVyUEcwTU1zQ1pydWhnMFByc1hsMzFZOS9ydTBjcU5JOXgxa3ZhYjZGYkVGMG0yMnBUNmxROWVraHRsbmtDc3BBIDJ2VStWZ1VhQkpRcFZhZStzamhTYUhENTU4QkFiWjFrRXhpdHVheWM3bzFkZ2Y0Q3ZuL1kvdjZya1pjTkRReHVVMFRIL0hLeVVCZXEgY2ExRUhjTzBPU25VdkpFOXhpVW1ZbU1wQ1lxZ2EvUlBKazZ2NE1qQTdSU1RieC9YNER6OVJBSFlVMk9xdXpOWnBydHZ6dUhkcW5zRCBXQXRtRWd4WE5vVWcwSHFySGg3SXA0eGNISUlkamNlQXpud21NRjFlc2pEanR6WUhpL2VBcU1Cc0hVYkkrUGJTK0JwS0JNQ1hBdU5TIGxNdEFiRHI5SG1hZlpSWVhWNmU0TGJJR21za0lneUhBTmdOb01QV2JQY2xYOG1CcE5YQlB2d0FBZjU4ZjYxYm5wd1J1Mjg4V2VFekMgcEJudDVaOG5QMnJqN2NhUG0rRXFPZFRod0hkRk1YL00yN281Mk1helBHSjgrYjU2bmhkcVBqSFVkZTFLblZYcEwwNjZvQTV1K2JZUCBYd3IzR25uckdtYVFGZGtjRERoVzdKTWhrSWVMYnFBck9kOTUzUVl6YzJDSk5WNG4wRUJzQjgvN0tXMExZc1MrWEFPVXpWc2JaMmJEIFc0aXVTczdUdlU4eUxLWGtJWC9KekdRd245cjZlYWtNaEFPWXJOdnREU3pJMVZwUGE0NEFBSDM3L3dBK2NFZXU1RkxXeFowV1VlSmMganlKTmUyRGVWUHRBbGt1NktwbEtIdFFleWRoMlFOOEF4QjIrQkI0TitaT1RmZHFUT2Z2L0FHaUFQK0hSSFQ5MFUvM3MxUXdGY2EvcSB1cHNrdDFsVDRmdC9ZVEpLVjJ6U3EwR1IwTzB3NGVHNEo2M09iVjk4ZURIaXlqTWlwQnVrd2ZuMzYzZC9BZmZrU1lhWVRTTnZPZ2VGIEkxai9BSkZ6eUxCcGVialdoc3g0RGJKZnViTGc0eStwSWppaVVPRWxsbWNqTkJIRkdaQzBjWGJ0MWdRd3pZTUdVMk1LZUMxQVZIZWogUnA3QVV2YjhNazRiTU5FV0JEZDZ2RTQvRllVT3J6RGlZbVVPWURoN0FaSzVyU3dJQ3JhaXp4ZTBGb1k4ZDdlRG9QUHJkOEFmMzkxdyBHM1UzZ2R2aW9IM1BXclRLYUl3dW5BdmFkMldEWHkxcDhQSkt4YlMwbnN3ZVdYcCthb04vYlVodDcyOVZvK1BtSGRRM2FLUWJ0N0hnIE9PL2VmcFJWOUQxUFkwTmtybUtoNmtLcnE4OFNTSy8zSWZZVmNSUU5tN0N0cHhpRjRkUHI5YkJjd1AyTk0vRjVYYTNnMy9RUG44RDUgOEEvZ0xPQjZqdU9CUmRjYWtRdWNTWmZtS2RoQmh4N3VhWXBIVVpjVk5nWEJlcXlaTU1Na3h3dFJIdWhnbnRKa1lNd0YyWXpBallXNyBNVjkvQUFOZ1FmZnBiUktaUXBlRkpvdFZKS2pTTHFwWXhIcnNGR0VrN0NKcEJGREtrc2NEdnQ3aU5Jd0dDdG8zbmtqTFI3eFNhSFRhIGVaSXZwVkFmUnhMR0hQMG1NWWdTUXBxRE50UjRReHpOZytCNnA4WmFBK29ZcVJmVlgvaC9OMThCY2lkTlhZYmpYeFhPcVJMRFJ4a3YgT2tRcTdXMUEycDNRUXl4RmNEWjhKT2drZlErVFEwMk1KeXVMRGc2bmxBeDJSblRjeUNlcXQzRmc4eXVLeXFuTlRsVVBFUndjWk1WZCBVM0U0TUJaeHpZa0wwcms5WmJRSzZXREZJWHJqTVE2V0VCQlJrT0theXdjUVhDeXhHR1Q2YzY2QmZWTWJXTEpTYlU1QVdEalJyRTFmIEhIN1A1SFhFbFlMTElzZzBtNHNqcStXa0RObXJZdGJiNHMzZG1oZmNhSEZiYllaQWJrTE1XTlBRNmxjTEd6cUJxZStLVEFvN3U0SzggVnNaNHI0NFduWkJobGNJYmhNYXU2RmwxWDlad2ZDYk1EU2RVVHRWZUNDZUFIN2R4UWV0eENuMTQ4SG1BUmRwa3FaMUJRMXV3c0VtcyBESHZxTVBNTXBuV3g1Z3d4dzNEbUdBUTg0SWh0d1dWbFd0REFtOEJMUi83QWZZS2lBUDNWbkZac2tTcW5NWlZmREt1dUR1ZHB2ZUNIICtDWUxPRmN1VEJTTmMzWW53dy9KTm5xOFBCQUVMYWFyVVdYa29VdklaZ2IyVDc4ZmZnQjgvd0Fnd1ErTXlxenpJQlYxZERqWkxjN1AgK0k5UDRPV0RsSHkyTjA0Zk1XdzYydDdnSCtCcHZ2akV6dGpRVVJ1Y2MyL1FCejcvQUhCMWgwazI3R2pwMjdYb2tGb255d0FJYTRwWCB4dS9COGZCYm5Ic2FyVDdUTUZWekRJN1BFVk1zUUY0WkQxWVZ6cTE1SGpteHlPcTkyQXZ1aWtMMHh0b1lhRXlia3FXTmZLL2F0d1Z1IEpmRU5vZDdHVG9mZXpGODdxUXg1Z0gzQVEyb1B5WW9MR0UrYmY1L1h3QUErQVBueVMzTElaSlJBT0xmTlBadlQyK1h4eDYwSmxrV0IgTFpKU3VXcHR5V3lIQTd0aGgwOXhjTzlLL0FuV1FzTXVvenVaWnRxWFovWHg4K2Y4QWY2eGtNVEtxT05WYWdTYkl0N0NTK09ZbUo5aCBNaFI4RU9WYzRzRmJyYUdZbU1qQUgrQVFnUWNPMlpUZENSdzN2WU0vejQrZkFiQnNGcUYvTHFTZkQyR1ZxY0pXZEZKU1dHK0NRRzhFIGpBRFl5ODVTZy9HekNmTU1NaENaK0w4SGhrOG9VNU1jcTQyN1lnTmczOC83YkJyWXl4NnFBOXdTT0dTQXMrN0xoSDZlMkFpUXlSa3IgMzJKVU4yTU1lNjh5bU5JWkhqamg3MzNIdUxGQkk5Wk03NUhIS2hpTVQ0UFNaUW5tTzBRNjlYQmRNMUtucG9FSUpSN0l5cll2bm1TSCBMbEFaZytHbjJRaHZsa01DR2NVaDZrcTNZemRyN2tabG80RTg0Z29KOSt0M1lBR3dHcFF4bHU5dVBpNVBHa2srVk1XMnd3cXV4aElmIENsU3NJczh5TUJoRHJlazJTbng0ZWFoOFNSNFpQZ2I1eGs1NFRmd0d3YkI1L3FUNHV0SGsvSmJXTXdnV0U3bjQxZTErNFdGMjkydmsgSUZOVzJDR1kwOXVIMThQQlBNRThIaHA2WnVCclA3M2k4NysvZmY4QXBTcmN4Q1hFTXd1VDl5QVNvYVFKVDJROEhYbHc4aDkwRHo0diB6T1J6SWZINGJWQXNBOEQyeFovR1pPcS8vSVB2M0gvUDR5eVJ5TUloZ25hQkhCRUZqUWc4MUdzZ2pTN0hzUk12dXVnVjFySTlCWkJrIDdJNkdWamNqNUdNMjdzREkrTmNDU1JxSk9PTnRrZUllWllESFc1NGcrcmVEVlY4eGtVNmZKWEF2eTRkSWdhY1BBWmlmRFpMZ2gxdW4gcjRkSHgwM29jNHdzc3pSYUN6NXNKN1liQjRCKzZrbXlzbmc4OEUvK0hoUTl3VTVaelFIYlJJZEpodE1Rd1VvZXdoWURUZllGd1RMSSBNTWt0Z2hvOEJmMDA3UHdab1YvN0phUDVkUVVIZjhlQWdBbU8wRUhKd2RueDhmSGRWdEFreVdFSFNYenRsejJwVk5YaWh3QzN2QWRrIEQvTXJrQ3dOdGNyUXhaNEdUck1IVjNDYXJBSU9QSHo0QUJzQUdIcnUyRmV2N2FwWkRkbjlWU0xPcVdJbjBQTTFFRmx0eU9yMFVXWUggMXVIc2lrMlFQYUFmZ1pDZk9EOWpXaTBOc0JoTU1jTmdQZ0FDL3Y4QWgxcW5pMkk0WEVhWjFHMGVtZGM5dVNTZ3BNdGoxSU1TODBlQSB4aUR5WkhieGJORTZzN0JqZVVJbEUzSk1uK1hENHh2M1pOZVZVS3JxMFFpT1luMlFlWE5oZGpENXBkdEd2VTQ4TmoyRW4yMWR6eGZFIHBQSWJPWlpMVWh1RXljZVR6MXFKNnlUYUt2cURmRFlSS09BRDUvOEFvRS9qMG1WZHNUNHpKWVJSY3lXVEN0RHdTdlhCcWh5SmNLVUwgaVNtZ09vVExJRHA1aVl2clVINkc4Ym1NS05GWms5OE4xZDkrUDcrQTU4ZkFHREJWWVBUU2wxVXVYeE1Obm1SSmY0bFhrcitxK3drSSBDckx6UlY2M2FIZUFQVzZlK09DY2NBMmg4NWJaaWZGM25ZK2JYWno3WVBkQzRDZjZrY3V5TzB0dVpJdGNVSGI1V2NOYkk0Y09yc05QIHVVb3NtaTdnWHpCaHdXMlZESHpGWGNIdzRuMGI0dW9HWjU4MkR4L29IKy9xamhZNTl6eUttRkxwMnVxdllMbXVObjFNZURubWZianogUmJjcEhWSHk3VUxya2R3MWlpOGl0eWpaNXJIZ0U5UVdhNkE0dFo1MUlwQzJwR0xCejR6dUhBcEZnRm9iNG11NTVYdFJ3dFN0MlNrMyB3eFgvQUlCZ24xemd6TEtIcU1XUmh6emFPZ2dOL0FiL0FMLzBFcGJSU2RjMEdZc0VvK1VTNFpwaGJsa05PcVRhQ1JaRy9DSEpEY0hHIEhEK0hmQWVyK0syV3dVdDh3bmVaUkQ4SHZadnRIc0Z1K0FQNysxRERBTHB2TXBtTHp5MnJPc2FtYmE3UG9kVjhoVDhhNUsxemFIY0QgdXBEWlB4K0hzYkZPZ2NiM01XTEo3SHNod0h5QUIvWDNnRkxIdDJ2MGpUK1NxVjNEcmN0OFZZekRJczQ4OE1JY29CWVNqNDRXQTRJZiA0clpQaHZGYVdBcFZXaDFtc2kzemJOa2RzTVQ2RHY1L253RHJSR3oyZHd1aURVeHVYUjhhRGhxQlhIdVBieHlPaWZuRURsOW5ZaVg4IHhxVnhHWCtUbjQ1TEU5b0hRSE1qNmtLcXF2NVdiRFFNOHl5YWgwanZNUzhNQnFYK0hTVW5wOVByZmRRTzRMN0lqb1ovdW95RTNubmggTm1lWGJaSGpuNEJCNERoMWFLWTZNaTVOWkQzSkZKa1kzQWJZU1BxRU1ORmVzZ0JOK1hZd2NpeUlkcVZXaDdnSG5BU0VDRFc2TTgxZiBjbkdRYnNiMzMzMzlCQWU1L3Bldmkyd0xyaE1ETWQ1cVZuQzZmcmNzcjV6N0hkeTlvQ21FREYyOHd0b2JJbnpSNGZubGY4Vm1FOEVNIFhabnRhUENmb08vN0FoWW4rcldraEZFS0pOTzAxVDdxMDRvcmFZcDExZjhBSnpYNnB5MXlQcFZuZlJJNE5qcFpaZTF2cTlMeHgxZWcgVFZxenFkZkdaYTMxSkIrbGd3T29ERjZnQjcwNDU1R2lsYU1PeVFKS2dkaHBYcHlUVkx1VjJZMlNEaTEyZUJYTElZbkhmQ3ZySSsyWiBiNWQxaTA2UnFFK053UnVmY2NmSGQ1Njg4cEZidkZneUJzVThOTmw3QkRrcFpCa3M1WHhEbENqREZGelBocDh4OFE1ZzljdFJTWUo0IE9FemZmZjN2MzhCK2dEWU5nZkMralF6MWI1eklyNVBHMWQyQ0taQThlWDdZWkx1cEdYOFd5TzJ5ZTRXUVlNRDVrQlNjWUFQNnlVR0UgeWZOZ2lUNTg5NERmei9TbEh2a2UxUWVVVXJtWlpCaElXMXRJYUNSamozM0tobnlWTXNDSGFkVm1HVGgvd1h4Zi9uRmhHVjBOWko5ciBzWGM1di80ajJEWUVGOFYydnpMSFM3Z2JYS1pHWkExZXR0ZXlOWFR2UzVZT0F0QlVpMjBZWHpGRHZpZWhwNC81ejRRZk9Cc3l5MFUzICs5NzI4UHo4L0FIN3dIVFpGeHMzN3lQU25ndDVzY1dXNWQwZnhTYmIrdzNWZHQyTThNekRFcU10enp0VDFqaVFlNDdadTc0OFZSOC8gQTQ0TDQ4Tk1BbEdpd3BESWhwRHMySzd0bkwveks1UEZnTmM4dkR6TVppM0RYN2dCMUtPZkRuQjFsRGZLektjSlNRaHhCMkEvOStmdSBveGdyZXdWTE1KMWVtcll3eGszTU5TSkZ0QVZkSW1pME80ME9MdUhBM3hrY0xVWCtWY2VmT1lETE00R01XYXJTUWdTcXdEQUFRZm9JIERweTZwWkF0anF1dHdOY3pCeDdCYnB3U1BtWjNiMXdqSFd4RHNadytZeUdIdTFJYStZZUFCQ2ZCWk9jMWVMWmhoeEpxN1l3R3dmOEEgV29qNm0wLzVaaWVVdHExQ2xWeVZWdDA2cUltUUJKR0d3TWhub2d1MEE3Z0hvWnczaXR5RXhxUFdoZE03azE1SysySXh4Sk51d00rQSBBQUVGQWZ2ZnJQTk96UUs0UjVzc2tRSVpWd3JIWmhPM0xIZVZ2M3RmdE5KOEYwS3B1TW1TUisxV0x0eThiVm1nRmZOQWsyYUl1amRkIERaeXMwTk56TTVjQW9jYk5uZ2ZNVzA0T0RDWXU0cE11UkRaQ0c4UG4xdkV3MUFWOEQ4emMrVUV2Ti9lUFBmNVAzSURBNGNENE5oS0sgWm1LTDR1RFJyQ3JqVU95Q3hnV3NNS0hLRHA2SERaS1RNUXNBNE95L2dLdkJoZ3NvVDJQZTZ1Qm53Qi8rbjM3cGhSNDlxdHREMENHcSBCa29xSFphM0diTlA0R2pZNGxQYUxhc0lEWXdkd21XcHlRUHlEWTdMWC9kUDVOVjc0ekRFZlpOOCtnNy9BT2Z3UHFRZm1weWtoeTdvIFdMZ0hBTXFta2lrclp6cHBoMlVLbHUxZGUzS0duWVZ4TXFDSis5dGtDQkJxd25XWXNtTmV0bDlTUWNZRUhBQmp2d0UvMW9kNDJVQ1EgdlVtOUVJbGZEUEV4V3hjcXdHTmloaWZKNTZGV09lQ3NuWnNUV2tRanV3OUtSazErM2hyNC9INWY2dXB5SjlnVE5QckhYbzJHcnZocSB2VWNrWXZpSk1BMGtKNGJESSt5M010TmJzQndWWUNlMmd3N054ZG9XYXpPY0pObzREMjhBK245Z3F2ZEdaWGR5T0Z0WnRhVEdTaHcxIHRLVU9PVHIydjIwd0xGeXlpYk1IMlF0MXUrR0pqQjhHeS9nTlV6a3lFTFprYnVpYkNHL3hGMVlvV2g2SUl0UnpEenZhbGY1K3JRbGYgK255aGxBYlM4WCtJdlMvaHVnWlBaTzlyZXlTeURoL0V0OENERFpXYTVHaFpaOE9FMmh3SUFmcUlBZndYeng5UDJCVThmTnl5UjVXTSAyUVNuektLN2dNbVMwQ1E5WHVWWkZLbFJIQXduOTFGc09RNHErVmVwVlh4bTMvc3l5OGFoL3dEcUFQbi9BTy8xRTZGeTBKZkhPTm9XIGRNTWNMREZCazJhUGtNSkxYMmtZL2daSTE0VjFRdmc2Tk5GSmNoekNjcTJIcGdZOGp1eko1ckVXNWc3UmJpdlI5WW9aNndyUnprNnAgRzJJUVF4cEFTbjJNZXJJREYyOHhEdFJiWk9QdUZxUGxmYjQ0TTIxcTdOWmxxY0pkdmNCd0h0Q0EzOEJWMXhUN0VNc21TbTV0a01qdCBsRFl5OVY5YjJRNE1Oa05EbDJ2S1BuY2hEbUdPZURwbUNJdm9ad09UL3dCODczdmh6ZjhBWUVFQnNDLzB3aWpBVW9jV1pYWjRCYmhyIGJzRXIydjN5dDVFc3crQVdGbytHd01hSGNFeGtReUNHRGZVK2ZPY0NkbUlhdVRHYkliU0FhQ0JmcUV3UGdPZWdMRlZYWUdaUVZiaDkgVXNvd1NQWm8xU3MydjRic0hsaC81dlVEYlNlUG1RK0g4YklPQU05WHphamlGbFpWeWpNemVFTnZIUGdIQVFDQ2Z3NlFaalFNa1RkNyBva21ZeDNTM3RZY0dzTzdqbThoUkZEcDJ5d1lxczVXdTFtamVrU1FlOE8zOU9XT3hzeVUzTFNkdkhWTTNCZ3NodHRBdytORU1hZWFCIHJhMkVMT1ZiUWxza3ROWUhKbzQrdDF1OXVFT3E5bk5xWHdEWWNZemJXTVdRYVQrbS9uOWcvWU9vMTRycExjakEzNTZyWEZibVQwbnUgeG5HQ012bmg2elhLS1lUL0FLZWg2a01XQ3QwYUE0QWQ0V1daWDdtRXdadlpBWFB2YmYzNzNQdURWbzZBMUt4RTh6VldkcTlQQnJDVSBrZ3pwdjFPdkM4dHBwN21TRzRwOE8xRnVZWVd5RU5JbjEvUHJqQkd3UTMzSDhvK2MyQis1OWdBUVg1QldJTWdWMDhPQitVVUdqVnJoIE1saGp6S2ZNTmhlTFZ5UmFEUXQyaERRM3hQVzRaQXh6eUJVc0Z3Mnp0ZXpFOWt0RkplT2ZBTUVId0d3YWtBRUNKQW0zQ2JJU0dDWGYga2tKVVRPME1xeFp3VFJGbzFWWkRua3pFcmdBNm1TWlppOHczbmltRUpiMkZ5YUtOWGZqaklrY21ObThLeUY1QjJWM1hkTjFWWWx3WCBURmZHUEp2TTgzVEhtMUdWNEV1RjhWS0pGb1ljZndOa21URERBWXhiY0xhM2Q1R0s5eUxUTWN3U0FtLzBHZkFjK2ZrSis2VE15ekh6IE5wZGtNZ2NsQXJlMnRPcHNUSXNJQzRKQ0hVcDZ3bnhvbVYvTVQyVEd5SnQ0UG0vWW9iWHlaRnhLVm1zbzRRSlYyS0R2NzhBUHYzVmogd1duRFZIUkZaNDZscTlCS0t0VldxWlR2bFdYTTZwcW5yZXViUXVLaUdsYXdmV1F2YXFHWHNCdzdaMUFlVktzV0dnb3pyTE04SEVrRiBqNmYwdzVEZ0FZS3ZTT2NVTzRXRlgxZzhiVDF3OC9xWUMwNGRrV0VoeWlrdE5jakMvd0JoKzVESFc3QmFpTzkwOHBJN0t6azdrdVJHIEdBOTdTUWZINzhBSC9ZQjBsRkRSbkhDZUdLb0dXTXhSeG5TUmNTQlVpaFhieGtMcHkwbVdJWVlXVklzWm1LSzJjTTNOWklPWjN4dWggWXZkeDVIMkZCN3I0c1Vwb2VwQVdER3U3NWJWWE5RdHBVck50QWJ3ZElXMml4cFl1cjhWOFAzVTJkRHI5azk4Sjd3eVdiV2I0VUpreiBnVEUzL3dEdURmOEFxU2dVZVF0cTVFK3ZxNXVDeUJ1YWVvcVhmQkw3RHdNQTdxN2tINWd5SndlWk1JQjFXZTR3QWJKNzFlcmsrRGhQIDcvYnUvZ0FEOEFBUU15czRlVmJHelFCcUFIYllkV3FZL1RIYlFhSXlLOFd3cFFzUHhzeENyZUdIc0JiQjNTbjN3Y21kaldpNUZsWlIgd2xvN0gzZFlPQW9OdW56L0FFN0dTUFhiYllGa0hvcVN0amErY0JydmZBWU5VQ200RkVQVGdlRnd4OFBlSmhnT1BUNjU3Z0lsalROeiBWM3pGbVJ3aVNFMkEvZ0FQN0FmeDZrWmFOSUNWeXlVRjFnaHhqTWRwc3hoTXpodDIvZGJibVh0VEhscmtJN0s2MGhwbERISjJja2JzIGp2UzVaMGxMaU1BRzVOOFZMSHA4SXFuMXYrV28xblZwblZjNzJCVzRlajFOYktQa1FDQmNHQlBjSmxxY2tyOWJ4MDhiNjhMYnd6RkMgZ3g1T0pLU2tnOS9xSS9oMmlRai9BRnVWMU5ucTlYSlNxK3NoYlcyaVlTdTZRcTZrSzNkekJSV2xpMmdQWDh5WjRjd1FsK1BBNmpJYSB6dWpRak14enphTy9IMzdBQnovN0FiUjh1Mktxa0VxYkgvR3M0V1NOaVRHYzdPRmV1QlE4cGxEemk0VnVZK1pkZ2RQNVYydjJQQVp3IFBjeVFOSmR3blBqNERENzhmUWVvR1pmSy9tbkZVV3hrdTJLR2h2NmxIQTFXanl3NzRyNlpTaUhhaDl3TU1sYnZpMjRPR3FpdEdFODEgR0Jtb1VvTFdTZTk3MkRBSUFBQmJ1SURxbWtwV2JaU1MzTXFoK2JqY0poZ2Eva2t3YkZQdXh2SVYwVVVLczZuZm1SMTlqWjN5QUNPSyBIaVJJNVBQT0dQRjVDcTJyUnZ0ZHRhS3dja2U2YVFwWWE3VXdxUEU2R3E2bnlsSitsOUp1WjFzWjhiQ1k0UjkwTVRMSGM1d3dxTVdHIHUzc00yTDZub3dxU1pKQ0pnYWhsSk1uT3ZSeFpxS3JMclJFQjJPMlBVc3FCbXJzMkFtem1WZXpvYlNZU01odFo1UUJuWmhHRlhnRGcga3c1K21iSWNzekIwalMzZzdGUHhHNW9LRUNURm1TUFZuWE9UKzJZNGxXUFp2QUJMK3Awb3VnQmRieHEvTldmOWZOYUpQN01pYVIyUSAwck1XVWJPcU5Ba0VEblQvQUtIU3dtS2RrYWZiWU1WZlN6dEpyS3dRTWtzUXlXU21MdURPUUVzbXlsc2U0ZHQyUndXMkJiMzdDZkIvIDJ1VEdBNlQvQU04UUNEanNBRUIxVkVoWDRkeVU2eHNzOE5xNjRNM09wU0phRmhWaXdOZ2V1YlFtVzBCdUN2OEFUM3lSandEcjB5dVkgRGhBblFsa1lycTdNelZYOUpPZTIvbittUXdIVjhPTHlReTVUK25nd0wwNnU3WXJzbGhLOWhXUmNpYnFFQW5tUWdYaHpRNGY2ZkJRNiB1QW5NV1ltcjdaNFBFTHNIUG43ZndHLzlYWTA3NlUzd3JwL3RXL2Y0cUdUUzdlYXFnYzR0UmJzQmVtSnF1MmFWU2lHUG1MYmdIOXZoIDg4bzg4RDhZaDdtVE9WZFYvQndDQ2ZYK2ZBUEFkQ1dYNllQT2doaGxhWVFiczhXM0c4bjlNRnMyeHZ1K0RYNzZYR0F6SWpsNUZLSTggWTA3Mlk4ajNCemp6ZUs0bmp3M0h4MVZHc3c2ZTBSMlIzcXFwZG5YSWRnY3dXekZUc0pmNlJiVlNCK2VCM3lHdDFXUW1jVHI5OGc4RyBlVU44WmxrR2tta253SFB1QS9yMVBKN0EwYW0xOGJRNEdxN0lzSm9XMyt6UTdKcVFIdTVpeDY1Ykl0OEdMUXVIN2dIbWJQQmdZZDFMIEhHUE8xMGJabTl1MzBIZitRZnIwZ2FYbVI1VWZPRnE0RzQxdDNoeWE5ZUdyaTlaSWNyZG1oTlhCNWk0R1hoNjJ3dmdPZnYxVm9aTVkgaHF5d00razdIdjU4QnY0RHBrU0dCZ3loY09VbTNBeWFkY3JtcFl4bldFdmlROWN4bXhOS1RLK1d3N2d0dzRmdzJwdFh6elVIR2NYViAyWkdPYkp2dS9nVDREK3dWcUYrcFpaTC9BTHpDNm5TcVp0aEdqVTh3eXk0U2RudHlHSGZ4N2NlVTZlVkVLQjNjYWRnZDh4eGJzZ3h4IENZeFpwbmR0ZmV0ZnUrck9XUmJralRtcHVCblZBSEdrb3I0U2x5RDFxV1JnWXFXeHF5dENOOVBEcmJKRGg4REJIcC9CMlI1WmxjWDIgek9PMnlPNEErL0FQMEFkTlFKVkMyZUg5dEF5MVJTMmVzSmJzMjhBNTZ3TDVtME9oeTlQb0ZjWDRhMmhwOHZicGlPQllhMG5Xb2pNMSBZTkt5czhKdEdybmdBd1k4Qlh6NytCQVYxYUZxeU5kYUhZU2JxV3lWdGtRME83RWhvdUIyTUNlR3RFUzBMR3JldjYzUWs3aDlicjc1IFl6NHdRQVlmOVJkUWZTTUxSMy9uM3VBQWIvMG1WUGxBdldXdDJNN2pRbGtIaHNsVHArcFNXcEJJTVZLZWxwcWFIbjFXbnA1aW42M28gOFAyMCtxaC9LSWZuRGV4Ny93Q2ZQdng4QnNCd0xHaVBKRzZDV0ZNcDQyakV4ajhCQUlzMDNzNmV6bEhnUjRmUHRmSWlFeEtpU3JwSiBYQ1JCanN5TjdjaTZVK09OakVaRW5JOGl1U29neVpZc09CYUVoMkNROG93dDFrMERiSUhpWllGb1UvbE1sZ0J6RkozeUg1aDlTSHFRIE9aeWI3TVRPV2p2ZkFWOUJmbjd3QjkraDRaRE1sVVBZUzJyZ1g4YTVIamZ5TElxV2pwYTJyMWV2SVpTSFY4T0g4TlB1QmdtSTl0L3ggRHpySVpyZzR2VUNOdmFTYnhQZ0Q2Q0E0RDFaV2V0UGgxSnMxb1UwUmNyN3VFUjFOVDc1WFpJbkNKb3VYeWdCOElhaEVNUW9Xb3REcCBjRlNVQ0ZPcmJOV2hYa3BJRmRhVGFYdjdJQUFBd0lIVlJST3NKOHBPL3dDSnFBcExTS096Y3lSY1NTT3FzYXF0MXEyZE1vVVduTVpHIFdaVDVVVjZKZW12TFlZYjRWVEJSR3c5VElVUmpnTTRqOGdRTVY5L1h6MlBUbFBjeDJOOHJLdHk0QnM5ci9MZlplZjhBaWI4ZU91WlYgTWtidU5QU0xJWXpMamhHU055UU5oNnNZcGNHeFRLendLNWdyb3NSVERVZXFvWm1zVnVzVHllTXNLdG1TSFpGbXJZdTJyWVRYSjhyLyBBSWVHY0U5a0hoNjVyUzBhbFJ1TThYS1BBd0gzUkNWWCsvOEEvZ051cVRoMkpaZGgwL20xekx0RUMrVldFRTArdG1HQ1d5QVZlWHcyIEZZQWRQY0h4YnRUa2lPcFYvd0FxUXlaTlhwc2FULzBUQjI2Z2dENzk5QjJETXJVWnFEc1ZDczdVaHFMZGxKVkE2a0cyN2xkT0FSaXkgR1VQV2FLMUJUSy9oOWhpOWJwN2hqYWtEZ2Rjb1F4WnE4bThrOWovZjkvWHovZ0QvQUZ1ZUs3YUtndENHa05ueWF4Y2xVbHA3cWRxZiBMZ1lYQnlwdUllRncyQXhEUTdVY09ZOW5JRlBxU3E0VkJadW5OV1psZzVhS1M3bkQ0RHU2QTQrZkFQMlIyM0lKSXBTalRCREc2STRsIGhhTnNmcW81RFNiMGFCWWc2MG1XUTVXdWRrSWVLVmRSR0hWRmFOb3B5dTI4ZW9XOXJhTnNVa0pMVS9PTkR0YSsycFpCOGVLNXZDNWsgZ3lOcit5QXlUR1lWK3dqekFKTWFqSXJES0tNaEJQMUlmczN6UGdFUG5CN01Sa01vODFtRENHemFQdjhBd0R3SFZ0TFE1UkZ5NGRqViBmV01uT3RvbWdDWTlQcEtlMkI1VVZoQTNJdGo3VTQyWU1UQjVoVjI0OERtZXl3TFJobVBlejlPZkFBSEFkZzY4L3FJYVErbUIwdFJZIFRyL3JkS242cUd4cjAvV3BXNENaTkZwckNUVEh0Z2U4TEltQjRaQXkxQVYvREFOZ2lxNzRNV2Z1cVE4Yjk3SDkvd0NyeHlOWGluU0ogaFZLMmdZa3A4OWtDS2EvTWlhWjZuTVNsZXA0c1dHUGhtQStFTXd3WU5RL2x2dytNVmR0bjdJYjU5K0l0L3dBYmRQZ0RrbHhNU0xuRSA4VGlSbzQzeGphTTF0TXFZbkRNaDc1YndPb0pGa2prYVJra1Jrd2pTYVBLZUl0N3QxaTR5eXBjYkE5cDU2WHRmc0VjTW5tQURsbkRjIGs5Q1VteEhmQnJ4RURub3RUbnBTM1Y5Vjd4YWlleUQwTnE3WHdFYmJGbW0xZFo0TzdKTHNiUDhBdHY4QWlndjNSaFg5TmFpS3F2aXQgM3pKaG00YnhzbE9CNmZmR2hlaDZnaWtRV1VtTUJoYlczeDc3d1E0SjRmQU56Qm5GM3ovZTNnVUUrQUFBUDM4SmgzUTRYTFU3SkZzYSBZRUcxb0IzWkhNRFdBc1lybHp2bm1jeGY1aER1QjhtRC93QWxqME8xRnRZd1F5aXlUM3ZteHcvdjREQUIrLzJWcWQwVTZ2Y0szaWtNIGlOU2VtNThHM0d2WGtxN1NIRmkySGE3SS9uR1FPNGZyT24xLzNIVCtNaS9LZDBVa0p2OEE5K2Z0L0FBQUJJK0dtbEt3YjZMblBTcHUgSWtZS2lRUlMyTnh6MmtKZ21aSGxhNllZNHRUcVlpSHdyYlFPeStwTElodEVlTEliV1Z0UnprOEhqanFPSVI3Z2kxdkRkMk04dEo4dSB6bVM0MTlxczZSRVduS3VkVXQ4RExnL2lkVGs5YjAzek1WdDRiZWV3V1FuVURSUTZ5amNKNFRoaWZ4dDErQUgzNCtBOC9XUmcxQU50IGdFdFVBWkpTWVlHeUhaNG9ja2VUMU5QVGFscjA4MFE3UU1JYUd0cmN3aHhVOVlBRUZnODltMmhtR25UbFhHL1BnRC83RHY3NHVCZlQgKzZscU1kQmMrdWF0R1EyMlI2M3IxM0xTejByNVY4VEYrWnZDMm52ZytZRHhZTExuSVl6YTJoWmVYaTBqaVNqOEJ0MUJ3QVAyd0FJMSA0cXJWcFFVdXlhV1RYQ3JvWXV3bzFlMmc3YWU1RFl0TkZYcnpSWXlJUEQ5MUlZZDhIR0ZXQTRRUGg4WmZDaE5tKzdPenhzRy92eC9vIDVGamJ1Tnp2Szd5U0J1MlI0d1V5YVNUdUxiTmpFWUM5dzhqbnJGSnVLcFNKbktSUWlFS3paVm1GOVFtaGhHb1h2YWpqMitlckxMOWIgeDIzVHZVcm0rR0RaNjFiQ0p5ekEydDYzaU1rcFhYZ01xSGl5R0xJWkliaDh5Q2gvUDNnbnlobzJ6M05oRGZQai93Qy9uMEVCcFZnOCB5amJ3YVZjVzdJTmVKdU1sVFR4MnJPbUlxRTBSY0ZjQ25zRVI4YjFCa0REek40VDErMnZoMW16YlhoampTVlhPM1B2QS93QkF2d0ZKIDFuWkhaSFRKWjFKQzBNbU5paGpWZTJCelllcHpWZHlMUmF2OXJnUTZIbVdSTVg0Y0NBUm5vOHhsSkllNkRQZDJOKytHL24vZmdQV24gVW9VQjE4OE94a1ducVZTcmlxMnBDK0gwWmg3anRTbkxrWGdMbERJTWpKM1VtSjdCODdoN2E4R0NaTXB5Wm1SL052QURnRy83QjU5TyBvVnhHeXhTQ1I4MlVaTGhIMllBbDVMYkRMTGdZbTZKdjQ2ZUZWMWpLeCt0Z2hlWExoa2xDNVI0NDhYaU83SStDYTZoMDk4MDZKQlJiIGFKN0k3SG9zTjJFdURVWURpWmlIWTZSVXNXYXYxdUhNVnVZaHNDRzFUN0F3VlZzWHhjWHpuWk9FK0EyQis0Q2VBSGxqcUlJSi93QXkgdmJRVGEzQ0xkVkRXMXRzaFB6cEd6eXJsRTAyVTFDTUc4Y3czZ2d0dkRiYUNseVFYK0w2Z0diSWsxZHgvWU4vMzgrZkFNaERxK3dKZSBXN2FmQXdmbllaRFpJZy9KcmZoRXpkSmF1cnNoR0hEcmY3SjlIUTA4RnlSNVp5ajQ4MjhqOTBhdDM4QnYrQjgrQUFJSnNweDlPY3Z2IHd4a0ZXeUREa2VvcUlqMC9WWmgzbU5DSlhyNVl5MlArRzRoNWdkZzdxZ1YvZS9KcS9PY0xVU1VtcmNEL0FML2wzOFFueVp5d1JwZzYgdWRpRXhvbTRFeWtqanlMWko1M2NndVAyRVh6WUV3c3lnS3lZSTdhZ081eHp4MjdRQ21yeHkxbXI5dDhkVksveE5NR2tIVm5uWTZhZyBJVFZQV0RzMnNMZ2hnWGd0L010Z3lLaGo1aUdIMUgwbStWK25Rb0RBZXVKYlp4Z3ZIYXdXT1A4QTdBTWYwUDNZc2xndFN0SkdvK0JhIHRZMWRZV1V0WTA0dm1IdXQyRk9pNmZkS05TbElRQXZEUXFITU9LZE5SMjFQd2hNaU5wN3VUSEFvOEhQZDNmZmNBd1llK0RBbENPbk4gYmdaUksxY3BWUUU1elBZQ1dBbDc4a2FBSmFWK1B4RXpaMXZINWxqY2ZnUEdGbU0vakNZSTM5NEFIejREZndDRDdHeGlSSERWUFZkMyBIcmFXME9yKzB1TlhoekFaM2NPQnkvaU9GZ1RGc3hkaWZXNjlEZ3FROURuSjdOV2F1ckUvdXh0SndBYkI1L2Z6L1ZtUlhraktuMlpCIDJGcElzaENoa1FnQ09QR3dTWTRsenNaRHRGYUlFV09CaGJsNDk2SjRwREZMR1RKR1lsWmxraWF3TXlRb0szaVZKTjJHY2NtWmg0eGkgaDV1Y1NKTkZocExaWkVORGFJaGkwTGFsdEt1SCtIRGh6TjRZSmpVK1ZlMjBEREdNNHQ4c3pZd2xYaERuL3dCQUFiQlcrSFhjd05XYSBUWXdFeDhQT21TVk13Qm1XZ0pRNGlidWtWaytJSDkwK0d2dzFWdFh5RTdrMVppeWhSWjgzN2NCZmovdUE0QWY3QVpSYkFxNm9aREhqIFpJeVNyZFRNZDJqSEQwUDVZRTh0MkFZc2xQVDNCUEFUUHdlZWFtUm5ac1JaTm04MkVlQUFEWU4vd1A3QmkzN05GWjM4VXN0Mk41d1kga05YbGZJemtlV3lQa29TK05FTWdZK0d5R0pqZ3RnOFBnVnpDSjIraHEvblVud2Uvb0lEM0FlZk9EY0Zlbi9KeXR0L1QreHp4OTluaiA0eDhtK3M3Y3N4enk3R2VzYXJIQVY1UG5QL2JFaWpkOVdXcUJNdGpVem5yZGZXWTloYzRvMVZOcVpSczJwZFE3QW9MQ2RwN3htVGNHIDVrdFNxOEZsT0VZMUxiNEVIVDR0NXh4eHJPMU1ES1J5RDFlckZBOUw3aWZ3cTRSWWJzdDJ5NlYwOWFZTDR0UEtrdHo5RnRtcFZYUEsgUks4V1ZQVjZkVHEvY1RKY0w2V0pleHNnR2dxVnByV0ZtSVNyZUFySDFZaFFaNjNGOWZ4UXZiQitLMHV2NmZGVWYvaXdMSVpMT3RBUCBHVXpGaE5UaFh0a09VcGRqU3BqQlZka01oaVl0dUNGeTBoOVA1TVVWMWxtQm13dW5pMUQrR3dXNmY4K0FUOWlJY2UzNlhzOTh0QzJsIHNNR1Q3c3FkZkdvYTlLNWxkelkwSVpqdHUrV1JENGRzNXc4UXFYbUg3VU1HZWJPZi93Q3Z2M1YxcGk0Q3FuMHo4YVdPUkxlTnpWcTQgc1k3dkhObjJIZ2pqcXNXQ0tXWUZvM1dXU1NDVzBralFVekJzZTdDeFFvZTZ1T2xMUjlnU0hkd0d4TmFXcTdiYzZwUnQ4eU01YkhxYyB5eGp4Wm92bXlXQ0hjRmJ6S0hjTEFXd2Y1cGVBNHdZVTdQbyt5R3dod0I0RHIwYVczbm00OE94b1JqaE9veDh1d1NRU2RQYnd3dm5kIEJlcmxFWkY5d0RtQTkyTFpHWThRR0J0YXNCbW5xMEt2cUFuaTdjSnRYeit3WVZGNzlWRlMwZXdLUXpLeDFjOTVnbGhXQ0hzaUlQU1ggWmZZVnV4cFFtVkZNRUlpM3lOYm1FSEVKdDhBNGg5ek4wR0xMd0UrOGIrQTMvcDhDN1F5Mk1tNEgwMVZVcGdidVJFdkRKYWpFdVpLcyBhWFkxM09BOE95Sjh5MUdRZ1krdjg0Y2RzZk9EUFBoRGFQOEFZRDRCZ0FjK3dSSVlwSkdlSjBXRnFUaHM0MUFyZWhlU2hoZHg0dmliIHB1MFk4dGpXVlVJZFh6MlpXeGZkajlOakh0dURIS21XZE53dzdhQUI3eWV0R1l2ZzgxRFcwMjFWWnRBNXVUWDdDT0xwSmd0NEZUS04gRDVzNmZEcDliVHlIOGhWODhIdVl3WHlkWkJtLzl2NElINy8xeUM3b01VaWp0WEl3OGs4cEhxM3FkNERyVFJFL0Y5eHBrV3lHQXpEVyA3SVc5d0RuTE1UK0ttT2NDeWd4WjRTYi9BSC93R0gwRUF6aUZieUlDK0hNMlhERzZiMGpoSmF0ekR0ZUdIQStKbE5uSXJkYnZrdERtIHI4eTFCNitlYWc0enRlMERFWjRDR3pieDUrM1QvVVBUZW45YmNuak9nUlhCSnRTN210a3NJaGJWWTEvTDVRZXJJQ3I0ajYzRHNpR2ggc3BCd3NadHRDQll4anVZTFEvNkoyVDNmL1ByK3dBQUM5dEFtY3h3dmlNVmVUbWlFUElyTDg4OGZCdm9SdUt6RlZTWkZRaVV5SmpKQiBHMkZ5TkhiVjdlRnk3Nkp5V3VpbFRPYVoyaTZDVnlPK1MvMVdMaDFMTEhaTFVITEI5UVVWZUExTE1BYzhtTWpoQ1RxcmFqeWVCK1lVIEdjWDhHaytEUFluMTgvc0NEMG9GY2ZETWxBNmE1MlJLWktsenJJZDhYeUc0V0ZEcmxvbG9hWVk3cVhCVzRkazFJZkRCdHVQYmt4eVogb1Z4Z3poT3liQWZBZWY4QVA5RFk5TGNNNXdhbTFTRzJSWHI1bk1seDFPdG5sOWRUeWdzU0JLR1BoL0REekZDcjA4NS9JTlJrWXpGRSBNbXpIRWtJYk9IOWdQZ0QvQUlEQlYxdVlPV000VEF6dm5hYnhvR3ZWdDNrTldsZlVSdkQ1U0tRME5DZGFLR0hEQjF1WTRRL25yL0J3IC9mSll1Ukdabmp6WndDQThBZjMvQUdCeVJORHVsNU0wU0ZJOHF4MjVQc2xySTNWdDIyUFB1SG5xQXhrUnNzWFl6cTZ0bUxiYnhzVUYgRmU4RzdQUE5mSFZqSEJPVGFDY21xcmo2VWxNY2dDV3k1TUtRblhCU2RpQ1lBazJLR21ob24xdFRZUUhZelpzT1BQdzlXZkhXQWEwayBqL1JuWlVGVFd3Z21Qa3djck91ZGF1V2g2N2lFcXlaTkV1bW0vTXl0MlpzVkJsd0F0WTk0aUZkOEgraGxLR3M0NG1EQU9TcmhSNlJuIEdUSmZMVG9VR0tUellhM2xEWXhoaE9NR1VXbjV1ZEE4Z0RzRzArUkRrRnZwNnNncUxyY05YZml6L3dDYjFKRXpLckNhRlFRQ0JtVFEgT1BGOFhXWDRIanFzZDZ0RU1wUThPZXhnYlJBd0xIU1ZNaGFqdFYrbytIR1BPNzVLMit5QStMSlZiNS9QVDdBQW5FOUdlU2d2K3llZiBma0FBQUFId0Q5MWFqVWJZRjZab2Z1WEVha200SUdtL1NycDdwK3EwOHhFVHdCN0NNVVc3UlQ0YklIc2hiSU9FSThQNVZNV1NmRnhtIHh1OTJjSFFmMCtnNy9qRHZENURwRFQvZnk1ZkNTN05Xb3l2aHRPR0taUEIxT0hGVFphYnpBZ25tSWRrR0dUemxhRUZLdWVDdkl0OFogbGhIL0FCY0Q0Q0E1OVVTQy9IMzUvYWlLUGJGMnhFOWNpdmxKbm9HZFRna09rNTBCMzd0VnpZU2EwY2ZtSWFmVlpkbEg0VGoxZ1B1SiBoWlJsZkVtVDlra0lEUHNBREh0RnNBQkJCbTBtN0JBV1FUVEk4aVJUeFJKSThjVXVram1taEVRajNJSXhxRVo1U2ZKUUtvc25wQ0NWIG9wWlRJeVZnSFZHb283V1lrdXU0U1U0Qm9ZNCtHeTRTYUFRRjZrYTdzSThuUXdsUHp4dFhGdTN1bnNPSmNMdUZ5OEFOdzRXK25yZnogREJCYjM2djU0UDZ6endtVC93QTdVQUFPMFd3QVBQdzdqRGo1cnJNZkxHUTR5ZlNNd2J4ZERvMVhyTGk1U3NwVW9PUCtoMXUrQnlLRyBqZ1YvNExnellvYXZ6bEczczNnZjVBZi9BR0RZWWRMWDYzU0pBRkRkM2FOU2VWMmN0ZU9CdTBPNzNZQktNTm9QajVYN0lIaHcreWZKIEFkTEVJRlY4NVJtZ3F6TEp5cmdqczhZYitCUDcvd0JhVnM1YUYwdzg1Y3locEpxeXBxQlp0d0RjaVEyR0NpR3cxekdXNnY1THdPR24gL1ZUMWYxbzhUR2JsRm9FOWpOaFBQN0FBcUwvZjJxSm9sV1pRK3FrMjNRSzBqbU41SXhIREhISVdwc3M5cG14cjB6WXllNzZKbGxhTyBBczZETE9saU9VYTBZL2FsTGdUZlBKeUZEaXVwalQydnNsY2tRK3I3VGRjRlNQbHYxajNDcmVaVzVoVFpIdlZCWHREZ0h6WjRiSStMIGN3aFpCeFNZRzJ1WWZHZm9yenZhUlZ6dy9jQlAvWHovQUxMMWdmTFFNc0NlK05ESS9nYmF1QjJzMWZQRXNlWVcwTFV6ejR5ajNDcTIgU3EzQzFIQXcxZG41Nm90akNmUEhrWnZleVBHd2YyRGtIV1JHdGswZTJvbGFvSzB4QzVMYldOa2FmSGM3cHZzQ3diVFRwVFkrTkdtOSB3RFdRK0ltSWdlK05UWVBzcTB6RDA4dmd3WVN4NFRWNXZqNzloeDkreHh3bUZNd2J2T09Ic0ZuVDZ1eVRGaFNiWU1XcitUVEQ1VjdZIDVOREpZRDM4eDhwL2o5cU5XbmpUL1A1NE1HSWF1TThKNE0rL0w1LzM1OTBJa2tqMVVxdnBwQkRoRFdzVnM4Nnp1SjRzUlVrRmpLYmMgOWZjdmJpMis5RFJvVUs3eUxNanNGamZ0M0krMEpJR3MxbFJ0Y1RYSGNiNmt1NzVEajU1WGxHTFJ0cWg2OVpHdXlLOWlmVzVTSlgxbyBIbHNlSTdxS0JoUDJkNEFNQ0hCWEJ2QTJmYXdkWEJNY1g3Z0w4QVA0NytmNGhZYlZmVUNvMzBTQm9iQndyVzZ5Tk82aHc5S05NT0UwIFBvaTR5eWhQNGhaQzB5SjU4UFkvejhXdFpaU1pWQ0dmNlg0bThQZkFCamhnd0gyclcrbGU3RElET2xVRWVKQjYwcCs0Nm5xZDJzNnYgNWFlZUtMeUc1TWc5RFE3VXF0d2NDRU1IUFg2MHRSUEpyTFFMV1NZUFkwa0h2NzhnNytmUDRBQ1E1YWxiM2M2UG13c2p0ZjhBcUN5WCBhd2s5MlBYQXZHRmg4VXFscVdHd01pM1pDZXlKNUNhcXR2TFlLMzNmVjFjWmovWXovd0QvQUJDL0FEazI0MmFTRzFoa2RtRWc1OWM0IGZUaXZ5UFU1dm5qanFzWGtnR2NybkJFaktnMUhJaC9rV1JPY3N1MHFjaGhUY05sMjFYVzQ2V2gxSGNDUTVaSnR3MUFwOFpUejZydG8gZ3d2bGpQaTlWOWN1SkN5TElyZFBRc1hDWkJnT050VTdNWnVVYm9UKzdWY0QvWU5nOC8xYWl2OEFnNTVjVlVOWEEzNnFsSFp0WVk5ViBxdHNWNlhjaGN1VWVEc0RnNHAvelhEQU9xN2VlTm1HWW1ocTlaN0diU2YwOXQvNEMvbitsdXBrQ0FHM0VrWEtWQXUvTlMycG8vYkd2IDViSVVWMTQ5TGhyNGVxMXVFWVpONGFyYVgzeEhaQmd4RFZoak4vV3h6ZjhBai82ZnFlQ2x2TFhBNGVxbkprbFdFQlZmNWdQVEpoaE0gSzR1VzVWelpKQkQyZDhjRnRnVDJxQVFVbmhrWm1aRGFGbDVkN1JwTjJOL3YrQURBQnZ3c3p5cXpZUDJPMHFoMXh3a2ZBcGdiUHB4VSBjSS9nc1RsejAyTXEwY1lTTkM0UlFWMDR6dEkvZkk1N2NjY2x4V2psYmR3cmxKbktuUTd1VTA5alBLbzRQbExadXphbmF1NURZaGkzIE5obFZMTUlPREl5SWNOOHNDSHZ6ZzNJL09TaXVNSitFU0haSFFVSGYrMFd3YkE1c3V2NURIVjluYVh6MWJ4cGlHbjNaWVY4dzdVajEgbERjajFUMTBlcmI4RHJUSXQ4Z1E3R0JKNUE1Vy9KaWhSWjN6elp6OVAyQStmd3JvWUIwMnJrWHc4R0F1N3RsQVRsT084TzVrZFRESiBrcVhYS3ZEWDVsd2NEUS9yYXFlWUVQa20yUG5CbWJaQW5zQUFBQUg3QS9INW0xTElZTlByWWsyL1ZXU05EdTllcmV6NU9janFiSEZpIDNlcnhYemVEQ0hNK0dQNE8rTDRFM01KN3BpU0pnM1lKVjMvZi93QmdBU1I1SkdqZDVIWklya2haR3d1TkNpR0pnUTM5S1NSQTk4YmwgbGVDcEdPUFkzSXlkdC9VZ2xGWlpJMklZWFlyTGo0TkFmUFRDOEllS3NnR2RaQnNhMjZpaVV6RU9TTXk1a1hUbkVlM0tFUStYczYyeSBKNjN4SmZyUUhnVHJQSHRBekk1dmUrMFI5QkFIL3dCZ1Fma094TXdNNkFUTXF6dUV4UTdKRWtIZzlmbHJVZkUzRUNlN1BwOE44K0doIHI4eWRXbUNrcXpNSGtvK0kzQi9OMGVmOEErdngvb3JYMDluaWgrRzErTmRyeUlOVC9NRElhU1k1R0xWMTZ4bGNQYUV4T1c0YjU3cmQgNEFiQm5nMXY2R2gyK01CbXphU2puL1AvQUxCMUpXUTRVM0ZxZGJQWlRzTVBYU1l0R0lRUFVhdnIweE5RNjlxOURoL01NR0laaUdueiBYaWxuQTgxSi9HZVVMTE1jMk5KT0gwRzNRSDM1Z3c2V1pkelVMSzhqU3d5M0NGU083M01iWmpueGpYYUs3clBJcmxnQ0JIalJNY2M3IGRUbEhJWXpGN0dwYnZQdTQ3ZVBPWENyYWFqVExwUjc0VE1yT2R1L0dUYVBza3ZpUXBzaWRVckZWNHRrVHRuMVVURU13bnc1MDhlQjIgZEdHSW5HVWJ1aURONy92NS9qK08vdnhoTURORmFCMnJTWGNqaEpxVW9rc2pDWXViT0lxYklVdEdYYlF1bjAvZ1ljTytHR0R0elBxOSA4VmJKZVdaWVYvWUhqLzU5N0FINUI2SkxJUjdBQXBpZVpuaDcxRC9XMnhnY0E3Qkxobm9xbTBLLzg0WVd3NmZEOEhQNEhZekl6WW9lIExNVGVEUVQvQU5qNit3Yi9BTk93cFJaK2VRdHJ2ZE1OMUtlcDlBWHRVQzJISVhHNE04VnNUUU1NZkRjQTlWbVdSd3dhb0Z3ZHhvWlIgWnRDcnlhenNtSGdBQy84QTlnNnZkUVNSdE9pU1l6R2VPVjF5K25rdFFBaThlbU9NRXNZMGVUZkY3REN0ckJPeEk1TVl3QklnUGRuMyBjdTkyei81Ym8xMTUrbExRTVlMYjJlS2JhdDJPeUlBbjVtZFg5WkdMUXE4dFkzZFJlRHA0ZUZNbUo3SUMwOFZlMnpwaE1ZcmxQM3pFIEo5Qy9ZTmdQOWVqVFFoMUVGc0NtUXpIY0JMVlJWNDJyck41SU5zaXNvZGpXZ3ZIbks0QjdJbjFWRGNGdHZaQVFGZ2dUbkQrbDdNSmcgNnUyU3EvWUFBNTZmUDlJeGtMM0ZsYU5iK1NraXpFZ1BwL0xzY1d4N0JzcFhySENyMm0xN3RUdzlQT01SaXd4ZkdBTzFLVStwcCtGRiA4cEtJd3dIaGoveTRZMUZ2L1BjTWNLK0IwOVg0dVN5andHTkRpall5bTRRd3dkZWh0RVZlc2FYU2FlWVdqQmVIdURKT1BwNTVxVzdNIGVlemRaa3dmbXdlRnVnTmdRZjJBWldhYmJsRW0zZzhxUlNnZW9hMnNpa2lsWkl2dHlDT012a25GYUFKVWxJdjhpSTVOK0x1aDQ1cjQgNlBNY3VxeGNnYmxYZERHMlFtclp1d2w4TzdEN0NNRkFMdlNKUlBJZk5tQm1TeUY4TzFQbFh2bUgramhRbjlKTjdIdi9BTy84QjZmQiBpM0ZzOGgxN0svMDJ5aVRJdzJCY0dvcGdpUXoxMzJhaHRFMWZjTlBkVnNreERzRDIzR3krTm96Tnp3bVQ5NnVka2Y2LzRBKy9BQUNsIHhCNmI3VlYzWjNWMnBBMHUycENKY2dtVjdYNm8rUldoZXRENGZ3NnJUNnJUL3Nod0VRYmJHM1B1aDltT0pJVG5BRDdCdi83QkFwK2ogY3dHSVdFa1pwaDJwK3k2M0NOandIUTJoVDNSRHMyVXJCMTh4TVEzd3dudURKdnpncFVkeVo1YU9NczNtOWpma0gyUWRnMkFBTERjbiAzVEtpb2F5RWh3ZUwyMWFjKzduN2hXSlBUSFdSSXlRYVIwamFGK2UvVG5pTVZZckh1NXMzZkFGV1FPNExJc3h1TU5XYTA1Mm05azFEIHUxdFJBN1ZjeEJldUJFbEtiNXA5RE1LZmNISk9IK0NxVzBHMEdZUm1aN3EvOWZ5aUQ3dStmMy82REkxL3BEYktSRjhTVW5hcGJhdFYgd1pMTkR3ME5QRW9aUW9XQWk2Zkk4ayt5VE41Vko1QTlqTStoOFpadnV4czUvVDRCK0FBRC9VZE0xRU9DUllFeXZtakpOMytHK1NrViB2Wjh4ZllVTkRpdTZ2WEtHUERya09Zbi9BQUhBNGVzRUMxVE56VnlqTnZudi93Q2ZIOEQvQUU3QmRvSUJSSFNhNUtMZFhBZFMxUGtwIGJBTmNUQWt4WFA4QUV6VGRvTWpBeVdSVzVnUnlEWXdPb0Q0T0JTekZmVVk4NEhBaVNrKzIvd0Q3L3dDZkJKMmpNU3JBOE1UN1Z5TTggU3dKbmRldEs4VzVXSnVsRkR5Qlk2alJ4eXNaaE1qb2pzaWlTNG43Y2J5UzVNZklvV2ZIbnBiMUJwMHNRVTRYeG1sQUpzYXhtS21MVyB1Tm1GMGRrcHV1V0d1YWxVT2VRM0JrUWpBOWJucVI4OGppQmd6RXFNR1dwYUhOUWV3NHNIdGd3TUhUQ0hzQWZLWDNEZ1ZHc2xWY1BiIGFudUJidWFPSmZGZlJHMlJaVlBwOVZtSWxxS0Q0b1REbEwzaFpjSDNyTW8rY0dPQkVrMkRRUGZud0E4L3Z6OHEwZG9kRTJRZVBhYWIgYXNoUHZoMmJSSmpKdWFPdlBkWG9jdEVhRTlndUJ3MHhRME44SU1saXdQNGVHcGIyeENhT1RXcGpkcVNEK2dnRC9VazZaYTNZSWZUciBVQzRrMjA0WnBKc2lCM0RsQWtPbTF5a0lkeW1Ldm1MZDJVblQ4enVwc0krMnFCTWRzeGROaktndFRoUEIvd0JnUC9zRDgrV09WOVN3IGVrMDBybVZaZExKTkZJWE1NRVV2MUJsMDhlL0hKdFJzRVhISHVCYmtFaEU2UXdTQ0VvSm80VWhacDMzSTEzdFVRSk5PK0tYSXUrU1cgcnR4QTUzT3cxUTA5TW5oeDJicHpoTGRoWlJlcnkxb1BtVFcvOFFiTzBVT0xQb1krcTVtalJqbUJrQ3lPeXplUUI0akZob1Y3Z1pVYSByOWx3WU4vUCt3RERFQldTc3pLVzIyNW5DMmltV1RPdHNQZ1dhS2ZQVi9MVzJpeG5aOEtReUFjT25tQTVpMEppcUJJSHVTREZsOGZPIE1uRWxKMlBZRDMvMEM3RmZ2RU90Q0FFWHB1em5aYlRZYVM3dEZxYWIzaUk0ZHBST3FCRERqME95RnREaHZsb1ZYWEw1c1AwWmwwNSsgTU9jSk5neitIbjlnK2cwNXFldm8vWXNQbTlzYUJEejBsYjVSTWNIQ3pROHRYYkpSNllRZkRGd0lWa1RONE9kd0xMMmNtakMxZG1KKyBFZHZvSi9ESHRGNStReUs2N2lzNmg2N3BJOEhlaVBkSGsyRlh4M05ZSjl0VjFVeFZUU0xTUlZpQWNrYlBEMnlVTXNhQVBieHgxdU1JIDhmS1N6QlROdmhKcmNDQmphaEVjTzFHSmI1K1FydXB1dDErWUhyZDhobWVIL0FzQThxc25ZMW9GMllNQjRtelp3QUE5K2ZIOS9QbTIgWlc2SGR5K1Rjc1Urbk1tekE2M3hlN084SGV3WFkxVHVRc093VEtmb2RiY0lhL2FsYzZoOExwQnA3eXpvZkpoaU83Ry9kZkFZdnlDLyBBTi9QdVlId1BLajIxQXJsbFNVL0RWRlc2bWpXcDhlbkljdDhVM0t1VENmY0ZWUGdlcTJRZ0dlRHhENTBNbnlob2VVWUhTWVQ2Q0FQIDI2L2VBUDhBVUMyVlBKYlZ1dHg3UUJzaXBYTGpaYTZGVVA4QUwySm9kNmxGMlFRaG9iNFkvTUQ1T3N0UFE1MjV2UEtHVzMrRTlydC8gN1JBRjgrL2JBZk16SmxHMEFSSGpkU3JoZlVlUTFoSEl3YnV6N2dyVU1DQ01XeU5RS3lxME13dDByai9DU0w4MGJ2OEEyOGZOanBQciBhdkhsTDZxa1pVMWtUN0xNS1M4cjJFQnRoVGNMNUtDYkhsTGZKRVBUR256T1h3N0c0KzJxcGlzMmFtcjR3c3dHRTluallBSDdBQTMrIDRFYzVwNlBMNUpYbjE3YlNxN3VEYkxZSmpVMEpGcUliUnBsUXlqNHdWVzRPREp2QTlQZU1iUXFheHVNMlkrRkdabTgzdm13YitBL3IgN3Fvc044ZEhkVEpXRGRPRWExRU96V1NzbWl5Q1c3MVhGUFhJVVBURThPK1BreDhYSEM0RWdEZ2VCcDVQMktEQmlPRUNXamFpQ0EyQSBBL0FBSFZoTXUyRk94aW1kWmRRVFcxUERibFp0OEIyUzJHSCtKYUxZUlN4bnorRzl3RHpFKzFDSDVhWUorbVR0QXN2bUR5OG5PRTNaIHB6ZmdCOEFBUG53RDhmVXNkdWpCcVNLOEltU0o0Mnl4dmNSME1ackFZN1VjUGs1Wjl1TlJzUFZzNGJtQ2xsNGtFWXNPaVA4QWJuYWwgalI5bzROZEI1QmZtcERBZWJUMmM3T0U2cTlwUmhydElFNFBrVVNyaTRiZ0hmREZ3VW5NK0hYSitlK0k4emNrUGpPR095QkVmRStnOCArZmdBQis2M0dEQXV2bzhPbGlpM0dhak5EMXU3eUdyT1lObWxIaE44QzhMUDQyK1dTNEliZytITExYNTROOEdjRHRFWXpuQW5nK0FuIDE5QjRDL1AzU0hUeUVoM3VCUDB0OXpsSmtzeHdDOEhQR0t2Yk82SUYzR0FLZklkeURGRFh4RElWdlFKNGVCVlJINVFWN01lS3I3WE8gMndlM1ArZlc3MC9xN3V4TDR2bjZmckJEMzhlUEI2M1hsZXBiT3RqZUpVWFRnK0hzYlFaTlFsYnNreWs3Z3dPSGsrK09Ock5acTl5UCBMenZZUUljd2ZyZDJBQWcrZmNzalI4Q1Y4eldjYWtSeVIxV080dFA3dWNlZklZLzZVSW1ERkN5TWl1eUpORzJjY21PQUpVMHZpeFk1IHEvUFN5SE1oWXF1SnpCQjAxRWJTT3RDZXVzejI0RDd5ek1tYVFkRGcvTG56c3huQk02UzRHbGh1bEM4ME9TWWhPYm5CQmN3aFB6R1YgWEIrbFRQZ3pCak9vdHZzKzBLS0l4YTlzNnFYR3gyb1lMaDRZTUN0WTlhVS82c3Rjalk1b2xMSEhnZG90UzA1bHlrWlBGZzgwWVhuSyBhN0FHcDBsVlNRUHBad1NnT2ZHM09saFlLSG82MXZITWVnMHJvZlp5ajRya3BvVTFDd2Jyb055WThtbEpva2NtandhdWhkZkJyNEhSIDZZQmxXMG9CbE1ZRkpyZG9zNXQweW84eXlPRU9CNTkwNFl0SHZNV3pGa0I3NElMZGpQbFAwUFl6SXNyS3UwZHpIaXJnZ1JIUHZ3QS8gc0NDZzBIMXZSNnJxTlNIdmVWYXR3VmRNVjNZM0VyZTFMQ2FFaTFLNXRwSWNuTndZREZWektmcXREcStaQnVuem5KN2ZwdG8wOUxJSSBJRVNRWjlCZmo0RGdOUmV5MkYzNW1aVEFORnVXbTlTdFFEWHNkVHJmT1E3UWJMZ3JBOXNLYUhjSWRrV1ErUGt4d2g3OHdBV293ak0xIG9GR2JmRGRYSktPQXFMWVVGQ0FId0hYWUx6TDhud3pDdlB6Z2cxRG1CR0c2QnJVd05oaTBMa1NCWXFhbnAvRzYzdFF3bjhxYlY5dGEgV1FXczNKcHpSaWJ3YjVzajkzZm9QUGorSitra21WQWtVVTJuN0k1WWhMSGhIREllMU5oQ1QyUlJxa2VHUTlvYkx1b1BrbGpkaXp1bSBvTHV6eUJIcnpqaUR3YXFtQVB6eWE0NTJ6eUF1TGhrTGpJZEhQZE9FaUphU3QyYUlVMi9DbTVVcE5tZkRmTHJwU1kzcCtPQjZyME5WIFR5Wk45S00yTHk2cExzRFAreUVBL3I3cWZ2QmJ1UTlZaWZLYUtOQ1VEbTV5a3AxdTFFaUVSYUF0Q1FMdHFrMStIMjNjQTZHdmI0cE8gRTlIWEdaNWFLdkZySjAyN1VtY1BuejRBQnY0RUFBVE55eE5RRlN0a0pjZHoycXVaYUEyU3BvL0d3NlBNQXhaWUZ5bUVHVXd0OFBENyB5OEtROENEaGxHWkRLY1ovL3dBQjkrOCtiV3BYYXZGczI1clFBbnBOYm1Va2E3NUdkUm8vVGd0eFNnaXBkbllIQXg0ZUducmVEYTNnIFRqaDJ6VjJnWmI1emhJVFlIMjNlUG9QZ09qdlVUeDR6UXBHc2tJdFY1dmN4OGhnWTJ3Q2c5OGJlU1JqemtDWXFDOFR2MllpU09RMjYgeWNCa1phN01hRkd6bmZoY2U3c2gyQkkxTjNvTTA1M1Rrb0ZlbEE2a3B0RTBDbnhJYXNVc0tMVjh3ZXlRM0FPdG1QbVZ5aDJCUFZvWSB6bERSeVpJZHRrQm4vd0Q0QStZTDdJcHRGZmdaNVN3bElRME9Gb3NNZER2Z2dXMnRvS3BsWHJmQXBsUHZ0Smh5SHdRRGdlc2JjK0x0IENNOG5EZmE3Z1I4L1VXd0g5ZzZjRmlVK3l2a2Q4MWFSZTVEaHFNc2l0bE1obk9HZytZK09WY3BDSGFFTWV0dzAvVUpjSWRnTUk2R24gZ0tyaGNaRjA1VUNNY3RHcmtsNEFIOEg0K0FQNy9naDZub3ZUZmxhVDJTZTVOVlhKSjZHMjNIVThNUDJuY1hLVmJHd3JhKzRHRE5WVyBwTUhRdTB2YVJIRDhaYUJaTW5hbnVFeHhBUDJ3ZTRBQjBsSGlpU01hT1pJdE83ckRHclE3dFRuZ3hnbVNQeHhiZURZN1JSdHJ4VHRMIEsycGgzcG5RNnhodXpSYmVuYkdzdHAxdVFVUkpHYnc0cGlHSjZoaFk5YnlyWWh4UTJjcGFoSUFkL3dERG9WZ083NE1pc0t2VXJnUGggdzF1eUZ0UGNJWVA5SnkzdG5GN01Sbmp1alNlLy9RZWZiQ2ZBUkRwSmZGelZJZVhOUmxlK1paTFFzNXdKRGEzTFl5azJ2QU1XR3dURCBQYXVINWxxN2ZJZnd5WXdvc2VjTjhKT2Y1SU93ZE5TWlgrbjlTSUxlVlphNDJ6RElGUytRU3M2UGJCZzhMMUNZSnNOaGZFOThNZk1zIENXcW9hZWVuQjBZWVUzTVk4SklURGY4QVlQOEFNQjFYc2ZWZFByRjhjY3N2Sk4yUWh6THNpU1Z1d2g4dGtWbktYWEw1Tlg1amd5VnMgdDNaVjYyamdYQ0JCM05HS0RHWkdCNzVzZmdOZzM4QjdNRVNscDJFbnZoWnlnam1LUTdlUHJJa1NTK3pQbFdLWms4TU1UMHUyZElJMCBYc2htanhHNUVLeUl2K1I0N3ZBZTIrZk5XTFlRTmdxKzFhL2F1MVRVY0cxOHl0ckRIMDY1eStwMlJ1anZ4ZGtUNGVDZWgycUhYdzZyIGhZRkRnekZaTXpSempaTms0Uno0QWZBYkJpQjZzaFY1eU9rUHI1V21VZVNSdHdYeHFIb2ZVaFNWNUw1YXExZmFUd3NPNEJ6RXpqZDIgT0JpZDl0VmNGbmk0dXpOanhOODQzOSs5bjdGQjd2Q3FPMkxGOFd4cDFUYXYweDFMeVJQazJ4VTVJa3dObGIvRjFqT1dENFFtVnZETSBCdzVBUFhDbGNDR0Q1TXNsTFFSbWJtdTluVDRCQmZnQ0RzQi9wUDYxRk8xRmRvZk0wenhMT0YxaWJLc0JpbjQ2UW5sRTFUcStLWmNOIDRULzV3Z1kvbjRGalRCbjFmazNoQWh4K0FIejREWVBQNWRRa1dzbmgwTDZmY1RUN09zZW1HbWtFNlN4UzZhRGErcGlFNGwycG85VW0gWjI0bk1ENFRTU1J3NnRNMzBrRTJvam1oRHk1YVJvU1ltTHdOVzlNcnl3eSttdEpnUWk3aFpySzRqcXlFTlB2QzZTb0lXQnpuOVZWNyBzZDJ4d1Exc2gySFRhNXNKOEtMZFgybzloNGEyNEw2Zi93Q244OU9UMllZVVF4YXlEQ1ltL3YzdDU5K3g2cUt2MWZZbTFqY29YWHZKIGRJMmNFVTNDMm9ieEVzZ1c1UkJaNThIekE1aGJNR0dCODJHcjIxSCt6Ym9qTTIrZTd3ZkFjLzhBMkRxQnJ1L1piNFlQSG90d0xka1MgcXhDTDFINXg1NFNGdXhuTHMxMjNZWEJiVzYzbWJndDdDdmdYaGtKakJmdVQ4Myt3ZnYyLzg5SkxBMVVBNU15SFZWZW9iczRXVXFrdSA0Q2VCYVBZWFY5aEFTaGdldDQyUnc5REgxdThZRUcyRHViTXJpN01yTDZUc1g5Z1FmQWRPaWJ1YzFqZUtxU2RVOGFvdDRDVi83elVuIEp5a3hUZG9Vblowa21FS290OWxMWmxiYmVSWkh4TG1HT0tHQzQyeEFFWlk3VkVCbXpOWnZpbUdaRU5qK1pxaW1HUnNuVGhaR2NYZUMgeGpTK1Z1NmtTZ2NlbnNoaWszemNGdTFmQXRRY21zaTdQV0JmWk9rNnVCNy9BTDlpZmZ0LzZzaFY4Z3hZSld5QXpHNExlY2tBa0IzZSBBOTVENWRidVhIajJ6ci9BNmZmTElUMkRmT1lOdXp2TFB5aFoyUHVqcUhSMzd0RnNHL3NISU4wZlBPSG5SUHB1MzcrSkljV3lRakF3IEpLMlFpY294cWg4c2FaWHhlSFQ4UndsMThIcm10ZEo5dE5UM2d6TkF0YUpuT0VoRWI2Q0FBSHo2L3dCQk1Oa3BkM3NRd0xTSzNyZVogYXA5a2lORmhUSy9sODhwR3NnS3VocDdJR2ZBNzRIVDRkcVFLL2Jad2F6R1o4VjNuZkFsWEpSejhSQVQ0QUFnOVJ0dFdEQm8xbGpqUiBKdDJHSVZSN0RMdExIczMzWWhoTm1RUjI0bklVVnFMQ0ZObDVJR2dDVWgzQkVrb2pOM2VlOEFHNHhLWlVjNldCT09qd3BJNTdGY2NMIGptV1dlU2VMMm9uMlFXM1dLN2k3a1pCOE54NGZNMi9DQ0JIdmlPdHJCUGk2eU01czdZZ3o0RHU2ZjM4K0F3bUppMktiZGhGcEZrYWsgSmpHdGtpdzlQVDFkSW1WZmR6dmFCNzYzZzRNbkpDSHptMGUyZzJURGF4YXpabXhtemJ3QTMvejZENTl5MnBEVzRFZEVzVW9ZcVhUZSBodXQxdTlYcEtxMDN4all6M1EyQUthUldwaWZmRmNPSkQ0Q25XRUJxcmRuV1ZpNDJZbWNDNGI0QVFXQUFnQUdCQWZrS29BZXhDQjVUIEQvNFFkYnhVczViVXlFeXQ5cVpHZ1hVNTVYVHlIekxVMDkvY09WTnBDcFlLMk10L2E5ekI3NDdjK1FrRS9zREFmUWNkY1RHSkpURWQgT1hNejd1cWtjWVJnWTRxNjE3SkxiSkw3eW83bHg2VStiT0dsamQwSDA4NmJYZklZek1rVXBFZGk5cmRSaWN1U1FPUFBUc3pLN3V5NyBteWszS0JjeTN4S2dVa3RJc2s4WTJjRFkxaFNtaDlIMXVodUJod2hXRE1WWitvQ2U4c25Ca08wQ2V4cEtUYUlQWUg0K0FBYkJ5REpnICtzNEQ1YWl1QlEzWlZ0QkROMU9RaDAvSXRpay81czZMRFYvRGNIQ1pNY0xBNXh5QUNEdFRjNmE0TWluRGJzRTU5LzFBSCtwaTBIQ0cgVXZRUFlLdW5YWmMxVlUvR2lNQUVPOE5sVnRGY0ZxdkYyUVFUM0RHeDNDWnkrNHFIcSs2VWRQWnY5VE1VYzM5NDU5d0gzMkRwQTV0eSBMYTVxWXliUVZ4bzNPNFJKZDJCVkEwL1owdzhlWG90M1dRd0o4eXEyU3lJaEdaYWtCUGdUbVRrM2VVWjNVcTYwYXVPY0JQN0J6N2YrIGxxcXhLZ1JFd1JBNmlOYmQ5K1dTVWhaTEcvdDJGSndqeHNHam5TMDdiaE5qdmtySi9ONGtWeHgrVDg5UnNkYlM3Zm1RM3l2YWZzaVkgZUF5V3d3eU1raXdsdE5BbFlxdStFSWI1Z0hoekUrSDc3ODhUSGxtRnE3TnNmdC9zRUFBUC9RZXJFclV6OGJybEk1dEJJTElZY1ZKVCBSNnh2NnY4QVVKZ21ubElvaG1HKzRCREl4cmJlL3dDRUVEWjl0S3ExaWpsRVBIM1NRZ1ZJWUVIa0Q4ZTU2Z0w2VWVPWUpGZjB5dUFYIGUvUUZYMjFhSW13SnVTUEU4eVEzZERWMXNmTVQ0YTJ0dmhBUGNVQ3Y1OWpQaXlNNVJ1YnhWeHVyWGhCKytuejlSUDNSNFVyTjB0VWcgZWlzZWN5YWU3R3NoU2JGOGtTTUwweXVRSWpVWkZ0UWUrTWdma2xicjdJMUFTQUhBT01aeWd0R1dkN1NYYkRmMzdEQUIrd2dqcUZJUyBKMFROaXJ0TG52OEFDMjdydHJ0NThiMm10L0VmcW5yUWR3VjNJUHRiQ1BIR1JheUE3ajN4Mk51VDdjajJtK2pZV0x2VE56RU8yc3JKIGZ4cFFPZ1N1ZVRCNlFubEZkVGZNQkJDWW5tQTdpSElCNjU3ZjFOWXpod1o4VjNrWitwdllLaWYvQUtEc0hYRzBGS1RkOWhGbExEc2kgbWEwcmVuTENzaGtQTkR2Q3RyYVR6UVk3cUliaHBMWmRKWS8rd3pwak15cTlYMit6QXdaczJEeDd1b1BnRCsvcGt3UWE2ME1hYVlHdCB5bjM4eFMyVEpzMWdKT0RSWnR3V044VGRId2VuOTFFL2piQlcvTFdIbkFkWldVUERqR0d5ZDhNZS9tLzgrQWNCWVZacGZvK1pNc0dnIG9lb2VuNjV6cnN4a0xhcThLYjVLYUY0ODVReUh3NjM3cUlkWG1LZEFzSDhtalhrK0MzblkzWTJrMm9lQUgrZkh3R3dIeVo1TzhrWTUgWStqakUrNVZmMUhobGlHUHh0TTk1ZDlVdHJSWTdKODdUcys3L3dBdlp4NHgrZDNQemtNQWw5MlhiZ09IcWt1bXQ3KzFTYndrMlFrMSBpU3JJaGVUNFgrSFhLdFpyMjRzcDh4aXlPQ2Voa1prN2NBTHh0Wk44YU9USTRSSjhBL0lQNGlQNHNIUzNoMlFITXI4TklGN0k3YmFFIHJLUVlKRUxOUkFNVklvZHlRL2h6TFVNYWhHUmc0ckFIZ2JHRGpFWW9yM2xXV3liSThiQS9IOEg3WUQ1L3FzMjRiTzByb0tsQzB4ZW4gVU1DRjZqSmRVTFdyWkt1R3UwNHRUclJaS2N3dWJ5eVB5d1l4VDlqSGVyRUQ2NjNJTEEzMGpNUFU3SXZyOWZwUEg4YS9RZ09HTFdJSiBlcEQrQThrTFRWUjJRLzhBaDlraVZzUjZaY0ZmaDc0K1ZsRmZMSVg0ZXBEZUVPdDJGd2FycG8rQmVFUGt3c1h0bUhDUW0vMjc5K3dYIDBCQjZpelRDV1VOQWdScGsyR1I1UmxCSmUyWFdWNXJrVUtjblVydVdBUU1SMG1SSXl5SkUyVHhiVFRMVmQ2bjMzWnJkTjhjNEJQTFggdzVzdExLV1d0alcxalQ5L3pXUnRZUjVLd284UkRjcXZscTZ1aHI5Ymg5U0NHWlErSDl5MDk4djdjMlo4ckNvRWJBSHNtd0lQOUFnUCBZL1MwUElGclpocWJWZXdtMm56d0cybmNlbjhmRW1CZkhuSTgranpDMlltVEVPOEdTRFBIbmpoZ216RkJiTXNnN1J3Q0hQNytBKy9BIEcwdm1YaXVWTURhR25OdzduV1dOTjBqL0FJS1NQaUNFTW92Rkh5bitOekRBZHhyZHhETlRiZUUrNGtOR0o0cTdNVC9LSnY4QUVXd2IgOXo1QmZkM2VTbzdHcWNPTHVtc2ZtT1dTTlh0NDVRV2ZHaERYbndXaDhEbWN3bUIxL0d4Z0xlZTFGdUhkOW9WK2M4SmRqU09mb00rZiAyRFlENEJhTVFzZ1l1NkY5dUowanM0UkVVckxsd1JueHp6ZGZIVHBSSEpMRVZrMm5WQWpwdFJVS3FpVEVrTjNiZTROVmNFV2JDV2pMIFJ6eXZUOXJWOHlwSUpjaGtsT3Q0WmhQWHBqazVMemtMZk9OdUV6VUlodzluNGt2MXBPTU0vUExrWmxsNDN2WXZhb3RoMkJCUG4yb2MgdUJnVGU3VlNnYVpTWGFLazBtdy80eVRZRENZRnlvaFNrV1JnMHh6SEZEMUNKK0tlcXRxZ0IyZkVYdGJ5TUIwbWI3VmdBR0lEOHVvSiAvcUhCcDdZR21WTGJWWG9kU3cxeThpVHZIc2lqTk43Qyt4UmRaV2hWODBoVzRjd1ltTGRmMm9qZ2EvUTRJZmN4ZERqR2M0YjN6Z1AvIEFNQWZWVVMzS0FSNWFVbTJVbktMdFlXY2tSRWV3UUZiNG1KTDNwUXNmbUMvVlpkOHJpdUpZNkpYTmxKOWwxWWhqR1ZYMDZXV3luYVQgU0hiWUFGdVlBUUI4L1VRQW80cU1Za2RKS3RVd2tpZTNiRXFqQ09SNnlJTkUxV0pvTnpWelNSdGFPQkJsTUNUVXN0eHZSa2VvNG0vaSBLclFKR2U1d1JpYkJGY3htSGtzOVBYS1RqSjVSVjVEWDZUbk9ERE1mR2hoS3hVTWdHZklZaGJNTDRkVmJXQ2VEbWNaSzduZ0RxN2UwIGZnSUErL0h3SFQ0SE1HbnUwR2hEcVdCY3h1alJjTzdPUDF2WU5zRms5OFRhUjBsbEZzZ3Q4a2gycEMzaWZVdDRBZFcvY3g1UTlzMk8gcmtrMmM0Qy9XN3NEQUEyQi9Xb3lRek5Yekw0S0lkRmFuTEJ1YU5NdmhWdE9qMkVQOFhTSVU0SHdORHA5OHBPRzRHSzVyT3dKOWpZRCBIa28wQzdNT0ErNk9MOWloZS9nTi9ySGRBdGdWMnlxeWFHSFcwbXdiZ05xYWZSdVMzcnllVXRCM2NqMzRyY09TTWkyd0xhcTIxL2RMIFV5b3JPTCtqQkFnUkpCZ0g2b3VBdndEd0NsbWlta3REcUM4ZTdNc3p4NzE1R01sTjNKTndkbzV4WEd4d2I0WmhMcGxXVTdNa0kyWVogVWJ1a0hCQ3M0L3BYM1VPN09pQVJYZFBFWmxJV1crSG1oOG1ZVURkMU1xVFlRQTZycS90anR5ZXRkTlY0WkJiRHNqZ25yWkRuSDhVRiB0SEp2WTFEcTlaR2Y2V3ZCOEFncjRBQUEzL284YkRGbVY2UHJHeG9waEFjSHhQMHVxWmpKRGg4VnRvVFpaK3VuQmcwOWg2cnZpdHc5IGdWczFBYmdBMXpaSHUwUGpNekhPNkp2WUFBQUI1L2dPQ3F0UlhzUnlaR3F3V09xNHFSbEJ3aGFObkh6Rm05N3BTbUxybDg3UHpBN0kgSGZMZ1c3VXN1djIyMUptTE1MMndtYys3dkhJT1FZb0w4ZjZDbldSTVVvNGV2bWltYTM3cXcrUTJBSFBWK1dmTVR6Q3J1Uml2OU4rTiBidzYzTUw5Y1VELzl2RHM1UDZ5eXZHTHNjZUVGQkFmZnZBZEdZMkVrWTFLcHFFamhPbnFWTUpIMDdZM0cwMERReXVhVWN6Tk5qZHhpIFBKODFiekxrWWh0NVBISmlEMkxKRmxneUpReHJOckZtK09SWE12WmRXNU5xSGh6Vy9vdWgyRXd5RkZPd3poR3BzVllrQ3hsakttclkgNDVpaXc1MTNMWlI1WlV5dVpSaVZYcXF5ZWgxZjFJaEJWL1ZsSWg4S25SUXRmSk9kS2QvdFM5bUVtS0RKZVErSVFpdDEwVldXZkFIcCBGc0UyVXdYVk1NN0xMc0ZsTWNnTzNGajlnekowdk9pRk1vNFVpa1VnUVBCVmJsZ0ZrWWhEbDhiblZ4cHFDaUZCL2FNS0ZWd2hpZ0t4IHhMU1l4b3VacEVGS09mSCsvVnZKdU96blhRQXV4WTgzeVNDZkREOS9INS9QVmpkUHVxKzBOT3RscXQ1TGsxQnMxb21EZFIwZHFyaDMgYmJJT2pJYXVLaVlHV1RHNElrS24vd0NmSGFod2pJeTJaV0hwUnhtUHB4d0I0K2tGaGpoeUJmdDZmQnZHa3lzMWhLcm0zOUtVYytyTiBacStMSFRuUllzS1ZROXNpRDJBZkhnbFdGMXN1UURlcXkwQ21Ea1N5OE1hYVd2VThPdTllbW9RQzlVQjNIL21Bc01ScHZtWmM5eDAwIHJtcGJjajFTZ1l4YXYyVVBpdlE2NWZLbmlySDU0cmR3UXc1ampaditGK3RONEdET1VFeVlQOEpvNzkvUU5CMUY0RGpvdVJaRnlqOVEgWjZldDIzYWpSM0lMWTIxTUlyM0tKVzZhZlZ1MEhDeUxJdFI4L0pGYzFvbjc0eU0xWi9pQW56WTJrbkY4K0FBYy9QOEFUV01VY2hqRSBzd2VOOUt6Z0x0WHU3dUpidWZja09Kems3Y3UzdEhRQU15UWxzQm45UldENTFzYkFOOXExbHVBajhWODN3VlI4dzRoMGZwTFk0cWZXIDU0ellYeEI2VGVWWDN5dFBsakZtZ0N5ZHlONFpFSXg5cUEzaFMySWNuV2I0VWViTUJoT0V2SGFJK2ZZSDUrNkQ3b0lPREhIVzdHMWYgRFNRMjMzeTJraTBJZDhENjlsbmdOWkMzeHdYMXRsZkhCUFpIQ1phaDZuM3lqLzhBUzhYVUF3SGFJTTNWWUJDZjhENERIeitqVFlKcyB1ZFpoTE8weTZjRkZaelNTRFlET25VRWtNU0VLc2IrSFZnUkgrcWJlcDc0ZDI3eDNNSTFQRHUwWFplRnh2TytlK0lSZnI5QVgzOUN4IFBiQzI4dkxwZDNRMVZpbmtxM2FnT1RWMXNhWDY5VlpGVDlrYTZiRTBBdHVFeXQzd09uNEw2RzFJZG9VczhUQmxtUGxvZWMzdDI0RHkgRHNHZjJEWUFDeVJORXM3T0hDR05ZZ3NWeG9rc3NxeHhhZEo1NG5rVGV4bVdVSENveXBPYkFNMjRwRW1LQjNRVEhHVmx6amVvb0l6OSBVMlF1dG9HUGpqSng5dG5TWVI3Y3JTaHcrbjJvSFdUZVdnQndmNGhFQzRWdXB6S2IrV0xpdmhCd3Nod1R6Q2VRVzhLbHZEL2N5djN5IFpuamUwZ0dnOEJRVUhwRDZmd1pqdVl5TGxEZ2JhZTJpdlFnbTZKaTVHcjNoc29URVBNWkN5TzZrTms3Z0dNVzBlUDVJVHdmTFFXZUQgaExzU2RnQUFQN0J2NndWN1lPYWVLbnNtcFpXVFc5NDZlRG8wUzhXRUgvS2dHMmhKU3VVUGdkYmg3cytac3pVQmNGSnEyeDU0dldlKyBCTjdCZ0FCKzNkZzMvbjFoYlVmTlVHYURHdm5OcXVXek9IeXg3dFpBZXdnNmJYSW1rZG5IdzNEU3VITVUrd2VmSG5vTU1ZVEZxNU41IEJkcjNZNC9iQityOTFOTjlUSW1xTDZXTk5NcnZsTWg5Q2ZieDlWNWNmU2tlemxEakp0RUQxSk0rMEpoRXV5NnpYTW1BZGNQNFpKZmMgbDVkK09BNTdTMStCOHJHK1FhM2I4ZFBub2RQcVdrdERKVklwMlFlZkdBczRORVZzbEZLcllMSXF1eUE3S25rTUxVZ09GOFRtUVh3TiBXWi83MjhmL0FKdW4zN1lIQjNQY0w0WDhuTnNhdDBBRFBNU1lnZEpoaDJ3eEVmQk1wOFc2L2NPSHd3NGNjeVRqK20rZXFwNDBaVjZ1IFRKdkhDZUQrZmZnSGdPa2JYOXNXNExwdWphTTArMVdiVDBmVVUydTVEV01OcWNzbnRGYzdXQnAvdHVIWTZUWkM3QjNVVWtEK0hKODMgTzVQY240UUp2NzhnOGYyQS93Qk0zTkl3MXhQSXdBTi9hWGM4RFhGYjBsUHlOd2xDTVQxZTc4eU1IMEtyT1I0UkxGdGtkUHNheDJkbSBzOVl4S1lHamFVRFFIMTlQZ01jVi9Eb0lHZFlvWTRFMU1TUjdrTU0wczBydSt6TTBUU1NQTzBza2p2Z3JNelM4V0JYM0c1UXJ5U1NoIG9TN0pFNzdBeFR1eUFBU3poVkhtemwrQlhRSStITlA5cWthUzdRVU83TWdiSkNhZTNpN01tUWtRd0o1c0tBWmhEa2tNTytQakF0N0Mgd2dmNlpWeGl5VDJUMjJDb2tBK2c4QjZ2STBLNi9tc0I2L1FzeitGNERuY2gyM0oxSWRxaW5JV2hvbVYraG1ROWJyZS91RTRDbm5uaCBrM044S0xPUENRaHo4dkhqN0JzRDhnZFVWVjJWZnNLWkRYRDBOQXpyQkczWkx0QnFxdVJ6dzl5Rlhpekc5UDQzRG1RK044RDRHand4IGd4WEZzek1EQ0cvOS9MNTkrOTM1KzdCN1lZelhCVmR6SzNHZHMyR3R4RmNhdHNGc0dLbE9pYkdpc2pBWW1RdzlrVE40Z252bzh4bTQgSFY3TVQ0VWttLzM4QWZQK0F3TFRReXltSFBVT1VqaGJLVCswaHVSM0hqUmtPU1paMzVOWTRuemx3eWFhTm1sSWdTTjlSdVl4NlUvVCB4aklyWnFwT1Y0cnhaSjhkVER4UTlVVjh2cmE1UzZUZXRrWG1BcTJ6VmZWUU5yOFN0Z1pTUmNndUhYNWluNGFITWhwNWc0MjErZWVIIDBZVGZGY1k4bk9iSlBhSS9zQjkrNEV2OVBMVTVNcXZ2UTFMb0c1a0ZrVnpBeTdsZStOU0ZQcnhjREtLeXlrd2U0cmZlQjhUeURJOFcgWDlxcDRZTUZxNndzK2FxN2Z6NTkrQUgzN3BEckZMZzhiN1ZXaXBScTNYMXFWVzJxWi9BeGtOaklCMVFGanI1eUNJdVBuSkptOEkvYiA2QUVFTXl5VmFCZ3o2U2s3QUF4UVQrSURnUFI3WDlSMS9wOXJPd2pWZk9BMThzRjI3eHZHZlh1b0dKYWtyNGxvV05NSUo1aW42cjJlIHIwUDg0VDUwS3N5ZG9DL2ExQWp0andFK2dmaUorZmo0QWpOdTZxU1Jaa1pGUTVOZWM2enowMGtFL2ptR05kUEtrbjlUZmNZSnRYSXMgdC9kbzRuVjF6Y1NOR0Z4MDdJaEFSb0RaOHlHZU54WGFZa2JuTEZlS0d3U0lCaVpBVXF4UUdwM3lZc090ekdkZzJRN1FUSzlxWFVaViBhL0RwTkREc3JJd09EVzI4RGFqQk5HUTJnWVQzdkhZdUE3L2ova0FOY3UyTFlzWmdaTU1xb0tCcjF5c0prbDEreVRhL3JJd0xsV2JZIDBXazE5YmNOTjYyNFBpL3NZRlBucXFHczJZTEtEQm05MWNiZUFCOUJBSHovQUlCZ0VEQlNQUFFxOXVtcGFycmN1QjV0MlB6aHJBdlggWWhuKy9BR2E0UTdJTU9CaDhZSmxqYmUybzh4WnZKb3ErczNuaENTYitnbi9BR1BvTDhmNjNXQkljR08yR3JOMURtSXlTeG1Gc1RncSBodzlUaDR0WVdGS3NhWXdCMXZ1UXlwN2c0WWtDRmxoQTZ5VFY3UXN3WjNSMlRmOEE3OXdGQkFQM1MzQ0xna21aMzBWNEVTV1VidjhBIHpDK21nZEpabzRza0RTS0gyc3hhamNGaWhvTmk5T3N5eFNKWHRzMnJYZk4wZUtIenp6MXBReUNXMFZuY0ZYaTlLOU9IcTVNV2pwN00gM0NlanNSaHB1NWVUWlRnbnNreVpUN0pjRmYxWlhKQzBEeXFoRTFsWEtQTHpzbnVjQUFQdjJHLzcvTVhKeXpUY2xaMEJ0cXNiWVF1RSBOczJwNk9oMmVXdUNrYmFVL2kyUW52aTNjSEF3NCt0M2g4WHoxTzNBc3JPMXMyeDdIYVg2b1BuL0FOL1cyK1dRQkI4Um51RnhwS1JXIDQwUXZtRDVENWhROEpBeFdSd2hWV1loUXpISkhpZXdBWjNKMGJpL2d6ZU8rZWY4QUFiK2Y2TVRDMnlhM0xRTVZKS0R2OTJYN2MzY0sgMGJDc0llV1cwMG93N0N0Zk1RM0J3Y0szWUpsT25oOUxlTTdYOEdadGw0VGh3SGYwRStmUGdPamN2dUJIVjQ0VjhGNWQzRExHeUJnZyA1NHZrV1FQMmVnWnJXUjQzeTFMWTFrTGpmODVwWXlJdWw3aDVJNTg5THlvTmJlcWRKckM1TkhGSTBtT28wUGNtTkpWKzB1eGlMaVR3IHMxb0I3aE1mYkltMlBkYml0emEySGFscTRoNERDYUVVNXpWd01MejFncUk4QXhQNFlucnB1bVd5MkMwR0Vpd1dTU2VuNlVVbStkUUYgL0xkUHU2MUZLYWIwMjBDNUF4YWdkUGZVOWc3Vm5rK0FFTURDYXVockt6dlp0SjM5Qi9yNC92OEExVXUvSkdveTFDQ3JaYjRHR2dXaSB2Z2xUeDg3VVVqL01ReGRoQWs1YitKVzZHK1RFTnhXMVdCOENxK2RjbkY0RE43QjdIdjhBc0FEMjYwejVGRjVYRDU2a2t1dGVxL2JaIElWMVVEVzdZNG5wUzlxTVEyVDVrelVoZGx3ZnpoekFoWlp3eFdaTm80eWpmZGtqWUFBRGZ2MzgrdEZTTlk1RU8zdVd6cy9kbkoyRm4gbW00cThoZ3VCcW1ObnBzVGI3T3N2S0xNc0cyYVNRSURjUWRRTzNia1ZIRms1aFN2YldYVGdxTzJJOWNyY09LQkpLS2VVcnhTcHlPTiByR3lZamh6S3ZiYWxMZXp6RS9UZk10UmhjSGdEby84QW5kelNaUGMzbnNsL1gzZ0VId0NEMU1XUUhqbEJlU3J1N1V0MzlBZkJydVlyIDEySHkrZVdnamdWZGtYMXZqYWZNTWtNTEduN0RPY1NmaTNsbVI3Unh3MkR0RUF0MUJBZUFTVjBXQkRucVlldVUybnY4Rm9XMzRzUWggMmNZU0VNOFVkN0dwdDk0ZkRtYWU3VGg4RU53S1BuenBiTnlmRjVaZnV3UkhBYitBWCtRWTcrYng5VGJvNUw3Z2tCcXgwMzV3YW45UyBGbXlGdWdVZWhsdVdVaVdNMEo3aERjRnVIVDhPd0h5dVh6VGZzY1B4YlFVOTBxcnJzZUVFL2ovc0VBZzFodHlJU3VhYzVOZUlTaXRjIGM1Wldma1ZqODN4SGNTcVZkOGFLa21peEVlM0RMSTlDcnd6VVZZeUp1eGRBa3ArSGRqR2oyRUJ2M1VJeWY0UUdTV3E1VUpLNVpQdVQgc2lMdVNrMkMrUEQwbnR5M09iUi9tQ2JNK0lmZzlrTjlvdnNBRGdJRFlFUFJiUmNqdlY5ZmFaRmZWYzJwMVFKTVpzY0FMNUhYcTN1UyBwV3dYWTRkZ1c0YmhxY2V6QytZZ3FYRW9LZTg3WHprbURDVmNrbyt3QUQ0RHdEOTBhcGN5d0xBWDdhalpWRDZrQU55YWV3bERPRGc0IEw5M1VPcmdValJ2WEtmWDVoa3haQTdnUVhQOEExSWFkNXN4Wlp1NkN5c0hMUk4vNytQOEE5L1lHVFZiQVBZem1yVHNqcXVkcWxxcFYgMUlLYkFubUtYdGlZbXlsM21WYjJpK01scVUvVDRmallPeXEvbjBldHZLeStmM3MzKy9nRC9nTWNlcmY2ZVcxYUNIKzc2bUhWYWVGViBxT0xWaVZJdXdXYTJOME0zbmNzRHNxeXhGZU5GcDVaTjJJeFRNWk8vVVFISEZuY3FmZGJFREU0aStXQjZwbUR2MUhERDlSV2FadFIyIGZFZXZLdVlYaTJtcFhYbHVyM0ozaTJNK0wrbnN4MnJEN2V0d1h4UGJaemd6UFBGMFpaQi9pN3o3OWJ2UGtFQjFibEJkYTVESXRLUEcgUkx0bVJSVk1NYW1qMjlxUGd6WHowdUVWK2NvVGpEZTczeFVZVDgvSzF6NFFRa3lzck12bjFDL1NGT0F6U1JzT0IzSEZCQUw1OU5BaiBBT0JVWWV0R09wWk5uU3M2VVdUM2I1RERpQlRkUWdINGpBWlc1aTJ0aHg2MU81Z2hid3NyUGE5NTN5cm5aSkJnTGRRVC9QdW0rakxGIHFCaGRCRk5RUktQVmFhZFFVaWZYdDVHUkRpMEhuZlQ2QmI4RkRUZTRTNlVxd2M0WVV2UFVxNGlNeE5EV01GbElCbXppUGl2di9IOFggMERoZ2VvVnNYTWF1ZXpVTVp0dUp0c3NJUURwNG5TYVdlUVltNUlsVFpzWmh0eGNWNmZ0Y1BtVXB0R2xreVJwNk1vazlTVlpZb2xqZiBDbWpsWUJ2S3QyTURYeTZMOHpKNGZVN0tnRWlWa0huWmtZYS90U3ZiQVV6RXVVN25nTjhNR0VQV0Fob2NOZ3A4NUFjSUhHK0RLNnVUIFd0N1NhdWVQKy9uMzVnUHoxQnJVTmpocCtvZE5TYWNKSVloa3IxSDFGSjdPMk9BRjhMUlFOYmpyVVpHUmtyZGtyNlkxVkxWOThiT1UgSnZsWFZvekhQTm5Qb1BnTi9QbjM4anZsTjJNTFBvWlM0RGJ0cTBEM0pMRHVHVGNFc3pLVjlRcDVvdFM4TElUNWdmZUY5d25mK29layBKaXp3T3J4bmF1cnU2SnpZRjlCOCsvZEFiUXJ3MUxVb1lUVzFQSkFaVU50ckt2MVVhMFM2M1BTcGNvOVd4Q0pOaHVFUGo2M2dodUVCIFZtRENnc1dzMllEOElEOC8va0Fmc0lyS3JUVE9lODV6TWY4QUZSWHQvVldlYlBueHgxQTdTT3FFSVVPekJFcnBudFJybFFCdGN2UFAgQy9INDZGU0ZxWFpQclBPU00wQ2JmSzFEa29nZEpTYS9weVpWNEhUM0tzYVlBdFN5TzFhMjREME5WUEQzdzQrY1pweFhKMlp6YndmLyBBSUZzSFU4dDViUkFZSVo2MEFOcFRGeW1VbSthM21wTlBxWWZ2Y3ZTcmtyY2VoaDBOa3VDeUNIYXV0S1BQSEhEak5ObFB2RHNENFB5IEFCVVNEM2RQKy9abHRsUHFSekhVWlh3MlQvT2Jzcm1GclVSV1cxMU03cTZ1WklJZGtCNFllWXdiRzIyQnNkVnJObWJXVEtBM2J6bUggbjlneHgyRHNkWkNuZkNHK0NzMEM3RWg0MkxVeGgyVlI4dVdlVFN3QVhhaEF3K0o3akREdUMzQmdMOERHWXM5bTFmakp3M2diQi9maiA2RHo0QjBLaFF5TW9taWwrZFFEdDZodmFRelNkMmNuSkR2aU11TzBkWDdNMmxsU1J4amxHNUUyQnV4VFdsWjF5YU4wUEZjL0I2M2FGIGpLZGVtWjZUb1ZxV3BWckFUcEhxVVBWNGtQOEFLdGkwSzUyK3lPOWxrVnNudUV6NEd3Zk1yUzhtbmMyYlpBbXhnRUgvQUNZTi93QVkgNGVIck5YTWFlNkN2MGFiR3ByNC9xZG9NZDVXd3B2bUl5bkFQTU9TUXc2R0gyOWtkNTQ1OHAxUEpveFFXTEpvL0NUZDRWQ2ZBZlFRSCBVYkRiY1Z3WUJ6VkpEU2QwQXhwWkE4WWNDMWtTdVdhZlR4aFBMaDF1R0hocC9GWUNlQitZODdXTEprL3UyK0lPd2YzOC93Qk5xekZOIDRjb2RlejgxMkpXY3h1MGFYWDhPWklsaDAyMnE5cTlEVzA5OHF1R1ltVnV2bUdvOG5nV3JjM2xYS2NaNXNiQ2JBLzhBZDMzUVg4QWYgak5QREpFckZGMHlSU01aUzlhdUo0b2pGRVZPSitvamI2aGpOSGNYOGFBc2NyVXdzYzJZdmJtWEJXWSt5ZU53TTBkK05tc1JSeGx5cyA4REhuZlgwTzJMM3VtNXp6SE1Vcm1pb1lSaGVOUWxuSzhReFVyUTcwMm11SGJjUHFvTVVPbmtFT3h1K0YwMDd4bXpId1dzUElUL1N2IHdBREEvc0hRUUh6S3pzc1hjRXF0TWsyQnJSd0pXRUh6ck9EcWJJcmxQbFZLeXIrOFVQZGt4OFQ1alZVaWUyd2FHL2lGS05CTlpPSkogdTdMVTdSSDdkUG42RDMvb1BxZWozeUxiQjVTbDV4SzJqeVMyM0dRWkh5dDE1azU1WG9zcERIN1AvSncyQ0djODlBV3hqTnVnc1ljQyBiMERQN0Joc0Q5NTlrRDRiYlhNeVk1VlZlVnRKK2FlcHhoTVdGazJSRER1WUNaY2o1WkErK1Boc2kyeU9ERzhXMm4zVDJUV2NiUTFHIEkzQnpmKzRINWY4QThxaTZqbG8xalpuY1pJRUFkcy80eU9mQzFlZkk1NCtlaGphOC9UenRERzNkamhJU3VhK0RlSEhQRjNmRlVRU3QgVmJKdGNCT2FuUFdmcDVwZzU2bWhyaTU2WGJUODVaN3RuNFpoNmNWOWJwTnpwbW1wa2dabyt4cEpTUStoUFd1Wmd0ZjJkaWhZUXh1YiBKd21HUytkYWF6VGJUc0d1a29lY3VlcUsvbDFzQ3lrT0t1WG94NTlCejRBYk9seTM4Q05ySlh6bHJPTkhxVVd3cjNCVDYwYUQzcGhaIG16TG5yVmxrT0JRRlpQQmpzNjNqU3hVTEtFMExNbjluN2toUEh2ZjZwYzI1RnRpTFBORHJIOVJJT01JZU9QOEFpUVBGRHh0ZnYveCsgNkkyU200Y0NtN1V1U2pQamRxbkRWcFpxUFc0RmdZWmxvVkxFVFZkUElPRmJzakpjRU53ZkFaN2lVNE04ckhqRm5tLysvajREWUQvZCAzcmpwL1ZvOEFWOXdsVlU0RXJhYmE5VW15dDNCOFYxTlBGTEg4RnRvQjZmNEhNVzJSUHEvR2NCc0FDYldpZFpxNVJtR1BHeUd6blBqICt3QU4vUVQvQUdJYWxWOFZzdFJTcURPTmh5aVNETE1GZXNsa0wweXIzeVdydEhiL0FKNFlmRENldm1GVlM0SFZhZXpEQlRRc296d0UgZFRhT0FxSzNWL0IrZmdGUkwrNUxZRU5YeXd3dXpLclNhQkszTlc4dEh5anpSM0lLTkVzOXA5ZkUrcTN3d2hyWDJRNEIxSVFHcGt3ZSBYeWh5YXk4VW1FcTMzKy9maUxybmF2U3g2dlJyRktKcDBpbWlrMUt4OFI2cU5iS3d6cHoyYmdTWmU0MVBERzlIQ2pyajFEeFN2SkY2IGMwa01rS1REbVNEY3dCa2lOQ3BCaUNyZkgvZnBlMkJiRFErTkNHK1Q2bEdwT1ZUTGIybm1FcW5pY0RWMkZObGJlWWNLMzFDT0RIY0UgT2RiVlAyMWl5ZjhBcWdGRTJiN3Nid1lQQUlQc2Zmais2dkxFSVhjTHRtQXh1Mi9Ic2wvTFZ3a3c2UGlHTWU3RDRNaHA4eGJxdlovRCB6a1BnY0V3c3JDRzBMSk1Hay9Sd0FEbjJCL3ovQUU0S3JGM2drVlpETTNtWUNaMUJhbkRaYTZFTXhWOHVIVW9HelNqUTRENGVNem5rIHorZVV1QndMVXQ5R0tLL3NqaE5rOEEvSUw4Zy9ZT294Z0lBMWVQWHRqSWV5RTN5YTdjd0pURTlTRGdVT3doYjRuNE1qSk00NEhJbUEgYWpiNEZxTUV4ZTFrMWtIVit5QXdCL0VCL2tmNklMY1NpTUkrb0VKcVNKODQ1TmtqdGpPSzVPMmZZbGMwZWVPYUF4ZHBadzdhYmVYZSBCVENRYjNLYmFaTnVWdHRuM0pWcitldnRxYWFsTklhSWNCQ1BOdHpab0g0bW44YTdTS25aRU1YYkI0V3RzQmd4VmJJeWJoTlZSOXdBIFhtWXpMTDRyazk4ZGpZUkgzL1lENERmK3F1NWpJaEpzT1pQaWh5U1RGK05FTWMySHBDSEZmSWpRQW1FRnVaM1VxdmNPRG42LzV3aDggRjVRekxJTUk3cE8vL3dCQThCOCthcTlnT3RvVmZjQWUrSHgvaG9UdFpIS05OTXlSZDN5cUhpWEk1UGllWVE3VWZHUVBBRGd3RGhQYSB2Nm9LRXhtOXBCdmYvd0Jnd1A4QW4rMlJXWWV1VnVIbFdxeUVxOTdZcVYzTUFFeGpFZkgwWGZPMW1HQmJaRStIRDdmd3prNGVlVmJJIFppZlBDYk5qK0x1N3I4ZzRnUGMvc0RqS01WU1VwMld5UVo1WXh2aUZhZVBFZnlZOWd5NENQeWI2RGFWSGtNSWRFTzNUT2xmM2lLV08gWmFGbkxiaUVaUEl2Nmo0dzcyRllscU5GUzJETFNDajVVcUdlemxJdkgxT0FWZXpaa1d4aFBjYVluc2xxVlhNUXpBKzFBWUZ3cVU1TCAvRi9hQm5Sd2dUZzc4QVF2b0o4K0F4RDdvdVNHdWF1T2Jocm1aRDZReUc3Q01NalZZSFBLYnErK2RQb3lHM3A3SXlPRlZyakF0bkczIGdlRXhtR1hJcjFtVDcydXdSNFBIK0FuL0FENEFBVzFkcXkwbVZQVlZzMW5ZQ05LMU1YbUdveHFFYWFxNHpZVEVtMU5TVm5rbk05T2YgUWxWdzU1MDJQUGVqTUh3a2l5R3UwS3o5SnoxaERDVGlCTkExdk13OVBydy9icFc5UHVTdlhySEVUeVVNQytXZ3c0bUdyVUJadGoyZyBtMkZTSXRsVDAvZUw0RHpIQU5PZ09DR2RyZDV0OXBmRm1zL0NoTmc4K3diQjRCVVRMSmJSeHVtWDA4TWN4WDAyb3VHYVB4dVZZTEN4IFZyeWI0T1ZYV3dXU1pDZDEwUnFCM0twU2FOWTRHbW8zZmhhczd0UDdBQ3B1bTN5QVVBMDROTTZoSFplUjBrdzBZYlhiUyttM2NZWUQgRnEyUnc5a1lERmN6MkNBcXA0d1g5R1p0a1NiUnhBZUE4K0F3NmpiWU9BeGQyTlZTMDNuWFkrTWJVL3d4NDNKa1ZrWXFVRHFFcEd4cSAzWUliZ252aWRDNDJEcVZ3N2pGMlpaOXUyZStmMzhBZVgvUGdFR1NUMCtPWjBaMWpYd1pEZjN5VWtqb2p3ZXpnNm5XOVh4VjZVME9NIDlQTVE3c2hyYkErNzlhR0hEK3hxRytjbVNEWVJKcXRCZmo2Q0FQZ0VJK2Zha3hidnkzMU95SEswSmxmdTFnMGJTZEkzUkRhckFpQjYgUWxhY0UycFRCQzFKZ2VHSFQxL2c4QmZ1bnVxVFdXaFg1TUR0SUpqd0hIWUg3WUQrd0ZHWkk0M2xrZmZkcHBMRExqRzFGQU13cDNEViA4YmNzZnpsbHhpdVRDVXdJSW45SXFHS0RjQTBrWjcwWWR0VmtLUE4zNDQ1ckdqc0F0TnpNNkJhQmdJMUpzT05McThQblhSOE1tcjBpIGVjakZYdzdnbU1pSUhYN0p2Qjh3YlFjUGJFTVdzMllqMmlrdTRNK0FQK2Z0M1lPcktnOU9lc0RUelhrT3IyS2xEVlpLV3NaYnJJeE0gVDZtVStVV05ZVVd1TElIbUU5a21zbGtXQVpuMFBZQUE3Y0F6YkJieVRCbXpmc0FRVDUrb3VQN0FmcXdSTTZ3M1o4enE2MHkyU050UiBqMHIwNWE3aFNjd3pwOHArTHlLbkpmUDRMZTkzQXQycW5zbUQ1QUlVODR2S3hoZzhZZzNiRUx4LzJYejl2SHdIUkpSZHFRMjFYNzA2IHZ0Vkc4WnRZMDVRMVhqYTNqc0w1Y2txN2xldVdRZGR0Vm9hMzhPMEE3VUJzQ0ExR01Ia1YzTTV5RUNPd1A5UEFBTUVIb2pMUDJ2Z2ogYlRxVldzdFFJMTVTT0E4WTQyYzJvMmNlMFk4Z3F3cW1BZDF5b0ZsRVhmSHdzcUhjaWxyMUF5QXFSUWpMRUhJS2dyV1l0Z3dtTGRJMiBxazErR24yUmFSWkhKekhEZ2RYeXBlcFpYaHVFd3dubU81Szh0bktINEhCVDFsbVZxYldXWjRxNDNxSE9iL1VSL0Urd2NCNmZHVzBYIEJLQjM5V2xhQVZJUGxIbjllWUFLMm54TEpLQzd1QS9NVDArcTZmaDFYcUUzaUVCVDRId3lkdjFmaDk0L0YyQ0NBMkFBQVFQYnFTamsgRmNvcHJabUxuVnRaTmcyZEhzMHhhbFltV3l0NHRpaVFKUmJjSzNXdFBkd1Brd2MrQXozZHFkK1gxY1dqSXh6emRWdndENkR2NEIrUSBaaFRlTlFCbTJLeEthZUQycEJ3MVNyYTJKUndPZEhVNWtwb2xPVmMvY0h4RGNBOXFmTUJjZnJUNnlzOFhlYk05amFUNThCNEErZzgrIEJveHFqbXBSMER4U2JhYWpFSklrc2NyeU8yMGJTVGJWV2ZFYk5XUkpsU3ZhUXhxVmRrUm82eVZJOFIzVlY5eC9IL2MvbnFOa01GZnAgRlIwL1hMNVc5dEpOdFZMaGNWUHRVSlgrWTVIbDYwSHhQWCtCbUZ1WTREKzhTSC9JekJneG9Gdk94NzM3L1FVSFlQUGdJRE5PYWxJRiBxWjJiVGIzYUllQXlMY3RmZHJJUjRrT3BRTVJOUFF5RGd0cm5HdzdBdC9BWHA4Nkd6YlcwTEtNY3RFM3Nld2V4OC9zR0lCejIzYWRtIFBZdmtWbFdwWkQzckN6dml0Tmh1QVlUV3dxdVdGT3JyRndFd3hDZXlVa240YkRRQkRGbEcxbzAyait1eW5NY2QvZmdPSURGZ0FMZFQgb05rc0ZseVFNK1lFb2R0eVFkaFI2OVBQQll4ekpoUFNqQTlrVzRlR3pNR3hubDl0Qm1SaU1MM05tZU1UYnM4Yi93Q0FQK2Y2a09sMCAybWpHN05xWk54NVhEYStZTklNcG1sS0krSXVPTGRFY2EwTnVGSVV0aXVmVjZrNm1XYktLS0NERklsWklZOXVQbU9LUUVKa2NhTW1OIFdiQXUrYUNyaDQxZXVENW16Wncwd0xUNnVFcDYyMUI3WVd4WXVJaEs3SXdjbGNHUkREai9BSjJKQTlCc2dtVDVSdG05cEp0NC9McjggQXc1OGY2WkNWV2J4VUZpSjdHNUlhbG5WTGttN1lJVGJtc0NHK0FhbUxDendkZ1Q5NHJlN0ZzZUhybXRCNkY3MllNVjJnWU01czdHeiBpQ0FYd0RCdjRCZlB4cllQTUFVY2JGclJEVzlQWmxrdEdXR1BUS3ZFMC9qY2k5Y2tWUGNFSndNY3daR0FQODlmbnFzTW4rRytTOEo1IHM4SHdDQ2Zmc0FHUFVrMk1sdWRrbFY4ZkNVa3hWU3JKcHdPcWpTQzl6S0tKVnVTTUFka1phZm1yWTh3cWdlZUEzRGs3NHJyT3hwSnUgay83QituZ0c2NkRGSllVa3ZQR0VzazB1bTFDN25ob1ZpZnZvanVWbS93QU5FV2VsYVRVTThna01NY1R4eHU2RS93QUhBVElUaWhZNCBHSitPOFViNlhxTzZBNENua3hXTlBHM1laU1RmS0szQU5DbmZCNERFNVErRHpENVpGYm1FOGVuZzlQQ2Y3TW01dEZYUEt5Y1NiczN4IEJ4QWIvc0FEb3FLVlBYNVE1RFhBTm5KTi9JN1VEN2IvQU9DbjBqVll0OExDeXVvVmZtekRGa1EzREduNEtrd1BsSHJaTjVvZStGbDUgQm05a09iQSsrQSsvZEorczRhbjhjRG0wMmt1d2ZWZE1zaVZIRFpWZ1U2SFBVTzhGVU13NHZtSmluM0R1Z1l3bjRIcTREckJPejBObSBSOFVuSHRYaXZvSjVmMkQ5ZXF3OVFXWHJSWGRMV25CSTBqNUFtdGRKR0hwdGl3bCtBeEo0c1RxQ1ZZYmV2NFhaWTlqV25iNStGZ2hMIDhFSkRhRnJFYmNIL0FESmZxT0hmWmdZc1Y3MCtoZVhoYVRHUUZCV05aYlVPR25XOFFNdTl0b2tqajM1VWZHUExHQk5DVnFydXlLNVMgR01CZHgzWVZsaGEwS0hMSG5xVXRDdDBlVlU5VnZrQ1l5WEJwcFNZdEloN21EcTZSTXE4OUxRMmh3WDdVdmlobHRQc2dldDR2Zy9nOSBWMitUVjN4WnN3NTNTTjgrMy9IOUVIbjBrd0M2UHYyM01rWFJsaEVxOXJUbXluMnhXNUNRdHByUncyK0lkZjFVWWNLVFQ3VTdxZGxWIDhEYWlHakkyTnlFN3lSd2dUNkNmUDkzUUQ5MFg2anlpK0dxTFVoRWk2ZTZMMDFKT3E1Ymh2QWRXa2xwbGkyT2sxeXJzWTlQaDZmRVQgL2xuclZjVVBpaWNRZVJpdWgwK0xObWJzU25qSGdDKy9BY0FBRHI3bVhZUGxXWk1zdldSazJSWWJ2RGRxOVY3TzAwdkZZcDZhK2FoQSBJdGJjR1NHR3VBT0hUMXRWVWdBS2REcUQ4RGs5OE5td20vZ0FBQUFnN0EvSHdhU1hzZU9YVTJVV1BrNzJuMU1nNGpXZlQ5bmkzS0hkIE9JTDhHNkVmYUVqcmdnVE1rQXk3Y2tUc1ZFa2NjbUwzWFprMkl2Z1lpdXAzTHNqTGFJYzJwYzJ5TGpUNStrVWJjYUJUOWhQREZTZkQgUklHbXI0Y0dPcTRiSlpGVjh3Z3RxK2gxeStjWmZjQmF5N2hBbnVnc0NEVVhBZGdmdXExQXJVT1dXajArTFBJWTI0TXBEYmFjcS9VaiBaMXNROEQybjJJbXhlK0MzVldMNFk1Qk10UkRzR2Y4QU0zTjgwbDZlaWZDYXU3VmMrUWQvdDAvOUJZN1RxMEYwUFdHYlFkY1Z3YnJHIHFobDExUnEzSldiVzlUOStHaWtidVRySVhuR0hSQ2UrdUI5YlZueXNCN1VHeGVVTDJHbk1PMTJPS0N3WVk0Nzk3UnpBOEliYlpsZTYgUWFIaHFMSmVlbnZzTTRXUmVkTE84dG9WdFI3bHZEaEQ1Z2hvZTRKNk9CWC9BTXFMSzBVYUdZWWMvaDRTY0Q2RUFBY0JQbjkvZ0NSUyBvc21uY1RGSkpJbVBzTWNXMkoyaWV2VUNoNHkzQzBXVTgzd1NGM2lNb2U0ZzhjY2lsYXVTVzlwU2I0eXdmbXZQeHpSZkZ5SmFmYlZQIHJkZlNxK05oNGdjazdoMVJ3YUJNd1dyMGlybm5BZVlRekZEM1l5SjYzTzRmcTBCdmhPekJiUmVTeUQyUTNoc0Mvd0FCcUxmK3FveksgMHNoSWgyUXh0dGVtN0NiVlJiYkhCcUExdkxRd0xrdlZ5TCtuNDkxRThPUFpLNUFyNEhCa2VTZjBiOG9td2h3QWYvc0cvZ0xkWmxpRiBNcFhNeW1NRGFOSjVSaFRzSmVzNlh4N3VoRlV3Q2JkamhmRkQwK256SHdmODZCUjRHY3lJdlBQOTdWZDUvd0FBQkFId0hTWlE3Y2FJIEZnTW9heHJ5Q1Z2RmhnNnljQUxpUHc3Y2xOUjl0Rkh4d1pFK1l5V1FIVDVrR2V2b2RqU3lmRitUY0hTUWlUZ0FxSUFBWHdIZ01aQU4gUkxJc1FSNUViTFBLWDFFeWxlVUxDK0Iyb3dKU3VHTGNxVGx5QUZUeVFSWnlETXVtS3hnSnVSaU1lSTNqelhMRG5Gc2hkbmpqcHpHRCBGcVVqSEFobU5Qb0VsSzFMYWVKZGtWdVN0QnNERkxHTEpwUndwK3JONFR6QWNmTU9BZFFEYWNjRWJpNnVzalA2SlJzWDNZTUg1QTRDIGZSb05QdmpUN2FHU3I1UjVrVmJhYWhrU3lMZ3puQ25BNEVwWHA2cGJVc0VPdHVGVjdSOEpxdWtoUzFjR0hsbWFOelp1RTczdjRCKzUgOC9JTDlzQ1pReDlvSkY1dzkwaDFMY3l2TUpNTmdIa250azRWeWgxa2VLR0IvYmVIVytwQmNYM0JxUTArbG5pR01zeFhLTER6Z2J3OCAvait2bi9kNVZHbDNSRnBld3JrMTZrcmo3M05hVFljZ1BZVmJDVERtNU84VnliK1NMYTI0UHUzaHpsTEw3YmozZkdDNnUvWkhiL1Y3IHdDRDU5Z2hqMjVOYXFSeGhKUHA1NWIxSmVPWjVJaEdRcGFhZVZKRUVBYVZIaWlyY2pveVVTcmpsTERweTh0dWR3Q0psOVNDTUdQYlIgeXJQRzE1TlJTUnZhY2d2Rm0zY1FPa2I4WmxWaUVkc3RxcmV3ZzZxWXI4U0hBcHE5WXd2aDZmRGZOblpDSDhndnZrRXd6RTFjb01GZyB6ZjhBWUFDL3YvNzkxeDdReTVSaXd0NUdrc21yK0FOaXZrdzJpd29aUTh2N290ajNCd1Q3VWgxdFg2Mmp0bytBY2hzNU1YdGhQSHdnIFErZzhCeHczL29FMUVOckFoMllCbE5GaE10a1pSaGtYcklMekdpaG4xWGkyeGJSVlBzQ1p2RlZvYjR2b2xqTnZ3SGlHekRDbmpOazcgbzFYaWYvRVI4QUJQOUJKQ3lHaE5yZjVXenlTU3ZhYnMxMlFlVDJnVERGaS91UWNoRHJkd1pGdGI4NDJrTjk1TVRLRkNiejV0SjMvMiBQZ0Qrd2RDSTJSa25kNWk4cUs3RVNVRCtCN2Z0NTUrYjZ0bWJaTVpDQVIxU2hLa0dSVzl5Uy9Vdkh0N1V4N3ZPVjlScXZaajVYendrIFQ2SGFuWVBBVDR6Rlc5cUxhZXc0eTNMaTlqSjlmekU5RHArSC9xTlphZWVCb1MwTTNUYzlrU1hZR2dnRUkrQXFQd0IrWVlKZ092dFcgbHpYSlBxdU1oNXVjTmxyN0pNOHhGUE1NVHlITUtnTUlpMnY0SEVPMExhZ3cxbXpVTlhXVmtIVndRMmNQZ0g4K0FBZTUvcTNWNGFiMCBkalpIWkg1c3QycGxVK0VYaDZIWjJsOXNtUlNqWktQVlhYN0p3TndwK3R4OHdIM0FQY2tHZTMrV0p2OEE4K1B2ejl3RHBWMVdoMS9xIENzZ0NaaTF2R3JkSUcxdXZjdzFVU0N4aFhjcTl1U3VVT3dKaGd4dkVOd1E5aHA5OGVGc1hScjV1ZStCS1NPUEhhSS93Ris4LzB3dkEgMmN3a1E3K084NlJZWVlFWVdNMnl2SnE1WEd2bStGcXJSK2tSU0pXQS9BSUFQd1B3T3JLYVY5QXRKNmlSVjEyS3VsM0ZmclhNMUUyYSBGcDZJb0s5dWFtUS9xcklaNlFXSVAwK20wYXBzUStCSlNCcENTWUE1MkJUSUFzWlRBUmx0aEVhVHlHV0MzcytkVU16TGFwMmdUellpIEpRei9BQkZiMUgvU2JCbExmV2JiUTdFTGpad1FMR2grdGxFVXNXVXE4bFN3TWFEbEozb0tDOGtrVWxaQ3psWkxUNjF0cWpHVUJPenEgMUZLb00xa0FBbkNyUEhOWkd2UFBKOEg4ZFVaYkpPUG45LzhBODZPMlV3aHU0dXlLbFo4bXBjNWtQYWgzZW43aGNiWUxtSXVxRFQyViBpdzZ2V3JzVHpFTU9RY0FmSDN5OEh5ekdZcGFGWmpPNlZvcEtQN24rN3Y3OTB3dE5hL1FkOFNHUnR1U3liYXM3V3Zha1pocGVraHF1IHBvY3EwSlo2bTA4Zk1yZmtqSkRJR0s1c3MvMmRoazBZbzBQU3lETkpBUUdmd2ZqKy93Q3dIK3E2MCtybzlsbGJhZkFLZU5KWnNNbGQgMGgyeWEvZDRaU3hyWWFJdGtXQk1mRVFQYWdjaERndmxvS1NQeVptVjFkNXQ5SHd0SUk4QUg0QnY1OC9nQVB6MlpXZG9PUy9ScFJEeSBYL1VzQmFxQlliZ3NPeVZhSkw3alVOYlZYdzlvaHJlQmhEWDAreGdIYVZWTWJZcnRCTVo1dmZBQi93QStBK2dnQVdHVXBIREJxNWtDIFBIZzIzdStKWXBUcDJYNmJVZW5xZG9MSVFZNk1ZSldTcUJOTklrdFRhU0ExV2NEY3htd0tZZ3J6SWxIYmV1ekp1MXN1Sml0MDlrZkEgZGU2Ym5Hd3RucUFEYU5zTkJJQ3JGbHNvVXJKRGltQ0VOOG1KNWlFUDJPQllBR0NIWmhhdnlZbjJ1MlE1d0hZUDM4QUFLYmt1alRJNyBnejkwWmQxcmpnR2g2b1pTUllTaHAzMHpQWUdUVkNIRnhnVlduM3VoWHd0NHd3WjZCWlFKT3Arek1hYkd2R0Ryamc4NEg4R0RGZ3dmIDBGOUNzd2ZhbGpTSzlReGJLTUd1N2hhSW13RlprSDJGVzZHZWJISW9oajA0T1lROTRzQ3R6aUh4S2N0a3hqNVYrQk00RTFEdTIvN0Igd0Uvdi91SDZkNDkwSkZkdXlhS0pEVWxjTWR2U0Y1SjVDczF2Z2R4Z1pWcTg4WkU5YnRSYVgzeXh1UHRweGIyeG9hRVpHZVRZTTN2NCBBQ0FQZ09BOUZCcG9vY2xpV0dEY3VlZUdDbGVIVnp5U1M2Z2dEK0xQSkYrN1Bic1k0MTBEek0xUk9yenVPTng1QjJvb1VSUnF1MmNZIDRvd3FLdVI4RThYUVhzakx1ak5GalhLVk1iUUxSWkNTV1g4VEJCZURnUU9vVUNMRDJndG1QaGgzQWVZQnFUQWVSZzYxV1l0bzR5ZDkgN1J3QVB6OSt3QU5nZjBPazMrOHlyaGIrbGFoMUl3aDZld25NRHhjZXd2bU1xa2UwcmhoeEJsdUJQV3g5V1VmWmR3SGxXdHlaTm9WOSBQSXc1aHNoeDlBZlFUL0grakRWb3dXZnB6bVcwQnlpU1JYcmFIa3U2UE0wOXZDUW42ZzR0RFZmZkhiKzdLM01jayt5STlhV0FBT09EIE5VQ0h1WXc0YnRGSkJ2eDgrZy92K3dWUU9NbXZoU2x0V2p4b2NJMU0xcGNGWGFlMDhEa3I4dFBwczgyVTJlY0dCa3ArMUh4UHJjZmogenhnYmVON1kwUGUySTkyRzBuRGo3OGYvQU52bjdsbG1uUUNGWVhoYmxaTDNZRjBqWTdrcXlLQklzalV1QlNDVGJ4YXhaWG9URkNyRSBNWmc2YkVLdFczdVQrcHN2YW1XTTRqYzRTU1RFc01pTWhjL2ZtVzBUN01UN2tYS1RKUTIxOU55N0FoaldDa1RGWElkc09TdlpCQmtmIFdTdDhKZzhONC9nOWtEQ2JUVjdOMnJOcEdILy9BSHo5cUVjcGFqSmNGYjJXSDFVTGJyYUY4YVMyRXhZVndYQi9OSzRrQ3J3eU1OOG8gZFBUNWpBNGI4dm5rZmt5TVZhQm41Uk9XaWNmbjRBZndBSDhmWWJPTkZidTdnU1RjcTJrbTVzcXR5VHZaRGhaRGh5UURTTjg2Z21odyBJT0VPcTBNdytNR0Z4ZHdMTDVKV2FNMGJtemJJa25QQWJCc0FBL3Y2OXJKTElRSmxNaHV6THRmemJEd2JNRnV2Vi84QW8yelh4RFErIE51RnFMYmd0a0puNVFnVld5TE5sdEF0R1dUbU85KzU4L3dBKzVCNTRaQXMwYmwwUm53S016cm5sbVZBTld0WTRuaXpkamtWeXlOZGkgU04xZHp1T3F4U0kyM1ZtbUxKVFplVm9aRDUrVHdTVExrRGxLL1pBOU53d2lldUVwS204R0VOUGJIQlhzYTJGZE5aQjVqamNQVDJuMSBlRzM2d0I0T1lVWmhiUVRadjJUa0gvWU9BOWFnYWV2MjBjQTVxRzdHeVRKQytXNEJ6RmtOa3dYRjU0VWNDRElub2tPMUE0K1o1RDJXIDZ6WnZ5WU13U1Fqc0QvN0MvQUg3b2pmSzNiTjB1V3kyMWtmM1lOcGlrc09sYk9yMjhGN3RLNUx5YTVjZmhvYTR0dmlHbmgwY0N3S1UgRmtaZUw4R1dRbk5qZXdQeDlCUWNEL2dKNEdubER5bWVpejRkWFdkWHlIR2lXQUJaQ0JhWVVzWVRYTmpRMkF6RG1LRU13NE1pT2hwLyBjVVBXYk5hSGFCRzN1N0tUQi8yRFlBQjgrcFZWSTIxRCtuR3psMjhOc3pyaFErM1BheVBOTG1XSEMwQVl5K292eHRPajVBVkp3THBIICt5NzdqVFhRNEZkTDA1Ujk0QzF1bWRWL01BbWwyMGJhdHF3ayt0OGxYTFRBTGt3ODhRK1lmY0dTcXgvM3l2N2FPSWYxZERKdkp3SWEgM3crL1liQXY4K3hYNEdqekRaUTk2TGQvVHlRUWxhcmhHaUVESjZNcHJaNzVmS0Z2WjVoaE9aSmcrR3FvZGdLVkgycHhubEROd2Y4QSB2NER3QjlmMkUvWkE0bjB2UVRneUpEdTRXamJTbFVxbExIMkZmQ09rR0JhYWtQbHlMYTh5SjhOOFFvYStZVlo3QXBIQS9KdFJuMmJlIDNhcmppRGJ1L3dESDBFK0E2b3JxTTFHR0lvTkR5VTJ3bHM5YUJnS0pzZ0NrMWVrV1BGN2V5Z05rT0V4d0RtVnN3UDJPeTA4ZmhWYXkgekMvY241c0phZ0R3SEFmWStmTldrbEQ0aW5lTXhzNDVMeVBXMEs0cThYK1Qvd0JPaTJZb1gzZ0gya3J0ZDhzQ2NSd2NSN3Evd2pucCAyVW1EWHdMSlQ2bUdwa2JaRXBWc2lYcDNRNWlPdzc5SzFZSnNwa0h3ay9raGd3UGh0WUZQNHJESmsxZjh2Z2dnUTNqL0FQMEZBd2JWIG1BNWhsMFNUMWZYQmFFTTg3TnNTMEdySkhzTXo1VVFwdzloWTdIcCtIeHRnNHIvUDF5bnJLenFNS2JtZDdvODRBWWJBZ24wSFlENlQgWkdSODFCU09XdTlwM1pRelJ4dFRzQnFXcW5wemRLNUxKc1ZrdEI4RDhrcmN5d0dOaDRrOE1nemk2dmoyT0NmMUJ2OEF3RitBZS9TeCBaSWRxR2tQVEhxSFRlU0pMSGFaSmhhRS9KanU3Z0xUUkxSVjVod0Q4d0RtQXc4TThBUjZIY2N4bXQ4cHhqZmNVbEplTmdmajl1bjkvIFBkSGhMcUpaSncvOUdSVjBicEVkNTJDQkVtelJwSXJwc1dpZGJKYk1OUzBsMlJJMlNzOXl1OGRra2VQUFl4RFZsbFRjZmIxZGNmYUQgUStBNzN5bHgydEZ3WTVnUmVxZTdPNkdGa1ZMMjkwbHhSREI5UG1MZGtEN0lybWVuMlgzSTR5ci9BSk1CMmlFZGtibng5K1A4K2Z1diBxV1BvUEtxdThyejFZWE5HaEhrT2lva2V0NmxnUzJSOFBPNHQ4Y09IcDhOOGhwOWdHUGdNQ2x2Q01zbEVPczhLcmRnbFhQQjkrLzhBIGMvMGdXdzR0TkR3dHRzcHdmN21QT0Rhd21MZ1ZYQklRNHZjSk5Bdm41Z1c1bHdCeUNHQ2dMN2E4SWJ5VFE5c1JxckNoT2NMNzh3UHcgRDkvWUJzd0QwdjFMcUF6cmFLRFpKS3I1amJFTVdjTlYzZUcrSGwrSytQamduc2RiMlI0LzUyNEtmSkZrWUxmYk04STdKUDhBVCtJQSAvc0IvckswTWVwVEVMdHVadDVkdnNkT0Z0ZE15amIwM3h1RklUdTltUUFRZFBFN3dzNGQ3elFxZ1l4UEc4YjRZeU9rY3N0M1JJVmloIEhKQk45cnlkS0x5enhnRG1xOW5QN1V4Mm9TZDZmYWdOVHJ6SlhOalMxZUxhWStZdG1LM21QbG9jcXRxbjdMZUlUeU1WOGRRb3c1OUogQjcrQS9RQjRBRG1LYTNocHpvZDNudXdUbm1jRXdhR1NHSHMyWll3dHNsRklYekE3SWh6RTlQaDF5QVFJQ3IrNkMzbjgyQkhhOExkUSBUK3dJSURmd0YwakJSZ1k3QWhya2FpQnBLdWJDMDhZV0JROUVVK3doaFl2VGdodmhnZ3lkN0pqaER3TWUyb0JFK1lUdkxnWk1sN2d3IG5BZlAvd0NXT0FISWVBOVgxZVlBb2NNMlNTTUdTbkJ6VStXRFdSaHlBMVBVb3Q4bm1GdUd0M1pqdyt1UU5QOEF6MlRqUEExblkvOEEgcDRBQnYvQWVqM0ZFaWlRUEp0dWpxMGE1STFHaUZleGQ4V2NlRDhjOFcwZTFXMjFQSm5VTzNMRmp0eXlSOHhTb3UyVGhaSWFUSUdqaSBFRE5YczRMYkR4VEd5eDZyR0doa3BjRTdDbnIvQU14OGlsbGNweUJiTTh3c2dQQWgvUFlJQVB0bndQakl3SGliMk0vd0UvOEE1Yi9HIDVsa1RISzFLWmFDaVRHUElhU3lLYlROSmFtQ3ljcjZjM2NYS21FUTkyVEdSODNCd1ZhMHI5OFIwUGExZXIyYXMzZzFodm5nUG9PL2cgT25rUEIyZTBHSEJjelhZSm5kMUVEOHdBVS81Z3NXdzFLcnpCOE1PdGx3NWo3eFV2MVdrMWtZVTRON0crMXh6ei9nTWVRZFYxRnc2YiBWNnZzNHpsWGxmMlNlc2xrckxoTmhCMkprVjlMOWhMQlJrWUE3NnRsNWllUGgvQVA2ZWNETE1URm9aTlpPNDRPeHpnSDlQNy9BTEE1IGdzaXlxam9qeXBncXBQVjJBU1Nkdmtna1VLRjM1SFNvMytubDAwMGczRWdmTW04SzVYZ21tOTFmN1Y0TjlTUjJpLzRwYll6cTEwUjEgNzI5cXE4bjVlcThsUUlhemZsSVlsb1RFTmdzZHdUNnJZN0l3bUExTmc3Y0xkbVBPSEdXYkdyc0VrSFVRQUFBL1ZmUGdJZHdUMndDKyBKKy9XUVNobEU0bExhS0JzZ2c3aDAwK0pUV2lHd0xjTVBqWkVNZ3ljUytBcTQ3WVVLTTN1azgzMzhCdjRBL3YvQUVTVk5mbFFWN1M5IDJHYkxmQnJoZnVkVjFaVlBwMXA5ZlNXUUNCaUFYS0h3OThaQTh3d1BzaHFRM0RUUzhCMW16VU44WnNRWnNHYnd3NEN2Z1FGKzhCNjYgOVRHWmFqNVI5ZTJNcjFqb25UdzF3VmRaMVAzeFJ0RDhrUEhwY1dyMDlmdFJrMU9URnVFd1lUcDdnQTQyejhudVQ5ZkNITmd0N253QSBBQVA5TDBjaWlZcTZmM21NdkVaNVVpSmJjaTA4b1paSlpvZDNITXFRbzdlMGtqTVUzVVJ1Z0VxUzdWN014V0pjTDhrUjNrMVJwWjIxIHJzdHZPWEFodUVld1NDcXVGSEJ0czZma3NnbXQ5bmtPNGVyN1FpWHlVbWNQcXN3NElhMndKNnJxSEh6M2dPVEdQbjJaSE5PM2dQOEEgWUw5djU5KzFQbUxiazRQbFNxOU1rbVV5SGpGbmdrK1BFTjlwRnpZVU9tNlQvbkszaG1HUDNWVkpnVVp5NE1zMFlVR1dZOEpGb3BQQSBRTDhBUG5rQUF3SDAwZlQzQkRpSHRSaWJZVWFaeFYvN1BMZDhjc3F0TmNwZG9YSWhzREd5VldZRVdxd1E1MjNua2ExRVluL1RPeVZjIEVSMEUrZzdBZkFQejhBYkxoUm1tc0RYYTJkTTZoRnRiMVN0Visyd2tHTks1aHN1eStFS2hvdE5vWkdFM21DNW51QSsySzNPT0NPbkwgUEEzdmt4MUtkWFo0WHdDRnY2K0JYOWdOcFltZGNkUTd6YWgwU1RDdFJ1NUQxU2JLYldkS0FMZThmMXl0VWtqQlVSb0Vob1JxaWxhaiBOWXFUM1hqandhRjJlQjBqcXJNRUxRQnRWWG5zNTJkcCtRTjNDamNsZnNKa2xGR0dWYlRnNFRMc0R1Q2ZaRmdNaXFCSEh2aHM2eHp3IFlNODNkaU9BeFA3QWZQbit1TTZMbVZwbGtvc0RKa3d5QTAzWnRma3M1Z0xROStyMnhrTU9RZkdUdXBWYTN2RUY4VCtLdy9xNnVzak4gNzkvNkJmai9BT21QV21aUitXR0laMG9XN3lUMERPMm15RHpKeE9ZaHlsNXljbHRmRHVBZDhUdzlnVEFhR3d3SGpEZ3pRMGJZRE43NSArL2dQZjMyQ0hrVEJaNjNLOVBMZ0JKcjB5cXJnbEhKTGJSRWh4UmUxeWs3NGZkU0crY3dUK1dyNzVPMndaOUcvek5nL2YvNTgyTEJTIG9VSFJzQXFtejd6VzJoNFB2N3FJOFk4Z2tub1ZpakR4R1JjTlFqaVIyc3NWalFETnFBRjFrT0w1dnBuVlF3RkRKUnZIaTg4a25IZysgMHRDVFZZOUkvaU1sV0ZkMjhNQ0dIdFNuOU1RZXZ6RTdiME91VTk1V2JrYUt6Mk0ya3V5T0ErZ3IrLzhBVVlsdkFobzA4T0M1bVEzNiAybWY4VUJsek9rNEdFN1Q3TXFZVW52N0pDMHh2a1M0SEZ3blR4NEUzN3JOTnF3d2xpRnh4eEFBUUdPQURBQUF4VmpJMjAzWHkvREtBIFZXL2lWWERWS1dITUJ4OFN0NHZ5OVFUUW51RXhrUXc3SVlZREVFQ25WbzFCaWZLRVBuS09iZGdtL3Z5RC9xNzc0WHZ3MVI1ZXV1MHcgOXh3TkZGQkFxSHBxdjZuRDR6VE5aVEpOWVY4QnJrTS8yUGRpSGFreGpYOEFhQ3YzUzBwNnlqcTVSM3JNM2dFcThIampzQjdGZ3h4NiBBeXdpUUZOTmFSK3F1b0VHei9IWHVUVVNRWnlTRnUrUkhhc1Z5UmVDeE1sTEMzMVc0YWppNU80STRFKzY3WDJaVlFIZmtSYTF6NTVVIHVZQm4rMWRHS1RoaUJja2x0TDJBdGpXQ3ZVOG81Q1l0b0dGNFBWYWNZVDdVWDRid2V2Q2ZPbURQZFhKdk95SkpzR2c5b241K0FYNTEgWnpWSmNrZDhtVzFiUW9hNnZqSFVwdkJmckdHcnhIQ3VhNVhxbHEvYnpBY095VStYSHcyb0N3UGlyRGVYbERLZWM4MmNQZ0g0L3NIMCBEclNqeHc5R1dqVExsbTV6YWh4Y2tIcUVNMUpEWDVhMmhBWmFhMElhK25oMXNPWTdYekoxdEo3NU9XN3lyTlhWOXpxdnNtN0EwRStBIHQxQTMvZjhBcHdQRk4yUW12RjVCV2hiRzFLbUhrQXFydmxlMS9ZUmc5L1huSHZocCtFTXo4dzQyc0VCVlpIbG1GOG1KK0VObkxkWUQgK0cvN0IxRlJXbnpadHlIWkN4aWFXdlRuSTNrVTRIenR4MmYwQlE2aFpvNDJUQjRuRTByRldGWXlMdDdianplRnRZNHZJV1JYU0JGMyBBRG4zUlVwcWdnOGF2U2JJdDFrWXBrOUdYcTNmRDBUVXZYTXo0ZmJkOE1VbVBNY3VIMlhhZ2Nad05YSjRBOTc1dy9jZmZ2dndEb2IwIDkyUTBQbDRMZWFCb0c5WERVak1kckMwLzVOTTB1dlROUG9GM1BPY01oTXVCUFpMVW1PRXdIUzFYMXBzL2ZMRlgxTTZlbmpCMjgvdi8gQUlBQ0EyQmtOaFJrcmxQdHJacmdXNFI2Wi9ETHFRcVYycTlJcmRYUGQ3dVh1RDQ0VnVuM3hDSU9FRlNZSjZPWVJiTWFGZjhBS2Y4QSBmd0dMOWpzSEFUOENsdEQ0VXR5WnFscVZ3dlV3eGgwaXdyUXRRT0hiREZqUGhaN2lyYkJNbUdHUndtWEFoMk1Rci9ZOGVNdEhHZDh4IHBRSjRBQXY3Ky9iQjFuTUc1RkdHTGw1RU1LVFpZZlU0eXVtMU5JQTJHN0dJcFVhbnczSFNtOXpOQlZaeXQyN1BMS1kxQVdPRjFoZVcgTmtXMi93Q1c2c0xGMnBzWTBiY1VGblVTMDUxM1E3V3RyVGdydkNUZkxnaXRTbHFodmpVSlVGMEtyNkNBcU9aY0lacEUwWGVLd2tOMiBWaGQ4NnpDQWV4ODBmTVluWVRQaGxEekUxeThjR2N0blhsVjYxMUNzeWV6TlFIUjBwNmc1a3F3clh5Vzl6RkJheXV5ZU5jL1JhcnJtIG0xdG1mREE1dUlGamVSL2p4amtjcElMZjRqWXRuMTUrOWNmRE1idlhJa1owWTA2Z0FEVlRBQ2dCeHdCaC93RHJuL2Y4Y3d0cVFhYlIgd2dnOGo4SHNzWFg2ODErZngwN0ZlMUtUdEJMTUVLdlBhaDZaeXROOXRPK29Ca0R1R25CYjFHVnpUajIrVEtmVDhYQ3EwS3ErMisvRSBFT3Exc29URnZtcXNtY3E0SndoZ0FIMEUvd0ErMzlCc1cyV3hJcCt6TENGMVZiVW1rMGhrVWtnZk1aSy9zTzdiUWkzR0JpaDZ2cDk4IHZpdGd4Z2hEVlFOZjJXcXpGa20wVmYyemVMUkNCS3JmbjZvWDc2RHNHQ3hIeU15cWhqVTBUeVNUVmF2V0FSZVgyUnFWNjloNmdxdlMgTEd0QmJ0QndyZGJoMVhNSU1pTythZjhBVXR4dG14RjJnc3MzYTVKTm5QMy9BR0JCQVlyN0lxZEwxTVQ0YWZvOHU1MlFMSWQzQzdDeSBPNHpCNVlPZHRDbk5SZ0hDdjk0VzMyYml3ZkJnVisrS3JJczFtcnRHbnF6UDdGei9BR0JCZnVmWTlORVdEZjNpUkdRYW1ONDNRUkRaIDg3UllSeFJneHc5MlVqRW1tRktLTnFWNUNqdEUrRHJwbFVJWVJMdStwQkZTc2RQUGpJTjNKSTZYY0lJeTdiQ2xmSkN1N2krWldEV00gYTFMTEpFaTFnWFluNURZWVRRT0pSb21Edm1ZMXZWWmdoREJxUkhsUzM0dTBHWkc5emVHSjgrQTMvZjhBcHdBOHlsNHFmcW9velZlUyBiVHhubTFzTCtudEpEaVE5Y25sNG81VEhDR1lXOW5Ec0MzQlV2T1ZXTDVSdVl6dGRzbXdmdisvOEJ3cnFjT1E3R3BldldoY2RxbEFuIGdRUmhxOWtwOTRsc2l1ZXB4OFBLRGhTY1N0NGN6aDYyY3FYbHNGT1pmeGV6TXh3Sit3UHdEWUg3a0Q5MVBiaEhEVjNjRUFOWnovbnkgbXFyaTFrVlhYc2hUdUN4bGQzaXhRNDZIMmZXM0FPUE1RWUU5dFZYQ3pCbjV5UnRrcTUyNC93QzU4L2g1OEFtSFRxWTYzSnMvcVpHViA5ejJTUXl0RkpFeWxlK05xUm5GcGx3UHRzdmZVc29ZbEVYY2hWbmhRWTNIS2ZTY3Z6ZDA5REhqbm5xQnIram5qVU93cCtuMFhrSURnIEdaQnJ4WkJpMUxvYlBsUlY1WHRCUEhwNWh3TXc3VFQrNmtEbmh6akl5cnhmYlA4QXJiWU5nZmo2RDBtV0JUdlMwRXVzUmxsMnAzZ1MgRWxiVTJDc1dRd1doMk5hQzgwSzhNaE1EaC92Zy9uRGFuMHRoVzltYnBnakV6Z1B6bkFmZnovVHJaTktpM2QweER0WFRRbjJRSEZwOSBKMkU0V29ra0N4Z0NlZDVRR0d3VExzUTA4UGlROXF6VDYwbkIwWVlyODVaL051MkIvZ0lEd0huMkhJZkpqazRBYkJudXdSa2xEV1JJIHJiaFJDdkpsY2dXSFNxTFQxOFBNNDJ0bVhCa2FsSzBPS3pIa256emt5T0VTY0FlL256L0FUL1QwZVdUYjFDTWpvRWxkWGQ5cWVQSGEgc0RUMCtlZkg5VmNjUjdzdU1iTEdkM000VEhDdUJKQnFhQkIvd1piWC9iYy9kZEIrWTBIYkJLVS9QZ2FkUG1CVnZTN0VwOWJyMWZTTiBxVjBoRVRZVEErVS9ka3hEV3gvenJMVC9BSno0TXN4b2FCbjNibTJCL3dEWVAxQWRiYkllS3JxKzBOTHMvUys3MlFlZkRDa1dqMnBlIFZrUkxJeDArcWQ4U2c2ZVlobUszVHpIekZYK1JWVU5tUmltQ3lzK0U4QnYvQUQ0K2UyRHBobzlrR0xCaG9kTjF5bnlWdVZVdGtYSFogQkp3M1l4U01xSW15dVBzZ2d3aHNuSUZ0NG44dE9NaE5IOXVUQTk3ZGdld0lPR0FBQXdIOGE2c21GWHREQVNxcVZZU1NOYVBqTzd3SCBpT0h3NVFGSWFKUmdneU9DM0RoekY4eFl6NDROclh0aFFadG14L2QrZW4rZmZ2NERxRVlraVpMaDBxUnJKejc4dmFmSGFCZ2I5M245IGROa1hNcXNKeW1uZVI0ejQyNjI4aFhPUk5pamExVjErTElyN1JaanVEQTJXNVhOMmZxQzhsdXdsOXdzSndyMjkyamFiR3RCUHEvdnggVzVoRHJkZ2h6a05QZkp6SldWR3RGb0xLelIzTnQ4WDM1QmZnSDkvVWh5T3lHV2dEVlJSRUd1RnF6RzFUYVNWU3A2OURzWUNKbEFRLyBKT0gyUW5wNDk3c2F5bC9Hblh5c2hndnRtVDN0MmQwZjJQOEFud0FCQlB6eTNWY2h5SHAvUExPbFBqYmtvQWxHemlUUkwzN0VTQlF6IEhHelBkU0doa0E4NDh2cVd6bzNBOFJteC93Q2xmUHRnUWVmZEtwd3A0SFRicG5HZjhadEcwUFdOT1d3OEpOUGgrZUs5aktkamNrWCsgU09GVjJRWUlCKzVZODkrck1MUXhqTlZaditnZWZJTEIrL24xTEV4alpyaEVoZHBZMGg4R1RzVkdaci9veHJHZzQ3elp0ZkhSU1NxVyA3TzlCN1g4WmVMN2Vhci9VL3dEbnF3RElRYktnek1rWGNpclpGZWl5ZjR2K1dyeERBRVcyV2dWRGtPWVdwRG1yaStZUjFLOEtINWg1IFJvc3o4WFk5cTdkUVg3OS8zOCtOUjdvajFBUU1HY293N0tyZFpGYmllN1Ewd3cxWGFBdGVUYkdXMSt0MXUrSmxQc2pCTU9WTFgwK2MgWUdlSzg0a3BMc2NBUCtEOGdnRC9BRVNLZG1ObFFUSVl1VmNCSjIwMG5pUWxIQTJFMFhFNE9kWGlkUmpraGoxdStIQ2syUjhYME01VSBwRHVvWVp5ZjNtalRxVDRNK0F4eEFjKzM4K3NjeXQ2alhPWVlaVlAxZGtzYVN0eEdqT3M0T2tCeGNYN1FIc0I4VURDZVlReDhPQ2VYIDMxSHJmNzUyeTN3STdmZmdBRGdKOEF3SUo5MGtrUWlETVhqMmswOVNaN3U4Si9wcm5na1VDUk10L3ZSSUpxMjB5ZGNsNm9hYWVhZUwgUlFSSkxxWk5TWTFoRzFER3p4UXZJaXliMHFSdm5nd1V0TEh0OXhHNWRCbkxiUUhNMkJxdXN0MzFMcE5rV3JuUDRtd0VtSFpBaDhBMiBna0FhYlpCOUpvU0ZUNGN3UFd3YmJhRjB3bkN6TjBxOVplWGlyamlUL1gzL0FPbWxrTUE5WHcrazZSdC9KcTZ1TGVoc2t1dDk0NURUIDlYcHR4dmtWOHNENWxrVFdXdDhXTTQya09LN1lNRjg1Smd6YnNiOW41QlArZjZHd0g4UGVheXc3UW8wYlcrSlNzZFBDOXF3QTIxWUMgUUhBRkZQNG9kZjhBMmZaNmZUKzVkZ1h4WTB3cFdTR3JpeVp6MzJNL3Y0QUIxaVBUNGNOcC93Qkplb0l6WHFrcWFSdFN0a2NnRDBuYiBEWVkxTGQyTHVGMXZZSDVJdXpUZWhyOE00QjU1WEtmem1yMWVzM280RUNHL1BzR3diK2cxRmhrV1dEWVRWeHk3YVRscG9BZFB0eVRZIDZZWnd2b3pMdVMzOU10UnlHSGMzRGkzcG0zdnB0U3NyNlF4b1pvc1lwZHVlS1pGd3JCbGxoYVNOOCs2d3JkbVBrMzAybVJvc1RROUQgMUlhTGFXQTFMWWJiZGthbkVkcXM0ZXdwOW9jc0tSWm5HN1VEN3hENEhCVWh6NHFoeWF5clVQWmd6WktUTm16NzhnVzZBOEFBNmFqUiBYOHhvZUZ1dVdsVlhFK3k2SFNidXNpMUUrcDBpcSs0Mm51cjN4d1lHUmtUMlJQV3lEZ0RiVTlEZ3pFWVloaStjdkR0MnUzOC85ZlA5IFUvTVIyUnR6RHR0SkMzSkF3SzlrcEVjdzdKNWJoc1ZpVjFlR1ByZW4wTmtoaDJBeFZmTUlDTk1KakdsOC9aRFpzRy9lNTgrQXcrdm0gMFBzbXJ1Q3FCU0dTMHEzU0QxU3J4QUVTWDJ3eWZ0Qzd0VlZOR040ZkREZzRUZkI4d3NvNURyTVlVcTltV2VFN0ljQWJCK2gveit2YiBVTklZbFNIeTBnUlA1SklZdE5Hem5rVm5WZ2M0QzF0cnZwQ1NNU1N4dXFDK0JVYTkwYWNEbmJrVkhzK2NjYUYyQ1JiekJhbE1yR0s3IDNBYnIxY0cxeE1yNGxEajhsS1BuM3o4YmRrM0ZQbWZNT1Q2UDd4R0NXUEtQMStrbk5nQWMrQWZ2NjlLSStaRmtHR2poOWJwTklyYVMgMjBka21LZkxUTGtxV1pZd0dHdmh3OWtHRU53SUdKeDdscXJpTVpud3B3Ym0xWFk0NGdENkR6NEJ2NEN4VHdRS2FMZFJGQXhTbGhWZCBxaHNHWlRkaFdBSHF0WFhrTW81UkNsalEwOWNzaEV1Q3lESTU4T054QThqcDR4NSs4akFaczJiQitBeDhCc0IrSGp2ajVkME81a090IEtUR25oVjVEYkQxRU5US254RU5XaXhKVDRISDJwM0ltTW5jQ25vTmx1R25pcStETTFYb2J5ODFVa2hPY0gwRzNRSFBnQURIcFova2oga1h1U1RheE9VcUU3bGcveHlSM2pRUGRkM3dGbzVNalpuV1ZaRGN6UG5KeFdJTkZSWHo3VzU0L05mbUJyK1FIclNZSGxIbHV5RU1wWCByc1dYeVI1WEVoK0dsdjVOd21KOHlZWWg4OGVIeHdQZk1KMUJWNVRjNlBDSkpzNGZBUDJDL2kvQUQvWEhiQ2Rjamt0MC9RN2tTcFBPIERJZzFoYUE0MGpYcG1LMENYeG9tTDRjd0hjSHlHNEIvbjh0VlZzbWpWZVZSaGh3SWIvWUQvd0Ird1h6NEFQeTcwUzF4Zmg4M1pEU0cgbTJIMjkrR0JNTU13OUtZVTFYM0FPdGh3OHd3bm1FYmNGSTR1SXp5MGJtOG5IWko1ei9YNzgvSDkvUHlSZ1VqbEE5blNtaDJTVHk1biBSbmdnK0twQmhjSkxsUTNNbHR3L25FOWtoc0FleHA2K0JSNWl5c2JvTUdmc1p6M1lBRDl5RDlWSkZGTnFCcUpmNkVyR05QUHFiTFFGIDh2OEE2VThpNDQvY1RmRkdOTkl1am0wa2NhQ0dWRWpkVUdGeGlXS2JFK2JHNURHd1BHSVVqbkt3SG8rbi9TZmJUWkVvY29IRzV6NHQga21FT1N6aDd2VzVScDM2dWY2dzVKTVpYRG5BRzhLenF0YkpqQmRYN1o3T3h2d0NDZitnbnovVE9SeCtrK2dyZ1NZcms3ZjRJWWEvdCBpL2Ftb3JUUFNPMWkrMHRvSi9NRnRENGVIVDRZTjhUM3dITUpyTm9JanlqV29rLytQMUZqZ2Z3UHI5Rlh5UlFkQlhZQlBCaVQvcWNUIEllbml2U0dTSFY0aklCaWxwUjRPNFEvdUJnT3Z3MnJtRmFUVENLVEY5M3hpT2JkcXVCbi9BTy9ud0h0ZDZxR0FYWU5acW91cGF4ak8gMWFOVmtiaG5Xb3YyYmNGeUhpem1VWkhDWUhwKzRId093SWJWcGFYd1BrM2txTFdYbnZaYUlUajUvWU5nUDlvdXRVa2psbVJwMGtTUiBJM1lSZHUzZVZMRWJiYXZuSTAyZEx3dVBPZEkyREE3U1pwaG5GSU54TytTR0pjaDJaVm1XK1BCL3hXS3UyWURxODgrYWRUTDRxamFsIHBza3QwaWp2bHpTSWtPeGp5blhOakljOWJyZTFMVE1CeDhPZFpkZ2JITUo0RkZjWWpnK0VtOS9RUUhQajZEYnI4QWdhbnFPcTlPZXAgUWJTeWFra3RZQ3VTSldFTzA5cDhlMkEvQTdOaXVWcUQxdW56RVRqZGdWdjJsY0h5dVh6a3hRWHRteVlmcWY4QVA3QjAvU09abzVUUSBtcFJXWjVtb2F5TlRXYzMxbFcrbXV2WEZlbWdVMVQ5UEl3RGhneVBUSXQ0VEpzREY4SWMzUm1qQjZSdDZDT3FPd1l2d0RuNS9ERHF1IEZ1QjZmcXBMZHVPZ2VObVE3djhBemllNE1FeG9GN1dlTU1DZjh4UGhodDRlTVU5U3JrTVRXZDA5M2paRGV3WWUzMzdnQUMxWlh5b00gTVhaQ3hYQ1FZMXlqMjJOL2NLUGdjOVVJOEdnZGV6VHl5WnFZcHJDYndXd1JnTXF4QkJzWGJjQ3VieDVjeWFVT1dGVlYrdUduaE90LyBuOXNkenJnY01XUTlWNjZlMmZqY1BUR0htVnZQbU5UYXZuK1NjNXB1ME56d043MmpuL29KL2dQbjZkQTdNRnRzUE9ESnBnMnlDM1lLIEpqbU00Z2tRN1F0Q3AzS0t5WEJ2RkpHRTh3UXF1cXp5ZWVhekN5VEtGTVNaelpEWnozQUgvZndQUlVEYkNFU3lGV3djMnlQOEE4WXIgZFRrS3NOb2lUR2dDMldNQk1NSWY0YklvSjdCTTRpUXN0SDQwVEY3cHZtOW16bkFUL0FVRS9oMCtHU1JkRGxVZHRPNjQ0RWtseWxxViA4aDc0c0lld2h4VlgyRUxjakJDMUlkVnA5UGh5RXo1L0xRZTJWQVVvY1lzL2R2QXZ3QitQOVJXMmtHSXN5T2lSb2UxRnU4aTh0Tmo1IEZERG1qeUQ1T1JVZG9iV2toaGZJZzVPMkdHT0VkTGxmTjk0eG9XVGZCZVkwcjZyS0MzalRJN2gxSnF6YlVVcTlrTWlIVTd2VUZTMUsga1Bqa2gyQlc5YnpTN2c0WUxjNEZxUStDdGxDWXZjMW5oSnNJam56L0FJRGYrZmRVNm9lT0hjaWg1RHVscWJlQnZpMDdtSzlyMWZsaCB3TW90ZCt6cDh5R3Qzd0h3SHVIKytFL0Y1VjBQazJ5V2k3Z3dBRFlBQUErZjl1eXMzU3U4b3hjMTBuanpKYW1vS1lTWVZkUHArcHhNIHpGTitMVGRWa0szNWc0V1F5TUJpNHRQQS9UeFZiNE0rMExQQndpU2tvNThCNER3R0hUT2pobDkzWks5RnBqSU9mQ2t3SkxUN09UekkgbmhzcUpZMTM4UFpKZ2NPK01pL0RCbms1U25COVBUTlY3NDg3NXNodm4rQUQvdndDNHpLRkNTNEY1Q0dabzAya2FRVm15b3pHT1BPeCBZa25Ya2NGcU5BRmpKZVZHZHNjVkNNMmI3Zkcya2EwdDRkMlI0c2tjQ3VXb24yUTBRS3ZySEtWMzF0dXdwTXE1Z1liQ0E0Vms0T1ZTIDZXaGRTekNDMjRWdk1UMXRnRDJOQXIrZi9VejRyck9BTUlrL2Z0Zy9mei9JRjZybEJiUThmS0FwTEpjR2E0UnU1RlBzbGJpVENJMEYgbktVaGtFK0doaHc4TnhmRGdJZWh2RzJFeGJRODc1emJZd0d3WWdVSHo2Q3dsdXQ3QXNmVDNXTEhsVStTN2NOVngxN1Y2VGswZmJBYSBMY2JERnNaOWNPNmlmZGxiOGdXd2QwL2F2Smk4R2RGQm0wbndEOEFmdUErQTZDWFNzNDlmSE8zMlN5RFRHVlc2QWtHS2ZzNW9ySG5nIHUyRVBlQ0VQNGJoOHdlWXJtK0Y0ODhPRE1zcTVSWTJNNXZadytBQUgvb0w4ZjZWRENwZDhRaWJhWjlpRVpVVkZFcXp4SDhneHlTVlogQkE3YmNlOWN6NzUwamRqNXF2QXliS1Z2bm1TUi9OcUZ0c3JGYWR6RU16Y21udVZVcjVVckpGYnlVU1ExTFppdlZzb0NMSGxmK2NEaCAwK0hDSVRBZHRNRGFEbTRES3ZLY2xSN1IyVHovQU92YUkvajFTZk1JYWY2YnN3OVZRdVpqTXVsRFFMNWtXRlZZZHNEZ1pVU3hnTU93IEE4T0hhakpNWDJTMUo1RFRUQld4ak1ycTZNTXRUQTJjeEFmbDErUVFIMkMxME5rcGRqc0N3dzFsM2xKSlcvRDQ4WXFVd3JzTzE0MmEgK1BqZ1FtTFlleU9OOEQ0bHdJR0hSa1lwd1lZamhFa0lqOTNkZy9yN0RyeVN0eWg4MWNlRHpsWmVkR1czeXZYOXRrTlVOby8ybTVBYiBJNDJIaHZoaHdJVEs1bnVNOXFaRVpaZlBzM0NjUDMvL0FLSDhPcmdMVHRPSTgwL2lYdmlsanprWU50aE54WThra3hZcEl0K0RhRGl3IG5yVHh3c1VTUkpNOEdXV3ljTnN0a01PUGNBT1R4WTY5YWRKbi9GYzA4YWRFK3dVOURmZGNORytrL2JqUTdOTmNxTmU2Tno2WURaaTQgZFpIZkZVRERxcmpHMGlDSHJZVmNEWmN0Z2o3bG56aFU3Tnp2VjZjUFg2TW5LenFtMWhIUXRmRlJpZk9ZNlhRcDRnREJ6Wnl0NkxUYiBsQk9peVRPZE1QOEFxTDFiS1ZYV1NwT1ZiTi9vSytoelgycFFMSEZMMFNXRW1xckpUMUJGZURDaFoxbmswbXVMc1UxOEtJV09LYk9sIGJGYkZMbHNpNkJvR2hmSEF2aHNlcXhSRnd2RkZGNWVhQUYrM3BxNmVERmk2b05XOXRWaHF1VzZrb2p1RnA1bFY4QnpkT0ZhUTVOY3EgWk0vRElQY1NxNFloRFB1SVNwclJ1ZzNDeFozeEN0OFh2ZU9LUHZ3RURoaGlmQTljZFJsTEV6VXZUM1V1OFhIUU5TOS9xeTFBWjFZTSBFcGJvY1hYcmttaDE5UGNMaFE3VXJjZVh1TGI4WUxKdWU2STIrSklRM2h2NzlzRy9ud0hUc2g2ZzZ6dHBMczZ0RzNPVzZyUTJxMmxQIFVReVpPMHVEUlRlbnNXaHc4R1Q0ZGJwOHdnSHNhdEdEZzRqazJCUW1Ud051MytkUmNCQWIvajBreWhCd1YzQlZkd09udGJHaHM1Yncgc2gyVkU5M01SRDFPQ252dWc0UTAreUVOd3VBeEJnTC9BQlV3TXN5K01WbDVCMG03VmQyREFId0ZSQUQvQU9YVGVQVEpJaWlPWTBqUCBGcHRRYzlRKzFEcG8yRWlzRExMN1ZJemxPR1pDK1NTSzdyeHRJWFI1Y29rbDFjY2t1MmM4OFNxUXlRUm1zV3NLcStSWjZnVXVrejVTIHM3NFV0K2Z6Q2ErU2JEVDJSYkhzTU96M0t3bkttK1lYQWh2bDJJYjR3VEp3RWVCVmJJWmlkb1BoTW1jTmhOODgvVUlBL1VUOC9kV0Qgc3RERUxsZEI4MVppWVdTTVQ1VmZVL0NBdStvNkhFMUFxVE9ycUVCOGhXUGluVElHTlBOdFlQYnNJd1phY3RGR0tXb0VDMHFiWUFRRCBCZXR6SC9sUUZYcXZJV0pmdG1hajNITmRvMWJ2Y3hqWUxYSkoyTnNoMDZXMk9TdFZhL2hxRXJkYmlWdVJaVWlDd0ljR1lzck5ZRlJ0IG1BMHJWRWtuRDRBK2Z4Zmo5dTlLeG8xRTNJdVZ0VEl1VU5vcUhiVlByZGU2Unh0ZW82bk1ybTdxOVExZGJUdzhPSHFFRHpMQS9vOTggbldwKzZJM0IvTmd6K3dIMERZTWRnWk54SHA1UlBDaWFqVW5FTS9lMlFRR0Zrb2JNakVEYm15ZkNtOU5yNHFQMDVYU1NKODlOQ3JrbiB0ajlJVnVMSnp1eHJsY3NXS1pBcDZncnB0RkhnUFgwZWJqZWRZMUtIemJJK1dQTU9EQTc3OWFBbkdLdHI1Z09IcFBoL3crSWp3Snh3IFdiTWFOelp2ODdVL2Y5Zy9menluN2N6S0hhS1l2MkFlU2JDbE95UzJLK29TWU9iTFV0b0N2VnpFVy95b0gxSWZNWDk4VXJBZ1R2czMgS0ZrWWM3b2hOZ3dma0hFL2p6N3JzT0hFT3BSWktoMjFQb0hKbFRKS1FSMG9yY2U3b2RqRldGRHNhdDk0VDZUc2l0M0JQaFZ5Mmp4NyBVWlprWm9LRXhsVnV3UzdQdndBQWY1OWowcTRZZExzWndHc2JIcDdkZ0s1VDliMWxWK2RZZGdTN2dBaTZuMzZZdkorOGFrSzNocCtBIFNBUGJiVU1NeFBpNHNtRE5oT2NQM0FRR0lBQmowb0o5UllWWmlpdXlXa1g4MTAybWVDZk0xSEpJaGZMYmE5b0xYTmdtTzJVVlhoTWsgaUs2c3pTaU9PK0hTV0tXQ1BjY3hzNk1xdU5yTU1TMlFCRzdRekhTdENnMERjbDJTWmpRa215eXNOQXREWXRxMVNpWHlWRDJkUHF0dyBwUHc5eGU2a0RjQ2UxOEdKbkFnVGZNZC9QZ04vQWIrTnVnY1JZeEF4UVZndFNrN0xqZ0VMRUtmbVJ4SmhYYUY1b2xCMkJiRG9kcVE0IGJBSHNaOGNPM05iakJsWUZCZ3RIU2Q4T0g4YmQvZno3OTBiS0NXd1ZwaE1ZMk9oMGhJc1o4RzJhOE5VT3Y3NW11UlFTcnZzUHRXdEwgZDJJYkl2ekVkRCtlY1QrNW5QR1luL0VPN2NIL0FIL1lOLzJCZ25HRE5kOVBiNUxwYW1WdDN6Ym11TklyOTJ5VStKRHVTMEZPcndBZiBtQmd4VDlxSnpnSG5jZnN0VVR5YU5hRFFzb3dOSjdKZ3dCOC93RS81OStlSHdsV0pCamhPWVMxM25lTk1SUXFxUEZuejU2R09OV2thIHlqWkprTUd5eHd3NFBBOTJYQi9SNDU0RUkrWlY2UlM5WVpSNnlKSmx0QWhDMm5lR0gwL2xtUm9WNGo1RlR5RU9xME90M0F4WUMzTzcgSDJaeHNuWml2YUZHMi93bmV6aDhBd2JBKy9mZ0RVVDQ4eWdyd1c3dUtJZHRXMDBPQnRlanpBOVh0WWUybklURlRRN0JaRVArVGZHQyBKQlE3Z0FndzZ5TWZNTExHV29FdEUyOEFBR0FBQmo3bno0cER6Tks4V3EwK0FBcGkvcVpUWGFybDRPeU9GZnhJZGpnVlBYMG1wN0JaIEJpcTVrTXdRRDA3QXI4Q0RjTzVqUTBNek5nYjJURFlFRUFnbjkvWUQ2K1h4ZG9MaWZaQ1E0a2x0VlBXY3BUS2VmQnFlSk1Ia09KRmwgekUreUszZkVPWVlZQTV3OTg4NU1HRk4wV1NadzRFcTVIUVFHTDh2cjUvZjhjN1p6TEs1VEYyVEJuV0xaa09RREVvK1QxaEdzamtVYyBzQU9Mc1Z0Um9ZVURvcUtnampWSGlsdHhpVlVtTnpqbWJvdDR4TkJ1YWRtb3k2NkRkNzR1ektVZzlvMlJwbzFYTnRPSUQ0QmVKZjhBIEQ0aHBHb0sybHNnSFE5Wmx3ZTlmUS9yL0FQT0RMeXhmRWJmUE5vNzhmUGdFSHdHQjlHeURqWTBhdkxJdmg4bzBicFhWME5TWHJnTTEgNnJsb2lHcjRIazJpSy9EUTdIcDlrWEU5YkI4ZlBQQWQ1S2ZlZk5wUE9WOStBZ1QrUGdNT09HMFpsUzEzRHQrMVE2aUJpb2IrSkh6RiBzUEVaTEdLY29LUGc5a3VCQ3ArN0VOZ01IRkpmYlRhZnRpdUxKakRsWEJPNmdEait3YisvUDNUK2M1aWZGMHYxNVYvYkcwWVptc2FjIGJMWVc2M0lYSFc5b0lmOEFEa2V0UlBZME83RnN1bjhrcmlsaUFFRVlyTm1mQmJNTXFzMms0ZjBDZ245L0FBT2lqMjQyaWl3bWszcEkgd3paYmxTQ1NLUjVLb1ZtWWxHTi92STFSWXl0S0xhUkJod21acWtOQlVCNXZDalo0OGpnZktsQmk0OWxnNjNxcktNYmJiNEVhdkw0RiBWUjNldCtHaVl0alE4TjRmSWFleUw3S0RyVHRvMUlkWjFtVUdkekFleUpPLzRBRDRBL2lBQUgreFhrTDZaSVpET25oRHE2d2wxVlczIGNnU3IyMmZQQVloUzBKbGdCNjN1RFJuUTRjZXRnNmxIVXRCclpaR1doY296Kzl2Ry93RHMvSDBFQjBZT0NPNE93TWJQcTV3WkUreWwgc2E3M2cxWFl2dTZlTFE3WmZTajVYOWIyUjJmRDNBUCtEUDhBbnZCaFpLTkN1VEpvN3ZhSVFIc0Irb2NINC8xSTFQRFhQNFNJYlJhQyBFMlZXMkxaSnJIdmMxT1ZFU3VtaXFJd0ZQZ0dHVytLSGU0Wjlhc1pzbnpqbkdHYTQ2Y2VTbjYrK09HSy9nQXdmbUQxTVlNaVBQTE8wIDJjakdPS09ISFZxNzAyekdOeHFrbWszSFVmZHlPTUxZUXAzWW9vRHQ1d3g3enp5Z3hpQVdaTFlwMitWK0RmNnJsZkxkdVZHR2pqU20gVmFpbGt0R0lSc0gyRXFoM2VHZVY2UnhWNGZ6QTRkd01NZy9ZN0xIMlc4QjJabVZ5aU16YjJiQ1lIMy9ZRDRCK3h4NmNFeTFDanVoLyA0U3ZUNmt5V2dIWlBqM2xkaStqNFdOVit3aStQaDVpMjRRekJERUdoc0RiQkRvd3hERnN5eUQyUjIvWU5nUDhBZ09odFRydGJhTEVhIGpUY3lXUXFsTHIwM3hMUVNkbllWc1dVcHlMYUNHUW1WVytHSEJ3NGVqVDZQUEk1aEdScmtWMlpaZUxSQ2Y3Ky9ZRUZnNjR4WlZrYUYgZkpkME5rTjB5MFdwR2xyNGVwYUhZWWI0aE5oU2tiZ0lCMlFQRERtTEJaTUlEaDg1YldkcjdtZWJOVmNjUVQrUDM3cFp3NzR3cU00KyBuelJaTGtpTTJZWGNYRHQvallyM1U5TjRybGlic2FwT1VkSW1lUkJJUmNiNFlFdkMxaTVFeW9OWHA1ZUd6b0kySFVaQXlyNU9WbWdTIFdkWUtUeXlRTnlRLytvM3hXaGJJVGZtV1F5dzAvQUg0RkhaR2FzMmo3T0NDYkorbjBIei9BTG5rMWJzUm9xTmJnUG1kVXFKV2llRkUgeUtyV3g4UmJsSnZlNHBNVDNBeE0wOXNqZVFaSGhEWUo3eFZheXpQbU81Z3duM2crQThCOWc2MG1DaEIzdEFQWE1XdDVPbTk4UFZkRSBhSWVkWUJhWWVLRm1pVk1JTWo0K3pUSzB2aHprQlBiWnpJVEppME42V2ZDQlBaKzU4ZzRiQUE2bnJFdWdXWnNHdk1xb05QZFhhZXpLIDNVckMwV3JYenhZWEtRSmE1S2JjR0VQRGNGdGtaQ0RoQjdYVzBjNHlUYUJiMFRSemJ0c2ZBWDcrdnQvZm93WU1TUm1rRkNKTm5jeGogSUJXSld6RnlkcHdXdlU1NVhEa1lGQkdBWlUrcGRvSjNrYkZOdE1mV21halVFZVIzWTY3OGs3MXg1VXJRUVczeVpiVXRqdXdhZW5vYSBURXRod3ZpUTJPRGtVYTkrUTE5Ym1MYkpWY01jeVFaOWdLWDBibENHekRLcnV3SUVCbi9BWVlJSi93QnlTSFNlbk5jc1Yyc0VGcVdKIElkbDZleVREZEhiRytGNE9VQXRrcXVhM1g0WmhrbWJPbmgvbjg4Z3NoTVloN25VRHc3SlBuL3YzZ1AwYzFsdW5mMjNMQzFTbmdMYSsgejc0M1dyOVJRMm4xT3lGY0M3Z1lxMlFxdUdITUxjeGdEcXZIMUZWV3htNkN4ak52ZTk4K0FQejhBNENmd1BvY2ZVK1lyaDFWcG42ZSB5VEpBdHBBN1QwUFlWUHk4YTVQQ1pVVjhUekVQQ0dabWN3NEdRN1ZUTE1XU2hTb0ZrNStVUWRSSCtBbnovSU1PbWpjalhjQ3ZISUVZIHhvNkVUckhHVXhqRUY5Mk9SQmJjWDRHUFFveXlQUzJOdEVEczAyNmpTYzVTTytDYk9kREZjWHVqM2R2TnV0UkV5R0xzeDJjcjR0cFMgenUxY250UE1ROU43WnVpYWtJYlJEcjh4Vy9aK3lJZGZ2blBHQ2YzSVpobkYyYXMzaDI3WFdvZnd0MEFBUVB2d0N0K25Oa3NEU3JiayBPQXgzTkpHNVZBalJPcEJ3bG9FdUhRL2VPSUxERDFzUGFnZGt1QWV5VURaZHdBVWQ4R0RDaUh4bi9STUcvYkQ5Z3czL0FLNDZ2VDZiIFNBVi9IcVZ1Q2lxVGlYQTdNTmZXRWgxZUptSzdSVThWWG1VOCtJUWV5RnU3RjlrdFRqODg1L1FhdWpld1FJYlIvd0F1OCszOStRVUcgWGRPMzlsNUNxcHo5SzZTWmdWdmFGcm1Mc3VhbjdqTDJnME1JR0l0NG1FTmxXZzVnY3lCRDlJUHM1YldYam5pTXRmZGtsSFBjQlByNSA5K3hBQUtsaVNWRlNSMEtEeUVPZDJFRFdlM0c0MmtRVlo3eTMyVTF3aG95SklVUXVLSkx5Rk51TVk1dUJnMmRXTEhiL0FLbTY2anJnIFpCNmxZQjRDK1cwMnczeHdOaVUvK0paSHRpMUhKWHNJcGJWcU1MNVQ3NHR6REE1a3F2dGRBVldWNVpxdlEwWlp3M3RKQjdBZlBuMzcgbjNUT1YzaFBESnhMVUVocXVrdHFLRE5QQ1JYN3NOUjJIYTdhcEVDTFFpSDhRbThNakpSNGV1SHhQc3l1UTZ5elBpR3NqTFVkdFBGbyB2SDZBUDkvSHc4b1lyT3FsOE8rUmM2bkJ1VTFJRVFoZVdjajFPeU5BR25MYUtHSENaRFRueUcrRUc5SFF4OWFQQ0c4clA4Umxack9EIHNrbTNqWUg3Z0ovK29Ba2ZEYktwekhaU1hIeVFCcm5jbmNmTkpVZkxtV05LWVpUNEhUN3NENnRlTjJvQWhuQUkreTRMSU1yTXBWeXkgakk5WE8xb280QUFBUDcvKy93QUpjcWlvUFlpcVQrYXhBUDY4SGpuaStlbElGQ3U3aTBYSEkzN2JQSEh6ZFYvMitlbnd2aHc5UVZXTiAvaHkrUFlXVm5ObHhxMlRuRDJ4d1Z3UmFwUUtlbm1hZmNFTndzaGdNQTU1QnRSL3ZOWHE5WmpOa1NjRG5nRjlCUC9RYWpyZTBDN1FiIGZoV1hLQUVzWjRlTjNBUTY5WUMwd29BWGlqa0hUL3NZZUh5QmtnejYvZkFRY1o5b1JzTjhOLzhBVERFQWYyQUE4ZE9hblhhWVVNVjggcEU3SVNkU0x0WkREVDRGd3NqNXR0U2xNREY0L3M2ZlErbnRiSU1rNEN3UGxjdmlOanFMRnZKTTVkbk5qaDgvVVI4K0F3UG4ra0V1TyBpZkZIdFFFQzdTbHV5MXR0NE83Vks0ZDRLUkExUGNpdStMNmY4eTFJYklPc2dHZlR3S29IM01XTHN6WXpmZTFIdncrZ2dBSEFRQ0MvIFJ4V1RBU0IyeGFOSFRET1B3cmhzbXErYkZHdUJadmkxWDJFU2JlbWE4V3h6eHJDK0xXN3NmSTRIemQ5RWlXVXNCSUtPeXRYT2Q4T0IgcUtxNllyM25YZ2QzODl0YlJ0Nkd5QjluY1BodFI2d0orekxMeStLNHoyNXNrN0FBQVlzR1BnRDdDcWNvbExpdXF5dFV1bS92d0JtViBLMlZmUTlTb0hENHRYMkZZd3N3d09ITDN4a2NDSGdiQlVnZTUvUTNuK2lkajVCK3V3ZFFMcGJEZ3g2aEVOanlpUnNNWlpBbmVCa0dCIDVsUDdEV1ZjaTF0ZlcrTnA5a0J1U0hMYXI3czZ0dk5tWTdtTUJ1MnluSDRBdm9QUHQvQTlaSVQxZGozZ1VVUERPVy9KWVhsUHNLcjAgZmkvYzBvaHVMQUhoekE1Z3dRaDJNcEQrS0IxbDU1UXpEUENiNXNIdHNHLzlER0dlT0V6THN1NmFmVWxQZmpsbDJaVWwxL2l4SHoyOCBkTm0yMW1tV0Y5NnAzaGpPT0c0WWdnTGU1c2J6SEhkWDVxeUUvcHZLV0pZS210MUtlYXRnWEE0U1d2bm9jampjWFRucDdhVTF3cjlEIFE3Z3NqZUNCaUNQcjg4cW1DYk1VS1lveHcyRWR1QW45L0FBTi9BQUhaSEZqdU5qU21WWjFnY3RBcVVRZlpDM1lBbW54Y3BzaXlvWSsgSFcrR251WlZmSkdvOVI2a3EyUjNmdEdyL0JoRWwydzhBZ2dOL1BnRDZadG1SWGJRWUR6NHRoU1Z0alNWS0ludUNUSUxHRmNYWHU2NyBmQ2h3NXNQbUJnNDJwKytjWisrUE94aEFsbzhCMkRCQngvZjdVT1B5RVBSMmVWek9DQlFKa09wQ2RUR2tWVmNGNklldENXTEtRMkFNIHR3NjMrR3Z2aHl5eDdiUGhzM0tGY21zZ3dnVDZDQVAvQUwvaGgweWFDZHRwNGRMQ3NNOHpRa3F0U2Zadk1rdjJidHgyTVRXQzhrSHAgVWNzY1NNak81bWlRdktVYkRLaWhVRWQ5ZUdvMmVTZURmUjVvcnIrOUw0WUxDelRJY2JXS2ExRWtob3JGVXoyRlBQUmJDVjlRTU1nWiA4d1lzZ2hEZUcyd0h1Y3RyRE5RN1M4b3lQVjNnd0FESFlENzZBQWRKOXdVNDdPUU1acDZqUWlIY0dUd2pibHUrTjRjcFVTTFNLMzhPIEp5UmtNSjdKWFBNVU9Bbm8xWjRpM25ZMGszU1p3QWduMEhmL0FMOGcxWFQ2ekYxbm1LdmNHR2JUNHRoalY2djJUT3BjdC84QWVhMCsgbEZ0ZlpUQ2ZEVzJVZ1lxczhRK2RNc3dZaHZqeU1lUHV3TkJBWWdBSGdlbjlJdWcya01mY3ROR29Cakt6Z2piWCtOVjJCYkRJNUpvbCB5VjdJSUo4TmJtVW5ESHJjNVNxK2ZPaDFBekNpak96SEFtTjJJL0FlZmJCdjREb1lqcVltbGRWdEpuVjlPOEJ6a1NBeHhST0ExTGdaIHhFaEJvMFZxalZrM3dkVmhLdkEvT1FkZkZsQ09iRitEK0tzZm5yekExaDNycTNhcmt6cGoyS1ZxZk54VmtEa1lWN3BGVTZPaTFlQ2ogVHZUS1BlcjFGVktYWU1vclhsaEU1NW1jVmMwbzNqRkx3WjAzSktUQnczRXg2SUVmT3ZhRlYxNmhrdVU1Wm9namF0ZVpEbTR6bm5NciBhaHI2cnlwNndyLzBteFFhT05XbDVJdkpLWjdCSGVqWWh3a3puU3BrK0tIS1poZmNsMFFJQ3lZY0RKenJVbzB5S2lEVGYybFNJaWpPIGFYT2xWUjNaRmprYU4yeE5ueWE2WHZhbnkycjB6dHdXZFhRS3g0SklDeEtvQnJnQUFVVHgwajJGZlhxdHJ1bnJmVWdReUpZelprYW8gTStBMWV2SnpQU1pUQ0ZNK3VuM1pmS0FpVVBOaGtHR2FabU9CcGJZZTU4cXdvbnBybk95cXZXb3EzWHVYNmxyMTNzMHc2ZXExMVJmOCBVelVKcC90d0dJa0k2Z3c2alVLUkpSRTJ1YWpPT21Rc1ZkVUI0T3d1dWJWS1VtaHlaM0VpNFRzVDhZZUZFcXJ0RmdDNEwyc00wUExtIDVNL09zNjVlc2R4SEk0ZGc2cENGY01Rd0Z2d0d1d1AwRFhReEFDUmFBRjZxelhGbjhuOS92cnp5dmhuS2FYNnQwdjJUU1BwR0tWaVggRi93dmdGODJFNXpnb2h5TG4yM1ZDenVLeGNJTE55WG1FeUNNaENNQUZSWEZoRTdJRjVZeFNqZ0IvcldjQmNqNVdkSnQvZDJrK2tqOSA2NFd2Z3FSZzdBME5MVWNQQ2hVVVZtS2NwZzlUM2xCNWg0ZXVHUmhlQ3NsQ1orUENzTWpuS2VBTExrT28rSGo2Y25MVk12MUt1Wm5XIGRhb2lmL1V5bG5COUxxUTYzMnVMZzRaZkREazhFRWNuclk2STM5alNzeXF6UnphWGJZcUMwZVdlV0JJdGNxR1dOWFF2d09xZlp5b2ggdFdrdDJhOGE5VFYwa25nNHJPbllxWXpQQjVpZVpieGdVa1g5YW1WeVp1WXhMWWYxbEFvZ3A2RklNYWhKMlpPR3c4eVl2eS9Sa2VuTCB3R3EwZ3Q5di93REVBdFdnc3k0TGxyR3MvVHA1cTVybkFhV3NBcFdjVXk5K2h5VzNkYXNBcVBCK2pBTG5OOWZPNXoxdFZka0k0bUxHIFVKNG9BT0Z3Y3RkQ3dRbVhuV2RHcE8yT1R4SEt3NThNdUdMRC9NdG5FK1JabzlZU0FQQUE0WHdLK0IxZmdPalptUW0vOFdETGVYRnUgdXhoMFh5Nzh0ZWhuUzhNMWRzZzh1dnNRczVJelVkbWpDNjU2VWlkalpROWVBbG5VZmxxTVFabE1vVVFiVElTZkpHUU1JOVlkTUYvdCBobW82amVzOE10UXp1b0ZtTEtiemlJNVFJaVFVa1N4WE9sWmxmcHVRUGFJL3FVYTdMNUhyempKWkFFWnVTbjV4SFB6QmtRTENUc2ZRIHJlak9zNlc3dTArcHlabXFkNnlZbXJxNnNtdkEvd0NuV3VOVldOTVZDM2Q0Z0MrVTgxNThuL3FldnhCUWhPYlFGbTUvcG5ISW9zQ2UgUUprSlpoRXZWQ1h2UTgxcFpOZTFTQnR1UEdqWldYTkQyeVJWZlZuNVRZNnJ4QU5PYnNaeEVjd1pjNWNJVEFXY3dVaXRGbHV0MjFNbyBuNmpYd21UVHJaUlgxd01UeFVsa0NDQkJVRnFvN01GU0Q4a3dSOWNOV2dsMnFZdEJERTRzQWlGV3FYTm5DaU9LMVgyV201MW5UZkVVIGpqM0xoaTMzTFk1bytSZEM2UFB6MVUvOGgvMi8vRHJqMDhWMkd1YlQvZFRveXlpQWowcTRUVDFBSEp5bDZCSUpDem8xeUtMdTludlEgUldQUUtrUjV2cUErbWNUVUZQTXpNN0QxalZXZmg2NS9xTE5ZaGRhUXlUc1F6bDFwcGZUcmNFQWxzb1pkMWNBM3lGdzZGaTU2WURMRyBDVlRKaFQwZ3dvN2E4NzRCQVZZWHI5YytBY0lHNDgvT1VGQ1BPOU1rVGtIeGpEbldkVTVQMCtxNVA4eC84Z2YrT2xwN2wvMi84SjE2IGRyUzdBeGJMS0ZCYzBpcCtpQ25hK215Tm1ySk9iQ2plZzVXaXRXVGdpZjhBTXV5czZjbit0ZFdIZTRYWjVGb1hxWE1hOXlISFBFc0cgQ3BqUEJDczJOVGZQaTQxVC93QUIvU2pyTlg1NXdoYUx3NDJ3V3oxcGhZMkFuVkt2NjJqSXRMSk9SRVd2L1FUaWpsREpuNWRjcnVUbiBTZytma0Y4WUdZYkQ3bnNqQVhHeTg2enBFQUJranNYNnFIbjhpNlArby9QVnQ3SlAzR3dQN0Jxd2YwZmtkVmNxbDZNTy9xeFJobnA5IEZhQUlGTmFWTEJYY0sxSU1BY29xdEZ5VWJXMU9YSjZ3eHMwYVlTOGhjdEN2SFltdnNTRWZtRzYvRlJvSWJCS1ZsVDBqOFBUbTJjcFUgUE0xRkJLSnNDNW5HeUhNMW4xL1gxbHp2VGpaRHN1K2tteVdSRE1PTGo2eVJWU09BR2VabHptbFppSFE4ek5QNG0wc2pLbFp5S1hXZiA4QVZnTXpyT3RPcEFTS0IxQVZ0cFV5WGhzSFlaSllvNHRReVc2YWhZTkRwT21KTW1wc2srdDhtL09OK2Z6ODlVeXRITEpycjdiR255IE95TWVmV2tiSVI1Y2VENlNPQVE1a3l5OVF1VjdaRW5MYVZQSVhXSEQxaEhwUkFZamZSaVF4eUpJVWRGRnNHVWM5TWFKblI3bzZtOVkgbHgzalN3K3pwZnFVYTJmN1hYcmxyVjdjNnJWWUlCeE1xYW5wU3dzVENENlhRMTYyVndnY2lLNmJrY1N6K2tlZWl4aUt5WmR3Y2VQQiBqc1hwOVVET3M2VklCOVhFYTVGMGZrZnhlRDhkUGo1ME9xdm10cHgrblVQaXcvRExaeGJ5TE5FZEpqL2h4TWJycTEwbzNFUmViRXNaIElZdE90Ylc0SXJacnFCNlpVSmlqeFN4Q2hjc2prR1prY2pQamxoUllmWXJDTmFsUE5pWlNSWUhweXd4aXhsbHVad2cwOUhiR2RYOHEgaWh1dFluWHo4N3hpMmthMXJBeXEvSUcrSE1ucGFjbVkxYVpzai9tc2NNYVQ1aTJmS3dPL1RsbWcyb1FGWFhGZXpCcWZnQlloMlN0USA4cjE1MW5TdFAzNlBVNTkvci9mM2VidnpmbWhmNXJwdW9Kam5VeGt4azNlSGI0MjY5dGZrOWI4MmRiYkRZby9PWjlRbHVORXhxcVNxIHZRd3pqMlhWODZTZVBSUitxbDVIdVROaDIweTQ3a3p3U3h0cmgrck1kWTdFR0xoV3NpTVl3cHJLRXFIcVdyR2FTYWFWdFJHcWl3NjUgc0xQbHhoS3lXMDFlZ1VYUnhLWlh6UEZGYW1WUmp6R1pXZ0drOVVFWm9GSXI5Y1RvTmZWQ2pyR1VEVTBpdmlyS3M3T1Vqc0JMTnpzNiB6cVJBQllnQUFPN3h4OHAwcHY4QWluUHljYlB5ZWVrSk9xWlVPaW1DblN2cG15MU92SUxxOWpmMWdaR2NYbXZnRXJxQW5Band1S1B5IEZUUFVvTmhMZU1yMUx3MWJGUTNDS2FKWmxuYzhNd2xrd3ZRRlpVS3ZqTkpHbDJaTmFuTm1MM0RvaDEzMjh3SDJuUFZ5NXdNVjBhazcgSVNxZFgxY2o2bFhKekJ3T09HT1pYcUlscG1CT3dSODBMQmtwRHduYm0xNWJKbldkYUdKeVhrOFN5a2Zvc1lzaVB3VFFzL05DK2x4KyA1MCt4a2dESjlqQmR6RU12Z2hiT0lJSUZtdko2TTEydmptbTNVUFhVU21ybXVsSncxRmpvSHB0aVNJYng4R2VhbjBlQVNUSzBlRHpvIFFDTEtUR05pOWZxTWpiQU9KdWFCSXVZWnNheGhYUDhBVkhNNTJIby9jS3AxNGRxSHVOZTlKQTlOT2s5SnovWnRpMlVVbXhDVmhXNjEgVzFvZHpkVWJzUWZ5VXNmbUE4b25PdUJlOVJxQzFJcThrdkFhQVhsaVJUVEVpaDA3Qlh6ck9zc1lCMUljZ0YzZ2lMdVIzTVZ5eExONSBZcmsySkpOV2FxejA0RS9UNkhrOEdRRDlCdG5JRDhCcUYxNW9YNDZTT3FLMFBTUVM3L1BqSzNxWlM5RklhWGRQTjhWOElWa2lOQmlEIG42UWV1cFRtNFN5OHlXUmNKeXFYaUFzMHl5cG1jejRMRGU1TUxHN3R3dzYyVG81aUZFVXNzRWErMFE2VjlZQ1E3TmE1YzAzVURicTMga3lvK1Vva0ZnZU5rYUl5MXpUc3JJV0Rpb1ZIRU1raExubTYrbURUK0JrTDY2d1BFRnZMRjVVN0lFbXhtZFoxdXNuVDZaaVNXYlBKaSBiWnFhS3JKNU5XYXM4V2Z6MWtjQXpvU0JadS8zN2ZQNTZZRlorZ1pjRkhXdGNqR0sydGxZM0lMUnpTUFYyRjFEaEdXbjdJMHpWaGJMIGJYWlQwNHRFbzNrcnBVazBUMVdkNkJKd1pPS0k4WWNETlRpa2lMaVN6RlpZelcwcmlUUjl2aldaZ3oySTVJczJsbzRWa01rSGxHVzEgOFpaUnBMQW1GbExlNURLQkhtRjhMRGllb1lMa1JKcUg2eWVYbkZpYVdSSUVTc2lmbldkWms5Mm0vVVNnZm9BcFFINEEvSFUxanV1bCAxR0xNdHlNVGl4Rm0xNU5FV2YyZWVvVzRkWjF6aEUrNmErRit0VUhneXRFNmZYdzlJR0FObkxIQ1NBc05xZU1EeUNBYWFQOEFVS1VpIEkyeXllY1dWMWpMQWlQa0NSdVFJamlCUk56R05kMWFKVUlsM1VscGpsSHpMVXVFclcweTFOZnRqejFKbUw1R1c0dDVEWGtDamt4Wm8gQ3hTV1JUa0xSR1NrcWhPUkc5Qy9sR3N1YUVpNVVNN0ZHNWtvZkl6ck9zV3BKVFZSUm9Ta2F6UjRvcEtvdGl6U2lsRm5rME9ldWdpcSB3a3lVTlVNbFpBR3JWTHE3OC9QVm9ORXYvRGcwOGFuS1U3a3YzcFl4eDMwT1RNQjlPVXV3YTN6TXJOaHhjeUlVOUdjUUt0dGR0aldiIG00U2pFdklqU0RyR1R4RUE4Z09wZ2ZTSlVsMWVCQzg2enJPdTNITEtGVUNTU3VQdmI4cCsrdVBKSEdYY2xFSkxNU1Nxa2szNUpyOUQgL3AxLy85az0gIgogICAgICAgeT0iMCIKICAgICAgIHg9IjAiCiAgICAgICBpZD0iaW1hZ2U1NjU4IgogICAgICAgaGVpZ2h0PSIyNjAiCiAgICAgICB3aWR0aD0iMjYwIiAvPjwvcGF0dGVybj48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQzODIxIj48c3RvcAogICAgICAgaWQ9InN0b3AzODIzIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY1NjU2NTtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM4YjhiOGI7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjAzMDU2NzQzIgogICAgICAgaWQ9InN0b3AzODI1IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MjciCiAgICAgICBvZmZzZXQ9IjAuMDYwMzc1MDMiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWU5ZTllO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M3YzdjNztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMDk4MjUxNDQiCiAgICAgICBpZD0ic3RvcDM4MjkiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlYWVhZWE7c3RvcC1vcGFjaXR5OjEiCiAgICAgICBvZmZzZXQ9IjAuMjIzMzk4OTIiCiAgICAgICBpZD0ic3RvcDM4MzEiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzgzOSIKICAgICAgIG9mZnNldD0iMC4zODI1NDUwNSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MzMiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTJlMmUyO3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzk5Ij48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM4MDEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzODAzIiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM3ODMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZjlmOWY5O3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3AzNzg1IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTU5NTk1O3N0b3Atb3BhY2l0eToxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzg3IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc3MyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM2NTY1NjU7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3AzNzc1IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3OTMiCiAgICAgICBvZmZzZXQ9IjAuMDMwNTY3NDMiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOGI4YjhiO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzllOWU5ZTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMDYwMzc1MDMiCiAgICAgICBpZD0ic3RvcDM3OTUiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzc5MSIKICAgICAgIG9mZnNldD0iMC4wOTgyNTE0NCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjN2M3Yzc7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3NzciCiAgICAgICBvZmZzZXQ9IjAuMjU5OTc3NTgiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2U5ZTllOTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDM3NzkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzQwIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM3NDIiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzQ1IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3BhdHRlcm42NDkzIgogICAgIGlkPSJwYXR0ZXJuMjk2NCIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTg3OTI0NiwtNDcuMzY5MjM4LC0zNi41MDQ5MTIpIiAvPjxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDY0IDogMSIKICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgaW5rc2NhcGU6dnBfej0iMTI4IDogNjQgOiAxIgogICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI2NCA6IDQyLjY2NjY2NyA6IDEiCiAgICAgaWQ9InBlcnNwZWN0aXZlMTgwIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzQyIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2I4ZjRmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDM3NDQiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNiOGY0ZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3AzNzQ2IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3BhdHRlcm42NDkzIgogICAgIGlkPSJwYXR0ZXJuNDQ4OSIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJtYXRyaXgoMC4xMTk3MzAxMSwwLDAsMC4xMTg3OTI0NiwxMTQuNzU3MDksLTM2LjUwNDkxMikiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwNzUiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNzA3NyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDcwNzkiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAwNyI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A3MDA5IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNzAxMSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5MTMiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOWFkOWUyO3N0b3Atb3BhY2l0eTowLjMxOTk5OTk5OyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNjkxNSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzlhZDllMjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDY5MTciIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjgyOSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxYjU4NjA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2ODMxIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMWI1ODYwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjgzMyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY3NjIiPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjk2NDZiO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIGlkPSJzdG9wNjc2NCIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzI5NjQ2YjtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBpZD0ic3RvcDY3NjYiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc0NSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2NzQ3IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjc0OSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NzMxIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDY3MzMiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A2NzM1IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjUxMSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDMyMzk7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A2NTEzIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNjUxNSIgLz48L2xpbmVhckdyYWRpZW50PjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNzYW5kX2JpdG1hcCIKICAgICBpZD0icGF0dGVybjY0OTMiCiAgICAgcGF0dGVyblRyYW5zZm9ybT0ibWF0cml4KDAuMTE5NzMwMTEsMCwwLDAuMTE4NzkyNDYsMTE0Ljc1NzA5LC0zNi41MDQ5MTIpIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NDYzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDY0NjUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A2NDY3IiAvPjwvbGluZWFyR3JhZGllbnQ+PHBhdHRlcm4KICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI3NhbmRfYml0bWFwIgogICAgIGlkPSJwYXR0ZXJuNjQwNiIKICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJzY2FsZSgwLjEzOTIyMTMxLDAuMTM5MjIxMzEpIiAvPjxwYXR0ZXJuCiAgICAgaW5rc2NhcGU6c3RvY2tpZD0iU2FuZCAoYml0bWFwKSIKICAgICBpZD0ic2FuZF9iaXRtYXAiCiAgICAgaGVpZ2h0PSIyNTYiCiAgICAgd2lkdGg9IjI1NiIKICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIHBhdHRlcm5UcmFuc2Zvcm09Im1hdHJpeCgwLjExOTczMDExLDAsMCwwLjExOTczMDExLDExNC45MzgzNSwtMzUuMTgxOTU2KSI+PCEtLSBTZWFtbGVzcyB0ZXh0dXJlIHByb3ZpZGVkIGJ5IEZyZWVTZWFtbGVzc1RleHR1cmVzLmNvbSAtLT48IS0tIExpY2Vuc2U6IGNyZWF0aXZlIGNvbW1vbnMgYXR0cmlidXRpb24gLS0+PGltYWdlCiAgICAgICB4bGluazpocmVmPSJkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRU2taSlJnQUJBUUlBSXdBakFBRC8yd0JEQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIgQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC8yd0JEQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQiBBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC93QUFSQ0FFRUFRUURBU0lBIEFoRUJBeEVCLzhRQUhRQUFBZ0lEQVFFQkFBQUFBQUFBQUFBQUJnY0ZDQUFEQkFrQkF2L0VBRUlRQUFJQ0FBVURCQUVDQkFRRkF3RUkgQXdVR0JBY0JBd2dWRmdBWEpRSVJGQ1luSVRVWUpEWkZFekUzUmdrU1FWVldLRkYxWlRRNFIxZGhabWQyaFlhVi84UUFHUUVBQWdNQiBBQUFBQUFBQUFBQUFBQUFBQWdNQUFRUUYvOFFBT3hFQUFnSUJBd01EQkFFQkJnVURCUUVBQVFJREVSSUVFeUVBSWpFak1rRVVRbEZoIE0wTUZKRkppY1lFMFU1R2hzUlZqY25PQ3d0SGg4UC9hQUF3REFRQUNFUU1SQUQ4QXIyeUM2bnJSTHJlMzYrenY4RmpmSkxZbjBiWkIgZ1F0QzJoM3U0b0hwK3lLclcwTmJEMkJNc2JiM3c2NEUwWVcrWGtNZUFodXJqZ0FCZ0FxS2c4RCt3UGlTcnBIOGREakF1N1Q1YU5qMCAyU3NDN2FYYTRkSVZQVDljMk1KUFJhM3daQkV5MUlWSlFBeXEyc0VFQ25zOWxzK0tOOUpkcXYyQmdmbDlnQWZvd1ZGSGc2L2dXbzFVIGpQMDNrcWY0VFc3Q1lWYk9jUG11U3hMS0svSDYyK0hXNmZMSGgxUkRINzRoMloza0YrN3h2bFhJL2FJQUE1OGY4K0h3cmNwOWN2aXYgZTVlVlZ0SnU2U1NpTUNTN0k5ZXNuOEw2UVVLR0dEN2duc2o1K09EMm45dE9MZFFFMWRYWnF6T093U3JqbHVnRDUvbndEejR5UnlZVCBHV1oyZEl6SWtrZnBTTkF0YklWaVh3dTNzMHc4Y2ZtUkxHN3dQR21DUE5HUzJXVzQ1SGUvZ1kzMjBMTmZucDVKNDkwZ1plVG0xTERDIFVQWUtHa3k5TjkyV1FZNEhiVFE3MjFxZ01PQzF6Q0dudUJDWjhDajlRL0ErQ29hSHRuNHU0T0FQZUFBTUcvNHZpN05NOUg1Vm9KK28gZTMwcnNQbFdvMnNKQXhoSWlCMmhONTVGTUVJYjVDaHJZY2M0UVZLd0lGcUo3TjRzWndmbTFvby9nUEFZOEI2V05UMllEcjY1REptdiBiYUpaemtIcTdzK0JzSWVwaHloL3MzYUhkQndjRU9HSHRSZ21IT0h3SjNCaWROdEF3WWo5cmtrRjUvMysvZFNOWjBXMFhKSUQxTFgxIFYwbStTbnVnWWtnQWgxT3dtSElVWGxSZjV3enFFdFN5RU1laHF0RDNCV2p3eUxQWnRYWmhqdzdCTFIvNkgrZm5qL1VuY1I0enh6T3IgeW82YWhERDJMQWNOd3BJenRITlhHUWZUbkh0cXNqMUlpenJMcHA0RktSUEM4V2RISGg4d0NvU1ZNcVVreHlKZGR3YWhTVWpxOWZ6NiBmbUQ3ZnJHTlRLMjdSck5rYU03bHJlc254eVE3QmZBTU1nWW1DRTlrVUIyK1ZLUGZJS2VqUEt1cjhtNFQrLzcrQStnNGIvMkhFZHd6IGJNdkp6eHVDL2tPbGdOWEpBOGxXVmZ0bjhOSlJoc2FLWUgyVFc5MW1BOHhoL2tCNmxZMHpjMWRvSm93TTFWeHNIeDhBZ24rQThCNlkgVDQ0YWpIeXY2M3pXalBzaDhVZ0xJSlRsVWJJcktiVjFYc0xTQlF4ME5EVzRiNU1yOXdnOC9ubkVObVJpZ3A1UnZ6WWs3QitYZC84QSBQci9aVWN6TFY2ZmFyUWdWTFYzenpEL1lWSHVBSDVhZUJLQ1lvRndYak44Si93QU90eURoN2tGS0N0b3lOeWl6Qm05aFFscVZEYnFDIGZmaitEOWlmWVJLcXhzeGYxSkZUQ05Na2p2NzB5WXlMSVB0YVNTV3VjUU9jbzZ3SDA0VXgya2Rta1pzcEpLd0FWOFFrUXg1b3h4SmQgbkxMaXVPcDdRVTNkWHNJQzJ2aEs3TEdzSTNkenhwcFBXd3doN3VLVU5iVVdZUVhMSVpIRDhmOEFCMjFmYlZYalRNMEN4aU1EZG5jMCBEQVAxQjFGd0hZSDdBcXJNNXFGVGF6RzJEbTF1dG1GeHhOM2RIdFMyay91UjI1N04xS0grR0hyZER3UStTSEswN2xuTGd3V1NsTnN3IHhIcE1JN2JBQTUvaXZuejZDZ2l0NFBCQ3djd3piNEhGYnM1b1c1SzlkRHNCYUZPcTN5TFh0YzAyeVZldDFXdDJvSDQrSGFtMWdBZzMgQlpyTjgzVFk3UmR1RG9QUHNQMy9BS2did0hzbGcybzFXcUd1WkFXNHRxTnBhcDJxWkhiQStuT1ZMVnp3ZXZ3N0lIMUlCNlRIR0VkRCByODlCaGkzbG9GRTJiOTd3NTk3ZjU0QUJra1pwU3haMzNha0pMNXhvN1VIaWplaG5oeGsyS1hhMG9IVWlYRU1tU0pnNVMwanJPc2VTIE16Vlg0czBDZWVvRWRsMVBLck13QnluQnRHcTVLTnA3SURjbjRueFFQZmdXeUVFK0crTGEydGtEQnprRUJIcmYyYWI0R2swYzI3YzQgMkIrUVFIbjBIcmRZR1hEcSs0SmtDeGs4Mkg3d1ZMWUt1U2lPRHVZVjFldkh4b29kZ1pFTVB6eDlIbUFmN0h0Z3hERnN6TndubTE0ZiBydjhBd0ZCd0FkaXU2QjN3eFVzQW8xdjgyeG54a2QyZ09uajY5UTFlTExQU2x0Z3JkUDhBaDJveUQyU3VRSkh2Z1lXVmtYeG5mQWp0IFNaejkvd0Q3QmhQdGdlNkZ3cGRpYlZXY05WUXlTMnJ5UERjVmRzaGxKYkRYSjVic0N0ekV3Tk1EMS9nODQyZmJVRXd6b3l1MExOUUggT0V1eHpnT3dBUDM5Z2FpdVZSdk9icWxWaHFJcm9YOTJHWDQ1eUk4aXVwdUpLMGpPTWNjNkYzZTJJNytCN3NnUDE0NXZoZzB2VjlkMiBXTHRvVzBXVEdWSzV5YWRiSEN0M1l3dk1tbnlwYkM3U3A2L2FsMnA0ZER0U3YxdUNlWUVOR3VBbjcvWnZkSVNRWi84QXI0K0FBUHkvIFdsUGVFL3RXa3RyNUR3bzFYczV0bGgwbXlMWXFka0tValllMXcxOE95UGxEaHc0OWJuTnFmUGd6TVZrb0xaaWY5YmRvZ0Ivd0dMOTcgMkVUMnRrcjZsaVdVR3VBbEVyU3dna3RndFNxM0JlTU5DdXZGTGtXOEE4eUd5UTF0UFpFY0M0OXVkc1JpbG9qTmpDSk8rY0JRZmYzNiBYaW5EcXNXWWNFMFhxRWJabFhqZTA4aHF1YVNXTU5FclRnaDFmTUlRL2VZdC93QTRqdHJBQkJ6TnN3NEtUOXRrZU1HQStBKy9lM1NyIGZabFdSOE4yWjJRS001SGpHR0x4cGE1WFp5R1F4QVhrM3dKS3JUUnJkZTRrNG92dHJONk9GMGE3VFpEZmpxeGNOMGNCZVk0Yk5WWkogUE1tRzIyVmRQeVI5aFRBS2F3bGJHaGp6Q0c0Qi9yN0pCbjE5V2pVWXQrMzFkWDdRZGt6WnZZTi80RGJvRGdJQ3FJTnN0QkkwN1Y3UiBZYXVDY082VXB0dGd3MU5UeFpyNUxRMGpmb1pDRytUSWVtUGg4UHNzbmdaM0JzV2hvNXp2ZkNkLzJEZjkvUG9QUjVVYXZYNEdQazJYIGFGNU95SGR3ZGxFMSt5RFdCZWNLdjVZZW9lR3dHRnN3WW1NbXpnNTlYNzRINHdMYUJqTnZkWGVBMkFBZjhCaDFEdmtpV2tQaEpOZ1YgS2JzS2tZY25sRmUyRTRjYnE4V1dGL0RZRnR3ZkZ1R3RqekVGdHNERUd5b3d4OGZCaFB1a0UyTkIvZndBRHdCUWlOWnNDSGxkS2RsUiBMMmE4VEdtT1dGbWs0eXM5dzRKR1RjQzl2WWtuR2ZuTk9ESW1QR04ydk5uL0FFUFEydHNsZnhZZXluclU3TTF5SHB5bkhpSG5WK0ptIEFYeEljbktxMCtoMzJZdGgyUzBERFVlci9VUFZiSjlvVnlaTTRrMWNFT0lQMEZCNllUUXYyQU10UWJXbXFCMlczeTdxWkdsbUIyaGogOVhiS0FWMkZvbElmZXo1a053VHg0WjRQZDZmaGpIbXIvd0JOOENlZjdSSDkvQWJBQUc2UHBORHFXSFh6R3IyUnYybFdwWkxaSGh1MSBncE5iMjBtME5ZMWpKNUF3dGgzRGtpZkRPSFNMYk8yeXN5cXYyenRSSlNUWnpFL3YrSDBFK0FVdVdocGFRaG1FZG9UN2tKS1NRdDZoIGNFTlBZSmFIWXliWHQybERDZVlRdzlWdzA5Z1cycnRmOXd4SnZuR1daNENCRFp6OFJmZmw5Kzl4Wlp2UUdTTjZLUmJrTWUzL0FEVncga3ViWnhqRDFZc0Z6SlFaS09paVpNcFcybkdiNTA4MjU1K0I2YVZWY25uSy9pdVFPL0ptWFhMQk1xV0sxTzB5bTN4dHIxZjQzSitHTCB0cEkzN2o3Sml5R096NUF4T244UmVEQXdudGl5OG5NY2VEOEFQNy8rL2dQV0xVaFlGNldxaG41OXlFaHVtKzZYd0lXUnpGaFZSVThQIGE3RHBGOHF1c0E5YnZrTytHUmczemo3WTFKOUc0V2dMck1tOEd3aVNidDBCc0hYbnZsbzRzV0xHdmx0S3BKUFNHUmtZYTMzNUlVMC8gZEt5RnZoampiaE0wOWh6S2NIQm5tQUNEM1BhM3dtc28vbTNqZitBb0ovZ0w4ZmVVeEh2VFR3THV5VlBoL01ya2FwUzdBK0d3TUsyQiAwK3l4YlFINWdaVzVnZnZBSHJxZlo3NVI0Y216ZnJXZTl1M0IrQWdINyt3ZE5ZUk5PdVdhektpT0dLZW1tZENvM3k5UzhPNDRwanh3IGN1R0NONDlNeGtDSFR0TXF1UTl5Sytuck5Xang5R1JUS3UxSms5VzNiMGpVTmx1TklxOGJYMm9JbGFJRXl0cVZoSTllMnBSOW1tS3YgUEtjcG80L01NQjVrT2FRbWM4MzRKK3ZBL0JwTjJCSGdBZmZRQjkrUU9wNG9VajBZTXNnOVRaaTR6R2FodTloTUNIbkdPejU1bzJINSBqQk1NR1h4RG1ZTWlxK2JCT1Qzbmk3UitLclIyUTZBUG9QOEFwRnNCODhGNm1MMDA3dEZKMnJYMW5VQmFyYlpDMmtNSENDQzhIc1pYIGx5aGNOd3F0RGh2aWN0cjZmT1E3UUFvNzV4bHBRNnovQU43WTcvc0Ivd0R6NjB0dG1CM0pIMWdkeTlNYllxM1M3Sks5SDArTlNmdzggWEtwR1VoMlF3VEh4OG9lcTA5Z2h6dUg4SC9HYUhhS01NT094c0pzSURZQUZSUHAvcENoaGNMd3UybWtxWnB6L0FIbEdNbGRzWnFMMiBWYkhuSU1PRng1RXN4M0hTVkkzVnlpbFBSQXh4czEzNTNZSUhHTmZkbjJteVgzTXN1WUJ0cXdkUzF0WktrNFZkV1Vka0d1RVNxNVY4IFdFZWlHTlFPem1FT3F6RmZyWUxWTGNBRjVzZ21UZkZjWTlQQVJKcE40MyszZlA4QUFVRUFFeDNCUEEydzRadGpHS1V0VU10K1l6djQgZDdONHVlaUs4cmJ3NzRIcmV5RS9TK0hWVzJyMUt1ZHM0R0xyTW1EcTdUeFNmUHdMOWg3YysyQ0hUeDVTa1ppZTI1cTJwTXVuaXQ1SyA2UVczWmdpTGNVRHdNcFc3QTRCNjNUM3hEWUpxcVBjTExvOWJXUm5LTnMzczM5Kzd1cjl1SDZpNmdTQzNOcmx3eWEwcUFQdkFGbFViIENIdDVLU2tUSXRqQ1JjV3lPWUxiSTRWdXQyQW44RHg1d1lSa2EwR2dtTXRUdGQvVUFEOHVvSURwaklzYjRSajIxaEgrYkNrOTM2b2YgQjgvQTZFbGxmZGtYRUd0eGlhZGF4eHpqbzQvSVh1TjBSNUhNamlWb2VWVWJxclcwY09BbGRFc2ppMVRFMTVUWTJpcGJ0c2EyckhBTyBMNGlSTGc0ZW5VOXQ5YUhUQXUzaWlINlZnSmk3SldMOTNlMzg2dm9UQmg5ck9zd2k1bUt1bEI4WkNRRjN5YWxzSkhKWFhjRHVoeVVNIHRiYWJ6QmJyZGJXN0hEcDVnR3BKOURRYklSbG0wR2pjM2gyNXZoK0luNEFBNUF3UHgybjEyTE1vbHpHRDJvTlNaTTJKRnIyb0QrbDUgZlliNFBYR3cyUEVRMC9qV3B1bjZUeHRIbGFsaVFndzFwbkZsQmVCM3dZSzN2ZENmVUxZQUFBMzFVVE5OOWwxM1E0WVZUSnZTdkFyRiBKWG1ocVpMQXN5SXJuclkxQlJhM3A4UEQrdVE4Ykk4ZWRCUXlheHVoUGZEbG91eHo5VUg5VDU4K3ZlemtRRU9vZTJqQ0x1YmNoeDNYIFBjdDd0cHdjY2NQTFgwMTRkdEN5dFNUSFQxQTRJdlR2bnNic2QrRnFURHVONU1PQ09VcFJaMDVXbGdXUTdWZXlhcXRPdWExRGwrT3kgTGJnVkRpM040UFU1TVRvUWVaYXVLR1BaSitreHc5c0NYZVFtajRQQm8yRWVHQUFmd3c1QmowNWN1dDY3Rldoa21SYkkydTArNGFsYiBKRjJPeS9GaHZsdE1KNjBGdXY1bDhHSENiRCtZcXZsb3FUVXlEZFFvdFdxQVlqMmliQ0hPQW9MOXNDL3o2b3E2dUNPVTR1dGxITnFVIG9lVWt4aTI1R0svRUxkakp0Z2kxZUg3dm41VURqMXVDZUh3RG5hQjU3b0RCbUx0U1lUOS9QN0J4OC8wNEVkMElWQkRNTGNYRkpzSXAgVDVQdlFOcjNVQVdmR2dYOHFLWVQ5bnRTdG9hZ3crL0lFTlYyeXMzd3F6REhqZTByOFJZSC93RFBmeWtUQnZxSW9jM2FFUnV6U3hLNyBTSmpzeXU4cng1NFpTWW9xOFpHMkZpMXhGbVJGZHFUVHVwV1QvbHhzZlZqcStkN0ZPK3hqdCsxaTNRZmVGZ1I3THA5MmNsZEpwT3NXIGhWVWtnaFhxZXdMeTNVcUdrV05YS0hhRDdNaHVGd1BqQnZrQnZ0cXVmdkt2cGZaeVlQdWliN3V2ejk5K0FlMkViSHE5MDB0T0ZiMDIgbTJFTmZOWkZlc3ZkQUMrYWNHeGJ1MmtYZXI3UW9jamczaUU5Ym1WaHlxZllDbWNNRXhoUkRaa1k0bEc5TzV4ZzgrQXhBYit2czVzSCBqNnpNTXNxb0xDTnBHYkRHbGsremxXUXB2a1dYRTVRdHVDZTRNaTJ5V29QN2N0dGZ2dXpzeE1XaGpOOHd4Q0hBQ0R6NUE5ei9BRUVyIGRMbEtXc1RtOVZMZEFoODFicHhJUjdPUTFlV1lpeFd6YTJSZmg0Mm1IWmEySHJnSnRId0hoa1dVWW9MUm1aNE5wT3g4KzM4K0FRZC8gNklQSTZSa04yY1lzNDljNVN3Um5lVytNZHkwNTVBWWNYWW9wR1NwWmJtVzl3ZzVSdFlYSEY2R1ZVMlhhS05kZGpoTVQ4cVE3UU1yTyBqVzA3UGpKL0Q4MVlVT3d1RW9XMkFYeGJyOWNNVVBEMlp3WkFjOVFQUEJnbU1hR2p1K2ovQUl1MkFCOS9QLzVrbGdMWThwSHBPeHRPIFZ6V1Jka1V4VXJZdjhrWUs5Y08xNlFVK1lSdzdWdzBPNEdCa0JnYmdyU0J0Z3pqSG5Fbi9BSDhmUWZQK2ZGY3l5SFFvQ1czZk5HalkgZExCNktVMGQyUTR6RXRnVU5oUGNrVDA5a0RtR1NZUWh3VU9CZE5PcmF5TUYrVEJtemZCejc4LzdBZ2dIN3FOdHlHS0RWZ0hiUmZDWiBrb3hKMi90NjhXRTRKcDZzckdGYmZNRExkd09ESnh2Z2JBK0t2QmhsWGxIamcvTmdpT2cvMkFBZzRkQ2dZYk9ZeGRjbHd1d2tZTVpqIFM2RjQ5MW1oZCtCWFJsbFpKb2tqZWRKTURuR1pRN1NjNXVzTWNzZVdmYnd6bkRFQUd5ZW1kV2RnWFpmcUZaeVlMSkVnS2FaTnFhL2EgajVTOUk5MmsxZHFYVDZoN090NmtERDRudjZITzdQbndkMk0zZENoMFpaQjJqVnh0SDJEZ1ArcndEcGJzbGdRMDFIaDkwTTZTTlF3NSB1WEdKTzFmMmE0eXJHMUhpNjUxVUo5a1RMSU1VUHcreVVkRDVhRFcxbG1LVTJ6TTI5aE9EbjE4QmJwOStYejlSZE03dkFVc0dvNzRkIHdOOEV0SlpROVRqQ3dXY3lWZjVRbzd2bFh3MTliTVVQTVQwUGtnTkRZTGFDR09UcTZ2V2ZoRGZCN2RQbjkvOEFQSCtnL1QyMlFuZEggem1QS3JIVHdOaW1JMTNVdVREdjY4eUFTbDg2YzdrN1gyUWgzd252aGdoTWd3TEFuSTRlOGxsWHRBbmI3eGFQTm5qWU9QKzN1QTZXRiBpWXhTTzJ5aVRSaDRZSmJqMDhuT1NCY1Z2NDU0TFVUWFZxcnMwcTNESmhDL3Y1TDVCUDhBaHgvVncva241WGJpVjVlN0hBMjIwMWFIIEtQMUIxM2k5aEVWdXNBUHVrZklIT1hvYjlMZFQ4Z2ptMWhhZXZWT3lBbHMraDN0QTJGeHozRE95azlwZFRlVExKbytXc3hsNWZWRWcgZXJMQW5Pdko2eWIwcWZTKzJ6cXVaTkVlc1BIMEQ4bUpraENGSzNSSlRVY3RBV0kvb3JrckxqTFBycHB1aEJKY1J4UjJrTDZ4SWt0OCBNUkRGUVJFakp4TVFDa3FWblRjUDdadjBkVVRGZnBuYjhwYVluK1Q1RkgvL0FIQ0Ivd0NudFROcEE3TUF6UHZBWkUwUzFiVFZaNXF6IFhINDZ2L0lPWEpZMm4vSnN1N3VOekpka0pMdkFKQjJDMkRGUzZsc2JHUExZOFBNRDd3NGNrcm4rUW5MWk84dnhtTSs3TzZNZnh0M0Qgd0FBQWZoMDhYWGVuTzQycERNcDVLSFY3R011T1J0c2hUbUN4YVFydmllNEIrWVhZSFcxN2xWU0VLbGVIQ29GbDhWeWFNZDRUN29QMyA1QisvQU9nblRtNjUrcERCbEdRYU5DRjdmYWdrdEhTYXhxK3ZvY3BXdUp5aWw3QU1mcXRzbGdmMCtwVlh4bjMzTm12QkoyVGdOdTR2IDJHQ0R3RUF6ck1YMXRqT0VsSnUwNjNHdDVxcWJZYXYxRlRMQVhvY29weWl1YTM0M0RNUHQyQnlGMkk4QzBMYTNnWnhmYkNYaEVtcXogNThCYnZBTGRRVUVCVWN1dzJBYkpCU3RKN2R0RkkyMHh0c3F0KzdKUWZ4ZlBUWkFzclpPVXpQdVp6RkhseW9GQ0tGTHJtOGkxWFFxeiAwcFE3Um1UeDVLeXpOWXhodHE1Q1M3N3huU0tubU9VVmhxOHFoam9hSE1ocC9NRnFjaDNCV24rcjdSeVlud25IRUhzQUErd1luL0FCIE5nRU5WR2tHeERGUUpyaFVxZW1rbEt3cXZhajJuOHNuZ2VicTl5NEw0ZTFIQVBaRVBFUGcyL0Fhbnp4WXQ1V2Z3bTdnd0gzNEIrcDcgcDJWbkQweHVTbVNzYlc1Y0J2T0RWN1Z6dTBMY3loeTNQSEt3anRTcDQra21SRGZIekFneWNEK2YycldTZW5PcnlmQmtpMGNUbjBGKyA4K2ZBZExGNHFjTzVVdWhob3RoTWpWRm1HNGlRSFExK3B3MUlnWmFIWTFQVmZEY0RPbTh4dUMyMWdTQUd4MlFaV1pSWEovaE0yN0F6IC9nTVBiRGY0VEZxSkhWODhGeGJGMHlnZVFjUnVEYjZiVWJWUGExSmdIOHJsM0xJbGpRSXBUMUVRdUE5eUtqY05ISW1Jd3k0SWJKcnggYmp0NmN3Y1dqejh0YjB5TWVvcFNaREpJYXA1OXpYSzQ3eEYwKzFrQlE2clg2M3F0YXQ4eFpEQk1PY3dVb0tHOGpOclJtWkhDYko1LyBIM1BuMTgvMGJLY05rWEt6dHJ1Tm5NbERxK1RHczE0R2dLZmlCejBWM2xGSERtRlYwbXl6SzNYL0FPUVg2V25NaE5HRkZMZlpuaDJOIDhIOEJ3RStoWW9PS1RyZG9GbWN2U2pYSnFod2xuWlZiM0hiS2REcVpmK0dCbFh5THRCOElMYjV5U2FIWHcrL09FQTRoOFp1Ulhac1QgbmhBUURnR1AvdEFrQ0hLR1JXcThvU1FMZ1BYQkpzMUhNS3lPWHVBREtwd29yOGdtTFllWlZmTUE5VjJYYUNpcTdZeks0dmN6bkNQNyAvd0RRZnNIVUt5b3hrVXVlV0xxOGVBWnhMSkU3anVmM2JTbkd1emdXM25wamQ0UldaR2RhQmRHeXRHaWdralFyUXJiM1dVTmtjL05MIDQ2TUkvcjAyTGhTWUdhS3h0RzdBUzBnMkVqa2dLZkRtb2xvTVZpbEZ0LzJnUE0vbzZkQXJDZmd5SXdzcGo5NDg1anYvQUIvMlBJT3cgTEVmTXJoSXZ0Vmk2bFdXS0EwdE8wV0xYMTF1T20rSHY4cUlCNEdQTUp6SW5vVXZGanRUR3JwOEpQdzNSOGVScndiM3M1ejczd2Z2WiBCUUdjam5IaGpSd0x1K0RZMXpKcUdTTGN3QXNFUU9teFplL0IwQ1dZY0REZzRPQWI4Z0hvRU1Zc3E2SFVETWJkcXVkdnY0RFlBS0NmIDMrU1g4dWw0dE5ubHhEckZrZkxXTWFrSWpRWWFiZjhBbVcwQlUwTkRNTUVOd3JlWVlUK0hOVzN6d2tQYk9Mdkl3RzdXaWIzL0FIOCsgQXFMWU5nWklHeVhNWXVYUkdTN01NNG9BNVVNdHV5YXBjc2h5dGNyV080MElNS290eXExYlc1dFlFclZ0L2lIY0Nhc0dqWXBBNmR3OCBOTnRUTzA4VlVrNlM3Q3luWWF2SzRHNEx3MmM5cHpYbWo1aEFPNFdSTUQyUlg4eWNwT0NHRDdadk8xckx6OTJOZ3dQNy92OEFpQTY3IEk0ZXhDaW5Yd0hOcmZIT256TFJ0aEgvaVE1RVlybTVidXVRQ3lMNjJIRG1KZ2NlaHRYRC9BSnlHc3ZOWHRBc1lEQ0pKc0dBMzgveUQgZitpU3lFZXY2clI4NWpGOGJWUUlFWVdJSG9jZGVoTkI0U0IyY2dZNUpEWlA5aHNHTUdZc2pGY29USjdJRWRnZVBnTmcrZzlidFJHWSBsVUVZZkdpeTd5U1VudmtiRW1NNDlWN0N5UGxTbHNQaDA4dHVDMmhtRnRQd1IrNEZsZzJURm1LRkdaR0JoRWszK3JCL1FQMzZDV0pnIEtDTmpVc1N4TFVrMjBGeVZZbEx5TjdsNVJYd3NXT1JaUm9WakF0MmNvNk9yN1Q0WjRVUVpZbjgwYkFDMkJ5VFFwbk1qd3IxZTJaeWwgY2poMmxyU3QrM29ld25DdDlQY09WYlM5WE1XdCtCc2hlWk5oN3hCbjJnQmVJYXlzdmdzbU5lRFpzSThjK2ZnSEg2aSsvTm9nbDEvbCBQaDVYU0xzSlZsV28wYXcyaFlUSlo5T1dtNGk5UGJSRlpPTjFBdDJvWWhqMXRWN3dYUzd3MW5sTzJNNk9rcEp2ZitQbnZ2d0RCK1JsIDZhaFVPZVFTUXhySmJYeFN5YlJpa0ZYT01LWVo4c2E0d0o2NENGanJaZ3h4QlAyTnV2QTlYTXhHV1ZmNk1jNFRWM2QwQUFQNytlQWQgUnhCc1I4NTh1Q3ZtaTVrQ3lLTW1EWWtmT3RTcDZjTVZLZVlYSUF0dUxKMkhobUUvaDdVMnA3YnMvSm54WHN6OTd1eWo5L2Z3SHNBdyBQdnl3OGpHS2FVcHBuTHJKc3lHS1dPU01VRUxia0xaWmMwQUZ4OEhQSVl0WXhJMG1KM1lvOFZhY0Ria1NRM2tpRzN4QXNXZWMrM2hhIDVEMU9yMTl5c3lzb0NraHhyenNGMkJ5MkI4b0hVQllVMFhLcklBbXJaOFBjRmJ1REluanc2UHVHeG9ZeDU1UnhnNGJDZWY4QUFBTi8gMkRwblZtOHI2Ymwyb2hubXEyblpvR3hyQ0hCMm02RjZZTEZyd0dKL3FRdGg2VCt5QXdOd2ZUK00yZ1U0TndtMGZmZjhGOEJ5QS9qMCBCdENHK050ZjM5bXVTcU5yRWVxMjFZWThaTUVTMW9vZUxYS0xEajYzTUdFOThXMDlrL2lIVDYwdFNId1pEd0dMUE52WjQ0RC9BTk5nIDZZVlR2bVloc0E1SVY3SVNTVmw2YjF0aFlLOXBOZkVvWXNwL0ZBNWNmcE1PeU1vZXlLZlQxVjhyOVNhZzdOenhYR1cvK0U5UER4eUIgQWZ0L29Uckt5VFNOTWhsM1VFaXh5ZlVORkJxMGtobWhrWlMwRUtScDdRdGlJV1d1dTBEcTRwWTBrMHlnN0dvTzQwZVF5ajJ6aFR2SiB4aG44REJ2QnM4WDFYdHM0WDhnd3VIc215RTl5bVJaYS93RGtDSXl4VmRoaW9ZZjhWT0h6QzdoREJ2bjlTa3lmRnlmT0hiemorQUFBIEFCL0ZCUDRScGdIWWdaVEQxb3VYOGJQWlI2NHhQNFlEMTZ0eFQ2UmFCU0d2NDR1Q2ZEbUVGdTFGSzhQbkJ4Z3hEd1dkOFNUWnM0QUEgZm9mZnQveGFqQW51R1V0c29zRE1rMWptZ1NWWk9EaGFsa084ekdtNm5QUlE2K3lVL0R1RFo4UGcxTDV4OEoxblRiUVUyUFpUWngrUSBmOXY3L3dCWXZtS3ZjbURPZ1Q2VE5oOWhDZTFZbnpERE1zWThXQWxBL0EyOURoNmtJWStaOC9ZWVZiL3RZeW9PYmYyRFlNY1AzL29BIE1JbkpkM3ZDc3plTkVlUDliNS8wSDQ2emdCSlFZRWVUeGhtdTF1VVZ1dVhxcUYrZVc2VzZ1RHNqTktKNTY3citzaTFCbG5mRVQzd0MgcnNNMVhmQkl0OE1MOHhibU9ESVlIeklNRGZtb1B3YTVHam5KdzJFZGpuN0J6NEF2OUcxOER5bFFaazJ1ZFNWU3YxWTZoMVVKYkZvTSBtVHFRZHc3a2V0Z0M1UXVIcm5hdTRGdGZNSTU0Z0JPZTM1UVJrWTQ3T3dSNDRDZkFmUWVmZEo5YmVGZTZZL3hiQnRSMnVDTFc2MkpYIGpLM1c5T09EUlVyWXJ0REpYK0szVDljTWlmVHpoY1ZENHRxUGh1ZG90Q016NzJiNE9mUVdBLzRCQlA4QVZ0Sy9XODNXUllpU3VXckQgazJkekJrcjF3N1ZwOXNQcFJvRTFmRU1zRzhMYkphajVZTXo4Z05xUDdMT2t0OGVpWVBlemV3b1BJRUYrUGdINC9ubGJaMU1JdEk2aCBUM3ZpSU9mQXBUdVovcmJ4S0EyeFlVK05kelRCa2t6bWtsN2dxNWJlbk5mOFFjaHM3WE8zNzk0TTliVzNUcVJEdEhNREs2ZnhLd2hwIGlWTWswakhNT0RoV1h4WHpUMFVsbUU5a01mUkZ0Z3RRNEFyL0FBT0xhei9ReE01YUp6L3J3SGZ6L1JXUHNSTGdDME9la0dGTE4rR1MgRXgwbkpYMVNaS1YrZWNrc0JiTUdKbkpCOHp0S1F4blkvd0JMNCt3UkpDYytYOS8vQUg4L2kydFJGVHpJcFJQdVFNa3lRS2JxUVFMWSB0Q2pUMW9PNkhLaTZqNnZWdy9NQTVoYk1KN0FodFNIY0UrajVpTU05bVptQm0vQjcrZ2dINEJ6N2dOUzhzd3dXTXloOWhEeG1xQTRFIGhLK3Rza2dzWWx0RlRpMzJIWDRjd0hjTm5YMlE1Wlk5UzdrWVZBMFdnTVdjUE9IQUd3Y0JQZ09mSDlhakNJWEtqSWVXZHp0bE1hb1YgM1psclB5dFVQTm1rTXVVaDdOdTNqVHpsZVpJeThMNHJ4OC9rZGRoaVJsaHFQbUZBMWtCRWwzcC9WRnA3cThQZVZncjBPK0lxblE1VCBjSEJEWkZ2U1hOVDJUWVdBQzg3WWl2bG9qQm14OWt6Z0dvZ0hkMUJmdjF1QXZqNWlraDNOYUN1aDBtbmdkYVMzRTBqMzlXTnIvTWxSIFMxM0s3Z3dXUkRaTkdhZWgvTVZlMENsQnNnbVRWME96TUVjM3NsSG53RnU3QS9BTU1YNnRMWXBsSHgwVzdNZlVOU2FzNm41S21ydzEgdEhweERxK3huZW00dTRXUUg1Z3R3cXYyT0JWNEVIZ01XU2o0ekxQTnYzOC9zQUErQXczODhyUExtR1dET01ncGtreFplVEdzSzJBTyBsWkdZV1N4dFFTOVVya0hzQndNSitvUzFGdGg3cVQzQ2gxWC9BRmtLTFg1c3dkamlDQVAwRy9QeDQrZjZ6UHpnVThRc3VFWC9BTGlrIEdXUFAvTDJVMlBPUTdRZkxBaFh0enpmaGl1T09NYlVJM0pzM3VVNUswTWNDYk9WQ3VrMG93YWZqOU0yL1ZUSTJubkVtYmlTS09mR0MgV0hxWW8yN0ZNWVBtVThuMnBqWDRleHEwd1VtcGJKNFhJcnN3d0hWeHZmRDRCL2ZnQURZT25tbG5BNTU0dDg4QlpLdWZMTHNsbGlMOSBrVjZRK1lLY3BjV1ZaRkg4RE1HRnRiVDJTblNEQUJlTzcrNlBtbm9ud243d0FQbno2Q2dnUFkra3pqWWx0cklOQXVkZWpiZ3hjSkx1IDhXcFc3UkVjSHlMTGFLdkRzQmlZWWhzakppeVBGOFdCZE1Ga3AvZ2RvVm5aanh2ZjlmZlFhaUFjQkFNNkhIZGJXMUdVbmVkeU8xa1cgUkttVnVrQjJUSnI5aHJlME5YMVpTcXZRMkFQTWNMZ3F1WUFwUFlXRGZGc21VUW54bS9lNnVlUDA3dW5rQUFmd2ttNHJac3FTSUljYyA1RkRTYmtaQmpSbXNaYnR2Um9GTUR3K1hiSS9iZ081MG1Eckd2TWtzRTlYS2kvTzN0Y3BmT1k3bCtXMURwYzRHcCtZQmdRMUpiMkYvIFlUQmgyVitTQVNrczhWRGo1akpNcCtHSElCemlIOER0dFppemZEUVRzekNyclJPZTN1L1ZFZlBnTi9XSXRmTU5wWEJjaWdYWjh1UUMgY2lNRmJwSWZIK0lKcExJY1hUZW4zQlE2MkhUM3hmaG5KL0xVZmM5cmFMTWVYaEoyTUhVWGQzbngvWUFQWHlZOFVmWlpCSkZybW1OcyB5VzFrcmRncmU0S0gwMzYwYklsWEpxRUtXTW4xOUQyaVpNc2hQVG9MNVlQenBqTXMyZ2gwYjduQWRYZUFmai9hTGdMOTF2QU1tWlBZIEtyUEZPZnJjQzhtM1o0ZkgyeUhWOWpjeGZIeHhNY3dtWENISUljNUNzQ0J6RGJDZ3UzMW1xMGpmQVo5K1B2ejhBMkJCNkZKdTBzWFQgQm5aMkx0dDRXRllnREZzcWpXUjc3ZUl3dGQxaWJIN2Mvd0R3anlxKzFiN3hXVWpSeGovNWsvYlJnY3k4SHhjc1RPemMxUFd3TUJEciBkM2p3NzRIOHdmUGlXaHEwNGZjTlY4OGZBNit5SThCd24xeTRNeU1yL2pQNlRhUDRpOXNINzN0M284SVNGTlNzQ3Q1Nmt5VnZaelFlIENXRnAvV3pGb1VqY0VVcDJiY3R3cC9UR1lRNW5lQ0hBNGY4QUFjRm16T0w4bVIwbEpDZnI5K3YxQlFRQ0NzY3QwZUsrcGJCY0RYWWIgcDlJeWF1ZDYvY003aEVJb0J4aXhiVXdtWEJ5VFp4NWhxVWJndHExUTlRTExRK0xQT0VrSTcrZlAvUWVBOVdQUjYzYmF2VDJXVWlaTiBqeTFhR2dpS1AvNGxkWkYyMFFuT2RmUklyZU9UNXRWaUxzZmNMVFZiS1FIeHJNV2NMVnhWWm93VjIyTUZnQmZxajUrLzg4d1lBSXR4IG85bU5wWm9sQ1Z0Q2ZHS09QZVZ1NjVKdHUwZ3JqdVhkUEJJckx1UHAweG1uMjQyalVrNTRSaVZwVVVpaDQzV1c3Tmxib2VBaUxkZk0geXBNdDhhRDJTTk1UdzZUeWdsVzhnVE1GdVZoSHZoNEdJZW9Sa2NJZFhod2MrajMyNHRyN3lLNk5aaHptenM4YkFlUDFHL2RkbE41ZyArd2FmczVvelh5MFNTaUI3SXNGa0lkZmljQ2xTNmNLNWFadnpLZkR6RTlreDRPK041NUhoTEpQbml5OHZHeUpJUGZ6L0FQWUFIUlZlIEMvRE12bEF5OHJPcVVPMElZMFRSOE1QYkV1N0doRHNJV0JaSEFQZGtPR3RzaS9EdFRTMFBnVGtPekxmdmhEMnpaS3U0T2ZBUHo4ZlAgL1FjVnVMUzdRVnpEc3JxK2NrNU5JMkVhTEk4d2JIczFES0liRkZya3l2OEFiZERaRUlQWUFlanp3ODlPcmZhNkhGNGZTZ21MeWZ3USBkLzMvQU9nbElRVlhFWlBHNmJnYWZma2lKOXM3eVlKbHQwY1V3WE12ZWE0OXhSYmFTVk1IRU1pTmptdVAxR0pXNFBKd3p5VzM3d3REIHRhN0U4WXlFdXZueXZBNlF0NmI3UHFBYlNhUVlyMGJZQmJnWUZzS1d6ZzQ4d21CM0NuMCtaQmdEMUpIbUxJeDhGMll6YklFNFBzQi8gd0hRZGNPb1NyMWVwODV5TXRWdEdNbkpVbDZ0eVdtOW9wemRCYlpGS3NnL1owOWtUdzYvMjRvY2dwS3EyVHN3VzBWbXNuRWcyRTU4QSBRZnZ4OSs2TnlsbVNPY0xabm5nUU83MTRTNC9UTFV2eFBpZ1Y5WEZoMCtZK1F3OHdQUE1RVkp3UXprTkc0R0xHSTJDVGFKczZBWDM1IEJQN0J6N3FYc3dXci9TV05jVDFLRzVaMVMxa2oyY3E0UktyVGFsWVhLTDNRbUIvaHAvenc0T2ZSNzREVDFuRGRIa1lEd2R0OC9WQ1AgUHdId0F4S3ptS09wbGFTeUJEemxKY2U0N0RqSEx0b2MvUFA0U3o5dWF0Q0VTczJtRjFrUVZ4SCt4eTU4Z2Y2RzR0Q0hkVnRsVm1CcyBZL04weTRNanZsWlp0bmdhcGJSMXlvTnJDMlRMaVJCQjJQUEY2ZVNVcXN5V1JPSkM1QjJlZWdlcktLRVdrdXk0R2NqS25SL1g2ZXM2IDhrSjFyTnR1UnhqT00wOFI4NGxGeUNnVmxtMUhEQnE2bFBKdzJZL0pEWitRR2JuSE5uNVdHU2p6bEdBSmx3WHUyaEJSV2hMeFNCWVAgcXdtWnFhblowbXBVN1k5V0ZSVFNydEE0cUN0QzkzbWdLdjU1TmVBZFptWThrZ2srU1l0THlmei9BTU4xWk1lTFc0RkJ1RTlEY0l5UyBHZkxJRXRHZHBYcGV3bnh5cEdJQnBJeGFDZTRUTFZmQTQ4UHFhUTYvclFIWkZaRXhmNU1CaEhhazNoQmZrRGZ3UGdFSEk5YjNRVVMyIHFLN21MQVd5aWVSUjNnYlc2ZmJCanMzY2NxVXRrQTh4a3RTdHc5b1RBZFp1RUdDSFJrV3J5ZEdzd1A4QWZRSG53SEFRSFJmTXkwTXkgdnVCNkxrM1lrNVc5bHRQRm5UQjh1SEZzWklsS3o0d2h3NmZjRU5rY0szVlo0K0JCTURHYitITm1aZ2VualpFZmZ6K1BJRC9zZmlPNyBGc0s2T1NlTEJtWDlxRVkrZjJGOXFUeEtFQkE2bXJHbEdPWXpLcnNpR1lUNGZlbXY5UEVIQW5iL0FMVm4vbWsvaUkvUWFDQVFlN3ZSIFhFMlpHQmVFcVpYZDhNNDQ3dlNnWXNPMi93Q1d6NUhwOUFReUJUbHRJM2NFckwxTzNjY214Nyt6dHJnQThtK2ttNFE2M2JZNWkycSsgempkcVNpU2tKejdJVGg3RE1GdmxaT1FGOFh6RElJWkpnZXJ3NnJaYS9QcDF4V1JoUm9KN0Z6WjIzL1lPZkg5L0FkV1Z6R0I4eVdDayB6UzVTZW04bFh6c2syd1lvM1J6Vit6aTZ2YkNpYitOb2RrYWtKZ2Rld2dnYkF1bjVneG1ReGZKZ2ZoUDMvRmZQN0FBNlgyWlQ3bzVPIGhLMmhhZUVtVWpra29oZ0MxVnZFTUZKVERYSjR3UVpZZU5rUTRaRFpBS2VwSTZlVHJQVG0rREVaSFNjVWs0QXhQdng4L2lBeDZHbzYgWEFERDY5UGNxZjYzelVLeUNvOXF6azlUbUZMYVNHaVVuL01NY2JRMFBlSVBiODk4eXMvb2JNVEI0ZlIyRC9Meit3YUdFVHFWWTNkYyAzS3REaS80cFk3dXg3cnFqVmMydEpIVmcyTGl2aFdpNXV2TzdCTDR2aWdQRFhmRkZZZUdEM0JQUThwcXZWSnJSMnNoaERtTEREcjBNIHFCN2NjYmNJZHd1QzNxRVpHQU9xd0xRVXAzQm5rb3JyT0hDZk5uOS81OC9IK3JVT2dla3pMcmYwQnR1MWJzNEt5RGF5WDZydUN3Vk8gSDhvVExWNjMreVdReVhXbjh3T05xL0FhakNOVUNzTFdWbDQxRCtjcUx6L2FJQjRDb21wUnN1d3lEb2VoeW1jdGdVM1RHN2ZJcjNUcSBvSkFlcnhiWlhNcUdQaVRIQXhNY0NFMTR4WDdNVlpqTldZc1d6YjRFNXRoOSt4d3gyRHJrcjlncThEWDlldmdzYlc5d1cwSE50a2RKIEdPRmV6R2lteE1VWDNRTU1sRDNBaHNqaFZiVSs0ODRNVm1qZDBPY3ZBVEdrK0FvUDlnQUFENjVBOXh5bVRDWjNSSVZ4eVBFc01qRW0geDhScXBGZUd2N2FKUUxieWdoTUkweloza3dxcUlBWEZyeXNnbXhRSGc1Y0hZYzRwcS84QWd1VmhJYklIdTdPUUt5RHd5YSs3N0RmQyA5cUNsT0MrSHArWk1obUNLMjFRTFFRemhoR0p2bUx6d1oxOXJVZnRnUDlvc01ENzg4MkIwZlR6Ulh1WFFVeU5wamJVbXR4Sy9RSUdqIDZ5aE9SUjN2aXBjUGhXbytQa05ESWZBM0NwVWRiWnFnRnE3TXRQQnU3S3VPUHdCL1lQOEF2MUo1aHhiTXgxVlNya0M3MTZtMlF5Yk8gWXF0WFhvY3F4bmNDNUIyQ3lMSWhoNnJEcHlIVmRsMGZ5cFByUGE2djhHN0JFa0dlOCtmUWQvdzZzSURxcXQ3NHdtVnpwVnY1MlE3USBKUmxPT25ybHNWT3lJUUNYVW90azVKTTFPVnZNM0R0eWhzQ2pjUmdtaks1UlpadnhjNzFYanNBQSsvYys2R01DYVJqSmdJUWgzRmtlIGtNQzBCQ1VydjhtbnlYRW4yTmxRRm5hTTRBKzJyUDU0VStQanhYbjU2clNQck14ZE9aV05MQVdyVE5WWUErRVlYak92OGdrUGlhS3MgSkR0cHdYM3lIRFc3Z1pDSEZYeGZVcDFWazFsbmFMTUdBK0VoTFU0Q2ZBTDUvd0FCZ1ZVZURIMVV3Wk5RVmZiUzNiY3BEMDhWbGJGNSBURStuRStVTFhnTFRNSHNpZk14RHNoRU9jUEQxTDZ5OHZndFpKMnA0WEhFK2dnRDZDQXhYd0hHMkVOU2VXR3psZEl5WDlrVnh2Y0Z3IFk3ckg2aEszZkUzbEc4V0RERHVDMmh3MTlQQnR0WVBtOGJaY20yRWtlN0RmT2NmQUFOZ0FBTVRCUWZMUnpudDFNeGROVkEyQ0JzNlAgOXFNNTd1aExEUXB5c0ZCZnF4UHRPeU1FVEFSZzIxZnA1ZUdONWVNVmNXc294eDJOWTRuenpCZ3dIOE1jR1RMS3F1SGhmQmF5ZEdpTyBObXhheVNSWGRFREVud2JyaTYzTXA4UXdkelFWZmI4aStTVzQ1SE5jMzFHM0xUWGFyUit0NXJTMUxkblNqMm9pNHlBM09wZHNUMmdXIFdSQmhnZVk0ZXQxWE1ZSWM2dENOYVdxeVBQRjBOWnhxdXJ2eXB2NER6NS9IZjVHbEhpUGJXV24xKzkweU5zN1NOUnR4MDViQjVJUjYgOU1hZ2RUNlJwOVRVK3dPQm9iNU1EL0VlSituK2xuakRnM3ZVQkxFSUR3OTBHK3o0RGtEQmcvamF1eVdJcFREMWZLU2V5V1FCTVhxcCBwOVMwYmFEWStLNmJxYUtORnFMNkc0R2RQYjRoTDZlajFvUW4zZ3VXWVR0Qjhlck1Sd25uTzBXd1lBTmcyQzBXb040UjdVdDJkRnF2IFIyemFXRmRjSFJBOWhCbGk0Mjl5aWVpMmF1TGpwY3pDMGsrblUzQ2VwdjZrcllQSzIwaTBoNk9uTHNDbmtMMnhQcjMvQUMrazlIVFAgR0dZN2JydXZwMmhHellJbjB5VEdZRmlsVVhFVWlTd3lXVmxSeXFNS1NVeEs3UU5qY0t3U2l2Zkg1QS95K29JMytmNDhmbklVb3NnVyByZ1ZPNEFOR1Z2SjB1MXlTYlZPd0RGU3A1YVpZdFhxWjYwSmFlK0xjd09aMjh4T29kd2dWd3QvYU9UYzQyUjJSOEQ2Q0FBOEIyQkJkIGt4MHNRV0RHM2RsV29rNVdveWpSdEkxZlV1blV4RFF3Tm5saGRvTXRmcDYzTVc1aWduekVkOElXWFRySU1abWkrQ1l5cTBrSmFQZ1AgUDlvdC93Q21PMlBrQjgwZURhdmZLZlVxTnQ1Mk5STFF5YlVYMnh2bEsxeGk0dnNuMGxqTU1XVGFBWUhROW92YnduczR0V3BwNXgzdCBKMlFDdjRua0hIOVQ4YVQwQVc1cENpS3pqYktTeXVDeFpkY2NucHF5S2dhMXhudHFJMDFnOURydFc1akhjTTJlNGJnZkF3SnBObFp4IHJ1c3ZOSTJpbEFzY0FHS0RZSHA5UjQ4bFk4bFdNaDQ5U0NKWnBIRVJ6SzF1YmF4elNYSFBhNHV6TFcyUUVhMngwSzM4b1pFbVNSQWogS3NuOFU2QUFFbkEzdFpHdUJsYmUzSGxRRU5URTljcnh2cS9OcmFrNFFHWTdjdlNiQ2psNGg0b3ZXMVE0ZGVaR1R0WTMwbXZzbHhjUCAxRDhiM01vVUpqQVJzSnFIdFRZUFBnT1FiRE8xZVBJRTdIU1JnZWpRdWRQdmU3RlBHenRNYlJjYmlocHBiZmpBK1p3TU9ZREQ0Z1N0IFNCQ0NZK2hsTUJadzJFNE8vQUQ0QUJ3SG53QnQvd0F2UE9KK1ZxV2Fyc3BOM0RyWW13RStaVSswVmU1YWo2SEtQbzh4TWh3b2FmenogWVNDaWM1eVRWMmpqUENUYnQ0QUFmQUh6L3NBRDFzKzc1em1aY2FyVzFHSlo5TkdsUEJFTUFHQ1pZempZYlBTVDRRdzQxWk1Jelg2ZSBxSWRuMXFqR0dZVzAzSXRERG1GcEcwYysvWW9KOCt3Yys2cE5FMGNXcGJUcWcxRXYxR29pazFNMHNpUVR2dFpTbHBYZlpnV2w5T1BDIEdQN0kxeU5xWFZrYXJTalZUVGJVVHh4dnRMUU9sQTdsYWo5dHFBZVNRVHdLNjdIQ0hxRVVxVHZKN1VvZEoxTFdqczIyRm9uZHRPb2QgZ1F6MFMyTUJiaDNnbVdwaFpNd2dIZU1XRUNEaDRvejRUclBFR0Zkalg1ZXFNQUE1QmhpQXJhRXVmVkhURmYyL2pVMU1xU0hGMUFxYiBhZ054SWNxUkUxeWh4aGIwU3Q0eE1xd1BNWUZ0cWd1RmFOQWhuM1MwTWVjNGNKT0lPSUREa0NBZ1luN2JPQ2VwMlcrR01MTG8xU0w2IGxvZG8zSklzNWJqNmNBOVMyTXdwcjdNN3dPQzNaRU9aL3FXUGdRWHdveksvR1JsVjZoK3laeEJmdkFuOGQvNlNkVDZzTXpLdml0ME4gU1E3SW1WZmFoR0pHeWFyVjJGd1Y3bGJBSUdHUEQyUXRzaUV0cDVqdExhQUgvYTdSVUJQaExzaytBOXovQUQ0K2Z4YXNFajZhV1BXRiBOWkxMTThnalNNNmZDTnNjWVN3ZWJJcnpUa0xkOHFQbUY0dnFjOUk0aVQ2WklGWXlmVWd5S2UrYXNZc011Mms3dVJlWFhIWDFWMG5aIGRWcDlOdm1udVNraTRkNmlYQ3d0VkE5czd4dEZUcTR0UGNIQ1p2RkpwNitZZUR3K2VjY0JuS09UYjRFcEwyUDcrZkFjQjMvb2tPRHogSVpMVzVUdldNa2E1TlNBa1YvVXJzcnNLRUxxL2ZrTjhJVkJkbUZrSWZIMlRsdndHcFBXZUxQZ3daaWt1M244Zit3WWRXRU1ORjh0RyBXZXVtdVVNSlNjQ3E3anFkb21CNUZEYldCc0xWQUJNTCtFUXhEVDJUK1JmSEMyZ2ZCaGd0WFJsbmUvOEFmd0FBZ3IrR0IvR3FOc1BrIGh0T01qUllNdzJldTRQSmQ3WXVET1lGTXhzSlp4VjdVSVRIQ1paQzI0RDVqeFdsUDdHeWNHN043bWo4SU40L1gvd0N2ejc3MFZOSUMgVXpUVDhOdytFaXlOV2J5UjRtdHdCY1JrYXhheWZpaklCNm1mZkppQ2NmQ1JSd3h4b1JaOXVMRzc1REVWMjJaanVBUHpRNTVTU0s5cSBVUG1wNUt2U0ZiclptV1lhSEs0NG9HR1FEc2o1dkNHUFQwZlZMWUNIT21jbEZ0SlRZM1oyU1FnQkJ3UWQvd0RQZ09OWXNCc2dXd2huIGtPd3RoVWdNbXB6THRuQm1Ec2pLcHg4YU1TQ2ZEUkxndXladzlXQTQ3NHlNM2VRVndYaEtTazJwMmk1OTREWUVFd1pEaHl4bDgrN3EgNEVJaHZoaHRpV1E0RFpERUhpZ2ZsRkdSZlQzQ1pNb2Q4WU44YmF2Z1FhM0dET0w5ekFadEpkanFEZ2ZQN0I0RHBidURBcjVNd1BhRSByTzdNTGpJeU80ZFBNVmZMRHZpdlEyb3VwWHo1Z2RiK0ZlOW9QbnVRZkRpZU0vb1pHcXQyZGplTDhCL1huMndQeVdDdkUwWU41b1VRIDF5SjJ3MlNCZjZmNUhQRjlNVVNCa21rZ2ZBNmxZM0tIT2tVVXl0UVhpVzFJUDI0ZUc2bUVjaFQ2U1lXNldNcXEzblJja2JjWWVIWVMgKzdwNHVWTWxjRFlJYTJHbHpHUmdaSzVVazlEdFRBWU1LRkt6cUFIK0xqZ0RIZnZBQUYvb2tydVErSWN4cWJhTVNTVkJabzF0WWFYeSBGdU9rSjR0b3JJOVhMSjk4L2g3WkRDK24zRWV0RkRlR1N6S3phYms0eWNxNElFT0h3RnVnY2FpN1ExRjBWWlkvVVFaeGRnTzVWS3F0IEZidS9jR1pucjZSOFcwV3dDTE1NQzNaQzNaRU80Q0V6ZnRIOVN6akZtRTFmVG04b3lPYlNUZkFlN3RSZmZnSFBsanZpMkJWeHVWQVogTElzS3hxckNMMmtlMUVPdjBsd0tGTlFtMWgyQzROUGVvU2s2NFczQmtPSHEvcGFkVzZ6MzQ0TlpuTmpZUHovQVVId0hQNDJaVmthUCBjY3V5SUxBNVRHemVMZWNoeFg3czN3c0xIR3dsOWxvajl2RWdMcWUxSkw3SytUZzJYSGl1VENwRGxYaG5BQ201dFAzWkR1bEo1RGNBIGVHd0x5MmV0RjNya1d5TDhPdDZncE8xRSt3WWNHMjdRYlZWOFppZlBGbW9BZk51Y0g4RUVCYnArb2tKQzZGYnN5dXpaQ1ovaW5wSUUgRGFrbjVEWFRQSGxzQytNTFFyOXIwT0doMXUrQnlGa284L1ZoVXYxbTN4WlNzM2tHRVNlY1c3L3Y1QjJFK242L3NUYXF5VDVUdnVUcyBCbUpCWmZxeGJrV3d5QzVTKzVTZ3cvQ24zeDhER0NFeFZ0b2hROWpibjcxZnVhUFZ3VDkvUWJkQUgvQUg1Nm9paUdGSHNoNnBhM1FMIGFxOVZreEhCUERzRm04OGZJYjRVV3g4eXlJYTJ5VU80YzRBdURiTzNONXEvblR6M1JxNUlSOWdmZ0h2aS9kT2ozR0tzMzlSRVNRanYgaWwyaVFvaWs3ZlRUTnFURTRaKzVzdUI3RXBZeWlweGpISTJFaWUwZHk0bnpmL1k5ZGxtTkdvQVduMjFlYVJoVzREVFNTMDhXRUhkcSBsc2wzWkdnQzJLNzVhakF5Y0RXM3g4cCtZY2ZMQitEVDZNemNDSmtnYnNrOEhZRDlSSC9Qdit3R3R6cmRYbjNET3hBeTZDMVE2YnJVIEpNUTdjckFtTWpUYlNuRlBJYWdZTUdiVXVGT3I4UnFaQTRLYlVZV1hwbjV5dGRyL0FHeFA4Q1BZUDZEaWVmcDg3bDF2blhJQlc0c08geUZXdExDU1hmbmt3aDhOb3Rvc0JGekY5RFpKbEptSEJmV3dlNEFXcGs3djFmM2ZSa2MzYUtTYisvSVBQdC8zK3ROazZqSzd6YVRNViB5K1ZYZXJKcUhkbTJKSWRyK1gzZmRFMXNvZVV0dUZwcDRkYnhtVitIK2VRUTNmNk4vb2FjdEdycXU3dW9JQS9zQ0Q1OHBBanlLQ0h3IFQzQ05OMUpNc0tYY3RNWGpvNXBpMUYxTjg5UkpIVU9NMEZ5WVlUTmg3TWVaWWFheWM3VVo5cERHemx4WkNFbnRwNjBhSHI0WFUxYnggSjljU29nZXNheHNsaHRRbXI2ZytlWWR0a011eHc4R0JiQmdUNTVybURHZDhLVkNqWXBXb2ZGSUF2ejlpL1lBRDJCN2ptRDBkWGZHbyBYUEpWS0hiVUtycFkrc0xJamlYQk5RMkZYNGV3SjVpaDRmRC9BTHozUTJOa3Q4WVVLMlpzWnMzc2JCejQrZlA3L3dCYmJHU0czVG9jIHlobEJ0RkthazYwUFZNQWZ3SXhCVTdIbEoweTk3czArNHlxR3Z2Q3JJSkwxWVQ3ZWgxVXRZZXVtU251QzlWV21mVStud1hwOUhyNUIgNmNPMHJJc2pLaVcxTG9LMUFsa2FiM2E5VjVncVRPZUJWRWV6RGJRdWsyQ2ttU3lObW1KL3dJQkdBcXdubXpNSDNGWUJoTHM0UGlmZiBrSGY4VDc4ZlNTOERZUnBKbk1pQkJKSUZnWFM2ZThHUlZRUnhTTnZIQ05JMTNhTnVvakE2bUNUSzVtRG5hY2xqTEZFa2drbnhNY2JQIEVpYnBmYWVtWlJoWEM5NTZOc3lITWQ5TjU0QTJ3cTNwblVPcTJUTFh5VmtFRWVaWXhTSktjdHZEaHpCaVdZMmRIUFYvWmU4c3l6VFkgdjIzc0lFT2NmMkUvejVCUDlWdnNTdTVITkZXZUdyRmtocTU0YkV2QUM3RDZjdmxvVEY0RHB6bVZlWWNMaHV4UFF5QWNIdUh3Wm5iTiBvdVR6bkNhdU9WRWZBTDZEdjUvb3FTeGFXK0QzWGlXcWh0ckVvSFFMWlY2ZjQra0o1KzBMTmluNjNUNGI1U1ppcXc5Z09DcnVENVZiIElUeEYyZzhzMnlBemV3ZnFBOEJzRXcyWmxmcmxzS3RjcmcwbFdGcXc2VExKOWJvV25kZWZJclJxRVZ6eUd3NG9mZUNaYWpCODVENGwgYW1HS3p0ZTVnK2JHMGRCMkFBZjJCQjJBa1ZvR2ZDWEpGZlV1cWJtNWo2MjRSZExWN3dBTkgyWFhOQTVHK29kcFpJa2pkdHV4SDJ4biBDS0tNWXB6ai9IWjdqN2lQaXowcEdsUTVjWURCNXBWbGcxV3F6RFRRTW1WalExM1V3d0o2Q1dCTTVjUmtMdWJuNm1aNG0wNC9veTF1IEl1ejByMXlaQnBhUFZKUHJkd1VpTVFBeVFsMEZuUlBuMFhUZW9MT21uNW83WnppSWNiS21ZVisxYWRXYllzWmJLSWplZmlaSUJ0OVQgbUVtWmRlRVJnYVVKeU1pdDFEMFFsQVFOK0FjaFJmV1daRFU2Wm5TenFrUWxEcnRzcWNUSHNoc0t4R09XNHRoYXE2RmkrQlpveHA0RyBwbTBoWmpSWTduazhXYTJ6VjBUVm1ySXZteE1XU24yZzd1QkpEcjdVVUVzOWtBcVNRUHNoSlg2eUQxelhPc1ZucVZQSVE5UXR3V295IE9GZ0dMR0EzQTI0YllzdEJTczhkazFlOXF3R08vd0NKOEFBZitra3RyZG1OQXZPc3FvSFpiRDFmd0JodGlZZUhYSFpDdXJpUmF1aGsgRU5rbVlzaUc0TW50cUFiYVBjT01peGFNamQwZnZCOUJQKzNQVC9WelpoQTVkM1ljZlhKZ2t0bnM1MnJFT3hrbml3VEF0b0xSSEtHdiB3NkhmRnR3cXB3UXpsU2tMYXdUeWJ6Vi9Kbm5oS1NiQi9YOGJkeCtnMUZTZGtyY21CZUhZRFY1SWxrd0tmVzNkUG1hYVpDOEh0QnlpIE5BdVk0R05RaGl0MlJrWDN3RzJqK1ZKKzU3V0xLQTNid2I4Zy9xQSsvSDdqNVZsU0pGaGhlSm9pNDNNcnNNVTltM0l0REdUdnF6Mm4gb1pFYUFzSk40VE9qcEljWllQSVhFK3JHTThlZUY4WFJJNEhUNG82bzFNOGwxN2NsTjJRdHJjcFZzaFRxK3dqRmJpZCt0Q215bHRRNiAvTVRIdmpiNFBoM0ZnUFEzajNyUGEveXBzbUp5M2VRQU9BKzNVQ3QwSFpGZzFmYldWQWhqYzVTbS9MMVVXMVd4QmhEcThsZXJsWGNMIEFXNGU4V1J1QWRIdHNoUzBHWThreGR5N24rb1JIQUFENEQ5L1lBQ2xmRnVwODE0RHVkUzJSVytvU3djNGF2TU15azZuc0psRnlrZEQgUFVOOHhQdmlueTdnbm9menlDRzhZbEJsb1ZlalBOcWZkbmcvNEFBZjU5MTJPbHMzNVVGZ09HVVV5WFpxMHFuamJaVTdWcHF5TFlmSiBVVmVWMmxrVDNBUDh4a3dxNkg4QlA3NFErNzVRb1Q5M1ozcTU0QVZFZjJEbno5MVpTZkhIMDlSZXFSNmtUc2pnQlBZRXlPNjZmWXVVIGVkbmxjZVZzOExNcWw1WWM0V2lEaVhLUjUycnVSOFZFZTVYY3RON1IzR3V1MnI0ZXBTb0xFaDZqTEw0M3F1MDhMY1pUajJFTnNDd2wgc3BGdGhEY3FmSHVFTXhERWJodmtCZytEdGpNTGFDYXppa20rRGdQUG45LzJBQVVnMHBnWEUvT3RWTU1WY2s3OUg3WG5sc2V3aHlndCBzS1dNbmp6RnFCMXZqWkF4TzRmaXE3bVRxOG9UUmptTzluQUZRbndIMEg5ZXhQWk10RHI4UGx5WWRidFNiVDZrSllKaEpmc0t0NVZqIDA1Y25KR0NITUQyckRXMThQdjRBL080eXMyZ0xSdk4xY2I5OE9BK2Y4L0EwbVBwT3hoL3lxdmFyYWZKNTVTZDNBd25JN1k0VnpLNHUgTHRRK2gva2hraHA4T0MrRVR5cjcyWitUS2czcEo3cUlPd0FENTgrd1lIMkZWYU9RQ1BhUVBnMGF0Y2JZbGNTaTBOdXNpU0xhN0JzViAxY2JaT3JOSThycC9Hem4rT3lwYWg4NVVBZVJXTmM5Y1p4WFR4WlN0c3BObWNEZk01U2QxOEM0ZkwrTEVpQUQ2MndRN0lXNGMweGh6IG1Bbm9jRXh5YnRlelluSGRKU2Y2QlFYN3dBRHFlZkVjZ0xJRWx5ZllLVFlWZzFYVXRleDZUT2g0ajRlVjlRaXVMNUE0OTdFOVBaQ0QgaE9VckFQUEZrRXlSUW9zczFWN0liZUFBQUFmQUFQQUh5UU9ReTdHSDE2a0pvZGJ1Q2ZxUUpPN0JVcGkwSGV0NjVsYm9tc2hCalc2ciBNWHhNWDJSSVBENTljb2F3VHhhUGFxN1I3MlBIN0JzQi9ZT2cvTVUyUUN5V2RsS1JpU3RxVFVnTHl2TUpjM1QweHlMU2dNd2V0cmNPIHlRL2VCdzVhNFBpUE1XZVVDMFVwd253WUFBQVA3K0E2RXNaRlZFZEhjV3lCMk1lY2JWaTRPTGVhTml1Mmh6ejBjWVZLeHpGUEdYd2YgSDFJd2M0ejJtOGNnUTNIdUp4NTZaQy9nRGFPZVBtOEJFOFhXOUZMdDhPMjhPNkdlaXl5am1ZSHd6RmtRekVQNGM3ajlsMXl0OFoydiBqTzloUFBvTy9ud0Q5ajBIZzdjS2RyNjlpMjBOU2JDRjB5RVloK1NISUwxd1Z5ME1JR01IeE1WdjNVNWk0Qi94ZUI1SU1aeWd2akx3IGJ4Mk5CQWVmNkc3WXI5TGdLaEp0MDBzakl5SGdLU2tLN0kxV0FKVzN3OVdSU1ZaREFIcmNPWUR2bGdXb3FueDg4R252SXRYS0RPY2IgSnNaLzJQOEFuOWc2dEVRdHlzN1ZVeVVCb1Q3c3JIV2xNZjVjZUhmekJjWWUwTjJxK1VZSUo4TkRodmpnUE1WeStlNnJEMno3TldZSiBLU1RmUG41QmZ2N0IxbWVPSTdVMHQ2blptalFTUTkzMHQ2VTZZcElQbU5NUTdUV1BPT0E5M1dqYzFNTWV3Z2ppV2YxMGgxRVVTN2lQIFdMTEtrYVNHZ0RsdXRMV1M0WWd0a2pWZEh6V09uNGFHbWdXVFZGcUREMmpFNHJZVjRXRmlLb2lKUThXWVBaSnRKbUszZlBoMGVCSHQgMVZvYU16Rkt2WmhuZEVKYU9IMzQrL2VBQWRROVpuRjlqZUh4b3REbG9GM3dyWXM0YWI3Q1QxNE9MeDdvSzhOZkRvYmhzOHpaNThENCBFQ0g5REYxbXpHKzF3Ukg0L3dBQmZUL24rZ092N2N2eXZuRFVWbTE4cVZjK1ZmWnlURVQ3T3F6dDZZYUlwYXVTa3hmcmZrbFYvRGNHIFNkM2hyVFp4bkEwTlpKdkFRSWtQR1AxL3dDRHNFd3BNRG9wWm1UTHRBa0VkcTVxdGtYaDlQM1l3TmxrSzhwSUZvYTM4T3E2ZmNERXggZm1RVHkrUFZmZDVReGZHVHB1MFRmZ1BvUFdwb25ENmhaVkNzWFNNU1hlYm1LS1dPTlZvQ09NYnBWRnliQ2liT1ZETHYyMExZd3RzbyBFL2lvbjJteWNqWGlxNXFqMXgzQlFkbTJOWDkyR2FnVHdqSUJHMXVKNzVXRklFMXUwSnJaVjU1UTVKRXNpWnZDL3dCeGdOb1R6dTVMIE5vWEpVQ3o0UUljMzdmei9BUGwwcFZQaStWWkJKalNFTTVEbm9jWVRIU1NROTNjSEtWV1N1VWlXQVlEcmZjaXlGOHVjc3VuMUxaOFIgbE5GQ2ZCelp0SkI3QjUvZi9BWExxT3pCN2t2aDgxamhqVU92czZ5Qk5mbjNBZTJkK0FObXVVWGtEZ1ltYk95RHc3VlArZWNEN1p1ZyB4NTdYSEhaNDU5OWZQbjhPaEM5S3lmSW9PdlorYUhqS3RqSGlVci9HZGg4TVBLS01QMDhoRFpQbUdQcmNGdEh6MVZ3R2JvcnJETWNDIEpQN0F2LzJEZjdralppRWJ0dzhIemxrQjhjVldQNVBucFFrUlZEWlhsOEhpcXIvVzd2OEFYUUhWN0pianZrZmpsMkpaTjNhVmh0c0cgS3htV3hMaHRGdGZGVGVIOXlLVHF1RVljRE93ODdnc2pNOGs2djJ3NXdsSkI0UHlEdjUvcGtNRndXWWtBOG0wS3FjSXcxakxvQ1FQZiBJY2VzcklzWlgzVzJrOGduL0RjR09Zd1RKd0Z3QTJOeVlaOUc4Sit2Ny93SSsvY0JGUTZtajVTL2t3TW1zZVNYZERXM2NQbjV4Q3dvIGJsWE5ncTdTeUQ0WWV5T0g3aDNVNWhzYmdUNHVMV1NleWVjLzM5N245Z2pheTA5NWx0V3huVkpLSlNWVXFoYnNIZGx0WGlURllXVzQgdXlYQnlReGh2RmdHQWJhd1ZLcWg5c2FWZEdKL1NRZ1Bmd0dHL3dENjRUQlJSZDhVSGJuVjRSaWhHbFdMeHR1YkZqaXVPU2NYa0dDUyBQSlJWV1M3azQzSEJ5N2MremlqV0k1K1JEanRVQ3ZLek1rWG0xV2s1T2FZQ1Y3WUtxMVI1Y3dDVUxsSExoNGVaekV3NEowUDZlQmExIHNadXZPZUQvQUVrSGkvZnYrd1AzVGExY0k5OEMzQ21WZG9kcXVwbTJxOXE0c0hmQnRIcnpJZUtKRVhrbmVBTytHSWNQNGM1U1lBSU0gT01laFRRTWVYZzJiOC80RkIyQUFBNkNEaERNcVZQbUJVMzQxaFJiQ0lpcUhha2xIcEdHVUEyRlhNVlBjTElaSm1ENVpIellLSFg2ayBjTUk2eStVM1VBeXF3dXliQnY0QS93RG9mNm5WWlNwVlNRRkdXcDFBeExoUFBTNGRnTjF0V2UxT05uNDJEWndzTFBNVld4MWJqakJpIDJLRFVWSUtISFdjMERTV0FCMndzL0gwK2tCNmZldjhBRmg5YTRwRkNLN2IyenhSMDV4bGZoYnhrNTJxc2ZhK1YvYmp5ejZmdWVBK2kgNWNtUVM5dUVuYVdqVVdjOEtGdDIrNGR2NUY2djlmS0VOUE11N3RnTjIyVHNBRzFCOHR3ZkZkM1Y5NFgxdTRKaGl0M0RrZ0toMkNwViBWRDNOOHRCWlJuZzJiQ0hINEFBMkRZQUNEMDRNc3U0QVJkMmNjbUpNeXZocnNwME83L2pJUEtpeENpYkRZRnN1dDF1NEIrWU5SNWZiIFZYN01MdEJHR0hBbnZzQjkrOS83QkF1RG9ycVZ3UTVWZkdFcXlFZ1BKNHVodUcwOXI1VVN4eGRiaitOdmkyWWh1RVBjUDBaQ2F5VXQgREhmUHUxcS9sNDhmUWNkLzZPMkJIcmRYcnNPWkZ2a2F2YjlmRnRTdGhWV3pFTU8wQVY1TnJuNmZpbm9jeGsrWjgrd0o3d3VFeVpRWCBjRHlqVmNraEFiOEEvb0UvZ2Y2aWxaSW9SSG1mcUVXU0V1bUdhV3RNQmt4NS9IeHgrUjBiTGlTaGFNdkZVVEtqWjF0Z0FNVFFyT3pRIG8xUjVQU0ltQ3g4Q0hUTEhYeTB0ekpXZEdsdURJTllLOVpIeVMySVlGUElJZW9TYkRtMnBpeUEvME9CeWJ5cnRISnZ4ZHdqNkNnbncgRy80ZE9EMTVZZGREM01oaTY5cVc3SldvUlMwdFBESk1JM0hXOFd4b21CUXd3TWt5WXRodzYrNE5VQndiVWNPTXJOcEtNeXk4RzZ1MiBOQmZyZEFQd0ErQTM5RzhzS1pzaHFUckh6cE5ZcVJpTExIbUxDZUZNdzBQaThVNGU0bU1QNXlHUVpKd0Z3UFg4SEpvM0tDYk5zbXlQIEFEZnovdHYvQUI5d1BDdnN6Wlc5aks3c2svNHBKU1NMWWFwaGlXeUljVVRkelJEL0FLYmNLM1c4WEN1Yk1ZQU9MSVRyTm9mR1paT08gd1R3Q0NmUDdBZjM4Qkg5TXI4M2ZjdmJJdFY3SDV4djU3VGREOGRMZFkzTFNlKzhVd0F1Ujg2R3lpL081ajNOZlpoN1d2aFZwZGJyOCBVdzdGS2xhclJaTEJ2TDhINW8yUFlWYnRFcXdoZkpLdnZpN0VPMUE0ZjNnenlHSU53Um1mRXJVQ3lqN0ppREFJUG4yRGZ3Qjl6V0JjIEJHbjZyVllFcXduYXNVak9DZnhBVnUrQjJFeEZUZUwzSXRrR1JQMUlHREZiL0R0VHVBMi9EV1ZuZEJndzU0UTV3SHdEOGZQb0hTQkkgTDc0a0EvZ0hsQmJNUUZ1TWtibVNWN1loeW9nbHlQV29RWEVPSGRsa1dRbmg1Mm1uZnB6SVQ4cDV3SUVTZVBnTi93RGJ6L1EyanNsRiB3SkZoQ3pNd0lSeW9ZMWVEaDJxcml6SmNvR0pGRjJSWDYzYWdlaCtZRDJTcTN4ZndPTW5PV2o3TnNuQ2ZQbnovQUNBK0FQZ0NtVm5rIExxcm5jcmVWRnl6eEl3dmxRdU52WEJ1L2l1aTdRZ1ZuUTdTSkhwNG5iYkcycDlva2IweGp4WmRrc053RHpUbXN5WXZxNGV5TEJNMUsga2h3Tm5KTlpFRlVEU0FpWUxxVVMrUkVNaXljd0R6RnRnRDJNQm8reTRQNWZGcTVQOG80V2p6N2Yvd0IvNEQwemlPWTZLVmtXZGFHViB4dVlCWlBsbUE5U3RGT0xhdlVvb1hiUzM4TlBRNGRiaG1EdU1CVDN4SFErTS9XV2M0RUNKSU5nUG53Ry9IMkJCNnArRHV3T2VxZkVOIHp4Sm1PUzNWMFN0OG13aUJkYlExZDNsaTRiZ0htTWhpYStFTUlNK3J1S3JhTndNb3o3R2toUDZBQUgwSHBrVklqNVFZV2VsSnFUVXQgaFZCcDJRWmZjR3g2M0xPRkl0QW5HMmc3ak5ROExIN3FEb2JWMi9QUERnc28xWDdac1p2aENNQVBvT3dQeC84QVFaRWNiY1JPNjQybyB0UWtnM1pIditObzB0YUFwOGhac0ZPUlhVamtpNWVOblNxK2xuRFlKRmRibTRRRzkzWmp5S3hKODlHMWZwYnBsWlMycEpxcTdPeDc1IE5aVitZTVNDd2RvcStKWE5OdytZVFlkd1RMSUlUUWJhbmdRVnFFMFpEUTJaR0J1eHZmTmdBYitmZndBQkJaQ3VuNmY1K29nOEJ0V3AgSzNtVjgxTWt2c09ucDRtR2U3ZTNKYUtlUXJlSFc1amdkZ1RJTS9CdU5zaXk4dEhrOWxDSERuYUxmd0FDb3RnUDB6VDE5c1k2RHptZyBEWnEzVmVxVVBxclhrZXpuRDRqSW0yMDdwcXVucjdoVzdJdHNrTndXL3dEMHZ0a0FOdWI0cjlzd2VJVFVQd0YvMzhBQVFmQU9hT25vIFcxMG5PZDJxU0hiZFJSSmhJSHBpdTJWV0xhQ3lhQmZDQWRic2l0NWsxd1EycUFRYlFiSXpEUHkvL3FpYkIvOEFmeitHd1RjbmN5SGQgMng2bW1FakdXQ1NYVWRneGFLV0JhakhtT1JYZk1GN1ZNUmtRZ1V4RXRBOHRwcDVtZDRmUWgwK3IyRjBybWJNK3BOSk9Va2l3QWoyMSBPY2hjQlVtUXNqTXBGd21MazhDU1czZUV5V0ZXOFA1Qzh0Z1NpUmFPTU5mVzVpMzh5R1FoZ3lEQldudzlzVjN4NVdYZ0pWenNjMy9IIGY5L0FkTzFwWkY5M0YxaTd2Z0VKTVAxNmt4S1B6b2Era2JwS3RpVWhtSEF3SHNkOFQ5d0QxejU3NWFNcytUSi8xdDU4QUFmdGdBQU8gaHBnbUN5ajRuL0FtSU14ZGEwbVhaQ3FrWFF2UTkwc0lXbThnMmU0UG1YeHZDcTJzRnRISEJtS2Urbm9tY0NHM1lIandIMzdCOU5vTyArV3BVdXB3UGZwbW53Wm11WWVwQjNrT0FFZTJmRjArcndHdXFyWCtlY3dtY2d0UnF0cGZVZ2I1V2ZGMWYrdHU2TlY4L1FRSGdENkVBIGpLaktIa1YzZFVlTjJXYVdIY2psMnd5bmFaYTlnb3NYcmtDdWJFUEhHa2NVWlNCQzZzZ2N4TlVjVkZZeHV3eVhqbWJaY0Q0QlU4VU4gbENENEx0QnA3UDRPOU11OWUwNXdjYTRVdlRyNVVwNTNwd290RUh4UFQ3VWgxdTRQa0VDUWZBZTJXKytYdzgvL0FBQURZUG9QUUhYYiBSWkdxV28wTTdBYWpic3g1TmtMeS9EMVJNRmhNZ0d4dFBZcUxNK1lHcmZ2WXlWKzRUaDlmei9tVyt6Q3lxTXpJNXp2WnYvNWRQMEh2ICt3Y2VYWGRxV2hRNWU2VmVHN2FWNkRITnJEVEFDNjhiQ1dvdEVOc1Vvb1lKN2l0c2tQYjVtbzFEcjg4MWR5MWhvS2RzL3dCa3h3dzMgL3dBQWZBZE1oenJCSEMzSXlPUXVnV1N2YXZXNDJtVVBrVkxhRzhBQlZaSHNFTWNZRHpJY3lZUG00cVRBZW5PSlA4RGs4VWVyVWwyTyBQMndQeDhBL1l2eCtLTkszcE5LaDFKelVTNmFmY3JDYlR4ejZhZGR0OVN1b1g2aU5wRXkxRzFRRitwZlViNmtDU1ZWY1JMak1BNENHIE9TWG1Oa0E5TjR4aTJMeHhRN25OcmFqcVB2a0pkTTk2eUlOYi93REVLZHF5ejFWU1QwdXpIQ2dXajFhZFJlb3UzMU1CREMyQnFCc2QgUmNiTmxTMnUzR1FwRjlDVTRXbUp6YzRGWTBldnd6RkNubTgrUkxZQzJkWGxVTlRHbU1jdGcvVmJkbnhLM1ppQU5lblFJdHBNVkdHMiBCeVZNRjRWQlZyTkg1TGhxQ3BraXRydGhCNFVkbERxa0tDN2hRV1hOell3bDQ5VVhIMHBxYm5TUFJYaElMVVVGTzRCWUZmR1A2UDhBIDEvWFRmbzlUZmVKeTMzZjNiVmVlUC9hL2ZqL1FmUEhsWVBSNzhWME93cFF2S0pIczB3RWxQQjZnVWQzbUFWZXNpbElHQ0JnUERtR1AgdmlPQkgxcGFqaCtMaWlPTTV2OEEyQUFmQVliQS9BTHBMYXZjbWJXYmdWTTFqR0cyRFNhalU3d0JzaW42Y3RTVnBmVTVTSDIvbUxSaSArRnUxUE9RT1c2YytNdk55RlZsNi9UOS85andBL3Y4QTBzVnNmTXNHWWh4UTFHb0Z6R2UyN0RUOVlvY2hoY1hQaENhcnNmYmRiVzRjIHhESDFXajJXd0tRUC9TOURacXpSelpzSWN0M3dCOCsvQUg1K2g2clg2elhMUU1NYVE0UnFIN01FbFBsVFNIZDRmWkhhK1NkazN4OHMgaXQyT2VoOXkwNUQ0ZVRHZHI5c09KUENUbkFiZFBnQUNDZlA5TmxFYnBKdDRHc0YxTExGS2tjeU5kUlRQRWsrRWIwYkRBNWtHaU1UMCBwSnBFa2hMU3lPN1pZRXZDWFhFUmxzSTVaSXR5K0MyTERFaGI4aThzZlJ1Q3VEVnBuMi9LZHF2MGkyQ2RzaVhaR3B1eUtmc0pQMkZlIHFhNDZnN2p6TlFsYnA1a2RNZ2djSUJ2azR6REhCbXhka28zdng4OGY4Q2Z4UHF1MVdEVmdaUXlWYWJ3cEhxdm1WdFRyQW41ekJMNGEgK0NiUXJsdy8xVW1PQWRmNHJQSWJHeU0yQlJYSnN5T2J3U2RnNThBL1lEL1ZpcUQxQVExSkhyZXRLMHNsYnJkeTB1cmVvU1FCSkk5cyBMWUVyZk5YM0xaQ2UrUTZyRDF1SHI4UEFiU0h3VEZtRStMakZubXh2K3ZrSDlELzJCMlZjbnVDYmxuUTFqR0pPVG1VUEdyMGdZcjIyIEw1NWtMckpYS045NEovRzNCRDI5YmF2NGdKOWN3eVl5cnlqdzg5MFFuT1Q0RGdMOEFBSVBWYU02dVJRbW8weVJhbEhtZ2dqaWVKdFcgSTlQdmtUcmc4MGcrcGpqaWtLU3lQczVpUE15eHpScmN3aDA4alNhWnBuMCtBTFRCSldnamsxY2NNTWtlN0xIRllna25kY2xVN3V6WiBXTElWV09SZmxpUUNGZXVUYU5wUE9yNjJodGhHR05QWHl5SEZLTzlvVkpESHA2M0QyZXR0NFZqdy9UeHU2TXNLNHQ1V1FhUzdKTlZvIE8vbjkvd0NmSHovd1lTVHRQNys3V0JwTXRUVE9ZT3V0Y0h3SUZiQ21GMjlpbE9PY2k0bDBUYWJmY01SaUFGNmViajUrdXBaTW5XTE4gaVVPMmY2N1BPQVY2d1YvMVY4Q1lUdU1kbVF3OWpWZmJZc29CRzUwcHdXNGkrbjVMakVtQWNWTzVEeGhnRG1LMitZdDFmTmVNV0NlRCBaR2ZkQmZKa2RKU2RQRHdmZnZkK1AxRndIcmN5Q3FyeWtlamRQSFovc3lwS3FrdzN4cW92aFBzMWJ0RGFkaGgyaHA3b2RQWkszWkhDIEdqd0dCdDQwVFJyazV4V2ZtM2JDb2o1L3dIVlRPUkpwOU9yT2ZxdjdycUVRUkhZalNGNVJxSFZwNDVKSTF3SVlSeFBqbGJzdmFIdU0gNHdTU0dKUFNqT3Boa1VZNTdwR2FGZTZzY0Zwck4yVGlPaFd5R2lvNTlrTzFqVHh0Snc2NXRTTFp0SG1YQ3AxNURUVU5oQTJnaHNHOCBQbEp6R1FlWW5OdkE5NEpzeUc5c3d6bXdNMkVBSU8vZ09QN0JoYUZUb3hQdHE2R09vVjNnTnYyaFc5eHRjaGJHSUJaT1E1ZDJwdFRWIFduVE1McnF4OFc0R0lKdHJDZmlIWnNId1hnTjJOS3UxSHFKQndBQVAwUDRWa0Z1ajRHRGgwaFNoeW1wWE1KTk9PR29UVDI4SkMyS3EgL25oNmsyQmtUN1REMm1oMC9EZUtsSHo3VTNONXEvYzk4cTYwUWh3Qno3SHREN0graHNHOEE2enIrN0dPczZsdEdIUHNoSmw5bnp5dSBKaDRsS25GeGR3aG1KaUZaRzRMZkJMUTRPR1dLelYyampLUCt0Vlc3Ym9CZjJCK2ZrRERRWTNabGNuTjIyb21hcXVzZ0dxeitUeGZuIDU1NkVTb0ZYY080amNoQ01jWkZ4d2NudXZISW1xNXNteDFhNTBUN05GbzluVkNHenBOcHJpSHFackpvckN5R0NXbnVUa2tmTHJkZnggc2hQRHVBZjRieDJQZks1TUU4VmZFWjV0SlNkZ0FBRDZDd0lKOEFBVEsycm1Nb2dxbWJ1VzdhUEM4NDJXa05RMGhFTVdOdTFjeWpBOSBERHNpSFpESXZtUG43OThQRm41NHNqTjdCbTkvNUFmL0FMQjFEcll1UkFWMlE4QmF0U0FlbThwU3BGcGNEdzh0RHE4V2oyTksvRzlxIFh3bm1FOGc0SS9iL0FMalM3eVdlVHJPeGhEZUNPL2VmUG9PSHYwNVE1Qll2aTFkUWVtRFRscHd0QjhhMG1wRjlQMHNNZmUwT0JxYXYgV0FDbitteUdNUkNSSmpDK0kxMFU5YkxTR1c3ZUdWYzhrY1VuRUtjZmNWLzFMNS8wZ1QzcVhDbEtrYytidU1mVVJMeXpsaGo1WElZMSB1QSs0NVV3NDg5TGJFNU9zbTE1NG1reUJ4aWtrN1RpdGZ4WXR3YnpCK0tNUXB0aFFDcDhjNVVOY0pSNElKSVVtSElKQ2VybExDbEFVIDRmRG1NaWZhZ2VmMjViV0NBOE9DS3NpMmxtMlBZd213Yysvei9VUGpYQlY0YW0wOE5mR1RKRHp5UTJJUGFsVXdKaHBwNXRzWUM0RUkga05iNGU0TDZlcTlyNjArWU1xRGl5TThuTFJDZXo4ZlFUNEErQTk4RnV0MCs4WHdESlBndW54c09CWkZrTDBnUHB2VDJHWStXaEVQTiBGVkwvQU15WWh6QTQvRnF4SDhIVzNsbTJ0Wi9aRFp6ZjM1K2ZnQ0MvSHo5cTlPV25tOHRUemZXMm40VllzelQrTXJmSk9oUU5tSFVnIEpYRk9NRVJGVWp6YSs1bUtlNXFNbG9zelZjMCttNHNYNjFDYXhacU9IeDlIb1luNDNYNFBNWVBTYkJQMVlWOFdhZVRSL1RPS25nOU4gRUsxNkVwc2s3ZkczSjkyVDJncm1RQ1lNRjJZSnR4STVGTXF5OFJzVGpKSHRTeDVSeVUyTE5lV0JvQUE1Q1VOa3NUVDZZN3FXV05keSBURzFKTVRFQ0JjR0VPZUF1NHUwSVk2SFE2MWpNWkYvOGxWZWVWVnNZc29iUU1KNFlCRFlSQi83QWY2WVZzY3NnQ3c3YlZUS043U25uIGFXbmtVa2hMTUlqbFRoNlZEVDRiSXQxWFQxcU9FTUdlNEcxVnU4MUErRE9NbzRRMmtuS2lQNGMrUDlJMlpWYnc1SisvQVppQmZ3dXQgd2xUZkR5U0Z4NFhjVmJLYmZURmdMZGJtT0hsNi9tVnoydlBkbnhqeXIxZXpFMGM0azdHZzdBZjJEd0FBdzAvNWNPZTRid3JyYVMrVyBFZWYyemg3NFByS1lMbFJMR2NrOGVHTU1oamtoQU0xUGpBQmFzU2ZGeGFNall1M051ZklPR0w4QWZrRS8xSGRGSzkwSW1qdmVpTXQ3IGVXR0RLK0E3K0d3Zkh0b25FNWNDeU8xeU5HN0pLN09oZGRzY2xNZ0JiWFhiWnNjRThkS3NQekQvQUJNbUJ5cVREQW5tMXNZUGh1Q1EgWWFBS256TGorQzM4eFBaSENaOEFnZWF3NnlzN1d0YkdFNXY3K0FmdjBQZ0UvcWtrTmtDamc1bG9aSklFOGtoVk5YcjV3VjlQYWVMciBsc2FDbTMwL01wK2JhaGo0WndEZUhhdm5GdmxHaTN2Tm0rRG43ZHFMei82TDl4Z0J4VG5wWUhsdWNwUTdHRHUwUm9hZyswekx1ckMyIEJjcVk0SjlxR0VOYmgvRHNhZVFuMk10L2xEYzJiZTZ1d09iL0FMQUE5bURERlNzbGlOQ2xwak1hWklGZXBKaXZod05USVRBTmdDVEYgak9UQzVSUzlmd3VCekRFeGdEdFFCZmZIaGpKL2ZGbEcra20vMkFCMHJIRjEyL1UycHpFL0dOUjloYVg3cnhvZG56bDdoWEpKL0crNCB5UlpvU21iVms2RmNZeFErL0k5MzIxNEpORFJsa0xJZ05ESUJnYmxxRFBROVNEWXdYTloxUC9EYUlvbFgrWjJUbU1pSERXK0I3OFBiIFVlWVRHRkJZeFpCaEt1L0VSL1lBSDBFK0FtWmdOMElNaDdOVFRxUzFXTlZhU3AyZ3E5Mld4OFBBWWxYb1laZ1pMVURzaGlIWURKaWUgcTdGcXVCbTJ2eGh6elp3K0F3NTkwamFUZUY5anNBWlgwQXd5TzFnNXhKZGpoOEIvRHhaUXNVMmRmcmlXNFErTi93RDRmdHlxSFdmcSA0eXMrYmJKanNIMzd6L1R5WkIxODBpMEhoY1U4N1BrOURqVmxIVlQrMHc3azRRZTA1c2kvMlRNVld0dzJEaXA3dExCaDdudFl3WnNqIHNjLzdCdjhBaUJBRnVxMHJLR1FUU2FZeURUTytNK0RZRkdDVWJ5eGF4ZmJRNU45UUJqR3NqREZJN1dRM2xqSmFoaytMeG9kM3psNEYgY2tnOGdyMitQVmE1c3RrakRhZ1BNanZZR2RnanFZZG9jckNQQzRZOWJxdHdXdzdnUFpBZTN6MnB3dDhZTDR5TUJtL3lwOStRZlA0NyBCcGJHRkRpcWRZZ2FId2s1MmNOcmQzN3FMY2VXNE5BR0pkd3RRMmUxQTYySHNuZURuRDdheG1NeXlML1k5a04vNWY4QVlPbW9odEJRIHlMMU9OdGxyWTJ6cXFWVW51aGZCSWcyR0VNcFlSUXBpd3ZpMllyY09ua0lYYlJnUXpreDV0L2dlUHVFZGdnTS83N0EvSHovU012dkkgaDB3N3pWZGljTk9EVTJnVnlrbi9BTGVMRjJ6YmlxKzE4WkxrQVdqTXhEc2VMUERIUU52cVU4TVVlbnVzVVhBRzZwV0hzd3I1KzNxLyBZTUdDbzJKUW1RaDBHTHlCTk03WHZTVkdaWkFsRGNzWVd0cnQvd0NKcysyU2doWTVGR1VMYmZxZUszY3Z0NXNESDhpNytLNSt2QWRIIFkwdUdMcnJKYlZWWHIycFVqbFRVUExCK0xxYlJLY0NCZ3d5T0V3eHdNMkJxNzU3NGpJM2t4bTluS3UvRVIvOEFZQUhzd3JRbU9FRE0gU1dqS1RnbG5adHRNakNPZkVsby9taWpES1RXWGVMSWhvZUxqWUV5REFxL2lyNGpJejRyakdZNWRnUTJEUVQ2RDlCdzM4K2g2L2JQOCBKMEFsTEdNc2pLdUo4WnNrQWJJSGlHUVhxQ0xmRURXQk1ROVBiaE1UMkNIQVErN1U1YldXZmxETjlKU1haSDJCKzRDZmZuL3FZQnNFIGxESjNNMFdEVzdhN0JYd0hiTlQ1MWhYUThWV0xBaVhJWHQ4TlBmS3J1Q2tpRXlEZFZ3S1FNTzlMUEYxbDVPYzJDSGY3L2lBd0FIMXkgUU9CbnU3MU83MXV5bkhjQ2NYSEpGUjRGRmcyVkdndk5pcnhpa2N2Rms2TUM2VmxnTEtFWmQ4WnpHNHRpd0J6MFMySzJNa3JtMG9NUyBOaDZiYXVQTkdUVllkcytVNVN4WXRiSDJPSHJka3F1WVFjYWQxU3A4OUhaRmtaenkzL09HemdNK2c0b1BkMEJ2NTh2UnlMUVVoemJhIGloMXZPZHp4SmhQc2o1VTdZbjFmRmwxeWU1QVl1d3hmRldMWTliVmRQQzhoL01yUEhuZ3daOUpDVlcvdno4ZlFYNC92L1MzcHE2SkMgNDZaTS9GSlc3UERPRmtmSEpjR0V3cFZYeXdOY3pGNE95VEE4eitsVU93TGErczdYYUJNWWoyalYzbi8zL0MzY2VwY2VVSVdyM0NsSiB0R2hDVFJuRzJGUHJHdlhoVFpQcjFvM0pkaS9kZ2RERHdxckloMVhVc1BnQXpIYUFwemxtUm5jSWt2Si82Q2dnQUIva0NKNThNdEtrIGJyMlJ1WmlPeDg4aUJHZnV4eE9SNDl3NDZjc0daTXJ5SStKbXBVTjF0YlYyZU9HekJBcmpFK2I0N1pEUldjOXNyd05iWEcycktyZHQgWHc0RjJrVU5ES2R2bkxVWXRzSHpIQzFBOUpqdzlqWHovSXcxbEdLY0dXZUVtN1JlUG9KL1lFSHp3RklWTXR0c0NuN0d5aHEySFRaaiB0TDB6cE56TkdwcFBUVG9rOUxReU5xTGFIOFFQOHpDZlI2bFZjTVlzb2UyRE9FbS9BZSsvdjJPSFRza1dSUStVOHFnRnN5ZFI5QXRxIDVVenVZWlE5NHpJZUZTbGRTb3Q3QVRMSXBNdXRWdXV6TU5QT21CU0NUR1Y0Rms5dFJnZkNNUUlIWWZvSEgvVUNXRFNkWHhiQVpCZDAgMzhwSjlqS3RiaWU1SEIxNWJhTGFyMERwZmNCOWtNcTIrR0hCZjJOU3IrQlhJZmsxWDlvR1k0YnV4Sk9BRUYrMy9FK0FQbjdEeGxYViBCdFBnWkpWbDA4eE80TWJaWGNSeHRuZE1Jbmt3eFVNUmtwSkdKbGtFckQ2b04vRkpGcUlvOGNNVlRJUm5Va2hJNVprR1JUTGRZajJGIFRwbVUrbDJXWXptalQ0K2MydFd3bTBUWCtjeVdSRW1pMmhlbEM4U0VOT2ZJYTJuK0RuV2hBVldRbTh2Z3NaNFQrZ1FHL3dEbndBQSsgTm9jaVlodG0xMmhNazFLMjNOVXBaZlFwZy9aNVgyaTJuMjBHVEV4Y0Q1Vy9EMnBTUUcxVk1jRzd5ckpONFNkUEg3L3dEWUQvQUZkbiBVb2o2RzhyaXBuVDZTb0V4bWtwUWtlWVQwZVd0OERVME55cXRnbUIzQnc1SVBaSnlHUVBZUTBiRVdpZXlPN1dqNzgrUHI0QS83bnVrIGpZbGVTSUdYRGFDYWZZOVZxNWluS2NlS1pUN2YrR2Z1NnpVMFZYQy9XeGx2VHpMSXdHTmhYeDZyenJERVd6UEp6NlM4QVY4Q0FRVDYgQ0FQNE1hU09Tb2JkTno3blNnS3J3TXU3M2M4aWhSNXZoV0xRc1dFZWVGY1NuT3dhRnFjVnc4Yys2KzN4Vm1pRnFCb2JrK096a2V2NiBTdGhueEp4RG1LcnVDd3RoaXFaNURjQjRaRHBOUFpERmdXbzhUMC9Zd3d3blRkb0xQQndnVGc0QUIvdjdmK3JhRUszaDBPcG9kYVQxIHR1QTVxZVM0TzMyUkg0MEJpdGtwOGhrSmhpWVlaSmhCa3NZRHFRNFAvVkN1ekkxVm05N3F0KzRDZjM5QlFUM1U5VzZtWXNCc0pMaWEgTnJjOWRMakdsMStodzdBWHBrWEZlUE9SaTRBNzVTY3kxUFpreFF5SGJrUFdlMWxDWXZteHRKMUdJSURud0RnSUJCNmFqeHZESGNqNSBiVURKMkcxVEVhMkpDVERzQnNjSE5OWG90Y3pXQVB5V3RyZ2ZNVTg1QVh4NXdQMno3eWR6RWNKc2lQVVhnRDZDZnc2WWRSbE1rQVhGIEl4a3pBUXJJWkNVMm5SNG9ZOE51M3lWbGt6eUZGS09WR0dSRWFabUR2TE1yTEFWN0hlVCtSM0dSSjhKUXJ6ZlBQU3h5eWxtWEpwdmEgZE54NGJHenFOVkgrWUhRN2dUeTNadE5kM3hvTVdoZGxxTGZ3ek53Y0hiWERZN0lGMllydmhOR0J1M3VjNENoSUlEeisvaExLOFYvbyBvUXFnbnpzNnh6TlRaTkJYeFgrVGN4bW5RNHFWcWFPb2FJUVcyV2g5U0ZKeTM5bDJENEZwcmVLT2hYdVRlVGdRNWlEZmoxUk1HSEFUIDdBZjA1K24rcDdIZEt4Yllsa0tSS0E0RXVVQVQxYmxtU01ocEo1TndjSWNPeUxJM2hQWTFVQ3dBSzVXOXp2Z1dzNzVkZ1FKc0h2aUEgQUlPQURyc0lLNlhMSUVqTVhPQ2NrUTBsc1Y2OStPV2gyaFRiWjNHY0I2SERaS0hjRTZ2NnJuY1BmT04rd3Q4c3dtOFdqc2dQdEYvLyBBSDVJZ2lJWmNOTVVMaVFJdW53eGthV0NXUmlkdzVaN0tLQlF3b25ueDBZMVU4VThVdW5rMUlkWXpFV2ZVWjRPSXBJWlFQU0g5T2QxIHUvdUIrT3E1Wk9qOS9zWEk5REF3V2VpVnhQOEFUbXpoK1pXdnFlYnVGd3E1a3hpVTNNTW80VEpxRnl6VTdNWFYxaWtHWUlEMXg4ek4gejhnVjZJc0RMejVRMkdPbDUrZFdTOVFRWllRQk1JRkVqVEdlSExTejZhOVRobG1xVDFkcGhHUmErT0hGSlVSUkRsV0ttaUFjRndHTCBGWmVhT2d6NjFycy9ueUowNCtUQ3NHQnlQWWJ0blI1YWUrNTRTYjVPd0JadGJOWm45L0orZjMxWWVjZ0g2bWZ3RDcvOVAxK2ovd0JUIDFCV0ptQStCekZkOEdwT2Mya3JJRWtZYklqeTNBVW1xVVdVeWQ0TGdoMXV0aGwvNEw0UEExek5abmtwN2pFZTdBZ1JIUGdBR0tEaGYgdXdvT2l6MERMUGxDOUxCMGwrMUNKSjhHd0VJbHFaOVo0akNiWFhSUndYekZLUGdZUVpIUXJpZ3Y5MEk0ZkgyZmNYZkRGSnE0NGZ4eCB3UEFXRGovVFBUOHhIemJnSkpxNWtraytteHRrTzdod095RjR4VjZZSnJteGc3RGFrS3EwTzFZYkJaQno4bG5EQlBnWXRaV1RsbzdJIGpnZUFnRC83QUE0MTlMTHRGd0VzcDh5VzNVTFlJY2twNlpwZ0d2Mnh3VjR0c0pzdmg4T3lFOVBoSjdCVDd3aDJoUHAxT3JQVDBVS0wgS3p3bTBhVEJXNmY3UklPLzgvZmlWbFNLVmdzSmNoUTdUSDMrYXhGY1Z6Zkp1eCtPZ0ROSXl4TnVORC95MFhLdkhsc2w4MXh4K2E4RCByUzZRMXNwbHBLNDcyb3RubHkxSCtzdFAvd0FPbnhLZmNsb083NCtjZmhoNGFkcURjTm5SNld1RDRDM1dZeG9GNmhSbStZSklOK3QyIG9qOXVyNERZRDZydkJIMVVVakQ0dStKSnNEWXcyU3dqcjQxRldCRTVsRnRqVitlVC9tTGRWekhBT1FtVnpBbnR2TUNhTVRhQmxtQTMgWjJDZmwzZ0lEOFJJS0NWT21tQ2FqMG5rcVQ0aHlYeWtXb2t2V3ZRS0dRczJHZXJtdmJGQW1DRXlIdzhQdUMzQmZHQ3BVY3oyenRCbyBlZGlOaE44QUlEOGY0Q0FBZFdXa0VLenpVc0RVRFJRK29jREFXNzFVMkJQMUlLN0Q4VnlkaWd1SDhPN0hEVUpUOHl3SmlyQnZBOVFPIEpOWktmbzhiMkVPVkYraUNBL1RwQmtNVlNzbjFLSk50eUNCczVJWStBMHJwUTVqb2J5WkRiTEwzTmx3Y2FidHhCMDB6dENIVXl0MlMgVGlyMHVmRlB5TURpZHkyT0s0MGE5bUIxVHRyUmFtVXVjL1cyME9wVTJZejdVc2lKTWxQbFpYZEtaSy9UOVNFd3d0bUdGYnNhMmg0KyBkNHhYUXliTjdkcmdiOGZBSC9BWTcvTzJKU2RpSHJWcmU1SzAwNnNreTZSc2EyZE94K2pjaXZUSDhQdUF0WERyOVBoME9xekdLZXlQIEYwaitEOG1SbndwWml5RWRnbDJkb2o3OS9RTy9uNit6SHlabFdYTnJwY3JlMjVzb0NFVTJpNnlSQ0lZeGFDd3I0WkNHaG1GdmdhKzQgTlErdjU5Vm1IbG1aMEo0WmtjSWxHd21Pd2I5N2JBZnN6VkRWZlZNSDZNSm9GbVhYVU5YVnVneVRTZWtHY0E4c3BUakJxVUVrRFpaKyBxcERtcC8yMUFzbjFyVHg2aFBxRjc1ajZVdDN3WUYvRkFZTUQyL21BMm5VRlM4K1B6SVlsY2l4N25qaFRMd2VXVTE4Vlp0bHJKNlJFIGNidldBUVNuS2lvYTl5YVNzUlZZMTVOM3hXOGhXQ253aW4zdDRJMDdTZEdZTmxlYUwzYWRYOWhCV2kyZE9NWjlEd0cvRnZlMXN4QWggMGllQVZrYkxrdWV0QlQwK2wxU1VsSmZlZTRzSUEvNmw5ZVRPb3RndkRUN3FMZks2dTV2Q0Z5bW5WMnJIVC9XV1FrTU1zWEdFSnBXcSB5Q0c0V21aaDRBUFViOTdMQnNuY3ZGb1pTbnQzU2VEeUNmZnNldnNnZXZoa09zWlM1eVRsQklHdzFmcWpTYkEvSEthdk9YRytlVnV5IEdJYjVZRXlkWmRvV1lqcll5MzhGY1lzbk1RbDJIUEFIOStQMUZVWFVrSFU2N0tadWNMc3RrdEd0ODBkSnRoZlR5VnNKTXlLaHBGSTEgelNaQXhEUTF2alE4eFBRMkRuSzJ6Rk9CNHJPQVJKNE9mUHYzOWZiL0FOR055VTgreEhaR2YvRFFqbzE4NVdlTEZVVFp2ak9FeDltQSAvT2NlNTRxcXRoWGczNXNuOVVXL3FzdERNaW5KbVU3NXh0VjVVdDFsSFQ4aFBTRS9ZWmFiRk1PRU5EbVZYRFcyQmIrZXZ6L2hqQ2RvIGFkRVpaN1hPMW83K0FQOEFnTWZzQ0NXNkxUeGJRU241VmhTU1duaGtaQk1mSnRTT1d2aXBXaGVBMjBuajVpM0RUMEl3NExiVVFUNTggNE5qNHJqSnc0RXhCZnIrSXZBWXVZWFpDbWF6RlhLQTFpeWFiMmdsSmlEenhnUExtUHFiWHFhNU9MaE1UK0lNamdRaHRTR3Y5MUlheiB0ZUF3bWNDYjI4QUQ2RHNHL3dDd2RiVW94TUF1QmdvVXlVbXlCZG0xS2tWL3FpcDlQc0picTlEZHlpRzRFSmhpcTJTSE1YekhaV3dGIEpxRHN5emppakkyOUczYno2RHNEOC9jKzZIVHl1SVpWQ1BHa2NtMnFNTGQ2OHZDb29TSWVNWEdQSHgwVWtjVXJ4SzhrYlBOdDdZZzkgS09QTWR5enlETUpJdUtkbUpvazgvaWV0UkRZQU5IdFZ2Z1NUL01NNmV4dW1WZnBPMVBpUTlPWldJaDEwdUVKdGIzQStCMDlnRDJOVyBuL3BZaWNacThuV2F6N1dnRS9yNEFmdzMvZjZPSTlCcWFSWUZXVDIyMURaL1RtZWJaYmZrcXRUTmkyMFNuZERsSVpBT3lmTWgyUVFEIDF6QTFBVHpuOVVOQ05zYnQydUJ2MkRCMmkyRFlPbnhsM3JDVjQ3VUdQSWRiMHl4MTY3TmkvVWtNZ1dXN0hGcWNvcGFsb1dvaFRERXcgeXZwOXhkanozdzJaR2ZGZG1KMnB6YTY2clFkL0FBS2lQN0IxUEdFeUdlcnRQaWxLcnE2eUV4akNTNm5xV1lubHBpdWV1TTlLTWN3cyBoa0RoMC82UEFjT1ZPQ3lzdEdJeEczdjlVSHdEOXdIQStBa3hES0l3N3d6UHpBenJFdE9vVTVnU3p4WllaaXdEOGdraml5UUtraG5YIENlc1E4YXVURzBiQVpwSU1UZWRBcWZ0b21qZkc0V0RSNjVwOWtVMGhxVTJUS0F2N0V3VWFCSWV6azBTNjVWOENLRytCMlF6TUhob00gOVBubzFQa3liUXIxbXN2SHNFOC92L0FUNitmUDd5Z2Q4S0pZWnRDdmhLMUZkUGYxN0d3ZzVENWhROHB2bHR3eDdLK1dRWSt2c2xkSCBpQjZ4b2FON1BkWnMzQ2JzTjcrL2NCQUFBQi8zRkdRaFlEUmhuTWFRZUNLbWFoc2tzZk5mRS91UjhWSWZQMmVGWkc4VENENXNJK2VqIHVEeXpDMWNZVE9iSnNlTDkrL2dBR3dNRlBLRkUyR0JYQ2dkVEQxcFlUYXBMOHh3WDJ4YlRhYmQvaWgrWVVuak1od3lDM1ZaNGhBdFIgazNQQm9lV1k1Z2s3MmY4QW9KL2Y5Z0FDVWRHRWptOG5SQUtxc3ZKdXo0cnhRK2VlT2crb1IreEdlTEx5eVA1cXF2dEg3ci9VL25xTiBtQWt0SW9QdmRMdUFrN3VWWXNpOFFsb2F2ekNVK1ZrcnE2Znh0RHhmSWZJT0t6M0N5emhoWkdmV1ZoNE9CTjhBQU83cDhCN0hzUlpzIEhsTEd5MDhBZW1Ob0VXWU5xaEJ3dzRrSEFua2hvNDJRbU9GSjRwNjJSNHFwTDU3RXdUWm1nb00zdzMrd01DQ2YzOEJzSFVPVVFqSGEgTThCTTE2U2NKVXhTaUdQaGg1WWVMRmxucTVYUGgyb0haSEJ3SHVGallzRDRkcDhZVEZ0RzVvLzVSQm4wSGdQbjM0QUFubGVRdHRFTiBQRmk1amIzVkQ4ZU1WdTRYUnp3OWhMalNwZzh4aXR6RnRiWCsxZDhXQlBCdUhHU201dktPRU4rMlAzN2Z6K0hUU3pSdmJPNnZHN0xQIEpFMUk5WTRGV3EzKzhVUU1iK2JBQW51dzA3SUE3SWp4b3paU0RJOGlTV2h1QVV0ZW1sR3pYZHdCVEt5VzU2L2syckFXeG9lVk10R3YgZE84TnFJc0xJTHRCZXNhdVU4ZTRNaWVoaDBNZkRnNHA3YlhMZ2prMWNvTTJPMGYrcUJpdi93QmdZUlRNcXVVWXlhSHNZWXQxdmR6VSBOWVpCZ2tuOHdRMDBUdzFQSU1sYm1JY0xtQmhWZ1dpMmcyUVl6RkJaTkczdXJyc0Jua0UrQUFmdjNVbTZabVlMc0I4UTNldlVtdDNLIFo0ZVlTRHIxVnVRSGZnTElQaGhtU245NFg4YTVuc0tHajJRakRHai9BRnhkN1I5d0I5K2ZrTG53QUIwNXJZci9BR2FxclUyR3QxSzcgS2YyMFRRNnJNc2lXbm9aNFNCbEdGOUREbUpoaUd2bUs1b2R3clE0SFdieEYxY01aZ2JzN0pPd0g5LzhBUDdCMEJrenBOM3ozSzdMbCBJSkZ4d2QzSkdlRnRTMG9za1gwYWxZQVhDM1ZXTHErUVBOSC9BRjhlU2VxYzZxQTdoWXd4eGxEME5sSlZlMVJxY2p1dzJQWHJJaDRiICtCTUQwL3VwczVoUGNEbW5pMFBEL2FLSEtNeHdIaWsvZnNkL1BZYkFmYzFYZzQ5bHE5TXJnYWdhdWw1U1RUbDNEOU5Oa2FmMU5rY24gSnN0Q1VYcjdnWWV5RnRrVHc5cWRqNEVHdDJZWitNMFo0TkpKdDRBYys0K0E1K2Y2V0l0WGoxeURzNkFHWkxrR3ZqSWdPOGZKRHVCYiBodFN1N1JYTU1leVRGdHdXMFBqWU1Ed05xaGpIcFg1eXN2QVEyYmVNQUhnTi93Q2ZZM0d0U1lZQTFYVE4rMDNxV0pVbnFNY09iajNDIHNxM3hReGZFeGRqTGJBaHVIRzRka01BY0dwTUg4NHpjWHhlYk0rN1hhYytnK2Z4d1BnSHlhaFZWVkVaU1daSkVpMUJla2IrUE12MisgbmprdUl5YkxKdVZLOHJHbnpQMUFrUm5SNDVHMHluS2VOMEJFYkZMRjNiZ0RqNS9WMVgxR1dJeWMwemx5ZlE5YnZiNDFPM2Vod3poMSBoWEFMY3JDcTlwVzYvdFJQMHh1RlYxV1FEOXRMUStDWUpvck9VV2Q4TjRjNEFIL2J1NWdBMzg4clBXSnJOMWhwOUo2Y3dOZXFWUDFCIFVxbGZFL0pyMHgyZlErUEp0amNoVzA5a1c3SXRSZ21RWHh3b2RINXlzb2I1d1lJN0czYmZ6NzhBUG4vUDlLUlFYcm5EdWF0cUcwclYgaVNyRm4wcFAxVUx3RmpJTDM0YlNHaXg0YkFIbW9jT3Q3SStGQnhIdmpVWUdQTzZmN0ovcjQvNS83OTB0eEVnUEd0Y1JhRjUxWEtUcSBnWkRlTWl3dE5RWjNmRVJYdGNERmNPZWJ5SGhpRzlsZ0hvRmwyTUhzMVphT0RyQjNBMmxiL2lCOS9QbitxMmtaZ0FzNWRFamRYL2wyIFoyTkVVY2JNVmZrQjdIQzQ4MmpUR1FSZ1JoSlhlU3lteWtxTmhnMGIyKzVWTmx3b1FrY25LaGNkeFpGZTdtU3pyVnNZbGJWelZmY3ogc3ZWOGh1R21lV3licFlWeVZmdDh3T0htcmNOd212R0pBRFZZY216SzVRWXovd0JiQS8zL0FOejREcXV6UmVHcVRKbUpLNG0yY0VhcSArbWFtdStEVHM0bFBGdmxPWElobUY4UDhQOGtNQ2Z2MXdRRGswWThpOEJndzVzaHM1K2gvK3dkTUZiWHF2M0RKc1l5bnV6NHVCNytsIC93Q0REVjJHWlhOT0NkTkI2YjNVV3c5YnVBZmVPV2prTlZoMW4ydit6YjJFOSswWCtaL3JqRVNRYVJmRFZhdWtIVWhoa3orVzNJdmggejFmcWFlQ3NhSlhLYUhYNWkzTXVBUUhUMW80cEw1NnVYQW1NRjJoaWk3STdjSCt3QU4vQWMrNlNJNW9zL1QrbzJCSE5wb1pteDA4TyB4RkhHaXExTnMrQ3pIRjg3QXBjTFkzZitKeE1ZdHlGbzlSUEhKdXlTU2RucXluRkxza2xVKzN1N2pmV0ExZGZGbkdyVUZmQmlwYmE3IFltN0NIMlBSdW9DN25CRDdzSnI1WkE1OE1mTW1NcEI3Z3oyQURZMXdNenlVS28zQi93QVhJNThBZlFXQS93Q2ZRWUd3RVBMU05QZFAgd0pka0VnNEZrSldFMEpMSUhYMXE1UHZpdTRFUHdtWVpEREFZdFRzOVdrNlk4bzFvV2dUOWdtS1NkUWZ2eDhCMGVVWFY5Nk1hM0RTYSAwb0YvWkdOSk4wN0hySE9rV0ZNVnp5bnYweHhUNWdlR1lZN1JEZzl1QXozQVl6VTIwY21CNzI3SE9BNytBUG4rUVB5ZnF0REtWVkgxIE9KcmRrMjFXQ1Fxdjh0WDFJSjhkM2g4TkxXMHIyUXdMWWR3ZTRjeHhaTEdBMS9zWmhuWlNndGFLSEhZSnpoL2Z2UDdBQVA4QVJHRjMgRXJJOVl6VFdLODdrTFJqbkljamNKSEJ1cTR1eFFtalZSR3lsa2toV0tPWmhGR2cycFlaV1p6RkV1TjRLb0J6OGtoaGlWTCs3OElidiBZRmthcFUzVEhWMWtKRTBaZHhCVlZwRjNURmRYaDRIbkJndFN0NGEyeWNmdzRrMzdHaGt5YUdoc3hQOEFaRGo4L0FBSEFWOEFnZ0JXIG43UXVTMWN4VnpiVnM1dGNBTmJqWGRQcXRrWUcxYmlnZGhpcmErNFZYTVQ3VVpMQmZPZWRwVG0yUExRaGpGazQ2cEtTY0FIL0FHQWIgQWZ4NjNNZzlQcUNsN09NdTloU2FmNVVwUTYzckU5SVhsc1dtbHZpaDZmbUI0WWVhbi9EZzBzNEFRZDhEV2IrS0JtV1hrSmRpUzhiKyB2djMvQUU2MnhteVNMcjhPcjNTbjNIVzdRQXVTc2d3Ry9pQzlzS0drY3lxdGdtUTNDeUErSTliZVAyTVB6a1hhSDBjMjdWY2NQbndBIERmei9BSisyZUxGbVVKTGc1UWhsSEZGT1FiTlpXYkZmQTV2d01abFZYaUN3NllqRzVHTlNUQWtkcGFodVNBM3RweGVUaXgxSlZBS2ogNmxxUVBKRVc1dEpoNkJEZjZkcENIV0xna3JjclUrN0lseVhBUHVCa0wxeFQ1aUFoS29LOFFUeGl6NG9Wb0U4QW5wZHFUQSs3QUFRTSBWL0EvaXNzd1BRZHkwbmt3RWl2YklHMC9DMWFKRHhuRFI4c09oeW14OFEwL2g4eUc0TW5Iakp3Q3dYeFhKamdxSHB5V2RRdXlCSGFxIDM0L3Y0QkFQb093TTJUbUsrTEFIK2VoNmVMYVEwTTViQSt0NWxieXJzVGJRczA5S0QyQVlwKzFGdUdIL0FKNXQrZUNjQmlOVjlOckwgTjkyNE9BUDcrZy9md0hYMHhWOWJyRjRBWXFSa3FVUE5KRFVpd0NVTnBsbUpRRmhsQzdzNWd0OGtpZG4zQ25ZRndUL21FeGhSWDhHYiA4SDlCUG56L0FMb09PUmc4Y3BaRE5Eak1Kb3lveGo1ckpVZityNEFZNHFFc2NITGpTSktBT1dPVU8xN0loNHg3cmlpaXVyOE5sNHNFIGMyamJjaFd6UFo3bUExVW5vREpwdWZMYVUrQjFMYU5aTWlFVExDOVB0cWZEM2d3R0RmTU9JWkRmVThtczNJTEdJeU9FQ2RxOWdmc08gZkFFSHF5MGUrZmxYQllVcXdLeEdvZFgyUXlTM0RKMDlvOXNHSzVGMWtoeTF0Z0RtS3JXM3lIVjYyY2ZLdlBXTlc2TTgreXdpbzV2bSAzUHRnQVA1LzM2WkRaWCtaWXkzZkd1dkt6MlJjWEE3SXAxL2MxL2NlbVJiR3JLeG1neHlSa3VDdDYzUTJCd09UMS9CSHVDb0JuRjNwIFpPRy9CNFArSFBqKy9nQUNsQ01pRzBXSk1nRkdwL3ZKU3JGL2R5SEF6QWxEbGQ3cWJBb2U4WUdJY3dPUE1Ub0MrK0hHUVo3b2UyZjEgc0U0Q2Zmc1FEOXYvQUZkQmpLc0xiVHVtQVNNYlRtL21WTGFxcnQ1TjIzSUE2R1BkaituelhjU0dhTXROS2R5QmN2OEFETXczRGVKeSB6YVEyQmpqemU1ZjVKa1pCS0ZPaGhTQk9PY01UaTJGWlVSWmRqVitQS05VM01kNW94U01JeGxPeUlRaUpuTS9xdzlBMWtCRFd2T2tlIHVRZEtCVktPYmdKS3puUUlRdEdzcTdhSHRYWHJHdldsRXJGNVpXcERya0ZwdEpONE1DcTJMT3hzYVBrQVRYcHZzVEl6RnowazJ3cGwgSytSTjlFdlB5Rm5KRVlaV2ZHZytxR0pHNTAybFBrV2ZrOGNuOCtPazdqRGdjQWNBV1RRLzFzZitPcTBISHlaZkQ2a3U2R3R4YVRRKyA2SWxmSlhseUZ3cEdwZDBpVENBZXE2M2hoMXV3TzR3RmZwWnFjRmtZcnRBeXpEaVR6WUdnL3dCQW9Pd2RXMDlmZFJYTVEyaUtZMHVQIGx0YVk0MVpWK050cXYyR0dtbEdGeWlyYSt5SWEyR0RwOWdUQWZuc0szWmxscGZLZy92Z0krQmZ2UGdENS9vUGg1amhhQ0dTRE51VFUgdGVvWTFiRTF1aHpGK3NuQnlxOFRFRjRrRnJBeEREMlJ2Q3FlSGVZV0NhdTBJeU1EQ0pQT1BQN0FBQWRjWmhPZUJiUW41cmtxMXZhaSA0TlVsNm4rMWFmRWNFT0s3czc0dDlrM0FPSFpPUGh6azhnK1RlTTkrRmNac2RYT3J0djhBd0h3SFRKeXNtNFpBa3ZveTdrQjNkeDRKIE1NZHZhbWlzeWxEbmtEaGd0WGthS0tRd1h3NjZoSnBKQklnMHpRTElCcWROSURwZFRwTlQvZUY3SkJxVW1qdXlyUkdsWlZ2SGo1VmcgNWkzcHBsVjQvaDU5ekxkc1hSVzdzNzJFbjAyVVlidWxUQjliNmtOUFljT0dxLzJVckFiZG5yTVlVRnN4UHdsb28rLy9BT1Q4ZjZQSiA5cUwrVEltTkZ0RGJSWkxmeVpQeU9ZUEJhWUtUVWg4QXpIQkRRNjN2Z1BNeER3VkpnZ0k4UHltMk14dzNpYlIwSHNHQVFVRUFlUG4zIHhZR1pTOTNYbzYwaG11TlMxdTd6TlRObW85ZTF2WDY2SGZMYTA5bnE1bUovSkEvdzRaQ1ozNGNMYStZelVhcmxCaE5IKzc4QlBnRDUgOCtBUVFBRGprV1E2UUt6dUFlK1ZqYU5oU2lTVFlSaVpXNC9nWlFXV2ZGZmg2R3lJVGhqWkJBdzFWTGpXbkc5cjdOckpONE4xY2JDVyA2QXcyQitQbjM3cFlDdEdvQ1B2WnFsc3VHMW5RcXJiZFI4ZTlQVHNxdmQwVG8yUkxPaUl5TTdSUnZOTEgyWVVZMWxsYllrR2ZhNjVlIGVWUEZHNlBXZW9DMVhoSlVoYXJHVyszb040cSt2WHhvczJHcnZrczlLcXY1amd5SWI1VzdCN2diUVJFZW4zbXpLYnE5NUdWVzdCQW0gL29MOXYvc2ZmdXFyVVdueUVnZ0dYTGFXKzZsYUdKTFp0d2NmTGNDbDNDVTE4aDFlSE1MZnRESHA4N2tDSGFuQmtZV1VKdlBDVGJ2OSBCZmdCOC84QXJpeUZPaDY3UGoyK0swSHFjaG9iNHRsbURUcTFFS2NNSGdJbHlBaHg1aVpUOE1QTVQxdXhsS3JtMnE0WlB1ZzBQUE9FIG1yc0FZQitQbndHQ0RzSFVPTFpMd1EyVE9uNmFRNUxKWTZyZjk0aDIwcnU4S3hrMVRpbEppL01XNGVBZGJ0QmJCNHI4ODVNbzBXMFYgZlptK0JBZXg4L0FBSDdZVDREcTBYUGNFT3krNFUyMmhhVU9jYnVua2xud0ZNdmdjODVlQlZQYXRHMk1pd3g1S3l5TkZKRWpuRE5XVyBLQ0RQR2hSWWk3N1FDVFlySWFBZVUwWk1xeXc5dFdkYitTTjI4bHZEdTR5b3N1TEtwOGhhaTJ5TWpKdytaQisrS3EzY0NOMmJaaVlOIDNOcEp6SGdCL3dERWZuelpiSDVkZkIwOWtsVmpHQWhza2FYREdMQ1lCTEllUTZ5UFJRKzhjd2h6TUdCd2d6MC9CVm1qYk14ZkJqTjUgdEpCLzE5L3Q4K0g2bjE5ZnVrTzdPN0dxeWE5UEV0cGNFTzVwQ09ZUFcwdk9UUkRZZVNKOHhrUXg4d0g5dGFtUW16RkVObHJNR2t1MSBYY0JQZ05nUG4yRFlEVkdoV2ZLY0tsUEFYeDJMMkRsRzFRQUh5Wi9BaWNwaGphWDA5d3hyaXJGdTFHUmdNZkFZSU9JY29VckJYdDhtIEROdTJPTEJVVy9zQUJnQWJBYXVyUXhpQ040OHNzQktNSGhyQzgwNXZPN0hjS3h2bStBSzR5TTduY3d4ckdEZFE1VmVEN2krUG50L0ggWEphRFFVRnVqaFJrcXEyUzFFMnZVQ25MWVQycU1KVzNMVVlrYnB1RDU4d3d5UTE4d2pudE41NkRqdGl1aDRrem4wbkFCaS9BT2ZlQSBRdE5kNEw2a3lWaTVXMGt5U1VVeEppVmU3RWc5aFEwSTl3T0xNdkQ2ZXlPQWV2MlNjQklZQTFzWnVtRm1EQW4rbFovZ1A3L2llQUZUIFd2dEdiRFBWVWtPcnZuRHlSSjMvQU1hRzRXRk1mRmRJY3ZoajVpRUhUNnJNRDNBSEE0a3EyVFpuc3IrYzN1a3ptd2Z2K3dZdnlycmUgMUh3QUR5UXdzYUVzNUltTGN2ZUxVUjNka2NvclkrTkVNZkRNM0FoNExiZ0hPVHlBSlZNY0c0dVRKZlNmUG9PSUUrL2IrZjZrWktoVSBCeGRFVGRYejRKYWVmLzc1R1p5bGNaNDVIM0VXVmNpd1Y5bHY0ZzY0VlZaL0xXZmFENG9VT2I0T3g5YnE5cTFQVmVuTzZjbEFHaWs5IHRYbUFsYmF1dmI4ME1LYStROTRyZDg1Z0hUcGs1VFFLMEJjWlp0ckdMSU1KYUx0dit3SHdQdXdJS0NMVEdSUG5xNTZBWkpESGJLSksgVENyMHkxSTkzR0pRQVNMRjJvNEdPNmxKaCtRQndkTE9ENEQ0eVRGcTI1NC9kZ2UvL3dCUUh6NEVCeDJnMmRndVNYVFJtcnBKeWEwViBRbGVxOE96aDZSTUdTaElGb21MNWh3WmFmUTVnL3dBOHdJVHZ1ZTZDL1k1NFFIdjRBQnY0QS8wN0xNaDBQWHcvNERScW8wOFRMYWZVIENKYUxJQnlKWWROc1pURjJoZ1FtQnc5a2J4YUVOSGJXQlNncDZ3emJvc29xTzdCY04vN3VnT1B2d0hwSzZtTkdoUjVVejFyNmlYVHEgOFdSbGszUkxQZ3BkSklZMDNvZ2lTUjhja013TEJYZlRBN3NyQjBUVEpESEtVYXRxTVpiS25nNWNDUWc5dmo5OUQ3d3MxY1YwZTFuZiA2bGtaRDVxTlg3emtaTGpYQmwwaksxaVJNS294SnQrRUpOcnFHdWh4eEgxSHRqR3JRMGo2UjJQcXM0MGQ5R0lNOTZNTTAyd2VvWGNCIGdPa1lkTTJXWmNGRThMdXhicjFYcG12YWYxQ0dhdmlscTUxQlRDREtoekxzc2dQUjVqbHR3VksxQjhFWW9yL283aE5pQVB3QS93RFggeit3S2ZVb3duYkJ0NEZyZk82aEJrdzluam9mcUVZOGNsQVMyNjJLeGdVSU15UW9pR090U0c5cndML21SL3dEbVppUzFoNmZVRk5yMiBLSGd3WXJ4MC9oYjF3MDMxSXVTRWxOcnBxZjZyZklZMlpkRi9aT3NpdllZR3BZbG50QWRmbVh1NHA3SXRqb1NyV2RvS2J1dHJBekY4IEdjNUNHdWNnQUIvRStBUWZjQXlCWkkyOVNlYVpKWnA1QURIdVNCSkpkMUlua3pYTGJNaFVOaU1ySnhYcGJ0SE5KTktVaGlXTGFpa0Mga2g1SGpqamlhVkVydnpFWUxMa051NnlmS3dlcS9EN0xVeVd3MmN5TlRHcTFjdlZ2OHh3cjFiYUlyRFkvSlBtTGU4ZGt4OXFRZjRzUCA0akh6QlpGdER3OG5PYk96eWc4ZjkzNzIyQ3NaU3E3NFJ3NkdrMXpWYTJlYmM2Tkwvd0FGa1IwaEQrVkVzYXVRNDlQV3pESVlEajZyIGc4Z0F0VElUR05IMWxINXNiNThBUVFEOWJ2bjhZMjhFY2RjbGQxN2FHYUJOMWlUVzdBczJweVNmVTY4SUF5cTlLRkhCZnZoUFQzQmIgbUQ2M0JUeUI2Y3libXJ0Q3o1dXJnbXdQMkhnSDRBQUFXS1N4K29TOHltZFhPYm5iOUZzaGJMRHp5VGZDblpFcW0xNENydURoZkRoMyA0TU9CRGxTR1FBMnBEWnZGOG1SM1ozU2Z2MlA3QWY2R0xFSXFLNmVwa3JpUnR1U0tTR1Y0M1JvNmEvYUNEa1BjUlhiWmt1Vzl1UEZNIHJ5SkhKeEhVYlJ1ZXhranlxTzZheGJYUy9qbFZoNUF0M09KTmxxUzN4c3p4SjNJT3lUeUV4S3R1WFl4VDhKMXUrSWQ4VE1GdWVocDYgSGVDMnNzMVgwM3VmM2J6L0FQMWZ2Y0FCcmRGMlJjRWcrTHlzNDJCemJJdU92UTZIY3dlWERxV3VXRThlVDJCUE1WWFpESVlJY1Y3ZyBjcVR5YXoyditqMmliK2d2MzcrQTREMDFNelRuRFhLYlk1VjBudUsyMVlSdGhxKzJxTnJlTE1GeFN6NHJ3MkNaVzlrT0V5SFlFTkhQIGZBaExhempWKzJMTHdFQ0pMeHYvQU4rUG9Pd2RKOXRhTlVERzhXcGxSYzZyU1FHMUJsT1orVFRLTzJZdVNicWFGNmpGc2ZwdlQyUlAgRDN3UE1BNjB1RjhWVS9iTGtmV1paQjNZa2hEbXdBRDZDd0h3QUErY1NvakdQY2hsbUdtWkpJU1lwRVRaQzdyT1hsamlsd0RvUnRTUCA3amxoYTVnclpORHVwS3FJNGpCMDdka2NiWTdhaVBIakhGckpidnZ3dGN5UXFyTlFGZEk0ZWVGemlJZElzMExac2RjdkxQaUI0cXZaIGgvRk9mMXg4RFRVT3lHRndPZmx0cHhKTFQ0cmVjOTdycXhBWUFGdWdBRDlzR01sbGcxK1VVb2NNNzJGUlZlbExJdHAzcll4YlZMdTkgYnlqeW5iVlg4Z1k4R1JrVDF2R2FjbjEveXB3SnN5eDNmUm5mRDZPZzdBZjgrZ2RQZlUrTzlDdGJaY1ZCckozcFdOVERHcGNyMCtMRCB1R3ZoRTArQVVJT090UVBpaUdHOC9MVkorTEJZejR6NHE5WHJDeGhoZzdwSEFNTUR5K2Y0K0FUVWhUVzNHMkFQdGtuRW1nckNRSGRvIFpMT1lGNE9VaXhITGpmekZzdXlHR1JmbUhGTGliVnhuZEJsbUUzai9BRlVBSVA4QVFQMkJndU5wM2pjTkg5TzhxU0pISmx1NDV4dkUgeDIyVlkzcmNEVklqZUtHTms5TmsyQTZpSjkxQmp1S1Z4dkdXR1ZlY21yK0poNFB1SitLSW9odzdGcVY0YW9EbWVKWE5wTGgyMDdtSyBycXUyQzNBNjR0ZzhCaHVESk1UM3lHeWR5SUZhRUh3NGhMTDFWNkd6YkZ2ZTlnQUFEWU9mZGI3SW1IYTV6TTdOdERPK1pBbWNUdmdsIFoxYnRrT0x0RFI4d2ZENGVZNWh4c0hCNEhPZkNieUx0QVo3YjJiT24wRS81L0hFLzB3bzdJNlp3czlYeG00SC9BT2VrMmt1MkErRHIgSmlMYjRtcnpSS1R5SWRrY0ljT1ludUU1U3VBRE9oOFpGNG8yK2NLcTc5ZzMvd0EvMHBaR09VR3R5RytNY3lOdWkyYlUyQmJ6aUNSMyBHVGU0MjhFV1JEUTdJRFF4L25xUElRZWMvYUZuRTRFU0xSUjZpZmdHL3dEbndIUWtxSlpwTWFjUXg1NHZMdHR0QTFoQzhqeFEzdUc5IHBWeW9aNVlyaVVIcUdPSWRxUE1jUjdzTjNBSDhaVmlQeFp2eDAyb2N4NUZyZDJJYmJYb1FsWHlUYUtROE95ZVBoM0J4ZUp6MURUK0Igc256Slk4d3F3R0U5Qk1FMGFoN2svcmJ1bGhzQjhBZjl1UDhBUzk1QkNjampJcFVpQms1T1VrdXk5VjU3SnFCaExpMmhJVFl2TUU4dyBZaE9DSnc4RzJqM3lkTS9hMlptKzdiSnNHS0NmUHYzZ0pKSE9hakcyM0xKZHpOblNaa1hWMFMzQndEMXZkeWZZd3RzeGFMczJkUHJkIDhocDZmTmVLV1lFTnFjTnpxOVhlZGo3cEJFYytnNytBNER3THJUTWRKcmF0OXFvdFBOdUYzRXRTRERYK2NTWDdZdFZOdTZza1BubGYgNGg5TWJKU1puNGUvWU50cUdMTWVhdmZPNWp3YjdwSTUvb1VmS0o5eHQyWTRtTVFUVm81bzd4ekVlQkJxUlpZNkxFZGwzM1VzWmFuaiBiSjRNcjljeDFKRFFqN2xPZkVadXBYKzNzN1d2aUhhRisyS0gxQVY2eG1SdUo1cERqVlBjbmFPSmZFMEJMdTVOWkY5ODdxV3BXOTE4IGJzYnZCUFZRNk1UYUZjWUxCOEpkdWZXNzkrMkFCajBuNFp5M0NqSm5HYXFNVnVZUFRKTXNQWkFGSDRlVXRwaGkvRDQyNFRIQ1lISHogSjFscjZpMUIrYzkwT0RQQnZoSncrL2IvQUZGdi9JQUY2cEFlek5PZHNETHViWmkzcDdxOThrdHFPN1p3ZUl0dERRdlNsZXEyQnc3ViB6S3JNRC9nejlTR0FOUVdVWm9hQm4rOWppQ0FmajU5K2Z0ZzZTYkptVVdwTDlWb2NWVmpXMXFnbVhHSnNpMnM2UmNZZXBhNTFDYVgzIHdQYUV4UGhvWmQ4WUE3eDNRUFlMYXlNVjl6R0hOamRrZCtBZm9BZnRndDBOSkpCTWphalRTelRRdmdvZUdUUDFJempNakRFVnR5Qm8gd3dKenhMVXRZOVRVclBHME1Nc0NacnVoZzBQcnNYbDMxWTkvcnUwY3FOSTl4MWt2YWI2RmJFRjBtMjJwVDZsUTlla2h0bG5rQ3NwQSAydlUrVmdVYUJKUXBWYWUrc2poU2FIRDU1OEJBYloxa0V4aXR1YXljN28xZGdmNEN2bi9ZL3Y2cmtaY05EUXh1VTBUSC9IS3lVQmVxIGNhMUVIY08wT1NuVXZKRTl4aVVtWW1NcENZcWdhL1JQSms2djRNakE3UlNUYngvWDREejlSQUhZVTJPcXV6TlpwcnR2enVIZHFuc0QgV0F0bUVneFhOb1VnMEhxckhoN0lwNHhjSElJZGpjZUF6bndtTUYxZXNqRGp0ellIaS9lQXFNQnNIVWJJK1BiUytCcEtCTUNYQXVOUyBsTXRBYkRyOUhtYWZaUllYVjZlNExiSUdtc2tJZ3lIQU5nTm9NUFdiUGNsWDhtQnBOWEJQdndBQWY1OGY2MWJucHdSdTI4OFdlRXpDIHBCbnQ1WjhuUDJyajdjYVBtK0VxT2RUaHdIZEZNWC9NMjdvNTJNYXpQR0o4K2I1Nm5oZHFQakhVZGUxS25WWHBMMDY2b0E1dStiWVAgWHdyM0dubnJHbWFRRmRrY0REaFc3Sk1oa0llTGJxQXJPZDk1M1FZemMyQ0pOVjRuMEVCc0I4LzdLVzBMWXNTK1hBT1V6VnNiWjJiRCBXNGl1U3M3VHZVOHlMS1hrSVgvSnpHUXduOXI2ZWFrTWhBT1lyTnZ0RFN6STFWcFBhNDRBQUgzNy93QStjRWV1NUZMV3haMFdVZUpjIGp5Sk5lMkRlVlB0QWxrdTZLcGxLSHRRZXlkaDJRTjhBeEIyK0JCNE4rWk9UZmRxVE9mdi9BR2lBUCtIUkhUOTBVLzNzMVF3RmNhL3EgdXBza3QxbFQ0ZnQvWVRKS1YyelNxMEdSME8wdzRlRzRKNjNPYlY5OGVESGl5ak1pcEJ1a3dmbjM2M2QvQWZma1NZYVlUU052T2dlRiBJMWovQUpGenlMQnBlYmpXaHN4NERiSmZ1YkxnNHkrcElqaWlVT0VsbG1jak5CSEZHWkMwY1hidDFnUXd6WU1HVTJNS2VDMUFWSGVqIFJwN0FVdmI4TWs0Yk1ORVdCRGQ2dkU0L0ZZVU9yekRpWW1VT1lEaDdBWks1clN3SUNyYWl6eGUwRm9ZOGQ3ZURvUFByZDhBZjM5MXcgRzNVM2dkdmlvSDNQV3JUS2FJd3VuQXZhZDJXRFh5MXA4UEpLeGJTMG5zd2VXWHArYW9OL2JVaHQ3MjlWbytQbUhkUTNhS1FidDdIZyBPTy9lZnBSVjlEMVBZME5rcm1LaDZrS3JxODhTU0svM0lmWVZjUlFObTdDdHB4aUY0ZFByOWJCY3dQMk5NL0Y1WGEzZzMvUVBuOEQ1IDhBL2dMT0I2anVPQlJkY2FrUXVjU1pmbUtkaEJoeDd1YVlwSFVaY1ZOZ1hCZXF5Wk1NTWt4d3RSSHVoZ250SmtZTXdGMll6QWpZVzcgTVY5L0FBTmdRZmZwYlJLWlFwZUZKb3RWSktqU0xxcFl4SHJzRkdFazdDSnBCRkRLa3NjRHZ0N2lOSXdHQ3RvM25rakxSN3hTYUhUYSBlWkl2cFZBZlJ4TEdIUDBtTVlnU1FwcUROdFI0UXh6TmcrQjZwOFphQStvWXFSZlZYL2gvTjE4QmNpZE5YWWJqWHhYT3FSTERSeGt2IE9rUXE3VzFBMnAzUVF5eEZjRFo4Sk9na2ZRK1RRMDJNSnl1TERnNm5sQXgyUm5UY3lDZXF0M0ZnOHl1S3lxbk5UbFVQRVJ3Y1pNVmQgVTNFNE1CWnh6WWtMMHJrOVpiUUs2V0RGSVhyak1RNldFQkJSa09LYXl3Y1FYQ3l4R0dUNmM2NkJmVk1iV0xKU2JVNUFXRGpSckUxZiBISDdQNUhYRWxZTExJc2cwbTRzanErV2tETm1yWXRiYjRzM2RtaGZjYUhGYmJZWkFia0xNV05QUTZsY0xHenFCcWUrS1RBbzd1NEs4IFZzWjRyNDRXblpCaGxjSWJoTWF1NkZsMVg5WndmQ2JNRFNkVVR0VmVDQ2VBSDdkeFFldHhDbjE0OEhtQVJkcGtxWjFCUTF1d3NFbXMgREh2cU1QTU1wbld4NWd3eHczRG1HQVE4NElodHdXVmxXdERBbThCTFIvN0FmWUtpQVAzVm5GWnNrU3FuTVpWZkRLdXVEdWRwdmVDSCArQ1lMT0ZjdVRCU05jM1lud3cvSk5ucThQQkFFTGFhclVXWGtvVXZJWmdiMlQ3OGZmZ0I4L3dBZ3dRK015cXp6SUJWMWREalpMYzdQICtJOVA0T1dEbEh5Mk4wNGZNV3c2MnQ3Z0grQnB2dmpFenRqUVVSdWNjMi9RQno3L0FIQjFoMGsyN0dqcDI3WG9rRm9ueXdBSWE0cFggeHUvQjhmQmJuSHNhclQ3VE1GVnpESTdQRVZNc1FGNFpEMVlWenExNUhqbXh5T3E5MkF2dWlrTDB4dG9ZYUV5YmtxV05mSy9hdHdWdSBKZkVOb2Q3R1RvZmV6Rjg3cVF4NWdIM0FRMm9QeVlvTEdFK2JmNS9Yd0FBK0FQbnlTM0xJWkpSQU9MZk5QWnZUMitYeHg2MEpsa1dCIExaSlN1V3B0eVd5SEE3dGhoMDl4Y085Sy9BbldRc011b3p1Wlp0cVhaL1h4OCtmOEFmNnhrTVRLcU9OVmFnU2JJdDdDUytPWW1KOWggTWhSOEVPVmM0c0ZicmFHWW1NakFIK0FRZ1FjTzJaVGRDUnczdllNL3o0K2ZBYkJzRnFGL0xxU2ZEMkdWcWNKV2RGSlNXRytDUUc4RSBqQURZeTg1U2cvR3pDZk1NTWhDWitMOEhoazhvVTVNY3E0MjdZZ05nMzgvN2JCcll5eDZxQTl3U09HU0FzKzdMaEg2ZTJBaVF5UmtyIDMySlVOMk1NZTY4eW1OSVpIampoNzMzSHVMRkJJOVpNNzVISEtoaU1UNFBTWlFubU8wUTY5WEJkTTFLbnBvRUlKUjdJeXJZdm5tU0ggTGxBWmcrR24yUWh2bGtNQ0djVWg2a3EzWXpkcjdrWmxvNEU4NGdvSjkrdDNZQUd3R3BReGx1OXVQaTVQR2trK1ZNVzJ3d3F1eGhJZiBDbFNzSXM4eU1CaERyZWsyU254NGVhaDhTUjRaUGdiNXhrNTRUZndHd2JCNS9xVDR1dEhrL0piV013Z1dFN240MWUxKzRXRjI5MnZrIElGTlcyQ0dZMDl1SDE4UEJQTUU4SGhwNlp1QnJQNzNpODcrL2ZmOEFwU3JjeENYRU13dVQ5eUFTb2FRSlQyUThIWGx3OGg5MER6NHYgek9SeklmSDRiVkFzQThEMnhaL0daT3EvL0lQdjNIL1A0eXlSeU1JaGduYUJIQkVGalFnODFHc2dqUzdIc1JNdnV1Z1Yxckk5QlpCayA3STZHVmpjajVHTTI3c0RJK05jQ1NScUpPT050a2VJZVpZREhXNTRnK3JlRFZWOHhrVTZmSlhBdnk0ZElnYWNQQVppZkRaTGdoMXVuIHI0ZEh4MDNvYzR3c3N6UmFDejVzSjdZYkI0Qis2a215c25nODhFLytIaFE5d1U1WnpRSGJSSWRKaHRNUXdVb2V3aFlEVGZZRndUTEkgTU1rdGdobzhCZjAwN1B3Wm9WLzdKYVA1ZFFVSGY4ZUFnQW1PMEVISndkbng4ZkhkVnRBa3lXRUhTWHp0bHoycFZOWGlod0MzdkFkayBEL01ya0N3TnRjclF4WjRHVHJNSFYzQ2FyQUlPUEh6NEFCc0FHSHJ1MkZldjdhcFpEZG45VlNMT3FXSW4wUE0xRUZsdHlPcjBVV1lIIDF1SHNpazJRUGFBZmdaQ2ZPRDlqV2kwTnNCaE1NY05nUGdBQy92OEFoMXFuaTJJNFhFYVoxRzBlbWRjOXVTU2dwTXRqMUlNUzgwZUEgeGlEeVpIYnhiTkU2czdCamVVSWxFM0pNbitYRDR4djNaTmVWVUtycTBRaU9ZbjJRZVhOaGRqRDVwZHRHdlU0OE5qMkVuMjFkenhmRSBwUEliT1paTFVodUV5Y2VUejFxSjZ5VGFLdnFEZkRZUktPQUQ1LzhBb0UvajBtVmRzVDR6SllSUmN5V1RDdER3U3ZYQnFoeUpjS1VMIGlTbWdPb1RMSURwNWlZdnJVSDZHOGJtTUtORlprOThOMWQ5K1A3K0E1OGZBR0RCVllQVFNsMVV1WHhNTm5tUkpmNGxYa3IrcSt3a0kgQ3JMelJWNjNhSGVBUFc2ZStPQ2NjQTJoODViWmlmRjNuWStiWFp6N1lQZEM0Q2Y2a2N1eU8wdHVaSXRjVUhiNVdjTmJJNGNPcnNOUCB1VW9zbWk3Z1h6Qmh3VzJWREh6RlhjSHc0bjBiNHVvR1o1ODJEeC9vSCsvcWpoWTU5enlLbUZMcDJ1cXZZTG11Tm4xTWVEbm1mYmp6IFJiY3BIVkh5N1VMcmtkdzFpaThpdHlqWjVySGdFOVFXYTZBNHRaNTFJcEMycEdMQno0enVIQXBGZ0ZvYjRtdTU1WHRSd3RTdDJTazMgd3hYL0FJQmduMXpnekxLSHFNV1JoenphT2dnTi9BYi9BTC8wRXBiUlNkYzBHWXNFbytVUzRacGhibGtOT3FUYUNSWkcvQ0hKRGNIRyBIRCtIZkFlcitLMld3VXQ4d25lWlJEOEh2WnZ0SHNGdStBUDcrMUREQUxwdk1wbUx6eTJyT3NhbWJhN1BvZFY4aFQ4YTVLMXphSGNEIHVwRFpQeCtIc2JGT2djYjNNV0xKN0hzaHdIeUFCL1gzZ0ZMSHQydjBqVCtTcVYzRHJjdDhWWXpESXM0ODhNSWNvQllTajQ0V0E0SWYgNHJaUGh2RmFXQXBWV2gxbXNpM3piTmtkc01UNkR2NS9ud0RyUkd6MmR3dWlEVXh1WFI4YURocUJYSHVQYnh5T2lmbkVEbDluWWlYOCB4cVZ4R1grVG40NUxFOW9IUUhNajZrS3FxdjVXYkRRTTh5eWFoMGp2TVM4TUJxWCtIU1VucDlQcmZkUU80TDdJam9aL3VveUUzbm5oIE5tZVhiWkhqbjRCQjREaDFhS1k2TWk1TlpEM0pGSmtZM0FiWVNQcUVNTkZlc2dCTitYWXdjaXlJZHFWV2g3Z0huQVNFQ0RXNk04MWYgY25HUWJzYjMzMzM5QkFlNS9wZXZpMndMcmhNRE1kNXFWbkM2ZnJjc3I1ejdIZHk5b0NtRURGMjh3dG9iSW56UjRmbmxmOFZtRThFTSBYWm50YVBDZm9PLzdBaFluK3JXa2hGRUtKTk8wMVQ3cTA0b3JhWXAxMWY4QUp6WDZweTF5UHBWbmZSSTROanBaWmUxdnE5THh4MWVnIFRWcXpxZGZHWmEzMUpCK2xnd09vREY2Z0I3MDQ1NUdpbGFNT3lRSktnZGhwWHB5VFZMdVYyWTJTRGkxMmVCWExJWW5IZkN2ckkrMlogYjVkMWkwNlJxRStOd1J1ZmNjZkhkNTY4OHBGYnZGZ3lCc1U4Tk5sN0JEa3BaQmtzNVh4RGxDakRGRnpQaHA4eDhRNWc5Y3RSU1lKNCBPRXpmZmYzdjM4QitnRFlOZ2ZDK2pRejFiNXpJcjVQRzFkMkNLWkE4ZVg3WVpMdXBHWDhXeU8yeWU0V1FZTUQ1a0JTY1lBUDZ5VUdFIHlmTmdpVDU4OTREZnovU2xIdmtlMVFlVVVybVpaQmhJVzF0SWFDUmpqMzNLaG55Vk1zQ0hhZFZtR1RoL3dYeGYvbkZoR1YwTlpKOXIgc1hjNXYvNGoyRFlFRjhWMnZ6TEhTN2diWEtaR1pBMWV0dGV5TlhUdlM1WU9BdEJVaTIwWVh6RkR2aWVocDQvNXo0UWZPQnN5eTBVMyArOTcyOFB6OC9BSDd3SFRaRnhzMzd5UFNuZ3Q1c2NXVzVkMGZ4U2JiK3czVmR0Mk04TXpERXFNdHp6dFQxamlRZTQ3WnU3NDhWUjgvIEE0NEw0OE5NQWxHaXdwRElocERzMks3dG5ML3pLNVBGZ05jOHZEek1aaTNEWDdnQjFLT2ZEbkIxbERmS3pLY0pTUWh4QjJBLzkrZnUgb3hncmV3VkxNSjFlbXJZd3hrM01OU0pGdEFWZEltaTBPNDBPTHVIQTN4a2NMVVgrVmNlZk9ZRExNNEdNV2FyU1FnU3F3REFBUWZvSSBEcHk2cFpBdGpxdXR3TmN6Qng3QmJwd1NQbVozYjF3akhXeERzWncrWXlHSHUxSWErWWVBQkNmQlpPYzFlTFpoaHhKcTdZd0d3ZjhBIFdvajZtMC81WmllVXRxMUNsVnlWVnQwNnFJbVFCSkdHd01obm9ndTBBN2dIb1p3M2l0eUV4cVBXaGRNN2sxNUsrMkl4eEpOdXdNK0EgQUFFRkFmdmZyUE5PelFLNFI1c3NrUUlaVndySFpoTzNMSGVWdjN0ZnROSjhGMEtwdU1tU1IrMVdMdHk4YlZtZ0ZmTkFrMmFJdWpkZCBEWnlzME5Oek01Y0FvY2JObmdmTVcwNE9EQ1l1NHBNdVJEWkNHOFBuMXZFdzFBVjhEOHpjK1VFdk4vZVBQZjVQM0lEQTRjRDROaEtLIFptS0w0dURSckNyalVPeUN4Z1dzTUtIS0RwNkhEWktUTVFzQTRPeS9nS3ZCaGdzb1QyUGU2dUJud0IvK24zN3BoUjQ5cXR0RDBDR3EgQmtvcUhaYTNHYk5QNEdqWTRsUGFMYXNJRFl3ZHdtV3B5UVB5RFk3TFgvZFA1TlY3NHpERWZaTjgrZzcvQU9md1BxUWZtcHlraHk3byBXTGdIQU1xbWtpa3JaenBwaDJVS2x1MWRlM0tHbllWeE1xQ0orOXRrQ0JCcXduV1lzbU5ldGw5U1FjWUVIQUJqdndFLzFvZDQyVUNRIHZVbTlFSWxmRFBFeFd4Y3F3R05paGlmSjU2RldPZUNzblpzVFdrUWp1dzlLUmsxKzNocjQvSDVmNnVweUo5Z1ROUHJIWG8yR3J2aHEgdlVja1l2aUpNQTBrSjRiREkreTNNdE5ic0J3VllDZTJndzdOeGRvV2F6T2NKTm80RDI4QStuOWdxdmRHWlhkeU9GdFp0YVRHU2h3MSB0S1VPT1RyMnYyMHdMRnl5aWJNSDJRdDF1K0dKakI4R3kvZ05Vemt5RUxaa2J1aWJDRy94RjFZb1doNklJdFJ6RHp2YWxmNStyUWxmICtueWhsQWJTOFgrSXZTL2h1Z1pQWk85cmV5U3lEaC9FdDhDRERaV2E1R2haWjhPRTJod0lBZnFJQWZ3WHp4OVAyQlU4Zk55eVI1V00gMlFTbnpLSzdnTW1TMENROVh1VlpGS2xSSEF3bjkxRnNPUTRxK1ZlcFZYeG0zL3N5eThhaC93RHFBUG4vQU8vMUU2RnkwSmZIT05vVyBkTU1jTERGQmsyYVBrTUpMWDJrWS9nWkkxNFYxUXZnNk5ORkpjaHpDY3EySHBnWThqdXpKNXJFVzVnN1JiaXZSOVlvWjZ3clJ6azZwIEcySVFReHBBU24yTWVySURGMjh4RHRSYlpPUHVGcVBsZmI0NE0yMXE3TlpscWNKZHZjQndIdENBMzhCVjF4VDdFTXNtU201dGtNanQgbERZeTlWOWIyUTRNTmtORGwydktQbmNoRG1HT2VEcG1DSXZvWndPVC93Qjg3M3ZoemY4QVlFRUJzQy8wd2lqQVVvY1daWFo0QmJociBic0VyMnYzeXQ1RXN3K0FXRm8rR3dNYUhjRXhrUXlDR0RmVStmT2NDZG1JYXVUR2JJYlNBYUNCZnFFd1BnT2VnTEZWWFlHWlFWYmg5IFVzb3dTUFpvMVNzMnY0YnNIbGgvNXZVRGJTZVBtUStIOGJJT0FNOVh6YWppRmxaVnlqTXplRU52SFBnSEFRQ0NmdzZRWmpRTWtUZDcgb2ttWXgzUzN0WWNHc083am04aFJGRHAyeXdZcXM1V3UxbWpla1NRZThPMzlPV094c3lVM0xTZHZIVk0zQmdzaHR0QXcrTkVNYWVhQiByYTJFTE9WYlFsc2t0TllISm80K3QxdTl1RU9xOW5OcVh3RFljWXpiV01XUWFUK20vbjlnL1lPbzE0cnBMY2pBMzU2clhGYm1UMG51IHhuR0NNdm5oNnpYS0tZVC9BS2VoNmtNV0N0MGFBNEFkNFdXWlg3bUV3WnZaQVhQdmJmMzczUHVEVm82QTFLeEU4elZXZHE5UEJyQ1Uga2d6cHYxT3ZDOHRwcDdtU0c0cDhPMUZ1WVlXeUVOSW4xL1ByakJHd1EzM0g4bytjMkIrNTlnQVFYNUJXSU1nVjA4T0IrVVVHalZyaCBNbGhqektmTU5oZUxWeVJhRFF0MmhEUTN4UFc0WkF4enlCVXNGdzJ6dGV6RTlrdEZKZU9mQU1FSHdHd2FrQUVDSkFtM0NiSVNHQ1hmIGtrSlVUTzBNcXhad1RSRm8xVlpEbmt6RXJnQTZtU1paaTh3M25pbUVKYjJGeWFLTlhmampJa2NtTm04S3lGNUIyVjNYZE4xVllsd1ggVEZmR1BKdk04M1RIbTFHVjRFdUY4VktKRm9ZY2Z3TmttVEREQVl4YmNMYTNkNUdLOXlMVE1jd1NBbS8wR2ZBYytma0orNlRNeXpIeiBOcGRrTWdjbEFyZTJ0T3BzVElzSUM0SkNIVXA2d254b21WL01UMlRHeUp0NFBtL1lvYlh5WkZ4S1Ztc280UUpWMktEdjc4QVB2M1ZqIHdXbkRWSFJGWjQ2bHE5QktLdFZXcVpUdmxXWE02cHFucmV1YlF1S2lHbGF3ZldRdmFxR1hzQnc3WjFBZVZLc1dHZ296ckxNOEhFa0YgajZmMHc1RGdBWUt2U09jVU80V0ZYMWc4YlQxdzgvcVlDMDRka1dFaHlpa3ROY2pDL3dCaCs1REhXN0JhaU85MDhwSTdLems3a3VSRyBHQTk3U1FmSDc4QUgvWUIwbEZEUm5IQ2VHS29HV014UnhuU1JjU0JVaWhYYnhrTHB5MG1XSVlZV1ZJc1ptS0syY00zTlpJT1ozeHVoIFl2ZHg1SDJGQjdyNHNVcG9lcEFXREd1NzViVlhOUXRwVXJOdEFid2RJVzJpeHBZdXI4VjhQM1UyZERyOWs5OEo3d3lXYldiNFVKa3ogZ1RFMy93RHVEZjhBcVNnVWVRdHE1RSt2cTV1Q3lCdWFlb3FYZkJMN0R3TUE3cTdrSDVneUp3ZVpNSUIxV2U0d0FiSjcxZXJrK0RoUCA3L2J1L2dBRDhBQVFNeXM0ZVZiR3pRQnFBSGJZZFdxWS9USGJRYUl5SzhXd3BRc1B4c3hDcmVHSHNCYkIzU24zd2NtZGpXaTVGbFpSIHdsbzdIM2RZT0FvTnVuei9BRTdHU1BYYmJZRmtIb3FTdGphK2NCcnZmQVlOVUNtNEZFUFRnZUZ3eDhQZUpoZ09QVDY1N2dJbGpUTnogVjN6Rm1Sd2lTRTJBL2dBUDdBZng2a1phTklDVnl5VUYxZ2h4ak1kcHN4aE16aHQyL2RiYm1YdFRIbHJrSTdLNjBocGxESEoyY2ticyBqdlM1WjBsTGlNQUc1TjhWTEhwOElxbjF2K1dvMW5WcG5WYzcyQlc0ZWoxTmJLUGtRQ0JjR0JQY0pscWNrcjlieDA4YjY4TGJ3ekZDIGd4NU9KS1NrZzkvcUkvaDJpUWovQUZ1VjFObnE5WEpTcStzaGJXMmlZU3U2UXE2a0szZHpCUldsaTJnUFg4eVo0Y3dRbCtQQTZqSWEgenVqUWpNeHp6YU8vSDM3QUJ6LzdBYlI4dTJLcWtFcWJIL0dzNFdTTmlUR2M3T0ZldUJROHBsRHppNFZ1WStaZGdkUDVWMnYyUEFadyBQY3lRTkpkd25QajRERDc4ZlFlb0daZksvbW5GVVd4a3UyS0dodjZsSEExV2p5dzc0cjZaU2lIYWg5d01NbGJ2aTI0T0dxaXRHRTgxIEdCbW9Vb0xXU2U5NzJEQUlBQUJidUlEcW1rcFdiWlNTM01xaCtiamNKaGdhL2trd2JGUHV4dklWMFVVS3M2bmZtUjE5alozeUFDT0sgSGlSSTVQUE9HUEY1Q3EyclJ2dGR0YUt3Y2tlNmFRcFlhN1V3cVBFNkdxNm55bEorbDlKdVoxc1o4YkNZNFI5ME1UTEhjNXd3cU1XRyB1M3NNMkw2bm93cVNaSkNKZ2FobEpNbk92UnhacUtyTHJSRUIyTzJQVXNxQm1yczJBbXptVmV6b2JTWVNNaHRaNVFCblpoR0ZYZ0RnIGt3NSttYkljc3pCMGpTM2c3RlB4RzVvS0VDVEZtU1BWblhPVCsyWTRsV1BadkFCTCtwMG91Z0JkYnhxL05XZjlmTmFKUDdNaWFSMlEgMHJNV1ViT3FOQWtFRG5UL0FLSFN3bUtka2FmYllNVmZTenRKckt3UU1rc1F5V1NtTHVET1FFc215bHNlNGR0MlJ3VzJCYjM3Q2ZCLyAydVRHQTZUL0FNOFFDRGpzQUVCMVZFaFg0ZHlVNnhzczhOcTY0TTNPcFNKYUZoVml3TmdldWJRbVcwQnVDdjhBVDN5Ump3RHIweXVZIERoQW5RbGtZcnE3TXpWWDlKT2UyL24rbVF3SFY4T0x5UXk1VCtuZ3dMMDZ1N1lyc2xoSzloV1JjaWJxRUFubVFnWGh6UTRmNmZCUTYgdUFuTVdZbXI3WjRQRUxzSFBuN2Z3Ry85WFkwNzZVM3dycC90Vy9mNHFHVFM3ZWFxZ2M0dFJic0JlbUpxdTJhVlNpR1BtTGJnSDl2aCA4OG84OEQ4WWg3bVRPVmRWL0J3Q0NmWCtmQVBBZENXWDZZUE9naGhsYVlRYnM4VzNHOG45TUZzMnh2dStEWDc2WEdBeklqbDVGS0k4IFkwNzJZOGozQnpqemVLNG5qdzNIeDFWR3N3NmUwUjJSM3FxcGRuWElkZ2N3V3pGVHNKZjZSYlZTQitlQjN5R3QxV1FtY1RyOThnOEcgZVVOOFpsa0drbWtud0hQdUEvcjFQSjdBMGFtMThiUTRHcTdJc0pvVzMrelE3SnFRSHU1aXg2NWJJdDhHTFF1SDdnSG1iUEJnWWQxTCBIR1BPMTBiWm05dTMwSGYrUWZyMGdhWG1SNVVmT0ZxNEc0MXQzaHlhOWVHcmk5WkljcmRtaE5YQjVpNEdYaDYyd3ZnT2Z2MVZvWk1ZIGhxeXdNK2s3SHY1OEJ2NERwa1NHQmd5aGNPVW0zQXlhZGNybXBZeG5XRXZpUTljeG14TktUSytXdzdndHc0ZncycHRYenpVSEdjWFYgMlpHT2JKdnUvZ1Q0RCt3VnFGK3BaWkwvQUx6QzZuU3FadGhHalU4d3l5NFNkbnR5R0hmeDdjZVU2ZVZFS0IzY2FkZ2Q4eHhic2d4eCBDWXhacG5kdGZldGZ1K3JPV1Jia2pUbXB1Qm5WQUhHa29yNFNseUQxcVdSZ1lxV3hxeXRDTjlQRHJiSkRoOERCSHAvQjJSNVpsY1gyIHpPTzJ5TzRBKy9BUDBBZE5RSlZDMmVIOXRBeTFSUzJlc0piczI4QTU2d0w1bTBPaHk5UG9GY1g0YTJocDh2YnBpT0JZYTBuV29qTTEgWU5LeXM4SnRHcm5nQXdZOEJYejcrQkFWMWFGcXlOZGFIWVNicVd5VnRrUTBPN0Vob3VCMk1DZUd0RVMwTEdyZXY2M1FrN2g5YnI3NSBZejR3UUFZZjlSZFFmU01MUjMvbjN1QUFiLzBtVlBsQXZXV3QyTTdqUWxrSGhzbFRwK3BTV3BCSU1WS2VscHFhSG4xV25wNWluNjNvIDhQMjArcWgvS0lmbkRleDcvd0NmUHZ4OEJzQndMR2lQSkc2Q1dGTXA0MmpFeGo4QkFJczAzczZlemxIZ1I0ZlB0ZklpRXhLaVNycEogWENSQmpzeU43Y2k2VStPTmpFWkVuSThpdVNvZ3laWXNPQmFFaDJDUThvd3QxazBEYklIaVpZRm9VL2xNbGdCekZKM3lINWg5U0hxUSBPWnliN01UT1dqdmZBVjlCZm43d0I5K2g0WkRNbFVQWVMycmdYOGE1SGpmeUxJcVdqcGEycjFldklaU0hWOE9IOE5QdUJnbUk5dC94IER6cklacmc0dlVDTnZhU2J4UGdENkNBNEQxWldldFBoMUpzMW9VMFJjcjd1RVIxTlQ3NVhaSW5DSm91WHlnQjhJYWhFTVFvV290RHAgY0ZTVUNGT3JiTldoWGtwSUZkYVRhWHY3SUFBQXdJSFZSUk9zSjhwTy93Q0pxQXBMU0tPemN5UmNTU09xc2FxdDFxMmRNb1VXbk1aRyBXWlQ1VVY2SmVtdkxZWWI0VlRCUkd3OVRJVVJqZ000ajhnUU1WOS9YejJQVGxQY3gyTjhyS3R5NEJzOXIvTGZaZWY4QWliOGVPdVpWIE1rYnVOUFNMSVl6TGpoR1NOeVFOaDZzWXBjR3hUS3p3SzVncm9zUlREVWVxb1ptc1Z1c1R5ZU1zS3RtU0haRm1yWXUycllUWEo4ci8gQUllR2NFOWtIaDY1clMwYWxSdU04WEtQQXdIM1JDVlgrLzhBL2dOdXFUaDJKWmRoMC9tMXpMdEVDK1ZXRUUwK3RtR0NXeUFWZVh3MiBGWUFkUGNIeGJ0VGtpT3BWL3dBcVF5Wk5YcHNhVC8wVEIyNmdnRDc5OUIyRE1yVVpxRHNWQ3M3VWhxTGRsSlZBNmtHMjdsZE9BUml5IEdVUFdhSzFCVEsvaDloaTlicDdoamFrRGdkY29ReFpxOG04azlqL2Y5L1h6L2dEL0FGdWVLN2FLZ3RDR2tObnlheGNsVWxwN3FkcWYgTGdZWEJ5cHVJZUZ3MkF4RFE3VWNPWTluSUZQcVNxNFZCWnVuTldabGc1YUtTN25ENER1NkE0K2ZBUDJSMjNJSklwU2pUQkRHNkk0bCBoYU5zZnFvNURTYjBhQllnNjBtV1E1V3Vka0llS1ZkUkdIVkZhTm9weXUyOGVvVzlyYU5zVWtKTFUvT05EdGErMnBaQjhlSzV2QzVrIGd5TnIreUF5VEdZVit3anpBSk1haklyREtLTWhCUDFJZnMzelBnRVBuQjdNUmtNbzgxbURDR3phUHY4QXdEd0hWdExRNVJGeTRkalYgZldNbk90b21nQ1k5UHBLZTJCNVVWaEEzSXRqN1U0MllNVEI1aFYyNDhEbWV5d0xSaG1QZXo5T2ZBQUhBZGc2OC9xSWFRK21CMHRSWSBUci9yZEtuNnFHeHIwL1dwVzRDWk5GcHJDVFRIdGdlOExJbUI0WkF5MUFWL0RBTmdpcTc0TVdmdXFROGI5N0g5L3dDcnh5TlhpblNKIGhWSzJnWWtwODlrQ0thL01pYVo2bk1TbGVwNHNXR1BobUErRU13d1lOUS9sdncrTVZkdG43SWI1OStJdC93QWJkUGdEa2x4TVNMbkUgOFRpUm80M3hqYU0xdE1xWW5ETWg3NWJ3T29KRmtqa2FSa2tSa3dqU2FQS2VJdDd0MWk0eXlwY2JBOXA1Nlh0ZnNFY01ubUFEbG5EYyBrOUNVbXhIZkJyeEVEbm90VG5wUzNWOVY3eGFpZXlEME5xN1h3RWJiRm1tMWRaNE83SkxzYlA4QXR2OEFpZ3YzUmhYOU5haUtxdml0IDN6SmhtNGJ4c2xPQjZmZkdoZWg2Z2lrUVdVbU1CaGJXM3g3N3dRNEo0ZkFOekJuRjN6L2UzZ1VFK0FBQVAzOEpoM1E0WExVN0pGc2EgWUVHMW9CM1pITURXQXNZcmx6dm5tY3hmNWhEdUI4bUQvd0FsajBPMUZ0WXdReWl5VDN2bXh3L3Y0REFCKy8yVnFkMFU2dmNLM2lrTSBpTlNlbTU4RzNHdlhrcTdTSEZpMkhhN0kvbkdRTzRmck9uMS8zSFQrTWkvS2QwVWtKdjhBOStmdC9BQUFCSStHbWxLd2I2TG5QU3B1IElrWUtpUVJTMk54ejJrSmdtWkhsYTZZWTR0VHFZaUh3cmJRT3krcExJaHRFZUxJYldWdFJ6azhIampxT0lSN2dpMXZEZDJNOHRKOHUgem1TNDE5cXM2UkVXbkt1ZFV0OERMZy9pZFRrOWIwM3pNVnQ0YmVld1dRblVEUlE2eWpjSjRUaGlmeHQxK0FIMzQrQTgvV1JnMUFOdCBnRXRVQVpKU1lZR3lIWjRvY2tlVDFOUFRhbHIwODBRN1FNSWFHdHJjd2h4VTlZQUVGZzg5bTJobUduVGxYRy9QZ0QvN0R2NzR1QmZUICs2bHFNZEJjK3VhdEdRMjJSNjNyMTNMU3owcjVWOFRGK1p2QzJudmcrWUR4WUxMbklZemEyaFplWGkwamlTajhCdDFCd0FQMndBSTEgNHFyVnBRVXV5YVdUWENyb1l1d28xZTJnN2FlNURZdE5GWHJ6Ull5SVBEOTFJWWQ4SEdGV0E0UVBoOFpmQ2hObSs3T3p4c0cvdngvbyA1RmpidU56dks3eVNCdTJSNHdVeWFTVHVMYk5qRVlDOXc4am5yRkp1S3BTSm5LUlFpRUt6WlZtRjlRbWhoR29YdmFqajIrZXJMTDliIHgyM1R2VXJtK0dEWjYxYkNKeXpBMnQ2M2lNa3BYWGdNcUhpeUdMSVpJYmg4eUNoL1AzZ255aG8yejNOaERmUGovd0MvbjBFQnBWZzggeWpid2FWY1c3SU5lSnVNbFRUeDJyT21JcUUwUmNGY0Nuc0VSOGIxQmtERHpONFQxKzJ2aDFtemJYaGpqU1ZYTzNQdkEvd0JBdndGSiAxblpIWkhUSloxSkMwTW1OaWhqVmUyQnpZZXB6VmR5TFJhdjlyZ1E2SG1XUk1YNGNDQVJubzh4bEpJZTZEUGQyTisrRy9uL2ZnUFduIFVvVUIxODhPeGtXbnFWU3JpcTJwQytIMFpoN2p0U25Ma1hnTGxESU1qSjNVbUo3Qjg3aDdhOEdDWk1weVptUi9OdkFEZ0cvN0I1OU8gb1Z4R3l4U0NSODJVWkxoSDJZQWw1TGJETExnWW02SnY0NmVGVjFqS3grdGdoZVhMaGtsQzVSNDQ4WGlPN0krQ2E2aDA5ODA2SkJSYiBhSjdJN0hvc04yRXVEVVlEaVppSFk2UlVzV2F2MXVITVZ1WWhzQ0cxVDdBd1ZWc1h4Y1h6blpPRStBMkIrNENlQUhsanFJSUovd0F5IHZiUVRhM0NMZFZEVzF0c2hQenBHenlybEUwMlUxQ01HOGN3M2dndHZEYmFDbHlRWCtMNmdHYklrMWR4L1lOLzM4K2ZBTWhEcSt3SmUgVzdhZkF3Zm5ZWkRaSWcvSnJmaEV6ZEphdXJzaEdIRHJmN0o5SFEwOEZ5UjVaeWo0ODI4ajkwYXQzOEJ2K0I4K0FBSUpzcHg5T2N2diB3eGtGV3lERGtlb3FJajAvVlpoM21OQ0pYcjVZeTJQK0c0aDVnZGc3cWdWL2UvSnEvT2NMVVNVbXJjRC9BTC9sMzhRbnlaeXdScGc2IHVkaUV4b200RXlramp5TFpKNTNjZ3VQMkVYellFd3N5Z0t5WUk3YWdPNXh6eDI3UUNtcnh5MW1yOXQ4ZFZLL3hOTUdrSFZublk2YWcgSVRWUFdEczJzTGdoZ1hndC9NdGd5S2hqNWlHSDFIMG0rVituUW9EQWV1SmJaeGd2SGF3V09QOEE3QU1mMFAzWXNsZ3RTdEpHbytCYSB0WTFkWVdVdFkwNHZtSHV0MkZPaTZmZEtOU2xJUUF2RFFxSE1PS2ROUjIxUHdoTWlOcDd1VEhBbzhIUGQzZmZjQXdZZStEQWxDT25OIGJnWlJLMWNwVlFFNXpQWUNXQWw3OGthQUphVitQeEV6WjF2SDVsamNmZ1BHRm1NL2pDWUkzOTRBSHo0RGZ3Q0Q3R3hpUkhEVlBWZDMgSHJhVzBPciswdU5YaHpBWjNjT0J5L2lPRmdURnN4ZGlmVzY5RGdxUTlEbko3TldhdXJFL3V4dEp3QWJCNS9mei9WbVJYa2pLbjJaQiAyRnBJc2hDaGtRZ0NPUEd3U1k0bHpzWkR0RmFJRVdPQmhibDQ5Nko0cERGTEdUSkdZbFpsa2lhd015UW9LM2lWSk4yR2NjbVpoNHhpIGg1dWNTSk5GaHBMWlpFTkRhSWhpMExhbHRLdUgrSERoek40WUpqVStWZTIwRERHTTR0OHN6WXdsWGhEbi93QkFBYkJXK0hYY3dOV2EgVFl3RXg4UE9tU1ZNd0JtV2dKUTRpYnVrVmsrSUg5MCtHdncxVnRYeUU3azFaaXloUlo4MzdjQmZqL3VBNEFmN0FaUmJBcTZvWkRIaiBaSXlTcmRUTWQyakhEMFA1WUU4dDJBWXNsUFQzQlBBVFB3ZWVhbVJuWnNSWk5tODJFZUFBRFlOL3dQN0JpMzdORlozOFVzdDJONXdZIGtOWGxmSXprZVd5UGtvUytORU1nWStHeUdKamd0ZzhQZ1Z6Q0oyK2hxL25VbndlL29JRDNBZWZPRGNGZW4vSnl0dC9UK3h6eDk5bmogNHg4bStzN2NzeHp5N0dlc2FySEFWNVBuUC9iRWlqZDlXV3FCTXRqVXpucmRmV1k5aGM0bzFWTnFaUnMycGRRN0FvTENkcDd4bVRjRyA1a3RTcThGbE9FWTFMYjRFSFQ0dDV4eHhyTzFNREtSeUQxZXJGQTlMN2lmd3E0Ullic3QyeTZWMDlhWUw0dFBLa3R6OUZ0bXBWWFBLIFJLOFdWUFY2ZFRxL2NUSmNMNldKZXhzZ0dncVZwcldGbUlTcmVBckgxWWhRWjYzRjlmeFF2YkIrSzB1djZmRlVmL2l3TElaTE90QVAgR1V6RmhOVGhYdGtPVXBkalNwakJWZGtNaGlZdHVDRnkwaDlQNU1VVjFsbUJtd3VuaTFEK0d3VzZmOCtBVDlpSWNlMzZYczk4dEMybCBzTUdUN3NxZGZHb2E5SzVsZHpZMElaanR1K1dSRDRkczV3OFFxWG1IN1VNR2ViT2Yvd0N2djNWMXBpNENxbjB6OGFXT1JMZU56VnE0IHNZN3ZITm4ySGdqanFzV0NLV1lGbzNXV1NTQ1cwa2pRVXpCc2U3Q3hRb2U2dU9sTFI5Z1NIZHdHeE5hV3E3YmM2cFJ0OHlNNWJIcWMgeXhqeFpvdm15V0NIY0ZiektIY0xBV3dmNXBlQTR3WVU3UG8reUd3aHdCNERyMGFXM25tNDhPeG9SamhPb3g4dXdTUVNkUGJ3d3ZuZCBCZXJsRVpGOXdEbUE5MkxaR1k4UUdCdGFzQm1ucTBLdnFBbmk3Y0p0WHord1lWRjc5VkZTMGV3S1F6S3gxYzk1Z2xoV0NIc2lJUFNYIFpmWVZ1eHBRbVZGTUVJaTN5TmJtRUhFSnQ4QTRoOXpOMEdMTHdFKzhiK0EzL3A4QzdReTJNbTRIMDFWVXBnYnVSRXZESmFqRXVaS3MgYVhZMTNPQThPeUo4eTFHUWdZK3Y4NGNkc2ZPRFBQaERhUDhBWUQ0QmdBYyt3UklZcEpHZUowV0ZxVGhzNDFBcmVoZVNoaGR4NHZpYiBwdTBZOHRqV1ZVSWRYejJaV3hmZGo5TmpIdHVESEttV2ROd3c3YUFCN3lldEdZdmc4MURXMDIxVlp0QTV1VFg3Q09McEpndDRGVEtOIEQ1czZmRHA5YlR5SDhoVjg4SHVZd1h5ZFpCbS85djRJSDcvMXlDN29NVWlqdFhJdzhrOHBIcTNxZDREclRSRS9GOXhwa1d5R0F6RFcgN0lXOXdEbkxNVCtLbU9jQ3lneFo0U2IvQUgvd0dIMEVBemlGYnlJQytITTJYREc2YjBqaEphdHpEdGVHSEErSmxObklyZGJ2a3REbSByOHkxQjYrZWFnNHp0ZTBERVo0Q0d6Yng1KzNUL1VQVGVuOWJjbmpPZ1JYQkp0UzdtdGtzSWhiVlkxL0w1UWVySUNyNGo2M0RzaUdoIHNwQndzWnR0Q0JZeGp1WUxRLzZKMlQzZi9Qcit3QUFDOXRBbWN4d3ZpTVZlVG1pRVBJckw4ODhmQnZvUnVLekZWU1pGUWlVeUpqSkIgRzJGeU5IYlY3ZUZ5NzZKeVd1aWxUT2FaMmk2Q1Z5TytTLzFXTGgxTExIWkxVSExCOVFVVmVBMUxNQWM4bU1qaENUcXJhanllQitZVSBHY1g4R2srRFBZbjE4L3NDRDBvRmNmRE1sQTZhNTJSS1pLbHpySWQ4WHlHNFdGRHJsb2xvYVlZN3FYQlc0ZGsxSWZEQnR1UGJreHlaIG9WeGd6aE95YkFmQWVmOEFQOURZOUxjTTV3YW0xU0cyUlhyNW5NbHgxT3RubDlkVHlnc1NCS0dQaC9ERHpGQ3IwODUvSU5Sa1l6RkUgTW16SEVrSWJPSDlnUGdEL0FJREJWMXVZT1dNNFRBenZuYWJ4b0d2VnQza05XbGZVUnZENVNLUTBOQ2RhS0dIREIxdVk0US9uci9CdyAvZkpZdVJHWm5qelp3Q0E4QWYzL0FHQnlSTkR1bDVNMFNGSThxeDI1UHNsckkzVnQyMlBQdUhucUF4a1Jzc1hZenE2dG1MYmJ4c1VGIEZlOEc3UFBOZkhWakhCT1RhQ2NtcXJqNlVsTWNnQ1d5NU1LUW5YQlNkaUNZQWsyS0dtaG9uMXRUWVFIWXpac09QUHc5V2ZIV0FhMGsgai9SblpVRlRXd2dtUGt3Y3JPdWRhdVdoNjdpRXF5Wk5FdW1tL015dDJac1ZCbHdBdFk5NGlGZDhIK2hsS0dzNDRtREFPU3JoUjZSbiBHVEpmTFRvVUdLVHpZYTNsRFl4aGhPTUdVV241dWRBOGdEc0cwK1JEa0Z2cDZzZ3FMcmNOWGZpei93Q2IxSkV6S3JDYUZRUUNCbVRRIE9QRjhYV1g0SGpxc2Q2dEVNcFE4T2V4Z2JSQXdMSFNWTWhhanRWK28rSEdQTzc1SzIreUErTEpWYjUvUFQ3QUFuRTlHZVNndit5ZWYgZmtBQUFBSHdEOTFhalViWUY2Wm9mdVhFYWttNElHbS9TcnA3cCtxMDh4RVR3QjdDTVVXN1JUNGJJSHNoYklPRUk4UDVWTVdTZkZ4bSB4dTkyY0hRZjArZzcvakR2RDVEcERUL2Z5NWZDUzdOV295dmh0T0dLWlBCMU9IRlRaYWJ6QWdubUlka0dHVHpsYUVGS3VlQ3ZJdDhaIGxoSC9BQmNENENBNTlVU0MvSDM1L2FpS1BiRjJ4RTljaXZsSm5vR2RUZ2tPazUwQjM3dFZ6WVNhMGNmbUlhZlZaZGxINFRqMWdQdUogaFpSbGZFbVQ5a2tJRFBzQURIdEZzQUJCQm0wbTdCQVdRVFRJOGlSVHhSSkk4Y1V1a2ptbWhFUWozSUl4cUVaNVNmSlFLb3NucENDViBvcFpUSXlWZ0hWR29vN1dZa3V1NFNVNEJvWTQrR3k0U2FBUUY2a2E3c0k4blF3bFB6eHRYRnUzdW5zT0pjTHVGeThBTnc0VytucmZ6IERCQmIzNnY1NFA2enp3bVQvd0E3VUFBTzBXd0FQUHc3akRqNXJyTWZMR1E0eWZTTXdieGREbzFYckxpNVNzcFVvT1AraDF1K0J5S0cgamdWLzRMZ3pZb2F2emxHM3MzZ2Y1QWYvQUdEWVlkTFg2M1NKQUZEZDNhTlNlVjJjdGVPQnUwTzczWUJLTU5vUGo1WDdJSGh3K3lmSiBBZExFSUZWODVSbWdxekxKeXJnanM4WWIrQlA3L3dCYVZzNWFGMHc4NWN5aHBKcXlwcUJadHdEY2lRMkdDaUd3MXpHVzZ2NUx3T0duIC9WVDFmMW84VEdibEZvRTlqTmhQUDdBQXFML2YycUpvbFdaUStxazIzUUswam1ONUl4SERISElXcHNzOXBteHIwell5ZTc2SmxsYU8gQXM2RExPbGlPVWEwWS9hbExnVGZQSnlGRGl1cGpUMnZzbGNrUStyN1RkY0ZTUGx2MWozQ3JlWlc1aFRaSHZWQlh0RGdIelo0YkkrTCBjd2haQnhTWUcydVlmR2Zvcnp2YVJWencvY0JQL1h6L0FMTDFnZkxRTXNDZStOREkvZ2JhdUIyczFmUEVzZVlXMExVeno0eWozQ3EyIFNxM0MxSEF3MWRuNTZvdGpDZlBIa1p2ZXlQR3dmMkRrSFdSR3RrMGUyb2xhb0sweEM1TGJXTmthZkhjN3B2c0N3YlRUcFRZK05HbTkgd0RXUStJbUlnZStOVFlQc3EwekQwOHZnd1lTeDRUVjV2ajc5aHg5K3h4d21GTXdidk9PSHNGblQ2dXlURmhTYllNV3IrVFRENVY3WSA1TkRKWUQzOHg4cC9qOXFOV25qVC9QNTRNR0lhdU04SjRNKy9MNS8zNTkwSWtrajFVcXZwcEJEaERXc1ZzODZ6dUo0c1JVa0ZqS2JjIDlmY3ZiaTIrOURSb1VLN3lMTWpzRmpmdDNJKzBKSUdzMWxSdGNUWEhjYjZrdTc1RGo1NVhsR0xSdHFoNjlaR3V5SzlpZlc1U0pYMW8gSGxzZUk3cUtCaFAyZDRBTUNIQlhCdkEyZmF3ZFhCTWNYN2dMOEFQNDcrZjRoWWJWZlVDbzMwU0JvYkJ3clc2eU5PNmh3OUtOTU9FMCBQb2k0eXloUDRoWkMweUo1OFBZL3o4V3RaWlNaVkNHZjZYNG04UGZBQmpoZ3dIMnJXK2xlN0RJRE9sVUVlSkI2MHArNDZucWQyczZ2IDVhZWVLTHlHNU1nOURRN1VxdHdjQ0VNSFBYNjB0UlBKckxRTFdTWVBZMGtIdjc4ZzcrZlA0QUNRNWFsYjNjNlBtd3NqdGY4QXFDeVggYXdrOTJQWEF2R0ZoOFVxbHFXR3dNaTNaQ2V5SjVDYXF0dkxZSzMzZlYxY1pqL1l6L3dEL0FCQy9BRGsyNDJhU0cxaGtkbUVnNTljNCBmVGl2eVBVNXZuampxc1hrZ0djcm5CRWpLZzFISWgva1dST2NzdTBxY2hoVGNObDIxWFc0NldoMUhjQ1E1Wkp0dzFBcDhaVHo2cnRvIGd3dmxqUGk5VjljdUpDeUxJcmRQUXNYQ1pCZ09OdFU3TVp1VWJvVCs3VmNEL1lOZzgvMWFpdjhBZzU1Y1ZVTlhBMzZxbEhadFlZOVYgcXRzVjZYY2hjdVVlRHNEZzRwL3pYREFPcTdlZU5tR1ltaHE5WjdHYlNmMDl0LzRDL24rbHVwa0NBRzNFa1hLVkF1L05TMnBvL2JHdiA1YklVVjE0OUxocjRlcTF1RVlaTjRhcmFYM3hIWkJneERWaGpOL1d4emY4QWovNmZxZUNsdkxYQTRlcW5Ka2xXRUJWZjVnUFRKaGhNIEs0dVc1VnpaSkJEMmQ4Y0Z0Z1QycUFRVW5oa1ptWkRhRmw1ZDdScE4yTi92K0FEQUJ2d3N6eXF6WVAyTzBxaDF4d2tmQXBnYlBweFUgY0kvZ3NUbHowMk1xMGNZU05DNFJRVjA0enRJL2ZJNTdjY2NseFdqbGJkd3JsSm5LblE3dVUwOWpQS280UGxMWnV6YW5hdTVEWWhpMyBOaGxWTE1JT0RJeUljTjhzQ0h2emczSS9PU2l1TUorRVNIWkhRVUhmKzBXd2JBNXN1djVESFY5bmFYejFieHBpR24zWllWOHc3VWoxIGxEY2oxVDEwZXJiOERyVEl0OGdRN0dCSjVBNVcvSmloUlozenpaejlQMkErZndyb1lCMDJya1h3OEdBdTd0bEFUbE9POE81a2RUREoga3FYWEt2RFg1bHdjRFEvcmFxZVlFUGttMlBuQm1iWkFuc0FBQUFIN0EvSDVtMUxJWU5QcllrMi9WV1NORHU5ZXJlejVPY2pxYkhGaSAzZXJ4WHplRENITStHUDRPK0w0RTNNSjdwaVNKZzNZSlYzL2Yvd0JnQVNSNUpHamQ1SFpJcmtoWkd3dU5DaUdKZ1EzOUtTUkE5OGJsIGxlQ3BHT1BZM0l5ZHQvVWdsRlpaSTJJWVhZckxqNE5BZlBUQzhJZUtzZ0dkWkJzYTI2aWlVekVPU015NWtYVG5FZTNLRVErWHM2MnkgSjYzeEpmclFIZ1RyUEh0QXpJNXZlKzBSOUJBSC93QmdRZmtPeE13TTZBVE1xenVFeFE3SkVrSGc5ZmxyVWZFM0VDZTdQcDhOOCtHaCByOHlkV21Da3F6TUhrbytJM0IvTjBlZjhBK3Z4L29yWDA5bmloK0cxK05kcnlJTlQvTURJYVNZNUdMVjE2eGxjUGFFeE9XNGI1N3JkIDRBYkJuZzF2NkdoMitNQm16YVNqbi9QL0FMQjFKV1E0VTNGcWRiUFpUc01QWFNZdEdJUVBVYXZyMHhOUTY5cTlEaC9NTUdJWmlHbnogWGlsbkE4MUovR2VVTExNYzJOSk9IMEczUUgzNWd3NldaZHpVTEs4alN3eTNDRlNPNzNNYlpqbnhqWGFLN3JQSXJsZ0NCSGpSTWNjNyBkVGxISVl6RjdHcGJ2UHU0N2VQT1hDcmFhalRMcFI3NFRNck9kdS9HVGFQc2t2aVFwc2lkVXJGVjR0a1R0bjFVVEVNd253NTA4ZUIyIGRHR0luR1VidWlETjcvdjUvaitPL3Z4aE1ETkZhQjJyU1hjamhKcVVva3NqQ1l1Yk9JcWJJVXRHWGJRdW4wL2dZY08rR0dEdHpQcTkgOFZiSmVXWllWL1lIai81OTdBSDVCNkpMSVI3QUFwaWVabmg3MUQvVzJ4Z2NBN0JMaG5vcW0wSy84NFlXdzZmRDhIUDRIWXpJellvZSBMTVRlRFFUL0FOajYrd2IvQU5Pd3BSWitlUXRydmRNTjFLZXA5QVh0VUMySElYRzRNOFZzVFFNTWZEY0E5Vm1XUnd3YW9Gd2R4b1pSIFp0Q3J5YXpzbUhnQUMvOEE5ZzZ2ZFFTUnRPaVNZekdlT1YxeStua3RRQWk4ZW1PTUVzWTBlVGZGN0RDdHJCT3hJNU1Zd0JJZ1BkbjMgY3U5MnovNWJvMTE1K2xMUU1ZTGIyZUtiYXQyT3lJQW41bWRYOVpHTFFxOHRZM2RSZURwNGVGTW1KN0lDMDhWZTJ6cGhNWXJsUDN6RSBKOUMvWU5nUDllalRRaDFFRnNDbVF6SGNCTFZSVjQycnJONUlOc2lzb2RqV2d2SG5LNEI3SW4xVkRjRnR2WkFRRmdnVG5EK2w3TUpnIDZ1MlNxL1lBQTU2ZlA5SXhrTDNGbGFOYitTa2l6RWdQcC9Mc2NXeDdCc3BYckhDcjJtMTd0VHc5UE9NUml3eGZHQU8xS1UrcHArRkYgOHBLSXd3SGhqL3k0WTFGdi9QY01jSytCMDlYNHVTeWp3R05EaWpZeW00UXd3ZGVodEVWZXNhWFNhZVlXakJlSHVESk9QcDU1cVc3TSBlZXpkWmt3Zm13ZUZ1Z05nUWYyQVpXYWJibEVtM2c4cVJTZ2VvYTJzaWtpbFpJdnR5Q09NdmtuRmFBSlVsSXY4aUk1TitMdWg0NXI0IDZQTWN1cXhjZ2JsWGRERzJRbXJadXdsOE83RDdDTUZBTHZTSlJQSWZObUJtU3lGOE8xUGxYdm1IK2poUW45Sk43SHYvQU8vOEI2ZkIgaTNGczhoMTdLLzAyeWlUSXcyQmNHb3BnaVF6MTMyYWh0RTFmY05QZFZza3hEc0QyM0d5K05vek56d21UOTZ1ZGtmNi80QSsvQUFDbCB4QjZiN1ZWM1ozVjJwQTB1MnBDSmNnbVY3WDZvK1JXaGV0RDRmdzZyVDZyVC9zaHdFUWJiRzNQdWg5bU9KSVRuQUQ3QnYvN0JBcCtqIGN3R0lXRWtacGgycCt5NjNDTmp3SFEyaFQzUkRzMlVyQjE4eE1RM3d3bnVESnZ6Z3BVZHlaNWFPTXMzbTlqZmtIMlFkZzJBQUxEY24gM1RLaW9heUVod2VMMjFhYys3bjdoV0pQVEhXUkl5UWFSMGphRitlL1RuaU1WWXJIdTVzM2ZBRldRTzRMSXN4dU1OV2EwNTJtOWsxRCB1MXRSQTdWY3hCZXVCRWxLYjVwOURNS2ZjSEpPSCtDcVcwRzBHWVJtWjdxLzlmeWlEN3UrZjMvNkRJMS9wRGJLUkY4U1VuYXBiYXRWIHdaTE5EdzBOUEVvWlFvV0FpNmZJOGsreVRONVZKNUE5ak0raDhaWnZ1eHM1L1Q0QitBQUQvVWRNMUVPQ1JZRXl2bWpKTjMrRytTa1Ygdlo4eGZZVU5EaXU2dlhLR1BEcmtPWW4vQUFIQTRlc0VDMVROelZ5ak52bnYvd0NmSDhEL0FFN0Jkb0lCUkhTYTVLTGRYQWRTMVBrcCBiQU5jVEFreFhQOEFFelRkb01qQXlXUlc1Z1J5RFl3T29ENE9CU3pGZlVZODRIQWlTaysyL3dENy93Q2ZCSjJqTVNyQThNVDdWeU04IFN3Sm5kZXRLOFc1V0p1bEZEeUJZNmpSeHlzWmhNam9qc2lpUzRuN2NieVM1TWZJb1dmSG5wYjFCcDBzUVU0WHhtbEFKc2F4bUttTFcgdU5tRjBka3B1dVdHdWFsVU9lUTNCa1FqQTlibnFSODhqaUJnekVxTUdXcGFITlFldzRzSHRnd01IVENIc0FmS1gzRGdWR3NsVmNQYiBhbnVCYnVhT0pmRmZSRzJSWlZQcDlWbUlscUtENG9URGxMM2haY0gzck1vK2NHT0JFazJEUVBmbndBOC92ejhxMGRvZEUyUWVQYWFiIGFzaFB2aDJiUkpqSnVhT3ZQZFhvY3RFYUU5Z3VCdzB4UTBOOElNbGl3UDRlR3BiMnhDYU9UV3BqZHFTRCtnZ0QvVWs2WmEzWUlmVHIgVUM0azIwNFpwSnNpQjNEbEFrT20xeWtJZHltS3ZtTGQyVW5UOHp1cHNJKzJxQk1kc3hkTmpLZ3RUaFBCL3dCZ1Avc0Q4K1dPVjlTdyBlazAwcm1WWmRMSk5GSVhNTUVVdjFCbDA4ZS9ISnRSc0VYSEh1QmJrRWhFNlF3U0NFb0pvNFVoWnAzM0kxM3RVUUpOTytLWEl1K1NXIHJ0eEE1M093MVEwOU1uaHgyYnB6aExkaFpSZXJ5MW9QbVRXLzhRYk8wVU9MUG9ZK3E1bWpSam1Ca0N5T3l6ZVFCNGpGaG9WN2daVWEgcjlsd1lOL1Ard0RERUJXU3N6S1cyMjVuQzJpbVdUT3RzUGdXYUtmUFYvTFcyaXhuWjhLUXlBY09ubUE1aTBKaXFCSUh1U0RGbDhmTyBNbkVsSjJQWUQzLzBDN0ZmdkVPdENBRVhwdXpuWmJUWWFTN3RGcWFiM2lJNGRwUk9xQkREajBPeUZ0RGh2bG9WWFhMNXNQMFpsMDUrIE1PY0pOZ3orSG45ZytnMDVxZXZvL1lzUG05c2FCRHowbGI1Uk1jSEN6UTh0WGJKUjZZUWZERndJVmtUTjRPZHdMTDJjbWpDMWRtSisgRWR2b0ovREh0RjUrUXlLNjdpczZoNjdwSThIZWlQZEhrMkZYeDNOWUo5dFYxVXhWVFNMU1JWaUFja2JQRDJ5VU1zYUFQYnh4MXVNSSA4ZktTekJUTnZoSnJjQ0JqYWhFY08xR0piNStRcnVwdXQxK1lIcmQ4aG1lSC9Bc0E4cXNuWTFvRjJZTUI0bXpad0FBOStmSDkvUG0yIFpXNkhkeStUY3NVK25NbXpBNjN4ZTdPOEhld1hZMVR1UXNPd1RLZm9kYmNJYS9hbGM2aDhMcEJwN3l6b2ZKaGlPN0cvZGZBWXZ5Qy8gQU4vUHVZSHdQS2oyMUFybGxTVS9EVkZXNm1qV3A4ZW5JY3Q4VTNLdVRDZmNGVlBnZXEyUWdHZUR4RDUwTW55aG9lVVlIU1lUNkNBUCAyNi9lQVA4QVVDMlZQSmJWdXR4N1FCc2lwWExqWmE2RlVQOEFMMkpvZDZsRjJRUWhvYjRZL01ENU9zdFBRNTI1dlBLR1czK0U5cnQvIDdSQUY4Ky9iQWZNekpsRzBBUkhqZFNyaGZVZVExaEhJd2J1ejdnclVNQ0NNV3lOUUt5cTBNd3QwcmovQ1NMODBidjhBMjhmTmpwUHIgYXZIbEw2cWtaVTFrVDdMTUtTOHIyRUJ0aFRjTDVLQ2JIbExmSkVQVEduek9YdzdHNCsycXBpczJhbXI0d3N3R0U5bmpZQUg3QUEzKyA0RWM1cDZQTDVKWG4xN2JTcTd1RGJMWUpqVTBKRnFJYlJwbFF5ajR3Vlc0T0RKdkE5UGVNYlFxYXh1TTJZK0ZHWm04M3Ztd2IrQS9yIDdxb3NOOGRIZFRKV0RkT0VhMUVPeldTc21peUNXNzFYRlBYSVVQVEU4TytQa3g4WEhDNEVnRGdlQnA1UDJLREJpT0VDV2phaUNBMkEgQS9BQUhWaE11MkZPeGltZFpkUVRXMVBEYmxadDhCMlMyR0grSmFMWVJTeG56K0c5d0R6RSsxQ0g1YVlKK21UdEFzdm1EeThuT0UzWiBwemZnQjhBQVBud0Q4ZlVzZHVqQnFTSzhJbVNKNDJ5eHZjUjBNWnJBWTdVY1BrNVo5dU5Sc1BWczRibUNsbDRrRVlzT2lQOEFibmFsIGpSOW80TmRCNUJmbXBEQWViVDJjN09FNnE5cFJocnRJRTRQa1VTcmk0YmdIZkRGd1VuTStIWEorZStJOHpja1BqT0dPeUJFZkUrZzggK2ZnQUIrNjNHREF1dm84T2xpaTNHYWpORDF1N3lHck9ZTm1sSGhOOEM4TFA0MitXUzRJYmcrSExMWDU0TjhHY0R0RVl6bkFuZytBbiAxOUI0Qy9QM1NIVHlFaDN1QlAwdDl6bEprc3h3QzhIUEdLdmJPNklGM0dBS2ZJZHlERkRYeERJVnZRSjRlQlZSSDVRVjdNZUtyN1hPIDJ3ZTNQK2ZXNzAvcTd1eEw0dm42ZnJCRDM4ZVBCNjNYbGVwYk90amVKVVhUZytIc2JRWk5RbGJza3lrN2d3T0hrKytPTnJOWnE5eVAgTHp2WVFJY3dmcmQyQUFnK2Zjc2pSOENWOHpXY2FrUnlSMVdPNHRQN3VjZWZJWS82VUltREZDeU1pdXlKTkcyY2NtT0FKVTB2aXhZNSBxL1BTeUhNaFlxdUp6QkIwMUViU090Q2V1c3oyNEQ3eXpNbWFRZERnL0xuenN4bkJNNlM0R2xodWxDODBPU1loT2JuQkJjd2hQekdWIFhCK2xUUGd6QmpPb3R2cyswS0tJeGE5czZxWEd4Mm9ZTGg0WU1DdFk5YVUvNnN0Y2pZNW9sTEhIZ2RvdFMwNWx5a1pQRmc4MFlYbksgYTdBR3AwbFZTUVBwWndTZ09mRzNPbGhZS0hvNjF2SE1lZzByb2ZaeWo0cmtwb1UxQ3dicm9OeVk4bWxKb2tjbWp3YXVoZGZCcjRIUiA2WUJsVzBvQmxNWUZKcmRvczV0MHlvOHl5T0VPQjU5MDRZdEh2TVd6RmtCNzRJTGRqUGxQMFBZeklzckt1MGR6SGlyZ2dSSFB2d0EvIHNDQ2cwSDF2UjZycU5TSHZlVmF0d1ZkTVYzWTNFcmUxTENhRWkxSzV0cEljbk53WURGVnpLZnF0RHErWkJ1bnpuSjdmcHRvMDlMSUkgSUVTUVo5QmZqNERnTlJleTJGMzVtWlRBTkZ1V205U3RRRFhzZFRyZk9RN1FiTGdyQTlzS2FIY0lka1dRK1BreHdoNzh3QVdvd2pNMSBvRkdiZkRkWEpLT0FxTFlVRkNBSHdIWFlMekw4bnd6Q3ZQemdnMURtQkdHNkJyVXdOaGkwTGtTQllxYW5wL0c2M3RRd244cWJWOXRhIFdRV3MzSnB6Umlid2I1c2o5M2ZvUFBqK0ora2ttVkFrVVUybjdJNVloTEhoSERJZTFOaENUMlJScWtlR1E5b2JMdW9Qa2xqZGl6dW0gb0x1enlCSHJ6amlEd2FxbUFQenlhNDUyenlBdUxoa0xqSWRIUGRPRWlKYVN0MmFJVTIvQ201VXBObWZEZkxycFNZM3ArT0I2cjBOViBUeVpOOUtNMkx5NnBMc0RQK3lFQS9yN3FmdkJidVE5WWlmS2FLTkNVRG01eWtwMXUxRWlFUmFBdENRTHRxazErSDIzY0E2R3ZiNHBPIEU5SFhHWjVhS3ZGckowMjdVbWNQbno0QUJ2NEVBQVROeXhOUUZTdGtKY2R6MnF1WmFBMlNwby9HdzZQTUF4WllGeW1FR1V3dDhQRDcgeThLUThDRGhsR1pES2NaLy93QUI5KzgrYldwWGF2RnMyNXJRQW5wTmJtVWthNzVHZFJvL1RndHhTZ2lwZG5ZSEF4NGVHbnJlRGEzZyBUamgyelYyZ1piNXpoSVRZSDIzZVBvUGdPanZVVHg0elFwR3NrSXRWNXZjeDhoZ1kyd0NnOThiZVNSanprQ1lxQzhUdjJZaVNPUTI2IHljQmtaYTdNYUZHem5maGNlN3NoMkJJMU4zb00wNTNUa29GZWxBNmtwdEUwQ254SWFzVXNLTFY4d2V5UTNBT3RtUG1WeWgyQlBWb1kgemxEUnlaSWR0a0JuL3dENEErWUw3SXB0RmZnWjVTd2xJUTBPRm9zTWREdmdnVzJ0b0twbFhyZkFwbFB2dEpoeUh3UURnZXNiYytMdCBDTThuRGZhN2dSOC9VV3dIOWc2Y0ZpVSt5dmtkODFhUmU1RGhxTXNpdGxNaG5PR2crWStPVmNwQ0hhRU1ldHcwL1VKY0lkZ01JNkduIGdLcmhjWkYwNVVDTWN0R3JrbDRBSDhINCtBUDcvZ2g2bm92VGZsYVQyU2U1TlZYSko2RzIzSFU4TVAybmNYS1ZiR3dyYSs0R0ROVlcgcE1IUXUwdmFSSEQ4WmFCWk1uYW51RXh4QVAyd2U0QUIwbEhpaVNNYU9aSXRPN3JER3JRN3RUbmd4Z21TUHh4YmVEWTdSUnRyeFR0TCBLMnBoM3BuUTZ4aHV6UmJlbmJHc3RwMXVRVVJKR2J3NHBpR0o2aGhZOWJ5clloeFEyY3BhaElBZC93RERvVmdPNzRNaXNLdlVyZ1BoIHcxdXlGdFBjSVlQOUp5M3RuRjdNUm5qdWpTZS8vUWVmYkNmQVJEcEpmRnpWSWVYTlJsZStaWkxRczV3SkRhM0xZeWsydkFNV0d3VEQgUGF1SDVscTdmSWZ3eVl3b3NlY044Sk9mNUlPd2ROU1pYK245U0lMZVZaYTQyekRJRlMrUVNzNlBiQmc4TDFDWUpzTmhmRTk4TWZNcyBDV3FvYWVlbkIwWVlVM01ZOEpJVERmOEFZUDhBTUIxWHNmVmRQckY4Y2NzdkpOMlFoekxzaVNWdXdoOHRrVm5LWFhMNU5YNWpneVZzIHQzWlY2MmpnWENCQjNOR0tER1pHQjc1c2ZnTmczOEI3TUVTbHAyRW52aFp5Z2ptS1E3ZVBySWtTUyt6UGxXS1prOE1NVDB1MmRJSTAgWHNobWp4RzVFS3lJditSNDd2QWUyK2ZOV0xZUU5ncSsxYS9hdTFUVWNHMTh5dHJESDA2NXkrcDJSdWp2eGRrVDRlQ2VoMnFIWHc2ciBoWUZEZ3pGWk16UnpqWk5rNFJ6NEFmQWJCaUI2c2hWNXlPa1ByNVdtVWVTUnR3WHhxSG9mVWhTVjVMNWFxMWZhVHdzTzRCekV6amQyIE9CaWQ5dFZjRm5pNHV6Tmp4Tjg0MzkrOW43RkI3dkNxTzJMRjhXeHAxVGF2MHgxTHlSUGsyeFU1SWt3TmxiL0Yxak9XRDRRbVZ2RE0gQnc1QVBYQ2xjQ0dENU1zbExRUm1ibXU5blQ0QkJmZ0NEc0IvcFA2MUZPMUZkb2ZNMHp4TE9GMWliS3NCaW40NlFubEUxVHErS1pjTiA0VC81d2dZL240RmpUQm4xZmszaEFoeCtBSHo0RFlQUDVkUWtXc25oMEw2ZmNUVDdPc2VtR21rRTZTeFM2YURhK3BpRTRsMnBvOVVtIFoyNG5NRDRUU1NSdzZ0TTMwa0Uyb2ptaER5NWFSb1NZbUx3Tlc5TXJ5d3krbXRKZ1FpN2hacks0anF5RU5QdkM2U29JV0J6bjlWVjcgc2QyeHdRMXNoMkhUYTVzSjhLTGRYMm85aDRhMjRMNmYvd0NuODlPVDJZWVVReGF5RENZbS92M3Q1OSt4NnFLdjFmWW0xamNvWFh2SiBkSTJjRVUzQzJvYnhFc2dXNVJCWjU4SHpBNWhiTUdHQjgyR3IyMUgremJvak0yK2U3d2ZBYy84QTJEcUJydS9aYjRZUEhvdHdMZGtTIHF4Q0wxSDV4NTRTRnV4bkxzMTIzWVhCYlc2M21iZ3Q3Q3ZnWGhrSmpCZnVUODMrd2Z2Mi84OUpMQTFVQTVNeUhWVmVvYnM0V1Vxa3UgNENlQmFQWVhWOWhBU2hnZXQ0MlJ3OURIMXU4WUVHMkR1Yk1yaTdNckw2VHNYOWdRZkFkT2lidWMxamVLcVNkVThhb3Q0Q1YvN3pVbiBKeWt4VGRvVW5aMGttRUtvdDlsTFpsYmJlUlpIeExtR09LR0M0MnhBRVpZN1ZFQm16Tlp2aW1HWkVOaitacWltR1JzblRoWkdjWGVDIHhqUytWdTZrU2djZW5zaGlrM3pjRnUxZkF0UWNtc2k3UFdCZlpPazZ1QjcvQUw5aWZmdC82c2hWOGd4WUpXeUF6RzRMZWNrQWtCM2UgQTk1RDVkYnVYSGoyenIvQTZmZkxJVDJEZk9ZTnV6dkxQeWhaMlB1anFIUjM3dEZzRy9zSElOMGZQT0huUlBwdTM3K0pJY1d5UWpBdyBKSzJRaWNveHFoOHNhWlh4ZUhUOFJ3bDE4SHJtdGRKOXROVDNnek5BdGFKbk9FaEViNkNBQUh6Ni93QkJNTmtwZDNzUXdMU0szcmVaIGFwOWtpTkZoVEsvbDg4cEdzZ0t1aHA3SUdmQTc0SFQ0ZHFRSy9iWndhekdaOFYzbmZBbFhKUno4UkFUNEFBZzlSdHRXREJvMWxqalIgSnQyR0lWUjdETHRMSHMzM1loaE5tUVIyNG5JVVZxTENGTmw1SUdnQ1VoM0JFa29qTjNlZThBRzR4S1pVYzZXQk9PandwSTU3RmNjTCBqbVdXZVNlTDJvbjJRVzNXSzdpN2taQjhOeDRmTTIvQ0NCSHZpT3RyQlBpNnlNNXM3WWd6NER1NmYzOCtBd21KaTJLYmRoRnBGa2FrIEpqR3RraXc5UFQxZEltVmZkenZhQjc2M2c0TW5KQ0h6bTBlMmcyVERheGF6Wm14bXpid0EzL3o2RDU5eTJwRFc0RWRFc1VvWXFYVGUgaHV0MXU5WHBLcTAzeGpZejNRMkFLYVJXcGlmZkZjT0pENENuV0VCcXJkbldWaTQyWW1jQzRiNEFRV0FBZ0FHQkFma0tvQWV4Q0I1VCBELzRRZGJ4VXM1YlV5RXl0OXFaR2dYVTU1WFR5SHpMVTA5L2NPVk5wQ3BZSzJNdC9hOXpCNzQ3YytRa0Uvc0RBZlFjZGNUR0pKVEVkIE9YTXo3dXFrY1lSZ1k0cTYxN0pMYkpMN3lvN2x4NlUrYk9HbGpkMEgwODZiWGZJWXpNa1VwRWRpOXJkUmljdVNRT1BQVHN6Szd1eTcgbXlrM0tCY3kzeEtnVWt0SXNrOFkyY0RZMWhTbWg5SDF1aHVCaHdoV0RNVlorb0NlOHNuQmtPMENleHBLVGFJUFlINCtBQWJCeURKZyArczRENWFpdUJRM1pWdEJETjFPUWgwL0l0aWsvNXM2TERWL0RjSENaTWNMQTV4eUFDRHRUYzZhNE1pbkRic0U1OS8xQUgrcGkwSENHIFV2UVBZS3VuWFpjMVZVL0dpTUFFTzhObFZ0RmNGcXZGMlFRVDNER3gzQ1p5KzRxSHErNlVkUFp2OVRNVWMzOTQ1OXdIMzJEcEE1dHkgTGE1cVl5YlFWeG8zTzRSSmQyQlZBMC9aMHc4ZVhvdDNXUXdKOHlxMlN5SWhHWmFrQlBnVG1UazNlVVozVXE2MGF1T2NCUDdCejdmKyBscXF4S2dSRXdSQTZpTmJkOStXU1VoWkxHL3QyRkp3anhzR2puUzA3YmhOanZrckovTjRrVnh4K1Q4OVJzZGJTN2ZtUTN5dmFmc2lZIGVBeVd3d3lNa2l3bHROQWxZcXUrRUliNWdIaHpFK0g3Nzg4VEhsbUZxN05zZnQvc0VBQVAvUWVyRXJVejhicmxJNXRCSUxJWWNWSlQgUjZ4djZ2OEFVSmdtbmxJb2htRys0QkRJeHJiZS93Q0VFRFo5dEtxMWlqbEVQSDNTUWdWSVlFSGtEOGU1NmdMNlVlT1lKRmYweXVBWCBlL1FGWDIxYUltd0p1U1BFOHlRM2REVjFzZk1UNGEydHZoQVBjVUN2NTlqUGl5TTVSdWJ4Vnh1clhoQisrbno5UlAzUjRVck4wdFVnIGVpc2VjeWFlN0dzaFNiRjhrU01MMHl1UUlqVVpGdFFlK01nZmtsYnI3STFBU0FIQU9NWnlndEdXZDdTWGJEZjM3REFCK3dnanFGSVMgSjBUTmlydExudjhBQzI3cnRydDU4YjJtdC9FZnFuclFkd1YzSVB0YkNQSEdSYXlBN2ozeDJOdVQ3Y2oybStqWVdMdlROekVPMnNySiBmeHBRT2dTdWVUQjZRbmxGZFRmTUJCQ1lubUE3aUhJQjY1N2YxTll6aHdaOFYza1orcHZZS2lmL0FLRHNIWEcwRktUZDloRmxMRHNpIG1hMHJlbkxDc2hrUE5EdkN0cmFUelFZN3FJYmhwTFpkSlkvK3d6cGpNeXE5WDIrekF3WnMyRHg3dW9QZ0QrL3Brd1FhNjBNYWFZR3QgeW4zOHhTMlRKczFnSk9EUlp0d1dOOFRkSHdlbjkxRS9qYkJXL0xXSG5BZFpXVVBEakdHeWQ4TWUvbS84K0FjQllWWnBmbytaTXNHZyBvZW9lbjY1enJzeGtMYXE4S2I1S2FGNDg1UXlIdzYzN3FJZFhtS2RBc0g4bWpYaytDM25ZM1kyazJvZUFIK2ZId0d3SHlaNU84a1k1IFkrampFKzVWZjFIaGxpR1B4dE05NWQ5VXRyUlk3Sjg3VHMrNy93QXZaeDR4K2QzUHprTUFsOTJYYmdPSHFrdW10NysxU2J3azJRazEgaVNySWhlVDRYK0hYS3RacjI0c3A4eGl5T0NlaGtaazdjQUx4dFpOOGFPVEk0Uko4QS9JUDRpUDRzSFMzaDJRSE1yOE5JRjdJN2JhRSByS1FZSkVMTlJBTVZJb2R5US9oekxVTWFoR1JnNHJBSGdiR0RqRVlvcjNsV1d5Ykk4YkEvSDhIN1lENS9xczI0Yk8wcm9LbEMweGVuIFVNQ0Y2akpkVUxXclpLdUd1MDR0VHJSWktjd3VieXlQeXdZeFQ5akhlckVENjYzSUxBMzBqTVBVN0l2cjlmcFBIOGEvUWdPR0xXSUogZXBEK0E4a0xUVlIyUS84QWg5a2lWc1I2WmNGZmg3NCtWbEZmTElYNGVwRGVFT3QyRndhcnBvK0JlRVBrd3NYdG1IQ1FtLzI3OSt3WCAwQkI2aXpUQ1dVTkFnUnBrMkdSNVJsQkplMlhXVjVya1VLY25VcnVXQVFNUjBtUkl5eUpFMlR4YlRUTFZkNm4zM1pyZE44YzRCUExYIHc1c3RMS1dXdGpXMWpUOS96V1J0WVI1S3dvOFJEY3F2bHE2dWhyOWJoOVNDR1pRK0g5eTA5OHY3YzJaOHJDb0ViQUhzbXdJUDlBZ1AgWS9TMFBJRnJaaHFiVmV3bTJuendHMm5jZW44ZkVtQmZIbkk4K2p6QzJZbVRFTzhHU0RQSG5qaGdtekZCYk1zZzdSd0NIUDcrQSsvQSBHMHZtWGl1Vk1EYUduTnc3bldXTk4wai9BSUtTUGlDRU1vdkZIeW4rTnpEQWR4cmR4RE5UYmVFKzRrTkdKNHE3TVQvS0p2OEFFV3diIDl6NUJmZDNlU283R3FjT0x1bXNmbU9XU05YdDQ1UVdmR2hEWG53V2g4RG1jd21CMS9HeGdMZWUxRnVIZDlvVitjOEpkalNPZm9NK2YgMkRZRDRCYU1Rc2dZdTZGOXVKMGpzNFJFVXJMbHdSbnh6emRmSFRwUkhKTEVWazJuVkFqcHRSVUtxaVRFa04zYmU0TlZjRVdiQ1dqTCBSenl2VDlyVjh5cElKY2hrbE90NFpoUFhwams1THprTGZPTnVFelVJaHc5bjRrdjFwT01NL1BMa1psbDQzdll2YW90aDJCQlBuMm9jIHVCZ1RlN1ZTZ2FaU1hhS2swbXcvNHlUWURDWUZ5b2hTa1dSZzB4ekhGRDFDSitLZXF0cWdCMmZFWHRieU1CMG1iN1ZnQUdJRDh1b0ogL3FIQnA3WUdtVkxiVlhvZFN3MXk4aVR2SHNpak5ON0MreFJkWldoVjgwaFc0Y3dZbUxkZjJvamdhL1E0SWZjeGREakdjNGIzemdQLyBBTUFmVlVTM0tBUjVhVW0yVW5LTHRZV2NrUkVld1FGYjRtSkwzcFFzZm1DL1ZaZDhyaXVKWTZKWE5sSjlsMVloakdWWDA2V1d5bmFUIFNIYllBRnVZQVFCOC9VUUFvNHFNWWtkSkt0VXdraWUzYkVxakNPUjZ5SU5FMVdKb056VnpTUnRhT0JCbE1DVFVzdHh2UmtlbzRtL2kgS3JRSkdlNXdSaWJCRmN4bUhrczlQWEtUako1UlY1RFg2VG5PRERNZkdoaEt4VU1nR2ZJWWhiTUw0ZFZiV0NlRG1jWks3bmdEcTdlMCBmZ0lBKy9Id0hUNEhNR251MEdoRHFXQmN4dWpSY083T1AxdllOc0ZrOThUYVIwbGxGc2d0OGtoMnBDM2lmVXQ0QWRXL2N4NVE5czJPIHJrazJjNEMvVzdzREFBMkIvV295UXpOWHpMNEtJZEZhbkxCdWFOTXZoVnRPajJFUDhYU0lVNEh3TkRwOThwT0c0R0s1ck93SjlqWUQgSGtvMEM3TU9BKzZPTDlpaGUvZ04vckhkQXRnVjJ5cXlhR0hXMG13YmdOcWFmUnVTM3J5ZVV0QjNjajM0cmNPU01pMndMYXEyMS9kTCBVeW9yT0wrakJBZ1JKQmdINm91QXZ3RHdDbG1pbWt0RHFDOGU3TXN6eDcxNUdNbE4zSk53ZG81eFhHeHdiNFpoTHBsV1U3TWtJMllaIFVidWtIQkNzNC9wWDNVTzdPaUFSWGRQRVpsSVdXK0htaDhtWVVEZDFNcVRZUUE2cnEvdGp0eWV0ZE5WNFpCYkRzamduclpEbkg4VUYgdEhKdlkxRHE5WkdmNld2QjhBZ3I0QUFBMy9vOGJERm1WNlByR3hvcGhBY0h4UDB1cVpqSkRoOFZ0b1RaWit1bkJnMDloNnJ2aXR3OSBnVnMxQWJnQTF6Wkh1MFBqTXpITzZKdllBQUFCNS9nT0NxdFJYc1J5Wkdxd1dPcTRxUmxCd2hhTm5IekZtOTdwU21Mcmw4N1B6QTdJIEhmTGdXN1VzdXYyMjFKbUxNTDJ3bWMrN3ZISU9RWW9MOGY2Q25XUk1VbzRldm1pbWEzN3F3K1EyQUhQVitXZk1UekNydVJpdjlOK04gYnc2M01MOWNVRC85dkRzNVA2eXl2R0xzY2VFRkJBZmZ2QWRHWTJFa1kxS3BxRWpoT25xVk1KSDA3WTNHMDBEUXl1YVVjek5OamR4aSBQSjgxYnpMa1lodDVQSEppRDJMSkZsZ3lKUXhyTnJGbStPUlhNdlpkVzVOcUhoelcvb3VoMkV3eUZGT3d6aEdwc1ZZa0N4bGpLbXJZIDQ1aWl3NTEzTFpSNVpVeXVaUmlWWHFxeWVoMWYxSWhCVi9WbEloOEtuUlF0ZkpPZEtkL3RTOW1FbUtESmVRK0lRaXQxMFZXV2ZBSHAgRnNFMlV3WFZNTTdMTHNGbE1jZ08zRmo5Z3pKMHZPaUZNbzRVaWtVZ1FQQlZibGdGa1loRGw4Ym5WeHBxQ2lGQi9hTUtGVndoaWdLeCB4TFNZeG91WnBFRktPZkgrL1Z2SnVPem5YUUF1eFk4M3lTQ2ZERDkvSDUvUFZqZFB1cSswTk90bHF0NUxrMUJzMW9tRGRSMGRxcmgzIGJiSU9qSWF1S2lZR1dURzRJa0tuL3dDZkhhaHdqSXkyWldIcFJ4bVBweHdCNCtrRmhqaHlCZnQ2ZkJ2R2t5czFoS3JtMzlLVWMrck4gWnErTEhUblJZc0tWUTlzaUQyQWZIZ2xXRjFzdVFEZXF5MENtRGtTeThNYWFXdlU4T3U5ZW1vUUM5VUIzSC9tQXNNUnB2bVpjOXgwMCBybXBiY2oxU2dZeGF2MlVQaXZRNjVmS25pckg1NHJkd1F3NWpqWnYrRit0TjRHRE9VRXlZUDhKbzc5L1FOQjFGNERqb3VSWkZ5ajlRIFo2ZXQyM2FqUjNJTFkyMU1JcjNLSlc2YWZWdTBIQ3lMSXRSOC9KRmMxb243NHlNMVovaUFuelkya25GOCtBQWMvUDhBVFdNVWNoakUgc3dlTjlLemdMdFh1N3VKYnVmY2tPSnprN2N1M3RIUUFNeVFsc0JuOVJXRDUxc2JBTjlxMWx1QWo4Vjgzd1ZSOHc0aDBmcExZNHFmVyA1NHpZWHhCNlRlVlgzeXRQbGpGbWdDeWR5TjRaRUl4OXFBM2hTMkljbldiNFVlYk1CaE9FdkhhSStmWUg1KzZEN29JT0RISFc3RzFmIERTUTIzM3kya2kwSWQ4RDY5bG5nTlpDM3h3WDF0bGZIQlBaSENaYWg2bjN5ai84QVM4WFVBd0hhSU0zVllCQ2Y4RDRESHoralRZSnMgdWRaaExPMHk2Y0ZGWnpTU0RZRE9uVUVrTVNFS3NiK0hWZ1JIK3FiZXA3NGQyN3gzTUkxUER1MFhaZUZ4dk8rZStJUmZyOUFYMzlDeCBQYkMyOHZMcGQzUTFWaW5rcTNhZ09UVjFzYVg2OVZaRlQ5a2E2YkUwQXR1RXl0M3dPbjRMNkcxSWRvVXM4VEJsbVBsb2VjM3QyNER5IERzR2YyRFlBQ3lSTkVzN09IQ0dOWWdzVnhva3NzcXh4YWRKNTRua1RleG1XVUhDb3lwT2JBTTI0cEVtS0IzUVRIR1Zsemplb29JejkgVTJRdXRvR1Bqakp4OXRuU1lSN2NyU2h3K24yb0hXVGVXZ0J3ZjRoRUM0VnVwektiK1dMaXZoQndzaHdUekNlUVc4S2x2RC9jeXYzeSBabmplMGdHZzhCUVVIcEQ2ZndaanVZeUxsRGdiYWUyaXZRZ202Smk1R3IzaHNvVEVQTVpDeU82a05rN2dHTVcwZVA1SVR3ZkxRV2VEIGhMc1NkZ0FBUDdCdjZ3VjdZT2FlS25zbXBaV1RXOTQ2ZURvMFM4V0VIL0tnRzJoSlN1VVBnZGJoN3MrWnN6VUJjRkpxMng1NHZXZSsgQk43QmdBQiszZGczL24xaGJVZk5VR2FER3ZuTnF1V3pPSHl4N3RaQWV3ZzZiWElta2RuSHczRFN1SE1VK3dlZkhub01NWVRGcTVONSBCZHIzWTQvYkIrcjkxTk45VEltcUw2V05OTXJ2bE1oOUNmYng5VjVjZlNrZXpsRGpKdEVEMUpNKzBKaEV1eTZ6WE1tQWRjUDRaSmZjIGw1ZCtPQTU3UzErQjhyRytRYTNiOGRQbm9kUHFXa3RESlZJcDJRZWZHQXM0TkVWc2xGS3JZTElxdXlBN0tua01MVWdPRjhUbVFYd04gV1ovNzI4Zi9BSnVuMzdZSEIzUGNMNFg4bk5zYXQwQURQTVNZZ2RKaGgyd3hFZkJNcDhXNi9jT0h3dzRjY3lUaittK2VxcDQwWlY2dSBUSnZIQ2VEK2ZmZ0hnT2tiWDlzVzRMcHVqYU0wKzFXYlQwZlVVMnU1RFdNTnFjc250RmM3V0JwL3R1SFk2VFpDN0IzVVVrRCtISjgzIE81UGNuNFFKdjc4ZzhmMkEvd0JNM05JdzF4UEl3QU4vYVhjOERYRmIwbFB5TndsQ01UMWU3OHlNSDBLck9SNFJMRnRrZFBzYXgyZG0gczlZeEtZR2phVURRSDE5UGdNY1YvRG9JR2RZb1k0RTFNU1I3a01NMHMwcnUrek0wVFNTUE8wc2tqdmdyTXpTOFdCWDNHNVFyeVNTaCBvUzdKRTc3QXhUdXlBQVN6aFZIbXpsK0JYUUkrSE5QOXFrYVM3UVVPN01nYkpDYWUzaTdNbVFrUXdKNXNLQVpoRGtrTU8rUGpBdDdDIHdnZjZaVnhpeVQyVDIyQ29rQStnOEI2dkkwSzYvbXNCNi9Rc3orRjREbmNoMjNKMUlkcWluSVdob21WK2htUTlicmUvdUU0Q25ubmggazNOOEtMT1BDUWh6OHZIajdCc0Q4Z2RVVlYyVmZzS1pEWEQwTkF6ckJHM1pMdEJxcXVSenc5eUZYaXpHOVA0M0RtUStOOEQ0R2p3eCBneFhGc3pNRENHLzkvTDU5KzkzNSs3QjdZWXpYQlZkekszR2RzMkd0eEZjYXRzRnNHS2xPaWJHaXNqQVltUXc5a1RONGdudm84eG00IEhWN01UNFVrbS8zOEFmUCtBd0xUUXl5bUhQVU9VamhiS1QrMGh1UjNIalJrT1NaWjM1Tlk0bnpsd3lhYU5tbElnU045UnVZeDZVL1QgeGpJclpxcE9WNHJ4Wko4ZFREeFE5VVY4dnJhNVM2VGV0a1htQXEyelZmVlFOcjhTdGdaU1JjZ3VIWDVpbjRhSE1ocDVnNDIxK2VlSCAwWVRmRmNZOG5PYkpQYUkvc0I5KzRFdjlQTFU1TXF2dlExTG9HNWtGa1Z6QXk3bGUrTlNGUHJ4Y0RLS3l5a3dlNHJmZUI4VHlESThXIFg5cXA0WU1GcTZ3cythcTdmejU5K0FIMzdwRHJGTGc4YjdWV2lwUnEzWDFxVlcycVovQXhrTmpJQjFRRmpyNXlDSXVQbkpKbThJL2IgNkFFRU15eVZhQmd6NlNrN0FBeFFUK0lEZ1BSN1g5UjEvcDlyT3dqVmZPQTE4c0YyN3h2R2ZYdW9HSmFrcjRsb1dOTUlKNWluNnIyZSByMFA4NFQ1MEtzeWRvQy9hMUFqdGp3RStnZmlKK2ZqNEFqTnU2cVNSWmtaRlE1TmVjNnp6MDBrRS9qbUdOZFBLa245VGZjWUp0WElzIHQvZG80blYxemNTTkdGeDA3SWhBUm9EWjh5R2VOeFhhWWtibkxGZUtHd1NJQmlaQVVxeFFHcDN5WXNPdHpHZGcyUTdRVEs5cVhVWlYgYS9EcE5ERHNySXdPRFcyOERhakJOR1EyZ1lUM3ZIWXVBNy9qL2tBTmN1MkxZc1pnWk1NcW9LQnIxeXNKa2wxK3lUYS9ySXdMbFdiWSAwV2sxOWJjTk42MjRQaS9zWUZQbnFxR3MyWUxLREJtOTFjYmVBQjlCQUh6L0FJQmdFREJTUFBRcTl1bXBhcnJjdUI1dDJQemhyQXZYIFlobisvQUdhNFE3SU1PQmg4WUpsamJlMm84eFp2Sm9xK3MzbmhDU2IrZ24vQUdQb0w4ZjYzV0JJY0dPMkdyTjFEbUl5U3htRnNUZ3EgaHc5VGg0dFlXRktzYVl3QjF2dVF5cDdnNFlrQ0ZsaEE2eVRWN1Fzd1ozUjJUZjhBNzl3RkJBUDNTM0NMZ2ttWjMwVjRFU1dVYnY4QSB6QyttZ2RKWm80c2tEU0tIMnN4YWpjRmlob05pOU9zeXhTSlh0czJyWGZOMGVLSHp6ejFwUXlDVzBWbmNGWGk5SzlPSHE1TVdqcDdNIDNDZWpzUmhwdTVlVFpUZ25za3laVDdKY0ZmMVpYSkMwRHlxaEUxbFhLUEx6c251Y0FBUHYyRy83L01YSnl6VGNsWjBCdHFzYllRdUUgTnMycDZPaDJlV3VDa2JhVS9pMlFudmkzY0hBdzQrdDNoOFh6MU8zQXNyTzFzMng3SGFYNm9Qbi9BTi9XMitXUUJCOFJudUZ4cEtSVyA0MFF2bUQ1RDVoUThKQXhXUndoVldZaFF6SEpIaWV3QVozSjBiaS9nemVPK2VmOEFBYitmNk1UQzJ5YTNMUU1WSktEdjkyWDdjM2NLIDBiQ3NJZVdXMDBvdzdDdGZNUTNCd2NLM1lKbE9uaDlMZU03WDhHWnRsNFRod0hmMEUrZlBnT2pjdnVCSFY0NFY4RjVkM0RMR3lCZ2cgNTR2a1dRUDJlZ1pyV1I0M3kxTFkxa0xqZjg1cFl5SXVsN2g1STU4OUx5b05iZXFkSnJDNU5IRkkwbU9vMFBjbU5KViswdXhpTGlUdyBzMW9CN2hNZmJJbTJQZGJpdHphMkhhbHE0aDREQ2FFVTV6VndNTHoxZ3FJOEF4UDRZbnJwdW1XeTJDMEdFaXdXU1NlbjZVVW0rZFFGIC9MZFB1NjFGS2FiMDIwQzVBeGFnZFBmVTlnN1ZuaytBRU1EQ2F1aHJLenZadEozOUIvcjQvdjhBMVV1L0pHb3kxQ0NyWmI0R0dnV2kgdmdsVHg4N1VVai9NUXhkaEFrNWIrSlc2RytURU54VzFXQjhDcStkY25GNERON0I3SHY4QXNBRDI2MHo1RkY1WEQ1NmtrdXRlcS9iWiBJVjFVRFc3WTRucFM5cU1RMlQ1a3pVaGRsd2Z6aHpBaFpad3hXWk5vNHlqZmRrallBQURmdjM4K3RGU05ZNUVPM3VXenMvZG5KMkZuIG1tNHE4aGd1QnFtTm5wc1RiN09zdktMTXNHMmFTUUlEY1FkUU8zYmtWSEZrNWhTdmJXWFRncU8ySTljcmNPS0JKS0tlVXJ4U3B5T04gckd5WWpoekt2YmFsTGV6ekUvVGZNdFJoY0hnRG8vOEFuZHpTWlBjM25zbC9YM2dFSHdDRDFNV1FIamxCZVNydTdVdDM5QWZCcnVZciAxMkh5K2VXZ2pnVmRrWDF2amFmTU1rTUxHbjdET2NTZmkzbG1SN1J4dzJEdEVBdDFCQWVBU1YwV0JEbnFZZXVVMm52OEZvVzM0c1FoIDJjWVNFTThVZDdHcHQ5NGZEbWFlN1RoOEVOd0tQbnpwYk55ZkY1WmZ1d1JIQWIrQVgrUVk3K2J4OVRibzVMN2drQnF4MDM1d2FuOVMgRm15RnVnVWVobHVXVWlXTTBKN2hEY0Z1SFQ4T3dIeXVYelRmc2NQeGJRVTkwcXJyc2VFRS9qL3NFQWcxaHR5SVN1YWM1TmVJU2l0YyBjNVpXZmtWajgzeEhjU3FWZDhhS2ttaXhFZTNETEk5Q3J3elVWWXlKdXhkQWtwK0hkakdqMkVCdjNVSXlmNFFHU1dxNVVKSzVaUHVUIHNpTHVTazJDK1BEMG50eTNPYlIvbUNiTStJZmc5a045b3ZzQURnSURZRVBSYlJjanZWOWZhWkZmVmMycDFRSk1ac2NBTDVIWHEzdVMgcFd3WFk0ZGdXNGJocWNlekMrWWdxWEVvS2U4N1h6a21EQ1Zja28rd0FENER3RDkwYXBjeXdMQVg3YWpaVkQ2a0FOeWFld2xET0RnNCBMOTNVT3JnVWpSdlhLZlg1aGt4WkE3Z1FYUDhBMUlhZDVzeFpadTZDeXNITFJOLzcrUDhBOS9ZR1RWYkFQWXptclRzanF1ZHFscXBWIDFJS2JBbm1LWHRpWW15bDNtVmIyaStNbHFVL1Q0ZmpZT3lxL24wZXR2S3krZjNzMysvZ0QvZ01jZXJmNmVXMWFDSCs3Nm1IVmFlRlYgcU9MVmlWSXV3V2EyTjBNM25jc0RzcXl4RmVORnA1Wk4ySXhUTVpPL1VRSEhGbmNxZmRiRURFNGkrV0I2cG1EdjFIREQ5UldhWnRSMiBmRWV2S3VZWGkybXBYWGx1cjNKM2kyTStMK25zeDJyRDdldHdYeFBiWnpnelBQRjBaWkIvaTd6NzlidlBrRUIxYmxCZGE1REl0S1BHIFJMdG1SUlZNTWFtajI5cVBnelh6MHVFVitjb1RqRGU3M3hVWVQ4L0sxejRRUWt5c3JNdm4xQy9TRk9BelNSc09CM0hGQkFMNTlOQWogQU9CVVlldEdPcFpOblNzNlVXVDNiNUREaUJUZFFnSDRqQVpXNWkydGh4NjFPNWdoYndzclBhOTUzeXJuWkpCZ0xkUVQvUHVtK2pMRiBxQmhkQkZOUVJLUFZhYWRRVWlmWHQ1R1JEaTBIbmZUNkJiOEZEVGU0UzZVcXdjNFlVdlBVcTRpTXhORFdNRmxJQm16aVBpdnYvSDhYIDBEaGdlb1ZzWE1hdWV6VU1adHVKdHNzSVFEcDRuU2FXZVFZbTVJbFRac1podHhjVjZmdGNQbVVwdEdsa3lScDZNb2s5U1ZaWW9samYgQ21qbFlCdkt0Mk1EWHk2TDh6SjRmVTdLZ0VpVmtIblprWWEvdFN2YkFVekV1VTduZ044TUdFUFdBaG9jTmdwODVBY0lIRytESzZ1VCBXdDdTYXVlUCsvbjM1Z1B6MUJyVU5qaHArb2ROU2FjSklZaGtyMUgxRko3TzJPQUY4TFJRTmJqclVaR1JrcmRrcjZZMVZMVjk4Yk9VIEp2bFhWb3pIUE5uUG9QZ04vUG4zOGp2bE4yTUxQb1pTNERidHEwRDNKTER1R1RjRXN6S1Y5UXA1b3RTOExJVDVnZmVGOXduZitvZWsgSml6d09yeG5hdXJ1Nkp6WUY5QjgrL2RBYlFydzFMVW9ZVFcxUEpBWlVOdHJLdjFVYTBTNjNQU3BjbzlXeENKTmh1RVBqNjNnaHVFQiBWbURDZ3NXczJZRDhJRDgvL2tBZnNJcktyVFRPZTg1ek1mOEFGUlh0L1ZXZWJQbnh4MUE3U09xRUlVT3pCRXJwbnRScmxRQnRjdlBQIEMvSDQ2RlNGcVhaUHJQT1NNMENiZksxRGtvZ2RKU2EvcHlaVjRIVDNLc2FZQXRTeU8xYTI0RDBOVlBEM3c0K2NacHhYSjJaemJ3Zi8gQUlGc0hVOHQ1YlJBWUlaNjBBTnBURnltVW0rYTNtcE5QcVlmdmN2U3JrcmNlaGgwTmt1Q3lDSGF1dEtQUEhIRGpOTmxQdkRzRDRQeSBBQlVTRDNkUCsvWmx0bFBxUnpIVVpYdzJUL09ic3JtRnJVUldXMTFNN3E2dVpJSWRrQjRZZVl3YkcyMkJzZFZyTm1iV1RLQTNiem1IIG45Z3h4MkRzZFpDbmZDRytDczBDN0VoNDJMVXhoMlZSOHVXZVRTd0FYYWhBdytKN2pERHVDM0JnTDhER1lzOW0xZmpKdzNnYkIvZmogNkR6NEIwS2hReU1vbWlsK2RRRHQ2aHZhUXpTZDJjbkpEdmlNdU8wZFg3TTJsbFNSeGpsRzVFMkJ1eFRXbFoxeWFOMFBGYy9CNjNhRiBqS2RlbVo2VG9WcVdwVnJBVHBIcVVQVjRrUDhBS3RpMEs1Mit5Tzlsa1ZzbnVFejRHd2ZNclM4bW5jMmJaQW14Z0VIL0FDWU4vd0FZIDRlSHJOWE1hZTZDdjBhYkdwcjQvcWRvTWQ1V3dwdm1JeW5BUE1PU1F3NkdIMjlrZDU0NThwMVBKb3hRV0xKby9DVGQ0VkNmQWZRUUggVWJEYmNWd1lCelZKRFNkMEF4cFpBOFljQzFrU3VXYWZUeGhQTGgxdUdIaHAvRllDZUIrWTg3V0xKay91MitJT3dmMzgvd0JOcXpGTiA0Y29kZXo4MTJKV2N4dTBhWFg4T1pJbGgwMjJxOXE5RFcwOThxdUdZbVZ1dm1HbzhuZ1dyYzNsWEtjWjVzYkNiQS84QWQzM1FYOEFmIGpOUERKRXJGRjB5UlNNWlM5YXVKNG9qRkVWT0orb2piNmhqTkhjWDhhQXNjclV3c2MyWXZibVhCV1kreWVOd00wZCtObXNSUnhseXMgOERIbmZYME8yTDN1bTV6ekhNVXJtaW9ZUmhlTlFsbks4UXhVclE3MDJtdUhiY1Bxb01VT25rRU94dStGMDA3eG16SHdXc1BJVC9TdiB3QURBL3NIUVFIekt6c3NYY0VxdE1rMkJyUndKV0VIenJPRHFiSXJsUGxWS3lyKzhVUGRreDhUNWpWVWllMndhRy9pRktOQk5aT0pKIHU3TFU3Ukg3ZFBuNkQzL29QcWVqM3lMYkI1U2w1eEsyanlTMjNHUVpIeXQxNWs1NVhvc3BESDdQL0p3MkNHYzg5QVd4ak51Z3NZY0MgYjBEUDdCaHNEOTU5a0Q0YmJYTXlZNVZWZVZ0SithZXB4aE1XRmsyUkREdVlDWmNqNVpBKytQaHNpMnlPREc4VzJuM1QyVFdjYlExRyBJM0J6Zis0SDVmOEE4cWk2amxvMWpabmNaSUVBZHMvNHlPZkMxZWZJNTQrZWhqYTgvVHp0REczZGpoSVN1YStEZUhIUEYzZkZVUVN0IFZiSnRjQk9hblBXZnA1cGc1Nm1ocmk1NlhiVDg1Wjd0bjRaaDZjVjlicE56cG1tcGtnWm8reHBKU1EraFBXdVpndGYyZGloWVF4dWIgSndtR1MrZGFhelRiVHNHdWtvZWN1ZXFLL2wxc0N5a09LdVhveDU5Qno0QWJPbHkzOENOckpYemxyT05IcVVXd3IzQlQ2MGFEM3BoWiBtekxuclZsa09CUUZaUEJqczYzalN4VUxLRTBMTW45bjdraFBIdmY2cGMyNUZ0aUxQTkRySDlSSU9NSWVPUDhBaVFQRkR4dGZ2L3grIDZJMlNtNGNDbTdVdVNqUGpkcW5EVnBacVBXNEZnWVpsb1ZMRVRWZFBJT0Zic2pKY0VOd2ZBWjdpVTRNOHJIakZubS8rL2o0RFlEL2QgM3JqcC9WbzhBVjl3bFZVNEVyYWJhOVVteXQzQjhWMU5QRkxIOEZ0b0I2ZjRITVcyUlBxL0djQnNBQ2JXaWRacTVSbUdQR3lHem5QaiArd0FOL1FUL0FHSWFsVjhWc3RSU3FET05oeWlTRExNRmVzbGtMMHlyM3lXcnRIYi9BSjRZZkRDZXZtRlZTNEhWYWV6REJUUXNvendFIGRUYU9BcUszVi9CK2ZnRlJMKzVMWUVOWHl3d3V6S3JTYUJLM05XOHRIeWp6UjNJS05FczlwOWZFK3Ezd3doclgyUTRCMUlRR3Brd2UgWHloeWF5OFVtRXEzMysvZmlMcm5hdlN4NnZSckZLSnAwaW1pazFLeDhSNnFOYkt3enB6MmJnU1plNDFQREc5SENqcmoxRHhTdkpGNiBjMGtNa0tURG1TRGN3QmtpTkNwQmlDcmZIL2ZwZTJCYkRRK05DRytUNmxHcE9WVExiMm5tRXFuaWNEVjJGTmxiZVljSzMxQ09ESGNFIE9kYlZQMjFpeWY4QXFnRkUyYjdzYndZUEFJUHNmZmorNnZMRUlYY0x0bUF4dTIvSHNsL0xWd2t3NlBpR01lN0Q0TWhwOHhicXZaL0QgemtQZ2NFd3NyQ0cwTEpNR2svUndBRG4yQi96L0FFNEtyRjNna1ZaRE0zbVlDWjFCYW5EWmE2RU14Vjh1SFVvR3pTalE0RDRlTXpuayB6K2VVdUJ3TFV0OUdLSy9zamhOazhBL0lMOGcvWU9veGdJQTFlUFh0aklleUUzeWE3Y3dKVEU5U0RnVU93aGI0bjRNakpNNDRISW1BIGFqYjRGcU1FeGUxazFrSFYreUF3Qi9FQi9rZjZJTGNTaU1JK29FSnFTSjg0NU5ranRqT0s1TzJmWWxjMGVlT2FBeGRwWnc3YWJlWGUgQlRDUWIzS2JhWk51VnR0bjNKVnIrZXZ0cWFhbE5JYUljQkNQTnR6Wm9ING1uOGE3U0tuWkVNWGJCNFd0c0JneFZiSXliaE5WUjl3QSBYbVl6TEw0cms5OGRqWVJIMy9ZRDREZitxdTVqSWhKc09aUGloeVNURitORU1jMkhwQ0hGZklqUUFtRUZ1WjNVcXZjT0RuNi81d2g4IEY1UXpMSU1JN3BPLy93QkE4QjgrYXE5Z090b1ZmY0FlK0h4L2hvVHRaSEtOTk15UmQzeXFIaVhJNVBpZVlRN1VmR1FQQURnd0RoUGEgdjZvS0V4bTlwQnZmL3dCZ3dQOEFuKzJSV1lldVZ1SGxXcXlFcTk3WXFWM01BRXhqRWZIMFhmTzFtR0JiWkUrSEQ3Znd6azRlZVZiSSBaaWZQQ2JOaitMdTdyOGc0Z1BjL3NEaktNVlNVcDJXeVFaNVl4dmlGYWVQRWZ5WTlneTRDUHliNkRhVkhrTUlkRU8zVE9sZjNpS1dPIFphRm5MYmlFWlBJdjZqNHc3MkZZbHFORlMyRExTQ2o1VXFHZXpsSXZIMU9BVmV6WmtXeGhQY2FZbnNscVZYTVF6QSsxQVlGd3FVNUwgL0YvYUJuUndnVGc3OEFRdm9KOCtBeEQ3b3VTR3VhdU9iaHJtWkQ2UXlHN0NNTWpWWUhQS2JxKytkUG95RzNwN0l5T0ZWcmpBdG5HMyBnZUV4bUdYSXIxbVQ3MnV3UjRQSCtBbi9BRDRBQVcxZHF5MG1WUFZWczFuWUNOSzFNWG1Hb3hxRWFhcTR6WVRFbTFOU1Zua25NOU9mIFFsVnc1NTAyUFBlak1Id2tpeUd1MEt6OUp6MWhEQ1RpQk5BMXZNdzlQcncvYnBXOVB1U3ZYckhFVHlVTUMrV2d3NG1HclVCWnRqMmcgbTJGU0l0bFQwL2VMNER6SEFOT2dPQ0dkcmQ1dDlwZkZtcy9DaE5nOCt3YkI0QlVUTEpiUnh1bVgwOE1jeFgwMm91R2FQeHVWWUxDeCBWcnliNE9WWFd3V1NaQ2QxMFJxQjNLcFNhTlk0R21vM2ZoYXM3dFA3QUNwdW0zeUFVQTA0Tk02aEhaZVIwa3cwWWJYYlMrbTNjWVlEIEZxMlJ3OWtZREZjejJDQXFwNHdYOUdadGtTYlJ4QWVBOCtBdzZqYllPQXhkMk5WUzAzblhZK01iVS93eDQzSmtWa1lxVURxRXBHeHEgM1lJYmdudmlkQzQyRHFWdzdqRjJaWjl1MmUrZjM4QWVYL1BnRUdTVDArT1owWjFqWHdaRGYzeVVram9qd2V6ZzZuVzlYeFY2VTBPTSA5UE1RN3NocmJBKzc5YUdIRCt4cUcrY21TRFlSSnF0QmZqNkNBUGdFSStmYWt4YnZ5MzFPeUhLMEpsZnUxZzBiU2RJM1JEYXJBaUI2IFFsYWNFMnBUQkMxSmdlR0hUMS9nOEJmdW51cVRXV2hYNU1EdElKandISFlIN1lEK3dGR1pJNDNsa2ZmZHBwTERMakcxRkFNd3AzRFYgOGJjc2Z6bGx4aXVUQ1V3SUluOUlxR0tEY0Ewa1o3MFlkdFZrS1BOMzQ0NXJHanNBdE56TTZCYUJnSTFKc09OTHE4UG5YUjhNbXIwaSBlY2pGWHc3Z21NaUlIWDdKdkI4d2JRY1BiRU1XczJZajJpa3U0TStBUCtmdDNZT3JLZzlPZXNEVHpYa09yMktsRFZaS1dzWmJySXhNIFQ2bVUrVVdOWVVXdUxJSG1FOWttc2xrV0FabjBQWUFBN2NBemJCYnlUQm16ZnNBUVQ1K291UDdBZnF3Uk02dzNaOHpxNjB5MlNOdFIgajByMDVhN2hTY3d6cDhwK0x5S25KZlA0TGU5M0F0MnFuc21ENUFJVTg0dkt4aGc4WWczYkVMeC8yWHo5dkh3SFJKUmRxUTIxWDcwNiB2dFZHOFp0WTA1UTFYamEzanNMNWNrcTdsZXVXUWRkdFZvYTM4TzBBN1VCc0NBMUdNSGtWM001eUVDT3dQOVBBQU1FSG9qTFAydmdqIGJUcVZXc3RRSTE1U09BOFk0MmMybzJjZTBZOGdxd3FtQWQxeW9GbEVYZkh3c3FIY2lscjFBeUFxUlFqTEVISUtncldZdGd3bUxkSTIgcWsxK0duMlJhUlpISnpIRGdkWHlwZXBaWGh1RXd3bm1PNUs4dG5LSDRIQlQxbG1WcWJXV1o0cTQzcUhPYi9VUi9FK3djQjZmR1cwWCBCS0IzOVdsYUFWSVBsSG45ZVlBSzJueExKS0M3dUEvTVQwK3E2ZmgxWHFFM2lFQlQ0SHd5ZHYxZmg5NC9GMkNDQTJBQUFRUGJxU2prIEZjb3ByWm1MblZ0Wk5nMmRIczB4YWxZbVd5dDR0aWlRSlJiY0szV3RQZHdQa3djK0F6M2RxZCtYMWNXakl4enpkVnZ3RDZEdjRCK1EgWmhUZU5RQm0yS3hLYWVEMnBCdzFTcmEySlJ3T2RIVTVrcG9sT1ZjL2NIeERjQTlxZk1CY2ZyVDZ5czhYZWJNOWphVDU4QjRBK2c4KyBCb3hxam1wUjBEeFNiYWFqRUpJa3NjcnlPMjBiU1RiVldmRWJOV1JKbFN2YVF4cVZka1JvNnlWSThSM1ZWOXgvSC9jL25xTmtNRmZwIEZSMC9YTDVXOXRKTnRWTGhjVlB0VUpYK1k1SGw2MEh4UFgrQm1GdVk0RCs4U0gvSXpCZ3hvRnZPeDczNy9RVUhZUFBnSUROT2FsSUYgcVoyYlRiM2FJZUF5TGN0ZmRySVI0a09wUU1STlBReURndHJuR3c3QXQvQVhwODZHemJXMExLTWN0RTNzZXdleDgvc0dJQnoyM2FkbSBQWXZrVmxXcFpEM3JDenZpdE5odUFZVFd3cXVXRk9yckZ3RXd4Q2V5VWtuNGJEUUJERmxHMW8wMmordXluTWNkL2ZnT0lERmdBTGRUIG9Oa3NGbHlRTStZRW9kdHlRZGhSNjlQUEJZeHpKaFBTakE5a1c0ZUd6TUd4bmw5dEJtUmlNTDNObWVNVGJzOGIvd0NBUCtmNmtPbDAgMm1qRzdOcVpOeDVYRGErWU5JTXBtbEtJK0l1T0xkRWNhME51RklVdGl1ZlY2azZtV2JLS0tDREZJbFpJWTl1UG1PS1FFSmtjYU1tTiBXYkF1K2FDcmg0MWV1RDVtelp3MHdMVDZ1RXA2MjFCN1lXeFl1SWhLN0l3Y2xjR1JERGovQUoySkE5QnNnbVQ1UnRtOXBKdDQvTHI4IEF3NThmNlpDVldieFVGaUo3RzVJYWxuVkxrbTdZSVRibXNDRytBYW1MQ3p3ZGdUOTRyZTdGc2VIcm10QjZGNzJZTVYyZ1lNNXM3R3ogaUNBWHdEQnY0QmZQeHJZUE1BVWNiRnJSRFc5UFpsa3RHV0dQVEt2RTAvamNpOWNrVlBjRUp3TWN3WkdBUDg5Zm5xc01uK0crUzhKNSBzOEh3Q0NmZnNBR1BVazJNbHVka2xWOGZDVWt4VlNySnB3T3FqU0M5ektLSlZ1U01BZGtaYWZtclk4d3FnZWVBM0RrNzRyck94cEp1IGsvN0IrbmdHNjZERkpZVWt2UEdFc2swdW0xQzduaG9WaWZ2b2p1Vm0vd0FORVdlbGFUVU04Z2tNTWNUeHh1NkUvd0FIQVRJVGloWTQgR0orTzhVYjZYcU82QTRDbmt4V05QRzNZWlNUZktLM0FOQ25mQjRERTVRK0R6RDVaRmJtRThlbmc5UENmN01tNXRGWFBLeWNTYnMzeCBCeEFiL3NBRG9xS1ZQWDVRNURYQU5uSk4vSTdVRDdiL0FPQ24walZZdDhMQ3l1b1ZmbXpERmtRM0RHbjRLa3dQbEhyWk41b2UrRmw1IEJtOWtPYkErK0ErL2RKK3M0YW44Y0RtMDJrdXdmVmRNc2lWSERaVmdVNkhQVU84RlVNdzR2bUppbjNEdWdZd240SHE0RHJCT3owTm0gUjhVbkh0WGl2b0o1ZjJEOWVxdzlRV1hyUlhkTFduQkkwajVBbXRkSkdIcHRpd2wrQXhKNHNUcUNWWWJldjRYWlk5alduYjUrRmdoTCA4RUpEYUZyRWJjSC9BREpmcU9IZlpnWXNWNzAraGVYaGFUR1FGQldOWmJVT0duVzhRTXU5dG9ramozNVVmR1BMR0JOQ1ZxcnV5SzVTIEdNQmR4M1lWbGhhMEtITEhucVV0Q3QwZVZVOVZ2a0NZeVhCcHBTWXRJaDdtRHE2Uk1xODlMUTJod1g3VXZpaGx0UHNnZXQ0dmcvZzkgVjIrVFYzeFpzdzUzU044KzMvSDlFSG4wa3dDNlB2MjNNa1hSbGhFcTlyVG15bjJ4VzVDUXRwclJ3MitJZGYxVVljS1RUN1U3cWRsViA4RGFpR2pJMk55RTd5UndnVDZDZlA5M1FEOTBYNmp5aStHcUxVaEVpNmU2TDAxSk9xNWJodkFkV2tscGxpMk9rMXlyc1k5UGg2ZkVUIC9sbnJWY1VQaWljUWVSaXVoMCtMTm1ic1NuakhnQysvQWNBQURyN21YWVBsV1pNc3ZXUmsyUllidkRkcTlWN08wMHZGWXA2YSthaEEgSXRiY0dTR0d1QU9IVDF0VlVnQUtkRHFEOERrOThObXdtL2dBQUFBZzdBL0h3YVNYc2VPWFUyVVdQazcybjFNZzRqV2ZUOW5pM0tIZCBPSUw4RzZFZmFFanJnZ1RNa0F5N2NrVHNWRWtjY21MM1haazJJdmdZaXVwM0xzakxhSWMycGMyeUxqVDUra1ViY2FCVDloUERGU2ZEIFJJR21yNGNHT3E0YkpaRlY4d2d0cStoMXkrY1pmY0JheTdoQW51Z3NDRFVYQWRnZnVxMUFyVU9XV2owK0xQSVkyNE1wRGJhY3EvVWogWjFzUThEMm4ySW14ZStDM1ZXTDRZNUJNdFJEc0dmOEFNM044MGw2ZWlmQ2F1N1ZjK1FkL3QwLzlCWTdUcTBGMFBXR2JRZGNWd2JyRyBxaGwxMVJxM0pXYlc5VDkrR2lrYnVUcklYbkdIUkNlK3VCOWJWbnlzQjdVR3hlVUwyR25NTzEyT0tDd1lZNDc5N1J6QThJYmJabGU2IFFhSGhxTEplZW52c000V1JlZExPOHRvVnRSN2x2RGhENWdob2U0SjZPQlgvQU1xTEswVWFHWVljL2g0U2NENkVBQWNCUG45L2dDUlMgb3NtbmNURkpKSW1Qc01jVzJKMmlldlVDaDR5M0MwV1U4M3dTRjNpTW9lNGc4Y2NpbGF1U1c5cFNiNHl3Zm12UHh6UmZGeUphZmJWUCByZGZTcStOaDRnY2s3aDFSd2FCTXdXcjBpcm5uQWVZUXpGRDNZeUo2M080ZnEwQnZoT3pCYlJlU3lEMlEzaHNDL3dBQnFMZitxb3pLIDBzaEloMlF4dHRlbTdDYlZSYmJIQnFBMXZMUXdMa3ZWeUwrbjQ5MUU4T1BaSzVBcjRIQmtlU2YwYjhvbXdod0FmL3NHL2dMZFpsaUYgTXBYTXltTURhTko1UmhUc0plczZYeDd1aEZVd0NiZGpoZkZEMCtuekh3Zjg2QlI0R2N5SXZQUDk3VmQ1L3dBQUJBSHdIU1pRN2NhSSBGZ01vYXhyeUNWdkZoZzZ5Y0FMaVB3N2NsTlI5dEZIeHdaRStZeVdRSFQ1a0dldm9kalN5ZkYrVGNIU1FpVGdBcUlBQVh3SGdNWkFOIFJMSXNRUjVFYkxQS1gxRXlsZVVMQytCMm93SlN1R0xjcVRseUFGVHlRUlp5RE11bUt4Z0p1UmlNZUkzanpYTERuRnNoZG5qanB6R0QgRnFVakhBaG1OUG9FbEsxTGFlSmRrVnVTdEJzREZMR0xKcFJ3cCtyTjRUekFjZk1PQWRRRGFjY0ViaTZ1c2pQNkpSc1gzWU1INUE0QyBmUm9OUHZqVDdhR1NyNVI1a1ZiYWFoa1N5TGd6bkNuQTRFcFhwNnBiVXNFT3R1RlY3UjhKcXVraFMxY0dIbG1hTnpadUU3M3Y0Qis1IDgvSUw5c0NaUXg5b0pGNXc5MGgxTGN5dk1KTU5nSGtudGs0VnloMWtlS0dCL2JlSFcrcEJjWDNCcVEwK2xuaUdNc3hYS0xEemdidzggL2ordm4vZDVWR2wzUkZwZXdyazE2a3JqNzNOYVRZY2dQWVZiQ1REbTVPOFZ5YitTTGEyNFB1M2h6bExMN2JqM2ZHQzZ1L1pIYi9WNyB3Q0Q1OWdoajI1TmFxUnhoSlBwNTViMUplT1o1SWhHUXBhYWVWSkVFQWFWSGlpcmNqb3lVU3JqbExEcHk4dHVkd0NKbDlTQ01HUGJSIHlyUEcxNU5SU1J2YWNndkZtM2NRT2tiOFpsVmlFZHN0cXJld2c2cVlyOFNIQXBxOVl3dmg2ZkRmTm5aQ0g4Z3Z2a0V3ekUxY29NRmcgemY4QVlBQy92Lzc5MXg3UXk1Uml3dDVHa3NtcitBTml2a3cyaXdvWlE4djdvdGozQndUN1VoMXRYNjJqdG8rQWNoczVNWHRoUEh3ZyBRK2c4Qnh3My9vRTFFTnJBaDJZQmxORmhNdGtaUmhrWHJJTHpHaWhuMVhpMnhiUlZQc0NadkZWb2I0dm9sak52d0hpR3pEQ25qTms3IG8xWGlmL0VSOEFCUDlCSkN5R2hOcmY1V3p5U1N2YWJzMTJRZVQyZ1RERmkvdVFjaERyZHdaRnRiODQya045NU1US0ZDYno1dEozLzIgUGdEK3dkQ0kyUmtuZDVpOHFLN0VTVUQrQjdmdDU1K2I2dG1iWk1aQ0FSMVNoS2tHUlc5eVMvVXZIdDdVeDd2T1Y5UnF2Wmo1WHp3ayBUNkhhbllQQVQ0ekZXOXFMYWV3NHkzTGk5ako5ZnpFOURwK0gvcU5aYWVlQm9TME0zVGM5a1NYWUdnZ0VJK0FxUHdCK1lZSmdPdnRXIGx6WEpQcXVNaDV1Y05scjdKTTh4RlBNTVR5SE1LZ01JaTJ2NEhFTzBMYWd3MW16VU5YV1ZrSFZ3UTJjUGdIOCtBQWU1L3EzVjRhYjAgZGpaSFpINXN0MnBsVStFWGg2SFoybDlzbVJTalpLUFZYWDdKd053cCt0eDh3SDNBUGNrR2UzK1dKdjhBOCtQdno5d0RwVjFXaDEvcSBDc2dDWmkxdkdyZElHMXV2Y3cxVVNDeGhYY3E5dVN1VU93SmhneHZFTndROWhwOThlRnNYUnI1dWUrQktTT1BIYUkvd0YrOC8wd3ZBIDJjd2tRNytPODZSWVlZRVlXTTJ5dkpxNVhHdm0rRnFyUitrUlNKV0EvQUlBUHdQd09yS2FWOUF0SjZpUlYxMkt1bDNGZnJYTTFFMmEgRnA2SW9LOXVhbVEvcXJJWjZRV0lQMCttMGFwc1ErQkpTQnBDU1lBNTJCVElBc1pUQVJsdGhFYVR5R1dDM3MrZFVNekxhcDJnVHpZaSBKUXovQUJGYjFIL1NiQmxMZldiYlE3RUxqWndRTEdoK3RsRVVzV1VxOGxTd01hRGxKM29LQzhra1VsWkN6bFpMVDYxdHFqR1VCT3pxIDFGS29NMWtBQW5DclBITlpHdlBQSjhIOGRVWmJKT1BuOS84QTg2TzJVd2h1NHV5S2xaOG1wYzVrUGFoM2VuN2hjYllMbUl1cURUMlYgaXc2dldyc1R6RU1PUWNBZkgzeThIeXpHWXBhRlpqTzZWb3BLUDduKzd2Nzkwd3ROYS9RZDhTR1J0dVN5YmFzN1d2YWtaaHBla2hxdSBwb2NxMEpaNm0wOGZNcmZrakpESUdLNXNzLzJkaGswWW8wUFN5RE5KQVFHZndmaisvd0N3SCtxNjArcm85bGxiYWZBS2VOSlpzTWxkIDBoMnlhL2Q0WlN4cllhSXRrV0JNZkVRUGFnY2hEZ3Zsb0tTUHlabVYxZDV0OUh3dElJOEFINEJ2NTgvZ0FQejJaV2RvT1MvUnBSRHkgWC9Vc0JhcUJZYmdzT3lWYUpMN2pVTmJWWHc5b2hyZUJoRFgwK3hnSGFWVk1iWXJ0Qk1aNXZmQUIvd0ErQStnZ0FXR1VwSERCcTVrQyBQSGcyM3UrSllwVHAyWDZiVWVucWRvTElRWTZNWUpXU3FCTk5Ja3RUYVNBMVdjRGN4bXdLWWdyeklsSGJldXpKdTFzdUppdDA5a2ZBIGRlNmJuR3d0bnFBRGFOc05CSUNyRmxzb1VySkRpbUNFTjhtSjVpRVAyT0JZQUdDSFpoYXZ5WW4ydTJRNXdIWVAzOEFBS2JrdWpUSTcgZ3o5MFpkMXJqZ0doNm9aU1JZU2hwMzB6UFlHVFZDSEZ4Z1ZXbjN1aFh3dDR3d1o2QlpRSk9wK3pNYWJHdkdEcmpnODRIOEdERmd3ZiAwRjlDc3dmYWxqU0s5UXhiS01HdTdoYUltd0Zaa0gyRlc2R2ViSElvaGowNE9ZUTk0c0N0emlIeEtjdGt4ajVWK0JNNEUxRHUyLzdCIHdFL3YvdUg2ZDQ5MEpGZHV5YUtKRFVsY01kdlNGNUo1Q3MxdmdkeGdaVnE4OFpFOWJ0UmFYM3l4dVB0cHhiMnhvYUVaR2VUWU0zdjQgQUNBUGdPQTlGQnBvb2NsaVdHRGN1ZWVHQ2xlSFZ6eVNTNmdnRCtMUEpGKzdQYnNZNDEwRHpNMVJPcnp1T054NUIyb29VUlJxdTJjWSA0b3dxS3VSOEU4WFFYc2pMdWpORmpYS1ZNYlFMUlpDU1dYOFRCQmVEZ1FPb1VDTEQyZ3RtUGhoM0FlWUJxVEFlUmc2MVdZdG80eWQ5IDdSd0FQejkrd0FOZ2YwT2szKzh5cmhiK2xhaDFJd2g2ZXduTUR4Y2V3dm1NcWtlMHJoaHhCbHVCUFd4OVdVZlpkd0hsV3R5Wk5vVjkgUEl3NWhzaHg5QWZRVC9IK2pEVm93V2Zwem1XMEJ5aVNSWHJhSGt1NlBNMDl2Q1FuNmc0dERWZmZIYis3SzNNY2sreUk5YVdBQU9PRCBOVUNIdVl3NGJ0RkpCdng4K2cvdit3VlFPTW12aFNsdFdqeG9jSTFNMXBjRlhhZTA4RGtyOHRQcHM4MlUyZWNHQmtwKzFIeFByY2ZqIHp4Z2JlTjdZMFBlMkk5MkcwbkRqNzhmL0FOdm43bGxtblFDRllYaGJsWkwzWUYwalk3a3F5S0JJc2pVdUJTQ1RieGF4WlhvVEZDckUgTVpnNmJFS3RXM3VUK3BzdmFtV000amM0U1NURXNNaU1oYy9mbVcwVDdNVDdrWEtUSlEyMTlOeTdBaGpXQ2tURlhJZHNPU3ZaQkJrZiBXU3Q4Smc4TjQvZzlrRENiVFY3TjJyTnBHSC8vQUh6OXFFY3BhakpjRmIyV0gxVUxicmFGOGFTMkV4WVZ3WEIvTks0a0Nyd3lNTjhvIGRQVDVqQTRiOHZua2ZreU1WYUJuNVJPV2ljZm40QWZ3QUg4ZlliT05GYnU3Z1NUY3Eya201c3F0eVR2WkRoWkRoeVFEU044NmdtaHcgSU9FT3EwTXcrTUdGeGR3TEw1SldhTTBibXpiSWtuUEFiQnNBQS92NjlySkxJUUpsTWh1ekx0ZnpiRHdiTUZ1dlYvOEFvMnpYeERRKyBOdUZxTGJndGtKbjVRZ1ZXeUxObHRBdEdXVG1POSs1OC93QSs1QjU0WkFzMGJsMFJud0tNenJubG1WQU5XdFk0bml6ZGprVnl5TmRpIFNOMWR6dU9xeFNJMjNWbW1MSlRaZVZvWkQ1K1R3U1RMa0RsSy9aQTlOd3dpZXVFcEttOEdFTlBiSEJYc2EyRmROWkI1ampjUFQybjEgZUczNndCNE9ZVVpoYlFUWnYyVGtIL1lPQTlhZ2FldjIwY0E1cUc3R3lUSkMrVzRCekZrTmt3WEY1NFVjQ0RJbm9rTzFBNCtaNUQyVyA2elp2eVlNd1NRanNELzdDL0FIN29qZkszYk4wdVd5MjFrZjNZTnBpa3NPbGJPcjI4Rjd0SzVMeWE1Y2Zob2E0dHZpR25oMGNDd0tVIEZrWmVMOEdXUW5OamV3UHg5QlFjRC9nSjRHbmxEeW1laXo0ZFhXZFh5SEdpV0FCWkNCYVlVc1lUWE5qUTJBekRtS0VNdzRNaU9ocC8gY1VQV2JOYUhhQkczdTdLVEIvMkRZQUI4K3BWVkkyMUQrbkd6bDI4TnN6cmhRKzNQYXlQTkxtV0hDMEFZeStvdnh0T2o1QVZKd0xwSCAreTc3alRYUTRGZEwwNVI5NEMxdW1kVi9NQW1sMjBiYXRxd2srdDhsWExUQUxrdzg4UStZZmNHU3F4LzN5djdhT0lmMWRESnZKd0lhIDN3Ky9ZYkF2OCt4WDRHanpEWlE5NkxkL1R5UVFsYXJoR2lFREo2TXByWjc1ZktGdlo1aGhPWkpnK0dxb2RnS1ZIMnB4bmxETndmOEEgdjREd0I5ZjJFL1pBNG4wdlFUZ3lKRHU0V2piU2xVcWxMSDJGZkNPa0dCYWFrUGx5TGE4eUo4TjhRb2ErWVZaN0FwSEEvSnRSbjJiZSAzYXJqaURidS93REgwRStBNm9ycU0xR0dJb05EeVUyd2xzOWFCZ0tKc2dDazFla1dQRjdleWdOa09FeHdEbVZzd1AyT3kwOGZoVmF5IHpDL2NuNXNKYWdEd0hBZlkrZk5Xa2xENGluZU14czQ1THlQVzBLNHE4WCtUL3dCT2kyWW9YM2dIMmtydGQ4c0NjUndjUjdxL3dqbnAgMlVtRFh3TEpUNm1HcGtiWkVwVnNpWHAzUTVpT3c3OUsxWUpzcGtId2sva2hnd1BodFlGUDRyREprMWY4dmdnZ1Ezai9BUDBGQXdiViBtQTVobDBTVDFmWEJhRU04N05zUzBHckpIc016NVVRcHc5aFk3SHArSHh0ZzRyL1AxeW5yS3pxTUtibWQ3bzg0QVliQWduMEhZRDZUIFpHUjgxQlNPV3U5cDNaUXpSeHRUc0JxV3FucHpkSzVMSnNWa3RCOEQ4a3JjeXdHTmg0azhNZ3ppNnZqMk9DZjFCdjhBd0YrQWUvU3ggWklkcUdrUFRIcUhUZVNKTEhhWkpoYUUvSmp1N2dMVFJMUlY1aHdEOHdEbUF3OE04QVI2SGNjeG10OHB4amZjVWxKZU5nZmo5dW45LyBQZEhoTHFKWkp3LzlHUlYwYnBFZDUyQ0JFbXpScElycHNXaWRiSmJNTlMwbDJSSTJTczl5dThka2tlUFBZeERWbGxUY2ZiMWRjZmFEIFErQTczeWx4MnRGd1k1Z1JlcWU3TzZHRmtWTDI5MGx4UkRCOVBtTGRrRDdJcm1lbjJYM0k0eXIvQUpNQjJpRWRrYm54OStQOCtmdXYgcVdQb1BLcXU4cnoxWVhOR2hIa09pb2tldDZsZ1MyUjhQTzR0OGNPSHA4TjhocDlnR1BnTUNsdkNNc2xFT3M4S3JkZ2xYUEI5Ky84QSBjLzBnV3c0dE5Ed3R0c3B3ZjdtUE9EYXdtTGdWWEJJUTR2Y0pOQXZuNWdXNWx3QnlDR0NnTDdhOElieVRROXNScXJDaE9jTDc4d1B3IEQ5L1lCc3dEMHYxTHFBenJhS0RaSktyNWpiRU1XY05WM2VHK0hsK0srUGpnbnNkYjJSNC81MjRLZkpGa1lMZmJNOEk3SlA4QVQrSUEgL3NCL3JLME1lcFRFTHR1WnQ1ZHZzZE9GdGRNeWpiMDN4dUZJVHU5bVFBUWRQRTd3czRkN3pRcWdZeFBHOGI0WXlPa2NzdDNSSVZpaCBISkJOOXJ5ZEtMeXp4Z0RtcTluUDdVeDJvU2Q2ZmFnTlRyekpYTmpTMWVMYVkrWXRtSzNtUGxvY3F0cW43TGVJVHlNVjhkUW93NTlKIEI3K0EvUUI0QURtS2EzaHB6b2QzbnV3VG5tY0V3YUdTR0hzMlpZd3RzbEZJWHpBN0loekU5UGgxeUFRSUNyKzZDM244MkJIYThMZFEgVCt3SUlEZndGMGpCUmdZN0FocmthaUJwS3ViQzA4WVdCUTlFVSt3aGhZdlRnaHZoZ2d5ZDdKamhEd01lMm9CRStZVHZMZ1pNbDdndyBuQWZQL3dDV09BSEllQTlYMWVZQW9jTTJTU01HU25CelUrV0RXUmh5QTFQVW90OG5tRnVHdDNaancrdVFOUDhBejJUalBBMW5ZLzhBIHA0QUJ2L0FlajNGRWlpUVBKdHVqcTBhNUkxR2lGZXhkOFdjZUQ4YzhXMGUxVzIxUEpuVU8zTEZqdHl5Ujh4U291MlRoWklhVElHamkgRUROWHM0TGJEeFRHeXg2ckdHaGtwY0U3Q25yL0FNeDhpbGxjcHlCYk04d3NnUEFoL1BZSUFQdG53UGpJd0hpYjJNL3dFLzhBNWIvRyA1bGtUSEsxS1phQ2lUR1BJYVN5S2JUTkphbUN5Y3I2YzNjWEttRVE5MlRHUjgzQndWYTByOThSMFBhMWVyMmFzM2cxaHZuZ1BvTy9nIE9ua1BCMmUwR0hCY3pYWUpuZDFFRDh3QVUvNWdzV3cxS3J6QjhNT3RsdzVqN3hVdjFXazFrWVU0TjdHKzF4enovZ01lUWRWMUZ3NmIgVjZ2czR6bFhsZjJTZXNsa3JMaE5oQjJKa1Y5TDloTEJSa1lBNzZ0bDVpZVBoL0FQNmVjRExNVEZvWk5aTzQ0T3h6Z0g5UDcvQUxBNSBnc2l5cWpvanlwZ3FwUFYyQVNTZHZrZ2tVS0YzNUhTbzMrbmwwMDBnM0VnZk1tOEs1WGdtbTkxZjdWNE45U1IyaS80cGJZenExMFIxIDcyOXFxOG41ZXE4bFFJYXpmbElZbG9URU5nc2R3VDZyWTdJd21BMU5nN2NMZG1QT0hHV2JHcnNFa0hVUUFBQS9WZlBnSWR3VDJ3QysgSisvV1FTaGxFNGxMYUtCc2dnN2gwMCtKVFdpR3dMY01QalpFTWd5Y1MrQXE0N1lVS00zdWs4MzM4QnY0QS92L0FFU1ZOZmxRVjdTOSAyR2JMZkJyaGZ1ZFYxWlZQcDFwOWZTV1FDQmlBWEtIdzk4WkE4d3dQc2hxUTNEVFM4QjFtelVOOFpzUVpzR2J3dzRDdmdRRis4QjY2IDlUR1phajVSOWUyTXIxam9uVHcxd1ZkWjFQM3hSdEQ4a1BIcGNXcjA5ZnRSazFPVEZ1RXdZVHA3Z0E0Mno4bnVUOWZDSE5ndDdud0EgQUFQOUwwY2lpWXE2ZjNtTXZFWjVVaUpiY2kwOG9aWkpab2QzSE1xUW83ZTBrak1VM1VSdWdFcVM3VjdNeFdKY0w4a1IzazFScFoyMSByc3R2T1hBaHVFZXdTQ3F1RkhCdHM2ZmtzZ210OW5rTzRlcjdRaVh5VW1jUHFzdzRJYTJ3SjZycUhIejNnT1RHUG4yWkhOTzNnUDhBIFlMOXY1OSsxUG1MYms0UGxTcTlNa21VeUhqRm5naytQRU45cEZ6WVVPbTZUL25LM2htR1AzVlZKZ1VaeTRNczBZVUdXWThKRm9wUEEgUUw4QVBua0FBd0gwMGZUM0JEaUh0UmliWVVhWnhWLzdQTGQ4Y3NxdE5jcGRvWEloc0RHeVZXWUVXcXdRNTIzbmthMUVZbi9UT3lWYyBFUjBFK2c3QWZBUHo4QWJMaFJtbXNEWGEyZE02aEZ0YjFTdFYrMndrR05LNWhzdXkrRUtob3ROb1pHRTNtQzVudUErMkszT09DT25MIFBBM3ZreDFLZFhaNFh3Q0Z2NitCWDlnTnBZbWRjZFE3emFoMFNUQ3RSdTVEMVNiS2JXZEtBTGU4ZjF5dFVrakJVUm9FaG9ScWlsYWogTllxVDNYamp3YUYyZUIwanFyTUVMUUJ0VlhuczUyZHArUU4zQ2pjbGZzSmtsRkdHVmJUZzRUTHNEdUNmWkZnTWlxQkhIdmhzNnh6dyBZTTgzZGlPQXhQN0FmUG4rdU02TG1WcGxrb3NESmt3eUEwM1p0ZmtzNWdMUTkrcjJ4a01PUWZHVHVwVmEzdkVGOFQrS3cvcTZ1c2pOIDc5LzZCZmovQU9tUFdtWlIrV0dJWjBvVzd5VDBETzJteUR6SnhPWWh5bDV5Y2x0ZkR1QWQ4VHc5Z1RBYUd3d0hqRGd6UTBiWURONzUgKy9nUGYzMkNIa1RCWjYzSzlQTGdCSnIweXFyZ2xISkxiUkVoeFJlMXlrNzRmZFNHK2N3VCtXcjc1TzJ3WjlHL3pOZy9mLzU4MkxCUyBvVUhSc0FxbXo3elcyaDRQdjdxSThZOGdrbm9WaWpEeEdSY05RamlSMnNzVmpRRE5xQUYxa09MNXZwblZRd0ZESlJ2SGk4OGtuSGcrIDB0Q1RWWTlJL2lNbFdGZDI4TUNHSHRTbjlNUWV2ekU3YjBPdVU5NVdia2FLejJNMmt1eU9BK2dyKy84QVVZbHZBaG8wOE9DNW1RMzYgMm1mOFVCbHpPazRHRTdUN01xWVVudjdKQzB4dmtTNEhGd25UeDRFMzdyTk5xd3dsaUZ4eHhBQVFHT0FEQUFBeFZqSTIwM1h5L0RLQSBWVy9pVlhEVktXSE1CeDhTdDR2eTlRVFFudUV4a1F3N0lZWURFRUNuVm8xQmlmS0VQbktPYmRnbS92eUQvcTc3NFh2dzFSNWV1dTB3IDl4d05GRkJBcUhwcXY2bkQ0elROWlRKTllWOEJya00vMlBkaUhha3hqWDhBYUN2M1MwcDZ5anE1UjNyTTNnRXE4SGpqc0I3Rmd4eDYgQXl3aVFGTk5hUitxdW9FR3ovSFh1VFVTUVp5U0Z1K1JIYXNWeVJlQ3hNbExDMzFXNGFqaTVPNEk0RSs2N1gyWlZRSGZrUmExejU1VSB1WUJuKzFkR0tUaGlCY2tsdEwyQXRqV0N2VThvNUNZdG9HRjRQVmFjWVQ3VVg0YndldkNmT21EUGRYSnZPeUpKc0dnOW9uNStBWDUxIFp6Vkpja2Q4bVcxYlFvYTZ2akhVcHZCZnJHR3J4SEN1YTVYcWxxL2J6QWNPeVUrWEh3Mm9Dd1BpckRlWGxES2VjODJjUGdINC9zSDAgRHJTanh3OUdXalRMbG01emFoeGNrSHFFTTFKRFg1YTJoQVphYTBJYStuaDFzT1k3WHpKMXRKNzVPVzd5ck5YVjl6cXZzbTdBMEUrQSB0MUEzL2Y4QXB3UEZOMlFtdkY1QldoYkcxS21Ia0FxcnZsZTEvWVJnOS9Ybkh2aHArRU16OHc0MnNFQlZaSGxtRjhtSitFTm5MZFlEICtHLzdCMUZSV256WnR5SFpDeGlhV3ZUbkkza1U0SHp0eDJmMEJRNmhabzQyVEI0bkUwckZXRll5THQ3Ymp6ZUZ0WTR2SVdSWFNCRjMgQURuM1JVcHFnZzhhdlNiSXQxa1lwazlHWHEzZkQwVFV2WE16NGZiZDhNVW1QTWN1SDJYYWdjWndOWEo0QTk3NXcvY2ZmdnZ3RG9iMCA5MlEwUGw0TGVhQm9HOVhEVWpNZHJDMC81Tk0wdXZUTlBvRjNQT2NNaE11QlBaTFVtT0V3SFMxWDFwcy9mTEZYMU02ZW5qQjI4L3YvIEFJQUNBMkJrTmhSa3JsUHRyWnJnVzRSNlovRExxUXFWMnE5SXJkWFBkN3VYdUQ0NFZ1bjN4Q0lPRUZTWUo2T1lSYk1hRmY4QUtmOEEgZndHTDlqc0hBVDhDbHRENFV0eVpxbHFWd3ZVd3hoMGl3clF0UU9IYkRGalBoWjdpcmJCTW1HR1J3bVhBaDJNUXIvWThlTXRIR2Q4eCBwUUo0QUF2NysvYkIxbk1HNUZHR0xsNUVNS1RaWWZVNHl1bTFOSUEyRzdHSXBVYW53M0hTbTl6TkJWWnl0MjdQTEtZMUFXT0YxaGVXIE5rVzIvd0NXNnNMRjJwc1kwYmNVRm5VUzA1MTNRN1d0clRncnZDVGZMZ2l0U2xxaHZqVUpVRjBLcjZDQXFPWmNJWnBFMFhlS3drTjIgVmhkODZ6Q0FleDgwZk1ZbllUUGhsRHpFMXk4Y0djdG5YbFY2MTFDc3llek5RSFIwcDZnNWtxd3JYeVc5ekZCYXl1eWVOYy9SYXJybSBtMXRtZkRBNXVJRmplUi9qeGprY3BJTGY0all0bjE1KzljZkRNYnZYSWtaMFkwNmdBRFZUQUNnQnh3Qmgvd0Rybi9mOGN3dHFRYWJSIHdnZzhqOEhzc1hYNjgxK2Z4MDdGZTFLVHRCTE1FS3ZQYWg2Wnl0Tjl0TytvQmtEdUduQmIxR1Z6VGoyK1RLZlQ4WENxMEtxKzIrL0UgRU9xMXNvVEZ2bXFzbWNxNEp3aGdBSDBFL3dBKzM5QnNXMld4SXArekxDRjFWYlVtazBoa1VrZ2ZNWksvc083YlFpM0dCaWg2dnA5OCB2aXRneGdoRFZRTmYyV3F6RmttMFZmMnplTFJDQktyZm42b1g3NkRzR0N4SHlNeXFoalUwVHlTVFZhdldBUmVYMlJxVjY5aDZncXZTIExHdEJidEJ3cmRiaDFYTUlNaU8rYWY4QVV0eHRteEYyZ3NzM2E1Sk5uUDMvQUdCQkFZcjdJcWRMMU1UNGFmbzh1NTJRTElkM0M3Q3kgTzR6QjVZT2R0Q25OUmdIQ3Y5NFczMmJpd2ZCZ1YrK0tySXMxbXJ0R25xelA3RnovQUdCQmZ1Zlk5TkVXRGYzaVJHUWFtTjQzUVJEWiA4N1JZUnhSZ3h3OTJVakVtbUZLS05xVjVDanRFK0RycGxVSVlSTHUrcEJGU3NkUFBqSU4zSkk2WGNJSXk3YkNsZkpDdTdpK1pXRFdNIGExTExKRWkxZ1hZbjVEWVlUUU9KUm9tRHZtWTF2VlpnaERCcVJIbFMzNHUwR1pHOXplR0o4K0EzL2Y4QXB3QTh5bDRxZnFvb3pWZVMgYlR4bm0xc0wrbnRKRGlROWNubDRvNVRIQ0dZVzluRHNDM0JVdk9WV0w1UnVZenRkc213ZnYrLzhCd3JxY09RN0dwZXZXaGNkcWxBbiBnUVJocTlrcDk0bHNpdWVweDhQS0RoU2NTdDRjemg2MmNxWGxzRk9aZnhlek14d0ord1B3RFlIN2tEOTFQYmhIRFYzY0VBTlp6L255IG1xcmkxa1ZYWHNoVHVDeGxkM2l4UTQ2SDJmVzNBT1BNUVlFOXRWWEN6Qm41eVJ0a3E1MjQvd0M1OC9oNThBbUhUcVk2M0pzL3FaR1YgOXoyU1F5dEZKRXlsZStOcVJuRnBsd1B0c3ZmVXNvWWxFWGNoVm5oUVkzSEtmU2N2emQwOURIam5ucUJyK2pualVPd3ArbjBYa0lEZyBHWkJyeFpCaTFMb2JQbFJWNVh0QlBIcDVod013N1RUKzZrRG5oempJeXJ4ZmJQOEFyYllOZ2ZqNkQwbVdCVHZTMEV1c1JsbDJwM2dTIEVsYlUyQ3NXUXdXaDJOYUM4MEs4TWhNRGgvdmcvbkRhbjB0aFc5bWJwZ2pFemdQem5BZmZ6L1RyWk5LaTNkMHhEdFhUUW4yUUhGcDkgSjJFNFdva2tDeGdDZWQ1UUdHd1RMc1EwOFBpUTlxelQ2MG5CMFlZcjg1Wi9OdTJCL2dJRHdIbjJISWZKams0QWJCbnV3UmtsRFdSSSByYmhSQ3ZKbGNnV0hTcUxUMThQTTQydG1YQmthbEswT0t6SGtuenpreU9FU2NBZS9uei9BVC9UMGVXVGIxQ01qb0VsZFhkOXFlUEhhIHNEVDArZWZIOVZjY1I3c3VNYkxHZDNNNFRIQ3VCSkJxYUJCL3daYlgvYmMvZGRCK1kwSGJCS1UvUGdhZFBtQlZ2UzdFcDlicjFmU04gcVYwaEVUWVRBK1UvZGt4RFd4L3pyTFQvQUp6NE1zeG9hQm4zYm0yQi93RFlQMUFkYmJJZUtycSswTkxzL1MrNzJRZWZEQ2tXajJwZSBWa1JMSXgwK3FkOFNnNmVZaG1LM1R6SHpGWCtSVlVObVJpbUN5cytFOEJ2L0FENCtlMkRwaG85a0dMQmhvZE4xeW55VnVWVXRrWEhaIEJKdzNZeFNNcUlteXVQc2dnd2hzbklGdDRuOHRPTWhOSDl1VEE5N2RnZXdJT0dBQUF3SDhhNnNtRlh0REFTcXFWWVNTTmFQak83d0ggaU9IdzVRRklhSlJnZ3lPQzNEaHpGOHhZejQ0TnJYdGhRWnRteC9kK2VuK2ZmdjREcUVZa2laTGgwcVJySno3OHZhZkhhQmdiOTNuOSBkTmtYTXFzSnltbmVSNHo0MjYyOGhYT1JOaWphMVYxK0xJcjdSWmp1REEyVzVYTjJmcUM4bHV3bDl3c0p3cjI5MmphYkd0QlBxL3Z4IFc1aERyZGdoemtOUGZKekpXVkd0Rm9MS3pSM050OFgzNUJmZ0g5L1VoeU95R1dnRFZSUkVHdUZxekcxVGFTVlNwNjlEc1lDSmxBUS8gSk9IMlFucDQ5N3NheWwvR25YeXNoZ3Z0bVQzdDJkMGYyUDhBbndBQkJQenkzVmNoeUhwL1BMT2xQamJrb0FsR3ppVFJMMzdFU0JReiBIR3pQZFNHaGtBODQ4dnFXem8zQThSbXgvd0NsZlB0Z1FlZmRLcHdwNEhUYnBuR2Y4WnRHMFBXTk9XdzhKTlBoK2VLOWpLZGpja1grIFNPRlYyUVlJQis1WTg5K3JNTFF4ak5WWnYrZ2VmSUxCKy9uMUxFeGpacmhFaGRwWTBoOEdUc1ZHWnIvb3hyR2c0N3padGZIUlNTcVcgN085QjdYOFplTDdlYXIvVS93RG5xd0RJUWJLZ3pNa1hjaXJaRmVpeWY0ditXcnhEQUVXMldnVkRrT1lXcERtcmkrWVIxSzhLSDVoNSBSb3N6OFhZOXE3ZFFYNzkvMzgrTlI3b2oxQVFNR2NvdzdLcmRaRmJpZTdRMHd3MVhhQXRlVGJHVzErdDF1K0psUHNqQk1PVkxYMCtjIFlHZUs4NGtwTHNjQVArRDhnZ0QvQUVTS2RtTmxRVElZdVZjQkoyMDBuaVFsSEEyRTBYRTRPZFhpZFJqa2hqMXUrSENrMlI4WDBNNVUgcER1b1laeWYzbWpUcVQ0TStBeHhBYyszOCtzY3l0NmpYT1lZWlZQMWRrc2FTdHhHak9zNE9rQnhjWDdRSHNCOFVEQ2VZUXg4T0NlWCAzMUhyZjc1Mnkzd0k3ZmZnQURnSjhBd0lKOTBra1FpRE1YajJrMDlTWjd1OEovcHJuZ2tVQ1JNdC92UklKcTIweWRjbDZvYWFlYWVMIFJRUkpMcVpOU1kxaEcxREd6eFF2SWl5YjBxUnZuZ3dVdExIdDl4RzVkQm5MYlFITTJCcXVzdDMxTHBOa1dyblA0bXdFbUhaQWg4QTIgZ2tBYWJaQjlKb1NGVDRjd1BXd2JiYUYwd25Dek4wcTlaZVhpcmppVC9YMy9BT21sa01BOVh3K2s2UnQvSnE2dUxlaHNrdXQ5NDVEVCA5WHB0eHZrVjhzRDVsa1RXV3Q4V000MmtPSzdZTUY4NUpnemJzYjluNUJQK2Y2R3dIOFBlYXl3N1FvMGJXK0pTc2RQQzlxd0EyMVlDIFFIQUZGUDRvZGY4QTJmWjZmVCs1ZGdYeFkwd3BXU0dyaXlaejMyTS92NEFCMWlQVDRjTnAvd0JKZW9Jelhxa3FhUnRTdGtjZ0QwbmIgRFlZMUxkMkx1RjF2WUg1SXV6VGVocjhNNEI1NVhLZnptcjFlczNvNEVDRy9Qc0d3YitnMUZoa1dXRFlUVnh5N2FUbHBvQWRQdHlUWSA2WVp3dm96THVTMzlNdFJ5R0hjM0RpM3BtM3ZwdFNzcjZReG9ab3NZcGR1ZUtaRndyQmxsaGFTTjgrNndyZG1QazMwMm1Sb3NUUTlEIDFJYUxhV0ExTFliYmRrYW5FZHFzNGV3cDlvY3NLUlpuRzdVRDd4RDRIQlVoejRxaHlheXJVUFpnelpLVE5tejc4Z1c2QThBQTZhalIgWDh4b2VGdXVXbFZYRSt5NkhTYnVzaTFFK3AwaXErNDJudXIzeHdZR1JrVDJSUFd5RGdEYlU5RGd6RVlZaGkrY3ZEdDJ1MzgvOWZQOSBVL01SMlJ0ekR0dEpDM0pBd0s5a3BFY3c3SjViaHNWaVYxZUdQcmVuME5raGgyQXhWZk1JQ05NSmpHbDgvWkRac0cvZTU4K0F3K3ZtIDBQc21ydUNxQlNHUzBxM1NEMVNyeEFFU1gyd3lmdEM3dFZWTkdONGZERGc0VGZCOHdzbzVEck1ZVXE5bVdlRTdJY0FiQitoL3ordmIgVU5JWWxTSHkwZ1JQNUpJWXROR3pua1ZuVmdjNEMxdHJ2cENTTVNTeHVxQytCVWE5MGFjRG5ia1ZIcytjY2FGMkNSYnpCYWxNckdLNyAzQWJyMWNHMXhNcjRsRGo4bEtQbjN6OGJkazNGUG1mTU9UNlA3eEdDV1BLUDEra25OZ0FjK0FmdjY5S0krWkZrR0dqaDlicE5JcmFTIDIwZGttS2ZMVExrcVdaWXdHR3ZodzlrR0VOd0lHSng3bHFyaU1abndwd2JtMVhZNDRnRDZEejRCdjRDeFR3UUthTGRSRkF4U2xoVmQgcWhzR1pUZGhXQUhxdFhYa01vNVJDbGpRMDljc2hFdUN5REk1OE9OeEE4anA0eDUrOGpBWnMyYkIrQXg4QnNCK0hqdmo1ZDBPNWtPdCBLVEduaFY1RGJEMUVOVEtueEVOV2l4SlQ0SEgycDNJbU1uY0Nub05sdUduaXErRE0xWG9ieTgxVWtoT2NIMEczUUhQZ0FESHBaL2tqIGtYdVNUYXhPVXFFN2xnL3h5UjNqUVBkZDN3Rm81TWpabldWWkRjelBuSnhXSU5GUlh6N1c1NC9OZm1CcitRSHJTWUhsSGx1eUVNcFggcnNXWHlSNVhFaCtHbHY1TndtSjh5WVloODhlSHh3UGZNSjFCVjVUYzZQQ0pKczRmQVAyQy9pL0FEL1hIYkNkY2prdDAvUTdrU3BQTyBESWcxaGFBNDBqWHBtSzBDWHhvbUw0Y3dIY0h5RzRCL244dFZWc21qVmVWUmhod0liL1lEL3dCK3dYejRBUHk3MFMxeGZoODNaRFNHIG0ySDI5K0dCTU1NdzlLWVUxWDNBT3Rodzh3d25tRWJjRkk0dUl6eTBibThuSFpKNXovWDc4L0g5L1B5UmdVamxBOW5TbWgyU1R5NW4gUm5nZytLcEJoY0pMbFEzTWx0dy9uRTlraHNBZXhwNitCUjVpeXNib01HZnNaejNZQUQ5eUQ5VkpGRk5xQnFKZjZFckdOUFBxYkxRRiA4djhBNlU4aTQ0L2NUZkZHTk5JdWptMGtjYUNHVkVqZFVHRnhpV0tiRStiRzVER3dQR0lVam5Ld0hvK24vU2ZiVFpFb2NvSEc1ejR0IGttRU9Temg3dlc1UnAzNnVmNnc1Sk1aWERuQUc4S3pxdGJKakJkWDdaN094dndDQ2YrZ256L1RPUngraytncmdTWXJrN2Y0SVlhL3QgaS9hbW9yVFBTTzFpKzB0b0ovTUZ0RDRlSFQ0WU44VDN3SE1Kck5vSWp5aldvay8rUDFGamdmd1ByOUZYeVJRZEJYWUJQQmlUL3FjVCBJZW5pdlNHU0hWNGpJQmlscFI0TzRRL3VCZ092dzJybUZhVFRDS1RGOTN4aU9iZHF1Qm4vQU8vbndIdGQ2cUdBWFlOWnFvdXBheGpPIDFhTlZrYmhuV292MmJjRnlIaXptVVpIQ1lIcCs0SHdPd0liVnBhWHdQazNrcUxXWG52WmFJVGo1L1lOZ1A5b3V0VWtqbG1ScDBrU1IgSTNZUmR1M2VWTEViYmF2bkkwMmRMd3VQT2RJMkRBN1NacGhuRklOeE8rU0dKY2gyWlZtVytQQi94V0t1MllEcTg4K2FkVEw0cWphbCBwc2t0MGlqdmx6U0lrT3hqeW5YTmpJYzlicmUxTFRNQng4T2RaZGdiSE1KNEZGY1lqZytFbTkvUVFIUGo2RGJyOEFnYW5xT3E5T2VwIFFiU3lha2t0WUN1U0pXRU8wOXA4ZTJBL0E3Tml1VnFEMXVuekVUamRnVnYybGNIeXVYemt4UVh0bXlZZnFmOEFQN0IwL1NPWm81VFEgbXBSV1o1bW9heU5UV2MzMWxXK211dlhGZW1nVTFUOVBJd0RoZ3lQVEl0NFRKc0RGOEljM1JtakI2UnQ2Q09xT3dZdndEbjUvRERxdSBGdUI2ZnFwTGR1T2dlTm1RN3Y4QXppZTRNRXhvRjdXZU1NQ2Y4eFBoaHQ0ZU1VOVNya01UV2QwOTNqWkRld1llMzM3Z0FDMVpYeW9NIE1YWkN4WENRWTF5ajIyTi9jS1BnYzlVSThHZ2RlelR5eVpxWXByQ2J3V3dSZ01xeEJCc1hiY0N1Yng1Y3lhVU9XRlZWK3VHbmhPdC8gbjlzZHpyZ2NNV1E5VjY2ZTJmamNQVEdIbVZ2UG1OVGF2bitTYzVwdTBOendONzJqbi9vSi9nUG42ZEE3TUZ0c1BPREpwZzJ5QzNZSyBKam1NNGdrUTdRdENwM0tLeVhCdkZKR0U4d1FxdXF6eWVlYXpDeVRLRk1TWnpaRFp6M0FIL2Z3UFJVRGJDRVN5Rld3YzJ5UDhBOFlyIGRUa0tzTm9pVEdnQzJXTUJNTUlmNGJJb0o3Qk00aVFzdEg0MFRGN3B2bTltem5BVC9BVUUvaDArR1NSZERsVWR0TzY0NEVrbHlscVYgOGg3NHNJZXdoeFZYMkVMY2pCQzFJZFZwOVBoeUV6NS9MUWUyVkFVb2NZcy9kdkF2d0IrUDlSVzJrR0lzeU9pUm9lMUZ1OGk4dE5qNSBGRERtanlENU9SVWRvYldraGhmSWc1TzJHR09FZExsZk45NHhvV1RmQmVZMHI2cktDM2pUSTdoMUpxemJVVXE5a01pSFU3dlVGUzFLIGtQamtoMkJXOWJ6UzdnNFlMYzRGcVErQ3RsQ1l2YzFuaEpzSWpuei9BSURmK2ZkVTZvZU9IY2loNUR1bHFiZUJ2aTA3bUs5cjFmbGggd01vdGQrenA4eUd0M3dId0h1SCsrRS9GNVYwUGsyeVdpN2d3QURZQUFBK2Y5dXlzM1N1OG94YzEwbmp6SmFtb0tZU1lWZFBwK3B4TSB6Rk4rTFRkVmtLMzVnNFdReU1CaTR0UEEvVHhWYjRNKzBMUEJ3aVNrbzU4QjREd0dIVE9qaGw5M1pLOUZwaklPZkNrd0pMVDdPVHpJIG5oc3FKWTEzOFBaSmdjTytNaS9EQm5rNVNuQjlQVE5WNzQ4NzVzaHZuK0FEL3Z3QzR6S0ZDUzRGNUNHWm8wMmthUVZteW96R09QT3ggWWtuWGtjRnFOQUZqSmVWR2RzY1ZDTTJiN2ZHMmthMHQ0ZDJSNHNrY0N1V29uMlEwUUt2ckhLVjMxdHV3cE1xNWdZYkNBNFZrNE9WUyA2V2hkU3pDQzI0VnZNVDF0Z0QyTkFyK2YvVXo0cnJPQU1Jay9mdGcvZnovSUY2cmxCYlE4ZktBcExKY0dhNFJ1NUZQc2xiaVRDSTBGIG5LVWhrRStHaGh3OE54ZkRnSWVodkcyRXhiUTg3NXpiWXdHd1lnVUh6NkN3bHV0N0FzZlQzV0xIbFUrUzdjTlZ4MTdWNlRrMGZiQWEgTGNiREZzWjljTzZpZmRsYjhnV3dkMC9hdkppOEdkRkJtMG53RDhBZnVBK0E2Q1hTczQ5ZkhPMzJTeURUR1ZXNkFrR0tmczVvckhuZyB1MkVQZUNFUDRiaDh3ZVlybStGNDg4T0RNc3E1UlkyTTV2WncrQUFIL29MOGY2VkRDcGQ4UWliYVo5aUVaVVZGRXF6eEg4Z3h5U1ZaIEJBN2JjZTljejc1MGpkajVxdkF5YktWdm5tU1IvTnFGdHNyRmFkekVNemNtbnVWVXI1VXJKRmJ5VVNRMUxaaXZWc29DTEhsZitjRGggMCtIQ0lUQWR0TURhRG00REt2S2NsUjdSMlR6L0FPdmFJL2oxU2ZNSWFmNmJzdzlWUXVaak11bERRTDVrV0ZWWWRzRGdaVVN4Z01PdyBBOE9IYWpKTVgyUzFKNURUVEJXeGpNcnE2TU10VEEyY3hBZmwxK1FRSDJDMTBOa3BkanNDd3cxbDNsSkpXL0Q0OFlxVXdyc08xNDJhICtQamdRbUxZZXlPTjhENGx3SUdIUmtZcHdZWWpoRWtJajkzZGcvcjdEcnlTdHloODFjZUR6bFplZEdXM3l2WDl0a05VTm8vMm01QWIgSTQySGh2aGh3SVRLNW51TTlxWkVaWmZQczNDY1AzLy9BS0g4T3JnTFR0T0k4MC9pWHZpbGp6a1lOdGhOeFk4a2t4WXBJdCtEYURpdyBuclR4d3NVU1JKTThHV1d5Y05zdGtNT1BjQU9UeFk2OWFkSm4vRmMwOGFkRSt3VTlEZmRjTkcray9ialE3Tk5jcU5lNk56NllEWmk0IGRaSGZGVUREcXJqRzBpQ0hyWVZjRFpjdGdqN2xuemhVN056dlY2Y1BYNk1uS3pxbTFoSFF0ZkZSaWZPWTZYUXA0Z0RCelp5dDZMVGIgbEJPaXlUT2RNUDhBcUwxYktWWFdTcE9WYk4vb0sraHpYMnBRTEhGTDBTV0VtcXJKVDFCRmVEQ2haMW5rMG11THNVMThLSVdPS2JPbCBiRmJGTGxzaTZCb0doZkhBdmhzZXF4UkZ3dkZGRjVlYUFGKzNwcTZlREZpNm9OVzl0VmhxdVc2a29qdUZwNWxWOEJ6ZE9GYVE1TmNxIFpNL0RJUGNTcTRZaERQdUlTcHJSdWczQ3haM3hDdDhYdmVPS1B2d0VEaGhpZkE5Y2RSbExFelV2VDNVdThYSFFOUzkvcXkxQVoxWU0gRXBib2NYWHJrbWgxOVBjTGhRN1VyY2VYdUxiOFlMSnVlNkkyK0pJUTNodjc5c0cvbndIVHNoNmc2enRwTHM2dEczT1c2clEycTJsUCBVUXlaTzB1RFJUZW5zV2h3OEdUNGRicDh3Z0hzYXRHRGc0amsyQlFtVHdOdTMrZFJjQkFiL2owa3loQndWM0JWZHdPbnRiR2hzNWJ3IHNoMlZFOTNNUkQxT0NudnVnNFEwK3lFTnd1QXhCZ0wvQUJVd01zeStNVmw1QjBtN1ZkMkRBSHdGUkFEL0FPWFRlUFRKSWlpT1kwalAgRnB0UWM5USsxRHBvMkVpc0RMTDdWSXpsT0daQytTU0s3cnh0SVhSNWNva2wxY2NrdTJjODhTcVF5UVJtc1dzS3ErUlo2Z1V1a3o1UyBzNzRVdCtmekNhK1NiRFQyUmJIc01PejNLd25LbStZWEFodmwySWI0d1RKd0VlQlZiSVppZG9QaE1tY05oTjg4L1VJQS9VVDgvZFdEIHN0REVMbGRCODFaaVlXU01UNVZmVS9DQXUrbzZIRTFBcVRPcnFFQjhoV1BpblRJR05QTnRZUGJzSXdaYWN0RkdLV29FQzBxYllBUUQgQmV0ekgvbFFGWHF2SVdKZnRtYWozSE5kbzFidmN4allMWEpKMk5zaDA2VzJPU3RWYS9ocUVyZGJpVnVSWlVpQ3dJY0dZc3JOWUZSdCBtQTByVkVrbkQ0QStmeGZqOXU5S3hvMUUzSXVWdFRJdVVOb3FIYlZQcmRlNlJ4dGVvNm5Ncm03cTlRMWRiVHc4T0hxRUR6TEEvbzk4IG5XcCs2STNCL05neit3SDBEWU1kZ1pOeEhwNVJQQ2lhalVuRU0vZTJRUUdGa29iTWpFRGJteWZDbTlOcjRxUDA1WFNTSjg5TkNya24gdGo5SVZ1TEp6dXhybGNzV0taQXA2Z3JwdEZIZ1BYMGViamVkWTFLSHpiSStXUE1PREE3NzlhQW5HS3RyNWdPSHBQaC93K0lqd0p4dyBXYk1hTnpadjg3VS9mOWcvZnp5bjdjektIYUtZdjJBZVNiQ2xPeVMySytvU1lPYkxVdG9DdlZ6RVcveW9IMUlmTVg5OFVyQWdUdnMzIEtGa1ljN29oTmd3ZmtIRS9qejdyc09IRU9wUlpLaDIxUG9ISmxUSktRUjBvcmNlN29kakZXRkRzYXQ5NFQ2VHNpdDNCUGhWeTJqeDcgVVpaa1pvS0V4bFZ1d1M3UHZ3QUFmNTlqMHE0WWRMc1p3R3NiSHA3ZGdLNVQ5YjFsVitkWWRnUzdnQWk2bjM2WXZKKzhha0szaHArQSBTQVBiYlVNTXhQaTRzbUROaE9jUDNBUUdJQUJqMG9KOVJZVlppaXV5V2tYODEwMm1lQ2ZNMUhKSWhmTGJhOW9MWE5nbU8yVVZYaE1rIGlLNnN6U2lPTytIU1dLV0NQY2N4czZNcXVOck1NUzJRQkc3UXpIU3RDZzBEY2wyU1pqUWtteXlzTkF0RFl0cTFTaVh5VkQyZFBxdHcgcFB3OXhlNmtEY0NlMThHSm5BZ1RmTWQvUGdOL0FiK051Z2NSWXhBeFFWZ3RTazdMamdFTEVLZm1SeEpoWGFGNW9sQjJCYkRvZHFRNCBiQUhzWjhjTzNOYmpCbFlGQmd0SFNkOE9IOGJkL2Z6NzkwYktDV3dWcGhNWTJPaDBoSXNaOEcyYThOVU92NzVtdVJRU3J2c1B0V3RMIGQySWJJdnpFZEQrZWNUKzVuUEdZbi9FTzdjSC9BSC9ZTi8yQmduR0ROZDlQYjVMcGFtVnQzemJtdU5JcjkyeVUrSkR1UzBGT3J3QWYgbUJneFQ5cUp6Z0huY2ZzdFVUeWFOYURRc293Tko3Smd3Qjgvd0UvNTkrZUh3bFdKQmpoT1lTMTNuZU5NUlFxcVBGbno1NkdPTldrYSB5alpKa01HeXh3dzRQQTkyWEIvUjQ1NEVJK1pWNlJTOVlaUjZ5SkpsdEFoQzJuZUdIMC9sbVJvVjRqNUZUeUVPcTBPdDNBeFlDM083IEgyWnhzblppdmFGRzIvd25lemg4QXdiQSsvZmdEVVQ0OHlncndXN3VLSWR0VzAwT0J0ZWp6QTlYdFllMm5JVEZUUTdCWkVQK1RmR0MgSkJRN2dBZ3c2eU1mTUxMR1dvRXRFMjhBQUdBQUJqN256NHBEek5LOFdxMCtBQXBpL3FaVFhhcmw0T3lPRmZ4SWRqZ1ZQWDBtcDdCWiBCaXE1a013UUQwN0FyOENEY081alEwTXpOZ2IyVERZRUVBZ245L1lENitYeGRvTGlmWkNRNGtsdFZQV2NwVEtlZkJxZUpNSGtPSkZsIHpFK3lLM2ZFT1lZWUE1dzk4ODVNR0ZOMFdTWnc0RXE1SFFRR0w4dnI1L2Y4YzdaekxLNVRGMlRCbldMWmtPUURFbytUMWhHc2prVWMgc0FPTHNWdFJvWVVEb3FLZ2pqVkhpbHR4aVZVbU56am1ib3Q0eE5CdWFkbW95NjZEZDc0dXpLVWc5bzJScG8xWE50T0lENEJlSmY4QSBENGhwR29LMmxzZ0hROVpsd2U5ZlEvci9BUE9ETHl4ZkViZlBObzc4ZlBnRUh3R0I5R3lEalkwYXZMSXZoOG8wYnBYVjBOU1hyZ00xIDZybG9pR3I0SGsyaUsvRFE3SHA5a1hFOWJCOGZQUEFkNUtmZWZOcFBPVjkrQWdUK1BnTU9PRzBabFMxM0R0KzFRNmlCaW9iK0pIekYgc1BFWkxHS2NvS1BnOWt1QkNwKzdFTmdNSEZKZmJUYWZ0aXVMSmpEbFhCTzZnRGord2IrL1AzVCtjNWlmRjB2MTVWL2JHMFlabXNhYyBiTFlXNjNJWEhXOW9JZjhBRGtldFJQWTBPN0ZzdW44a3JpbGlBRUVZck5tZkJiTU1xczJrNGYwQ2duOS9BQU9pajI0Mmlpd21rM3BJIHd6WmJsU0NTS1I1S29WbVlsR04vdkkxUll5dEtMYVJCaHdtWnFrTkJVQjV2Q2paNDhqZ2ZLbEJpNDlsZzYzcXJLTWJiYjRFYXZMNEYgVlIzZXQrR2lZdGpROE40ZklhZXlMN0tEclR0bzFJZFoxbVVHZHpBZXlKTy80QUQ0QS9pQUFIK3hYa0w2WklaRE9uaERxNndsMVZXMyBjZ1NyMjJmUEFZaFMwSmxnQjYzdURSblE0Y2V0ZzZsSFV0QnJaWkdXaGNveis5dkcvd0RzL0gwRUIwWU9DTzRPd01iUHE1d1pFK3lsIHNhNzNnMVhZdnU2ZUxRN1pmU2o1WDliMlIyZkQzQVArRFA4QW52QmhaS05DdVRKbzd2YUlRSHNCK29jSDQvMUkxUERYUDRTSWJSYUMgRTJWVzJMWkpySHZjMU9WRVN1bWlxSXdGUGdHR1crS0hlNFo5YXNac256am5HR2E0NmNlU242KytPR0svZ0F3Zm1EMU1ZTWlQUExPMCAyY2pHT0tPSEhWcTcwMnpHTnhxa21rM0hVZmR5T01MWVFwM1lvb0R0NXd4N3p6eWd4aUFXWkxZcDIrVitEZjZybGZMZHVWR0dqalNtIFZhaWxrdEdJUnNIMkVxaDNlR2VWNlJ4VjRmekE0ZHdNTWcvWTdMSDJXOEIyWm1WeWlNemIyYkNZSDMvWUQ0Qit4eDZjRXkxQ2p1aC8gNFN2VDZreVdnSFpQajNsZGkrajRXTlYrd2krUGg1aTI0UXpCREVHaHNEYkJEb3d4REZzeXlEMlIyL1lOZ1A4QWdPaHRUcnRiYUxFYSBqVGN5V1FxbExyMDN4TFFTZG5ZVnNXVXB5TGFDR1FtVlcrR0hCdzRlalQ2UFBJNWhHUnJrVjJaWmVMUkNmNysvWUVGZzY0eFpWa2FGIGZKZDBOa04weTBXcEdscjRlcGFIWVliNGhOaFNrYmdJQjJRUEREbUxCWk1JRGg4NWJXZHI3bWViTlZjY1FUK1AzN3Badzc0d3FNNCsgbnpSWkxraU0yWVhjWER0L2pZcjNVOU40cmxpYnNhcE9VZEltZVJCSVJjYjRZRXZDMWk1RXlvTlhwNWVHem9JMkhVWkF5cjVPVm1nUyBXZFlLVHl5UU55US8rbzN4V2hiSVRmbVdReXcwL0FINEZIWkdhczJqN09DQ2JKK24wSHovQUxuazFic1JvcU5iZ1BtZFVxSldpZUZFIHlLcld4OFJibEp2ZTRwTVQzQXhNMDlzamVRWkhoRFlKN3hWYXl6UG1PNWd3bjNnK0E4QjlnNjBtQ2hCM3RBUFhNV3Q1T205OFBWZEUgYUllZFlCYVllS0ZtaVZNSU1qNCt6VEswdmh6a0JQYlp6SVRKaTBONldmQ0JQWis1OGc0YkFBNm5yRXVnV1pzR3ZNcW9OUGRYYWV6SyAzVXJDMFdyWHp4WVhLUUphNUtiY0dFUERjRnRrWkNEaEI3WFcwYzR5VGFCYjBUUnpidHNmQVg3K3Z0L2Zvd1lNU1Jta0ZDSk5uY3hqIElCV0pXekZ5ZHB3V3ZVNTVYRGtZRkJHQVpVK3Bkb0oza2JGTnRNZldtYWpVRWVSM1k2NzhrNzF4NVVyUVFXM3laYlV0anV3YWVub2EgVEV0aHd2aVEyT0RrVWE5K1ExOWJtTGJKVmNNY3lRWjlnS1gwYmxDR3pES3J1d0lFQm4vQVlZSUovd0J5U0hTZW5OY3NWMnNFRnFXSiBJZGw2ZXlURGRIYkcrRjRPVUF0a3F1YTNYNFpoa21iT25oL244OGdzaE1ZaDduVUR3N0pQbi92M2dQMGMxbHVuZjIzTEMxU25nTGErIHo3NDNXcjlSUTJuMU95RmNDN2dZcTJRcXVHSE1MY3hnRHF2SDFGVld4bTZDeGpOdmU5OCtBUHo4QTRDZndQb2NmVStZcmgxVnBuNmUgeVRKQXRwQTdUMFBZVlB5OGE1UENaVVY4VHpFUENHWm1jdzRHUTdWVExNV1NoU29GazUrVVFkUkgrQW56L0lNT21qY2pYY0N2SElFWSB4bzZFVHJIR1V4akVGOTJPUkJiY1g0R1BRb3l5UFMyTnRFRHMwMjZqU2M1U08rQ2JPZERGY1h1ajNkdk51dFJFeUdMc3gyY3I0dHBTIHp1MWNudFBNUTlON1p1aWFrSWJSRHI4eFcvWit5SWRmdm5QR0NmM0laaG5GMmFzM2gyN1hXb2Z3dDBBQVFQdndDdCtuTmtzRFNyYmsgT0F4M05KRzVWQWpST3BCd2xvRXVIUS9lT0lMREQxc1BhZ2RrdUFleVVEWmR3QVVkOEdEQ2lIeG4vUk1HL2JEOWd3My9BSzQ2dlQ2YiBTQVYvSHFWdUNpcVRpWEE3TU5mV0VoMWVKbUs3UlU4VlhtVTgrSVFleUZ1N0Y5a3RUajg4NS9RYXVqZXdRSWJSL3dBdTgrMzkrUVVHIFhkTzM5bDVDcXB6OUs2U1pnVnZhRnJtTHN1YW43akwyZzBNSUdJdDRtRU5sV2c1Z2N5QkQ5SVBzNWJXWGpuaU10ZmRrbEhQY0JQcjUgOSt4QUFLbGlTVkZTUjBLRHlFT2QyRURXZTNHNDJrUVZaN3kzMlUxd2hveUpJVVF1S0pMeUZOdU1ZNXVCZzJkV0xIYi9BS202NmpyZyBaQjZsWUI0QytXMDJ3M3h3TmlVLytKWkh0aTFISlhzSXBiVnFNTDVUNzR0ekRBNWtxdnRkQVZXVjVacXZRMFpadzN0SkI3QWZQbjM3IG4zVE9WM2hQREp4TFVFaHF1a3RxS0ROUENSWDdzTlIySGE3YXBFQ0xRaUg4UW04TWpKUjRldUh4UHN5dVE2eXpQaUdzakxVZHRQRm8gdkg2QVA5L0h3OG9Zck9xbDhPK1JjNm5CdVUxSUVRaGVXY2oxT3lOQUduTGFLR0hDWkRUbnlHK0VHOUhReDlhUENHOHJQOFJsWnJPRCBza20zallIN2dKLytvQWtmRGJLcHpIWlNYSHlRQnJuY25jZk5KVWZMbVdOS1laVDRIVDdzRDZ0ZU4yb0FobkFJK3k0TElNck1wVnl5IGpJOVhPMW9vNEFBQVA3Lysvd0FKY3Fpb1BZaXFUK2F4QVA2OEhqbmkrZWxJRkN1N2kwWEhJMzdiUEhIemRWLzIrZW53dmh3OVFWV04gL2h5K1BZV1ZuTmx4cTJUbkQyeHdWd1JhcFFLZW5tYWZjRU53c2hnTUE1NUJ0Ui92TlhxOVpqTmtTY0RuZ0Y5QlAvUWFqcmUwQzdRYiBmaFdYS0FFc1o0ZU4zQVE2OVlDMHdvQVhpamtIVC9zWWVIeUJrZ3o2L2ZBUWNaOW9Sc044Ti84QVRERUFmMkFBOGRPYW5YYVlVTVY4IHBFN0lTZFNMdFpERFQ0RndzajV0dFNsTURGNC9zNmZRK250YklNazRDd1BsY3ZpTmpxTEZ2Sk01ZG5Oamg4L1VSOCtBd1BuK2tFdU8gaWZGSHRRRUM3U2x1eTF0dDRPN1ZLNGQ0S1JBMVBjaXUrTDZmOHkxSWJJT3NnR2ZUd0tvSDNNV0xzell6ZmUxSHZ3K2dnQUhBUUNDLyBSeFdUQVNCMnhhTkhURE9Qd3Joc21xK2JGR3VCWnZpMVgyRVNiZW1hOFd4enhyQytMVzdzZkk0SHpkOUVpV1VzQklLT3l0WE9kOE9CIHFLcTZZcjNuWGdkMzg5dGJSdDZHeUI5bmNQaHRSNndKK3pMTHkrSzR6MjVzazdBQUFZc0dQZ0Q3Q3Fjb2xMaXVxeXRVdW0vdndCbVYgSzJWZlE5U29IRDR0WDJGWXdzd3dPSEwzeGtjQ0hnYkJVZ2U1L1EzbitpZGo1Qit1d2RRTHBiRGd4NmhFTmp5aVJzTVpaQW5lQmtHQiA1bFA3RFdWY2kxdGZXK05wOWtCdVNITGFyN3M2dHZObVk3bU1CdTJ5bkg0QXZvUFB0L0E5WklUMWRqM2dVVVBET1cvSllYbFBzS3IwIGZpL2Mwb2h1TEFIaHpBNWd3UWgyTXBEK0tCMWw1NVF6RFBDYjVzSHRzRy85REdHZU9FekxzdTZhZlVsUGZqbGwyWlVsMS9peEh6MjggZE5tMjFtbVdGOTZwM2hqT09HNFlnZ0xlNXNiekhIZFg1cXlFL3B2S1dKWUttdDFLZWF0Z1hBNFNXdm5vY2pqY1hUbnA3YVUxd3I5RCBRN2dzamVDQmlDUHI4OHFtQ2JNVUtZb3h3MkVkdUFuOS9BQU4vQUFIWkhGanVOalNtVloxZ2N0QXFVUWZaQzNZQW1ueGNwc2l5b1krIEhXK0dudVpWZkpHbzlSNmtxMlIzZnRHci9CaEVsMnc4QWdnTi9QZ0Q2WnRtUlhiUVlEejR0aFNWdGpTVktJbnVDVElMR0ZjWFh1NjcgZkNodzVzUG1CZzQycCsrY1orK1BPeGhBbG84QjJEQkJ4L2Y3VU9QeUVQUjJlVnpPQ0JRSmtPcENkVEdrVlZjRjZJZXRDV0xLUTJBTSB0dzYzK0d2dmh5eXg3YlBoczNLRmNtc2d3Z1Q2Q0FQL0FML2hoMHlhQ2R0cDRkTENzTTh6UWtxdFNmWnZNa3YyYnR4Mk1UV0M4a0hwIFVjc2NTTWpPNW1pUXZLVWJES2loVUVkOWVHbzJlU2VEZlI1b3JyKzlMNFlMQ3pUSWNiV0thMUVraG9yRlV6MkZQUFJiQ1Y5UU1NZ1ogOHdZc2doRGVHMndIdWN0ckROUTdTOG95UFYzZ3dBREhZRDc2QUFkSjl3VTQ3T1FNWnA2alFpSGNHVHdqYmx1K040Y3BVU0xTSzM4TyBKeVJrTUo3SlhQTVVPQW5vMVo0aTNuWTBrM1Nad0FnbjBIZi9BTDhnMVhUNnpGMW5tS3ZjR0diVDR0aGpWNnYyVE9wY3QvOEFlYTArIGxGdGZaVENmRFcyVWdZcXM4UStkTXN3WWh2anlNZVB1d05CQVlnQUhnZW45SXVnMmtNZmN0TkdvQmpLemdqYlgrTlYyQmJESTVKb2wgeVY3SUlKOE5ibVVuREhyYzVTcStmT2gxQXpDaWpPekhBbU4ySS9BZWZiQnY0RG9ZanFZbWxkVnRKblY5TzhCemtTQXh4Uk9BMUxnWiB4RWhCbzBWcWpWazN3ZFZoS3ZBL09RZGZGbENPYkYrRCtLc2ZucnpBMWgzcnEzYXJrenBqMktWcWZOeFZrRGtZVjdwRlU2T2kxZUNqIFR2VEtQZXIxRlZLWFlNb3JYbGhFNTVtY1ZjMG8zakZMd1owM0pLVEJ3M0V4NklFZk92YUZWMTZoa3VVNVpvZ2phdGVaRG00em5uTXIgYWhyNnJ5cDZ3ci8wbXhRYU9OV2w1SXZKS1o3Qkhlallod2t6blNwaytLSEtaaGZjbDBRSUN5WWNESnpyVW8weUtpRFRmMmxTSWlqTyBhWE9sVlIzWkZqa2FOMnhObnlhNlh2YW55MnIwenR3V2RYUUt4NEpJQ3hLb0JyZ0FBVVR4MGoyRmZYcXRydW5yZlVnUXlKWXpaa2FvIE0rQTFldkp6UFNaVENGTSt1bjNaZktBaVVQTmhrR0dhWm1PQnBiWWU1OHF3b25wcm5PeXF2V29xM1h1WDZscjEzczB3NmVxMTFSZjggVXpVSnAvdHdHSWtJNmd3NmpVS1JKUkUydWFqT09tUXNWZFVCNE93dXViVktVbWh5WjNFaTRUc1Q4WWVGRXFydEZnQzRMMnNNMFBMbSA1TS9PczY1ZXNkeEhJNGRnNnBDRmNNUXdGdndHdXdQMERYUXhBQ1JhQUY2cXpYRm44bjkvdnJ6eXZobkthWDZ0MHYyVFNQcEdLVmlYIEYvd3ZnRjgyRTV6Z29oeUxuMjNWQ3p1S3hjSUxOeVhtRXlDTWhDTUFGUlhGaEU3SUY1WXhTamdCL3JXY0JjajVXZEp0L2QyaytrajkgNjRXdmdxUmc3QTBOTFVjUENoVVVWbUtjcGc5VDNsQjVoNGV1R1JoZUNzbENaK1BDc01qbktlQUxMa09vK0hqNmNuTFZNdjFLdVpuVyBkYW9pZi9VeWxuQjlMcVE2MzJ1TGc0WmZERGs4RUVjbnJZNkkzOWpTc3lxelJ6YVhiWXFDMGVXZVdCSXRjcUdXTlhRdndPcWZaeW9oIHRXa3QyYThhOVRWMGtuZzRyT25ZcVl6UEI1aWVaYnhnVWtYOWFtVnladVl4TFlmMWxBb2dwNkZJTWFoSjJaT0d3OHlZdnkvUmtlbkwgd0dxMGd0OXYvd0RFQXRXZ3N5NExsckdzL1RwNXE1cm5BYVdzQXBXY1V5OStoeVczZGFzQXFQQitqQUxuTjlmTzV6MXRWZGtJNG1MRyBVSjRvQU9Gd2N0ZEN3UW1YbldkR3BPMk9UeEhLdzU4TXVHTEQvTXRuRStSWm85WVNBUEFBNFh3SytCMWZnT2pabVFtLzhXRExlWEZ1IHV4aDBYeTc4dGVoblM4TTFkc2c4dXZzUXM1SXpVZG1qQzY1NlVpZGpaUTllQWxuVWZscU1RWmxNb1VRYlRJU2ZKR1FNSTlZZE1GL3QgaG1vNmplczhNdFF6dW9GbUxLYnppSTVRSWlRVWtTeFhPbFpsZnB1UVBhSS9xVWE3TDVIcnpqSlpBRVp1U241eEhQekJrUUxDVHNmUSByZWpPczZXN3UwK3B5Wm1xZDZ5WW1ycTZzbXZBL3dDbld1TlZXTk1WQzNkNGdDK1U4MTU4bi9xZXZ4QlFoT2JRRm01L3BuSElvc0NlIFFKa0paaEV2VkNYdlE4MXBaTmUxU0J0dVBHalpXWE5EMnlSVmZWbjVUWTZyeEFOT2JzWnhFY3daYzVjSVRBV2N3VWl0Rmx1dDIxTW8gbjZqWHdtVFRyWlJYMXdNVHhVbGtDQ0JCVUZxbzdNRlNEOGt3UjljTldnbDJxWXRCREU0c0FpRldxWE5uQ2lPSzFYMldtNTFuVGZFVSBqajNMaGkzM0xZNW8rUmRDNlBQejFVLzhoLzIvL0RyajA4VjJHdWJUL2RUb3l5aUFqMHE0VFQxQUhKeWw2QklKQ3pvMXlLTHU5bnZRIFJXUFFLa1I1dnFBK21jVFVGUE16TTdEMWpWV2ZoNjUvcUxOWWhkYVF5VHNRemwxcHBmVHJjRUFsc29aZDFjQTN5Rnc2Rmk1NllETEcgQ1ZUSmhUMGd3bzdhODc0QkFWWVhyOWMrQWNJRzQ4L09VRkNQTzlNa1RrSHhqRG5XZFU1UDArcTVQOHgvOGdmK09scDdsLzIvOEoxNiBkclM3QXhiTEtGQmMwaXAraUNuYStteU5tckpPYkNqZWc1V2l0V1RnaWY4QU11eXM2Y24rdGRXSGU0WFo1Rm9YcVhNYTl5SEhQRXNHIENwalBCQ3MyTlRmUGk0MVQvd0FCL1Nqck5YNTV3aGFMdzQyd1d6MXBoWTJBblZLdjYyakl0TEpPUkVXdi9RVGlqbERKbjVkY3J1VG4gU2crZmtGOFlHWWJEN25zakFYR3k4NnpwRUFCa2pzWDZxSG44aTZQK28vUFZ0N0pQM0d3UDdCcXdmMGZrZFZjcWw2TU8vcXhSaG5wOSBGYUFJRk5hVkxCWGNLMUlNQWNvcXRGeVViVzFPWEo2d3hzMGFZUzhoY3RDdkhZbXZzU0VmbUc2L0ZSb0liQktWbFQwajhQVG0yY3BVIFBNMUZCS0pzQzVuR3lITTFuMS9YMWx6dlRqWkRzdStrbXlXUkRNT0xqNnlSVlNPQUdlWmx6bWxaaUhROHpOUDRtMHNqS2xaeUtYV2YgOEFWZ016ck90T3BBU0tCMUFWdHBVeVhoc0hZWkpZbzR0UXlXNmFoWU5EcE9tSk1tcHNrK3Q4bS9PTitmejg5VXl0SExKcnI3YkdueSBPeU1lZldrYklSNWNlRDZTT0FRNWt5eTlRdVY3WkVuTGFWUElYV0hEMWhIcFJBWWpmUmlReHlKSVVkRkZzR1VjOU1hSm5SN282bTlZIGx4M2pTdyt6cGZxVWEyZjdYWHJsclY3YzZyVllJQnhNcWFucFN3c1RDRDZYUTE2MlZ3Z2NpSzZia2NTeitrZWVpeGlLeVpkd2NlUEIganNYcDlVRE9zNlZJQjlYRWE1RjBma2Z4ZUQ4ZFBqNTBPcXZtdHB4K25VUGl3L0RMWnhieUxORWRKai9oeE1icnExMG8zRVJlYkVzWiBJWXRPdGJXNElyWnJxQjZaVUppanhTeENoY3Nqa0daa2NqUGpsaFJZZllyQ05hbFBOaVpTUllIcHl3eGl4bGx1WndnMDlIYkdkWDhxIGlodXRZblh6ODd4aTJrYTFyQXlxL0lHK0hNbnBhY21ZMWFac2ovbXNjTWFUNWkyZkt3Ty9UbG1nMm9RRlhYRmV6QnFmZ0JZaDJTdFEgOHIxNTFuU3RQMzZQVTU5L3IvZjNlYnZ6Zm1oZjVycHVvSmpuVXhreGszZUhiNDI2OXRmazliODJkYmJEWW8vT1o5UWx1TkV4cXFTcSB2UXd6ajJYVjg2U2VQUlIrcWw1SHVUTmgyMHk0N2t6d1N4dHJoK3JNZFk3RUdMaFdzaU1Zd3ByS0VxSHFXckdhU2FhVnRSR3FpdzY1IHNMUGx4aEt5VzAxZWdVWFJ4S1pYelBGRmFtVlJqekdaV2dHazlVRVpvRklyOWNUb05mVkNqckdVRFUwaXZpcktzN09VanNCTE56czYgenFSQUJZZ0FBTzd4eDhwMHB2OEFpblB5Y2JQeWVla0pPcVpVT2ltQ25TdnBteTFPdklMcTlqZjFnWkdjWG12Z0VycUFuQWp3dUtQeSBGVFBVb05oTGVNcjFMdzFiRlEzQ0thSlpsbmM4TXdsa3d2UUZaVUt2ak5KR2wyWk5hbk5tTDNEb2gxMzI4d0gyblBWeTV3TVYwYWs3IElTcWRYMWNqNmxYSnpCd09PR09aWHFJbHBtQk93UjgwTEJrcER3bmJtMTViSm5XZGFHSnlYazhTeWtmb3NZc2lQd1RRcy9OQytseCsgNTAreGtnREo5akJkekVNdmdoYk9JSUlGbXZKNk0xMnZqbW0zVVBYVVNtcm11bEp3MUZqb0hwdGlTSWJ4OEdlYW4wZUFTVEswZUR6byBRQ0xLVEdOaTlmcU1qYkFPSnVhQkl1WVpzYXhoWFA4QVZITTUySG8vY0twMTRkcUh1TmU5SkE5Tk9rOUp6L1p0aTJVVW14Q1ZoVzYxIFcxb2R6ZFVic1FmeVVzZm1BOG9uT3VCZTlScUMxSXE4a3ZBYUFYbGlSVFRFaWgwN0JYenJPc3NZQjFJY2dGM2dpTHVSM01WeXhMTjUgWXJrMkpKTldhcXowNEUvVDZIazhHUUQ5QnRuSUQ4QnFGMTVvWDQ2U09xSzBQU1FTNy9QakszcVpTOUZJYVhkUE44VjhJVmtpTkJpRCBuNlFldXBUbTRTeTh5V1JjSnlxWGlBczB5eXBtY3o0TERlNU1MRzd0d3c2MlRvNWlGRVVzc0VhKzBRNlY5WUNRN05hNWMwM1VEYnEzIGt5bytVb2tGZ2VOa2FJeTF6VHNySVdEaW9WSEVNa2hMbm02K21EVCtCa0w2NndQRUZ2TEY1VTdJRW14bWRaMXVzblQ2WmlTV2JQSmkgYlpxYUtySjVOV2FzOFdmejFrY0F6b1NCWnUvMzdmUDU2WUZaK2daY0ZIV3RjakdLMnRsWTNJTFJ6U1BWMkYxRGhHV243STB6VmhiTCBiWFpUMDR0RW8za3JwVWswVDFXZDZCSndaT0tJOFljRE5UaWtpTGlTekZaWXpXMHJpVFI5dmpXWmd6Mkk1SXMybG80VmtNa0hsR1cxIDhaWlJwTEFtRmxMZTVES0JIbUY4TERpZW9ZTGtSSnFINnllWG5GaWFXUklFU3NpZm5XZFprOTJtL1VTZ2ZvQXBRSDRBL0hVMWp1dWwgMUdMTXR5TVRpeEZtMTVORVdmMmVlb1c0ZFoxemhFKzZhK0YrdFVIZ3l0RTZmWHc5SUdBTm5MSENTQXNOcWVNRHlDQWFhUDhBVUtVaSBJMnl5ZWNXVjFqTEFpUGtDUnVRSWppQlJOekdOZDFhSlVJbDNVbHBqbEh6TFV1RXJXMHkxTmZ0anoxSm1MNUdXNHQ1RFhrQ2preFpvIEN4U1dSVGtMUkdTa3FoT1JHOUMvbEdzdWFFaTVVTTdGRzVrb2ZJenJPc1dwSlRWUlJvU2thelI0b3BLb3RpelNpbEZuazBPZXVnaXEgd2t5VU5VTWxaQUdyVkxxNzgvUFZvTkV2L0RnMDhhbktVN2t2M3BZeHgzME9UTUI5T1V1d2Ezek1yTmh4Y3lJVTlHY1FLdHRkdGpXYiBtNFNqRXZJalNEckdUeEVBOGdPcGdmU0pVbDFlQkM4NnpyT3UzSExLRlVDU1N1UHZiOHArK3VQSkhHWGNsRUpMTVNTcWtrMzVKcjlEIC9wMS8vOWs9ICIKICAgICAgIHk9IjAiCiAgICAgICB4PSIwIgogICAgICAgaWQ9ImltYWdlOSIKICAgICAgIGhlaWdodD0iMjYwIgogICAgICAgd2lkdGg9IjI2MCIgLz48L3BhdHRlcm4+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDkyNSI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkyNyIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhOGE4YTg7c3RvcC1vcGFjaXR5OjEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNGQ0ZDQ7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjEzMTc5NjAzIgogICAgICAgaWQ9InN0b3A0OTI5IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5MzEiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTllOWU5O3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTI1IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ4ODAiCiAgICAgeDE9Ijc2LjMwNjY3OSIKICAgICB5MT0iMTUzLjEzMTEzIgogICAgIHgyPSI3Ni4zMDY2NzkiCiAgICAgeTI9Ijc0LjMyMDUwMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODU5OTk4NDUsMCwwLDAuODUzMjYzNTMsLTE2Mi4zMjQ2NywtMzYuNTA0OTEyKSIgLz48Y2xpcFBhdGgKICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0iY2xpcFBhdGg2NDAyIj48cGF0aAogICAgICAgc3R5bGU9Im9wYWNpdHk6MC4wNTQ0NTU0NTtmaWxsOnVybCgjcGF0dGVybjY0MDYpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAtMTA2Ljk1MDYyLDcyLjY4NzUwMSBjIC0zLjA2MDE5LDAgLTQuODk5NzEsMi4wNTI3NzkgLTUuNSw0LjQzNzUgbCAtMTYsNjMuNTYyNDk5IGMgLTAuNDIyODUsMS42Nzk4NCAwLjUwNTY1LDguMjQ5MiAwLjYxMzc5LDguODMyMTQgMC4zODk1LDIuMDk5NjggMi44MzA5MiwzLjYwNTM2IDUuNTExMjEsMy42MDUzNiBsIDExMi43MTg3NTM4LDAgYyAyLjQ3NzgzMDEsMC4xMTYyNyA0LjgyMjQ4NTUsLTEuNDM5NjcgNS40MjI1NTYzLC0zLjE1NjI1IDAuMjUzODcyNiwtMC43MjYyMyAwLjU1MzYwNTcsLTQuMDUxNTggMC43MjcxNzU4LC04LjM0MTAyIDAuMDEyMjA5LC0wLjMwNDAyIDAuMDQzODM3LC0wLjYxNjY5IC0wLjAyNDc2NywtMC45NDAyMyBMIC0xOS40ODE4NSw3Ny4xMjUwMDEgYyAtMC42MDAyODMsLTIuMzg0NzIxIC0yLjQzOTgwOSwtNC40Mzc1IC01LjQ5OTk5OSwtNC40Mzc1IGwgLTgxLjk2ODc1MSwwIC0zZS01LDAgeiIKICAgICAgIGlkPSJwYXRoNjQwNCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2Njc3Njc2NjYyIgLz48L2NsaXBQYXRoPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NDYzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY0NjkiCiAgICAgeDE9IjUxNS4xMjA0OCIKICAgICB5MT0iNDk0LjM0MDI3IgogICAgIHgyPSItNy4zODE2NjI0IgogICAgIHkyPSItMjguMTYxODc1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2NTExIgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDY2MzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjUxMTI1ODYsMC4zODk1NzMzMiwtMC4yMjI4NjIwMiwwLjg2NDU0MTExLC0yMy40OTU3NDgsLTYuMjAxMDg5KSIKICAgICBjeD0iNTguMDMxMjUiCiAgICAgY3k9IjI3LjY5OTc2OCIKICAgICBmeD0iNTguMDMxMjUiCiAgICAgZnk9IjI3LjY5OTc2OCIKICAgICByPSI0MS4xODA1NDIiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3MzEiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50NjczNyIKICAgICBjeD0iNjMuNTUxMjI4IgogICAgIGN5PSIxMDIuNzIwOTMiCiAgICAgZng9IjYzLjU1MTIyOCIKICAgICBmeT0iMTAyLjcyMDkzIgogICAgIHI9IjU1LjI0MjcyMiIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDk3MzkyNCwwLDAsMC4wOTkxOTk5OSwtNjkuNzQwNjM2LDkyLjUzMTAxOSkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3NDUiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc1MSIKICAgICB4MT0iODEuMDkzMyIKICAgICB5MT0iODYuODE0OTgiCiAgICAgeDI9IjgxLjA5MzMiCiAgICAgeTI9Ijc1LjQ5OTU4OCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNjIuMTI2MzMsMCkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY3NjIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njc2OCIKICAgICB4MT0iOTIiCiAgICAgeTE9Ijc2IgogICAgIHgyPSItMi4yMDc5OTk3IgogICAgIHkyPSIyMi4wNzk2ODkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkwNjI1LDAsMCwwLjkwNjI1LC0xNjIuMTI2MzMsMC4zNjI1KSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njc2MiIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2ODA3IgogICAgIHgxPSI1NiIKICAgICB5MT0iMTQwLjI0OTc2IgogICAgIHgyPSI1NiIKICAgICB5Mj0iMTIiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjkwNjI1LDAsMCwwLjkwNjI1LC0xNjIuMTI2MzMsMCkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY4MjkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjgzNSIKICAgICB4MT0iODIuNjk1MzEyIgogICAgIHkxPSIzNC44OTA2MjUiCiAgICAgeDI9IjkwLjIwMDE5NSIKICAgICB5Mj0iMzQuODkwNjI1IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2Mi4xMjYzMywwKSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTE5IgogICAgIHgxPSI0NSIKICAgICB5MT0iNjQiCiAgICAgeDI9Ijg0IgogICAgIHkyPSI2NCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTYyNjY4MSwwLDAsMS4xOTQ2NDE2LC0xOTAuNDQ3MzcsLTI1LjkzNzcxNikiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkyMSIKICAgICB4MT0iNTYuMzM3OTE0IgogICAgIHkxPSIzOS4zMTQyODUiCiAgICAgeDI9Ijc2LjExMjE4MyIKICAgICB5Mj0iNTEuNjQ1NzY3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTMxIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIKICAgICB4MT0iNzYuMjcwNjA3IgogICAgIHkxPSI1OS4xNTQ4OTIiCiAgICAgeDI9IjYyLjA1NjM1MSIKICAgICB5Mj0iNTIuODg4MDUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkzMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjEzODMyMSwwLDAsMS4zNTY5MzQ2LC0xODYuNDA3NTYsLTMwLjA5MzMzMSkiCiAgICAgeDE9IjU2LjIxNzE3OCIKICAgICB5MT0iNjYuNTEwMDcxIgogICAgIHgyPSIzOC44MTI2MDMiCiAgICAgeTI9IjM5LjQ1MDE4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDY5MzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjIxMzgzMjEsMCwwLDEuMzU2OTM0NiwtMTg2LjQwNzU2LC0zMC4wOTMzMzEpIgogICAgIHgxPSIzOC41OTQ0NjciCiAgICAgeTE9IjM5LjMxNDI4NyIKICAgICB4Mj0iNzguMzExNzgzIgogICAgIHkyPSIzOS4zMTQyODciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NjkzNyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjEzODMyMSwwLDAsMS4zNTY5MzQ2LC0xODYuNDA3NTYsLTMwLjA5MzMzMSkiCiAgICAgeDE9IjM4LjU5NDQ2NyIKICAgICB5MT0iMzkuMzE0Mjg3IgogICAgIHgyPSI3OC4zMTE3ODMiCiAgICAgeTI9IjM5LjMxNDI4NyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NzAwNyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDMwIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MTM5MjY3NiwwLDAsMC44MTM5MDM3MiwtMTYyLjg4Nzg4LDQuNTM1MDE2MykiCiAgICAgeDE9IjU0LjUzMDc2MiIKICAgICB5MT0iLTMyLjI2NjYwOSIKICAgICB4Mj0iNTQuNTMwNzYyIgogICAgIHkyPSIzOS44NjMxMjkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDcwMDciCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzA0MCIKICAgICB4MT0iMTAuMjUzMDUiCiAgICAgeTE9IjMuMzcyNDMwMyIKICAgICB4Mj0iOTYuMTY2NTE5IgogICAgIHkyPSI1MC43NDg1ODUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjczNzYyMTEyLDAsMCwwLjczNzYwMDI3LC0xNjMuMDM1NCwzLjk0NDkzNjEpIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3MDc1IgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDcwODEiCiAgICAgY3g9IjY0LjUyMzQ5MSIKICAgICBjeT0iMzUuMjA2MTEyIgogICAgIGZ4PSI2NC41MjM0OTEiCiAgICAgZnk9IjM1LjIwNjExMiIKICAgICByPSIzMy40MzQ4MjMiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjc2NDcxOTQ3LDAsMTEuOTgxNzQ2KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MTA5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yMTM4MzIxLDAsMCwxLjM1NjkzNDYsLTE4Ni40MDc1NiwtMzAuMDkzMzMxKSIKICAgICB4MT0iNzYuMjcwNjA3IgogICAgIHkxPSI1OS4xNTQ4OTIiCiAgICAgeDI9IjYyLjA1NjM1MSIKICAgICB5Mj0iNTIuODg4MDUiIC8+PGNsaXBQYXRoCiAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImNsaXBQYXRoNDQ4NSI+PHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMDU0NDU1NDU7ZmlsbDp1cmwoI3BhdHRlcm40NDg5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMjIuNzc5NzI1LDI1LjM3NSBjIC0yLjYzMTc1OCwwIC00LjIyMjk0NywwLjg0Mjk5NiAtNC43Mjk5ODEsMi44ODAxMDcgTCA0LjI4OTc2ODYsODMuNTM4NjA1IGMgLTAuMzU3MTYyNCwxLjQzNDk3MiAwLjQzNDg1MzIsNy4wMzg3MzQgMC41Mjc4NTE3LDcuNTM2MTM2IDAuMzM0OTc0NywxLjc5MTU4NSAyLjQzNDU5NTEsMy4wNzYzMjQgNC43Mzk2Mzc3LDMuMDc2MzI0IGwgOTYuOTM3OTQyLDAgYyAyLjEzMDkzLDAuMDk5MjEgNC4xNDczMywtMS4yMjg0MTcgNC42NjMzOSwtMi42OTMxMTEgMC4yMTgzMywtMC42MTk2NyAwLjQ3NjEsLTMuNDU3MDcxIDAuNjI1MzcsLTcuMTE3MDg4IDAuMDEwNSwtMC4yNTk0MTIgMC4wMzc3LC0wLjUyNjIwNCAtMC4wMjEzLC0wLjgwMjI2MSBMIDk4LjAwMjczOSwyOC4yNTUxMDcgQyA5Ny40OTU3MDcsMjYuMjE3OTk2IDk1LjkwNDUwNywyNS4zNzUgOTMuMjcyNzQ5LDI1LjM3NSBsIC03MC40OTI5OTksMCAtMi41ZS01LDAgeiIKICAgICAgIGlkPSJwYXRoNDQ4NyIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc2Njc3Njc2NjYyIgLz48L2NsaXBQYXRoPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ1NTEiCiAgICAgeDE9IjczLjUiCiAgICAgeTE9IjY3Ljc1IgogICAgIHgyPSI5OSIKICAgICB5Mj0iNjcuNzUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDU4NSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICB4MT0iNzMuNSIKICAgICB5MT0iNjcuNzUiCiAgICAgeDI9Ijk5IgogICAgIHkyPSI2Ny43NSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjkxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NjA2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4yOTQxMTc2LDAsMCwxLjI5NDExNzYsLTI1LjM2NzY0NywtMjEuMTc2NDcxKSIKICAgICB4MT0iNzYuOTYzNzIyIgogICAgIHkxPSI2Ny43NSIKICAgICB4Mj0iOTkiCiAgICAgeTI9IjY3Ljc1IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ2MTAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjI5NDExNzYsMCwwLDEuMjk0MTE3NiwtMjUuMzY3NjQ3LC0yMS4xNzY0NzEpIgogICAgIHgxPSI5NC45NDgxNjYiCiAgICAgeTE9IjYwLjU3NjA2OSIKICAgICB4Mj0iODYuNDA5MDEyIgogICAgIHkyPSI2NS41MDYxNDkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDYyMCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjk0MTE3NiwwLDAsMS4yOTQxMTc2LC0yNS4zNjc2NDcsLTIxLjE3NjQ3MSkiCiAgICAgeDE9IjczLjUiCiAgICAgeTE9IjY3Ljc1IgogICAgIHgyPSI5OSIKICAgICB5Mj0iNjcuNzUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NDIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc0OCIKICAgICB4MT0iMTA0LjUyNjUxIgogICAgIHkxPSIzNi44NDg4NTgiCiAgICAgeDI9IjEwNC41OTQxNiIKICAgICB5Mj0iNTMuMDYyNSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc5OSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzODA1IgogICAgIHgxPSI5Ny40MTQyMTQiCiAgICAgeTE9IjQ0IgogICAgIHgyPSIxMjAiCiAgICAgeTI9IjQ0IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjM4MDciPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjU2NTM2MTQ4IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyMzgwOSIgLz48L2ZpbHRlcj48Y2xpcFBhdGgKICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0iY2xpcFBhdGgzODEzIj48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiCiAgICAgICBpZD0icGF0aDM4MTUiCiAgICAgICBkPSJtIDg4LDMyIDcuOTAxMzU4LDAgQyAxMDAsMzIgMTIwLDUwLjE5NzA1MiAxMjAsNTUuOTYzNDk2IEwgMTIwLDcyIDg4LDcyIDg4LDMyIHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzgxNyk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PC9jbGlwUGF0aD48cmFkaWFsR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc3MyIKICAgICBpZD0icmFkaWFsR3JhZGllbnQzODE3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4yODk0MTkzLC0xLjMwNDU2OTRlLTgsMCwxLjkzMjg3OTgsLTk0LjM1NjU1NSwtMzcuMDczNTgxKSIKICAgICBjeD0iOTAuMTM0ODk1IgogICAgIGN5PSIzOS44NzUiCiAgICAgZng9Ijk1LjM3NjM5NiIKICAgICBmeT0iNDMuMzc3MzE2IgogICAgIHI9IjUwLjc1IiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzODIxIgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDM4MTkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg2OC40OTIzMzUsMCwtMy4yOTUwNjAyZS03LDU3LjgyNTc3OCwtNjE4OC4wOTE2LC0yMjczLjE3NzkpIgogICAgIGN4PSI5MS44ODIwNTciCiAgICAgY3k9IjM5Ljg3NSIKICAgICBmeD0iOTcuMTIzNTU4IgogICAgIGZ5PSI0My4zNzczMTYiCiAgICAgcj0iNTAuNzUiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM4MjEiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50Mzg0NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDc0Nzg2MiwtMS4xODIyNjZlLTgsMCwxLjc1MTY3MjMsLTg1LjUxMDYyOCwtMzMuNTk3OTMzKSIKICAgICBjeD0iOTMuMTkyNDM2IgogICAgIGN5PSIzNi4yNTM0NiIKICAgICBmeD0iOTguNDMzOTM3IgogICAgIGZ5PSIzOS43NTU3NzUiCiAgICAgcj0iNTAuNzUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3ODMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzg1NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICB4MT0iMTA4IgogICAgIHkxPSI0NCIKICAgICB4Mj0iMTE0IgogICAgIHkyPSIzNiIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iLTEyNi4xOTk1MiIKICAgICB4Mj0iOTEuMjkyODMxIgogICAgIHkxPSItMTEwIgogICAgIHgxPSI5MS4yOTI4MzEiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAxMjQ1OTgsMCwwLDEuMDEyNDU5OSwtMi43NTc5MTYyLDApIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM2ODkiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA0MSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE0NC4wNTcwOCIKICAgICB4Mj0iNDcxLjgwNDM1IgogICAgIHkxPSIxNDEuNDc1MSIKICAgICB4MT0iNDcxLjgwMDM4IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC40MDgyMjIzLDAsMCwwLjM3MzkxNjEsLTMwMi44Nzc0OCwtMTc3LjY4OTQxKSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjgzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NjkuMTA1NjIiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC40NjU0MjcxLC0yLjU2MjUzNGUtMyw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzQ5IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMi40MTk3NjI2ZS0zLC0xLjY3MjM4NTIsMjAxLjMwODc3LDI2My40OTU5NSkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc0NyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTE9IjMxLjk5OTk5OCIKICAgICB4MT0iMTM4LjUwODI0IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC40NTA2OTMzLDAsMCwwLjY3OTk0ODMsNTAuNTc1MjYzLDIzLjI4MTQ5NykiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjc0NCIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTMwIgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMTkiCiAgICAgeDI9IjExNiIKICAgICB5MT0iMjAuNTc0NTI0IgogICAgIHgxPSIxMTYiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjgzMzMzMzMsMCwwLDAuODAzMTM3NywxOS4yNSwzMC45NTI5MzQpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3NDEiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE0NC4wNTcwOCIKICAgICB4Mj0iNDcxLjgwNDM1IgogICAgIHkxPSIxNDEuNDc1MSIKICAgICB4MT0iNDcxLjgwMDM4IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4zMjg4NjExLDAsMCw3LjYyNzQ0NThlLTIsLTI2NS45NzE3NiwzNi4wNDE3NTYpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MzgiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjMxLjk5OTk5OCIKICAgICB4Mj0iMTQ5LjYwMjI2IgogICAgIHkxPSIzMS45OTk5OTgiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDkuMDEzODY1ZS0yLDAsMCwwLjgzMzMzMzYsMTAyLjUxNTA1LDEzLjgzMzMyNikiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjczNSIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0ODg0IgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48bGluZWFyR3JhZGllbnQKICAgICB5Mj0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODkyLC0zLjkxOTg1MTVlLTQsNi41MDA4ODA0ZS0zLC0wLjk3MDk3NzcsMTc0LjI4MTE4LDIwMi42NzA4KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzMxIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwyNykiCiAgICAgeTI9IjM2Ljk5OTk5OSIKICAgICB4Mj0iMTIxLjEwMjI2IgogICAgIHkxPSIzNi45OTk5OTkiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzE3IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwNzkiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjE4ODM4LDcuOTk1ODYyOWUtNSwyLjY3NzY4MzFlLTIsMC4xOTgwNjM3LDE3MS41MTA4NiwzMC45MzczMDIpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MTMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjE5LjUxNzE4NyIKICAgICB4Mj0iMTE2IgogICAgIHkxPSIyMy4wNzk2ODciCiAgICAgeDE9IjExNiIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LDE5LjI1LC01OS4xMjY3NTMpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MDgiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgeTI9IjQ2LjU5NTI5OSIKICAgICB4Mj0iMTQ2LjkyODEiCiAgICAgeTE9IjMzLjQ0NzI3MyIKICAgICB4MT0iMTQ2LjkyODEiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjY5NTY1MjIsMCwwLDAuNjk1NjUyMiwxNC4zMDc2MDksMzYuMzI2MDg3KSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzA1IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NzYiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIHkyPSIzMy43MTg3NSIKICAgICB4Mj0iMTQzLjQwNjI1IgogICAgIHkxPSI0Ni42ODg0NDIiCiAgICAgeDE9IjE0My40MDYyNSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNjk1NjUyMiwwLDAsMC42OTU2NTIyLDE0LjMwNzYwOSwzNi4zMjYwODcpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDI3MDIiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk3NiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIC8+PGZpbHRlcgogICAgIGhlaWdodD0iMS4wMDU4OTU2IgogICAgIHk9Ii0wLjAwMjk0Nzc3NzQiCiAgICAgd2lkdGg9IjEuNDg4NDM2OSIKICAgICB4PSItMC4yNDQyMTg0NiIKICAgICBpZD0iZmlsdGVyNDg2MiIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNDg2NCIKICAgICAgIHN0ZERldmlhdGlvbj0iMC4xMTYwMjYxNiIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgLz48L2ZpbHRlcj48ZmlsdGVyCiAgICAgaGVpZ2h0PSIxLjAwNTk5NjkiCiAgICAgeT0iLTAuMDAyOTk4NDQ0MSIKICAgICB3aWR0aD0iMS4yMDM1MjAxIgogICAgIHg9Ii0wLjEwMTc2MDA3IgogICAgIGlkPSJmaWx0ZXI0ODM4IgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+PGZlR2F1c3NpYW5CbHVyCiAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0ODQwIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjExODAzMzYzIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjwvZmlsdGVyPjxjbGlwUGF0aAogICAgIGlkPSJjbGlwUGF0aDM3NjEiCiAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoCiAgICAgICBpZD0icGF0aDM3NjMiCiAgICAgICBkPSJNIDE3MC43NSwxMTIuMjEyNSBMIDE3MC43NSwyMDcuODY4NzUgTCAzMDQuNDA2MjUsMjA3Ljg2ODc1IEwgMzA0LjQwNjI1LDExMi4yMTI1IEwgMTcwLjc1LDExMi4yMTI1IHogTSAyNTMuOTY4NzUsMTI1LjI3NSBDIDI2My4wOTI0OSwxMjUuMTE3MzkgMjcyLjM5MTA2LDEyNi44MTczNCAyNzkuNTYyNSwxMzAuOSBDIDI4MS4yNTgyMSwxMzEuODY1MzYgMjgyLjgzMDI1LDEzMi45NTkyNyAyODQuMjgxMjUsMTM0LjI0Mzc1IEMgMjkxLjczNjk2LDE0MC44NDM3NCAyOTYuNTM2MywxNTAuMTEyNzIgMjkwLjA5Mzc1LDE1OC4wNTYyNSBDIDI4NS4xMzQ1MiwxNjQuMTcwOSAyNzUuNTQ0NDcsMTYwLjc3ODc4IDI3Ni4zNDM3NSwxNTUuNTg3NSBDIDI3Ni43Mjc4MSwxNTMuMDkzMDQgMjc4LjQwODYzLDE0OS4wNjE1MyAyNzUuNTkzNzUsMTQ3Ljc0Mzc1IEMgMjY4Ljk0MjA4LDE0NC42MzYwMyAyNjEuMjg1MDgsMTQ5Ljc3NDAzIDI1OC41LDE1NC4zMDYyNSBDIDI1Ny43ODI0LDE1NS40NzQ3OSAyNTYuNDM5NTEsMTU3Ljg5NTgzIDI1Ny43NSwxNTkuMTgxMjUgQyAyNTkuNzM2OTEsMTYxLjEzMDE0IDI2Mi4wOTczMSwxNTkuNTIzNjIgMjY0LDE2MS4zMzc1IEMgMjY4LjU1MjI1LDE2NS42NzcyOSAyNjMuMDQxNTksMTc3LjQyMjIxIDI1Ny4xNTYyNSwxODIuMDg3NSBDIDI0OC4zMTU0NywxODkuMDk1NTUgMjM2LjQ0MzU3LDE5My42NTk4NSAyMjQuMDkzNzUsMTkzLjkzMTI1IEMgMjExLjM2OTczLDE5NC4yMTA4OCAxOTguMTI0NywxOTAuMDMzMTcgMTg3LjE1NjI1LDE3OS4xNSBDIDE4Ni40Njc3NywxNzguNDY2ODggMTg1LjQyNTAxLDE3Ny4xNjQ4OSAxODQuNzgxMjUsMTc2LjExODc1IEMgMTc2LjA4OTYzLDE2MS45OTQ1NyAxNzkuNDE4OTgsMTQwLjA3NjM0IDE5Ny41MzEyNSwxNDIuMjQzNzUgQyAyMDMuMzU4OTIsMTQyLjk0MTEyIDIxMy4xNjA2OSwxNTAuNjc1MjIgMjA2LjkzNzUsMTYxLjQzMTI1IEMgMjA1LjE4ODE1LDE2NC40NTQ3OSAyMDYuODEyNDYsMTY2Ljg4MDgyIDIxMC43MTg3NSwxNjcuMzM3NSBDIDIxNC4wOTA5NywxNjcuODMwOTMgMjIwLjEwNTg1LDE2Ni4zMjQzMyAyMjQuNTYyNSwxNjMuMTE4NzUgQyAyMjYuOTc3NDEsMTYxLjM4MTc2IDIyOC44ODQxMywxNTkuMzQ3MDEgMjI5LjM0Mzc1LDE1Ny4wODc1IEMgMjI5Ljk2NTYzLDE1NC4wMzAyNSAyMjguMjM4NjIsMTUwLjg0MzY2IDIyNS41OTM3NSwxNTAuMDU2MjUgQyAyMjQuNjM0MTUsMTQ5Ljc3MDU3IDIyMy4xODg1LDE1MC41MDEgMjIzLjc1LDE1MS41MjUgQyAyMjQuMzE5NjUsMTUyLjU2Mzg1IDIyMi42NDY1NCwxNTMuNzYwNzQgMjIxLjEyNSwxNTMuMTE4NzUgQyAyMTMuNTI5ODIsMTQ5LjkxNDE1IDIxNi43OTE1OSwxNDAuMDE3NzIgMjI0LjM3NSwxMzMuOSBDIDIzMC43ODU1NiwxMjguNzI4NDQgMjQyLjIzODIzLDEyNS40Nzc2NCAyNTMuOTY4NzUsMTI1LjI3NSB6IE0gMTk1LjE4NzUsMTUzLjQzMTI1IEMgMTkzLjc3OTczLDE1My41MjQyMyAxOTIuMjI1MjgsMTU0LjE1NTA2IDE5MS4yNSwxNTUuMTE4NzUgQyAxODcuNjI3NTEsMTU4LjY5ODIxIDE4OC45NDI5NCwxNjUuNDM1ODYgMTkxLjg0Mzc1LDE2OS43NzUgQyAxOTcuNTM0MDksMTc4LjI4Njg2IDIxMy44OTA0MSwxODguMDA4NjYgMjM3LjI4MTI1LDE4MC4xMTg3NSBDIDI0NC4yMTc1MiwxNzcuNzc5MSAyNDkuMjM5MjIsMTcwLjgxODYxIDI0Ni42ODc1LDE2Ny4xMTg3NSBDIDI0NS43Nzc5OSwxNjUuODAwMDEgMjQ0LjE2OTE5LDE2Ni41ODc0OSAyNDEuNjI1LDE2Ni41ODc1IEMgMjM4Ljc0NDg0LDE2Ni41ODc1IDIzNy40MDcyMiwxNjUuNjU5OSAyMzYuMzc1LDE2Ny4wODc1IEMgMjI5Ljg3NTExLDE3Ni4wNzcwNyAyMTguNTA1MDYsMTc4LjcyNDg0IDIwNS42MjUsMTc0LjgzNzUgQyAxOTkuMDM1NDgsMTcyLjg0ODcgMTk1LjIxMDUxLDE2Ni44NzEzMyAxOTUuMjUsMTYxLjkzMTI1IEMgMTk1LjExODk5LDE1OS40NTc1MSAxOTUuODI5LDE1Ny44MzY0MyAxOTcuMDYyNSwxNTcuNjgxMjUgQyAxOTguMTkyMzIsMTU3LjUzOTExIDE5OC40OTg3MSwxNTUuODM2MDcgMTk4LjE4NzUsMTU0Ljg2ODc1IEMgMTk3LjgzNTE0LDE1My43NzM1IDE5Ni41OTUyNywxNTMuMzM4MjcgMTk1LjE4NzUsMTUzLjQzMTI1IHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjM2NjMzNjY2O2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4zMDAwMDAwMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiAvPjwvY2xpcFBhdGg+PGxpbmVhckdyYWRpZW50CiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgeTI9IjQuNzUiCiAgICAgeDI9IjcuOTM3NSIKICAgICB5MT0iMTgiCiAgICAgeDE9IjcuOTM3NSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2OTY0IgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY0MTciCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDMzNzAiPjxzdG9wCiAgICAgICBpZD0ic3RvcDMzNzIiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGUyOTY1O3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3AzMzc2IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzA5MWU2YTtzdG9wLW9wYWNpdHk6MTsiIC8+PC9saW5lYXJHcmFkaWVudD48cmFkaWFsR3JhZGllbnQKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICByPSIxMzkuNTU4NTkiCiAgICAgY3k9IjExMi4zMDQ3IgogICAgIGN4PSIxMDIiCiAgICAgaWQ9IlhNTElEXzhfIj48c3RvcAogICAgICAgaWQ9InN0b3A0MSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNlZmVmZWY7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ3IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Y5ZjlmOTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMTg4NTEwNDkiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojRkFGQUZBIgogICAgICAgb2Zmc2V0PSIwLjI1NzE4MTQ3IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDUxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I0ZGRkZGRiIKICAgICAgIG9mZnNldD0iMC4zMDExMTI3NyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MyIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNGQUZBRkEiCiAgICAgICBvZmZzZXQ9IjAuNTMxMyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNFQkVDRUMiCiAgICAgICBvZmZzZXQ9IjAuODQ0OSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1NyIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNFMUUyRTMiCiAgICAgICBvZmZzZXQ9IjEiIC8+PC9yYWRpYWxHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ2NDE3Ij48c3RvcAogICAgICAgaWQ9InN0b3A2NDE5IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzU1ZGRmZjtzdG9wLW9wYWNpdHk6MSIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2M3ZWNmNDtzdG9wLW9wYWNpdHk6MSIKICAgICAgIG9mZnNldD0iMC44MzQ5MjI2MSIKICAgICAgIGlkPSJzdG9wNjQyNSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A2NDIxIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Q4ZWRmMjtzdG9wLW9wYWNpdHk6MSIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MDAiPjxzdG9wCiAgICAgICBpZD0ic3RvcDM4MDIiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2UzZTNlMztzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNTA1ODc4NjkiCiAgICAgICBpZD0ic3RvcDM4MDQiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wMzgwNiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhMGEwYTA7c3RvcC1vcGFjaXR5OjE7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPjxzdG9wCiAgICAgICBpZD0ic3RvcDM3NjEiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3AzNzYzIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0ODg0Ij48c3RvcAogICAgICAgaWQ9InN0b3A0ODg2IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzdjN2M3YztzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MzQzNDM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjAzMTI1IgogICAgICAgaWQ9InN0b3A0ODg4IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC4yNSIKICAgICAgIGlkPSJzdG9wNDg5MCIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0ODkyIgogICAgICAgb2Zmc2V0PSIwLjM3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC41IgogICAgICAgaWQ9InN0b3A0ODk0IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ4OTYiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDg5OCIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkZmRmZGY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojOTA5MDkwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC44NzUiCiAgICAgICBpZD0ic3RvcDQ5MDAiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDkwMiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0ZjRmNGY7c3RvcC1vcGFjaXR5OjE7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDkzMCI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3YzdjN2M7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A0OTMyIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5MzQiCiAgICAgICBvZmZzZXQ9IjAuMDMxMjUiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNDM0MzQzO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0OTM2IgogICAgICAgb2Zmc2V0PSIwLjMwMTU1OTg0IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjQzMzkyNTU0IgogICAgICAgaWQ9InN0b3A0OTM4IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5NDAiCiAgICAgICBvZmZzZXQ9IjAuNTM2ODI4NDYiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgaWQ9InN0b3A0OTQyIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGZkZmRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIGlkPSJzdG9wNDk0NCIgLz48c3RvcAogICAgICAgaWQ9InN0b3A0OTQ2IgogICAgICAgb2Zmc2V0PSIwLjg3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5MDkwOTA7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNGY0ZjRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNDk0OCIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj48c3RvcAogICAgICAgaWQ9InN0b3A0OTU0IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDk1NiIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDk3NiI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDk3OCIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDQ5ODAiCiAgICAgICBvZmZzZXQ9IjEiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUwNDEiCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj48c3RvcAogICAgICAgaWQ9InN0b3A1MDQzIgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RiZGJkYjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTA0NSIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkYmRiZGI7c3RvcC1vcGFjaXR5OjA7IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTA1OSI+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3YzdjN2M7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwIgogICAgICAgaWQ9InN0b3A1MDYxIiAvPjxzdG9wCiAgICAgICBpZD0ic3RvcDUwNjMiCiAgICAgICBvZmZzZXQ9IjAuMDg0Nzg5MDgiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNDM0MzQzO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDY1IgogICAgICAgb2Zmc2V0PSIwLjI1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5YzljOWM7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgb2Zmc2V0PSIwLjM3NSIKICAgICAgIGlkPSJzdG9wNTA2NyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDY5IgogICAgICAgb2Zmc2V0PSIwLjUiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzE3MTcxO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2EwYTBhMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuNjI1IgogICAgICAgaWQ9InN0b3A1MDcxIiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZGZkZmRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NSIKICAgICAgIGlkPSJzdG9wNTA3MyIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDc1IgogICAgICAgb2Zmc2V0PSIwLjg3NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM5MDkwOTA7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNGY0ZjRmO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNTA3NyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudAogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUwNzkiPjxzdG9wCiAgICAgICBpZD0ic3RvcDUwODEiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzYwMDAwO3N0b3Atb3BhY2l0eToxOyIgLz48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmNGY0ZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAuMTg0NTE0NjQiCiAgICAgICBpZD0ic3RvcDUwODciIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNTA4OSIKICAgICAgIG9mZnNldD0iMC41MDIxMTg2NSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNhZDI2MjY7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZTQzZTNlO3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC43NTEwNTkyOSIKICAgICAgIGlkPSJzdG9wNTA5MSIgLz48c3RvcAogICAgICAgaWQ9InN0b3A1MDgzIgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzVlMDAwMDtzdG9wLW9wYWNpdHk6MTsiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MDkzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDUwOTUiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgb2Zmc2V0PSIxIgogICAgICAgaWQ9InN0b3A1MDk3IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50CiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDA2MSI+PHN0b3AKICAgICAgIGlkPSJzdG9wNDA2NCIKICAgICAgIG9mZnNldD0iMCIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NWRkZmY7c3RvcC1vcGFjaXR5OjEiIC8+PHN0b3AKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjN2VjZjQ7c3RvcC1vcGFjaXR5OjEiCiAgICAgICBvZmZzZXQ9IjAuNTQzNzAwNTgiCiAgICAgICBpZD0ic3RvcDQwNjYiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDA2OCIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkOGVkZjI7c3RvcC1vcGFjaXR5OjEiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQKICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NzEzIj48c3RvcAogICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2FmYmZmZjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICBvZmZzZXQ9IjAiCiAgICAgICBpZD0ic3RvcDQ3MTUiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDM1NCIKICAgICAgIG9mZnNldD0iMC4xMjgzNTY1IgogICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzIwNTBhYztzdG9wLW9wYWNpdHk6MTsiIC8+PHN0b3AKICAgICAgIGlkPSJzdG9wNDcxNyIKICAgICAgIG9mZnNldD0iMC40ODEzNTU0OSIKICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MDg1ZDE7c3RvcC1vcGFjaXR5OjE7IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMjA0Nzk1O3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMC45MTQyNjUxIgogICAgICAgaWQ9InN0b3A0MzU2IiAvPjxzdG9wCiAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwOTU5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgIG9mZnNldD0iMSIKICAgICAgIGlkPSJzdG9wNDcxOSIgLz48L2xpbmVhckdyYWRpZW50PjxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgIGlkPSJwZXJzcGVjdGl2ZTIwMiIKICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNjQgOiA0Mi42NjY2NjcgOiAxIgogICAgIGlua3NjYXBlOnZwX3o9IjEyOCA6IDY0IDogMSIKICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDY0IDogMSIKICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPjxyYWRpYWxHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDU5IgogICAgIGlkPSJyYWRpYWxHcmFkaWVudDUwOTkiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjA4MzQ5ODQsLTEuMTI2NDAwM2UtNiwxLjM1NTI1MDZlLTYsMi41MDY4MDE4LC0xMjUuMTQ0MDgsLTE1LjE2MjcxMykiCiAgICAgY3g9IjExNS41IgogICAgIGN5PSIxMC4wNzI1MTYiCiAgICAgZng9IjExNS41IgogICAgIGZ5PSIxMC4wNzI1MTYiCiAgICAgcj0iMC41IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTMwIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMDEiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjQ1MDY5MzMsMCwwLDAuNjc5OTQ4MywtNDUuMTk2NjE1LDAuMjIxODgyODIpIgogICAgIHgxPSIxMzguNTA4MjQiCiAgICAgeTE9IjMxLjk5OTk5OCIKICAgICB4Mj0iMTQ5LjYwMjI2IgogICAgIHkyPSIzMS45OTk5OTgiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEwMyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LC03Ni41MjE4NzUsNy44OTMzMTk4KSIKICAgICB4MT0iMTE2IgogICAgIHkxPSIyMC41NzQ1MjQiCiAgICAgeDI9IjExNiIKICAgICB5Mj0iMTkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEwNSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMzI4ODYxMDksMCwwLDAuMDc2Mjc0NDYsLTE3MC4zNTI0NCwxMi45NDc2NTkpIgogICAgIHgxPSI0NzEuODAwMzgiCiAgICAgeTE9IjE0MS40NzUxIgogICAgIHgyPSI0NzEuODA0MzUiCiAgICAgeTI9IjE0NC4wNTcwOCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDg4NCIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTA3IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4xMjI1MzI2NywwLDAsMC44NzU4MTQwOCwyLjA1OTQ1MzYsLTEwLjcxMzEwNSkiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICB5MT0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTI9IjMxLjk5OTk5OCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTA5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODkyLC00LjYyODg4NTVlLTQsMC4wMDY1MDA4OCwtMS4xNDY2MTA5LDc4LjUwOTMwNSwyMDMuNjA5MDcpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExMSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQ2NTQyNzEsLTAuMDAyNTYyNTMsNy4xMzE1Mjc3ZS00LC0xLjY3MjM5NDQsMzU3LjM0OTk0LDI2NC4zNTUwNikiCiAgICAgeDE9IjQ2OS4xMDU2MiIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NjAuMDYzNjMiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTEzIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIyNjIzMywtNi43NTEzNTMxZS00LDAuMDAyNDE5NzYsLTEuNjcyMzg1MiwyMDEuMzA4NzcsMjYzLjQ5NTk1KSIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzU5IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMTUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjQwODIyMjQ5LDAsMCwwLjQ0MTU1MDksLTIwNy4wNTUyMiwtMTc0LjI2NzY1KSIKICAgICB4MT0iNDcxLjMwMzQ3IgogICAgIHkxPSIxNDEuMjUyMDMiCiAgICAgeDI9IjQ3MS4zMDQxNyIKICAgICB5Mj0iMTQxLjcwMDk5IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0NzEzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMTciCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtOTUuNzcxODc1LDMuOTQwMzg1OCkiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICB5MT0iMzciCiAgICAgeDI9IjEyMS4xMDIyNiIKICAgICB5Mj0iMzciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTExOSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjEyMTg4MzgsNy45OTU4NjI5ZS01LDAuMDI2Nzc2ODMsMC4xOTgwNjM3LDc1LjczODk4NSw3Ljg3NzY4NzgpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwOTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEyMSIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQ2NTQyNzEsLTAuMDAyNTYyNTMsNy4xMzE1Mjc3ZS00LC0xLjY3MjM5NDQsMzU3LjM0OTk0LDI2NC4zNTUwNikiCiAgICAgeDE9IjQ2OS4xMDU2MiIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NjAuMDYzNjMiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MTIzIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIyNjIzMywtNi43NTEzNTMxZS00LDAuMDAyNDE5NzYsLTEuNjcyMzg1MiwyMDEuMzA4NzcsMjYzLjQ5NTk1KSIKICAgICB4MT0iNDQ2LjI1NzE0IgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ3MC43MzgyNSIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0OTUyIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxMjUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjgzMzMzMzMsMCwwLDAuODAzMTM3NywtNzYuNTIxODc1LC0zNi4wNjcxMzkpIgogICAgIHgxPSIxMTYiCiAgICAgeTE9IjIzLjA3OTY4NyIKICAgICB4Mj0iMTE2IgogICAgIHkyPSIxOS41MTcxODciIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ3MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTEyNyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTA3NTA0NCwwLDAsMC4zMDIwODMzOSwtODUuMTM0NzI5LC0xMTkuMDIwODMpIgogICAgIHgxPSIxMTAuMDA4MjQiCiAgICAgeTE9IjM3IgogICAgIHgyPSIxMjEuMTAyMjYiCiAgICAgeTI9IjM3IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTUzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxNTkiCiAgICAgeDE9IjEwMi41IgogICAgIHkxPSI1MS41IgogICAgIHgyPSIxMDciCiAgICAgeTI9IjQ5IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUxNjciCiAgICAgeD0iLTAuMDExOTMyMzkyIgogICAgIHdpZHRoPSIxLjAyMzg2NDgiCiAgICAgeT0iLTAuNDc4NjAwNDMiCiAgICAgaGVpZ2h0PSIxLjk1NzIwMDkiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjU1ODA4NTUiCiAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI1MTY5IiAvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MTgzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUxODkiCiAgICAgeDE9IjEwMS41IgogICAgIHkxPSI5OC43ODEyNSIKICAgICB4Mj0iMTAxLjUiCiAgICAgeTI9IjEwOC4zMzQ1NyIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz48ZmlsdGVyCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJmaWx0ZXI1MjAzIgogICAgIHg9Ii0wLjA0NzcyOTU2NyIKICAgICB3aWR0aD0iMS4wOTU0NTkxIgogICAgIHk9Ii0xLjkxNDQwMTciCiAgICAgaGVpZ2h0PSI0LjgyODgwMzUiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIyLjIzMjM0MiIKICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjUyMDUiIC8+PC9maWx0ZXI+PGZpbHRlcgogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICBpZD0iZmlsdGVyNTI0MiIKICAgICB4PSItMC4wNzEzOTM3NzkiCiAgICAgd2lkdGg9IjEuMTQyNzg3NiIKICAgICB5PSItNS4xOTYzNDM4IgogICAgIGhlaWdodD0iMTEuMzkyNjg4Ij48ZmVHYXVzc2lhbkJsdXIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHN0ZERldmlhdGlvbj0iMi45ODk0OTI3IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTI0NCIgLz48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTI2NyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MjczIgogICAgIHgxPSItODgiCiAgICAgeTE9IjIwOCIKICAgICB4Mj0iNDgiCiAgICAgeTI9IjU2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUyODMiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjk4MzAwOTcxIgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTI4NSIgLz48L2ZpbHRlcj48ZmlsdGVyCiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIGlkPSJmaWx0ZXI1Mjk5IgogICAgIHg9Ii0wLjAzMzcyNTA4OSIKICAgICB3aWR0aD0iMS4wNjc0NTAyIgogICAgIHk9Ii0wLjY0MDc3NjciCiAgICAgaGVpZ2h0PSIyLjI4MTU1MzQiPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjEzMzQ5NTE1IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTMwMSIgLz48L2ZpbHRlcj48cmFkaWFsR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTMwMyIKICAgICBpZD0icmFkaWFsR3JhZGllbnQ1MzA5IgogICAgIGN4PSIyMS41NTU2MDkiCiAgICAgY3k9IjExOC43NzU2IgogICAgIGZ4PSIyMS41NTU2MDkiCiAgICAgZnk9IjExOC43NzU2IgogICAgIHI9IjUuMDcwMzg4NCIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMjMyNjQ3MywwLjA0OTMwNTk0LC0wLjAxMDEyNDEzLDAuMjUzMTAyOTksLTMuODY3OTYzMiw4Ni44NzQ3MjEpIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPjxmaWx0ZXIKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgaWQ9ImZpbHRlcjUzMTEiCiAgICAgeD0iLTAuMDYwODczNzg2IgogICAgIHdpZHRoPSIxLjEyMTc0NzYiCiAgICAgeT0iLTAuNjA4NzM3ODYiCiAgICAgaGVpZ2h0PSIyLjIxNzQ3NTciPjxmZUdhdXNzaWFuQmx1cgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgc3RkRGV2aWF0aW9uPSIwLjI1MzY0MDc4IgogICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNTMxMyIgLz48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTM0MCIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzQ2IgogICAgIHgxPSI5Ny44NzUiCiAgICAgeTE9IjM4LjA2MjUiCiAgICAgeDI9IjEwMy4zMTI1IgogICAgIHkyPSIzMi42MjUiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+PHJhZGlhbEdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDUwNTkiCiAgICAgaWQ9InJhZGlhbEdyYWRpZW50NTM2NiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDgzNDk4NCwtMS4xMjY0MDAzZS02LDEuMzU1MjUwNmUtNiwyLjUwNjgwMTgsLTEyNS4xNDQwOCwtMTUuMTYyNzEzKSIKICAgICBjeD0iMTE1LjUiCiAgICAgY3k9IjEwLjA3MjUxNiIKICAgICBmeD0iMTE1LjUiCiAgICAgZnk9IjEwLjA3MjUxNiIKICAgICByPSIwLjUiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5MzAiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM2OCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNDUwNjkzMywwLDAsMC42Nzk5NDgzLC00NS4xOTY2MTUsMC4yMjE4ODI4MikiCiAgICAgeDE9IjEzOC41MDgyNCIKICAgICB5MT0iMzEuOTk5OTk4IgogICAgIHgyPSIxNDkuNjAyMjYiCiAgICAgeTI9IjMxLjk5OTk5OCIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDk1MiIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzcwIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC44MzMzMzMzLDAsMCwwLjgwMzEzNzcsLTc2LjUyMTg3NSw3Ljg5MzMxOTgpIgogICAgIHgxPSIxMTYiCiAgICAgeTE9IjIwLjU3NDUyNCIKICAgICB4Mj0iMTE2IgogICAgIHkyPSIxOSIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Mzc1OSIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzcyIgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC4zMjg4NjEwOSwwLDAsMC4wNzYyNzQ0NiwtMTcwLjM1MjQ0LDEyLjk0NzY1OSkiCiAgICAgeDE9IjQ3MS44MDAzOCIKICAgICB5MT0iMTQxLjQ3NTEiCiAgICAgeDI9IjQ3MS44MDQzNSIKICAgICB5Mj0iMTQ0LjA1NzA4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0ODg0IgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNzQiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjEyMjUzMjY3LDAsMCwwLjg3NTgxNDA4LDIuMDU5NDUzNiwtMTAuNzEzMTA1KSIKICAgICB4MT0iMTM4LjUwODI0IgogICAgIHkxPSIzMS45OTk5OTgiCiAgICAgeDI9IjE0OS42MDIyNiIKICAgICB5Mj0iMzEuOTk5OTk4IiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNzYiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjE4OTIsLTQuNjI4ODg1NWUtNCwwLjAwNjUwMDg4LC0xLjE0NjYxMDksNzguNTA5MzA1LDIwMy42MDkwNykiCiAgICAgeDE9IjQ0Ni4yNTcxNCIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzc4IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDY1NDI3MSwtMC4wMDI1NjI1Myw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICB4MT0iNDY5LjEwNTYyIgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzODAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMC4wMDI0MTk3NiwtMS42NzIzODUyLDIwMS4zMDg3NywyNjMuNDk1OTUpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM3NTkiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM4MiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNDA4MjIyNDksMCwwLDAuNDQxNTUwOSwtMjA3LjA1NTIyLC0xNzQuMjY3NjUpIgogICAgIHgxPSI0NzEuMzAzNDciCiAgICAgeTE9IjE0MS4yNTIwMyIKICAgICB4Mj0iNDcxLjMwNDE3IgogICAgIHkyPSIxNDEuNzAwOTkiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ3MTMiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM4NCIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC05NS43NzE4NzUsMy45NDAzODU4KSIKICAgICB4MT0iMTEwLjAwODI0IgogICAgIHkxPSIzNyIKICAgICB4Mj0iMTIxLjEwMjI2IgogICAgIHkyPSIzNyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzg2IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTIxODgzOCw3Ljk5NTg2MjllLTUsMC4wMjY3NzY4MywwLjE5ODA2MzcsNzUuNzM4OTg1LDcuODc3Njg3OCkiCiAgICAgeDE9IjQ0Ni4yNTcxNCIKICAgICB5MT0iMTA4LjAyMDUyIgogICAgIHgyPSI0NzAuNzM4MjUiCiAgICAgeTI9IjEwOC4wMjA1MiIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTA5MyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzg4IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDY1NDI3MSwtMC4wMDI1NjI1Myw3LjEzMTUyNzdlLTQsLTEuNjcyMzk0NCwzNTcuMzQ5OTQsMjY0LjM1NTA2KSIKICAgICB4MT0iNDY5LjEwNTYyIgogICAgIHkxPSIxMDguMDIwNTIiCiAgICAgeDI9IjQ2MC4wNjM2MyIKICAgICB5Mj0iMTA4LjAyMDUyIiAvPjxsaW5lYXJHcmFkaWVudAogICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1MDkzIgogICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzOTAiCiAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xMjI2MjMzLC02Ljc1MTM1MzFlLTQsMC4wMDI0MTk3NiwtMS42NzIzODUyLDIwMS4zMDg3NywyNjMuNDk1OTUpIgogICAgIHgxPSI0NDYuMjU3MTQiCiAgICAgeTE9IjEwOC4wMjA1MiIKICAgICB4Mj0iNDcwLjczODI1IgogICAgIHkyPSIxMDguMDIwNTIiIC8+PGxpbmVhckdyYWRpZW50CiAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ5NTIiCiAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTM5MiIKICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuODMzMzMzMywwLDAsMC44MDMxMzc3LC03Ni41MjE4NzUsLTM2LjA2NzEzOSkiCiAgICAgeDE9IjExNiIKICAgICB5MT0iMjMuMDc5Njg3IgogICAgIHgyPSIxMTYiCiAgICAgeTI9IjE5LjUxNzE4NyIgLz48bGluZWFyR3JhZGllbnQKICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDcxMyIKICAgICBpZD0ibGluZWFyR3JhZGllbnQ1Mzk0IgogICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC45MDc1MDQ0LDAsMCwwLjMwMjA4MzM5LC04NS4xMzQ3MjksLTExOS4wMjA4MykiCiAgICAgeDE9IjExMC4wMDgyNCIKICAgICB5MT0iMzciCiAgICAgeDI9IjEyMS4xMDIyNiIKICAgICB5Mj0iMzciIC8+PC9kZWZzPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODYzIgogICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEwOTgiCiAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgIGd1aWRldG9sZXJhbmNlPSIxMC4wIgogICBncmlkdG9sZXJhbmNlPSIxMC4wIgogICBvYmplY3R0b2xlcmFuY2U9IjEwLjAiCiAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgaWQ9ImJhc2UiCiAgIHdpZHRoPSIxMjhweCIKICAgaGVpZ2h0PSIxMjhweCIKICAgaW5rc2NhcGU6em9vbT0iMi44Mjg0MjciCiAgIGlua3NjYXBlOmN4PSIxNTIuNjY0MTQiCiAgIGlua3NjYXBlOmN5PSIxMjAuNTg0NTQiCiAgIGlua3NjYXBlOndpbmRvdy14PSI1MjAiCiAgIGlua3NjYXBlOndpbmRvdy15PSIyNjAiCiAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9IkxpdmVsbG9fMSIKICAgc2hvd2dyaWQ9InRydWUiCiAgIHNob3dndWlkZXM9InRydWUiCiAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgIGlua3NjYXBlOnNuYXAtbm9kZXM9InRydWUiCiAgIGlua3NjYXBlOnNuYXAtZ2xvYmFsPSJ0cnVlIj48aW5rc2NhcGU6Z3JpZAogICAgIHR5cGU9Inh5Z3JpZCIKICAgICBpZD0iZ3JpZDQwNzYiCiAgICAgc3BhY2luZ3g9IjFweCIKICAgICBzcGFjaW5neT0iMXB4IgogICAgIGVtcHNwYWNpbmc9IjIiCiAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICBlbmFibGVkPSJ0cnVlIiAvPjwvc29kaXBvZGk6bmFtZWR2aWV3PgoKPGcKICAgaWQ9Imc1MjE5IgogICB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwwLjE2NzIwMTU4LDAsODEuNzAyMTIpIgogICBzdHlsZT0iZmlsdGVyOnVybCgjZmlsdGVyNTI0MikiPjxwYXRoCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC44OTUyOTAzNCwwLDAsMC40OTMzNjkxMywwLjcwMDM5NTU1LDQzLjk5MjA3NikiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1MTY3KSIKICAgICBkPSJtIDcuNzgxODU0MiwxMDYuODg3MDMgMTEyLjI0OTUxNTgsMCAwLDIuNzk0NDIgYyAtMzUuMDE1MDE4LC0wLjAxNDMgLTcyLjQ2Mjc5MiwwLjAxNDQgLTExMi4yNDk1MTU4LDAgbCAwLC0yLjc5NDQyIHoiCiAgICAgaWQ9InBhdGg1MTYxIgogICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+PC9nPjxwYXRoCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuODk1MjkwMzQsMCwwLDAuMTE1MDkyODMsMC43MDAzOTU1NSw4NS44MzgzNTcpIgogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjUyMDMpIgogICBkPSJtIDcuNzgxODU0MiwxMDYuODg3MDMgMTEyLjI0OTUxNTgsMCAwLDIuNzk0NDIgYyAtMzUuMDE1MDE4LC0wLjAxNDMgLTcyLjQ2Mjc5MiwwLjAxNDQgLTExMi4yNDk1MTU4LDAgbCAwLC0yLjc5NDQyIHoiCiAgIGlkPSJyZWN0Mzg1OSIKICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz48cGF0aAogICBzdHlsZT0iZmlsbDojMDAwMDAwIgogICBkPSIiCiAgIGlkPSJwYXRoMjE5NyIgLz48ZwogICBzdHlsZT0iZGlzcGxheTpub25lIgogICBpZD0iRnJhbWVfY29weSIKICAgZGlzcGxheT0ibm9uZSIKICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzY1LjQ1NzI2LC0zMTQuMTE2NCkiPjxnCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGRpc3BsYXk9ImlubGluZSIKICAgICBpZD0iZzM5NzgiPjxpbWFnZQogICAgICAgc3R5bGU9Im9wYWNpdHk6MC43NSIKICAgICAgIHdpZHRoPSI1NzEiCiAgICAgICBoZWlnaHQ9IjU3MSIKICAgICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBanNBQUFJN0NBWUFBQUFLMWxwYkFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFBIEJHZEJUVUVBQU5iWTFFOVlNZ0FBQUJsMFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1NXMWhaMlZTWldGa2VYSEpaVHdBQUZTNFNVUkIgVkhqYTdKMEpkeHJia21hREZCcHNYOWZyLy84cnE5Njl0cXdKdWwydGZBNkNpRGh4a2dRUzJIc3RsZ2JiRXNJU3VmWEZjRllDQUpmSyA2b0Mvc3lxOHIvZnRVN0U5OE8zb2ZkbjdxMzhPQUJmNlpBa0F5LzQ1N1JXWDF1dlY5NTNqT1dUYmVMMzZ2dXoxWGtGQ2dnQ1FIUUNZIDRXZXlKVFM5MHFKZnJnNzRPNmQ4SHNsRVpodThyL2Z2VlArc0lqb0lFQUN5QThEUFgvSDlWV25KeEdRMTA5dXJRSGlPK1h3U3BTNWIgNXlZenZqMUZrQkFnQUdRSGdKKzNvdGhVWmFZbEpYUGZoa1Nxam8wbklKdEFlbzUxaStTb0lrRUlFQUN5QTNCemN0TXJOQlVScWJ3OSBUUGczM3ArdE9pVHUwRFFuUzNRMndldXR0emVOZjU5OTNEbEVxUFYxQWdDeUEzQVZjcE5KVFVVOHZKZlIrNksvMC9xNFF5SkwwZGM0IGQ1cmp5YzdHZWJscGlJejl1NjIzV3g5MzA1Q3ZRNUlnNUFjQTJRRzRLTG1wSkRVdGdmSGVudk8yYW53ZWU1OUVUbFBPeXNwWG5xeHMgR25LVDNUNktmNVo5emtyQ1ZPa0pxaVpCQUlEc0FCejFaMmFLM05na0paT1l1K1R0MXV1dDkwMFZJWnM0bmVLNXhFdEpOaE9GeGhNWSA3K1ZINGU5VVAwOHJEZHBLZndrTStRRkFkZ0NPbnQ1a1UwODlZaE5KeVYzeGJmdSs2TyszUktpYUhMVktXWWMrdjFUNmRhcUNzdzJTIG1VaHVQaHpScWR3aVFjcWt5S1pQMVg0Z1VoOEFaQWZncE9sTnF4eVZwVFdSdUt3NzMyN2RodVIxZlorcUpiTHFLUG94VTUxdFI1cXogZFlTaktqVHZoZGV6OTMwMFVxSldDcFQxQUdXcEQrSURnT3dBbEFXbmxkNTR2UzZ0cENhU203WHoranI1TzVINHJKUFBXUzFwcllxcCB6cm5MV050Q2FsSXBYVVhpVW5sWmVWOVZocW9DVkNsN0lUNEF5QTVBU1hDeTlDWktiVnBDWTJVbXU5MEhFdVI5ekVxNkU4bE9aV3FyIGQvejhGT2xPYXlJcksyZjFKRHZ2amRkN2Jwa1FlZkx6SVgzOVA0Z1BBTElEZk05M0MwNmxnZmpPU1Z5cUVuUGZlT25kZWlVbmFuUnUgU1UwbU9lY2VQVzlKVHlaQlVmOU9yL0JrdHpmbjliZmd6eXZ5azVYQUVCOEFaQWVndE84bUd3Ry9TOUliTFNDUnhGUmZ6NFNuVmNZYSBnaVRISzFsRmtyTnF5STBuTzZkTWRpTFp5WGJkdEpLZmx2aThTMTdlaWlUSGUvbm12QjNKVUZRaWE4a1A0Z09BN0FBcFRsZDZZeVVpIEswUGROMjRQaWVCNEFsUk5kSHBIeXl1YmthTUVaNmxuWTFVa2FDUDFhYTZldE9lamtPcjAzbG9DOUM3dDhoZmlBNERzQUlKVGtodXYgVCthK0lUY1BTbXdlQXRtcEpEbHJKOG5KZW5HbTl0eGtZaU55bWFlZTl3cFFKRDgyOWJHSmlrMTlvcVRIUzNkZUcyOTc3N01mYjN3NyBLbjhkSWo1SUR5QTdBQXYrWG83S1ZQYUM3NVdtb3VRbUVwd0hJemdQenZ1cW90TktjVm9KVHZYOHEwcGEweU0zNTVDZGl2ejBwa0F0IDhha2tQOVh5bGljMHI4bjdYcE8vK3laeCthdFhmRWg3QU5rQnVPQVVwelUxVlJHYiswQm1vcHY5KzFYQjBaS1RDVTZXMkF6SjR6RkYgYWxZTGUrNm9pRSt2QkUwVm9Pb0lleVk4bWVSa3R6ZnoraFR4cVk2MEl6MkE3QUFzSU1WcFNVNDBDbTdsNXFHUjJsUnU5dDk3cFNwdiBmRHhyTXU0dFIvV0lUWS9RTE9WNVl6dEJoQ3JpSTFKcmVQWUV5QnRyajBwZEZmSFJRdk9pM3ZmaXZPKzFRM3plbmZzWmJYUzJqdzNpIEE4Z093SmxUSEcrQ3lrdHd0SGhrVXZQWWVEdVRISnZtVkp1TWV4cUtSZHI5TmEyVXB2VmNjQ25QRTl2T1A2c21RSkVFVlJxZXMzSlggcGN5VnljNUw4SHBMZk40T1RIeElld0RaQVRoVGltUDdjTElTMWIwak40L095OGZnejNvRTUxN2EvVGZlY1EydDlPYVF4T2FRbi8rbCBQV2RzWi93M1dTbXNwL3pWVS9KcVRYTkZKUzFQZGw2SzR2TTZrL2hVVWpRQVpBZmdRTW1KVXB4V2llckJDRTEyNjVHY2RTUEZhYVUzIDFlVjkxWW1vRmM4RGt5N0VVeHVoZStVbjIrblRrcDRYNStWTFFYeGVBdkhKK254SWV3RFpBVGl4NU5peGFxL1J1RmR3bm9MWE04bUogU2xSVEJHZjhlcVJUY0tvL3cveWN6eU5EVlFtcVRueGw4dU1sUGw0L3oydUg5RlNUbjBoODlIMnNqTEVqUFlEc0FEUWtSMS9jdllWLyBVUitPSnpnUGdkdzhtZGVqVk1jclUxWDI0RlFPMGF6dXNtbjl2UEt6ZkI0SmFnbFFLL21wcEQ1ZTJ1T0pUNWIyL0hLRTUxY2lQOTVZIGUxVG04c1FINlFGa0I2QWdPYmEwVStuRDhYcHdiR3JUSXpwWmloTTFHVThWSEpIYW9qNStacGN2UVpYcHI2cjhaRDArV1Y5UGx2VDggQ2w1NjZVODAyVlhaMzJPRkQra0JaQWVRSENNNVUxS2NMTDNKM281S1Z0RWtWVVZ3S2xOVEpEYTNLVUJWK2NuRXA5cmI0NG1QbGh4OSBlekd2VyttSnlseFIyalBlZDZRSGtCMUFjZ3FTazZVNFh2OU42NVpKanQ2TEUwbE9OYjJwSkRqOFBDSS9MZm5KU2wyWitHUlRYQytCIDhQd0tKR2lPdEFmcEFXUUhrQndqT2ZZVThhalJXTXZMRnlVMFh3TEo4Y3BWM3VLL1ZvclRrOTRnTjlBU29LeloyWk9mU0h5cVRjMWUgV2V2WlNNNnprL3BrNHRPYTVFSjZBTmtCSktjenhYbHl4T1pMUVhRZWpPUzBTbFhaQkZWMkN2aUtuemVZUVg2ODNwZE5VWHk4L2g2diB4R1ZMVzgrQjhEd0g0bVBMWE43aHBFZ1BJRHVBNURpU0U2VTRudUI4Q1VSSEp6OWVQNDVYcWhxU0ZLZXkrNGFmTDVoYmZsb1RYcTF4IDlrcmFrNVcxbm9PWGxUS1hONzZPOUFDeUEwaE9JamhXYnF6d1JDVXJ1d0RRUzNHOGM2aThBelVSSExoRThmSEtYSm4wdkNUQzgxd1EgSHkvdFFYb0EyUUVrSjVDY0w0VmJTM0x1RzVKVFRYRzhueGwraG1DSjRoT1Z1a2JSc0NXdUh1bnh4T2RaNHNabXBBZVFIVUJ5bE9SayBDYzdYSk5XSnlsVzZ1VG5hYXR6YWc0UGd3TFdJajM3NTBVaDdxdEtUM2FaS3owWllUZ2pJRGl4VWNyVHNERE5KemxjbE9WK0ROT2V4IElEbGV3N0VuT1FnT1hLdjRaQk5kRmVsNUZYOXl5d3JPejBCODlML05wQ2M2amtJa1Bud1VBTm1CbzM3ZmVKS2pEK2FjSWpsZmplaDQgaVU0cnlja2FqcU96cUJBY3VHYng4Y2JadmFXRlZueXlzWFV2NWZtcFh2NlV1TXdWTlRObkN3b3BiUUd5QTJkSmMxYlNQdExodmtOeSBXcUtUOWVSay9UaVZVaFUvRTNCTDRoT1Z1VnBUWEZuU1k2WG5wNUVmS3o1MmlxdlMwNFAwQUxJRFo1V2NyRnhsOStOOEtVak9WL0g3IGNuU1NvNWNBZWxOVnBEZ0FOZkZwbGJpODBYV3ZweWNTbmt4NnRQaU1IemVTSHUvc0xZUUhrQjJZN1hza080WGNTczZZdUdTVFZaSGcgZkpXOEwwZFBWOW1tNDJ5cUNzRUIyQmVEcU14bG01bXQrT2dsaGVQTjYrZjVtZHhhemN6UlVSVFJLZXRJRHlBN01GdWFNNHBFZERobiBhM3o4YTNMelJzbXpucHlvSDZkM3N6RUFhVTkrTnBkTmUwWUJlUXVTSHR2UDQ4bk9ENVA0MkMzTnI0bjBVTm9DWkFlT0lqbGVYMDdXIGVEeEtpMDV3dm5WS3pxUHM3OG1KenFteXkvOUljUUFPVDNzaThkSDdlcUtlSGp1cXJzWG1oM25wcFQyNlJQYVdTQStsTFVCMllOTDMgUTFTeThpUkhsNnNla3hUbm0zbXBTMWs5a3BQdHh5SEZBWmcvN2VscFp0Wkp6NHVSSHR2UDh5TVJINis4TlVxVVBuc3JhMkltNVFFdSBCbEJLY3dZbnpSbmx3NXV1c3BMekxSRWRtK1pVSmFmU2o4UDNOY0R4MDU1b1NhRW5QYmFKZVJRYUxUcFIydlBMSkQzUnVIcFcya0o0IGJwdzFEd0dpNDBoT1ZMTFNZK1E2eVhsS1Voejl1azF6ZENLRTVBQXM4N2xoNi95Y2JkVkwvVnp4WVo0djNpU2V5bnlXL1VOOWY4aisgWU1MUHozLy8vUG14UnVtNWs3eWZSNXo3ai9RZ08wQ2FVK3JMOFViSXZ4cTUrZWFrT2Jaa3BSY0NJamtBbHlzOVcrZTU0MFBpWFZ1ZSArRHpKZmtsYjMzNG84Zm4xK2ZGK3laL1MxdkFwUEN2WjdTbXlLYzhLNFVGMmdEUkhUemQ1emNmNnlXZVVsMitCNkZqSnNXbk9GTW1oIDZSamc4cVhudmlFOW52am9oT2VuK2ppL1BqKzJKejJrUElEc2tPYVVTbFpSWDg3WFFITCtrcmczNTlGSmM2WklEb0lEc0R6cFdUa0ogaWljOXJjM3FGZW5SNVMyOWptTDgrR00venlEN1UxdWtQTWdPM0hpYW94dVF2YjZjckZ6MWwvaTlPVkhKS2p2V0Fja0J1THhmbnJicSBaemFUbm1paTAwdDducHpVNXpINHhlbFpmVXpiejBQS0E4Z09hVTQ2U3Y2VVNNNWY0cGV0V2lVcmIrc3hrZ053WFdtUEp6MzZ1ZWREIDRsMWRXWG5yMFhsdThYNlIraVg3ZTdoSWVaQWRJTTNaU1hPczVIeFZjdk9YSXp0WkEzSmxJU0NTQTNEOTBqTSs5MnlTcEtjbFBwN3MgMk9lYVp5VThwRHlBN055ZzZHUTdjN3lTbFUxeS9uSVNIUy9OaVVwV1NBN0FiVXFQeU83SWVyVEhLeXB0ZWRMem1DUTgrcm5uaFpRSCBrSjNybGh5UitHUnltK2JvZlRtUjVGalJpUnFRbzc0Y3UvWFl1NzhBY0YzUFI5NzBWaVErZDVJM01sZWtaL3o3YS9NOFJNcUQ3TUFOIHBUbmV6aHliNXZ3VjNGcHBUclZrSmFRNUFEZWQ4b3dNemk5a3RwY3drcDdXN1o2VUI1Q2Q2M3d5RVlsUEo5ZFBHbDREOHJkTzBiR24ga21kbldGR3lBb0JxRTdQZTkxV1ozbm9RdjV5bGIxN0tNKzdrZVN1a1BBZ1BzZ01MVEhOV0hXbE9KRG5mSlM1YmVXbk8rSG5veXdHQSAzcVRISzJ1dEpralBnOFE5UERibCtmM3h4a1dFV25oV1Jub29heUU3c0VEUmlVYktLMm5POTBCMGRObktubVcxVnBKekovVGxBRUQ5ICtTdnE1OW1ZbHoxN2VsclNvMlhIbHJiR2M3YTAzRkRXUW5iZ3pKSWpFazgyZUVjOTZONmNVV2ErTzZLanR5Ri9iYVE1VVFPeWtPWUEgd0lTVVJ6NmZSMXFUVzVIMFZIcDdXc3ROM3ovdkIyVXRaQWNXbE9ib3VOYzd1Tk5MYzdUY2ZKZjkvcHhSZEZxOU9aU3NBR0J1NmJINyBlWHFscDlxOGJGZGozQVVwajFmV1FuaVFIVGloNkVRajVWRnZqaWM2VWRuSzdzMnA3TXhCY2dCZ3pxVEhQdDlGU2JiOVJTOFNuM3Z4ICszaWlYK0RlVGJLek1mY1o2VUYyNElpaW8zL1l2VFRuVWZ6ZW5PK081R2pSMFUzSVh1VHI5ZWFJMEpjREFQTSszMldsclkyMHo5MWEgTjFLZXFJY24yZ3YyWWRJZFVoNWtCNDRrT1dKK0NQVVB0bTdLaS9ibVpLSmptNUM5TkNjYUp5Zk5BWUJUcFR4YjlmcmczTHo5UExhZiA1NzRoUFZHSi9zTkplQkFlWkFkbVRuTmFaU3ZkaEd6SHlTUFJ5WnFRMThsdk9xUTVBTENFbEtlMWhYbWR5TTU5UTNac3lmN05TQS9DIGcrekFrVVFuMnAxVFRYTnNmMDQyVWs2YUF3Q1huUEpFbTVpajNUdnJKT0VabndmZmtwUkgxUHNBMllGTzBmRU84QnhGWjV5VzBxZVQgUjVMelhmYVhCRVpOeVBUbUFNQVNueHNQVFhuV1NuRHV6ZXRXZEtLUzFwdjYvUFR4SUR0d2dPU0k3RzhSamNwV1VacnpYMUl2VzQwZiBtMGtyQUxpRTU4bWVsQ2VUSGs5MktpVXQyOGZEUGg1a0J5YWtPVkYvanQyZDQwMWEvWmQ2cVJjRlJydHpzcEZ5MGh3QVdPcHpaay9LIFk2WEhreDlQZHJLbVpkdkh3ejRlWkFjbWlJN1huNlBMVm5wdmpoWWRtK2kwZHVkazB3ZWtPUUN3OU9mT0xPWEpraDZiNEZSbEp5dHIgQ2NLRDdFQmJkS0w5T2Q3dW5MOGN5ZkZFeHp2QU14b3BIMGh6QU9BQ24wZWpsTWY3UlZKTGo1V2Z1MFNHaG9iMDBMaU03RUNINk9oRyBaSHUybFMxYldja1pTMWM2MGRGbEsxMmpIc1NmdGhKRUJ3QXU5UGswMnI0Y3BUeGVlY3ZyMjdrTHBNZjdIQ0kwTGlNNzBCU2RWbitPIGwrYm9STWNiSzg4Mklkc2ZVaVFIQUM3NXVkVkxlYWFLajVVZ2IwckwrNFdSeG1Wa2h4OUc5VkpQWEdYN2M3S3lWU1E2M3BKQW1wQUIgNEZhZVkzdWxKNU9jZFVOMnN1ZFVHcGVSblpzWEhmMURGdTNQaWNwVy81TDlIVHJSV0xrVkhkSWNBTGlGNTF2dkpIWDk1ejJUVzczbCBMSHVRS01LRDdOek1ENTdlb1dNYmtXMS96aWc2M3p0RlIyOUQ5bzU4UUhRQTROWit3ZHpLL2c2emJPVkhyL1MwOXBNaFBNak96Znl3IFJhUGwzcUpBcnovblg3SmZ1c29ha1hWL3p1RDhnQ002QUhCTHo4TmVXY3Q3Ymg1ZnYydEl6eUJ4S2N1NzJVa3RoQWZadVNuUjhScVIgbzdMVitMbzNjZVgxNTBUVFZrZ09BTnk2OEZTbXRqTHBHU1FmU1k5U25vMTZpZkFnTzFjdE9ycDBGZTNQc1pLalMxZjY2QWY2Y3dBQSBwZ25QSUgxOVBJUEV1M3BhNmM3NDhXMGZEOEtEN0Z5TjZFUTdkUFRFbFQ3YlNndk8rTG9WblZZak1rc0NBUURpNStkcUg4L0tQS2ZlIEZXU24xYitEOENBN1Z5MDYzZzRkZlZyNWZ4bko4VXBYV25TODA4cnB6d0VBcUQxWFYvcDRyT3pZZG9US1ptWHZ1ZmdENFVGMnJsMTAgbmdMUitaY2pPOTRPbmV4OEs4cFdBQURUaENmcjQxazVNak1VYmw1aTVJSHdJRHNYSnpyWnNzQm90UHhmNGljNjNtaTVGUjM2Y3dBQSA1aEdld1pHTjZnYm15bFJXQnNLRDdGeVU2R1RMQWtmUnlVcFhOdEd4b21NbnJ1alBBUUE0L0RrODZ1TnBUVzZ0R3RMVDg1eU04Q0E3IEZ5VTY5dFJ5S3pyZkplN1JxWW9PL1RrQUFQTStuMGQ5UENMdGRHY2wwMU1kaEFmWnVWalJ5WGJvZkRlQ1k1dVJJOUc1UTNRQUFNNGkgUEt2Q3JiVkZHZUZCZHE1R2RQUldaTzh3VDY4Wk9kdUtQSDY4Nk1SeUpBY0E0SGpDRXozUFZtUW5lcDZ1UEdjalBNak9va1hIanBhUCBvdk5mZ2VoOEQwUW4yNkdENkFBQW5FNTRkT055cTVlbmRlM29BZUZCZGhZdk90OEMwZkVtcnJ5dHlHT2l3Mmc1QU1ENWhFZU05TmkvIDAycGlQdlI1R3VGQmRzNG1PanF5OUpxUjlXR2UzclNWSFMwZmQrallaWUdJRGdEQStaLzN2VWt0NzNuNFdNL0xDQSt5Y3hiUjBSczAgYlRPeUp6ci9SL3pSY204cnNuZHFPYUlEQUhEZWE0QnRYTDZUL1Q2Y1ZmRmpJVHpJemtXSWp0MmpZdy8wdEtLalpTYzcvaUViTFVkMCBBQUNXSlR6REVhUUc0VUYyenZwTkhoMEI0WTJYVzlINVArcDlWblFlUDIrNkVabGxnUUFBbHljOHAzaU9SbmlRbmFOSmppMWZlVWRBIFpLSmp4OHRaRmdnQWNKM0Njd29RSG1UbjdLTFRtcnI2Sm45MjZMQXNFQUFBNGJGc0MrOUhlSkNkV2I2UjlldTZJVGs2NnlxYXZQcVggRVIwdjBXRlpJQURBN1FwUGo2eThJenpJenB5aUUvWG85SWlPYmthT1JJZlJjZ0FBaEtjaVJGc2xQUHJ6SWp6SXppeWk0NDJZYTlINSBMdnZuWEgyWDNXYmtKMFFIQUFEaDZaQ2E2SDIybklYd0lEc0hpWTRlTWMrT2dmQU85R3p0MFVGMEFBQVFub3I0dEhwNEVCNWtwMXQwIDdIWmtMVHBlNmNwclNLNU9YU0U2QUFBSWo1VVg3MlYwRTBkNEFObHBpbzR0WGRrVHpQK1MrQVR6c2FUMURkRUJBRUI0T29XblIzS3kgMGhiU2crdzBSU2NyWFkyaUV6VWoyNmtyZmFnblc1RUJBQkFlU2FURWs1eU5lZW5KanYyNytuNGdPeENLVG1WcFlLdDBOZmJvZUp1UiBFUjBBQUlRbkVwOU1kaUw1MFRDU2p1enNTVTdQMGtDdlQyZDhlMHgwdmdyTnlBQUFYR1A2aFNlU0hYdkxraDVHMHBHZG5XOUMvYnBYIHZ2SkVwN1V3TUJPZEFkRUJBRUI0R25JVENVNGtQZEcwRmhOYU55NDdsYVdCZHNROFNuUnNRN0xlcGFOTFY0Z09BQURDNHdtUHlIN2YgVHEvNFJMMDhOeitodGI3aGJ6cVJ1SHhsUjh3ajBkR3lZMFZuVEhUV1F1a0tBQURxSmExREVoNHY2Ym41Q2ExYlQzYWlFWE5idnZvdSArMGRCZUltT1hScW9TMWNEb2dNQWdQQklMZUdKbXBOLzN6N01yU0k3TnoyaHRiN1JielNiNk9qRmdZK1NOeVRybTdkTFIvZm8zQm5KIEFRQUFpSVJuSzM5NlJrWDZrNTJzcERWeWt4TmE2eHY4QnRPdlIzMDZudWhremNnc0RRUUFnRU9GNTA2OXZ2MjhybFNUblVyS2M3TVQgV3VzYis4YlNrcVBMVjE3cHl2YnA2RFRITGcxRWRBQUFZQTdoR1pTTWlQamxMQzAxV29CYWZUd2pOOWV3dkw2aGJ5Z1J2eUg1WG5iTCBWN29oT1pLZDZMd3J0aU1EQU1BaHdqUEt6cDBqTzl0QWNxS2JMV2xwd2RtbyszRDEwbk5yeVU1MjVwVTl4ZHhPWDQwTEExc0hlN0lkIEdRQUE1aENlU0haMHV0TVNuYWlrcFV0WVYxL09XdC9JTjVHVkhYdVNlV3REc2k1ZDJha3J2VXVIUkFjQUFPWVFIdjNMK2RSa3g1T2UgbTJ4WVh0L0FOMCtQNkhoOU9yWkg1MnNpT2l3TkJBQ0FPWVNuc24vSFMzZmVQMjllRDgvTkhpbXh2dkp2R2lzNlkrbHFyVVNuMWFmRCBkbVFBQURqWGRVdzNMTjlMTzkxNWw3NlVSK1FHR3Badklkbnhqb040VUxJVDllbFVSWWZTRlFBQXpIbmQ4aWEwdklabFBZWFZrcDFOIElqdjY1VldtTytzci9tYXhzdE56a25sRmRMenlGYUlEQUFESEVoNVBkcllTOSs2OHkyNVp5NXZRMGg5cmRhM0NzNzdTYnhKUGRIU3EgTTRxT1BmZnF1N1NQZ2REblhiRWRHUUFBVGlFOGVpUzlsZTU4T0pMVEdrdS82djZkOVJWK2MyalJXY24rNGtBOVp2NlhFaHN0T21NeiBNa3NEQVFCZ0tjTGpUV2hGNmM2NzFOTWR2WFBuS3Z0M3JqWFo2ZDJuWXhNZHZSM1pubUxPNUJVQUFKeERlTElEUTIyemNpUTdudlJFIGg0ZGVUYnF6dnJKdkNDczdla3V5UHZkcVRIWCtTa1RuYXlJNkpEb0FBSEJxNFJGMWZkdCtYcGZzZEZiV3QrT1Z0anpadWJyK25mVVYgZlNONG9yTXVpTTczaHVqUWtBd0FBRXU2MW9uRURjdTZmK2U5Y0l1a1IvZnZYRHpYbHV4azAxZTZJZGxPWDMyWCtDaUlyQ0VaMFFFQSBnRk5kNDZvTnkxNy96dHZuTFJPZHF5MW5yYS9rRzBBUzBSbjdkTEpVcDNMbWxWZStBZ0FBT0pmd1JBM0wwV1RXZXlBK1dlUHlWWlN6IDFsZndIKytKVHRTbjg2MGdPalFrQXdEQUpRaFAxTENza3hvck9HOUdkdDRjNGRGVFhsZFJ6cnFXWk1mS3pyM3NwenFlNkVSblhvMy8gbm9aa0FBQllxdkNJK0EzTEQ3TGJ0L1BoaU02cnRFdGJWMVBPV2wvNGY3Wkl2anp3VVhZUCtiU3k4MDNhUjBIUWtBd0FBRXUrRG9ycyBOeXg3bytqdlNuUmVaVC9sOFVUbktzcFo2d3YvRDY0Y0IySExWL3JsWDBwMGRLcGorM1FFMFFFQWdJVmRCN09HWlU5MnNuVEg5dkRZIHB1V0xMbWRkZXJKVGFVcitKdnROeWJwMDlTVVJIZHVuQXdBQXNGVGhzZGRETFR4ZXN2TnEzcmF5Y3pYbHJQV0YvdWVLeEUzSmR2cksgcGpyMktBZ1dCd0lBd0RVSVQ3Unc4Rkg4ZE9mVkVSK2I4RnhGT1d0OWdmK3BudWlNaVU2VzZtamhHVVhuaXhLZFVYYVl2QUlBZ0VzViBIakhDRTZVN1ZkbTVpbkxXcFNZN3ZlVXJLenJSUGgxRUJ3QUFMbGw2dE94bzRmRjZkMTRENGJtNmN0YjZBdjhUSytXcmI3TGZxOVBxIDB4bUVQaDBBQUxoYzBmRWFsa2ZoZWZpVWxpZnhlM2RzRDg5VmxiUFdGL1NmNklsT3BYeGxSVWZ2MDlGajVuZENxZ01BQUpjdlBQcDYgcWFlelJ1RnA5ZTVFQ2MvRmxyTXVMZG1wbHEraXB1VHNnRStiNWlBNkFBQndxZElqc2p1T1hwbk9lZ2xrNTEwdXZKeTF2cUQvdE94SSBpS2g4MVROOVJma0tBQUN1UVhSYTQraVBTbUplRzdkczRlREZsTFBXRi9DZmxvbk92ZnhaQ09nZDlPbjE2VEJtRGdBQXR5QTgrdnFwIHkxbjNTbmhzT2N1bU85R0c1VUV1cUp4MUtjbU9scDFCZHN0WCtraUl2OFJQZGI0Nm9rUDVDZ0FBcmwxNlJOcmxyS3gzSityZjJacWIgbFN4a3AvTS9TU1ErRXNJNzBidzMxYUY4QlFBQTF5ZzZQZVVzcjNmblJmYjM3K2gweCt2ZldTU1hVTWJTaVk0OTVQTkppWTVOZHV6MCBGZVVyQUFDNFJlSFIxOU5XT2N1VEhTL2hzYktqcDdRV0p6M3JCZjhIU1NBNnJWUkhOeVJUdmdJQUFLVG4vK09Wcyt5eVFTMDNMK3JtIGxiTjB3ck9TQlRjcnJ4ZjhueEtObWx2UmlXU0hRejRCQUFEUnljdFpldG1nN2QzUm91TWRLV0hMV1l0dFZsNXlzaFB0MU5HajVsK2wgUFdadWx3ZFN2Z0lBZ0ZzVUhuMTl6WllOZXNtT3Q0UEhHMGRmWkxQeWVvSC9JZUxZcDkycEUvWHFhTkhSWjE5UnZnSUFBS1RuL3pPbyBsN3FjOWY1NTdYd0xaR2U4WmVuT0lwdVZsMXJHc3IwNjNwRVFYd1BSYVIzeVNma0tBQUJ1VVhSc09XdE1kL1E2bDNkSGRuNTkzcktFIFp4U2VRUmJZckx4ZTJIK0VscDN4UDZJMWdmWE5FUjF2K3VwT0tGOEJBQURDWTRPRk1WVDQrTHgyWnFXc1NqbHJjYzNLU3l4alJlV3IgU3FwalJlZGUvQU0rRVIwQUFMaGw2Ukg1c3dYNVR2Nk1vdXRtNWRmUGE2dE9kM1RLRTZVN2kydFdYaS9zZ2UvZHEvTk40ajZkZTlrOSB6Wnp5RlFBQUlEcTdNcUtGeHc0QzZYVEhpazYyY0hCeHpjcnJoVHp3V25Sc3JQYWdIdml2Z2V6MGJrbEdlQUFBNE5hRlI4dzFkNXpPIDBzM0tXblk4NlhrTlpHY2pDMHAzbHBUc2VLUG1hOW1kd1ByaXlJNFZIVytuRHVVckFBQ0FPR3dZbktEaDBRalA3OXV6SXp0ZU9XdE0gakJhUjdxd1g4a0JidTR6S1YxK1Y0R2pSMFR0MW9rUUh5UUVBQU5pVkR6c1VaSStTMEpOWnZ3WG5MOWt2WittRXg5dTlJMElaS3ozViAzRFltMjBUSEd6UFh2VHBNWHdFQUFMU0ZaMHhpdk9rc2ZRMytwVjVXbXBWMUtldHM2Yzc2ekEreWZsMkx6bHI4Q2F5djBpNWZhZEVaIEVCMEFBSURTOWJqVnJQemlpSTVPZUd6dnp0aS84eUdVc1pyVFYxOGN5ZmtxL1UzSkFBQUFzSDhkOXBxVk4rcDYvQzUvMmtsMGsvS3ogL09uaDhmcDN4ckxZMlU5Rlg1L3h3ZFd5czVMZHBtUnZXM0tXNnRqeUZVM0pBQUFBMDY3TDNwbVU5cHI4TEgzbExKRWJMMk5GcVk0KyAyYnpTcStQMTZTQTVBQUFBN2V0eHRGbFpCeEJ2bjlmZUxOMFpoVWVYczhieTJOblNuZldaSGxSdGozWUM2MTZKVGxUQzhzcFgrdndyIFVoMEFBSUREcnM5ZXVqUEtqazUzdkhMV21PNjh5d0xTbmZVQ0gxQ3ZWK2Vya1IxdnB3Nmo1Z0FBQU5Pdnkzb1VQV3BXMXNMenl3aVAgVjg3Ni9XL1BudTRNWjVhYzFxajVWMGQwOUU0ZGIza2dvK1lBQUFDSFhhT2pFdzMwTmZxTENTUzhZNXU4QmI4bnZ6WXZvWXpWU25XaSA4cFgzUURKcURnQUFNTTkxV3FjN252RDh2aTZQZTNlZTFkdS9YMTlVdWpPYzRjSHpVcDExWUl6ZUJGWW1Pa2dPQUFEQTRkZHFlNzF1IFhhdDFLTkdxd0p6OFduM3VNbFpydE0xNzhPd0VGdVVyQUFDQSthL1hxK0wxMnJ0bTYrdTFIU0k2dWZRTUozelFyQ1cydGlYYkJZTFIgcG1RV0NBSUFBTXgvemJiWDdhaFpPUW9uRnBQdW5MT01GZFVBSTBQTUxKRlJjd0FBZ1BtdjI2c0oxMjNkZHJLSWRHYzQwWU5sSHpqZCAzYTNQM3ZoaXpGQy96cWc1QUFEQTZRT0tiTkhna3lNOFgyUmhrMW1uTEdONVVWaXIyU2w3c0RnV0FnQUE0SFRDWTlNZEw2ekllbTNQIGx1NE1KM3FnUlBKR3A4d01IeVh1MVNIVkFRQUFPRTFnMFpQdVJPdGl2TERpYXNwWW5oWGFjN0Iwc2xOdGNHSUNDd0FBNFBpaFJTWGQgaVVJTGZSMzNKcW5sMk5meFU1YXhzbTV1VDNTaU9mM29RUUlBQUlEVEJSZmVaRlowTGJlbHJKTk9VdzlIZm1DeUIraEJkbXQ5MllNVCBwVHBIdDBFQUFBQkVaK2Q2SGsxbTJVTzhLeWNmbk9SNmZvcWVuY2dFN3lVdVlla0h4azVncllSZUhRQUFnSE5JVDdYLzFtdEowZW5PIFNmdHZoeU0rSUpFRmV1ZGdWVklkcjN0YkJPRUJBQUE0aGVpMHJ1dFpPYXQ2cnVWRnlZNTlZS0xUemFOVTU2d0dDQUFBQU9uMVBldmQgZVpScHJTbEhHemdhanZRZ2lDTTZVK3h2M2JBL2hBY0FBT0Qwb3FPRnh4czZlanBRZUJZdk85YjZWcks3UkxEVnF4T05xSkhxQUFBQSBuRmQwdkRERERoOTV3dk1rZmFXc1dhL3p4eTVqWlNXc0h1dTdFeWF3QUFBQWxpSTkyZkNScmQ0OE9jSVRYZU9QRW1nTVIzZ0FKSGdRIDdCTEJMd1hyMHcvQ2dPUUFBQUNjWFhRa3VkYTMrbklmcFQ2R3Zsalo4WXpQSHZwcDQ2MG5xY1ZiVnFZQUFBRGdmTktUbGJLOFVmVHMgV3U4SnoyelgrbUhtTDF3a1B2UXo2OVhSSlN6ZHE4TUVGZ0FBd1BKRXg1T2U2SVFFVDNwc0ZlZW92Ym5ITEdQWlhwMnNVOXN1RWRRbiBvM0lHRmdBQXdIS2x4MTd6ZGJxakF3NmQ3TFFhbFdlOTVoK3pqTld5dk9nTHQxLzAwWmNOQVFBQXdHVFJhUzBaaks3N2V2SjY3Vnp6IEYxZkdxcFN3SXNQejZuY25tNzBIQUFDQWc2Ny8xVWJsVEhpTzJxZzhuT0FMOXZwMXJPaEVSME13Ymc0QUFMQmMwYWtLejVNalBDY3IgWlEwemZyRWl0VlNuOHNYcWNYTlNIUUFBZ09XTGo3NytleWVpUjJISDBhczZjNWF4cWlVczc0czkrVFpGQUFBQU9Ma0Q5S3ljbWMwQiBqbFhHMGsxS1VjMHU2c2Era3lNMUtBRUFBTURzb21NOVlNN0FZNVowWjVqcGk0eEV4MFpZaitxTE8rc0pxQUFBQURDNzlMUW1zL1FKIEN0b045RFQyblN5d2pPWE4yZXVOeVpIUjZiMDZkb2tnNCtZQUFBQ1hKenFWZE9jeGNZRk1lQ1o3d2R3OU85NVpXQzNaT1dwMEJRQUEgQUNjVkg2OVJ1UkorWkgwN1ordlo2ZG10OHloeHFwT2RpM0h3RndnQUFBQW5FNTNldlR1UGtsZDZGdE96NDFsY0ZsdDVqY20yWHdmSiBBUUFBdUN6UnNYNlJwVHRlQ0tLZHdKNmljSkFiREROOFVUMEdsOVhuYUV3R0FBQzRmT25KRmd6Ym9hWEh3QXZXTXVOeXdXSEdMNmpTIGpPUjFYbWNia3dFQUFPQnlSQ2Z5Zyt4UThLT1hzdVlxWSttUjgwcFV4Y1prQUFDQTZ4YWZhUGRlbE81RTI1UVBUbmlHaVYrQVoyNTIgQ2l0clFvcStHTy96QUFBQXdHV0pqb2hmK2NtRXA5WGlNdGtOaHBtK2tHeDVrRmZHeW5wMWtCd0FBSURMRjUyb3AvZGU5bGZUVkU1ViBPR3ZQVHJSSTBCT2VCL1Yzc29nS0FBQUFMbDk4Qm1tdnBzbWFsR2NwWlEwVDduaG1iT3VHclhtZDF1eldBUUFBdUQ3UjhWd2g2dTA5IGFpbnIwSjRkejlhaU1oYUhmZ0lBQU55RzZOaTM5VlNXRGtZaTRabTFsSFZJejA2MEVqcWJvZGNsck9ob0NJUUhBQURnZXNUSEsyV04gQWNtajhZYWpsTEtHempzc3NoOU5lYkdVZDhjcmgzd0JBQURBOVloTzYvaUlrNVN5RHVuWjBhYm1iVWQ4TUs5bmpjbmRkeHdBQUFBVyBMVHJXTjRaTzRabXRsRFcxWjhkYkZCVGQ4Y2pRS0dFQkFBRGNodmhFTzNkT1VzbzZwR2NuTytUTDN1NkZFaFlBQU1DdGlrNDBsVlVwIFpVWEp6dXc5TzYzekxucFNIVXBZQUFBQXR5RTYxamt5ZDRqODRlQ3pzZzVwVVBaU0hTL1o4WHAxdkkzSkNBOEFBTUQxaWs5V3l2TDYgZmFOZTMrNkVaempDbmZWa0owcDFFQndBQUlEYkVKM1dnc0ZxMzg1UmVuYXlFbFowMW9XWDZzeDZxQmNBQUFCY2hPall0N05KN3NvSSBlbmRnTXFWbnh6WW1aNmxPZENjUkhnQUFnTnNUbjBIT01PRFUyN09UTlNmZlMxK3FnK0FBQUFEY2p1aDR3VW5tRWVOdExmNlptaUxGIDBHUkt6ODVjL1RyTk93Y0FBQUJYSVRwV2VySUtVWFRNVk5UN2UzQ0RjbXZrUEl1ZnNtVkFpQTRBQU1CdGlrOG1QRldmbUwyTTVRbFAgYStUOFh2TGpJVmFCOFFFQUFNRDFpbzVJZk9UVTJqaUU5WWs3eVNlN1Y0ZklqZ1FXMW1wT3pzNjBRSEFBQUFCdVUzU2lZNmNxZlR1VCBqbzNvbFIxN2F1bmEyQmNqNXdBQUFGQnhDdTl3VU9zVmxVclJRVDA3WHFkenRGK25JanFNbkFNQUFDQTZWbmlzNkhoZW9aM0M2d09lIExEc2k4U0xCcUlSbGJZd1NGZ0FBQUhpaTAycFU5cEtkU1VkUFRlM1o2ZG12TXdpVFdBQUFBTER2RmxHamNsVEtPa3FEc3Bmc2pNSnogN3dpUE53OS9oK2dBQUFCQTRoZFJzbE5aWjlPc0dnM0puZkRNUzkrWnRYTkhLcWVjQzlJREFBQncwNklqMGo1Y1BDcGxlUzB5TWtWMiBSUGFqb1ZYeHpsUWFrd0VBQUFEUnFTd1l0SDdSU25kV1BiSWpnWG5aemNuZUhkSWxyRkx6RUFBQUFOeWsvR1I5TzYxa3A5UzNVKzNaIHljcFlXblNxMWdVQUFBQ0lUclZ2SjlxM003bEIyZHV2VXhrTlcwdTlub2IwQUFBQTNMYm9XTWRvdGNyWVFLWGN0ek4wM29ub2prU2kgUTc4T0FBQUFaSTdSS3p6ZG5sRnBVQjdFYjA3MmhLZDFGaGJDQXdBQUFOWTNvc1hGRmVIeFBHTlZsUjByUE40Qm9GNnF3eUpCQUFBQSBxSXBPNjZRR0wxanhYS043R3N2K0l5OWFpajU1NjRnSXBBY0FBQUJXZ2ZCRXcxQlpiM0JheWhxQ1QyeWxKL3JrYTRrbnNKakNBZ0FBIGdLcncyQkYwYnlES0JpdWxKdVhXTkpiWG5PeWxPNU82b3dFQUFPQ21KVWY3eGlweERTOWs4VTQvZDkyalZjYXFOQ2RIeDY2WDU5OEIgQUFEZ3BzV25OZjA5SldCWnRXUkhwRFoyN3BXeHVvOWVCd0FBQUtSSDZxMHpYUUhMMERBc3J6djZybE4wQUFBQUFDTEJFYW0xem1TOSB3bW1UOHVCOFFuc25Ldld6TzRuUHFrQjRBQUFBb0NVNnZYMDc1Y1dDd3dHR2xVMWlNVzRPQUFBQXZmSlRGWjRvWkJGUGVySXkxdEQ0IGhOa0lHTk5ZQUFBQU1GVjBvbVhHV2Q5TzJLUmNtY1k2Sk5taE9Sa0FBQUJhb2hQNVIrWWRXbmk4bnAxMEdpczY3YnoxaVdoT0JnQUEgZ0VPa3B5ZG95WHFGM1RMV0toR2Q2aWRrY3pJQUFBRDBDbzVJdlVtNVVzcmFvelY2M2hLZE8rbGMyUXdBQUFDUXlFOTJDSGxMZEZ3UCBpVWJQbzFUSCs0VDA2Z0FBQU1EY29tUDdkdTdNNjYwbTVmKzhISkpQTk40eXlibXJmaUwrRHdFQUFHQ2k5TndaLy9BOHBObXpVeldyIGlsRlJ5Z0lBQUlCZXdjbEU1ODRSbnRhUkVmLzV1TmxTd1lyb2xKdURBQUFBQUJxaUkrSUhMaTNwU1JjTERoT3NxbUpUSkRzQUFBQncgaVBoazZVN1hNVlUyaWZGNmRxSjBwN0kxR2VFQkFBQ0FYdUdKSnJKYXdVczZqZVd0Vng0NlA4bEsySzhEQUFBQTg0aE9SWG9HOFpjYSBoMldzeUtpR3hpZUpHcE9aeEFJQUFJQkRwR2ZvY0pGU2czS2xoRldOalJBY0FBQUE2QlVjNlhTUlRIaEt5YzdRWVZTVXNBQUFBR0J1ICthbWtPNjBHNWRWUXNLcEI4a1FuTzFvZEFBQUFvQ0kybm9jTUVxYzdtWXMwajR2SVRHb29tQlRTQXdBQUFIT0lqeWM2MVhUblB6NHkgQkIrNEZSME4wbzZPRUI0QUFBQ1lLanlWZ2FsU3BTazdHeXY3b05tWUY1SURBQUFBY3duUGtOeWkvbUVSMDZBYzFja3ltL0lzQ2dBQSBBR0F1eVJHcGh6RHBkUGpRWVZHVlppQjI3QUFBQU1DYzBxTWJsZThrRDJCY0p4bWNEeWlCUlhrdjA5Z0lBQUFBb0ZOd3JFdGtqY290IDBmbGZldmZzZUtLVEhyNEZBQUFBTUZGOHZIUm5hTnoycHNPckc1UXJKZ1VBQUFCd2lOeEV3aE9KVHFXTUZZNmVWL3AxbU1RQ0FBQ0EgWTBsUEZNQ3Nla1JIcEQyTkZTMFZiQjY2QlFBQUFIQ2c4RlNrSnd0Zy92Zlcyck1UQ1UvTG9oQWVBQUFBT0ZSNFdzdU9vL2Z0TURRKyBjS3NCaURJV0FBQUFuRko4dXIzRWpwNUx4d2VqT1JrQUFBQk9MVG1lcDZUVDRhMWtwOGVndkRzSUFBQUFNRlZ5NUFBdjJWc3FLQkkzIEtLOGtUblRZbWd3QUFBREhsQjZSV251TjE3TVRIaGRSRVI1RUJ3QUFBSTRwT09JNHlhU3FVelE2dmtvK09FM0pBQUFBY0FycHNjRksgSkRpbEJtV1JmSHc4cXAxbEpnWUFBQUF3dC9pMFJ0RDNmQ1k3RzB1a1hyWkNkQUFBQUdBT3FhbUlUaVE4N3JUNFVMU29TSVFRSFFBQSBBRGlXOUt3YXd1UDFGdS85KzZGZ1Zpd1BCQUFBZ0tVSlR6WkV0ZU15MGFubmtyd2VTUkVBQUFEQXNjUW51NGtrUjFnTmdiU3NpamVFIEJ3QUFBSllnUHRIZkxXMVFSbmdBQUFEZ25HSWpqbTlrTFRjN2Y5N2FvTnl6VzRkZUhnQUFBRGltK0lqVTJteDJHQUpMeXNhN2FGWUcgQUFDQWM0aE85TDUwOTU4OTlUeGJ5YndxQ2cveUF3QUFBS2VTbnVhZlpVc0ZxNnVZQVFBQUFCWkxsT3hFMndtOVUwVVJId0FBQUZnQyBxMGgyYkFuS1MzS2FKNG9DQUFBQUxFRnVQTm5SLzhCclVLNlVzeVo5Y2dBQUFJQmpZNWNLdGtiT0k5RmgzdzRBQUFBc1duWWk0YWxNIFlDRTZBQUFBc0dqWmlUWVFpdFEzS0FNQUFBQXNWblpFYWh1UlNYQUFBQURnWW1Vbms1aktHVmdJRUFBQUFDeGVkZ0FBQUFDdVduYTIgd2QvWnFqL0wvZzRBQUFEQVltVm4yNUFjS1FnUEFBQUF3Q0psWitzSXp0WjVPN29CQUFBQUxGcDJ0T2g0Z3JQNXZFV2lRK0lEQUFBQSBpNWNkVDNRMmdmZ2dQQUFBQUhCeHNpUGlsNjgyNXBZSmo1aVBCUUFBQUxBSTJiRTlPNTdVV09HaFp3Y0FBQUF1Um5aRTRuTFZKcmw1IHBTOEFBQUNBVTFGeWp5SDRoMTZha3pVcEF3QUFBQ3hTZnFKa0o1ckdhazFtbFMwTEFBQUE0QlFNRWk4TzNCWWxCN2tCQUFDQVU3Q2QgOG1mVlBUdmU2OTRuUVh3QUFBRGdGSktUVlpXMmtleDRvbFBkb0l6a0FBQUF3Q21FWnh1OEhqSWtSbFE5SmdMUkFRQUFnR01KVHVRYyAyOFJiZHY1OENQNWk5RUdrOFQ0QUFBQ0FVd2hRcFg5NGEyVkhIRnZhU241UUtBQUFBTUM1QkNjN3ZQdy8vM1lvZkdDUk9Oa0JBQUFBIE9KYmdTQ0l6MGFrUGFSa3JraGg2ZGdBQUFHQkpvck5KaEdmdjMyZGxySmJZZEhkREF3QUFBQlFrSjNPUzZFaXJjRTFPZE9wNTlra1EgR3dBQUFEaTFCSG1uTzJTblBQem4zdzZTTnlGdkc4S0QrQUFBQU1DeEJVY2tQcUE4TzcvVExXTjVjdU5GUkZFVEVPSURBQUFBaDBwTyBKRDNiUkhvMmdhTTBqNHZZU0h3b0tNSURBQUFBcHhDZmx1Ulk0ZG41OTVYaklsbzFzYXpYQndBQUFHQ0s1R1NUV0pWVTV6Ly9ma2crIGFPdURaWWVDQWdBQUFNd2xQZHZBUTdLK25mL1FTblphTVJITnlnQUFBSEFPNlNsN3lkRDRZUGFEZmtpaEVRanBBUUFBZ0JrRnB6SnkgN3ZYc3lDZzcyWlpDVDNRaTRVRjBBQUFBWUM3UmlhU24wa2U4Y3hzQzBkbEludWhReGdJQUFJQmppazVMY3FyVkpuZURjcGJzWk5JRCBBQUFBY0tqa2lPTW1VY21xSkR4RDR3TnZwRC9sQVFBQUFKaERmaXBuWWtVOU8zc055dEh4RURiVnNYMDcyWEpCQUFBQWdGN0JzUzRSIE9VbHBlN0tXbmVnRGVrbE9KZGxCZkFBQUFPQlE4YkdwemtkRGVzS2xndEUwbHRldjgrRjhBaHFVQVFBQVlHN0o4WVRIYzVLc2w3ajcgdUlqc2c1UHFBQUFBd0RHa0ordlBzVjdpdHRWRW8rZlpqaDN2QXpPVkJRQUFBSE9Mam5hU0QrZTJxZmhJNWRUemo4SW5ZZDhPQUFBQSB6Q1U2SXZudXZ5NGZhUjBYa1gzZzdCTUFBQUFBVEJFY0t6cmJvdWlVRHdLVm1UNDR3Z01BQUFCVHhhZlZPOXdLWDNZK25yZEJXWndQIHZwSCtaQWZ4QVFBQWdCN0pzVzhmWE1MNnplQjhncFpOdll1L1lKQlNGZ0FBQUJ3cVBKWG01SGZwQ0Y1NmUzYmVDMGFWV1JvQUFBQkEgVlhvcXFZN1hXclBqSU5sU3dXelU2MTMyRXg0V0RBSUFBTURjb2hNNXlIdlZRYnhrUnlTdmswWFJFYnQyQUFBQVlJcmNpTFFYRzcrTCBYMkZxQ2s5MjZybVg3cnpMdEhJV0FBQUFRRVY4V28zSlVYVXBtc1pxSGhlUk5TaFh5bGhNWkFFQUFFQkZjaUxwaVVUSEJpK2hmd3dkIFpwVjlvdXlzTEFBQUFJQ0s4R1NCU3lRNlVhcXpjK3I1M2p0bC96aDFMOVh4ZW5lWXlBSUFBSUE1cENkclVQNUlIQ1JzVVBiS1RhM3ggY3lheUFBQUFZRzdKOFJZYnZ3YzNMVHBoWmFtM1FibXliMmVENUFBQUFFQlJjT3pMVm5OeU5JMVZIajIzd3JNeHdwT1pWY211QUFBQSBBQUxoOGNLV2ludWtZY3ZVWktkbi9KeUpMQUFBQUtpS1QxWlZ5bVFubkFRZkdwOHdtOGJ5YW1icDZCY0FBQUJBSWpsVjkyZ3RObTZlIGpSVjkwcGJzUko4VTBRRUFBSUJlNGNtOHcydFFEZ09XYVBSY0FzT3luK1F0a0I0a0J3QUFBRnB5WXlXbktqcGRKemkwR3BUSG02MmIgdlNXaWt5VTdDQkFBQUFCRXdwT1ZzRHp2ME03Uk5YcXVxZmJzZUovWVBXWWRBQUFBSUJDZmJWRjBzcEJsenp1cXlZNDMvdlVtdXdsUCBOdStPOEFBQUFFRExPV3pJNG5sSFMzVEVla2MwZWk0ZG4vaTk4TWtSSFFBQUFOZ1RFWm5XbU95VnNVU0taYXlzU1ZsLzhqZlpUM1l5IDRRRUFBQUNReER2c1FKVG5IRDFuYzRheUk0NXBSWDA3YjhrZHlNN0pRbjRBQUFBZ1duZmo5ZXRrd1VyejVJYWhjRWV5V0tsSGVCQWQgQUFBQThEd2oydXYzNWdqUGVHc3RGQ3pKVGxUS3NwTHpLbkd6TW4wN0FBQUEwQktlaXVpMFBFTmt3alNXRkd3clNuWTg0d0lBQUFESSBsZ25hWWFpVzZEUVhDa2F5MHpveXdpdGp2VW90MmFHY0JRQUFBRm1vMG1xVnlaS2RzdXg0ZDZneWtVWGZEZ0FBQVBRSVQ4VXhvbmFaIHNsOE1uWGZFczY1WHFkZlRFQjBBQUFEUW5wRlZqMXA5d1NYaDZXMVExdVlWV1JkOU93QUFBRkJ4aXloUW1WSTk2cDdHYXAxRTZ0WFQgNk5zQkFBQ0FYdUZwOVFTL2lyOVFzTlN2azhtT2Q4ZXlVMGhmSlc4aW9tOEhBQUFBeEJHZEtOWEoybVM2anFYcWFWQnV4VXl2NHFjNyA1ZEV3QUFBQXVHckJpZHpDTmllL1NwN3NkQTFBRGNVN1ZtbFNmalYzc05La2pQZ0FBQURjcHZUMFRtRzl5ZjZaV0VkdlVQNXc3a1JsIG16S1NBd0FBZ09qWWd6KzlYaDF2QUtxclg2Y2xPOTRkekpxVXN6dm1UV1VoUEFBQUFMY3BQRjRKeXdZbjFpdXlzZk9qOWV6WTJwcFggeW5vVDl1MEFBQUFnT0x0TzRUVW1SMU5ZV1hPeXlNdzlPeUxUbXBSYmpjcUlEd0FBd0cwS1QwdDBvdWJrcnZCa1Noa3J1b092UmVGQiBkQUFBQUc1WGVGcFRXUFptUzFnbjdkbVpjZ2NwWlFFQUFOeWU0SGlpRSszVzhYcUF0VTkwTHlrZURyaWpXUm1ydFhPSGJjb0FBQUMzIEt6eXRWT2RGL09Ca2trY01FKzVnWkdUZUhXeWxPNGdPQUFEQTdRaFBKZFY1a2RvVVZwbGg0cDF0VFdYWk81cFpHUUFBQUZ5djRIZ08gWVkrZWVwVzRIY1lLVDNjN3pERGhUdXN5VnF2V050Nml3N3V5QndRQUFBQ3VRM2k4NnBBV25kRWhYcVJkd3VyZTJkZmJvQ3lTSDl6MSA2dHpaTnlNOFhyME4wUUVBQUxodTRiSHVZQmNKWnFtTzE1eDhrZ1psM2FUOFhyekRING1kQVFBQXdIVUpUaVE4M3ZtYUwrYldhazR1IE03Vm5KMnRTOXU2c1hRb1VpUTdpQXdBQWNGM0Mwem9lNGszNVF1UU5CdzA0VGVuWkVXa3ZGM3cxZDl3N3NaUlNGZ0FBd0cwSVQ5VCsgTW9yT1MrQU5zNXpDTUxWbnAzTEhiY3JUdXVNQUFBQndQWUlUQ1k4WGtFVE55VkZJMHNWd3dCZVJuVmJxM1dsS1dRQUFBTGNsUEpVVCB6clAybDFsMjlFM3QyY21FcDlWb1JDa0xBQURnZG9Rbm0rQ3U5UGxHemNrbjdkbHA5ZTFVT3FzcFpRRUFBRnlQNEdoWDJFcDdZL0t2IHhCVU9LbUZOa1IzN3hXVG5XN3lZTHlEYnFNeFpXUUFBQU5jcFBGNHdrb1VpcjRrblRIS0VZWVl2d2pPMjFoY1JSVk9JRGdBQXdQVUkgajNmcVF1UUllcUJwdGhMV1ZObXBscktpTDBJTHorUnpMZ0FBQUdDUmdtTkZSMDloMmNia1g3SmZ3bW8xSjNjenpQQkZWWnFVOVJkaiBTMW1Uam1zSEFBQ0F4UXBQYXg5ZkZvYll5ZTJEM2VEUW5oMHJQSlVtNVJkcGIwWkVkQUFBQUM1UGNqVFpPVmcyREJrREVXOUZ6YUo2IGRyeGxRZDRYa28yaGJ4b1BIQUFBQUN4YmVMSXByS2pxYzdRUzFpR3k0MzFoUGFXc2FBeWRuVHNBQUFDWEx6eXRWT2VYN0ljaDJjR2YgSW1mdTJmRytzUGVPTDhwTGR4QWRBQUNBeXhLYzhXVXIxZmtsZmordnQxOW5sbjdlWWVZdnpOdTM0M1ZjWnhaSG96SUFBTUJsQzA5ciBCOSt6N0ZaN1JpYzR5cVQyTU9NWEdNM1M2eS9rMStjWFdObVNpT2dBQUFCY2p1Um9IN0RqNWxHbHAxTENXbFRQVG04cHE1THVDTklEIEFBQndFY0pUY1lHcC9Ub0h1Y0JjUFR2U0tUdlBwN0k1QUFBQU9KbndSQjZROWZCR1c1TVhYY2JLdGlsSFg2UTNha2FqTWdBQXdQSUYgSi9NQUw5VjVscjRTbHNoQ3lsZ2k5VkxXcy9TVnN1amZBUUFBdUF6aHlScVRXNVBaV1R2TFFReEgrSUpiNDJhZTFWV0ZCd0FBQUpZbCBPVnAwcGw3L2ozbzQrSENFTDdwNjZGY3J4cHJsV0hjQUFBQTRxdkJzMWZXNm11cWNySVExcCt6MGxMSTg0Ykdub2I4ZnkrNEFBQUJnIHR1dStkKzJ2OXVvY3ZURjVidG14WDdBVkhxOXZwN2QzUjVBZUFBQ0FSUWxQNzNCU3p6VDJiTmY4WTVXeHFrMUtWbnAwdXFPLzhObWIgbFFBQUFPQ2c2NzFJZkE3V2VEM1gxL3JLRk5aUnJ2WERFUitJMXZpWi9lSmZoSFFIQUFEZ1VvVEhTM2JHUGwydlQ4ZExkY2JyL1ZGYiBWNFlUUEFBMjNmRjZka2JwcVl5aElUb0FBQURMRVo3S0JGYldyM1BVRXRZeFpHZnFHSm9YYlVXbExEbUc5UUVBQUVENU9sOXRXWGtXIHY1SXpoaG9uT1RuaDJHV3NsdkY1RDRKWHk3TVBBcUlEQUFCd1B1SEpydkcvaXRmNGFBcHI5a0RqV0dXc1E0U25wM2NIQUFBQVRpYzUgSW42cUUvWGwvdnk4dGFhd2pucDlIMDd3d0ZTT2ovQ0VoeVdEQUFBQXl4T2VWcER4SE55OFZPY2tVOWZEaVIrUThVR0orbmE4VVhRYSBsUUVBQU00dk9TSnhxdU9Wc0hTcTgyeXU2Mjl5d29ucjRjZ1Bpa2k5bEdVZmxPeEVkTklkQUFDQTB3dFBkRTEvQ1VRbkttSFphL3BSIHIrZkRpUjRZVzhwNmwzWXBLeXBua2U0QUFBQ2NWbks4OE1KTGRUelJxWmF3amlZOHd3a2VITzhCOGg0Y3I1SEppN3hJZHdBQUFFNHYgUEwycGppYzZYbmh4OU92NGNLSUhTQ1R2M001aUx6MlRUN29EQUFCd1dzbnhRb3RXcXZNc2ZnbnI1S25PS1dUSGlvNCtFVFVxWlhuQyBRN29EQUFCd1B1RTVwRmNuR3pnNnlmVjdPT0VESlZMZnVVTzZBd0FBY0g3SkVibndWT2RVc3RPYjd2d1UwaDBBQUlDbENNOUZwenFuIGtwMUllbHJycGFlbU93Z1BBQURBZk5mc2kwNTFUaWs3YzZVN3JiMDdpQTRBQU1CODErNkxUM1ZPS1R1UjlGVFRuZkhCaTBiWE9CRWQgQUFCZy9tdjF4YWM2cDVhZFE5S2Q2cXcrNlE0QUFNQjhvblB4cWM1djFtZDZJRmVTcHp0ZXN2UGw4MzJQLysvMjhQOXU5NS8zLys1VCAyamFmSDNkbFBnOEFBQUQwWGFkYko1dFgyMDdPbnVxY1EzYXM2S3lrbHU3OCtKU2RwOCtiRlo2UFQrSFJzb1BvQUFBQTlGMmo5ZXNiIHlVODJqeW93aTBwMXppRTdrZlJFRCtTVEVwM3haWlR1akFuUFZza082UTRBQUVEZjlibDZnSGZyd005RnBEcm5rcDBwNlk0V25qSFogaWNwWkt5VTlDQThBQUVEdDJxeGZuM0xpZ2QyTHQ0aFU1MXl5RTBtUDEvdzBwanRhZUw2SVg4clNzck9TM1lRSEFBQUEydGRsVzc3eSBlblYwaThuaVU1MXp5azZXN25nUDZwUHNKanM2M2JsM2hFY25PeUtrT3dBQUFOazFXZFExZVN0NVUvS3pFcDBmNm4xblBkbDhpYklUIFNZK1g3andxNFJtbFJ6Y3JQM3plck95UTdnQUFBTlJGWjJ0RXg1dVUvbWxFWi9HcHpybGx4MHQzUGh6aGVWYkM0NlU3V25hOGNoYnAgRGdBQVFINDk5a3BZM3NMZm40N29hTmxaWEtwemJ0bXgwcU9GWjJ5RytuMy83cFh3UERrMzNidHpML3ZwRHFQb0FBQUEvdlZYdjY2YiBrcU9kT2ovVWJSUWZiK0h2WWxLZEpjaU9UbmZHdDBmWnVaUGRNWFN2bk9WTlp0M0o3aWo2Um5iTFdrZ1BBQURBbit0dU5tbytwanFSIDZDdysxVm1DN0ZpN3RPbk9teU04WHNKako3UFdzaitaeFNnNkFBREE3blczY29UVFQwZDJSdUhKRHVtbWpHVWU4Slh6b050MFozekEgdGV4OGtkMWt4MXMwdUJHYWxRRUFBRHpSMFUzSlduUzhwbVFyT2xtcXMxbUM1Q3hKZGlMTHRJM0s5NTh5bzB0WlQwcCtXbnQzYUZZRyBBQURZRjUyb0tUa1NuUi9pVDJDTnFZNDltSnN5bGlNZmRqckxUbVk5ZkQ3UWorS1hzanpoOFpxVkVSNEFBTGhGeVJGenZjMzIzSTF5IDg4L25MVXAxeGhLV0xsOXRsL0pGcnhmNm45QTZNOHMySzJkSFNOaUVaMURDQXdBQWNHdWlzeFgvU0FndjFmR1NIVytKb083VjJRWnkgaGV6SWJnT3hyaUVPc2orSy92TlRhaDZkVzVidXNGa1pBQUJ1WFhpeUl5SDA5Tlh2MnovaXB6b3ZFazlnTFNyVldacnNXT0d4cGF5byBXVm1YczZycERpZWpBd0RBclVtT0p6eWo2THpKZnZscUZKeHFVL0xpZW5XV0tqdjJQMFVMejl1bnRJek55dmZpSnp0MnlhQk5kOFlPIGNjcFpBQUJ3UzZLVEhRa1JMUTlzOWVyWUNhekZpYzVTWmNkclZoN0xXYVB3L0pLOG5CV05vZHQwaDNJV0FBRGNpdkI0TzNWc1Qyd20gT2o4TG9yTmQ0aGUvWHZoL2pCVWUyMEIxcjhUbUlaQ2RxSGVIY2hZQUFOeUM1Rmpoc1R0MVJ0RjVEa1FuV2lENEx2dUpqaXhSZUpaYyB4ckxOeWxwNHhtYmx0UkllTDltSjBwMUJpUTNsTEFBQXVHYlJ5YTZsZXZyS2lzNTR5OHBYM2w2ZHhiSDBaQ2RxVmg2VThEekxmcnFqIFgrcDB4MXMyU0RrTEFBQ3VXWGpzOUZVMFptNUZ4NTZCWlJjSWVxVXJ5bGdIbXFsM0t2cWQvRWwzN2dQWmVRaGtoM0lXQUFCY3MrUlkgNGRIbEsyLzZLcElkdTFNbjZ0VWgyVG5nUDh0clZoNlhBOTdKZmpuTHU3VjZkMFFvWndFQXdIV0pUbmFpdVhmSXB4VWRyMWZuWXBxUyBMMGwydlA4NDIwWCtJbi9LV2ZkR2Vtd3BpK2tzQUFDNEZlR0p5bGZlbVBsdndmbGIrbEtkeFpldkxrbDJiTE95VG5mMEtIb3IzY25LIFdmck1MQkhLV1FBQWNMbVNZNFhIbTc2eXl3UHQ3WWY0bTVJdnBuUjFhYkpqaFVka2YvZk9vSVFuazU0bzNlSHNMQUFBdUJiUnNlR0EgTjMxbHkxYzYxZEhUVjc5azk2QlByekdaTXRZUi95TjFMRGZJbjNLV2JWaU9aQ2M2RlYyZmprNjZBd0FBbDNhZHpKWUhWc3BYUDVUcyB2RjY2NkZ5YTdHVGxySlg4T1VxaUlqczIzYkg5T3lLN2sxb0lEd0FBWEVvWXNKWGFsbVFyT3Y4WTBibVlnejZ2U1hhczhJajQ1U3c5IG9hVWxwOVc3WTVNZHh0RUJBT0FhUk9kTjlyY2tWMFVua2gyNUpPRlpYOEYvYktXYzVjbU9GUjVQZWtRSkR3QUF3TkpGSnhzejk3WWsgL3kzNVFaOFhYYjY2Wk5scGxiTUdKUzllU2V1K0lUdTJXWm4rSFFBQVdQcDFzWGRMOHQreTM2dHpkZVdyUzVZZEt6d2l1K1VzZTNhVyBUWGp1cFhhTUJPUG9BQUN3OUd1aGZqMFNuWEg2eXFZNVVhcnpLbGRTdnJwMDJiSC8wZm8vZWV6ZGVSRS8zY2xrSjVyT0doQWVBQUJZIDhQWFBwanJlUHAwZjhpZlIwYUtqZCtyb0xjbFhJVHFYTGp1dFpZTzJuR1YzOEVUbHJFSDJqNU9nZndjQUFKWW9PbHZuRjM2ZDZuaWwgS3lzN1hsUHlWWlN2cmtGMnJQQ0k3SitkNVoyZmRSK0lUaVhkb1g4SEFBQ1dKRHFWNHlEK2NXUW5PeExpcWxLZGE1QWQ3ei9mbTg3eSAwcDJxOUZpcFlmOE9BQUNjKzVvWFRWN1pmVHFSNk5oTnlWbFQ4a1dMenJYSWpsZk9Xc2x1M1ZJdkQxd1hSQ2ZhcXN6K0hRQUFPUGN2IDl2cVgrM0dmem50RGRQNzllZk5TbmF3aGVYc05EOXcxSlR0Uk9jc3JhWG1pVTIxV0ZxRmhHUUFBemlNNlh1a3FPK0RUNjlQUnFZNDkgMGR3ZTlDblhJRHpySy8xbTBPbU8zYjFqUzFwcjZadk1FcUZoR1FBQXppTTZyY1dCbnVqOHV5QTZIOWNxT3RjbU8xNjZNOHJJYUwwNiAzYkdOeTFhQTdvU0daUUFBV0pib3RCcVNJOUd4NVN1dlQ4ZnIxYmtLcmpIWldabHZqR2k3c3Bmd1ZFVkhROE15QUFDY1FuUmFEY2svIGpPeG8wUmxsUjR1T25iNnlmVHBYSXp6cksvN21FUG1UN3RoeGRMdUQ1ODZSSFc4cWl3TkRBUURnWE5jMnJ5SFpIZ1ZoRTUzeHBiY2wgK2VxV0I5NlM3SGhHYk1mUmJjUHluU002Vm5haTA5RkZhRmdHQUlEalhzTXFEY2xhZEx6cHE2czlEdUpXWlNjYVIzK1gvWkpXdEduNSBUdmJMV1Y2Nkk3TGZzSXp3QUFEQUhLTGpsYSttaU01UEpUcXZSblN1c2svbkZtVEhDby9JYnNOeXE2VGx2UjJsT3lLNzUyY2hQQUFBIE1KZm9qSkl6UlhUK05xS2p5MWMzaytwY3UrelliNXlzZjhjMkxrZnlrL1h1Q01JREFBQXppNDVOZExJenI2enM2RU0rYmZucWFzZk0gYjFGMmJMcGpEMHZ6U2xyMlBDMXZNcXN5blFVQUFEQlZkTGFKNk9nTnlhUG8vSS9VKzNSdVNuUnVRWGFzOEd6VSsxZEtlRm9KVDBWNCByUGd3a2c0QUFGTkZSNWV1c2pPdi9wMkl6czN0MDdsbDJSSEo5Kys4eVc1NUtwT2VRZHJwemxvWVNRY0FnT21pbzh0WGtlallzbFhVIHB6T0t6cHZFNTE1ZHZmQ3NiL0FiU21TM2YwZkVQME1ya3h3ck81SDRNSklPQUFDOW9wTXREWXg2ZEZwOU9qclIyZHlTNk55YTdOaHYgTGx2Uzh0SWRMK214c3RNNlB3dmhBUUNBeXJWSlQxNTVpWTZXbmY5Uk42OVB4eDd3K1dFazUyWkU1eFpscDlLdzNKSWVUM1pXaWV5dyBnd2NBQUtKZnZIWFpTbCtQb3NNOS95MStvbU1ia25XZmptMUl2cGxlblZ1VkhTczhVY055ci9RTWlmVDg1ZzdoQVFBQVIzUjArYXExIEhYbVVHNXZvL0MzNWh1U2JhMGhHZG5hRlIxdTE3ZC9wbFI1UGN1ekhRWGdBQUJBZGtYeHBZTFJMeDRxT2QrN1ZXTDd5bGdiZVZKOE8gc3VQL1oyOE9sSjFXdWlNSUR3QUFvaVB4MHNBM1IzU3M1RVNpWTA4eTk0NkR1RW5SdVhYWnNkOThka0pMSE9ucEZSMVBaQkFlQUFCRSBaMXNRSFR0aVhsMGM2RW5PellvT3NoT2ZueVd5MzJ6c2lVOXJ5YUQrV0FnUEFBQ2k0eTBOZkpkNE83THQwL2tmSlRvL3BYYVMrYzMyIDZpQTdzZkJvMjE0bG90TXFjV1VUV2dnUEFNRHRpbzZkdkhwUm9oUDE2SGdOeVQ4VDBibnBobVJrcHkwOG0rRHZlS0xUYWxKdXlRdkMgQXdCd2U2S1RIUU9oVHpIUGR1bDRmVHFSNk55ODhDQTd2dkI0WStsWjQvSnFvdXdnUEFBQWlJNVh1ckxOeUZwMmVzNjhJdGxCZGxMaCBrYzl2bXRYbk4xSlZlaUxaV1NFOEFBQ0lqdFI3ZFBUTFNxSno4eVBteUU3L042a280WkZFZHFyYmsxc2dQQUFBMXkwNmVwZU90eDM1IGIwZDB4cEtXVG5UR1BoMmI2Tno4aURteU0vMGJ0aW83Y3FEc0lEd0FBTmNyT2w2aWt6VWoyejRkUFhrMUhpZkJMaDFrNStCdldHOGsgL1NQNCs5bGVuVjRRSGdDQTZ4ZWRiR2xnSmpyZUtlYnMwa0YyWmhjZUVmOUlDR204RCtFQkFMZ2QwUmxGcEtjWk9UdkZuRjA2eU03SiBoRWNmMWphSDFDQThBQUNYTHpsYWRQUU9uUS9aM1l6ODYxTmV4a1JubEp2Ly9yenBwWUd0d3owUkhXVG5hTUtqMDUzM2pvK3htdmpEIGcvQUFBRnltNkV4SmRIU3EweElkbGdZaU95Y1RubzhaNUVZYTM2d0lEd0RBTWtWSHR6bDRSMEM4aUw4d2NCU2Qvell2N1lpNVBzV2MgcFlISXpsbUZaeTZwc2I4aDZMZnZFQjRBZ01XSlR1WDBjcDNvL0NPN2lZNHVYVVZMQTcwUmMwUUgyVm04OFBRSzBTZzY0NUVVV25nRSA2UUVBV0lUb3ZEZEV4enNDSXB1ODB0dVIzNFdsZ2NqT0JRdlBOcmpwUDdzMy8yWXdra1BLQXdCd1B0R3h5d0x0SGgxZHVvb21yLzV4IFJFZjM2V3lFWFRySXpnVUt6N1pEZ1BUNzdwVG8ySlFINFFFQU9JL29qRXYrOUZiazZBaUk3QVR6ckVjSDBVRjJMa0o0dG8wZkhQMEQgMUlvcWJicUQ4QUFBbkY1MDlMTEE2UGlIdjQzZ1JLTGpuWGZGZG1SazV5S0ZKL3M0a2V4NHQ3V1JIb1FIQU9BMG9tT1hCYjdKbngwNiAwVGxYbnVqb2hZRzZSd2ZSUVhhdVNuZ2lrZGtVeE9jM2R3Z1BBTUJSSlVla3ZTelFqcGFQRTFmMlFFOTdxS2ZlbzZPbnJ1alJRWGF1IFNuanNWdWJvVmlsdElUd0FBS2NSbmZkRWRFYVo4ZnB6c3JPdUVCMWs1eXFGSjB0MVd0TGo3Vmk0RTBiVEFRRG1FcDFzV1dCTGRQNG4gRUoxL0pEN1VrMlprWk9mcWhNZWJzb3FrSnBJZWZiT2o2VXhxQVFBY0pqcFJvdk9haUU0MFd1NU5YSGxIUUh6SWJwS1A2Q0E3RnlrOCAzamZ2TnZuQmFrbU9kN3NUSnJVQUFPWVNuWTlFZFBRT0hadm82SDRkbmVqOGt2cFpWNGdPc25PeHd2UHUvRDByT3Exa3B5VkFOQzREIEFQUkpqa2pjaU93dEM3VEhQMFE5T2xaMFhoQWRaT2VXaEtlMVo2ZjNGaTBpcEk4SEFDQVhIZHVmayszUThZNS84TWJMLzFhaW8wZkwgc3gwNmlBNnljMVhDVXlsajlhWTdudlRvLzF2NmVBQUFmTkhKSnE3R3JjaWpzSGpIUCtpU2xkMmhZN2NpandMMUlaeDFoZXhjdWZDcyBBdEh4ZHV6WTIwZnllaVE5OVBFQUFNUy9iRlltcmtiUjhSS2Rmd2VpWTNmbzJFUUgwVUYycmxwNFJQeEpyVW81NjBOMmE4a2ZnZlJZIGNhS1BCd0I0SHQ1OWFjdFdyWW1yTE5IUkUxZFdkTjRRSFdRSDRka1ZIVTk2dG9IMGZDVFNzMGwrb09qakFZQmJGcDJvYkRVbU9tTi8gVG5UOGc3MWxvK1hSc2tEN3ZBL0l6dFVMai8yR2IyMVcvaWpjSXVHeGZUejZSc29EQU5jcU9TTHRzcFVXSFc5WjROK0I2T2orSER0YSB6ckpBWkFmaFVlL3pVcDVzQjgrSCtXM2t2U0ErWGgrUFY5WVNwQWNBcmtoMFdtV3JVWEs4aVNzdjBSbmYva2Y4d3p4WkZvanNRRUY0IFdodVdyZXhVRTU3ZnR3Y2pQTnRFZWhBZUFMZ0cwYW1VcmFLSnE3OEQyZmxIL1A0Y2R1Z2dPeEQ4TUlxUmk5Wm9ldFNrM0VwNnJQaXMgUDI5YkpUMTJXa3VRSGdDNDRPZFY3NWZGckd6bDdkRFJMNzJ4Y3QyZnd3NGRaQWVTSDg3S2FIcHJNc3VUbkhmemcrZlZqdGRHYkVoNSBBT0NTUlNmNkpiRlZ0dnJSRUoyb2JEVk9YRVdubGlNNnlBNDR3aU95UDVwZW1jeDZsLzEwNXoyUkladnk2QkgxbFpEeUFNQmxTVTcwIFhGa3RXMFdpODQvc0h2dVFIZjNBYURteUF4T0VwN0owc0NVN1dXbnJNUkNlc2FSRnlnTUFsNUxtaU9SbEsrOThLMXUyK2p0SmMzVFogU3UvUGlmcHpFQjFrQjRyQ00wcFA5QnRMVnM3U3Y4bThteDlNVDM0ZWxQVGNDU2tQQUZ4dW1yTXh6NEhlK1ZZL0hOR3h2VGsyemZIMiA1K2cwWnhOSUdDQTcwQkNlYmZHSE8ycFc5bVFua2g0dFBLUThBSEJKYWM3V1BBZStLZEg1cFVRbksxdDVUY2hSMllyK0hHUUhadnl0IFJhVGV1QnlsTzFwMjdHMzg4eWZ4ZTNsSWVRQmd5V2xPMUlTY2JVT09FaDJ2Q1ZtTGp0ZjdTTmtLMllFWmZyaTl4dVhla3RhYitTMUggdjdUU00vYnkzQXNwRHdCY1JwclRVN2I2cDVIbS9EQnBUblMrRmFLRDdNQ1JoYWVWOGtTeTg1cklqcFdlUjFJZUFGaG9tdU0xSVh1SCBlT3B0eUhaUllGUzJhbTFEOXNwV2lBNnlBMGNRbm15ZnhOWThBV1RTWTI5ZUw0K1g4Z3lmMGtQS0F3Q25sSnpvbHpxZDVyVEd5cTNrIFVMWkNkbUNoUC93MjRaSGlrNEc5ZWJMejVvalBvL2dOeklPd2ZSa0Fqdk5jNTVXczlLU1ZiVUwyeWxZL2xOUjRrdVB0enFGc2hlekEgQWxPZWpkUjZlS3JwamhXZmJHSnJMR3RwNGJFbnFTTTlBREJIbXVQMTVuaExBcjMrbkgrQ05PZW41R2RiV2RFUlJBZlpnZk1KanpnLyBqSzBlbnFyc2FPbDVVaC9yWHZ6eUZxVXRBSmhUY3FwcGppMWIvZE9RbkZGMFhvU3lGYklERnlFOFc5bHRHTTZhK0ZvcHowdERmR3hwIFN3dlAyTXNqUWdNekFQUkpqb2hmc29wK1VkTzdjMzRtb3FNbEoydENwbXlGN01EQ255d3F4MHkwUnRKN3BPZExJRHk2cERVSXBTMEEgeUorN3ZEVGFHeWUzazFaNmQ0NG5PcDdrMkNaa081aEIyUXJaZ1F0S2VTU1JudXhvaWFpYzllS0lqeGFrMzZXdEJ5ZmxzYjA4WG1rTCA2UUc0N1RTbnAyU1ZwVGsyMFlsS1Zsa1RNbVVyWkFjdVRIaTJKa25abXQ5V05zNXZUZG1VVnF1djUrbnpZendvOFZuTGJtbkxUbTFwIDZVRjRBRzVYY3V3R1pPL3dUcTgzUisvUCtTZEljbXpKS2pyeTRjTzVUNGdPc2dNTGYwSnBwVHpaV1ZydnNydDQ4Q1c1L2Y3enI0SDAgNk5MV1J2eXBMVkllZ051U0hKSDJVVGRlQTdKTmN6elJHVi8vR2FRNWRzclVIby9Ea2tCa0IyNDA1ZkhLV1ZaMnh0ZS9Pc0l6bHJiVyBTbmpvNXdHNExkR0orbkt5U2RFWDJkK2I0NVd0ZnNoKzg3RlhzcXBzUWliTlFYYmdobEtlcUt6MTBraDZ0Qmc5T1NuUC9hZnNyQ1hmIHpZUDBBRnhYbWxNNTVpRXJXWGxOeUpua2VDV3JWbThPb29Qc3dBMm1QTmxPbmhmelc5ZUwrUTFxVEhtMDlEd282Zm1RM1lXRUE5SUQgY0hPU1V5MVoyVFFua3B5ZjZ0L3FYNzZxYVE2aWcrd0FLYzllV2FzbE8xcDRSdWw1Tk5LamhRZnBBYmg4d2ZFa3gvc2x5bHNNNktVNSB0amZIM25TU0U1V3NkQU15YVE2eUE2UTg0VzlmbFpUbmwvbXRURC94ZkRIQzh5aTdwYTBwMG9QNEFDd3J4UkhwMis4VjdjelJrMVkvIHhKK3VzdnR5ZmdXU1E1b0R5QTVQVXFXVXg1YTAzb1BmeUY0YzJSbHZYNVgwUEFVcFQ0LzBDR2tQd0VWSlRqUktycyt6YXFVNVZuS2UgelhPUG5iS0tKSWMwQjlrQlVwNmR0NGRBZXJ4OVBKSG8vRksvZlgzNUZKOHZKdVY1Vk1KVGxSNUJlZ0F1U25KYUpTdXZOOGRLanUzTCBzWktUalpPVDVpQTd3Qk5ZbXZMMGxyVittU2V5YitybEtEMWZUTkx6Z1BRQVhLVGtlR1BrbnVTMEdwQi9CcUpUN2N2UjIrSDEvUkxTIEhFQjJvSnJ5UlAwOGJ4S1h0ZlNUbWhhZXIwN0sweXM5SzlsZlRvajBBTXd2T0NMNzVaK04xQ2FzM3B6bmhHZnhlM04rR1BIUkUxYlIgS0htMVpJWG9BQmNFQ0w4bjlNdFJMRWJaR1BmbHJEK0ZaSlNVUnlVdVg0ellqS0pqYjE4bVNJOWRURGlZKzd2aSt4eGc5aFRIUzN1OSBoYVRlQUVQVW0rTkpUdFI4L0tvK2g1V2NqZmc5T1VnT2NCR0EwdmVGYlJBZWxQRGNLZUhKcE9lTGtwNnZuZEpqeDlYdG1Wdlo5SmIzIHRRQkFudUtJNUh0eW9qRnlyeS9IcGprL2t4U24wbnhzMHh4S1ZvRHN3RkZTbnBWSlZrYnB1UzhrUFYrY3hLY2xQZDY0dXQzR1BFaCsgRElXUTlnQ1VVaHlSdUIvSEsxZTl5MjdmM3BqRWpNbU1saHg5KzJIK1RBOHplRXNCS1ZrQnNnTm5rUjVkUXJvckpEMlBTZEx6SlpDZSA4ZTgvT2tuUFd2enlWdGJYUTlvRENFNDd4Y242Y1ZvcktMeVNsWGZUZjhkT1dFV1NZNXVQa1J4QWR1Q28zeXV0MHBZblBROG02WGtxIFNJK2QzSHFVZURIaFd2SytIdEllUUhKcUtVNUxjcndKVExzejU5bVJtNWJrakIvN1hmeFJja3BXZ096QTJhWEhTM3EwaEZTbEp4TWUgbmZJOFN0N1QwOXZNalBnQUtjNXVpaEtOa0VkOU9jK3kzNS96MDVFZ2U3eU1UWEphKzNKSWN3RFpnWk4vNzJUOVBNTkU2ZkhTSG04LyB6Mk1nUGQ3SStsMGdQYTB5Rno4bmNDMkNJNFVVSnpzVHowdHlmZ1dKem5ORGNuUlBqaDBqcHk4SGtCMVlmTW9qUmlnT2xaNHZRY0x6IFZFaDY3cDJrcDFMaXlucDYrSm1CU3hFY2tYZ0JvRzA2ZnBmMndiOTJVL3B6NGZZcmtSeWI1SGdUVnBTc0FObUJxNVNleDBSNnZnVFMgWTVPZXg2TDBlTTNNMmM0ZXhBZVdMRGdpZnBtcUo4WHBrWnhmaWR6MFNJNGRhNC9Pc0VKMEFObUJxNWFlU0g2ZUpraVBMbkY1KzNwMCAyb1A0d0NVSmpqZ0pqbmVVUTZWVUZVbk9MMGR1bmh1Q1UrM0oyVGhmRDVJRHlBNWN2ZlJFNHZQRmtaK25pZEtUbGJpeUVYYkVCMDRwIE55SnhTY2VXZld5S3MxR0NFYVU0dHVuNHhVak1jL0RTQ2s3VWo0UGtBTElEU0U4Z1BWN2FrNG1QSnp4Uk03TW5QZXRFZW16aUkxSnIgYnVibkRPWVduRmFaYW1xcEtrdHk3UHRlQ2luT20reHVXa1p5QU5rQnBNZElqN2VWMlV0N0hoM0o4VjUvVEtUSFcxSllGWjhwUjFUdyBjd2N0dVpraU9LMEZnRzlKaXVOSmpuMzlaVUtLZytRQXNnTklUME42ZXRPZXgwQjR2TW10Ykd6ZGxyZ3k4VmxKKzRnSzVBZW15STNJIC9pUlZWS2JTQ1lvOXltR0s1RVNOeHA3Z1JOdU9rUnhBZG9EdnUwN3B1WE9rcDFMbWltNlBEZW14YVk4VkgrOGcwbXJpVXptdWdwL04gNnhPYlRHNGtTVzhxWmFwcVAwN1VrMU1WbkZhSzQrM0lRWElBMlFHKy94THBXVFdreDB0N0l2RjVESVRIbHJhOEV0ZTl0TXRjUGVLRCAvTnlHMkV5Um02cmdWRXBWclo2Y2x1QWNtdUpza1J4QWRnRGEwck9hTWUzeHlsMlBRY29UaVUrcnpPV05zUjhxUHdqUVpZdU52ZGozIENJNTMwcmh0T1BaS1ZhOUtWS0tTbFgzZmkvazNWbkM4TGNmUnVWWHN5UUZrQjZCRGVrVGk4N2VzOU53NTBtUEZ4MnR1Zmt6ZVo0V24gTXNuVkVwK2VrdGNoNCszOGJCOVBhbHBpVXhHY0xMM0pCTWRMY2Q0Y3dmSEtWbEdUc1Qyanl0dUw4Mjd1V3lRNFNBNGdPd0F6U1k5MyA4S2czdmg2VnVUejV5VzRQenN1b3hPV1Z1UTZSSDVINUo3MzR1YTlmaEZ2TC9DU1FHbkZFb0ZXZTJwajB4Q1k0VWFrcUtsbEYwbU1UIG5LaE1GVTFVYlFLQlEzSUEyUUU0a3ZSRWg0KzJ4Q2RLZlI0YXdoTTFNM3ZTTTBWK3BwYThLc25QNm9hZUc3WUgvdDJla3BRRVVoT04gaDA5SmNGcVM4K3FrTkZIL3paUm00MDB4eFVGeUFOa0JtT243TkV0N290NGUyOSt6RHNRblNuNDgyZkZTbm50SGZPN041MjgxT0I5UyA4b29Fc2ZKenYxckljOHZjRjh0dDhmM2J3c3ZvYUlhVzNIZ054bFp1SXNsNURVVG5wZmp5VmZaTFZGR1ppaFFIa0IyQUswaDdNdkdKIFNsNWUrdVBKanRmSUhQWDNlRnViNTBoOU1nSHE3UUZhU2hLMG5lSHZWOHRSbFo2YmpmVDMzclFTbkt3WEp4T2Q2SDNleDNpWGVKcXEgSlRuMk1VRnlBTmtCT0ZQYUV6VTFqNEpnUldJdGVibkxTc3hENHhaSno0TWpWVjdKNjA3aUptZHZ0SDBRdjQ4cGVpem1rcURxbjA5NSBmdGxPL0xOZXFXa0pUYVdwZUZ1UW14N0JhU1U1VVJuTFMyMWFQVGlrT0lEc0FGeHAydE9UK0hqaVk4dGVsWmYzeGNTbjFlQ2NIVjFoIFU1OUsraE5KejZyeHVGYWtjK3B6ekxiejdaYlVTSERCM3NvMHVhbjAza1J5MDVLYzEwYWk4OVloTmphOThTYXBQaHh4SThVQlpBZmcgUXRNZVNhUm5WUkNmT3lNaTl4S1h2dTZUOTdYa0oycHVidlg0M0FYU002Y0FWVVJtYWtyVWs4UkVGOXdwaS9zeXNka1d4Q1piOHZmaCBTTWRiUVhUZUFwbXBpazJVM2xRVEhGSWNRSFlBcmlUdGtZbmljeWR4ejQzWGtIemZrSitzcWJsWGV1N00vYTRtUHozOVA5SklmYVpNIGlmVTBDTGYyMnZRSXpxWW9PQzI1cWFRNFdibXE5MmJUb1EvbnBiM1AyZEkvSnFvQTJRRzRnYlNuUjN5R0lQWEorbjRxQXRScVpyNlggOWhqN0lmSXp4N2g3cFUrb1JUYnh0RTFFcUNvNVdiOU5iM29USlRudlR1TFNFcDczSksySlVodHZQRHhLYjFyajRxUTRnT3dBSUQ1aCBuMCtVL2tRQ0ZNblBXdktSZGZ2djdRaDdkcXZLVDFWOHZNZEtwRjRheTVLZFNxa3BTM21tQ3M2SCtNdjlNc0dKa3B5cThMd0hTVTFGIGJENmMreHdsVlJYQlFYSUEyUUZBZkZ6eGlaS2ZvVU4rSXBtNVQvN091aUE4VVptcjFlc3paYU56MWd1MUtpWThGVmxwbFY2bU5CZFggU2xTZTRId0VRaEtKUy9iMlIxRnNyTnhzcGI4OGhlQUFUL2dBL0J4MGlVOHIrV2tsUUo2d3JJczNyNFIyVjB4Nk11R3BqTFpYRzc1WCB5YitWUUhncVBUVlp5dU10OXRzbUNVNUZkTEpFNXlNUm52ZEVpRnBTOHhIYzU1YllJRGdBeUE3QTdPSWpRWnBSRWFCVytlc3VFWnNwIGdqTkZlTHl2S1JPZFZqbXNtdXhrcGFkV1AwOTBUTU1VMGNtRUoyb016cHFHSTZuNWtIeTB2VGU1UVhBQWtCMkFXY1JIcEwrc1UwbC8gV2pMVUl6S3QvcDFLV2FzNnNSVjlqYXRDdWhPVm9Ib3YrRDBialQzWnFZalBoN1Q3YUZwU2t6VVNSd2VIUmttV0lEZ0F5QTdBc1g5VyBLdE5KMVNRazZ3RWFPb1dsVjI1YS9UdFR2NTVXdXROS2RUSVJhQjNua1BYcFRKR2ZUZVAxVGVOMVQ5eGFKYW5LNkQyQ0E0RHNBSnd0IDllbVZuMVZER0lhaW5IaC9mdGY1NzF1eTBrcDFvcDZmbHV4a2sxTlowdUVkekxrcDNENEtNaFJKUzFSK2F0M3ZhditSU0Z5YVFtNEEga0IyQVJhVSttZnhrOHRCcS9CMGFyN2QyNjB6WnZTTlNLMlBaOTltdjJWNjBiYzlOMUxkVGJWS3U3dFNwL25sRlpGcEMwOXR2UTJrSyBBTmtCdURyNWtZSllEQWZLVWVzb2libkd6dWRxVUo1ei9IeGJsS2xONFg1VVpLYWEyZ2pwRFFDeUEzQUw4bE1SSUpINWR0NE14YjlYIFdTcTRsRDA3SXZWaklsb2ZmMDZaNmRsVWpOd0FJRHNBVi85ejF6cHh2RmVJcENBdVU4N0dhbjNlSWZrN0xkbVJRRGdpcVpnaVBaVy8gSnpLOXI0YlVCZ0RaQVlDSkFqUzNFTFZlRjhrUEFlMUpuMXBFQXRLU0RDa2tLcjJ2VjE1V3BRYTVBVUIyQUdEaXorZnFTRkxVZWwrUCBYTFUrUmlRUGg0ckdkc0xIcnI2TzJBQWdPd0N3Z0ovWm5oNmhYbkdxeWs5RmRLcVNVVTFRdGgxdnoxRnFRbW9Ba0IwQXVCQVJhdjNiIFZlZkhYRTI0WDl2T3Qzdmw0NUNtWUtRRzRNTDV2d0lNQURhOWUyNnFaLzIwQUFBQUFFbEZUa1N1UW1DQyIKICAgICAgIGlkPSJpbWFnZTM5ODAiIC8+PGcKICAgICAgIGlkPSJnMzk4MiI+PGNpcmNsZQogICAgICAgICBzb2RpcG9kaTpyeT0iMjc1LjkwOSIKICAgICAgICAgc29kaXBvZGk6cng9IjI3NS45MDkiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIyNzguOTMzOTkiCiAgICAgICAgIHNvZGlwb2RpOmN4PSIyNzkuNTE1MDEiCiAgICAgICAgIGN4PSIyNzkuNTE1MDEiCiAgICAgICAgIGN5PSIyNzguOTMzOTkiCiAgICAgICAgIHI9IjI3NS45MDkiCiAgICAgICAgIGlkPSJjaXJjbGUzOTg0IgogICAgICAgICBkPSJtIDU1NS40MjQwMSwyNzguOTMzOTkgYyAwLDE1Mi4zODAzMyAtMTIzLjUyODY2LDI3NS45MDkgLTI3NS45MDksMjc1LjkwOSAtMTUyLjM4MDMzLDAgLTI3NS45MDg5OTE5LC0xMjMuNTI4NjcgLTI3NS45MDg5OTE5LC0yNzUuOTA5IDAsLTE1Mi4zODAzMyAxMjMuNTI4NjYxOSwtMjc1LjkwODk5NjEgMjc1LjkwODk5MTksLTI3NS45MDg5OTYxIDE1Mi4zODAzNCwwIDI3NS45MDksMTIzLjUyODY2NjEgMjc1LjkwOSwyNzUuOTA4OTk2MSB6IiAvPjwvZz48L2c+PGcKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgaWQ9IkZyYW1lX2NvcHlfMV8iCiAgICAgZGlzcGxheT0iaW5saW5lIiAvPjwvZz48ZwogICBzdHlsZT0iZGlzcGxheTpub25lIgogICBpZD0iRnJhbWVfY29weV8yIgogICBkaXNwbGF5PSJub25lIgogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3NjUuNDU3MjYsLTMxNC4xMTY0KSI+PGNpcmNsZQogICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZGlzcGxheTppbmxpbmUiCiAgICAgc29kaXBvZGk6cnk9IjI3NS45MDkiCiAgICAgc29kaXBvZGk6cng9IjI3NS45MDkiCiAgICAgc29kaXBvZGk6Y3k9IjI3OC45MzM5OSIKICAgICBzb2RpcG9kaTpjeD0iMjc5LjUxNTAxIgogICAgIGRpc3BsYXk9ImlubGluZSIKICAgICBjeD0iMjc5LjUxNTAxIgogICAgIGN5PSIyNzguOTMzOTkiCiAgICAgcj0iMjc1LjkwOSIKICAgICBpZD0iY2lyY2xlMzk4OCIKICAgICBkPSJtIDU1NS40MjQwMSwyNzguOTMzOTkgYyAwLDE1Mi4zODAzMyAtMTIzLjUyODY2LDI3NS45MDkgLTI3NS45MDksMjc1LjkwOSAtMTUyLjM4MDMzLDAgLTI3NS45MDg5OTE5LC0xMjMuNTI4NjcgLTI3NS45MDg5OTE5LC0yNzUuOTA5IDAsLTE1Mi4zODAzMyAxMjMuNTI4NjYxOSwtMjc1LjkwODk5NjEgMjc1LjkwODk5MTksLTI3NS45MDg5OTYxIDE1Mi4zODAzNCwwIDI3NS45MDksMTIzLjUyODY2NjEgMjc1LjkwOSwyNzUuOTA4OTk2MSB6IiAvPjxnCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIGlkPSJGcmFtZV9jb3B5XzJfMV8iCiAgICAgZGlzcGxheT0iaW5saW5lIiAvPjwvZz48ZwogICBpZD0iRm9yZWdyb3VuZF9HcmlkXzFfIgogICB0cmFuc2Zvcm09Im1hdHJpeCgwLjMzMzY5MiwwLDAsMC4zMzM2OTIsLTg4Ny4zOTg1NywtMTg1LjUxODg5KSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MzgxOSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gNy4yNSwyNS4zNzUgNzkuNjYwNjA2LDAgQyA5MC42MjUsMjUuMzc1IDEwOC43NSw0MS44NjYwNzggMTA4Ljc1LDQ3LjA5MTkxOCBsIDAsNTAuNzgzMDgyIC0xMDEuNSwwIDAsLTcyLjUgeiIKICAgaWQ9InJlY3QyOTY2IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjYyIgLz48cGF0aAogICBkPSJtIDguMTU2MjUsMjkuOTA2MjUgMCw3MC42ODc1IDk5LjY4NzUsMCAwLC00OS44NzUgYyAwLC0wLjc4MDcgLTEuMDAzNDQsLTIuODA1MTI5IC0yLjcxODc1LC01LjAzMTI1IC0xLjcxNTMxLC0yLjIyNjEyMSAtNC4wNTgwNywtNC43NjA4IC02LjUzMTI1LC03LjEyNSAtMi40NzMxODMsLTIuMzY0MiAtNS4wNzIzNjgsLTQuNTYwODY1IC03LjI1LC02LjE1NjI1IC0xLjA4ODgxNiwtMC43OTc2OTMgLTIuMDc5ODk1LC0xLjQ0NDIxIC0yLjg3NSwtMS44NzUgLTAuNzk1MTA1LC0wLjQzMDc5IC0xLjQzNDY2NiwtMC42MjUgLTEuNTYyNSwtMC42MjUgbCAtNzguNzUsMCB6IgogICBpZD0icGF0aDM4NDkiCiAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MTg5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gNy4yNSAyOSBMIDcuMjUgMTAxLjUgTCAxMDguNzUgMTAxLjUgTCAxMDguNzUgNTAuNzE4NzUgQyAxMDguNzUgNDUuNDkyOTEgOTAuNjIwNjQ0IDI5IDg2LjkwNjI1IDI5IEwgNy4yNSAyOSB6ICIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC45MDkzMTA3IgogICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpvZmZzZXQiCiAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMuNjI1KSIgLz48cGF0aAogICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpvZmZzZXQiCiAgIGlua3NjYXBlOnJhZGl1cz0iLTEuODAyMzkwNSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gNy4yNSAyOSBMIDcuMjUgMTAxLjUgTCAxMDguNzUgMTAxLjUgTCAxMDguNzUgNTAuNzE4NzUgQyAxMDguNzUgNDUuNDkyOTEgOTAuNjIwNjQ0IDI5IDg2LjkwNjI1IDI5IEwgNy4yNSAyOSB6ICIKICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDM4NDcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICBpZD0icGF0aDM4NDUiCiAgIGQ9Im0gOS4wNjI1LDMwLjgxMjUgMCw2OC44NzUgOTcuODc1LDAgMCwtNDguOTY4NzUgYyAwLC0wLjI2NDMyNSAtMC44MjYzLC0yLjMyNzg3MiAtMi41LC00LjUgLTEuNjczNywtMi4xNzIxMjggLTQuMDIwMjUsLTQuNjkwNjQ5IC02LjQ2ODc1LC03LjAzMTI1IC0yLjQ0ODQ5NSwtMi4zNDA2MDEgLTUuMDIyMTU5LC00LjQ5OTAxNCAtNy4xNTYyNSwtNi4wNjI1IC0xLjA2NzA0NSwtMC43ODE3NDMgLTIuMDA5OTkzLC0xLjQxMTU2MiAtMi43NSwtMS44MTI1IC0wLjc0MDAwNywtMC40MDA5MzggLTEuMzU4ODc2LC0wLjUgLTEuMTU2MjUsLTAuNSBsIC03Ny44NDM3NSwwIHoiCiAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMuNjI1KSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQwMjExNjM2O3N0cm9rZTpub25lIgogICBkPSJtIDEyLjY4NzUsMjkuOTA2MjUgMCwwLjQ1MzEyNSAwLDYyLjk4NDM3NSAwLjQ1MzEyNSwwIDkwLjYyNTAwNSwwIDAuNDUzMTIsMCAwLC0wLjQ1MzEyNSAwLC01MC4yOTY4NzUgLTAuNDUzMTIsMCAwLDUwLjI5Njg3NSAtOTAuNjI1MDA1LDAgMCwtNjIuNTMxMjUgNzkuMjk2ODc1LDAgMCwtMC40NTMxMjUgLTc5Ljc1LDAgeiIKICAgaWQ9InJlY3Q0MDMyIgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjY2NjY2NjYyIgLz48cGF0aAogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICBpZD0icGF0aDM3OTciCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTA2MjUsMCwwLDAuOTA2MjUsMCwtMy42MjUpIgogICBkPSJNIDk3LjQxNDIxNCwzMiBDIDEwMS40MTQyMSwzMiAxMDMuMzE0OTksNDguMDM5MjUgMTA0LDUzLjYzNTE4NCAxMDcuODYwMDcsNTEuMTcxNDE1IDEyMCw1MiAxMjAsNTYgbCAwLDAgQyAxMjAsNTAuMjQwOTU5IDEwMy4xMDM1MSwzMiA5Ny40MTQyMTQsMzIgeiIKICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM4MDUpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjM4MDcpIgogICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgzODEzKSIgLz48cGF0aAogICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM0Nik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gODcsMjUuMzc1IGMgMy42MjUsMCA0LjU4NjIyMywxMy43MzQ1NTEgNS4yMDcwMTMsMTguODA1ODY3IEMgOTUuNzA1MjAyLDQxLjk0ODA3NiAxMDguNzUsNDMuNSAxMDguNzUsNDcuMTI1IGwgMCwtMC4wMjgzMiBDIDEwOC43NSw0MS44Nzc1NDkgOTIuMTU1OTI4LDI1LjM3NSA4NywyNS4zNzUgeiIKICAgaWQ9InJlY3QzNzY4IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOm9mZnNldCIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC44NDIwMDc4MiIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gOTYgMzIgQyAxMDAgMzIgMTAxLjA2NDk5IDQ3LjE1NDA2NiAxMDEuNzUgNTIuNzUgQyAxMDUuNjAwOTggNTAuMjkyMDMyIDExOS45MzI1MiA1MS45ODg5MjUgMTIwIDU1Ljk2ODc1IEMgMTIwIDUwLjIwOTcwOSAxMDEuNjg5MyAzMiA5NiAzMiB6ICIKICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDM4NTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICBpZD0icGF0aDM4NTUiCiAgIGQ9Im0gOTkuMjUsMzQuMTU2MjUgYyAwLjcxNzU0OCwxLjYxNjY2OCAxLjI1NzQ5LDMuNzAzMjg1IDEuNjg3NSw1Ljk2ODc1IDAuNzkwNzgsNC4xNjYxMjYgMS4xNzMxMyw4LjU4MjU3MiAxLjUsMTEuNDY4NzUgMS4wNjY1LC0wLjQwNjA4MyAyLjI3NjQ1LC0wLjY4NjEzOCAzLjcxODc1LC0wLjc4MTI1IDEuOTU5NTUsLTAuMTI5MjIxIDQuMTU1MjgsLTAuMDAzNSA2LjI1LDAuMzEyNSAxLjk5MzMzLDAuMzAwNzM4IDMuODc1MTcsMC43ODY1ODYgNS4zNzUsMS40Njg3NSAtMC40MTgwMiwtMC43NDM0MjEgLTAuODA1NjgsLTEuNDc1MjY5IC0xLjQwNjI1LC0yLjMxMjUgLTEuNzY3MiwtMi40NjM1OTUgLTQuMjI2MjcsLTUuMjY1Njk2IC02Ljg0Mzc1LC03Ljg3NSAtMi42MTc0OCwtMi42MDkzMDQgLTUuNDExMzEsLTUuMDIxOTUxIC03Ljg3NSwtNi43ODEyNSAtMC44Nzc5OCwtMC42MjY5NTYgLTEuNjM0OTEsLTEuMDQyNDEgLTIuNDA2MjUsLTEuNDY4NzUgeiIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLjE4MTI1LC0zLjg5Njg3NSkiIC8+PHBhdGgKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLjE4MTI1LC0zLjg5Njg3NSkiCiAgIGQ9Im0gOTkuMjUsMzQuMTU2MjUgYyAwLjcxNzc3NCwxLjYxNzE3NSAxLjI1NzQ2LDMuNzAzMTM3IDEuNjg3NSw1Ljk2ODc1IDAuNzg4NzEsNC4xNTUyMzggMS4xNzM0NSw4LjU0OTM3OSAxLjUsMTEuNDM3NSAxLjA2MjY3LC0wLjQwMDM1OCAyLjI4Njg2LC0wLjY1NTU3NSAzLjcxODc1LC0wLjc1IDEuOTU5ODgsLTAuMTI5MjQ0IDQuMTU1MDIsLTAuMDM0ODIgNi4yNSwwLjI4MTI1IDEuOTgyNDIsMC4yOTkwOTIgMy44NDc1LDAuODIzNjYyIDUuMzQzNzUsMS41IC0wLjQxNzQ4LC0wLjc0MjE0MSAtMC43NzU2NCwtMS40NzY5NTUgLTEuMzc1LC0yLjMxMjUgLTEuNzY3MDIsLTIuNDYzMzUgLTQuMjI2MzksLTUuMjM0NTY5IC02Ljg0Mzc1LC03Ljg0Mzc1IC0yLjYxNzM2LC0yLjYwOTE4MSAtNS40MTE1NiwtNS4wNTMzNzUgLTcuODc1LC02LjgxMjUgLTAuODc3ODksLTAuNjI2ODk0IC0xLjYzNTAzLC0xLjA0MjUyNSAtMi40MDYyNSwtMS40Njg3NSB6IgogICBpZD0icGF0aDUxNTEiCiAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MTU5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gOTYgMzIgQyAxMDAgMzIgMTAxLjA2NDk5IDQ3LjE1NDA2NiAxMDEuNzUgNTIuNzUgQyAxMDUuNjAwOTggNTAuMjkyMDMyIDExOS45MzI1MiA1MS45ODg5MjUgMTIwIDU1Ljk2ODc1IEMgMTIwIDUwLjIwOTcwOSAxMDEuNjg5MyAzMiA5NiAzMiB6ICIKICAgaW5rc2NhcGU6cmFkaXVzPSItMC44NDU4NzEzMyIKICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6b2Zmc2V0IiAvPjxwYXRoCiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIGQ9Im0gNjkuNzgxMjUsODQuMjgxMjUgMCwwLjQ1MzEyNSAwLDguMTU2MjUgMC40NTMxMjUsMCAwLC04LjE1NjI1IDMzLjUzMTI1NSwwIDAsLTAuNDUzMTI1IC0zMy41MzEyNTUsMCAtMC40NTMxMjUsMCB6IgogICBpZD0icmVjdDQwNDEiCiAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjIiAvPjxyZWN0CiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIGlkPSJyZWN0NDA0NiIKICAgd2lkdGg9IjAuNDUzMTI1IgogICBoZWlnaHQ9IjguMTU2MjUiCiAgIHg9Ijg0LjI4MTI1IgogICB5PSI4NC43MzQzNzUiIC8+PHJlY3QKICAgeT0iODguODEyNSIKICAgeD0iLTg0LjI4MTI1IgogICBoZWlnaHQ9IjAuNDUzMTI1IgogICB3aWR0aD0iMTQuMDQ2ODc1IgogICBpZD0icmVjdDQwNDgiCiAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNDAyMTE2MzY7c3Ryb2tlOm5vbmUiCiAgIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiIC8+PHJlY3QKICAgeT0iODQuNzM0Mzc1IgogICB4PSI5NC4yNSIKICAgaGVpZ2h0PSI4LjE1NjI1IgogICB3aWR0aD0iMC40NTMxMjUiCiAgIGlkPSJyZWN0NDA1MCIKICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC40MDIxMTYzNjtzdHJva2U6bm9uZSIgLz48cGF0aAogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC4wOTA2MjUsMC4wOTA2MjUpIgogICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQwMjExNjM2O3N0cm9rZTpub25lIgogICBkPSJtIDUyLjc4MTI1LDMzLjI4MTI1IC02LDMuNDY4NzUgYyAtMC4xMTUzNDgsLTAuMDgzNDkgLTAuMjQ1NjY0LC0wLjEyNSAtMC40MDYyNSwtMC4xMjUgLTAuMzEyNDQ2LDAgLTAuNTc2NDE0LDAuMjAzNTE5IC0wLjY4NzUsMC40Njg3NSBsIC03LjE4NzUsMCBDIDM4LjM4NjA5OSwzNi44MzQ3MzkgMzguMTUwODA5LDM2LjYyNSAzNy44NDM3NSwzNi42MjUgYyAtMC4zMDcwNTgsMCAtMC41NDIzNDYsMC4yMDk3NCAtMC42NTYyNSwwLjQ2ODc1IGwgLTcuMTI1LDAgLTAuMDMxMjUsMCAtMi44MTI1LC0xLjY1NjI1IGMgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjUzMTI1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IGwgMS43NSwxIC0xMi41OTM3NSwwIGMgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjQ2ODc1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCBsIDEyLjc4MTI1LDAgLTEuOTM3NSwxLjA5Mzc1IGMgLTAuMDEzNiwwLjAwNjQgLTAuMDI0ODUsMC4wMTc2NSAtMC4wMzEyNSwwLjAzMTI1IC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IGwgMCwwLjUzMTI1IGMgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgMC4wMDY0LDAuMDEzNiAwLjAxNzY1LDAuMDI0ODYgMC4wMzEyNSwwLjAzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgbCAyLjkzNzUsLTEuNzUgMC4wMzEyNSwwIDcsMCBjIDAuMDc3MDYsMC4xNjQ1MTkgMC4yMTA5MjEsMC4yNzM0OTUgMC4zNzUsMC4zNDM3NSBsIDAsMy41OTM3NSBjIC0yLjc3OTA2MiwwLjE1MDY1OCAtNSwyLjQ2NTEyMiAtNSw1LjI4MTI1IDAsMi44MTYxMyAyLjIyMDkzOCw1LjEzMDU5MiA1LDUuMjgxMjUgbCAwLDQuMzc1IGMgLTIuNzg3MzMsMC4xNDIwNCAtNS4wMzEyNSwyLjQ1OTA4NyAtNS4wMzEyNSw1LjI4MTI1IDAsMi44MjIxNjUgMi4yNDM5Miw1LjEzOTIxIDUuMDMxMjUsNS4yODEyNSBsIDAsNC40MDYyNSBjIC0yLjc4NzMzLDAuMTQyMDQgLTUuMDMxMjUsMi40NTkwODcgLTUuMDMxMjUsNS4yODEyNSAwLDIuODIyMTY1IDIuMjQ0MzksNS4xMDg0MyA1LjAzMTI1LDUuMjUgbCAwLDMuNjUzMTI1IGMgLTAuMTc0MDg4LDAuMDczOTYgLTAuMjk3MTE0LDAuMjM1MTk3IC0wLjM3NSwwLjQwNjI1IGwgLTguODc1LDAgMS45Mzc1LC0xLjEyNSBjIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODUsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjUgYyAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgLTAuMDA2NCwtMC4wMTM2IC0wLjAxNzY1LC0wLjAyNDg2IC0wLjAzMTI1LC0wLjAzMTI1IC0wLjAxMDIxLC0wLjAwMjUgLTAuMDIxMDQsLTAuMDAyNSAtMC4wMzEyNSwwIC0wLjAxMDIxLC0wLjAwMjUgLTAuMDIxMDQsLTAuMDAyNSAtMC4wMzEyNSwwIGwgLTIuODc1LDEuNjU2MjUgYyAtMC4wMTM2LDAuMDA2NCAtMC4wMjQ4NSwwLjAxNzY1IC0wLjAzMTI1LDAuMDMxMjUgbCAtMC4wMzEyNSwwLjA2MjUgLTEwLjAzMTI1LDAgYyAtMC4wMTAyMSwtMC4wMDI1IC0wLjAyMTA0LC0wLjAwMjUgLTAuMDMxMjUsMCAtMC4wMTM2LDAuMDA2NCAtMC4wMjQ4NSwwLjAxNzY1IC0wLjAzMTI1LDAuMDMxMjUgLTAuMDAyNSwwLjAxMDIxIC0wLjAwMjUsMC4wMjEwNCAwLDAuMDMxMjUgbCAwLDAuNDM3NSBjIC0wLjAwMjUsMC4wMTAyMSAtMC4wMDI1LDAuMDIxMDQgMCwwLjAzMTI1IDAuMDA2NCwwLjAxMzYgMC4wMTc2NSwwLjAyNDg2IDAuMDMxMjUsMC4wMzEyNSAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgbCAxMC4xMjUsMCAwLjAzMTI1LDAgMi44MTI1LDEuNjU2MjUgYyAwLjAxMDIxLDAuMDAyNSAwLjAyMTA0LDAuMDAyNSAwLjAzMTI1LDAgMC4wMTAyMSwwLjAwMjUgMC4wMjEwNCwwLjAwMjUgMC4wMzEyNSwwIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODUsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjUgYyAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgLTAuMDA2NCwtMC4wMTM2IC0wLjAxNzY1LC0wLjAyNDg2IC0wLjAzMTI1LC0wLjAzMTI1IGwgLTEuNzUsLTEuMDMxMjUgOC42ODc1LDAgYyAwLjExMzkwMSwwLjI1OTAxMSAwLjM0OTE5MiwwLjQ2ODc1IDAuNjU2MjUsMC40Njg3NSAwLjMwNzA1OSwwIDAuNTQyMzQ2LC0wLjIwOTc0IDAuNjU2MjUsLTAuNDY4NzUgbCAyNC4wMzEyNSwwIGMgMC4wMTAyMSwwLjAwMjUgMC4wMjEwNCwwLjAwMjUgMC4wMzEyNSwwIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODYsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAwLC0wLjQzNzUgMCwtOC44NjU2MjUgQyA2Mi43NzI4MTIsNzcuMjQyNjc0IDYyLjkyMzc5NSw3Ny4wOTAwNzIgNjMsNzYuOTEyNSBsIDMuOTY4NzUsMCBjIDAuMTUwNjY2LDIuNzc4NjMyIDIuNDY1NjAyLDQuOTY4NzUgNS4yODEyNSw0Ljk2ODc1IDIuODE2MTE0LDAgNS4wOTk3NzgsLTIuMTkwODg3IDUuMjUsLTQuOTY4NzUgbCA0LjA2MjUsMCBjIDAuMTA1MzEyLDAuMjc1ODc2IDAuMzY5NjIyLDAuNDY4NzUgMC42ODc1LDAuNDY4NzUgMC40MTE4NDEsMCAwLjc1LC0wLjM0MTEwOSAwLjc1LC0wLjc1IDAsLTAuMzEwNDU5IC0wLjIwMDgwNCwtMC41NzcwNDEgLTAuNDY4NzUsLTAuNjg3NSBsIDAsLTEzLjIxNTYyNSBDIDgyLjc5ODcxNiw2Mi42MTc0MjEgODMsNjIuMzUwODQ4IDgzLDYyLjA0MDYyNSBjIDAsLTAuMzEwMjIyIC0wLjIwMTI4NCwtMC41NzY3OTcgLTAuNDY4NzUsLTAuNjg3NSBsIDAsLTE0LjA2MjUgQyA4Mi43OTIzMDksNDcuMTc2OTkyIDgzLDQ2LjkzOTI0OSA4Myw0Ni42MzQzNzUgYyAwLC0wLjMwNDg3MyAtMC4yMDc2OTEsLTAuNTQyNjE4IC0wLjQ2ODc1LC0wLjY1NjI1IGwgMCwtOC4zNTMxMjUgMCwtMC40Njg3NSBjIDAuMDAyNSwtMC4wMTAyMSAwLjAwMjUsLTAuMDIxMDQgMCwtMC4wMzEyNSAtMC4wMDY0LC0wLjAxMzYgLTAuMDE3NjUsLTAuMDI0ODYgLTAuMDMxMjUsLTAuMDMxMjUgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgbCAtMjcuNjU2MjUsMCBDIDU0LjY5ODU5OSwzNi44MzQ3MzkgNTQuNDYzMzA5LDM2LjYyNSA1NC4xNTYyNSwzNi42MjUgYyAtMC40MTE4NDEsMCAtMC43NSwwLjM0MTExIC0wLjc1LDAuNzUgMCwwLjQwODg5MSAwLjMzODE1OSwwLjc1IDAuNzUsMC43NSAwLjMwMjYzNCwwIDAuNTQxNDYxLC0wLjE4MDA1MSAwLjY1NjI1LC0wLjQzNzUgbCAyNy4xMjUsMCAwLDguMjkwNjI1IGMgLTAuMTY1NzQ1LDAuMDc3MDIgLTAuMjczNDgsMC4yMTIxODQgLTAuMzQzNzUsMC4zNzUgbCAtNC4wMzEyNSwwIGMgLTAuMTUwNjU4LC0yLjc3OTA2MiAtMi40NjUxMiwtNSAtNS4yODEyNSwtNSAtMi44MTYxMjgsMCAtNS4xMzA1OTIsMi4yMjA5MzggLTUuMjgxMjUsNSBsIC00LDAgYyAtMC4xMDUzMTIsLTAuMjc1ODc2IC0wLjM2OTYyMSwtMC40Njg3NSAtMC42ODc1LC0wLjQ2ODc1IC0wLjQxMTg0MSwwIC0wLjc1LDAuMzQxMTEgLTAuNzUsMC43NSAwLDAuMzAwNjUzIDAuMTc3NTksMC41NDE5OCAwLjQzNzUsMC42NTYyNSBsIDAsMTQuMDYyNSBjIC0wLjI2Njg3NiwwLjExMTQ5NSAtMC40Mzc1LDAuMzgxODE2IC0wLjQzNzUsMC42ODc1IDAsMC4zMDU2ODUgMC4xNzA2MjQsMC41NzYwMDUgMC40Mzc1LDAuNjg3NSBsIDAsMTMuMjE1NjI1IGMgLTAuMjY2ODc2LDAuMTExNDk1IC0wLjQzNzUsMC4zODE4MTYgLTAuNDM3NSwwLjY4NzUgMCwwLjMwNTY4NSAwLjE3MDYyNCwwLjU3NjAwNSAwLjQzNzUsMC42ODc1IGwgMCw4LjgwMzEyNSAtMjMuNSwwIGMgLTAuMDc3ODksLTAuMTcxMDUzIC0wLjIwMDkxMSwtMC4zMzIyODggLTAuMzc1LC0wLjQwNjI1IGwgMCwtMy42NTMxMjUgYyAyLjc2NTY3LC0wLjE2MzgxMiA0Ljk2ODc1LC0yLjQ0MzE5MyA0Ljk2ODc1LC01LjI1IDAsLTIuODA2ODA1IC0yLjIwMjYwNywtNS4xMTY5NjggLTQuOTY4NzUsLTUuMjgxMjUgbCAwLC00LjQwNjI1IGMgMi43NjYxNDMsLTAuMTY0MjgyIDQuOTY4NzUsLTIuNDc0NDQzIDQuOTY4NzUsLTUuMjgxMjUgMCwtMi44MDY4MDUgLTIuMjAyNjA3LC01LjExNjk2OCAtNC45Njg3NSwtNS4yODEyNSBsIDAsLTQuMzc1IGMgMi43NzkwNjMsLTAuMTUwNjU4IDUsLTIuNDY1MTIgNSwtNS4yODEyNSAwLC0yLjgxNjEyOCAtMi4yMjA5MzcsLTUuMTMwNTkyIC01LC01LjI4MTI1IGwgMCwtMy41OTM3NSBjIDAuMTY0MDc4LC0wLjA3MDI2IDAuMjk3OTQyLC0wLjE3OTIzIDAuMzc1LC0wLjM0Mzc1IGwgNy4xODc1LDAgYyAwLjExMTg4OSwwLjI2NDY2NiAwLjM3OTU1NywwLjQzNzUgMC42ODc1LDAuNDM3NSAwLjQxMTg0MSwwIDAuNzE4NzUsLTAuMzQ0NzU0IDAuNzE4NzUsLTAuNzUgMCwtMC4wMzQyOCAwLjAwNzUsLTAuMDcxOTkgMCwtMC4wOTM3NSBsIDUuOTY4NzUsLTMuNSBjIDAuMDEzNiwtMC4wMDY0IDAuMDI0ODYsLTAuMDE3NjUgMC4wMzEyNSwtMC4wMzEyNSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgMC4wMDI1LC0wLjAxMDIxIDAuMDAyNSwtMC4wMjEwNCAwLC0wLjAzMTI1IEwgNTIuODc1LDMzLjMxMjUgYyAtMC4wMDY0LC0wLjAxMzYgLTAuMDE3NjUsLTAuMDI0ODYgLTAuMDMxMjUsLTAuMDMxMjUgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgLTAuMDEwMjEsLTAuMDAyNSAtMC4wMjEwNCwtMC4wMDI1IC0wLjAzMTI1LDAgeiBtIC0xNC45Mzc1LDguOTA2MjUgYyAxLjE5MzQ4MywwIDIuMjY1NzAyLDAuNDg0MDYyIDMuMDkzNzUsMS4yMTg3NSBsIC0zLjA5Mzc1LDMuMTI1IC0zLjEyNSwtMy4xMjUgYyAwLjgyODY2NiwtMC43MzQxOTkgMS45MzE1MTksLTEuMjE4NzUgMy4xMjUsLTEuMjE4NzUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IGMgMS4xOTM0ODMsMCAyLjI2NTcwMiwwLjQ4NDA2MiAzLjA5Mzc1LDEuMjE4NzUgbCAtMy4wOTM3NSwzLjEyNSAtMy4xMjUsLTMuMTI1IGMgMC44Mjg2NjYsLTAuNzM0MTk5IDEuOTMxNTE5LC0xLjIxODc1IDMuMTI1LC0xLjIxODc1IHogbSAtMzcuOTM3NSwxLjg2NTYyNSAzLjEyNSwzLjEyNSBMIDM0LjM0Mzc1LDUwIEMgMzMuNjA5MDYyLDQ5LjE3MTk1MiAzMy4xMjUsNDguMDk5NzMzIDMzLjEyNSw0Ni45MDYyNSBjIDAsLTEuMTkzNDgxIDAuNDg0NTUxLC0yLjI5NjMzNCAxLjIxODc1LC0zLjEyNSB6IG0gNi45Njg3NSwwIGMgMC43MzQxOTksMC44Mjg2NjYgMS4yMTg3NSwxLjkzMTUxOSAxLjIxODc1LDMuMTI1IDAsMS4xOTM0ODMgLTAuNDg0MDYyLDIuMjY1NzAyIC0xLjIxODc1LDMuMDkzNzUgbCAtMy4wOTM3NSwtMy4wOTM3NSAzLjA5Mzc1LC0zLjEyNSB6IG0gMjcuNDY4NzUsLTAuMjcxODc1IDMuMTI1LDMuMTI1IC0zLjEyNSwzLjA5Mzc1IGMgLTAuNzM0Njg4LC0wLjgyODA0OCAtMS4yMTg3NSwtMS45MDAyNjcgLTEuMjE4NzUsLTMuMDkzNzUgMCwtMS4xOTM0ODEgMC40ODQ1NTEsLTIuMjk2MzM0IDEuMjE4NzUsLTMuMTI1IHogbSA2Ljk2ODc1LDAgYyAwLjczNDE5OSwwLjgyODY2NiAxLjIxODc1LDEuOTMxNTE5IDEuMjE4NzUsMy4xMjUgMCwxLjE5MzQ4MyAtMC40ODQwNjIsMi4yNjU3MDIgLTEuMjE4NzUsMy4wOTM3NSBsIC0zLjA5Mzc1LC0zLjA5Mzc1IDMuMDkzNzUsLTMuMTI1IHogbSAtMTIuNzUsMy40MDYyNSA0LDAgYyAwLjE1MDY1OCwyLjc3OTA2MyAyLjQ2NTEyMiw1IDUuMjgxMjUsNSAyLjgxNjEzLDAgNS4xMzA1OTIsLTIuMjIwOTM3IDUuMjgxMjUsLTUgbCA0LjAzMTI1LDAgYyAwLjA3MDI3LDAuMTYyODE1IDAuMTc4MDA0LDAuMjk3OTg1IDAuMzQzNzUsMC4zNzUgbCAwLDE0LjA2MjUgYyAtMC4xNjkyODMsMC4wNzA4MyAtMC4yNzAxNzEsMC4yMDkzOTUgLTAuMzQzNzUsMC4zNzUgbCAtNC4wNjI1LDAgYyAwLjAwMTYsLTAuMDUyOTkgMCwtMC4xMDI4ODIgMCwtMC4xNTYyNSAwLC0yLjkxMzI2IC0yLjM2Nzk5LC01LjI4MTI1IC01LjI4MTI1LC01LjI4MTI1IC0yLjkxMzI2LDAgLTUuMjgxMjUsMi4zNjc5OSAtNS4yODEyNSw1LjI4MTI1IDAsMC4wNTI2NCAtMi42MmUtNCwwLjEwMzE0MiAwLDAuMTU2MjUgbCAtMy45Njg3NSwwIGMgLTAuMDc1MzYsLTAuMTcyMjQgLTAuMjM3MzU3LC0wLjI3MTQzMyAtMC40MDYyNSwtMC4zNDM3NSBsIDAsLTE0LjA5Mzc1IGMgMC4xNzI2NDgsLTAuMDc3NzQgMC4zMzIxNDQsLTAuMjAyMjEzIDAuNDA2MjUsLTAuMzc1IHogTSAzNy44NDM3NSw0Ny4yODEyNSA0MC45Mzc1LDUwLjM3NSBjIC0wLjgyODA0OCwwLjczNDY4OCAtMS45MDAyNjcsMS4yMTg3NSAtMy4wOTM3NSwxLjIxODc1IC0xLjE5MzQ4MSwwIC0yLjI5NjMzNCwtMC40ODQ1NTEgLTMuMTI1LC0xLjIxODc1IGwgMy4xMjUsLTMuMDkzNzUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IDMuMDkzNzUsMy4wOTM3NSBjIC0wLjgyODA0OCwwLjczNDY4OCAtMS45MDAyNjcsMS4yMTg3NSAtMy4wOTM3NSwxLjIxODc1IC0xLjE5MzQ4MSwwIC0yLjI5NjMzNCwtMC40ODQ1NTEgLTMuMTI1LC0xLjIxODc1IGwgMy4xMjUsLTMuMDkzNzUgeiBNIDM3LjgxMjUsNTcuMTU2MjUgYyAxLjE3OTY3NiwwIDIuMjM4MjI3LDAuNDY4Mjg5IDMuMDYyNSwxLjE4NzUgbCAtMy4wMzEyNSwzLjA2MjUgLTMuMDYyNSwtMy4wNjI1IGMgMC44MjIxODYsLTAuNzExODEzIDEuODU5ODUsLTEuMTg3NSAzLjAzMTI1LC0xLjE4NzUgeiBNIDcyLjI1LDU2Ljg4NDM3NSBjIDEuMTc5Njc2LDAgMi4yMzgyMjcsMC40NjgyODkgMy4wNjI1LDEuMTg3NSBsIC0zLjAzMTI1LDMuMDYyNSAtMy4wNjI1LC0zLjA2MjUgYyAwLjgyMjE4NiwtMC43MTE4MTMgMS44NTk4NSwtMS4xODc1IDMuMDMxMjUsLTEuMTg3NSB6IG0gLTM3Ljg3NSwxLjgwMzEyNSAzLjA5Mzc1LDMuMDkzNzUgLTMuMTg3NSwzLjE1NjI1IGMgLTAuMDA0NSwtMC4wMDUyIC0wLjAyNjgyLDAuMDA1MiAtMC4wMzEyNSwwIC0wLjcwOTM0NCwtMC44Mjc3NTQgLTEuMTI1LC0xLjkyMDYzOCAtMS4xMjUsLTMuMDkzNzUgMCwtMS4yMTY1ODYgMC40OTEyMTQsLTIuMzIyNjE3IDEuMjUsLTMuMTU2MjUgeiBtIDM0LjQzNzUsLTAuMjcxODc1IDMuMDkzNzUsMy4wOTM3NSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTIgLTAuMDI2ODIsMC4wMDUyIC0wLjAzMTI1LDAgLTAuNzA5MzQ0LC0wLjgyNzc1NCAtMS4xMjUsLTEuOTIwNjM4IC0xLjEyNSwtMy4wOTM3NSAwLC0xLjIxNjU4NiAwLjQ5MTIxNCwtMi4zMjI2MTcgMS4yNSwtMy4xNTYyNSB6IE0gNDEuMjUsNTguNzE4NzUgYyAwLjc1MTU1MiwwLjgzMTgzNSAxLjI1LDEuOTE2MzY2IDEuMjUsMy4xMjUgMCwxLjE2NjQwMyAtMC40ODA0MjgsMi4yMDk5OCAtMS4xODc1LDMuMDMxMjUgTCAzOC4yMTg3NSw2MS43ODEyNSA0MS4yNSw1OC43MTg3NSB6IG0gMzQuNDM3NSwtMC4yNzE4NzUgYyAwLjc1MTU1MiwwLjgzMTgzNSAxLjI1LDEuOTE2MzY2IDEuMjUsMy4xMjUgMCwxLjE2NjQwMyAtMC40ODA0MjgsMi4yMDk5OCAtMS4xODc1LDMuMDMxMjUgbCAtMy4wOTM3NSwtMy4wOTM3NSAzLjAzMTI1LC0zLjA2MjUgeiBNIDM3Ljg0Mzc1LDYyLjEyNSBsIDMuMTI1LDMuMTU2MjUgYyAtMC44Mjk2ODEsMC43Nzk4MDEgLTEuOTMwNTYzLDEuMjgxMjUgLTMuMTU2MjUsMS4yODEyNSAtMS4yMTU4MjksMCAtMi4zMjQ1NzMsLTAuNDU1MDc2IC0zLjE1NjI1LC0xLjIxODc1IDAuMDAyNSwtMC4wMTAyMSAwLjAwMjUsLTAuMDIxMDQgMCwtMC4wMzEyNSBsIDMuMTg3NSwtMy4xODc1IHogbSAzNC40Mzc1LC0wLjI3MTg3NSAzLjEyNSwzLjE1NjI1IGMgLTAuODI5NjgxLDAuNzc5ODAxIC0xLjkzMDU2MywxLjI4MTI1IC0zLjE1NjI1LDEuMjgxMjUgLTEuMjE1ODI5LDAgLTIuMzI0NTczLC0wLjQ1NTA3NiAtMy4xNTYyNSwtMS4yMTg3NSAwLjAwMjUsLTAuMDEwMjEgMC4wMDI1LC0wLjAyMTA0IDAsLTAuMDMxMjUgbCAzLjE4NzUsLTMuMTg3NSB6IE0gNjMsNjIuMzIxODc1IGwgNC4wMzEyNSwwIGMgMC4zNjcyNjgsMi41NTU3ODIgMi41NjIzNzUsNC41MzEyNSA1LjIxODc1LDQuNTMxMjUgMi42NTU5ODgsMCA0Ljg1MDAxNSwtMS45NzU2MyA1LjIxODc1LC00LjUzMTI1IDAuMDEwMjEsMC4wMDI1IDAuMDIxMDQsMC4wMDI1IDAuMDMxMjUsMCBsIDQuMDkzNzUsMCBjIDAuMDcyMzMsMC4xNjc1OTQgMC4xNzAwODMsMC4zMzEwMyAwLjM0Mzc1LDAuNDA2MjUgbCAwLDEzLjIxNTYyNSBjIC0wLjE2OTYzMywwLjA3MDcgLTAuMjcwMTY5LDAuMjA5MjUgLTAuMzQzNzUsMC4zNzUgbCAtNC4wOTM3NSwwIEMgNzcuMzM0MDk3LDczLjU1Mzc2NCA3NS4wNTU4OTYsNzEuMzUgNzIuMjUsNzEuMzUgYyAtMi44MTU2NDgsMCAtNS4xMzA1ODQsMi4xOTAxMTkgLTUuMjgxMjUsNC45Njg3NSBsIC0zLjk2ODc1LDAgQyA2Mi45MjQ2NCw3Ni4xNDY1MSA2Mi43NjI2NDMsNzYuMDQ3MzE3IDYyLjU5Mzc1LDc1Ljk3NSBsIDAsLTEzLjI0Njg3NSBDIDYyLjc3MjgxMiw2Mi42NTIwNDkgNjIuOTIzNzk1LDYyLjQ5OTQ0NyA2Myw2Mi4zMjE4NzUgeiBNIDM3LjgxMjUsNzIuMTI1IGMgMS4xODA3NjgsMCAyLjIzODg3MiwwLjQzODczMyAzLjA2MjUsMS4xNTYyNSBsIC0zLjAzMTI1LDMuMDYyNSAtMy4wNjI1LC0zLjA2MjUgQyAzNS42MDI3ODIsNzIuNTcxMTM0IDM2LjY0LDcyLjEyNSAzNy44MTI1LDcyLjEyNSB6IE0gNzIuMjUsNzEuOTQzNzUgYyAxLjE4MDc2OCwwIDIuMjM4ODcyLDAuNDM4NzMzIDMuMDYyNSwxLjE1NjI1IEwgNzIuMjgxMjUsNzYuMTYyNSA2OS4yMTg3NSw3My4xIEMgNzAuMDQwMjgyLDcyLjM4OTg4NCA3MS4wNzc1LDcxLjk0Mzc1IDcyLjI1LDcxLjk0Mzc1IHogbSAtMzcuODc1LDEuNzEyNSAzLjA5Mzc1LDMuMDYyNSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTEgLTAuMDI2ODIsMC4wMDUxIC0wLjAzMTI1LDAgLTAuNzA5Mjc2LC0wLjgyMDc0OCAtMS4xMjUsLTEuODg5Mzg4IC0xLjEyNSwtMy4wNjI1IDAsLTEuMjE2NTg2IDAuNDkxMjE0LC0yLjMyMjYxNyAxLjI1LC0zLjE1NjI1IHogbSA2Ljg3NSwwIGMgMC43NTEwNiwwLjgzMjQ1OSAxLjI1LDEuOTQ3NjE1IDEuMjUsMy4xNTYyNSAwLDEuMTY2NDAzIC0wLjQ3OTk0NiwyLjE3OTMzNyAtMS4xODc1LDMgTCAzOC4yMTg3NSw3Ni43MTg3NSA0MS4yNSw3My42NTYyNSB6IG0gMjcuNTYyNSwtMC4xODEyNSAzLjA5Mzc1LDMuMDYyNSAtMy4xODc1LDMuMTU2MjUgYyAtMC4wMDQ1LC0wLjAwNTEgLTAuMDI2ODIsMC4wMDUxIC0wLjAzMTI1LDAgLTAuNzA5Mjc2LC0wLjgyMDc0OCAtMS4xMjUsLTEuODg5Mzg4IC0xLjEyNSwtMy4wNjI1IDAsLTEuMjE2NTg2IDAuNDkxMjE0LC0yLjMyMjYxNyAxLjI1LC0zLjE1NjI1IHogbSA2Ljg3NSwwIGMgMC43NTEwNiwwLjgzMjQ1OSAxLjI1LDEuOTQ3NjE1IDEuMjUsMy4xNTYyNSAwLDEuMTY2NDAzIC0wLjQ3OTk0NiwyLjE3OTMzNyAtMS4xODc1LDMgTCA3Mi42NTYyNSw3Ni41Mzc1IDc1LjY4NzUsNzMuNDc1IHogbSAtMzcuODQzNzUsMy42MTg3NSAzLjEyNSwzLjEyNSBDIDQwLjEzOTA2OSw4MC45OTg1NTEgMzkuMDM4MTg3LDgxLjUgMzcuODEyNSw4MS41IGMgLTEuMjE5MzAyLDAgLTIuMzIzODc5LC0wLjQ1ODc5MiAtMy4xNTYyNSwtMS4yMTg3NSAtMC4wMDUsLTAuMDA0NiAwLjAwNSwtMC4wMjY2NiAwLC0wLjAzMTI1IGwgMy4xODc1LC0zLjE1NjI1IHogbSAzNC40Mzc1LC0wLjE4MTI1IDMuMTI1LDMuMTI1IGMgLTAuODI5NjgxLDAuNzc5ODAxIC0xLjkzMDU2MywxLjI4MTI1IC0zLjE1NjI1LDEuMjgxMjUgLTEuMjE5MzAyLDAgLTIuMzIzODc5LC0wLjQ1ODc5MiAtMy4xNTYyNSwtMS4yMTg3NSAtMC4wMDUsLTAuMDA0NiAwLjAwNSwtMC4wMjY2NiAwLC0wLjAzMTI1IGwgMy4xODc1LC0zLjE1NjI1IHoiCiAgIGlkPSJwYXRoNTM5NiIKICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY3NjY3NjY2Njc3NzY2NzY2Njc3NjY3NzY2Njc2Njc3NzY2NjY2Njc2Njc2Njc2NjY2Njc2Njc3NzY2NjY2Nzc2Njc3NjY2Njc3NzY2NzY2Njc2Njc3NjY2NjY3NjY3NzY2NzY2NzY2Njc3NjY3Nzc2NjY2Njc2Njc3NjY3NjY3NjY2NjY3NjY3NjY3NjY2Njc3NjY3NzY2Nzc2NjY2NjY2NjY2NjY2Njc2Njc2NjY2NjY3NjY3NjY2NjY3NjY2NjY2Nzc3NjY2NjY2Njc2NjY2NzY2NjY2NjY2NjY2NjY2Njc3NjY2Njc3NjY3NjY2Njc2NjY2Njc2NjY2Njc2NjY2Njc2NjY2NjY2NzY2NjY2NjY2NjY2NjY2NjY2Njc3NjY3NjY2NjY2Nzc2Njc2NjY2Njc3NjY2Njc3NjYyIgLz48cmVjdAogICBzdHlsZT0ib3BhY2l0eTowLjg3MTI4NzA5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1MzExKSIKICAgaWQ9InJlY3Q1Mjg3IgogICB3aWR0aD0iMTAiCiAgIGhlaWdodD0iMSIKICAgeD0iMTciCiAgIHk9IjExOCIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NTE1NjI1LDAsMCwwLjkwNjI1LC0xLjA0MjE4NzUsLTMuNjI1KSIKICAgcnk9IjAuNSIgLz48cGF0aAogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjYyIKICAgaWQ9InBhdGg0MTk3IgogICBkPSJtIDcuMjUsMjUuMzc1IDc5LjY2MDYwNiwwIEMgOTAuNjI1LDI1LjM3NSAxMDguNzUsNDEuODY2MDc4IDEwOC43NSw0Ny4wOTE5MTggbCAwLDUwLjc4MzA4MiAtMTAxLjUsMCAwLC03Mi41IHoiCiAgIHN0eWxlPSJvcGFjaXR5OjAuMDM0NjUzNDk7ZmlsbDp1cmwoI3BhdHRlcm41MTQ5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz48cGF0aAogICBzdHlsZT0ib3BhY2l0eTowLjg3MTI4NzA5O2ZpbGw6IzAwNjE5YTtmaWxsLW9wYWNpdHk6MC44NDY1NjA4NTtzdHJva2U6bm9uZSIKICAgZD0ibSAxMDIuNjYxMTMsODUuODM4ODY3IGMgLTAuMDk3MSwwLjA0NTMgLTAuMTg2LDAuMDk2MzEgLTAuMjgzMiwwLjE0MTYwMiAtMC43MTY2MywwLjMzOSAtMS40MzU4OCwwLjY4MTc0OSAtMi4xMjQwMiwxLjA3NjE3MiAtMC4yNTU2NTcsMC4xNTcwOCAtMC40MjkwMzIsMC4yNTk4MDMgLTAuNjc5NjkxLDAuNDI0ODA0IC0wLjQyNjA5MiwwLjI4MDQ5NCAtMC44MzMzNDIsMC41OTg4NDEgLTEuMjE3Nzc0LDAuOTM0NTcxIC0wLjIzMzM2OCwwLjIxMzM4NSAtMC4yODk1MzgsMC4yNTg5ODggLTAuNTA5NzY1LDAuNDgxNDQ1IC0wLjI2NjAzOSwwLjI2ODczIC0wLjUxMjQ4NSwwLjUzOTc2MiAtMC43NjQ2NDksMC44MjEyODkgLTAuMDY0MzQsMC4wNzc3NiAtMC4xMzQwOTgsMC4xNDg2NTIgLTAuMTk4MjQyLDAuMjI2NTYyIDAuMDA3MywtMC4xMTI1MDEgMC4wMjA3NSwtMC4yMjc0NDEgMC4wMjgzNywtMC4zMzk4NDMgMC4wNDU4NiwtMC42MDMwMSAwLjA5NDI2LC0xLjE4NzkwNCAwLjE5ODI0MiwtMS43ODQxOCAwLjAxNjc2LC0wLjA4NTE5IDAuMDM4NDIsLTAuMTcwMDAzIDAuMDU2NjQsLTAuMjU0ODgzIDAuMDM2ODgsLTAuMTcxNzcgMC4wODk3MiwtMC4zNDE4MjggMC4xNDE2MDEsLTAuNTA5NzY1IC0wLjExODE4NCwtMC4xMDM2NDMgLTAuMjUyODI2LC0wLjE5Nzk1MyAtMC41MDk3NjYsLTAuNDgxNDQ2IC0wLjAyMTc1LDAuMDkzMjIgLTAuMDM5NDIsMC4xODkwMTcgLTAuMDU2NjQsMC4yODMyMDMgLTAuMDE3MzEsMC4wOTQyMSAtMC4wNDE0MiwwLjE4ODY0NSAtMC4wNTY2NCwwLjI4MzIwNCAtMC4wOTQwNSwwLjYwNTYxIC0wLjEzOTcxNiwxLjIwMjY0OCAtMC4xOTgyNDIsMS44MTI1IC0wLjAzNjcsMC40MDQ4NzYgLTAuMDgxNDcsMC44MTI0NzEgLTAuMTEzMjgxLDEuMjE3NzczIC0wLjAzMzA4LDAuNDAyNzI4IC0wLjAyNjkyLDAuNDA2NTggMC4xNjk5MjIsMS4wNDc4NTIgMC4wMTAzMywwLjAzMzUzIDAuMDQ5OTMsMC4wMjUxOSAwLjA4NDkxLDAuMDI4MzYgMC4xMjk4NTcsMC4wMTM2OCAwLjE1MDksLTAuMDA2MyAwLjI1NDg4MywtMC4wNTY2NCAwLjAyMzkzLC0wLjAyMjExIDAuMDYyNzEsLTAuMDMyODEgMC4wODQ5MiwtMC4wNTY2NCAwLjA4OTA4LC0wLjA5NTE0IDAuMTUyMzIyLC0wLjIwNTE2NiAwLjIyNjU2MiwtMC4zMTE1MjMgMC4xNjg5OTgsLTAuMjQyMTQxIDAuMDQxMjQsLTAuMDQ0MjMgMC4yMjY1NjMsLTAuMzExNTI0IDAuMjgxMSwtMC40MDY5OTcgMC41ODcwMzIsLTAuODA5MDE4IDAuOTM0NTcsLTEuMTYxMTMzIDAuMDgxMDIsLTAuMDgyMTEgMC4xNzIyMDYsLTAuMTQ2MDk2IDAuMjU0ODgzLC0wLjIyNjU2MiAwLjQ2NzMxNywtMC40MzQ3MSAwLjk2NDA1OSwtMC44MTY5NzYgMS41MDA5NzQsLTEuMTYxMTMzIDAuMTEzMzEsLTAuMDcyNTkgMC4yMjU0NiwtMC4xNTU2OTQgMC4zMzk4NCwtMC4yMjY1NjMgMC41Njg3MiwtMC4zNDg4NzkgMS4xNzE3NiwtMC42NDI4ODQgMS43ODQxOCwtMC45MDYyNSAwLjEwNTI3LC0wLjA0NTI3IDAuMjM0MTksLTAuMDY5MDUgMC4zMzk4NSwtMC4xMTMyODEgMC4wOTc5LC0wLjAzOTI5IDAuMTg1MywtMC4xMDIzMDEgMC4yODMyLC0wLjE0MTYwMSAwLDAgLTAuMTk4MjQsLTAuNzM2MzI4IC0wLjE5ODI0LC0wLjczNjMyOCB6IgogICBpZD0icGF0aDU2ODgiCiAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3Nzc3Nzc3Nzc3NjY3Nzc3Nzc3Nzc3Nzc3Nzc3NjYyIgLz48ZwogICBpZD0ibGF5ZXI0IgogICBpbmtzY2FwZTpsYWJlbD0iYm94IgogICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjQzMzkyMywwLDAsMC42NDMzOTIzLDI4Ni42MDcwMSw4Ni4xMDEyMjUpIiAvPjxnCiAgIGlkPSJsYXllcjUiCiAgIGlua3NjYXBlOmxhYmVsPSJ6aXBfYXBwIgogICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjQzMzkyMywwLDAsMC42NDMzOTIzLDI4Ni42MDcwMSw4Ni4xMDEyMjUpIiAvPjxyZWN0CiAgIHN0eWxlPSJvcGFjaXR5OjAuNTc3ODY4ODk7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICBpZD0icmVjdDEzMjciCiAgIHdpZHRoPSIwLjY0MzM5MjMyIgogICBoZWlnaHQ9IjAiCiAgIHg9IjI4Ny4xOTkwNyIKICAgeT0iOTYuNDc3Njc2IiAvPjxwYXRoCiAgIHN0eWxlPSJvcGFjaXR5OjAuODcxMjg3MDk7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTI3Myk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNTI4MykiCiAgIGQ9Im0gMzAsNDUgMCw2MyAtMTQsMTEgMTEsMCAxNCwtMTEgMCwtNjMgLTExLDAgeiIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLC00LjUzMTI1KSIKICAgaWQ9InJlY3Q1MjQ2IgogICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2MiIC8+PGcKICAgaWQ9Imc1MTI5IgogICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjE4MTI1LC0zLjYyNSkiPjxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtNS40Mzc1KSIKICAgICBpZD0iZzUwODAiPjxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50NTM2Nik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICBpZD0icGF0aDUwNDkiCiAgICAgICBzb2RpcG9kaTpjeD0iMTE1LjUiCiAgICAgICBzb2RpcG9kaTpjeT0iMTAuMDU5NjE0IgogICAgICAgc29kaXBvZGk6cng9IjAuNSIKICAgICAgIHNvZGlwb2RpOnJ5PSIwLjUiCiAgICAgICBkPSJtIDExNiwxMC4wNTk2MTQgYyAwLDAuMjc2MTQzIC0wLjIyMzg2LDAuNSAtMC41LDAuNSAtMC4yNzYxNCwwIC0wLjUsLTAuMjIzODU3IC0wLjUsLTAuNSAwLC0wLjI3NjE0MjIgMC4yMjM4NiwtMC40OTk5OTk4IDAuNSwtMC40OTk5OTk4IDAuMjc2MTQsMCAwLjUsMC4yMjM4NTc2IDAuNSwwLjQ5OTk5OTggeiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzU5Mzc2MywwLDAsMS4zNTkzNzUsLTEzNy4yOTcwMywxLjA1MTc3NDQpIiAvPjxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHJ4PSIwIgogICAgICAgeT0iMTkuOTQwMzg2IgogICAgICAgeD0iMTcuMjI4MTMiCiAgICAgICBoZWlnaHQ9IjQuMDc5Njg5IgogICAgICAgd2lkdGg9IjUiCiAgICAgICBpZD0icmVjdDQ5MjIiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM2OCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MzcwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDk1MCIKICAgICAgIHdpZHRoPSI1IgogICAgICAgaGVpZ2h0PSI0LjA3OTY4OSIKICAgICAgIHg9IjE3LjIyODEzIgogICAgICAgeT0iMTkuOTQwMzg2IgogICAgICAgcng9IjAiCiAgICAgICByeT0iMCIgLz48cmVjdAogICAgICAgcnk9IjAuMTU3MDU2NiIKICAgICAgIHJ4PSIxLjA2MTkxNDYiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgtMC45OTk5OTk5NCwzLjU1Mzc2MDhlLTQsMC4wMDY2MDYzOSwwLjk5OTk3ODE4LDAsMCkiCiAgICAgICB5PSIyMy41NDU2OTYiCiAgICAgICB4PSItMjMuNTk4Mjg4IgogICAgICAgaGVpZ2h0PSIwLjQ0MjY3MSIKICAgICAgIHdpZHRoPSI4LjA1NzA5NjUiCiAgICAgICBpZD0icmVjdDQ5MDgiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM3Mik7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzc0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDkyNiIKICAgICAgIHdpZHRoPSIxLjM1OTM4IgogICAgICAgaGVpZ2h0PSI1LjI1NDg4MjgiCiAgICAgICB4PSIxOS4wMzEyNSIKICAgICAgIHk9IjE0LjY4NTUwMiIKICAgICAgIHJ4PSIwIgogICAgICAgcnk9IjAiIC8+PHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmUiCiAgICAgICBkPSJtIDI0LjcyNjM2NSwxMTEuOTI2OTEgMC42MDE3NiwtNjQuOTg2NTI0IC0xMS4xLDAgMC40OTk5OSw2NC45NDg1NjQgOS45OTgyNSwwLjAzOCB6IgogICAgICAgaWQ9InBhdGgzNzgzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIGlkPSJwYXRoMzc5NSIKICAgICAgIGQ9Im0gMjQuNDU3ODU1LDExMS45MjU5MSAwLjU0MjAzLC02NC45NTE0NDUgLTIuOTgzOTYsLTAuMDI3NTggLTAuMTkyMjMsNjQuOTY5MDE1IDIuNjM0MTYsMC4wMSB6IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC40MjU3NDI1OTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzc2KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2MiCiAgICAgICBpZD0icGF0aDM3ODUiCiAgICAgICBkPSJtIDE0Mi41Mjc5NywxMjkuNjM1NjIgMC4wMzg5LC05NC41MjI2OTEgLTIuNzgzODEsLTAuMDM5MDMgMC4yODc0Nyw5NC41NDgxOTEgMi40NTczOSwwLjAxMzUgNWUtNSwzZS01IHoiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM3OCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDgzOCkiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwwLDAuODI0Mzg1MiwtMTIzLjQyMzQ4LDUuOTg4MTAxOCkiIC8+PHBhdGgKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNDI1NzQyNTk7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM4MCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDg2MikiCiAgICAgICBkPSJtIDE0Ni42MDQzMywxMjkuNzcxNzggMC4zMTI2MywtOTQuNzM0Njc1IC0xLjE0MDIyLC0wLjAyOTk4IDAuMDM5Myw5NC43NjAzMjUgMC43ODgyNywwLjAwNCB6IgogICAgICAgaWQ9InBhdGgzODA1IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuOTk0MDM2MiwwLDAsMC42ODU2MjMzLC0xMjMuNDIzNDgsMjIuOTQzMTU1KSIgLz48cmVjdAogICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzODIpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIgogICAgICAgaWQ9InJlY3QzNzczIgogICAgICAgd2lkdGg9IjEwLjAwMTQ0OSIKICAgICAgIGhlaWdodD0iMi41NjI2MTE2IgogICAgICAgeD0iLTI0Ljg4NTkyOSIKICAgICAgIHk9Ii0xMTIuOTE1ODIiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgtMC45OTk5OTg2MywtMC4wMDE2NTczNSwwLjAwMTQxNjYsLTAuOTk5OTk5LDAsMCkiCiAgICAgICByeD0iMS4zMTgxNzc2IgogICAgICAgcnk9IjAuOTA5MTk3NTEiIC8+PHJlY3QKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1Mzg0KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIGlkPSJyZWN0NDg2NiIKICAgICAgIHdpZHRoPSIxMS4wOTQwMTkiCiAgICAgICBoZWlnaHQ9IjExLjk5OTk5OCIKICAgICAgIHg9IjE0LjIzNjM3NSIKICAgICAgIHk9IjM0Ljk0MDM4NCIKICAgICAgIHJ4PSIwIgogICAgICAgcnk9IjAiIC8+PHBhdGgKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiCiAgICAgICBpZD0icGF0aDQ5MDQiCiAgICAgICBkPSJtIDIzLjcyNjM2NSwyMy43MTQ3MTcgMS42MDE3NiwxMS4yMjU2NjkgLTExLjEsMCAxLjQ5OTk5LC0xMS4yMTkxMTEgNy45OTgyNSwtMC4wMDY2IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjQyNTc0MjU5O2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzODYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAyMy4zMDg4MDUsMjMuNzE0ODkyIDEuNjkwNTksMTEuMjE5NjA3IC0yLjk4MzQ3LDAuMDA0OCAtMC44NDExLC0xMS4yMjI2NDMgMi4xMzM5OCwtMC4wMDE3IHoiCiAgICAgICBpZD0icGF0aDQ5MDYiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwwLjAwNzQ2ODc1LC0wLjExODQzMzUsLTEyNC4wMzg5OSwzOS4wODU2MykiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM4OCk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7ZmlsdGVyOnVybCgjZmlsdGVyNDgzOCkiCiAgICAgICBkPSJtIDE0Mi4xMjU1NywxMjkuNzQ5MzUgMC40NDEzNSwtOTQuNjM2NDIxIC0yLjc4MzgxLC0wLjAzOTAzIDAuMjg3NDcsOTQuNjYxOTIxIDIuMDU0OTksMC4wMTM1IHoiCiAgICAgICBpZD0icGF0aDQ5MTAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIiAvPjxwYXRoCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDAzNjIsMCwtMC4wMDc0NjE3MSwtMC4xMTg0MzM1LC0xMjMuMTYyMjQsMzkuMDg1NjMpIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIKICAgICAgIGlkPSJwYXRoNDkxMiIKICAgICAgIGQ9Im0gMTQ2LjYwNDMzLDEyOS43NzE3OCAwLjMxMjYzLC05NC43MzQ2NzUgLTEuMTQwMjIsLTAuMDI5OTggMC4wMzkzLDk0Ljc2MDMyNSAwLjc4ODI3LDAuMDA0IHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjQyNTc0MjU5O2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDUzOTApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO2ZpbHRlcjp1cmwoI2ZpbHRlcjQ4NjIpIiAvPjxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHJ4PSIwIgogICAgICAgeT0iLTIxLjU0NjY1OSIKICAgICAgIHg9IjE3LjIyODEzIgogICAgICAgaGVpZ2h0PSIxLjYwNjI3NDYiCiAgICAgICB3aWR0aD0iNSIKICAgICAgIGlkPSJyZWN0NDk2MCIKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1MzkyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMSwtMSkiIC8+PHJlY3QKICAgICAgIHJ5PSIwIgogICAgICAgcng9IjAiCiAgICAgICB5PSItMTA5LjY1NjI1IgogICAgICAgeD0iMTQuNjk4MjQyIgogICAgICAgaGVpZ2h0PSIzLjYyNSIKICAgICAgIHdpZHRoPSIxMC4wNjc4NzEiCiAgICAgICBpZD0icmVjdDQzNTgiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM5NCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDEsLTEpIiAvPjwvZz48L2c+PHJlY3QKICAgc3R5bGU9Im9wYWNpdHk6MC41MDk5MDA5ODtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ1MzA5KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmaWx0ZXI6dXJsKCNmaWx0ZXI1Mjk5KSIKICAgaWQ9InJlY3Q1MjkzIgogICB3aWR0aD0iOS40OTk5OTYyIgogICBoZWlnaHQ9IjEuMDAwMDA0OCIKICAgeD0iMTciCiAgIHk9IjExNyIKICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45MDYyNSwwLDAsMC45MDYyNSwwLC0zLjYyNSkiCiAgIHJ5PSIwLjI1IiAvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"qelectrotech,qelectrotech\"\nLABEL oc.cat=\"education\"\nLABEL oc.launch=\"qelectrotech.Qelectrotech\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"qElectrotech\"\nLABEL oc.displayname=\"qElectrotech\"\nLABEL oc.path=\"/usr/bin/qelectrotech\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"qElectrotech\"\nENV APPBIN \"/usr/bin/qelectrotech\"\nENV APP \"/usr/bin/qelectrotech\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/qelectrotech/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/qelectrotech/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application qElectrotech

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/qElectrotech.d\n
"},{"location":"applications/qelectrotech/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f qElectrotech.d -t qElectrotech .\n
"},{"location":"applications/qelectrotech/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect qElectrotech > qElectrotech.json\ndocker image save qElectrotech -o qElectrotech.tar\nctr -n k8s.io images import qElectrotech.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @qElectrotech.json\n\n
"},{"location":"applications/remarkable/","title":"remarkable","text":""},{"location":"applications/remarkable/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/remarkable/#displayname","title":"Displayname","text":"
Remarkable\n
"},{"location":"applications/remarkable/#path","title":"Path","text":"
/usr/bin/remarkable\n
"},{"location":"applications/remarkable/#mimetype","title":"Mimetype","text":"
text/x-markdown;text/markdown;\n
"},{"location":"applications/remarkable/#file-extensions","title":"File extensions","text":"

\"md;markdown\"

"},{"location":"applications/remarkable/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"md;markdown\"

"},{"location":"applications/remarkable/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/remarkable/#wm_class","title":"WM_CLASS","text":"
remarkable.Remarkable\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/remarkable/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/remarkable.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/remarkable/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\nRUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install  --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/remarkable/#json-dump","title":"JSON dump","text":"

json source file remarkable.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\",\n        \"RUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install  --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"remarkable.svg\",\n    \"keyword\": \"markdown,editor\",\n    \"launch\": \"remarkable.Remarkable\",\n    \"name\": \"remarkable\",\n    \"displayname\": \"Remarkable\",\n    \"path\": \"/usr/bin/remarkable\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/x-markdown;text/markdown;\",\n    \"legacyfileextensions\": \"md;markdown\",\n    \"fileextensions\": \"md;markdown\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/remarkable.desktop\",\n    \"usedefaultapplication\": true\n}\n
"},{"location":"applications/remarkable/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output remarkable.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remarkable.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remarkable.d.3.0.json\n\n
"},{"location":"applications/remarkable/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN apt-get update && apt-get install --no-install-recommends --yes python3-gtkspellcheck wkhtmltopdf python3-markdown yelp && apt-get clean\nRUN curl -Ls -o /tmp/remarkable_1.87_all.deb https://remarkableapp.github.io/files/remarkable_1.87_all.deb && apt-get install  --no-install-recommends --yes /tmp/remarkable_1.87_all.deb && apt-get clean && rm -rf /tmp/remarkable_1.87_all.deb && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"remarkable.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMjgiCiAgIHZpZXdCb3g9IjAgMCAzNi4xMjQ0NDUgMzYuMTI0NDQ1IgogICBoZWlnaHQ9IjEyOCIKICAgaWQ9InN2ZzIiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40OC40IHI5OTM5IgogICBzb2RpcG9kaTpkb2NuYW1lPSJyZW1hcmthYmxlLnN2ZyI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMjgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTMwMSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3NDQiCiAgICAgaWQ9Im5hbWVkdmlldzI2IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTpzbmFwLWdsb2JhbD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iNCIKICAgICBpbmtzY2FwZTpjeD0iNjkuMzA2MTI3IgogICAgIGlua3NjYXBlOmN5PSI1OS4wMjI0MTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjY1IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzIiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIHR5cGU9Inh5Z3JpZCIKICAgICAgIGlkPSJncmlkMzc3NyIKICAgICAgIGVtcHNwYWNpbmc9IjUiCiAgICAgICB2aXNpYmxlPSJ0cnVlIgogICAgICAgZW5hYmxlZD0idHJ1ZSIKICAgICAgIHNuYXB2aXNpYmxlZ3JpZGxpbmVzb25seT0idHJ1ZSIgLz4KICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ0NjAiPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MzUwNGQiCiAgICAgICAgIGlkPSJzdG9wNyIgLz4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNzI2ZTZhIgogICAgICAgICBpZD0ic3RvcDkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDM4Ij4KICAgICAgPHN0b3AKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmY4OTAwIgogICAgICAgICBpZD0ic3RvcDEyIiAvPgogICAgICA8c3RvcAogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmE1M2QiCiAgICAgICAgIGlkPSJzdG9wMTQiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuMDU4LDAsMCwwLjA1MjU3LC0xLjU3NDkyLC0xLjQxNzQyKSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQwMzgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0OTUwIgogICAgICAgeTE9IjIxMiIKICAgICAgIHkyPSIxMDAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgyPSIwIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMTA1MjUsMCwwLDEuMTA1MjUsLTEzNC4yNzg3NCwtMjk1Ljc2MTgzKSIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ0NjAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NDMxIgogICAgICAgeTE9IjI3OS4wOTYwMSIKICAgICAgIHkyPSIyNjguMzI5OTkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgyPSIwIiAvPgogIDwvZGVmcz4KICA8ZwogICAgIHN0eWxlPSJmaWxsOiM0Y2MxZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQiCiAgICAgaWQ9ImcxOCIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgyLjc4MjY1NjMsMCwwLDIuNzgyNjU2MywtMC43ODQ3MDkwOSwtMC43ODQ3MDkxNSkiPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMi45ODIiCiAgICAgICB4PSIwLjI4MjAwMDAxIgogICAgICAgeT0iMC4yODIwMDAwMSIKICAgICAgIHJ4PSI2LjQ5MTAwMDIiCiAgICAgICBoZWlnaHQ9IjEyLjk4MiIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNTtmaWxsOiM0Y2MxZmY7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDIwIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMS44NTMiCiAgICAgICB4PSIwLjg0NyIKICAgICAgIHk9IjAuODQ3IgogICAgICAgcng9IjUuOTI2MDAwMSIKICAgICAgIGhlaWdodD0iMTEuODUzIgogICAgICAgc3R5bGU9ImZpbGw6IzRjYzFmZjtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0MjIiIC8+CiAgPC9nPgogIDxnCiAgICAgc3R5bGU9ImZvbnQtc2l6ZTozMS40MTMwOTkyOXB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpTYW5zIgogICAgIGlkPSJ0ZXh0Mzc3MyI+CiAgICA8cGF0aAogICAgICAgZD0ibSAyOS42ODM1NDIsMTIuMDEyMTQxIGMgLTIuNGUtNSwwLjc4MjI3NSAtMC41NTIyMDcsMS45NDY0NiAtMS42NTY1NSwzLjQ5MjU2IC0wLjIyMDg5NiwwLjMxMjkxNSAtMC45NTI1MzgsMC43Njg0NjYgLTIuMTk0OTI5LDEuMzY2NjU0IC0wLjI5NDUxOCwwLjM1ODkyOSAtMC44Njk3MDgsMC44MDA2NzUgLTEuNzI1NTczLDEuMzI1MjQgLTAuNjM1MDI5LDAuMTkzMjczIC0xLjU0MTUyOSwwLjUwMTU3NSAtMi43MTk1MDMsMC45MjQ5MDcgLTAuMzk1NzQ3LDAuMjMwMDg0IC0wLjk3NTUzOSwwLjUyOTE4MyAtMS43MzkzNzgsMC44OTcyOTggLTAuMTE5NjUzLDAuMDI3NjIgLTEuMDUzNzYzLDAuMTc5NDY3IC0yLjgwMjMzLDAuNDU1NTUxIC0xLjM5ODg3NSwwLjIyMDg4IC0yLjA5ODMwNiwwLjUwNjE3NSAtMi4wOTgyOTcsMC44NTU4ODQgLTllLTYsMC4zMjIxMTMgMC42MDI3OSwwLjkxMTEwOCAxLjgwODQwMSwxLjc2Njk4NyAwLjk4NDcxNSwwLjY5OTQzNiAxLjY1NjUzNywxLjEyNzM3OCAyLjAxNTQ2OSwxLjI4MzgyNiAwLjk4NDcxMywwLjQzMjU0NyAyLjYyMjg1NSwxLjE3MzM5MiA0LjkxNDQzMiwyLjIyMjUzOCBsIDIuMzc0Mzg4LDAuNzg2ODYyIGMgMS4wNTgzMywwLjQ3ODU1OCAxLjYwMTMxLDEuMDQ5MTQ3IDEuNjI4OTQxLDEuNzExNzY4IC0wLjE2NTY3NywwLjMwMzY5OSAtMC40MTQxNTksMC40NTU1NDkgLTAuNzQ1NDQ4LDAuNDU1NTUxIC0wLjAwOTIsLTJlLTYgLTAuMTkzMjg1LC0wLjAzNjgxIC0wLjU1MjE4MywtMC4xMTA0MzYgLTAuMzU4OTM5LC0wLjA2NDQyIC0wLjU3NTIxMSwtMC4wOTY2MyAtMC42NDg4MTUsLTAuMDk2NjMgLTEuMjcwMDQxLC0xZS02IC0yLjQzODgyOCwtMC4yNDM4ODIgLTMuNTA2MzY1LC0wLjczMTY0MyAtMC4wNjQ0NCwtMC4wMDkyIC0xLjEwODk4MywtMC40ODc3NjIgLTMuMTMzNjQsLTEuNDM1Njc2IC0wLjQxNDE1MSwtMC4yNTc2ODUgLTEuMDM1MzU2LC0wLjY1ODAxOCAtMS44NjM2MTksLTEuMjAwOTk5IC0wLjY4MTAzNywtMC40NDE3NDUgLTEuMTczNCwtMC44NjA0ODMgLTEuNDc3MDksLTEuMjU2MjE3IC0wLjExOTY1LC0wLjAwOTIgLTAuMjg1MzA1LC0wLjA0MTQxIC0wLjQ5Njk2NSwtMC4wOTY2MyAtMC4zMDM3MTEsLTAuNDY5MzUzIC0xLjE1MDM5MSwtMS4xMjczNzEgLTIuNTQwMDQ0LC0xLjk3NDA1NiAtMS4xNjg3OTQsLTAuNzI3MDM2IC0xLjc1MzE4NywtMS4zMDIyMjYgLTEuNzUzMTgyLC0xLjcyNTU3MyAwLjA1NTIxLC0wLjEzODAzOSAwLjIzMDA3MSwtMC41NzUxODQgMC41MjQ1NzQsLTEuMzExNDM1IDEuODMxNDAxLC0wLjM5NTcyMyA0LjE1OTc3MSwtMC45Mzg3MDMgNi45ODUxMiwtMS42Mjg5NDEgMC4yODUyODEsLTAuMDU1MjEgMC45ODQ3MTMsLTAuMjE2MjYyIDIuMDk4Mjk2LC0wLjQ4MzE2IDAuNzE3ODIzLC0wLjE3NDg0OCAxLjk2OTQzNywtMC44NjUwNzcgMy43NTQ4NDcsLTIuMDcwNjg4IDIuMjM2MzIyLC0xLjUxODQ5MSAzLjM1NDQ5MiwtMi43NzkzMDggMy4zNTQ1MTQsLTMuNzgyNDU2IC0yLjJlLTUsLTAuODkyNjggLTAuMzkxMTUxLC0xLjcwNzE0OTMgLTEuMTczMzksLTIuNDQzNDExMyBDIDI1LjUzMjk0NCw4LjQ2NDM4MjIgMjQuNTc1ODI3LDguMDA0MjI5OCAyMy40NDM4Nyw3LjgyOTM1MjMgMjIuOTE5Mjc4LDcuNjE3NzAxOSAyMi42MDE3NzMsNy41MTE4NjY4IDIyLjQ5MTM1NCw3LjUxMTg0NjggYyAtMC4xODQwNzgsMmUtNSAtMC41MjQ1OTEsLTAuMDA0NTggLTEuMDIxNTQsLTAuMDEzODA0IC0wLjYwNzQxNywtMC4wMDkxOCAtMS4wOTk3OCwtMC4wMTM3ODUgLTEuNDc3MDksLTAuMDEzODA1IGwgLTEuNjg0MTU5LC0wLjAxMzgwNSBjIC0wLjEyODg1NiwyZS01IC0wLjE5MzI3NywwLjAxMzgyNSAtMC4xOTMyNjQsMC4wNDE0MTQgLTEuM2UtNSwwLjA5MjA1MSAtMC4wMTM4MiwwLjE1MTg3MDMgLTAuMDQxNDEsMC4xNzk0NTk2IC0wLjI1NzY5OCwtMC4wMDkxOCAtMC40OTIzNzYsLTAuMDEzNzg1IC0wLjcwNDAzNCwtMC4wMTM4MDQgLTAuNjM1MDIyLDEuOThlLTUgLTEuMDUzNzYxLDAuMDI3NjI5IC0xLjI1NjIxNywwLjA4MjgyNyAtMC40NTA5NiwwLjEzODA2NTQgLTEuMTk2NDA3LDAuNDIzMzU5OCAtMi4yMzYzNDMsMC44NTU4ODQyIC0wLjUyNDU4MiwwLjEzODA2NDUgLTEuMTc3OTk4LDAuMzIyMTI1NSAtMS45NjAyNTEsMC41NTIxODMzIC0wLjY4MTAzMSwwLjMwMzcxODkgLTEuMDY3NTU5LDAuNjAyODE3OSAtMS4xNTk1ODUsMC44OTcyOTgxIC0wLjU0Mjk4NSwxLjc2NzAwMiAtMC45MTExMDY1LDMuODYwNjk1IC0xLjEwNDM2NjMsNi4yODEwODUgMC4wMzY4MDgsMC40OTY5NzYgMC4wNTUyMTQsMS4yNTYyMjcgMC4wNTUyMTgsMi4yNzc3NTcgLTQuMmUtNiwwLjE2NTY2NCAtNC4yZS02LDAuMzQwNTIxIDAsMC41MjQ1NzQgLTAuMDY0NDI2LDAuMTQ3MjU3IC0wLjE2MTA1NzUsMC4zODE5MzUgLTAuMjg5ODk2MiwwLjcwNDAzNCAtMC4xOTMyNjc5LDAuODc0Mjk3IC0wLjI4OTg5OTksMS42NDI3NTEgLTAuMjg5ODk2MywyLjMwNTM2NSAtMy42ZS02LDAuMTc0ODYzIDAuMDA0NiwwLjM0MDUxOCAwLjAxMzgwNSwwLjQ5Njk2NSBsIDAuMDgyODI4LDAuODY5Njg5IGMgMC4wMjc2MDUsMC4zNDk3MiAwLjA0MTQxLDAuODU1ODg3IDAuMDQxNDE0LDEuNTE4NTA0IC0zLjhlLTYsMS40MzU2NzggLTAuMjcxNDkzNywyLjE1MzUxNiAtMC44MTQ0NzA1LDIuMTUzNTE1IC0yLjllLTYsMWUtNiAtMC4xOTc4Njg0LC0wLjA2OTAyIC0wLjU5MzU5NzEsLTAuMjA3MDY4IEMgNy40NzE5NjQ1LDI2Ljg0Mjg2NiA3LjI0NjQ4OTgsMjYuNzY5MjQyIDcuMTgyMDcwMiwyNi43NjkyNDEgNi45ODg4MDQ1LDI1Ljc0NzcwNCA2Ljg5MjE3MjUsMjQuMDQ1MTQgNi44OTIxNzM5LDIxLjY2MTU0NSBjIC0xLjRlLTYsLTAuMDkyMDIgMC4wNzgyMjQsLTAuODQ2Njc0IDAuMjM0Njc4LC0yLjI2Mzk1MSAwLjIwMjQ2NTQsLTEuOTMyNjMyIDAuMzkxMTI3OCwtMy40NzQxNDMgMC41NjU5ODc5LC00LjYyNDUzNiAwLjE5MzI2MTgsLTAuNjI1Nzk1IDAuMzkxMTI3MywtMS4zNzEyNDEgMC41OTM1OTcxLC0yLjIzNjM0MyBsIDAsLTAuNjYyNjIgYyAtMC4xMzgwNDg1LC0wLjEzODAzIC0wLjIyNTQ3NzQsLTAuMjExNjU0IC0wLjI2MjI4NzEsLTAuMjIwODczIC0yLjVlLTYsMS42ZS01IC0wLjE0MjY0OTcsMC4wNjkwNCAtMC40Mjc5NDIxLDAuMjA3MDY5IEMgNy4zMjAxMTQyLDExLjk4OTE0OSA3LjE0OTg1NzksMTIuMDUzNTcgNy4wODU0MzgxLDEyLjA1MzU1NSA2LjkxMDU3ODYsMTIuMDUzNTcgNi43NDk1MjUzLDExLjg4NzkxNiA2LjYwMjI3NzcsMTEuNTU2NTkgNi41MDEwNDMxLDExLjM0NDkzNiA2LjQ1MDQyNjMsMTEuMTY1NDc2IDYuNDUwNDI3MywxMS4wMTgyMTEgNi40NTA0MjYzLDEwLjAzMzUwMiA2LjcyMTkxNjIsOS4yMzI4MzY1IDcuMjY0ODk3Nyw4LjYxNjIxMzYgNy42NDIyMjA5LDguMTkyODkyMyA4LjQ3NTA5NjYsNy41Mzk0NzYgOS43NjM1Mjc0LDYuNjU1OTYyNyA5LjkwMTU2ODgsNi41NjM5NTMgMTEuMDk3OTY1LDYuMjk3MDY0NyAxMy4zNTI3MTksNS44NTUyOTY4IGMgMi4zMDk5NTcsLTAuNDMyNTIxNiAzLjg4MzY3OCwtMC42NDg3OTMyIDQuNzIxMTY4LC0wLjY0ODgxNTQgMS44NDA1OTcsMi4yMmUtNSAzLjU5ODM3OCwwLjA4Mjg1IDUuMjczMzUxLDAuMjQ4NDgyNSAwLjExOTYyMiwwLjEwMTI1NTUgMC4zMjIwODksMC4xOTMyODYgMC42MDc0MDIsMC4yNzYwOTE2IDAuODc0MjcxLDAuMDA5MjIgMS45MDUwMTIsMC40OTIzODQ4IDMuMDkyMjI2LDEuNDQ5NDgxMyAxLjE4NzE3MiwwLjk1NzEzNzIgMS44Nzc0LDEuODU0NDM0MiAyLjA3MDY4OCwyLjY5MTg5MzkgLTIuNGUtNSwwLjAxODQyNCAwLjA2NDQsMC4xNjEwNzEzIDAuMTkzMjY0LDAuNDI3OTQyMyAwLjEyODgxOSwwLjI2NjkwNSAwLjE5MzI0LDAuNDE0MTU0IDAuMTkzMjY0LDAuNDQxNzQ2IC0yLjRlLTUsMC4wMzY4MyAwLjAzMjE5LDAuMjQzODk4IDAuMDk2NjMsMC42MjEyMDcgMC4wNTUxOSwwLjM5NTc0NyAwLjA4MjgsMC42MTIwMTggMC4wODI4MywwLjY0ODgxNSIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MjguMjcxNzg3NjRweDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiNmZmZmZmY7Zm9udC1mYW1pbHk6RGFuaWVsOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246RGFuaWVsIEJvbGQiCiAgICAgICBpZD0icGF0aDI5OTYiIC8+CiAgPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"remarkable,markdown,editor\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"remarkable.desktop\"\nLABEL oc.launch=\"remarkable.Remarkable\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"remarkable\"\nLABEL oc.displayname=\"Remarkable\"\nLABEL oc.path=\"/usr/bin/remarkable\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/x-markdown;text/markdown;\"\nLABEL oc.fileextensions=\"md;markdown\"\nLABEL oc.legacyfileextensions=\"md;markdown\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remarkable\"\nENV APPBIN \"/usr/bin/remarkable\"\nENV APP \"/usr/bin/remarkable\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/remarkable/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remarkable/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application remarkable

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remarkable.d\n
"},{"location":"applications/remarkable/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f remarkable.d -t remarkable .\n
"},{"location":"applications/remarkable/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect remarkable > remarkable.json\ndocker image save remarkable -o remarkable.tar\nctr -n k8s.io images import remarkable.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remarkable.json\n\n
"},{"location":"applications/remmina/","title":"remmina","text":""},{"location":"applications/remmina/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/remmina/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/remmina/#ubuntu-packages","title":"Ubuntu packages","text":"
remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice\n
"},{"location":"applications/remmina/#displayname","title":"Displayname","text":"
Remmina\n
"},{"location":"applications/remmina/#path","title":"Path","text":"
/usr/bin/remmina\n
"},{"location":"applications/remmina/#mimetype","title":"Mimetype","text":"
application/x-remmina;\n
"},{"location":"applications/remmina/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/remmina/#wm_class","title":"WM_CLASS","text":"
remmina.Remmina\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/remmina/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/remmina-file.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/remmina/#json-dump","title":"JSON dump","text":"

json source file remmina.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice\",\n    \"icon\": \"remmina.svg\",\n    \"keyword\": \"rdp,tsclient\",\n    \"launch\": \"remmina.Remmina\",\n    \"name\": \"remmina\",\n    \"displayname\": \"Remmina\",\n    \"args\": \"\",\n    \"path\": \"/usr/bin/remmina\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"application/x-remmina;\",\n    \"desktopfile\": \"/usr/share/applications/remmina-file.desktop\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"usedefaultapplication\": true\n}\n
"},{"location":"applications/remmina/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output remmina.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remmina.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remmina.d.3.0.json\n\n
"},{"location":"applications/remmina/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends remmina libsecret-1-0 remmina-plugin-rdp remmina-plugin-secret remmina-plugin-vnc remmina-plugin-exec remmina-plugin-nx remmina-plugin-spice && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"remmina.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmVyc2lvbj0iMS4xIj4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTMwOC4zKSI+CiAgPGNpcmNsZSBzdHlsZT0iZmlsbDojZmZmZmZmIiBjeD0iMTIiIGN5PSIzMjAuMyIgcj0iOSIvPgogIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMSIgZD0ibSA4LDMxNS4xMzM5NyB2IDIuNDI1NzggTCA5Ljg2MTMyODEsMzE4Ljc5OTk4IDgsMzIwLjA0MDIyIHYgMi40MjU3OCBsIDUuNSwtMy42NjYwMiB6Ii8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzIwYWE3MyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwzMDguMykiIGQ9Ik0gOCA2LjMzMzk4NDQgTCA4IDguNzU5NzY1NiBMIDkuODYxMzI4MSAxMCBMIDggMTEuMjQwMjM0IEwgOCAxMy42NjYwMTYgTCAxMy41IDEwIEwgOCA2LjMzMzk4NDQgeiIvPgogIDxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuMSIgZD0ibSAxNiwzMTkuMTMzOTcgLTUuNSwzLjY2NjAxIDUuNSwzLjY2NjAyIHYgLTIuNDI1NzggTCAxNC4xNDA2MjUsMzIyLjc5OTk4IDE2LDMyMS41NTk3NSBaIi8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IzM5ODlkYSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwzMDguMykiIGQ9Ik0gMTYgMTAuMzMzOTg0IEwgMTAuNSAxNCBMIDE2IDE3LjY2NjAxNiBMIDE2IDE1LjI0MDIzNCBMIDE0LjE0MDYyNSAxNCBMIDE2IDEyLjc1OTc2NiBMIDE2IDEwLjMzMzk4NCB6Ii8+CiAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4yIiBkPSJtIDIwLjc0OTAyNCwzMTUuOTcyODUgLTEuNjgxNjQxLDEuMTE5MTQgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDIwLDMyMC43OTk5OSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDEyLDMyOC44IDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS44NDQ3MjY1LDMyNS44ODg4NiBMIDQuMTY4OTQ1MiwzMjcuMDA0MSBDIDYuMDAyMTQ2NSwzMjkuMzEzNjMgOC44MjkxMTc0LDMzMC44IDEyLDMzMC44IGMgNS41MTM5NTYsMCAxMCwtNC40ODU3OCAxMCwtMTAuMDAwMDEgMCwtMS43NTA3MSAtMC40NTcwMDEsLTMuMzk0NDUgLTEuMjUwOTc2LC00LjgyNzE0IHoiLz4KICA8cGF0aCBzdHlsZT0iZmlsbDojMjBhYTczIiBkPSJtIDIwLjc0OTAyNCwzMTUuNDcyODUgLTEuNjgxNjQxLDEuMTE5MTQgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDIwLDMyMC4yOTk5OSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDEyLDMyOC4zIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS44NDQ3MjY1LDMyNS4zODg4NiBMIDQuMTY4OTQ1MiwzMjYuNTA0MSBDIDYuMDAyMTQ2NSwzMjguODEzNjMgOC44MjkxMTc0LDMzMC4zIDEyLDMzMC4zIGMgNS41MTM5NTYsMCAxMCwtNC40ODU3OCAxMCwtMTAuMDAwMDEgMCwtMS43NTA3MSAtMC40NTcwMDEsLTMuMzk0NDUgLTEuMjUwOTc2LC00LjgyNzE0IHoiLz4KICA8cGF0aCBzdHlsZT0ib3BhY2l0eTowLjIiIGQ9Im0gMTIsMzEwLjc5OTk5IGMgLTUuNTE0MjE2OSwwIC0xMCw0LjQ4NTc5IC0xMCwxMCAwLDEuNjI3MzYgMC4zOTIwMjYzLDMuMTY0MTEgMS4wODQ5NjA5LDQuNTIzNDUgTCA0Ljc3NDQxNCwzMjQuMTk5NDEgQSA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDQsMzIwLjc5OTk5IGEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMSA4LC04IDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgNS45Mjc3MzQsMi42NDc0NyBsIDEuNjg1NTQ3LC0xLjEyMTEgQyAxNy43Nzc4MiwzMTIuMTcwNzIgMTUuMDQ2MDQ5LDMxMC43OTk5OSAxMiwzMTAuNzk5OTkgWiIvPgogIDxwYXRoIHN0eWxlPSJmaWxsOiMzOTg5ZGEiIGQ9Im0gMTIsMzEwLjMgYyAtNS41MTQyMTY5LDAgLTEwLDQuNDg1NzggLTEwLDkuOTk5OTkgMCwxLjYyNzM2IDAuMzkyMDI2MywzLjE2NDExIDEuMDg0OTYwOSw0LjUyMzQ1IEwgNC43NzQ0MTQsMzIzLjY5OTQxIEEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMSA0LDMyMC4yOTk5OSBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgOCwtOCA3Ljk5OTk5OTgsNy45OTk5OTk4IDAgMCAxIDUuOTI3NzM0LDIuNjQ3NDcgbCAxLjY4NTU0NywtMS4xMjExIEMgMTcuNzc3ODIsMzExLjY3MDcyIDE1LjA0NjA0OSwzMTAuMyAxMiwzMTAuMyBaIi8+CiAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MC4yO2ZpbGw6I2ZmZmZmZiIgZD0ibSAxMiwzMTAuMyBjIC01LjUxNDIxNjksMCAtMTAsNC40ODU3OCAtMTAsOS45OTk5OSAwLDAuMDc1MSAwLjAwNTE3LDAuMTQ4OSAwLjAwNjg0LDAuMjIzNjQgMC4xNDczNDM4LC01LjM4NjU1IDQuNTcxNjU5MSwtOS43MjM2NCA5Ljk5MzE2NCwtOS43MjM2NCAyLjg5NTE0MiwwIDUuNTA0NDUsMS4yNDAzMSA3LjMzMjAzMSwzLjIxMzg3IGwgMC4yODEyNSwtMC4xODc1IEMgMTcuNzc3ODIsMzExLjY3MDcyIDE1LjA0NjA0OSwzMTAuMyAxMiwzMTAuMyBaIE0gNC4wMDg3ODksMzIwLjYyNTE5IEEgNy45OTk5OTk4LDcuOTk5OTk5OCAwIDAgMCA0LDMyMC43OTk5OSBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDAgMC42MTEzMjgxLDMuMDA3ODIgbCAwLjE2MzA4NTksLTAuMTA4NCBhIDcuOTk5OTk5OCw3Ljk5OTk5OTggMCAwIDEgLTAuNzY1NjI1LC0zLjA3NDIyIHoiLz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"remmina,rdp,tsclient\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"remmina-file.desktop\"\nLABEL oc.launch=\"remmina.Remmina\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"remmina\"\nLABEL oc.displayname=\"Remmina\"\nLABEL oc.path=\"/usr/bin/remmina\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-remmina;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remmina\"\nENV APPBIN \"/usr/bin/remmina\"\nENV APP \"/usr/bin/remmina\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/remmina/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remmina/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application remmina

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remmina.d\n
"},{"location":"applications/remmina/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f remmina.d -t remmina .\n
"},{"location":"applications/remmina/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect remmina > remmina.json\ndocker image save remmina -o remmina.tar\nctr -n k8s.io images import remmina.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remmina.json\n\n
"},{"location":"applications/remotedesktopmanager/","title":"remotedesktopmanager","text":""},{"location":"applications/remotedesktopmanager/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/remotedesktopmanager/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/remotedesktopmanager/#ubuntu-packages","title":"Ubuntu packages","text":"
gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common\n
"},{"location":"applications/remotedesktopmanager/#licence","title":"Licence","text":"

** This application is NO FREE. ** You need to build it manually.

"},{"location":"applications/remotedesktopmanager/#displayname","title":"Displayname","text":"
RemoteDesktop\n
"},{"location":"applications/remotedesktopmanager/#path","title":"Path","text":"
/bin/remotedesktopmanager.free\n
"},{"location":"applications/remotedesktopmanager/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/remotedesktopmanager/#wm_class","title":"WM_CLASS","text":"
RemoteDesktopManager.Free.RemoteDesktopManager.Free\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/remotedesktopmanager/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/remotedesktopmanager.free.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/remotedesktopmanager/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\nRUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\nCOPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\n
"},{"location":"applications/remotedesktopmanager/#json-dump","title":"JSON dump","text":"

json source file remotedesktopmanager.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"licence\": \"non-free\",\n    \"debpackage\": \"gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common\",\n    \"icon\": \"circle-remotedesktopmanager.svg\",\n    \"keyword\": \"remote,desktop,ssh\",\n    \"launch\": \"RemoteDesktopManager.Free.RemoteDesktopManager.Free\",\n    \"name\": \"remotedesktopmanager\",\n    \"displayname\": \"RemoteDesktop\",\n    \"path\": \"/bin/remotedesktopmanager.free\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"\",\n    \"desktopfile\": \"/usr/share/applications/remotedesktopmanager.free.desktop\",\n    \"preruncommands\": [\n        \"RUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\",\n        \"RUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\",\n        \"COPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\"\n    ]\n}\n
"},{"location":"applications/remotedesktopmanager/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output remotedesktopmanager.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remotedesktopmanager.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remotedesktopmanager.d.3.0.json\n\n
"},{"location":"applications/remotedesktopmanager/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl -Ls -o /tmp/RemoteDesktopManager.Free_amd64.deb https://cdn.devolutions.net/download/Linux/RDM/2022.1.2.5/RemoteDesktopManager.Free_2022.1.2.5_amd64.deb\nRUN apt-get update && apt-get install --yes /tmp/RemoteDesktopManager.Free_amd64.deb && apt-get clean\nCOPY composer/init.d/init.RemoteDesktopManager.Free /composer/init.d/init.RemoteDesktopManager.Free\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gir1.2-gdkpixbuf-2.0 gtk2-engines-pixbuf libgdk-pixbuf2.0-0 adwaita-icon-theme libgdk-pixbuf2.0-bin librsvg2-2 librsvg2-common && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle-remotedesktopmanager.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJjLTMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjQxOTk5ODc0Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiLTYiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlLTMiIHgxPSI1MTkuMiIgeDI9IjUxOS4yIiB5MT0iMTAyNC44IiB5Mj0iNC44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wNjM1ODYgMCAwIC4wNjM1ODMgLS41NTYxNyAtLjU1MjcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2MDYwNjAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDE0MTQxIiBvZmZzZXQ9Ii4wMTk1NTEiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFlMWUxZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnLTUiIHg9Ii0uMDMxNjUyIiB5PSItLjA0MTk0NyIgd2lkdGg9IjEuMDYzMyIgaGVpZ2h0PSIxLjA4MzkiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNjEwNjU4NDIiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYtNiIgeDE9IjQwOS41NyIgeDI9IjQwOS45NCIgeTE9IjU0Mi44IiB5Mj0iNTA0LjE5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDUyMywwLDAsMS4wMjc2LC03Mi41NjgsLTguNjkzMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg2ZDBmYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNzk0ZjUiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjLTMpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iLjczMzMzIi8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMzAuMDAxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+CiA8Y2lyY2xlIGN4PSIzMi4wMiIgY3k9IjMyLjA0NCIgcj0iMCIgZmlsbD0idXJsKCNiLTYpIiBzdHJva2Utd2lkdGg9IjEuNTcxNSIvPgogPHBhdGggZD0ibTUwLjI0OSA4LjE5MzJxLTMuODU5Ny0yLjk3MjUtOC40NDQtNC41NTU3LTQuNzM3Mi0xLjYzNzMtOS44MDIxLTEuNjM3M2MtMTYuNTcgMC0zMC4wMDMgMTMuNDMyLTMwLjAwMyAzMC4wMDEgMCAxNS4xNTggMTEuMjQ1IDI3LjY4NCAyNS44NDUgMjkuNzA5IDAuNzEyMTYgMC4wOTg1NSAxLjQzMzkgMC4xNzQ4NSAyLjE1ODcgMC4yMTkzNiAwLjY2MTI4IDAuMDQxMzMgMS4zMjU4IDAuMDY5OTQgMS45OTk4IDAuMDY5OTQgMTYuNTY3IDAgMjkuOTk3LTEzLjQzMiAyOS45OTctMjkuOTk5IDAtMS4zMDk4LTAuMDgyNjYtMi42MDM3LTAuMjQ0ODEtMy44NjU4LTAuMTg3NTgtMS40NzUxLTAuNDkyNzktMi45MDktMC44ODM4Ny00LjMwNDZxLTEuMzI4OS00LjY4OTItNC4wODIyLTguNzI2NS0yLjcyMTUtMy45NzcxLTYuNTQwMS02LjkxMTJ6IiBmaWxsPSJ1cmwoI2UtMykiIHN0cm9rZS13aWR0aD0iLjk5NzI0Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguNDY1ODYgLS4wNTU1NjYgLjA1NzI1OCAuNDUyMDkgLTIwOS40MSAtMTUzLjYzKSI+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWx0ZXI9InVybCgjZy01KSIgb3BhY2l0eT0iLjc1Ii8+CiAgPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS43MzUgLjIxMzI1IC0uMjEzMjUgMS43MzUgLTQ2LjExNyAtNTI5Ljc2KSIgeD0iMzM0LjIzIiB5PSI1MTMuMTMiIHdpZHRoPSI0Ni4zMDMiIGhlaWdodD0iMzQuOTM5IiByeT0iMS42NDQyIiBmaWxsPSJ1cmwoI2YtNikiLz4KICA8ZyBmaWxsPSIjZDVmZmZmIj4KICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJyb3RhdGUoNy4wMDcpIiBjeD0iNDk4LjM1IiBjeT0iMzg0LjQ5IiByeD0iMy4xOTU4IiByeT0iMy4yOTMyIi8+CiAgIDxlbGxpcHNlIHRyYW5zZm9ybT0icm90YXRlKDcuMDA3KSIgY3g9IjQ4OS44MyIgY3k9IjM4NC40OSIgcng9IjMuMTk1OCIgcnk9IjMuMjkzMiIvPgogICA8ZWxsaXBzZSB0cmFuc2Zvcm09InJvdGF0ZSg3LjAwNykiIGN4PSI0ODEuMzEiIGN5PSIzODQuNDkiIHJ4PSIzLjE5NTgiIHJ5PSIzLjI5MzIiLz4KICA8L2c+CiA8L2c+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNiwxNikiIGZpbGw9IiNmZmYiPgogIDxwYXRoIGQ9Im0xNiAxMmE5IDkgMCAwIDAtNy44NzcgNC42NjhjMC4xMjkgMC4zNjQgMC4zNTcgMC42NzcgMC42NTYgMC45MDhhOCA4IDAgMCAxIDcuMjIxLTQuNTc2IDQgNCAwIDAgMC00IDQgNCA0IDAgMCAwIDQgNCA0IDQgMCAwIDAgNC00IDQgNCAwIDAgMC0zLjY1LTMuOTgyIDggOCAwIDAgMSA2Ljg3IDQuNTU4YzAuMzAyLTAuMjM0IDAuNTMzLTAuNTUgMC42Ni0wLjkxOGE5IDkgMCAwIDAtNy44OC00LjY1OHptMCAyYTMgMyAwIDAgMSAzIDMgMyAzIDAgMCAxLTMgMyAzIDMgMCAwIDEtMy0zIDMgMyAwIDAgMSAzLTN6bTAgMWEyIDIgMCAwIDAtMiAyIDIgMiAwIDAgMCAyIDIgMiAyIDAgMCAwIDItMiAyIDIgMCAwIDAtMC4wOS0wLjU4OCAxIDEgMCAwIDEtMC45MSAwLjU4OCAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMSAwLjU5LTAuOTEgMiAyIDAgMCAwLTAuNTktMC4wOXoiLz4KICA8cGF0aCBkPSJtOCAxMXYxMWg3djJoLTN2MWg4di0xaC0zdi0yaDd2LTExaC0xNXptMSAxaDE0djloLTE0eiIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"remotedesktopmanager,remote,desktop,ssh\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"remotedesktopmanager.free.desktop\"\nLABEL oc.launch=\"RemoteDesktopManager.Free.RemoteDesktopManager.Free\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"remotedesktopmanager\"\nLABEL oc.displayname=\"RemoteDesktop\"\nLABEL oc.path=\"/bin/remotedesktopmanager.free\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"remotedesktopmanager\"\nENV APPBIN \"/bin/remotedesktopmanager.free\"\nENV APP \"/bin/remotedesktopmanager.free\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/remotedesktopmanager/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/remotedesktopmanager/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application remotedesktopmanager

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/remotedesktopmanager.d\n
"},{"location":"applications/remotedesktopmanager/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f remotedesktopmanager.d -t remotedesktopmanager .\n
"},{"location":"applications/remotedesktopmanager/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect remotedesktopmanager > remotedesktopmanager.json\ndocker image save remotedesktopmanager -o remotedesktopmanager.tar\nctr -n k8s.io images import remotedesktopmanager.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @remotedesktopmanager.json\n\n
"},{"location":"applications/rhythmbox/","title":"rhythmbox","text":""},{"location":"applications/rhythmbox/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/rhythmbox/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/rhythmbox/#alpine-packages","title":"Alpine packages","text":"
rhythmbox\n
"},{"location":"applications/rhythmbox/#path","title":"Path","text":"
/usr/bin/rhythmbox\n
"},{"location":"applications/rhythmbox/#mimetype","title":"Mimetype","text":"
application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\n
"},{"location":"applications/rhythmbox/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/rhythmbox/#wm_class","title":"WM_CLASS","text":"
rhythmbox.Rhythmbox\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/rhythmbox/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Rhythmbox3.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/rhythmbox/#json-dump","title":"JSON dump","text":"

json source file rhythmbox.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"rhythmbox\",\n    \"icon\": \"circle_rhythmbox.svg\",\n    \"keyword\": \"rhythmbox,audio;song;mp3;cd;podcast;MTP;playlist;last.fm;dlna;radio;\",\n    \"launch\": \"rhythmbox.Rhythmbox\",\n    \"name\": \"rhythmbox\",\n    \"path\": \"/usr/bin/rhythmbox\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"mimetype\": \"application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Rhythmbox3.desktop\"\n}\n
"},{"location":"applications/rhythmbox/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output rhythmbox.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/rhythmbox.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @rhythmbox.d.3.0.json\n\n
"},{"location":"applications/rhythmbox/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update rhythmbox\nLABEL oc.icon=\"circle_rhythmbox.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iIzRjNGM0YyIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzJhMmEyYSIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSI1MjAiIHgyPSI1MjAiIHkxPSIyNCIgeTI9IjEwMDQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTM3OS42NSAtNDg1LjkzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+PGxpbmVhckdyYWRpZW50IGlkPSJnIiB4MT0iMzk4Ljk1IiB4Mj0iMzk4Ljk1IiB5MT0iMTEzLjQxIiB5Mj0iOTEzLjQxIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00MzAuMjIgLTUwNi4zMykgc2NhbGUoMS4wMjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZWRmMmQiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNDhkMDEiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iNTU4Ljk1IiB4Mj0iNTU4Ljk1IiB5MT0iMjEzLjQxIiB5Mj0iODEzLjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC45OCAwIDAgLjk4IC00MDcuNTkgLTQ4NC45MSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iYiI+PHN0b3Agb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iayIgeDE9IjUyOC45NSIgeDI9IjUyOC45NSIgeTE9IjM2MS4wNiIgeTI9IjY4OC41MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtNDY3LjU4IC01NDEuNjgpIHNjYWxlKDEuMDg4OSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxsaW5lYXJHcmFkaWVudCBpZD0ibCIgeDE9IjU1OC45NSIgeDI9IjU1OC45NSIgeTE9IjIxMy40MSIgeTI9IjgxMy40MSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYgMCAwIC4wNiAtMS4wNTcgLjcxNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYiIvPjxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjQwOC4yNSIgeDI9IjQwNy45NCIgeTE9IjU0Ny42IiB5Mj0iNDk4Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC01MTAuNjQgLTY2My41Mikgc2NhbGUoMS4zMjc2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNlNmU2ZTYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGZpbHRlciBpZD0iaiIgeD0iLS4zNiIgeT0iLS4zNiIgd2lkdGg9IjEuNzIiIGhlaWdodD0iMS43MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzMCIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDgxIiB5PSItLjA4MSIgd2lkdGg9IjEuMTYyIiBoZWlnaHQ9IjEuMTYyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMzLjEyNCIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii44OSIvPjwvZmlsdGVyPjxyYWRpYWxHcmFkaWVudCBpZD0iaCIgY3g9IjU1MC45NSIgY3k9IjUyMS40MSIgcj0iNDI1IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00MzAuMjIgLTUwNi4zMykgc2NhbGUoMS4wMjExKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZThjMDYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmZWE5MzMiIG9mZnNldD0iMSIvPjwvcmFkaWFsR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zODkuMzIgLTQ4OS45Mikgc2NhbGUoMS4wMTE1KSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjYykiIG9wYWNpdHk9Ii4yNSIvPjxyZWN0IHg9IjEuOTgzIiB5PSIxLjk3OCIgd2lkdGg9IjU5Ljk5NyIgaGVpZ2h0PSI1OS45OTciIHJ5PSIyOS45OTgiIGZpbGw9InVybCgjZCkiLz48ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDM2NzMgMCAwIC4wMzY3MyAyNy4xMzggMzguMDQyKSI+PGNpcmNsZSBjeD0iMTMyLjM1IiBjeT0iMjYuMDc0IiByPSI0OTAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+PGNpcmNsZSBjeD0iMTMyLjM1IiBjeT0iMjYuMDc0IiByPSI0OTAiIGZpbGw9InVybCgjZikiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjQwOC40MyIgZmlsbD0idXJsKCNnKSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9InVybCgjaCkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iNTQuMjQ1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNjEuNjcgLTYzMS45MSkiIGZpbGw9Im5vbmUiPjxjaXJjbGUgY3g9IjUxMiIgY3k9IjU0MC4zNiIgcj0iMTc1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPjxjaXJjbGUgY3g9IjIyNi4wMyIgY3k9IjgyNS42MSIgcj0iMTI1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPjxwYXRoIGQ9Im0zNjAgNDUyLjM2LTIzNSAzMDAgMTgwIDE3MCAzMTUtMjQ1eiIvPjwvZz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjI0NSIgZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIiBvcGFjaXR5PSIuMiIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48Y2lyY2xlIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01MDguMyAtNjQyLjg3KSBzY2FsZSgxLjE2MjgpIiBjeD0iNTUwLjk1IiBjeT0iNjExLjQxIiByPSIxMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2opIiBvcGFjaXR5PSIuNCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48Y2lyY2xlIGN4PSIxMzIuMzUiIGN5PSIyNi4wNzQiIHI9IjE2My4zMyIgZmlsbD0idXJsKCNrKSIgZmlsbC1ydWxlPSJldmVub2RkIiBvcGFjaXR5PSIuOSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzkwLjMyIC00OTYuNTkpIHNjYWxlKDE2LjMzMykiIGQ9Ik0zMS44ODcgMTdBMTUgMTUgMCAwIDAgMTcgMzJhMTUgMTUgMCAwIDAgMTQuMzUgMTQuOTg2QTE0LjM1OSAxNC41IDAgMCAxIDE3LjY0MSAzMi41IDE0LjM1OSAxNC41IDAgMCAxIDMyIDE4YTE0LjM1OSAxNC41IDAgMCAxIDE0LjM1OSAxNC41IDE0LjM1OSAxNC41IDAgMCAxLTEzLjczNiAxNC40ODZBMTUgMTUgMCAwIDAgNDcgMzJhMTUgMTUgMCAwIDAtMTUtMTUgMTUgMTUgMCAwIDAtLjExMyAwem0uNzM2IDI5Ljk4NmExNC4zNTkgMTQuNSAwIDAgMS0uMzE4LjAxIDE1IDE1IDAgMCAwIC4zMTgtLjAxem0tLjMxOC4wMUExNC4zNTkgMTQuNSAwIDAgMSAzMiA0N2ExNSAxNSAwIDAgMCAuMzA1LS4wMDR6IiBmaWxsPSJ1cmwoI2wpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIG9wYWNpdHk9Ii4wNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48L2c+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii0yMCIgcj0iMyIgb3BhY2l0eT0iLjc1Ii8+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii00NCIgcj0iMyIgb3BhY2l0eT0iLjc1Ii8+PGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIGN4PSIxNyIgY3k9Ii0yMCIgcj0iMiIgZmlsbD0iIzRkNGQ0ZCIvPjxjaXJjbGUgdHJhbnNmb3JtPSJyb3RhdGUoOTApIiBjeD0iMTciIGN5PSItNDQiIHI9IjIiIGZpbGw9IiM0ZDRkNGQiLz48L3N2Zz4=\"\nLABEL oc.keyword=\"rhythmbox,rhythmbox,audio;song;mp3;cd;podcast;MTP;playlist;last.fm;dlna;radio;\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.gnome.Rhythmbox3.desktop\"\nLABEL oc.launch=\"rhythmbox.Rhythmbox\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"rhythmbox\"\nLABEL oc.displayname=\"rhythmbox\"\nLABEL oc.path=\"/usr/bin/rhythmbox\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-ogg;application/ogg;audio/x-vorbis+ogg;audio/vorbis;audio/x-vorbis;audio/x-scpls;audio/x-mp3;audio/x-mpeg;audio/mpeg;audio/x-mpegurl;audio/x-flac;audio/mp4;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-stm;audio/x-xm;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"rhythmbox\"\nENV APPBIN \"/usr/bin/rhythmbox\"\nENV APP \"/usr/bin/rhythmbox\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/rhythmbox/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/rhythmbox/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application rhythmbox

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/rhythmbox.d\n
"},{"location":"applications/rhythmbox/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f rhythmbox.d -t rhythmbox .\n
"},{"location":"applications/rhythmbox/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect rhythmbox > rhythmbox.json\ndocker image save rhythmbox -o rhythmbox.tar\nctr -n k8s.io images import rhythmbox.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @rhythmbox.json\n\n
"},{"location":"applications/robots/","title":"Robots","text":""},{"location":"applications/robots/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/robots/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/robots/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-robots\n
"},{"location":"applications/robots/#path","title":"Path","text":"
/usr/games/gnome-robots\n
"},{"location":"applications/robots/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/robots/#wm_class","title":"WM_CLASS","text":"
gnome-robots.Gnome-robots\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/robots/#desktopfile","title":"Desktopfile","text":"
gnome-robots.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/robots/#json-dump","title":"JSON dump","text":"

json source file robots.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-robots\",\n    \"icon\": \"circle_gnome-robots.svg\",\n    \"keyword\": \"gnome robots,game robots,robots\",\n    \"launch\": \"gnome-robots.Gnome-robots\",\n    \"name\": \"Robots\",\n    \"path\": \"/usr/games/gnome-robots\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"gnome-robots.desktop\"\n}\n
"},{"location":"applications/robots/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output robots.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/robots.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @robots.d.3.0.json\n\n
"},{"location":"applications/robots/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-robots && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_gnome-robots.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iSXRlcm0iIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ii01MDYuNDUiIHgyPSItNTA2LjQ1IiB5MT0iLTE5LjEwMSIgeTI9IjEwMTMuNiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDU4ODI0IDAgMCAuMDU4ODI0IDYxLjc5MSAzLjEyMzYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNjI2MjYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzIiBvZmZzZXQ9Ii41MDc2OSIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNGE0YTRhIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjkwMDAwMDA2Ii8+CiAgPC9maWx0ZXI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJlIiBjeD0iMTguNjg1IiBjeT0iMjUuNjY4IiByPSI1LjA1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2siLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImsiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTQwMDAwIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2E0MDAwMCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYyIgY3g9IjE4LjY4NSIgY3k9IjI1LjY2OCIgcj0iNS4wNSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNqIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJqIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2MwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSIxOC42ODUiIGN5PSIyNS42NjgiIHI9IjUuMDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjaSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlZjI5MjkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWYyOTI5IiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJoIiBjeD0iMTMuMTk5IiBjeT0iMTIuNDY0IiByPSIyMS4wMDkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wNjQ5IC42MTQ4MiAtLjYyMzAxIDEuMDc5MSAxNC40MDMgLTEuNTU0NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2QzZDdjZiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM4ODhhODUiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iNS42OTM0IiB4Mj0iNDAuNTAzIiB5MT0iNS40NTgzIiB5Mj0iNDAuMDgxIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNDk0OCA3LjU0NjIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNlZWVlZWMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWVlZWVjIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0ibCIgeD0iLS4xMjA5MyIgeT0iLS4xMTkwOSIgd2lkdGg9IjEuMjQxOSIgaGVpZ2h0PSIxLjIzODIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjIuMDM1OTI1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8bWFzaz4KICA8ZyBpZD0iZyI+CiAgIDxwYXRoIGQ9Im05NjkuNzUgMzkyLjA1Yy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNC0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1LTcyLjYtNzIuNi0xNTcuMTUtMTE2LjY1LTI1My42NS0xMzIuMDUtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LTAuNTUtMTkuODUtMC44NS0zMC4xLTAuODUtOS4zNSAwLTE4LjYgMC4yNS0yNy45IDAuNzUtMTE4LjM1IDYuMS0yMjAuMyA1MS45NS0zMDUuODUgMTM3LjVxLTEzOC4yNSAxMzguMjUtMTM4LjI1IDMzMy43NWMwIDEzMC4zNSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjggNTYuNyA1Ni42NSAxMjAuNTUgOTUuOSAxOTEuMSAxMTcuNTUgMzYuNzUgMTEuMjUgNzQuOCAxNy44NSAxMTQuNzUgMTkuOTVoMC40YzguNSAwLjQ1IDE2LjYgMC43IDI0LjUgMC43aDNjMTAuMyAwIDIwLjUtMC4zIDMwLjEtMC44IDIuNS0wLjE1IDQuNzUtMC4zIDYuOTUtMC40NSAyMC4yLTEuNDUgMzkuOS00LjA1IDU4LjctNy43IDcuOTUtMS41NSAxNS44LTMuMyAyMy40LTUuMTUgODAuOC0yMC4zIDE1Mi4xNS02MS42IDIxNC42NS0xMjQuMSA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTguNDUtNDcuNjUgMjguNjUtOTguOCAzMC41NS0xNTMuNSAwLjItNi4wNSAwLjMtMTIuMjUgMC4zLTE4LjV2LTNjLTAuMi00MC42NS00Ljk1LTc5LjUtMTQuMy0xMTd6IiBmaWxsPSIjZmZmIi8+CiAgPC9nPgogPC9tYXNrPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZmlsdGVyPSJ1cmwoI2QpIiBvcGFjaXR5PSIuMjUiIHN0eWxlPSJwYWludC1vcmRlcjpmaWxsIG1hcmtlcnMgc3Ryb2tlIi8+CiA8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0idXJsKCNiKSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHlsZT0icGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLjU1MTczIC40MDcwNikiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjUiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNDk0OCA3LjU0NjIpIj4KICAgPHBhdGggZD0ibTcuNTEzMyAxOC40NTRoMzIuOTk4djExLjc3OGgtMzIuOTk4YzNlLTQgLTMuOTI2IDNlLTQgLTcuODUyIDNlLTQgLTExLjc3OHoiIHN0cm9rZT0iIzJlMzQzNiIvPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjE0MjksMCwwLDEuMTQyOSwtNDYuMjAyLC0xMi4xNzUpIiBvcGFjaXR5PSIuNzUiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6Ii8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6Ii8+CiAgIDwvZz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTU2LjIwMiwtMTIuMTc1KSI+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjM4NjEsMCwwLDEuMzg2MSwzNS41MjcsLTMuOTI1NykiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5MDEgMCAwIC45OTAxIDQyLjkyNyA2LjI5ODEpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC41OTQwNiAwIDAgLjU5NDA2IDUwLjMyNyAxNi40NjQpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgPC9nPgogICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjE0MjksMCwwLDEuMTQyOSwtMzYuMjAyLC0xMi4xNzUpIiBvcGFjaXR5PSIuNSI+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjM4NjEsMCwwLDEuMzg2MSwzNS41MjcsLTMuOTI1NykiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjk5MDEgMCAwIC45OTAxIDQyLjkyNyA2LjI5ODEpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC41OTQwNiAwIDAgLjU5NDA2IDUwLjMyNyAxNi40NjQpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiLz4KICAgPC9nPgogIDwvZz4KICA8cGF0aCBkPSJtMzEuNDY0IDExLjA3N2MtMTAuMTE3IDAtMTguNTQ0IDcuMzI4OC0yMC4yMTkgMTYuOTY5aDQwLjQwNmMtMS42NzYtOS42MzktMTAuMDcxLTE2Ljk2OS0yMC4xODctMTYuOTY5em0tMjAuMTg4IDI0LjA2M2MxLjY5MDIgOS42MjIgMTAuMDgzIDE2Ljk2OCAyMC4xODggMTYuOTY4IDEwLjEwNSAwIDE4LjQ5OC03LjM0NCAyMC4xODctMTYuOTY4eiIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiMyZTM0MzYiIHN0cm9rZS13aWR0aD0iMXB4Ii8+CiAgPHBhdGggZD0ibTMxLjQ2NCAxMi4wNzdjLTkuMjI2IDAtMTYuOTUgNi40NDk4LTE4Ljk2OSAxNS4wNjNoMzcuOTM4Yy0yLjAyLTguNjEzLTkuNzQ0LTE1LjA2My0xOC45NjktMTUuMDYzem0tMTguOTY5IDIzLjk2OWMyLjAxOTIgOC42MTMgOS43NDMgMTUuMDMxIDE4Ljk2OSAxNS4wMzEgOS4yMjUgMCAxNi45NDktNi40MTggMTguOTY5LTE1LjAzMXoiIHN0cm9rZT0idXJsKCNmKSIgc3Ryb2tlLXdpZHRoPSIxcHgiLz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC41NTE3MyAuNDA3MDYpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3LjQ5NDggNy41NDYyKSI+CiAgIDxwYXRoIGQ9Im03LjUxMzMgMTguNDU0aDMyLjk5OHYxMS43NzhoLTMyLjk5OGMzZS00IC0zLjkyNiAzZS00IC03Ljg1MiAzZS00IC0xMS43Nzh6IiBmaWxsPSIjMmUzNDM2IiBzdHJva2U9IiMyZTM0MzYiLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTQ2LjIwMiwtMTIuMTc1KSIgb3BhY2l0eT0iLjc1Ij4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KDEuMzg2MSwwLDAsMS4zODYxLDM1LjUyNywtMy45MjU3KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2UpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguOTkwMSAwIDAgLjk5MDEgNDIuOTI3IDYuMjk4MSkiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIgZmlsbD0idXJsKCNjKSIvPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjU5NDA2IDAgMCAuNTk0MDYgNTAuMzI3IDE2LjQ2NCkiIGQ9Im0yMy43MzUgMjUuNjY4YzAgMi43ODktMi4yNjEgNS4wNS01LjA1IDUuMDVzLTUuMDUtMi4yNjEtNS4wNS01LjA1IDIuMjYxLTUuMDUgNS4wNS01LjA1IDUuMDUgMi4yNjEgNS4wNSA1LjA1eiIgZmlsbD0idXJsKCNhKSIvPgogICA8L2c+CiAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMTQyOSwwLDAsMS4xNDI5LC01Ni4yMDIsLTEyLjE3NSkiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiIGZpbGw9InVybCgjZSkiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDwvZz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNDI5LDAsMCwxLjE0MjksLTM2LjIwMiwtMTIuMTc1KSIgb3BhY2l0eT0iLjUiPgogICAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS4zODYxLDAsMCwxLjM4NjEsMzUuNTI3LC0zLjkyNTcpIiBkPSJtMjMuNzM1IDI1LjY2OGMwIDIuNzg5LTIuMjYxIDUuMDUtNS4wNSA1LjA1cy01LjA1LTIuMjYxLTUuMDUtNS4wNSAyLjI2MS01LjA1IDUuMDUtNS4wNSA1LjA1IDIuMjYxIDUuMDUgNS4wNXoiIGZpbGw9InVybCgjZSkiLz4KICAgIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC45OTAxIDAgMCAuOTkwMSA0Mi45MjcgNi4yOTgxKSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguNTk0MDYgMCAwIC41OTQwNiA1MC4zMjcgMTYuNDY0KSIgZD0ibTIzLjczNSAyNS42NjhjMCAyLjc4OS0yLjI2MSA1LjA1LTUuMDUgNS4wNXMtNS4wNS0yLjI2MS01LjA1LTUuMDUgMi4yNjEtNS4wNSA1LjA1LTUuMDUgNS4wNSAyLjI2MSA1LjA1IDUuMDV6IiBmaWxsPSJ1cmwoI2EpIi8+CiAgIDwvZz4KICA8L2c+CiAgPHBhdGggZD0ibTMxLjQ2NCAxMS4wNzdjLTEwLjExNyAwLTE4LjU0NCA3LjMyODgtMjAuMjE5IDE2Ljk2OWg0MC40MDZjLTEuNjc2LTkuNjM5LTEwLjA3MS0xNi45NjktMjAuMTg3LTE2Ljk2OXptLTIwLjE4OCAyNC4wNjNjMS42OTAyIDkuNjIyIDEwLjA4MyAxNi45NjggMjAuMTg4IDE2Ljk2OCAxMC4xMDUgMCAxOC40OTgtNy4zNDQgMjAuMTg3LTE2Ljk2OHoiIGZpbGw9InVybCgjaCkiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjMmUzNDM2IiBzdHJva2Utd2lkdGg9IjFweCIvPgogIDxwYXRoIGQ9Im0zMS40NjQgMTIuMDc3Yy05LjIyNiAwLTE2Ljk1IDYuNDQ5OC0xOC45NjkgMTUuMDYzaDM3LjkzOGMtMi4wMi04LjYxMy05Ljc0NC0xNS4wNjMtMTguOTY5LTE1LjA2M3ptLTE4Ljk2OSAyMy45NjljMi4wMTkyIDguNjEzIDkuNzQzIDE1LjAzMSAxOC45NjkgMTUuMDMxIDkuMjI1IDAgMTYuOTQ5LTYuNDE4IDE4Ljk2OS0xNS4wMzF6IiBmaWxsPSJub25lIiBzdHJva2U9InVybCgjZikiIHN0cm9rZS13aWR0aD0iMXB4Ii8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"robots,gnome robots,game robots,robots\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"gnome-robots.desktop\"\nLABEL oc.launch=\"gnome-robots.Gnome-robots\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"Robots\"\nLABEL oc.displayname=\"Robots\"\nLABEL oc.path=\"/usr/games/gnome-robots\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Robots\"\nENV APPBIN \"/usr/games/gnome-robots\"\nENV APP \"/usr/games/gnome-robots\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/robots/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/robots/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Robots

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Robots.d\n
"},{"location":"applications/robots/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Robots.d -t Robots .\n
"},{"location":"applications/robots/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Robots > Robots.json\ndocker image save Robots -o Robots.tar\nctr -n k8s.io images import Robots.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Robots.json\n\n
"},{"location":"applications/shotcut/","title":"Shotcut","text":""},{"location":"applications/shotcut/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/shotcut/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/shotcut/#alpine-packages","title":"Alpine packages","text":"
shotcut mesa-dri-gallium\n
"},{"location":"applications/shotcut/#path","title":"Path","text":"
/usr/bin/shotcut\n
"},{"location":"applications/shotcut/#mimetype","title":"Mimetype","text":"
image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\n
"},{"location":"applications/shotcut/#file-extensions","title":"File extensions","text":"

\"mlt\"

"},{"location":"applications/shotcut/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"mlt\"

"},{"location":"applications/shotcut/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/shotcut/#wm_class","title":"WM_CLASS","text":"
shotcut.Shotcut\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/shotcut/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.shotcut.Shotcut.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/shotcut/#json-dump","title":"JSON dump","text":"

json source file shotcut.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"graphics\",\n    \"apkpackage\": \"shotcut mesa-dri-gallium\",\n    \"icon\": \"circle_shotcut.svg\",\n    \"keyword\": \"video,audio,editing,suite,mlt,4k,video4linux,blackmagic,decklink\",\n    \"launch\": \"shotcut.Shotcut\",\n    \"name\": \"Shotcut\",\n    \"path\": \"/usr/bin/shotcut\",\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"mimetype\": \"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\",\n    \"fileextensions\": \"mlt\",\n    \"legacyfileextensions\": \"mlt\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/org.shotcut.Shotcut.desktop\",\n    \"usedefaultapplication\": false\n}\n
"},{"location":"applications/shotcut/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output shotcut.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/shotcut.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @shotcut.d.3.0.json\n\n
"},{"location":"applications/shotcut/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nRUN apk add --no-cache --update shotcut mesa-dri-gallium\nLABEL oc.icon=\"circle_shotcut.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDE2LjkzMyAxNi45MzMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiA8ZGVmcz4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImIiIGN4PSItMTM2Ljk5IiBjeT0iMTk4LjY1IiByPSIzOC41IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4wOTgxOTYgMCAwIC4wODI0NzEgMjEuOTE4IC03LjkyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMjU2MWRiIiBzdG9wLW9wYWNpdHk9Ii45NDExOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwZDBkMGQiIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iayIgeD0iLS4yMzI1OCIgeT0iLS4yNDc5MSIgd2lkdGg9IjEuNDY1MiIgaGVpZ2h0PSIxLjQ5NTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMDYwNzE4NiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImoiIHg9Ii0uMDExNjI5IiB5PSItLjAxMjM5NiIgd2lkdGg9IjEuMDIzMyIgaGVpZ2h0PSIxLjAyNDgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMDMwNDU1NDkxIi8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iYSIgeD0iLS4wNjI0NDQiIHk9Ii0uMDY2NTYiIHdpZHRoPSIxLjEyNDkiIGhlaWdodD0iMS4xMzMxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjA4NTUyNzgzNiIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImkiIHg9Ii0uMDU1MjM5IiB5PSItLjA2NTY2IiB3aWR0aD0iMS4xMTA1IiBoZWlnaHQ9IjEuMTMxMyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NjI0MjQ3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4yMzI1OCIgeT0iLS4yNDc5MSIgd2lkdGg9IjEuNDY1MiIgaGVpZ2h0PSIxLjQ5NTgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNTEyMDkyMzUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjA1ODE0NSIgeT0iLS4wNjE5NzgiIHdpZHRoPSIxLjExNjMiIGhlaWdodD0iMS4xMjQiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMTI4MDIzMDkiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmIiB4PSItLjE5NjI4IiB5PSItLjMwODc3IiB3aWR0aD0iMS4zOTI2IiBoZWlnaHQ9IjEuNjE3NSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMi45ODc4MDM3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibiIgeD0iLS4xMDk3OCIgeT0iLS4xMjk5OSIgd2lkdGg9IjEuMjE5NiIgaGVpZ2h0PSIxLjI2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjE1MjI3ODI5Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0ibSIgeD0iLS4xODk4NyIgeT0iLS4yNDMyMyIgd2lkdGg9IjEuMzc5NyIgaGVpZ2h0PSIxLjQ4NjUiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMTUyMjc4MjkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI4LjQ2NjciIHgyPSI4LjQ2NjciIHkxPSIyODAuNiIgeTI9IjI5Ni40NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAxMiAwIDAgMS4wMTIgLS4xMDIgLTI4My41NSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM5ZjlmOWYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iMjgyLjE4IiB5Mj0iMjk0Ljg4IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2NjYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iMjgzLjI0IiB5Mj0iMjkzLjgyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxMjEyMTIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsIiB4MT0iOC40NjY3IiB4Mj0iOC40NjY3IiB5MT0iLTIuOTIwMyIgeTI9IjE5Ljg0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjY2MiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJlYmViIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9Im8iIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjM0MTQxMDE2Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguNjk3NDYgMCAwIC42OTc0NiAyLjU2MTMgMi41NjYpIiBzdHJva2Utd2lkdGg9IjEuNDMzOCI+CiAgPGNpcmNsZSBjeD0iOC40NjY3IiBjeT0iOC40NiIgcj0iMTEuMzgiIGZpbHRlcj0idXJsKCNvKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iOC40NjY3IiBjeT0iOC40NiIgcj0iMTEuMzgiIGZpbGw9InVybCgjbCkiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI3Ljk2NjMiIGZpbGw9InVybCgjZSkiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI2LjM1IiBmaWxsPSJ1cmwoI2QpIiBzdHJva2Utd2lkdGg9IjEuNDMzOCIvPgogIDxjaXJjbGUgY3g9IjguNDY2NyIgY3k9IjguNDYiIHI9IjUuMjkxNyIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIxLjQzMzgiLz4KICA8Y2lyY2xlIGN4PSI4LjQ2NjciIGN5PSI4LjQ2IiByPSI0LjExNiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlPSIjMGQyMjRkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjMzNjMzIi8+CiAgPGcgc3Ryb2tlLXdpZHRoPSIxLjQzMzgiPgogICA8cGF0aCBkPSJtNC45NDQ4IDYuNDcgMS40NjQ2IDAuODEwNDNzMC40NTc3MS0wLjQ3NzQ3IDAuNzcxOTItMC42ODYxNGMwLjM0ODE2LTAuMjMxMiAxLjEwNDctMC40MTU4NyAxLjA5MjUtMC4zNjA0N2wtMC4yNDA4Mi0xLjc2MjFzLTEuNjIxMy0wLjE2MDctMy4wODgyIDEuOTk4M3oiIGZpbGw9IiM0Njc4Y2MiIGZpbHRlcj0idXJsKCNuKSIgb3BhY2l0eT0iLjgiLz4KICAgPHBhdGggZD0ibTQuNzg3NyA2LjczIDEuNTY1IDAuNjk1MzlzLTAuMDg4MjkyIDAuMjAxNjItMC4xMjMwNyAwLjQyMDkzYy0wLjAzMTc5MSAwLjIwMDUyIDAuMDA0NDQgMC4zODYyMyAwLjAwNDQ0IDAuMzg2MjNsLTEuODA2Mi0wLjAxODNzMC4wNzIxOTMtMS4wMzU5IDAuMzU5OTEtMS40ODQyeiIgZmlsbD0iIzQ2NzhjYyIgZmlsdGVyPSJ1cmwoI20pIiBvcGFjaXR5PSIuOCIvPgogICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yODAuMDcpIiBmaWxsPSIjZmZmIj4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4xNTY4MyAtLjEzNTkxIC4xMzU5MSAuMTU2ODMgMzYuMjc4IDI0OC42OCkiIGN4PSItMjI4LjMzIiBjeT0iNDQuOTQ0IiByeD0iMy4wODMiIHJ5PSIxLjkwMjgiIGZpbGwtb3BhY2l0eT0iLjMiIGZpbHRlcj0idXJsKCNnKSIvPgogICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJtYXRyaXgoLjEwMjkxIC0uMDg5MTggLjA4OTE4IC4xMDI5MSAyNi4xMTIgMjYyLjAzKSIgY3g9Ii0yMjguMSIgY3k9IjUxLjE2NiIgcng9IjEuOTE3OCIgcnk9IjEuMTgzNyIgZmlsbC1vcGFjaXR5PSIuMyIgZmlsdGVyPSJ1cmwoI2EpIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMTE4NzMgLS4wNzk0MjUgLjA3OTQyNSAuMTE4NzMgMjcuNDA2IDI1OS43NSkiIGN4PSItMjIyLjAzIiBjeT0iMTExLjcyIiByeD0iMTguNDE5IiByeT0iMTEuMzY4IiBmaWx0ZXI9InVybCgjaSkiIG9wYWNpdHk9Ii4yIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMTAyOTEgLS4wODkxOCAuMDg5MTggLjEwMjkxIDI2Ljc2NCAyNjEuNDYpIiBjeD0iLTIzNS4yOSIgY3k9Ijc1LjA0NiIgcng9IjMuNjY3IiByeT0iMi4yNjMzIiBmaWxsLW9wYWNpdHk9Ii4zIiBmaWx0ZXI9InVybCgjaikiLz4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4xMjUyMyAtLjEwODUzIC4xMDg1MyAuMTI1MjMgMjkuOTE4IDI1NC43KSIgY3g9Ii0yMzQuMjEiIGN5PSI4OC43NTkiIHJ4PSI2LjM4NTkiIHJ5PSIzLjk0MTMiIGZpbHRlcj0idXJsKCNrKSIvPgogICA8L2c+CiAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4MC4wNykiPgogICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJtYXRyaXgoLjE0MDQ2IC0uMDgyODE0IC4wODI4MTQgLjE0MDQ2IDMxLjY1MSAyNTYuMDIpIiBjeD0iLTIyMi4wMyIgY3k9IjExMS43MiIgcng9IjE4LjQxOSIgcnk9IjExLjM2OCIgZmlsbD0iIzQzOTdlZSIgZmlsdGVyPSJ1cmwoI2YpIiBvcGFjaXR5PSIuNDUiLz4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ibWF0cml4KC4wODEzMjUgLS4wNzA0NzYgLjA3MDQ3NiAuMDgxMzI1IDIyLjA1OSAyNjcuMTMpIiBjeD0iLTIyOC4zMyIgY3k9IjQ0Ljk0NCIgcng9IjMuMDgzIiByeT0iMS45MDI4IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii44NTQxNyIgZmlsdGVyPSJ1cmwoI2gpIi8+CiAgICA8ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCguMDY5MTU2IC0uMDU5OTMgLjA1OTkzIC4wNjkxNTYgMjAuOCAyNzEuNDkpIiBjeD0iLTIyOC4xIiBjeT0iNTEuMTY2IiByeD0iMS45MTc4IiByeT0iMS4xODM3IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii4zIiBmaWx0ZXI9InVybCgjYSkiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"shotcut,video,audio,editing,suite,mlt,4k,video4linux,blackmagic,decklink\"\nLABEL oc.cat=\"graphics\"\nLABEL oc.desktopfile=\"org.shotcut.Shotcut.desktop\"\nLABEL oc.launch=\"shotcut.Shotcut\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"Shotcut\"\nLABEL oc.displayname=\"Shotcut\"\nLABEL oc.path=\"/usr/bin/shotcut\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"image/bmp;image/g3fax;image/gif;image/x-fits;image/x-pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;application/vnd.mlt+xml;application/ogg;application/x-ogg;audio/ogg;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;audio/amr;audio/amr-wb;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/x-cd-image;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;\"\nLABEL oc.fileextensions=\"mlt\"\nLABEL oc.legacyfileextensions=\"mlt\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Shotcut\"\nENV APPBIN \"/usr/bin/shotcut\"\nENV APP \"/usr/bin/shotcut\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/shotcut/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/shotcut/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Shotcut

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Shotcut.d\n
"},{"location":"applications/shotcut/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Shotcut.d -t Shotcut .\n
"},{"location":"applications/shotcut/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Shotcut > Shotcut.json\ndocker image save Shotcut -o Shotcut.tar\nctr -n k8s.io images import Shotcut.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Shotcut.json\n\n
"},{"location":"applications/stellarium/","title":"Stellarium","text":""},{"location":"applications/stellarium/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/stellarium/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/stellarium/#alpine-packages","title":"Alpine packages","text":"
stellarium\n
"},{"location":"applications/stellarium/#path","title":"Path","text":"
/usr/bin/stellarium\n
"},{"location":"applications/stellarium/#mimetype","title":"Mimetype","text":"
application/x-stellarium-script;\n
"},{"location":"applications/stellarium/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/stellarium/#wm_class","title":"WM_CLASS","text":"
stellarium.stellarium\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/stellarium/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.stellarium.Stellarium.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/stellarium/#json-dump","title":"JSON dump","text":"

json source file stellarium.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"stellarium\",\n    \"icon\": \"stellarium.svg\",\n    \"keyword\": \"stellarium,astronomy\",\n    \"launch\": \"stellarium.stellarium\",\n    \"name\": \"Stellarium\",\n    \"path\": \"/usr/bin/stellarium\",\n    \"mimetype\": \"application/x-stellarium-script;\",\n    \"desktopfile\": \"/usr/share/applications/org.stellarium.Stellarium.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/stellarium/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output stellarium.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stellarium.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stellarium.d.3.0.json\n\n
"},{"location":"applications/stellarium/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update stellarium\nLABEL oc.icon=\"stellarium.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgaGVpZ2h0PSI0OCIgaWQ9InN2ZzgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDEyLjcgMTIuNyIgd2lkdGg9IjQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVmcyBpZD0iZGVmczIiPjxjbGlwUGF0aCBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImNsaXBQYXRoNTM0MyI+PHBhdGggZD0ibSAzLjA2ODgzNTEsMjg1LjU1Njc3IGMgLTEuNjEzNTY4LDEuMTk1OTYgLTIuNTY2MjE4MSwzLjA4NDc4IC0yLjU2ODgzNTA5LDUuMDkzMjMgMCwzLjUwNzAxIDIuODQyOTkyMTksNi4zNSA2LjM1MDAwMDA5LDYuMzUgQyAxMC4zNTcwMDgsMjk3IDEzLjIsMjk0LjE1NzAxIDEzLjIsMjkwLjY1IGMgLTAuMDAyMiwtMC44NDI5NiAtMC40NTIwNzgsLTIuNzEyNzEgLTAuNTAwMjI4LC0yLjQ1MzU5IC0wLjAyNDI0LDAuODQxMjEgLTAuNTcxODA5LDIuMzUzMjIgLTAuNjAyMDMxLDIuMjMxMzggLTAuMDAyNiwtMC41MDYyMSAtMC4yODc2LC0xLjQyNjI2IC0wLjMwNTA5OCwtMS4xOTUwOSAwLjAyODA0LDEuNDA2OTUgLTEuNDgzNzQsMy4xNzY3NyAtMi4zMDc2NjIzLDMuNTAwMzggLTAuODMxMDQ1NywwLjM2OTQyIC0xLjczNzE2MzcsMC41NjQxMiAtMi42MTE3MjY3LDAuNTY1MzQgLTAuMTczNjkxOCwyZS01IC0xLjE2ODY1MTksLTAuMTM4MDcgLTEuNjQ0MzQzOSwtMC43MDQzNSAtMC44MjYzNzYsLTAuODkyNTMgLTAuMDAyMDEsLTEuMDk5OTQgMC40NjI1MDM5LC0xLjI3MzMxIDAuNTA1NTg2MiwtMC4xODg3MSAxLjAzMDg4NywtMC4zMDk2OSAxLjUyMDMyMTIsLTAuNDIwMTMgMC43NDU2OTg4LC0wLjE2ODI2IDAuNDcxMDYxOCwtMC41MjYyNiAwLjEwNDkwMjgsLTAuNjI4OSAtMC45MjY2OTM5LC0wLjI1OTc2IC0yLjA0NDg4NiwwLjMzNTQzIC0yLjg2NTQ1NzksMC4zMDU5MyAtMC44NDg0MDYsLTAuMDI5MSAtMC44MDQ2MTgsLTEuNjk2MjEgLTAuMTQwNTYwMSwtMS43NjIxNyAwLjczOTQyMTIsLTAuMDczNCAxLjY2NjUxNTEsLTAuNTEwNzkgMS40NjE3NzksLTAuNjU2NzMgLTAuODMwMzU0OSwtMC42MTY3MiAtMC45NjE3MzY5LC0wLjc5MDgxIC0xLjA1OTU1NDksLTEuMTY0MTggLTAuMTQ4MDIwMSwtMC41NjUgMC4zNDEyODIsLTEuMDM1NTcgMC4wNTc3NywtMC45NjM1NiAtMC4yNTk2MTY5LDAuMDggLTAuNDExMDY3OCwwLjE1NjQxIC0wLjU5ODg2MTksMC4yNTcxNSAtMC4xNjcyOTI5LDAuMDg5NyAtMC4yOTM4MTQsMC4wNTQ2IC0wLjY3NTE4NDEsMC4wMDIgLTAuMzI0OTQ0OSwtMC4wNDUgLTAuMzg3MDA1OCwtMC4wNTU3IC0wLjM3NTUwMDksLTAuMjU2NzMgMC4wMTE1LC0wLjIwMDk3IDAuMDcyOTUsLTAuNTIxMjUgLTAuMDUyMjMsLTAuNDc2NDggeiIgaWQ9InBhdGg1MzQ1IiBzdHlsZT0iZmlsbDojN2FhZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjAxMDQ1OTQyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIi8+PC9jbGlwUGF0aD48Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDQ1NDMiPjxwYXRoIGQ9Im0gMS43NzYwMDg4LDI5MS41Njk2IGMgLTEuODI2MTMzMzksMC4xNzQzNCAtMy4yOTQwMzE1LDAuOTE5MzQgLTMuNDkwMzk5NiwyLjE2NDUxIC0wLjI2MjkwNTQsMS42NjcyOSAxLjU2Nzg1OTEsMy4zNDEyNyA0LjA4OTEyMTMsMy43Mzg5MyAxLjIxNzIwODQsMC4xOTExOSAyLjQzNDIzNCwwLjA1MyAzLjM4MDc0MjMsLTAuMzgzODcgMC43MzEwMTk0LDAuNTI4MyAxLjY2OTM1NywwLjkwMDc4IDIuNjcwNDcyMSwxLjA2MDA4IDIuNTIxMjY5MSwwLjM5NzcxIDQuNzc4MzM4MSwtMC42MzE1IDUuMDQxMjgwMSwtMi4yOTg4IDAuMjYyOTA1LC0xLjY2NzMgLTEuNDkwNjY3LC0xLjk0MzI5IC00LjI1NzE2MywtMi4xNzkzOCAtMi43NjY0OTU4LC0wLjIzNjA5IC0zLjYxNjM4OTYsLTEuNjg4MzkgLTUuNzQ3MDQ0OCwtMi4wNDU3NSAtMC41NjYwMTkxLC0wLjA4OTMgLTEuMTM4MDgwOCwtMC4xMDgxNyAtMS42ODcwMDg0LC0wLjA1NTcgeiIgaWQ9InBhdGg0NTQ1IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMTE2NjY2NTY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGlkPSJsYXllcjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTI4NC4zKSI+PGNpcmNsZSBjeD0iNi4zNDk5OTk5IiBjeT0iMjkwLjY0OTk5IiBpZD0icGF0aDQ1MTQiIHI9IjYuMzQ5OTk5OSIgc3R5bGU9ImZpbGw6I2FhY2NmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS43NDY1ODgxMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQ1NDMpIiBkPSJtIDEyLjcsMjkwLjY0OTk5IGEgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSAtNi4zNTAwMDAxLDYuMzUgQSA2LjM0OTk5OTksNi4zNDk5OTk5IDAgMCAxIDAsMjkwLjY0OTk5IGEgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSA2LjM0OTk5OTksLTYuMzUgNi4zNDk5OTk5LDYuMzQ5OTk5OSAwIDAgMSA2LjM1MDAwMDEsNi4zNSB6IiBpZD0icGF0aDQ1MTQtMyIgc3R5bGU9ImZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS43NDY1ODgxMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPjxnIGlkPSJnNDY3Ny05IiBzdHlsZT0iZmlsbDojNWI5OWY4O2ZpbGwtb3BhY2l0eToxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOS4xNTI0OTU4LC0zLjUyNDkyMzIpIj48cGF0aCBkPSJtIDE5LjU2NzQ1OCwyOTEuNzc1NjEgYSAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAwIC0wLjQ2ODk5MiwtMC4zNjQ2NyAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAxIC0wLjM2NTExNiwzLjA0NzM0IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDEgLTMuMDQ2NDYsMC4zNjYgMi40ODY2ODExLDIuNDg2NjgxMSAwIDAgMCAwLjM2NDIzMSwwLjQ2NzY2IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMy41MTYzMzcsNC41ZS00IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMCwtMy41MTY3OCB6IiBpZD0icGF0aDQ1MjYtNjkiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41NjA1MDIyOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PHBhdGggZD0ibSA2LjQxODUxNDUsMjk0LjIzMjk5IC0wLjM1NjYyNDksLTAuMjUzOTQgLTAuMzU2NjI0OSwwLjI1Mzk0IDAuMDQxNjAyLC0wLjQzNTgyIC0wLjM5ODIyNjcsLTAuMTgxODcgMC4zOTgyMjY3LC0wLjE4MTg4IC0wLjA0MTYwMiwtMC40MzU4MiAwLjM1NjYyNSwwLjI1Mzk0IDAuMzU2NjI0OSwtMC4yNTM5NCAtMC4wNDE2MDIsMC40MzU4MiAwLjM5ODIyNjcsMC4xODE4OCAtMC4zOTgyMjY3LDAuMTgxODcgeiIgaWQ9InBhdGg0NTYxLTMzIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4xMTY4ODgxLC0wLjY0NDgzNTY1LDAuNjQ0ODM1NjUsMS4xMTY4ODgxLC0xODMuMzc4MjEsLTMyLjQ5MTY2NikiLz48Y2lyY2xlIGN4PSIxMS4zMTU4NTUiIGN5PSIyOTMuNzIzOTQiIGlkPSJwYXRoNDYyMS04IiByPSIwLjMwMjY3ODI2IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuOTg5NDk2MjM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxjaXJjbGUgY3g9IjE1LjU3NTQyMSIgY3k9IjI5MC4yMjA3OSIgaWQ9InBhdGg0NjI1LTAiIHI9IjAuMzU4MjY4ODkiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6My42OTkzOTgwNDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PGNpcmNsZSBjeD0iMTcuMTY4NjIzIiBjeT0iMjkyLjAxNDg5IiBpZD0icGF0aDQ2MjUtNS01IiByPSIwLjIyNjQ5Njk5IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiM1Yjk5Zjg7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMzM4NzUyOTk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGQ9Im0gNi40MTg1MTQ1LDI5NC4yMzI5OSAtMC4zNTY2MjQ5LC0wLjI1Mzk0IC0wLjM1NjYyNDksMC4yNTM5NCAwLjA0MTYwMiwtMC40MzU4MiAtMC4zOTgyMjY3LC0wLjE4MTg3IDAuMzk4MjI2NywtMC4xODE4OCAtMC4wNDE2MDIsLTAuNDM1ODIgMC4zNTY2MjUsMC4yNTM5NCAwLjM1NjYyNDksLTAuMjUzOTQgLTAuMDQxNjAyLDAuNDM1ODIgMC4zOTgyMjY3LDAuMTgxODggLTAuMzk4MjI2NywwLjE4MTg3IHoiIGlkPSJwYXRoNDU2MS0xLTYiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzViOTlmODtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS41OTk5MTY0NjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjY4NzMwMTcyLC0wLjM5NjgxMzg1LDAuMzk2ODEzODUsMC42ODczMDE3MiwtMTA2LjEzNzk2LDk0LjI3OTU3NikiLz48L2c+PGcgaWQ9Imc0Njc3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOS4zMjk0NTE3LC0zLjc0MjMyMjQpIj48cGF0aCBkPSJtIDE5LjU2NzQ1OCwyOTEuNzc1NjEgYSAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAwIC0wLjQ2ODk5MiwtMC4zNjQ2NyAyLjQ4NjY4MTEsMi40ODY2ODExIDAgMCAxIC0wLjM2NTExNiwzLjA0NzM0IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDEgLTMuMDQ2NDYsMC4zNjYgMi40ODY2ODExLDIuNDg2NjgxMSAwIDAgMCAwLjM2NDIzMSwwLjQ2NzY2IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMy41MTYzMzcsNC41ZS00IDIuNDg2NjgxMSwyLjQ4NjY4MTEgMCAwIDAgMCwtMy41MTY3OCB6IiBpZD0icGF0aDQ1MjYiIHN0eWxlPSJvcGFjaXR5OjE7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6Mi41NjA1MDIyOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIi8+PHBhdGggZD0ibSA2LjQxODUxNDUsMjk0LjIzMjk5IC0wLjM1NjYyNDksLTAuMjUzOTQgLTAuMzU2NjI0OSwwLjI1Mzk0IDAuMDQxNjAyLC0wLjQzNTgyIC0wLjM5ODIyNjcsLTAuMTgxODcgMC4zOTgyMjY3LC0wLjE4MTg4IC0wLjA0MTYwMiwtMC40MzU4MiAwLjM1NjYyNSwwLjI1Mzk0IDAuMzU2NjI0OSwtMC4yNTM5NCAtMC4wNDE2MDIsMC40MzU4MiAwLjM5ODIyNjcsMC4xODE4OCAtMC4zOTgyMjY3LDAuMTgxODcgeiIgaWQ9InBhdGg0NTYxIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4xMTY4ODgxLC0wLjY0NDgzNTY1LDAuNjQ0ODM1NjUsMS4xMTY4ODgxLC0xODMuMzc4MjEsLTMyLjQ5MTY2NikiLz48Y2lyY2xlIGN4PSIxMS4zMTU4NTUiIGN5PSIyOTMuNzIzOTQiIGlkPSJwYXRoNDYyMSIgcj0iMC4zMDI2NzgyNiIgc3R5bGU9Im9wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyLjk4OTQ5NjIzO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiLz48Y2lyY2xlIGN4PSIxNS41NzU0MjEiIGN5PSIyOTAuMjIwNzkiIGlkPSJwYXRoNDYyNSIgcj0iMC4zNTgyNjg4OSIgc3R5bGU9Im9wYWNpdHk6MTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozLjY5OTM5ODA0O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiLz48Y2lyY2xlIGN4PSIxNy4xNjg2MjMiIGN5PSIyOTIuMDE0ODkiIGlkPSJwYXRoNDYyNS01IiByPSIwLjIyNjQ5Njk5IiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjIuMzM4NzUyOTk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIvPjxwYXRoIGQ9Im0gNi40MTg1MTQ1LDI5NC4yMzI5OSAtMC4zNTY2MjQ5LC0wLjI1Mzk0IC0wLjM1NjYyNDksMC4yNTM5NCAwLjA0MTYwMiwtMC40MzU4MiAtMC4zOTgyMjY3LC0wLjE4MTg3IDAuMzk4MjI2NywtMC4xODE4OCAtMC4wNDE2MDIsLTAuNDM1ODIgMC4zNTY2MjUsMC4yNTM5NCAwLjM1NjYyNDksLTAuMjUzOTQgLTAuMDQxNjAyLDAuNDM1ODIgMC4zOTgyMjY3LDAuMTgxODggLTAuMzk4MjI2NywwLjE4MTg3IHoiIGlkPSJwYXRoNDU2MS0xIiBzdHlsZT0ib3BhY2l0eToxO3ZlY3Rvci1lZmZlY3Q6bm9uZTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNTk5OTE2NDY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgdHJhbnNmb3JtPSJtYXRyaXgoMC42ODczMDE3MiwtMC4zOTY4MTM4NSwwLjM5NjgxMzg1LDAuNjg3MzAxNzIsLTEwNi4xMzc5Niw5NC4yNzk1NzYpIi8+PC9nPjwvZz48L3N2Zz4=\"\nLABEL oc.keyword=\"stellarium,stellarium,astronomy\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.stellarium.Stellarium.desktop\"\nLABEL oc.launch=\"stellarium.stellarium\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Stellarium\"\nLABEL oc.displayname=\"Stellarium\"\nLABEL oc.path=\"/usr/bin/stellarium\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-stellarium-script;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Stellarium\"\nENV APPBIN \"/usr/bin/stellarium\"\nENV APP \"/usr/bin/stellarium\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/stellarium/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/stellarium/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Stellarium

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Stellarium.d\n
"},{"location":"applications/stellarium/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Stellarium.d -t Stellarium .\n
"},{"location":"applications/stellarium/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Stellarium > Stellarium.json\ndocker image save Stellarium -o Stellarium.tar\nctr -n k8s.io images import Stellarium.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Stellarium.json\n\n
"},{"location":"applications/step/","title":"Step","text":""},{"location":"applications/step/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/step/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/step/#alpine-packages","title":"Alpine packages","text":"
step\n
"},{"location":"applications/step/#path","title":"Path","text":"
/usr/bin/step\n
"},{"location":"applications/step/#mimetype","title":"Mimetype","text":"
application/x-step;\n
"},{"location":"applications/step/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/step/#wm_class","title":"WM_CLASS","text":"
step.step\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/step/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.kde.step.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/step/#json-dump","title":"JSON dump","text":"

json source file step.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"education\",\n    \"apkpackage\": \"step\",\n    \"icon\": \"step.svg\",\n    \"keyword\": \"step\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"launch\": \"step.step\",\n    \"name\": \"Step\",\n    \"path\": \"/usr/bin/step\",\n    \"mimetype\": \"application/x-step;\",\n    \"desktopfile\": \"/usr/share/applications/org.kde.step.desktop\",\n    \"template\": \"abcdesktopio/oc.template.alpine\"\n}\n
"},{"location":"applications/step/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output step.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/step.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @step.d.3.0.json\n\n
"},{"location":"applications/step/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update step\nLABEL oc.icon=\"step.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHBhdGggc3R5bGU9ImZpbGw6I0ExQTdBRjsiIGQ9Ik00MjAsNDZIOTJjLTI0LjI2MiwwLTQ0LDE5LjczOC00NCw0NHYzMTJjMCw2LjYyNyw1LjM3MywxMiwxMiwxMnMxMi01LjM3MywxMi0xMlY5MA0KCWMwLTExLjAyOCw4Ljk3Mi0yMCwyMC0yMGgzMjhjMTEuMDI4LDAsMjAsOC45NzIsMjAsMjB2MzEyYzAsNi42MjcsNS4zNzMsMTIsMTIsMTJzMTItNS4zNzMsMTItMTJWOTBDNDY0LDY1LjczOCw0NDQuMjYyLDQ2LDQyMCw0NnoNCgkiLz4NCjxnPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiM1NTYwNkU7IiBkPSJNMjQ4LDI1OGMwLDQuNDE4LDMuNTgyLDgsOCw4czgtMy41ODIsOC04VjcwaC0xNlYyNTh6Ii8+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzU1NjA2RTsiIGQ9Ik0zNzAuNjkyLDcwaC0xNy42NTNsODAuODU0LDE3My4zOTJjMS4xODMsMi41MzksMy41MjksNC4xNjIsNi4xMDcsNC41MzZ2LTI5LjI5NkwzNzAuNjkyLDcweiIvPg0KCTxwYXRoIHN0eWxlPSJmaWxsOiM1NTYwNkU7IiBkPSJNNDQ0LjUyMywyNDcuMjYyYzQuMDA0LTEuODY3LDUuNzM3LTYuNjI3LDMuODY5LTEwLjYzMUw0NDAsMjE4LjYzMnYyOS4yOTYNCgkJYzAuMzc5LDAuMDU1LDAuNzYyLDAuMDg1LDEuMTQ3LDAuMDg1QzQ0Mi4yNzksMjQ4LjAxMyw0NDMuNDMsMjQ3Ljc3MSw0NDQuNTIzLDI0Ny4yNjJ6Ii8+DQo8L2c+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkY4Qzc4OyIgZD0iTTI1NiwyNThjLTI2LjQ2OCwwLTQ4LDIxLjUzMy00OCw0OHMyMS41MzIsNDgsNDgsNDhzNDgtMjEuNTMzLDQ4LTQ4UzI4Mi40NjgsMjU4LDI1NiwyNTh6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojREI2QjVFOyIgZD0iTTI3MiwzNDZjLTI2LjQ2OCwwLTQ4LTIxLjUzMy00OC00OGMwLTE1LjU2LDcuNDQ4LTI5LjQwOSwxOC45Ni0zOC4xODUNCglDMjIyLjgxMSwyNjUuNTEyLDIwOCwyODQuMDUzLDIwOCwzMDZjMCwyNi40NjcsMjEuNTMyLDQ4LDQ4LDQ4YzEwLjkwNywwLDIwLjk3MS0zLjY2MywyOS4wNC05LjgxNQ0KCUMyODAuODkxLDM0NS4zNTgsMjc2LjUyLDM0NiwyNzIsMzQ2eiIvPg0KPHBhdGggc3R5bGU9ImZpbGw6IzU1NjA2RTsiIGQ9Ik0xNDQsMjU4YzAsNC40MTgsMy41ODIsOCw4LDhzOC0zLjU4Miw4LThWNzBoLTE2VjI1OHoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNGRjhDNzg7IiBkPSJNMTUyLDI1OGMtMjYuNDY4LDAtNDgsMjEuNTMzLTQ4LDQ4czIxLjUzMiw0OCw0OCw0OHM0OC0yMS41MzMsNDgtNDhTMTc4LjQ2OCwyNTgsMTUyLDI1OHoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNEQjZCNUU7IiBkPSJNMTY4LDM0NmMtMjYuNDY4LDAtNDgtMjEuNTMzLTQ4LTQ4YzAtMTUuNTYsNy40NDgtMjkuNDA5LDE4Ljk2LTM4LjE4NQ0KCUMxMTguODExLDI2NS41MTIsMTA0LDI4NC4wNTMsMTA0LDMwNmMwLDI2LjQ2NywyMS41MzIsNDgsNDgsNDhjMTAuOTA3LDAsMjAuOTcxLTMuNjYzLDI5LjA0LTkuODE1DQoJQzE3Ni44OTEsMzQ1LjM1OCwxNzIuNTIsMzQ2LDE2OCwzNDZ6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojRkY4Qzc4OyIgZD0iTTUwNC45MzIsMjYzLjIyOWMtNS40MTktMTEuNjItMTUuMDM4LTIwLjQzNS0yNy4wODYtMjQuODJjLTEyLjA1LTQuMzg2LTI1LjA4NC0zLjgxNi0zNi43MDMsMS42MDMNCgljLTIzLjk4NywxMS4xODUtMzQuNDAyLDM5LjgtMjMuMjE3LDYzLjc4OGM4LjEzNiwxNy40NDYsMjUuNDg3LDI3LjcxMyw0My41NzYsMjcuNzEyYzYuNzgyLDAsMTMuNjcxLTEuNDQ0LDIwLjIxMi00LjQ5NQ0KCUM1MDUuNzAxLDMxNS44MzIsNTE2LjExNiwyODcuMjE2LDUwNC45MzIsMjYzLjIyOXoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiNEQjZCNUU7IiBkPSJNNDgwLjA3MSwzMjJjLTE4LjA4OSwwLjAwMS0zNS40NC0xMC4yNjYtNDMuNTc2LTI3LjcxMmMtOS40MS0yMC4xODEtMy41MjktNDMuNjM0LDEyLjg1Ny01Ny4yMzENCgljLTIuNzkxLDAuNzMyLTUuNTM5LDEuNzA5LTguMjA5LDIuOTU0Yy0yMy45ODcsMTEuMTg1LTM0LjQwMiwzOS44LTIzLjIxNyw2My43ODhjOC4xMzYsMTcuNDQ2LDI1LjQ4NywyNy43MTMsNDMuNTc2LDI3LjcxMg0KCWM2Ljc4MiwwLDEzLjY3MS0xLjQ0NCwyMC4yMTItNC40OTVjMy44MTQtMS43NzksNy4yODItNC4wMDEsMTAuMzc4LTYuNTczQzQ4OC4xMDksMzIxLjQ4Miw0ODQuMDcyLDMyMiw0ODAuMDcxLDMyMnoiLz4NCjxwYXRoIHN0eWxlPSJmaWxsOiMzQzlGRTg7IiBkPSJNNDcyLDM5NEg0MGMtMjIuMDU2LDAtNDAsMTcuOTQ0LTQwLDQwdjI0YzAsNC40MTgsMy41ODIsOCw4LDhoNDk2YzQuNDE4LDAsOC0zLjU4Miw4LTh2LTI0DQoJQzUxMiw0MTEuOTQ0LDQ5NC4wNTYsMzk0LDQ3MiwzOTR6Ii8+DQo8cGF0aCBzdHlsZT0iZmlsbDojNDI3RkM5OyIgZD0iTTAsNDQyLjMzM1Y0NThjMCw0LjQxOCwzLjU4Miw4LDgsOGg0OTZjNC40MTgsMCw4LTMuNTgyLDgtOHYtMTUuNjY3SDB6Ii8+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"step,step\"\nLABEL oc.cat=\"education\"\nLABEL oc.desktopfile=\"org.kde.step.desktop\"\nLABEL oc.launch=\"step.step\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"Step\"\nLABEL oc.displayname=\"Step\"\nLABEL oc.path=\"/usr/bin/step\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-step;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Step\"\nENV APPBIN \"/usr/bin/step\"\nENV APP \"/usr/bin/step\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/step/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/step/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Step

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Step.d\n
"},{"location":"applications/step/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Step.d -t Step .\n
"},{"location":"applications/step/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Step > Step.json\ndocker image save Step -o Step.tar\nctr -n k8s.io images import Step.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Step.json\n\n
"},{"location":"applications/stress/","title":"stress","text":""},{"location":"applications/stress/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/stress/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/stress/#ubuntu-packages","title":"Ubuntu packages","text":"
at-spi2-core gnome-terminal dbus-x11 stress\n
"},{"location":"applications/stress/#arguments","title":"Arguments","text":"

\"--disable-factory --class=stress\"

"},{"location":"applications/stress/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/stress/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/stress/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.stress\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/stress/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/gnome-terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/stress/#json-dump","title":"JSON dump","text":"

json source file stress.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"at-spi2-core gnome-terminal dbus-x11 stress\",\n    \"icon\": \"stress.svg\",\n    \"keyword\": \"stress,cpu,shell\",\n    \"launch\": \"gnome-terminal-server.stress\",\n    \"name\": \"stress\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false,\n        \"ipc_mode\": false\n    },\n    \"args\": \"--disable-factory --class=stress\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/gnome-terminal.desktop\"\n}\n
"},{"location":"applications/stress/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output stress.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stress.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stress.d.3.0.json\n\n
"},{"location":"applications/stress/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends at-spi2-core gnome-terminal dbus-x11 stress && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"stress.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNDk2LjgiIGhlaWdodD0iNDk2LjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CgogPGc+CiAgPHRpdGxlPkxheWVyIDE8L3RpdGxlPgogIDxwYXRoIGlkPSJzdmdfMSIgZmlsbD0iIzZlYzZmMCIgZD0ibTE1Miw0ODRjMCw2LjQgLTUuNiwxMiAtMTIsMTJsMCwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsLTQ3MmMwLC02LjQgNS42LC0xMiAxMiwtMTJsMCwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDQ3MnoiLz4KICA8cGF0aCBpZD0ic3ZnXzMiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0yMDgsNDg0YzAsNi40IC01LjYsMTIgLTEyLDEybDAsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLC00NzJjMCwtNi40IDUuNiwtMTIgMTIsLTEybDAsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCw0NzJ6Ii8+CiAgPHBhdGggaWQ9InN2Z181IiBmaWxsPSIjNmVjNmYwIiBkPSJtMzEyLDQ4NGMwLDYuNCAtNS42LDEyIC0xMiwxMmwwLDBjLTYuNCwwIC0xMiwtNS42IC0xMiwtMTJsMCwtNDcyYzAsLTYuNCA1LjYsLTEyIDEyLC0xMmwwLDBjNi40LDAgMTIsNS42IDEyLDEybDAsNDcyeiIvPgogIDxwYXRoIGlkPSJzdmdfNyIgZmlsbD0iIzZlYzZmMCIgZD0ibTM2OCw0ODRjMCw2LjQgLTUuNiwxMiAtMTIsMTJsMCwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsLTQ3MmMwLC02LjQgNS42LC0xMiAxMiwtMTJsMCwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDQ3MnoiLz4KICA8cGF0aCBpZD0ic3ZnXzkiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0yNjAsNDg0YzAsNi40IC01LjYsMTIgLTEyLDEybDAsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLC00NzJjMCwtNi40IDUuNiwtMTIgMTIsLTEybDAsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCw0NzJ6Ii8+CiAgPHBhdGggaWQ9InN2Z18xMSIgZmlsbD0iIzZlYzZmMCIgZD0ibTEyLjgsMTUyYy03LjIsMCAtMTIuOCwtNC44IC0xMi44LC0xMmwwLDBjMCwtNy4yIDUuNiwtMTIgMTIuOCwtMTJsNDcxLjIsMGM3LjIsMCAxMi44LDQuOCAxMi44LDEybDAsMGMwLDcuMiAtNS42LDEyIC0xMi44LDEybC00NzEuMiwweiIvPgogIDxwYXRoIGlkPSJzdmdfMTMiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im00OTYsMTk2YzAsNi40IC01LjYsMTIgLTEyLDEybC00NzIsMGMtNi40LDAgLTEyLC01LjYgLTEyLC0xMmwwLDBjMCwtNi40IDUuNiwtMTIgMTIsLTEybDQ3MiwwYzYuNCwwIDEyLDUuNiAxMiwxMmwwLDB6Ii8+CiAgPHBhdGggaWQ9InN2Z18xNSIgZmlsbD0iIzZlYzZmMCIgZD0ibTQ5NiwzMDBjMCw2LjQgLTUuNiwxMiAtMTIsMTJsLTQ3MiwwYy02LjQsMCAtMTIsLTUuNiAtMTIsLTEybDAsMGMwLC02LjQgNS42LC0xMiAxMiwtMTJsNDcyLDBjNi40LDAgMTIsNS42IDEyLDEybDAsMHoiLz4KICA8cGF0aCBpZD0ic3ZnXzE3IiBmaWxsPSIjNmVjNmYwIiBkPSJtNDk2LDI1MWMwLDYuNCAtNS42LDEyIC0xMiwxMmwtNDcyLDBjLTYuNCwwIC0xMiwtNS42IC0xMiwtMTJsMCwwYzAsLTYuNCA1LjYsLTEyIDEyLC0xMmw0NzIsMGM2LjQsMCAxMiw1LjYgMTIsMTJsMCwweiIvPgogIDxwYXRoIGlkPSJzdmdfMTkiIGZpbGw9IiM2ZWM2ZjAiIGQ9Im0xMi44LDM2OGMtNy4yLDAgLTEyLjgsLTQuOCAtMTIuOCwtMTJsMCwwYzAsLTcuMiA1LjYsLTEyIDEyLjgsLTEybDQ3MS4yLDBjNy4yLDAgMTIuOCw0LjggMTIuOCwxMmwwLDBjMCw3LjIgLTUuNiwxMiAtMTIuOCwxMmwtNDcxLjIsMHoiLz4KICA8cGF0aCBpZD0ic3ZnXzIxIiBmaWxsPSIjMzYzRjNFIiBkPSJtNDA4LDM4MS42YzAsMTQuNCAtMTIsMjYuNCAtMjYuNCwyNi40bC0yNTkuMiwwYy0xNC40LDAgLTI2LjQsLTEyIC0yNi40LC0yNi40bDAsLTI1OS4yYzAsLTE0LjQgMTIsLTI2LjQgMjYuNCwtMjYuNGwyNTkuMiwwYzE0LjQsMCAyNi40LDEyIDI2LjQsMjYuNGwwLDI1OS4yeiIvPgogIDxwYXRoIGlkPSJzdmdfMjIiIGQ9Im05NiwxMjIuNGMwLC0xNC40IDEyLC0yNi40IDI2LjQsLTI2LjRsMjU5LjIsMGMxNC40LDAgMjYuNCwxMiAyNi40LDI2LjRsMCwyNTkuMmMwLDE0LjQgLTEyLDI2LjQgLTI2LjQsMjYuNCIvPgogIDxwYXRoIGlkPSJzdmdfMjMiIGZpbGw9IiM0OTUxNTAiIGQ9Im0zNTIsMzM1LjJjMCw5LjYgLTcuMiwxNi44IC0xNi44LDE2LjhsLTE2Ni40LDBjLTkuNiwwIC0xNi44LC03LjIgLTE2LjgsLTE2LjhsMCwtMTY2LjRjMCwtOS42IDcuMiwtMTYuOCAxNi44LC0xNi44bDE2Ni40LDBjOS42LDAgMTYuOCw3LjIgMTYuOCwxNi44bDAsMTY2LjR6Ii8+CiAgPGcgaWQ9InN2Z18yOSIvPgogIDxnIGlkPSJzdmdfMzAiLz4KICA8ZyBpZD0ic3ZnXzMxIi8+CiAgPGcgaWQ9InN2Z18zMiIvPgogIDxnIGlkPSJzdmdfMzMiLz4KICA8ZyBpZD0ic3ZnXzM0Ii8+CiAgPGcgaWQ9InN2Z18zNSIvPgogIDxnIGlkPSJzdmdfMzYiLz4KICA8ZyBpZD0ic3ZnXzM3Ii8+CiAgPGcgaWQ9InN2Z18zOCIvPgogIDxnIGlkPSJzdmdfMzkiLz4KICA8ZyBpZD0ic3ZnXzQwIi8+CiAgPGcgaWQ9InN2Z180MSIvPgogIDxnIGlkPSJzdmdfNDIiLz4KICA8ZyBpZD0ic3ZnXzQzIi8+CiA8L2c+Cjwvc3ZnPg==\"\nLABEL oc.keyword=\"stress,stress,cpu,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"gnome-terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.stress\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=stress\"\nLABEL oc.name=\"stress\"\nLABEL oc.displayname=\"stress\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"stress\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=stress\"\nENV APP \"/usr/bin/gnome-terminal\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/stress/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/stress/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application stress

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/stress.d\n
"},{"location":"applications/stress/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f stress.d -t stress .\n
"},{"location":"applications/stress/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect stress > stress.json\ndocker image save stress -o stress.tar\nctr -n k8s.io images import stress.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @stress.json\n\n
"},{"location":"applications/sublime-text/","title":"sublime-Text","text":""},{"location":"applications/sublime-text/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/sublime-text/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/sublime-text/#ubuntu-packages","title":"Ubuntu packages","text":"
sublime-text\n
"},{"location":"applications/sublime-text/#path","title":"Path","text":"
/opt/sublime_text/sublime_text\n
"},{"location":"applications/sublime-text/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/sublime-text/#wm_class","title":"WM_CLASS","text":"
sublime_text.Sublime_text\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/sublime-text/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/sublime_text.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/sublime-text/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\nRUN echo \"deb https://download.sublimetext.com/ apt/stable/\" | tee /etc/apt/sources.list.d/sublime-text.list\nRUN apt-get update && apt-get install --yes libgl1 && apt-get clean\n
"},{"location":"applications/sublime-text/#json-dump","title":"JSON dump","text":"

json source file sublime-text.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"preruncommands\": [\n        \"RUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\",\n        \"RUN echo \\\"deb https://download.sublimetext.com/ apt/stable/\\\" | tee /etc/apt/sources.list.d/sublime-text.list\",\n        \"RUN apt-get update && apt-get install --yes libgl1 && apt-get clean\"\n    ],\n    \"debpackage\": \"sublime-text\",\n    \"installrecommends\": true,\n    \"icon\": \"circle_sublime-text.svg\",\n    \"keyword\": \"ide,code,sublime-text\",\n    \"launch\": \"sublime_text.Sublime_text\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"sublime-Text\",\n    \"path\": \"/opt/sublime_text/sublime_text\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"desktopfile\": \"/usr/share/applications/sublime_text.desktop\"\n}\n
"},{"location":"applications/sublime-text/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output sublime-text.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sublime-text.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sublime-text.d.3.0.json\n\n
"},{"location":"applications/sublime-text/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN curl -Ls https://download.sublimetext.com/sublimehq-pub.gpg | apt-key add -a\nRUN echo \"deb https://download.sublimetext.com/ apt/stable/\" | tee /etc/apt/sources.list.d/sublime-text.list\nRUN apt-get update && apt-get install --yes libgl1 && apt-get clean\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y sublime-text && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_sublime-text.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iU3VibGltZS1UZXh0IiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InN1YmxpbWUtaWNvbi1iIiB4MT0iMTkzLjU5IiB4Mj0iMjExLjQ5IiB5MT0iNDE0LjU2IiB5Mj0iMzI0Ljc1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuODcxNyAwIDAgMS4yNDc4IDE4Mi4wNSAxNTkuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRjk3MDAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjRjQ4RTAwIiBvZmZzZXQ9Ii41MyIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjQ0U2RTAwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjUyMC40NCIgeDI9IjUyMCIgeTE9IjM2LjgyMiIgeTI9Ijk4NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0ZDRkNGQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzIzMjMyIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjUyMCIgeDI9IjUyMCIgeTE9IjQiIHkyPSIxMDI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmOWY5ZjkiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDQxMzc3IiB5PSItLjAzMTg2IiB3aWR0aD0iMS4wODI4IiBoZWlnaHQ9IjEuMDYzNyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi43NzE0MDczIi8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IHgxPSI1MjAiIHgyPSI1MjAiIHkxPSI0IiB5Mj0iMTAyNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2Q3ZDdkNyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTA0Njg4Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMDYzODA5IDAgMCAuMDYzODA5IC0uNjY5OTkgLS42Njk5OSkiIHN0cm9rZS13aWR0aD0iMTUuNjcyIj4KICA8Zz4KICAgPGNpcmNsZSBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzAuMTYiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHJva2UtbWl0ZXJsaW1pdD0iMCIgc3Ryb2tlLXdpZHRoPSIwIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogICA8ZyBpZD0ic2hhZG93IiB0cmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIiBmaWxsPSJ1cmwoI2EpIiBzdHJva2Utd2lkdGg9IjE1LjY3MiI+PC9nPgogICA8Y2lyY2xlIGN4PSI1MTIiIGN5PSI1MTIiIHI9IjQ3MC4xNiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLW1pdGVybGltaXQ9IjAiIHN0cm9rZS13aWR0aD0iMCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjk5NjA5IDAgMCAuOTk2MDkgMTQuNDgzIDMuODgwNykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iMjQuMDQ1Ij4KICAgIDxwYXRoIGQ9Im03MDguMjggNTEyLjA4YzAtNS45ODE2LTQuNDE5Mi05LjQzMDgtOS44NDI0LTcuNzE3MWwtMzczLjA4IDExOC4zNGMtNS40MzQgMS43MjQ2LTkuODQyNCA3Ljk3OS05Ljg0MjQgMTMuOTV2MTIwLjk1YzAgNS45ODE2IDQuNDA4MyA5LjQ0MTcgOS44NDI0IDcuNzE3MWwzNzMuMDgtMTE4LjMzYzUuNDIzMS0xLjcyNDYgOS44NDI0LTcuOTc5IDkuODQyNC0xMy45NjF6Ii8+CiAgICA8cGF0aCBkPSJtMzE1LjUyIDUwOC45YzAgNS45ODEyIDQuNDA3NyAxMi4yMzUgOS44NDEgMTMuOTZsMzczLjA5IDExOC4zNWM1LjQzMzMgMS43MjQ1IDkuODQxLTEuNzM1NCA5Ljg0MS03LjcwNTd2LTEyMC45NmMwLTUuOTcwMy00LjQwNzctMTIuMjI0LTkuODQxLTEzLjk0OWwtMzczLjA5LTExOC4zNWMtNS40MzMzLTEuNzI0NS05Ljg0MSAxLjcyNDUtOS44NDEgNy43MDU3eiIvPgogICAgPHBhdGggZD0ibTcwOC4yOCAyNjMuODRjMC01Ljk4MTYtNC40MTkyLTkuNDQxNy05Ljg0MjQtNy43MTcxbC0zNzMuMDggMTE4LjMzYy01LjQzNCAxLjcyNDYtOS44NDI0IDcuOTc5MS05Ljg0MjQgMTMuOTYxdjEyMC45NWMwIDUuOTgxNiA0LjQwODMgOS40MzA4IDkuODQyNCA3LjcxNzFsMzczLjA4LTExOC4zNGM1LjQyMzEtMS43MjQ2IDkuODQyNC03Ljk3OSA5Ljg0MjQtMTMuOTV6Ii8+CiAgIDwvZz4KICA8L2c+CiAgPGcgc3Ryb2tlLXdpZHRoPSIyMy45NTEiPgogICA8cGF0aCBkPSJtNzIwIDUwNGMwLTUuOTU4Mi00LjQwMi05LjM5NC05LjgwMzktNy42ODY5bC0zNzEuNjMgMTE3Ljg4Yy01LjQxMjggMS43MTc5LTkuODAzOSA3Ljk0NzktOS44MDM5IDEzLjg5NXYxMjAuNDhjMCA1Ljk1ODIgNC4zOTExIDkuNDA0OCA5LjgwMzkgNy42ODdsMzcxLjYzLTExNy44N2M1LjQwMTktMS43MTc5IDkuODAzOS03Ljk0NzkgOS44MDM5LTEzLjkwNnoiIGZpbGw9InVybCgjc3VibGltZS1pY29uLWIpIi8+CiAgIDxwYXRoIGQ9Im0zMjguNzcgNTAwLjgzYzAgNS45NTc4IDQuMzkwNSAxMi4xODcgOS44MDI2IDEzLjkwNWwzNzEuNjMgMTE3Ljg4YzUuNDEyIDEuNzE3OCA5LjgwMjYtMS43Mjg2IDkuODAyNi03LjY3NTZ2LTEyMC40OGMwLTUuOTQ3LTQuMzkwNS0xMi4xNzctOS44MDI2LTEzLjg5NGwtMzcxLjYzLTExNy44OGMtNS40MTItMS43MTc4LTkuODAyNiAxLjcxNzgtOS44MDI2IDcuNjc1NnoiIGZpbGw9IiNmZjk4MDAiLz4KICAgPHBhdGggZD0ibTcyMCAyNTYuNzNjMC01Ljk1ODItNC40MDItOS40MDQ4LTkuODAzOS03LjY4N2wtMzcxLjYzIDExNy44N2MtNS40MTI4IDEuNzE3OS05LjgwMzkgNy45NDc5LTkuODAzOSAxMy45MDZ2MTIwLjQ4YzAgNS45NTgyIDQuMzkxMSA5LjM5NCA5LjgwMzkgNy42ODdsMzcxLjYzLTExNy44OGM1LjQwMTktMS43MTc5IDkuODAzOS03Ljk0NzkgOS44MDM5LTEzLjg5NXoiIGZpbGw9IiNmZjk4MDAiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"sublime-text,ide,code,sublime-text\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"sublime_text.desktop\"\nLABEL oc.launch=\"sublime_text.Sublime_text\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"sublime-Text\"\nLABEL oc.displayname=\"sublime-Text\"\nLABEL oc.path=\"/opt/sublime_text/sublime_text\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"sublime-Text\"\nENV APPBIN \"/opt/sublime_text/sublime_text\"\nENV APP \"/opt/sublime_text/sublime_text\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/sublime-text/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/sublime-text/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application sublime-Text

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sublime-Text.d\n
"},{"location":"applications/sublime-text/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f sublime-Text.d -t sublime-Text .\n
"},{"location":"applications/sublime-text/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect sublime-Text > sublime-Text.json\ndocker image save sublime-Text -o sublime-Text.tar\nctr -n k8s.io images import sublime-Text.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sublime-Text.json\n\n
"},{"location":"applications/sudoku/","title":"sudoku","text":""},{"location":"applications/sudoku/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/sudoku/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/sudoku/#alpine-packages","title":"Alpine packages","text":"
gnome-sudoku\n
"},{"location":"applications/sudoku/#path","title":"Path","text":"
/usr/bin/gnome-sudoku\n
"},{"location":"applications/sudoku/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/sudoku/#wm_class","title":"WM_CLASS","text":"
org.gnome.Sudoku.org.gnome.Sudoku\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/sudoku/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Sudoku.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/sudoku/#json-dump","title":"JSON dump","text":"

json source file sudoku.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"gnome-sudoku\",\n    \"icon\": \"org.gnome.Sudoku.svg\",\n    \"keyword\": \"sudoku\",\n    \"launch\": \"org.gnome.Sudoku.org.gnome.Sudoku\",\n    \"name\": \"sudoku\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-sudoku\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Sudoku.desktop\"\n}\n
"},{"location":"applications/sudoku/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output sudoku.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sudoku.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sudoku.d.3.0.json\n\n
"},{"location":"applications/sudoku/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-sudoku\nLABEL oc.icon=\"org.gnome.Sudoku.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjMxLjIyMiIgeDI9IjMxLjYyOCIgeTE9IjYxLjE0NyIgeTI9IjIuODUzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzlhOWE5YSIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0ic2lsdmVyIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjMxLjY0MSIgeDI9IjMyLjE2OCIgeTE9IjYxLjMzOSIgeTI9IjMuODEyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2VmYjUyOCIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2U2OWM3NiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzMS43MjIiIHgyPSIzMi4yNzgiIHkxPSI2Mi44NzMiIHkyPSIuNzQzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2ZmZiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48ZmlsdGVyIGlkPSJhIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNC4xNiIvPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImQiIHg9Ii0uMTUzIiB5PSItLjA5OCIgd2lkdGg9IjEuMzA2IiBoZWlnaHQ9IjEuMTk2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii4zNiIvPjwvZmlsdGVyPjwvZGVmcz48cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0NiAtLjU0NikiIGQ9Ik05MjkuODUgMjg5LjY1Yy0yLjM1LTQuMzUtNC45NS05LTcuNjUtMTMuNi0yMC4zLTM0LjUtNDUuOC02Ny4yLTc2LjM1LTk3Ljc1Qzc3My4yNSAxMDUuNyA2ODguNyA2MS42NSA1OTIuMiA0Ni4yNWMtMTYuMjUtMi42LTMyLjgtNC40LTUwLjA1LTUuMzUtOS43LS41NS0xOS44NS0uODUtMzAuMS0uODUtOS4zNSAwLTE4LjYuMjUtMjcuOS43NS0xMTguMzUgNi4xLTIyMC4zIDUxLjk1LTMwNS44NSAxMzcuNS0yMC41IDIwLjUtMzguNzUgNDEuOTUtNTQuNyA2NC40LTE1LjM1IDIxLjU1LTI4LjU1IDQ0LTM5LjYgNjcuMmwtLjAyNS0uMDI1UTQwLjA1IDQwMS44NzMgNDAuMDUgNTEyLjA1NWMwIDEzMC4zNSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjggNTYuNyA1Ni42NSAxMjAuNTUgOTUuOSAxOTEuMSAxMTcuNTUgMzYuNzUgMTEuMjUgNzQuOCAxNy44NSAxMTQuNzUgMTkuOTVoLjRjOC41LjQ1IDE2LjYuNyAyNC41LjdoM2MxMC4zIDAgMjAuNS0uMyAzMC4xLS44IDIuNS0uMTUgNC43NS0uMyA2Ljk1LS40NSAyMC4yLTEuNDUgMzkuOS00LjA1IDU4LjctNy43IDcuOTUtMS41NSAxNS44LTMuMyAyMy40LTUuMTUgODAuOC0yMC4zIDE1Mi4xNS02MS42IDIxNC42NS0xMjQuMSA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTguNDUtNDcuNjUgMjguNjUtOTguOCAzMC41NS0xNTMuNS4yLTYuMDUuMy0xMi4yNS4zLTE4LjV2LTNjLS4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTUuMDUtMTQuMjUtMTAuODUtMjguMjUtMTcuNDUtNDIuMTUtMS44NS0zLjgtMy43NS03LjY1LTUuNy0xMS41LTEuNDUtMi44NS0yLjk1LTUuNy00LjY1LTguOHoiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjYwIiByeD0iMzAiIHJ5PSIzMCIgZmlsbD0idXJsKCNiKSIvPjxyZWN0IHg9IjIxLjI4NiIgeT0iMjEuMjg2IiB3aWR0aD0iMjEuNDI5IiBoZWlnaHQ9IjIxLjQyOSIgcnk9IjAiIGZpbGw9InVybCgjYykiLz48ZyBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMjYuNjE2IDIxLjI2NnEwIC44NjQtLjQ5MiAxLjM4LS40OC41MDQtMS4yODQuNjcydi4wNDhxMS4wMi4xMiAxLjUyNC42NDguNTE2LjUyOC41MTYgMS4zOCAwIC43NTYtLjM0OCAxLjMzMnQtMS4wOC45cS0uNzIuMzI0LTEuODYuMzI0LS42NzIgMC0xLjI0OC0uMTA4LS41NzYtLjA5Ni0xLjEwNC0uMzZ2LS45ODRxLjU0LjI3NiAxLjE2NC40MnQxLjIuMTQ0cTEuMTUyIDAgMS42NTYtLjQ0NC41MTYtLjQ1Ni41MTYtMS4yNDggMC0uODA0LS42MzYtMS4xNTItLjYyNC0uMzYtMS43NjQtLjM2aC0uODI4di0uOWguODRxMS4wNTYgMCAxLjU5Ni0uNDQ0LjU1Mi0uNDQ0LjU1Mi0xLjE3NiAwLS42MjQtLjQyLS45Ni0uNDItLjM0OC0xLjE0LS4zNDgtLjY5NiAwLTEuMTg4LjIwNHQtLjk3Mi41MTZsLS41MjgtLjcycS40NTYtLjM2IDEuMTI4LS42MjQuNjg0LS4yNjQgMS41NDgtLjI2NCAxLjM0NCAwIDEuOTkyLjYuNjYuNi42NiAxLjUyNHoiIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjUxOTggMCAwIDEuNDU5NyAtNC41NjUgLTIuMzcpIi8+PHBhdGggZD0iTTM1Ljg4NiAyOC42NzJxMCAxLjI2LS43NDggMi4wMTQtLjczLjczNi0xLjk1Mi45OHYuMDcxcTEuNTUuMTc1IDIuMzE3Ljk0Ni43ODQuNzcuNzg0IDIuMDE0IDAgMS4xMDQtLjUzIDEuOTQ1dC0xLjY0IDEuMzEzcS0xLjA5NS40NzMtMi44MjcuNDczLTEuMDIyIDAtMS44OTctLjE1Ny0uODc1LS4xNC0xLjY3OC0uNTI2VjM2LjMxcS44Mi40MDMgMS43Ny42MTN0MS44MjMuMjFxMS43NSAwIDIuNTE3LS42NDguNzg0LS42NjYuNzg0LTEuODIyIDAtMS4xNzMtLjk2Ny0xLjY4MS0uOTQ4LS41MjYtMi42OC0uNTI2aC0xLjI1OXYtMS4zMTRoMS4yNzdxMS42MDUgMCAyLjQyNS0uNjQ4Ljg0LS42NDguODQtMS43MTYgMC0uOTExLS42NC0xLjQwMi0uNjM3LS41MDgtMS43MzItLjUwOC0xLjA1NyAwLTEuODA1LjI5OHQtMS40NzcuNzUzbC0uODAzLTEuMDVxLjY5My0uNTI2IDEuNzE0LS45MTEgMS4wNC0uMzg2IDIuMzUzLS4zODYgMi4wNDMgMCAzLjAyOC44NzYgMS4wMDMuODc2IDEuMDAzIDIuMjI1eiIvPjwvZz48cGF0aCBkPSJNMjEuMjg2IDMuOTkyQTI5LjkxMyAyOS45MTMgMCAwIDAgMy45OTIgMjEuMjg2aDE3LjI5NHptMjEuNDI5IDB2MTcuMjk0aDE3LjI5NEEyOS45MTMgMjkuOTEzIDAgMCAwIDQyLjcxNSAzLjk5MnpNMy45OTMgNDIuNzE0YTI5LjkxMyAyOS45MTMgMCAwIDAgMTcuMjk0IDE3LjI5NFY0Mi43MTR6bTM4LjcyMiAwdjE3LjI5NGEyOS45MTMgMjkuOTEzIDAgMCAwIDE3LjI5NC0xNy4yOTR6IiBmaWxsPSJ1cmwoI2UpIi8+PC9zdmc+\"\nLABEL oc.keyword=\"sudoku,sudoku\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Sudoku.desktop\"\nLABEL oc.launch=\"org.gnome.Sudoku.org.gnome.Sudoku\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"sudoku\"\nLABEL oc.displayname=\"sudoku\"\nLABEL oc.path=\"/usr/bin/gnome-sudoku\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"sudoku\"\nENV APPBIN \"/usr/bin/gnome-sudoku\"\nENV APP \"/usr/bin/gnome-sudoku\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/sudoku/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/sudoku/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application sudoku

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/sudoku.d\n
"},{"location":"applications/sudoku/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f sudoku.d -t sudoku .\n
"},{"location":"applications/sudoku/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect sudoku > sudoku.json\ndocker image save sudoku -o sudoku.tar\nctr -n k8s.io images import sudoku.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @sudoku.json\n\n
"},{"location":"applications/supertux2/","title":"supertux2","text":""},{"location":"applications/supertux2/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpinei.minimal

"},{"location":"applications/supertux2/#distribution","title":"Distribution","text":"

alpine

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/supertux2/#alpine-packages","title":"Alpine packages","text":"
supertux mesa-gl mesa-egl mesa-dri-gallium\n
"},{"location":"applications/supertux2/#displayname","title":"Displayname","text":"
supertux2\n
"},{"location":"applications/supertux2/#path","title":"Path","text":"
/usr/games/supertux2\n
"},{"location":"applications/supertux2/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/supertux2/#wm_class","title":"WM_CLASS","text":"
supertux2.supertux2\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/supertux2/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/supertux2.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/supertux2/#json-dump","title":"JSON dump","text":"

json source file supertux2.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"supertux mesa-gl mesa-egl mesa-dri-gallium\",\n    \"icon\": \"circle_supertux.svg\",\n    \"keyword\": \"supertux\",\n    \"launch\": \"supertux2.supertux2\",\n    \"name\": \"supertux2\",\n    \"displayname\": \"supertux2\",\n    \"path\": \"/usr/games/supertux2\",\n    \"template\": \"abcdesktopio/oc.template.alpinei.minimal\",\n    \"desktopfile\": \"/usr/share/applications/supertux2.desktop\"\n}\n
"},{"location":"applications/supertux2/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output supertux2.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/supertux2.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @supertux2.d.3.0.json\n\n
"},{"location":"applications/supertux2/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpinei.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update supertux mesa-gl mesa-egl mesa-dri-gallium\nLABEL oc.icon=\"circle_supertux.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iTXBsYXllciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjE2Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iLTIwLjU0MiIgeDI9Ii0yMy4wODUiIHkxPSI0MC44NTYiIHkyPSI0My4yOTciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTM2IDAgMCAxLjkxMzYgMTMwLjY3IDEyLjYwNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2E5YTlhOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNhOWE5YTkiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSItNTkuNjEyIiB4Mj0iLTQzLjc5MiIgeTE9IjUxLjE4NiIgeTI9IjUxLjE4NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjkxMzYgMCAwIDEuOTEzNiAxMzAuNjcgMTIuNjA3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZDcwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM5OTgxMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMjI4LjgxIiB4Mj0iMjI4LjgxIiB5MT0iNjExLjE4IiB5Mj0iNjE0LjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDMyNCAwIDAgMi4wMzI0IC0zODMuNzMgLTEyMTUuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9Ii00Ni4xMzUiIHgyPSItNDMuMjM0IiB5MT0iMjMuMTkiIHkyPSIyMi42NDUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS45MTM2IDAgMCAxLjkxMzYgMTMwLjY3IDEyLjYwNykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIzMjMyMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMzIzMjMiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImkiIHgxPSItMjMuNDY1IiB4Mj0iLTEyLjA3IiB5MT0iNDQuNTc4IiB5Mj0iNDQuNTc4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuOTEzNiAwIDAgMS45MTM2IDEzMC42NyAxMi42MDcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSItMjcuNjY1IiB4Mj0iLTI2LjE4NiIgeTE9IjI2LjY3IiB5Mj0iMzYuNjM2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuOTEzNiAwIDAgMS45MTM2IDEzMC41OSAxMy4zMjYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZGZkZmQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYTZhNmE2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjMyIiB4Mj0iMzIiIHkxPSIyIiB5Mj0iNjIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZkZmRmZCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkY2RjZGMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjIiIHkyPSI2MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguODMzMzMgMCAwIC44MzMzMyA1LjMzMzMgNS4zMzMyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYmJkZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzQ3YTZmZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA3MDE2NCIgeT0iLS4wNTI0MDgiIHdpZHRoPSIxLjE0MDMiIGhlaWdodD0iMS4xMDQ4IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyLjY5MzA1MSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjA2MzU1OSAwIDAgLjA2MzU1OSAtLjU0NTU1IC0uNTQ1NTUpIiBkPSJtOTI5Ljg1IDI4OS42NWMtMi4zNS00LjM1LTQuOTUtOS03LjY1LTEzLjYtMjAuMy0zNC41LTQ1LjgtNjcuMi03Ni4zNS05Ny43NS03Mi42LTcyLjYtMTU3LjE1LTExNi42NS0yNTMuNjUtMTMyLjA1LTE2LjI1LTIuNi0zMi44LTQuNC01MC4wNS01LjM1LTkuNy0wLjU1LTE5Ljg1LTAuODUtMzAuMS0wLjg1LTkuMzUgMC0xOC42IDAuMjUtMjcuOSAwLjc1LTExOC4zNSA2LjEtMjIwLjMgNTEuOTUtMzA1Ljg1IDEzNy41LTIwLjUgMjAuNS0zOC43NSA0MS45NS01NC43IDY0LjQtMTUuMzUgMjEuNTUtMjguNTUgNDQtMzkuNiA2Ny4ybC0wLjAyNS0wLjAyNXEtNDMuOTI1IDkxLjk5OC00My45MjUgMjAyLjE4YzAgMTMwLjM1IDQ2LjEgMjQxLjY1IDEzOC4yNSAzMzMuOCA1Ni43IDU2LjY1IDEyMC41NSA5NS45IDE5MS4xIDExNy41NSAzNi43NSAxMS4yNSA3NC44IDE3Ljg1IDExNC43NSAxOS45NWgwLjRjOC41IDAuNDUgMTYuNiAwLjcgMjQuNSAwLjdoM2MxMC4zIDAgMjAuNS0wLjMgMzAuMS0wLjggMi41LTAuMTUgNC43NS0wLjMgNi45NS0wLjQ1IDIwLjItMS40NSAzOS45LTQuMDUgNTguNy03LjcgNy45NS0xLjU1IDE1LjgtMy4zIDIzLjQtNS4xNSA4MC44LTIwLjMgMTUyLjE1LTYxLjYgMjE0LjY1LTEyNC4xIDQ4LjYtNDguNiA4NC40LTEwMi41IDEwNy4zNS0xNjEuOCAxOC40NS00Ny42NSAyOC42NS05OC44IDMwLjU1LTE1My41IDAuMi02LjA1IDAuMy0xMi4yNSAwLjMtMTguNXYtM2MtMC4yLTQwLjY1LTQuOTUtNzkuNS0xNC4zLTExNy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTEtMy40LTItNi44NS0zLjE1LTEwLjUtMS42LTUuMTUtMy40LTEwLjUtNS4zLTE1Ljg1LTUuMDUtMTQuMjUtMTAuODUtMjguMjUtMTcuNDUtNDIuMTUtMS44NS0zLjgtMy43NS03LjY1LTUuNy0xMS41LTEuNDUtMi44NS0yLjk1LTUuNy00LjY1LTguOHoiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY4MyIvPgogPHBhdGggZD0ibTU4LjU1NSAxNy44NjRjLTAuMTQ5MzYtMC4yNzY0OC0wLjMxNDYyLTAuNTcyMDMtMC40ODYyMy0wLjg2NDQxLTEuMjkwMy0yLjE5MjgtMi45MTEtNC4yNzEyLTQuODUyNy02LjIxMjktNC42MTQ0LTQuNjE0NC05Ljk4ODMtNy40MTQyLTE2LjEyMi04LjM5My0xLjAzMjgtMC4xNjUyNS0yLjA4NDctMC4yNzk2Ni0zLjE4MTEtMC4zNDAwNC0wLjYxNjUyLTAuMDM0OTU4LTEuMjYxNy0wLjA1NDAyNS0xLjkxMzEtMC4wNTQwMjUtMC41OTQyOCAwLTEuMTgyMiAwLjAxNTg5LTEuNzczMyAwLjA0NzY2OS03LjUyMjIgMC4zODc3MS0xNC4wMDIgMy4zMDE5LTE5LjQ0IDguNzM5NC0xLjMwMyAxLjMwMy0yLjQ2MjkgMi42NjYzLTMuNDc2NyA0LjA5MzItMC45NzU2MyAxLjM2OTctMS44MTQ2IDIuNzk2Ni0yLjUxNjkgNC4yNzEybC0wLjAwMTU5LTAuMDAxNnEtMi43OTE4IDUuODQ3My0yLjc5MTggMTIuODVjMCA4LjI4NDkgMi45MzAxIDE1LjM1OSA4Ljc4NzEgMjEuMjE2IDMuNjAzOCAzLjYwMDYgNy42NjIxIDYuMDk1MyAxMi4xNDYgNy40NzE0IDIuMzM1OCAwLjcxNTA0IDQuNzU0MiAxLjEzNDUgNy4yOTM0IDEuMjY4aDAuMDI1NDJjMC41NDAyNSAwLjAyODYgMS4wNTUxIDAuMDQ0NDkgMS41NTcyIDAuMDQ0NDloMC4xOTA2OGMwLjY1NDY2IDAgMS4zMDMtMC4wMTkwNyAxLjkxMzEtMC4wNTA4NSAwLjE1ODktMC4wMDk1IDAuMzAxOTEtMC4wMTkwNyAwLjQ0MTc0LTAuMDI4NiAxLjI4MzktMC4wOTIxNiAyLjUzNi0wLjI1NzQyIDMuNzMwOS0wLjQ4OTQxIDAuNTA1My0wLjA5ODUyIDEuMDA0Mi0wLjIwOTc1IDEuNDg3My0wLjMyNzMzIDUuMTM1Ni0xLjI5MDMgOS42NzA1LTMuOTE1MiAxMy42NDMtNy44ODc3IDMuMDg5LTMuMDg5IDUuMzY0NC02LjUxNDggNi44MjMxLTEwLjI4NCAxLjE3MjctMy4wMjg2IDEuODIxLTYuMjc5NyAxLjk0MTctOS43NTYzIDAuMDEyNzEtMC4zODQ1MyAwLjAxOTA3LTAuNzc4NiAwLjAxOTA3LTEuMTc1OHYtMC4xOTA2OGMtMC4wMTI3MS0yLjU4MzctMC4zMTQ2Mi01LjA1My0wLjkwODktNy40MzY0LTAuMDY5OTEtMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDMtMC4yMzE5OS0wLjg2NDQxLTAuMDYzNTYtMC4yMTYxLTAuMTI3MTItMC40MzUzOC0wLjIwMDIxLTAuNjY3MzctMC4xMDE3LTAuMzI3MzMtMC4yMTYxLTAuNjY3MzctMC4zMzY4Ni0xLjAwNzQtMC4zMjA5Ny0wLjkwNTcyLTAuNjg5NjItMS43OTU1LTEuMTA5MS0yLjY3OS0wLjExNzU4LTAuMjQxNTItMC4yMzgzNS0wLjQ4NjIzLTAuMzYyMjktMC43MzA5My0wLjA5MjE2LTAuMTgxMTQtMC4xODc1LTAuMzYyMjktMC4yOTU1NS0wLjU1OTMyeiIgZmlsbD0idXJsKCNjKSIgc3Ryb2tlLXdpZHRoPSIuOTk2OCIvPgogPHBhdGggZD0ibTU0LjEyOSAyMC4yMmMtMC4xMjQ0Ny0wLjIzMDQtMC4yNjIxOC0wLjQ3NjctMC40MDUxOS0wLjcyMDM0LTEuMDc1Mi0xLjgyNzMtMi40MjU4LTMuNTU5My00LjA0NC01LjE3NzQtMy44NDUzLTMuODQ1My04LjMyMzYtNi4xNzg1LTEzLjQzNS02Ljk5NDItMC44NjA3LTAuMTM3NzEtMS43MzczLTAuMjMzMDUtMi42NTEtMC4yODMzNy0wLjUxMzc3LTAuMDI5MTMxLTEuMDUxNC0wLjA0NTAyMS0xLjU5NDMtMC4wNDUwMjEtMC40OTUyMyAwLTAuOTg1MTcgMC4wMTMyNDEtMS40Nzc4IDAuMDM5NzI0LTYuMjY4NSAwLjMyMzA5LTExLjY2OCAyLjc1MTYtMTYuMiA3LjI4MjgtMS4wODU4IDEuMDg1OC0yLjA1MjQgMi4yMjE5LTIuODk3MiAzLjQxMS0wLjgxMzAzIDEuMTQxNC0xLjUxMjIgMi4zMzA1LTIuMDk3NSAzLjU1OTNsLTAuMDAxMzMtMC4wMDEzcS0yLjMyNjUgNC44NzI4LTIuMzI2NSAxMC43MDljMCA2LjkwNDEgMi40NDE3IDEyLjc5OSA3LjMyMjYgMTcuNjggMy4wMDMyIDMuMDAwNSA2LjM4NTEgNS4wNzk0IDEwLjEyMiA2LjIyNjIgMS45NDY1IDAuNTk1ODcgMy45NjE5IDAuOTQ1NDUgNi4wNzc5IDEuMDU2N2gwLjAyMTE4YzAuNDUwMjEgMC4wMjM4MyAwLjg3OTI0IDAuMDM3MDggMS4yOTc3IDAuMDM3MDhoMC4xNTg5YzAuNTQ1NTUgMCAxLjA4NTgtMC4wMTU4OSAxLjU5NDMtMC4wNDIzOCAwLjEzMjQyLTAuMDA3OSAwLjI1MTU5LTAuMDE1ODkgMC4zNjgxMS0wLjAyMzgzIDEuMDY5OS0wLjA3NjggMi4xMTMzLTAuMjE0NTEgMy4xMDkxLTAuNDA3ODQgMC40MjEwOC0wLjA4MjEgMC44MzY4Ni0wLjE3NDc5IDEuMjM5NC0wLjI3Mjc4IDQuMjc5Ny0xLjA3NTIgOC4wNTg4LTMuMjYyNyAxMS4zNjktNi41NzMxIDIuNTc0Mi0yLjU3NDIgNC40NzAzLTUuNDI5IDUuNjg1OS04LjU2OTkgMC45NzcyMi0yLjUyMzggMS41MTc1LTUuMjMzMSAxLjYxODEtOC4xMzAzIDAuMDEwNTktMC4zMjA0NCAwLjAxNTg5LTAuNjQ4ODMgMC4wMTU4OS0wLjk3OTg3di0wLjE1ODljLTAuMDEwNTktMi4xNTMxLTAuMjYyMTgtNC4yMTA4LTAuNzU3NDItNi4xOTctMC4wNTgyNi0wLjIzMDQtMC4xMjQ0Ny0wLjQ3NjctMC4xOTMzMy0wLjcyMDM0LTAuMDUyOTctMC4xODAwOC0wLjEwNTkzLTAuMzYyODItMC4xNjY4NC0wLjU1NjE0LTAuMDg0NzUtMC4yNzI3OC0wLjE4MDA4LTAuNTU2MTQtMC4yODA3Mi0wLjgzOTUxLTAuMjY3NDgtMC43NTQ3Ny0wLjU3NDY4LTEuNDk2My0wLjkyNDI2LTIuMjMyNS0wLjA5Nzk5LTAuMjAxMjctMC4xOTg2Mi0wLjQwNTE5LTAuMzAxOTEtMC42MDkxMS0wLjA3NjgtMC4xNTA5NS0wLjE1NjI1LTAuMzAxOTEtMC4yNDYyOS0wLjQ2NjF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTY4Ii8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMzE4OTEgMCAwIC4zMTg5MSAxMS4zNjEgMTEuODMpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjMuMTM1NiI+CiAgPHBhdGggZD0ibTY3LjcxMSA3NS41NjIgMjcuMTA1IDE3Ljg4OS0zLjk0NzIgOS40NTI2cy0yMi40NTctMTguMDEtMjMuMTU4LTI3LjM0MnoiLz4KICA8cGF0aCBkPSJtNzAuOTIyIDQ0LjUyMmMxMC4xMTktNi45MDg1IDI1LjAzOC0xOC43NTYgMjYuNjYxLTI0LjEzMSAxLjU1NjgtNS4xNTcgNy45Nzg4LTQuMTg0IDYuNTE5MiAxLjY1NDEtMS40NTk1IDUuODM4MS05LjQzODMgMjguODk5LTIxLjk5IDQ0LjI3MiIvPgogIDxwYXRoIGQ9Im0xOS43NDEgOTYuNzc0YzUuNzI3Ni0xLjY4MjcgOC45MzEyLTguMjg3IDEzLjEyMy0xMi40MjIgNy41OTcyIDYuOTczOSA0Ny4xNTIgMjAuMzgyIDI2LjU5MiAyMC43MjQtMTAuNTY1LTAuNjA4MzctMTYuNzEyIDUuMTI4OS0yMi40NjggOS44MDg5eiIvPgogIDxwYXRoIGQ9Im02My45MjYgMS4zOTM2Yy0xNC45OTkgMC4yNzUyMS0xOS45NTMgMTEuNjk3LTE5Ljk1MyAxNy4zMzggMCA1LjY0MTggMS44NTI4IDE3LjM2OS0yLjY4ODIgMjUuMDc1LTMgNS4wOTA5LTEyLjUwNiAxNy4xNTYtMTUuMjAxIDI4LjQ1NC0yLjY5MTggMTEuMjg0LTAuNTg5OCAzNS4wOSAzMC42ODYgMzUuNjQgMzIuMiAwLjU2NjcgMjkuOTg3IDcuNDQ2MiAyOS45ODcgNy40NDYybDExLjQyNi0yMS44MjdjLTIuOTg3NC0xLjQyNzYtNy41NTktMy41OTI4LTcuMzY5My0zLjk5NDkgNS43NDIzLTEyLjE3My05LjYzMDUtMzQuODA0LTEyLjUyLTQzLjYxMS0yLjg4OTctOC44MDY4IDAuNTA3MjYtMTAuOTg1IDIuODQ2Ni0xNi4zNTIgMi4zMzkzLTUuMzY2NiAzLjI4ODctMjguMTY5LTE3LjIxNS0yOC4xNjl6Ii8+CiAgPHBhdGggZD0ibTIxLjY4MSA5Ny4xNjdjLTIuODMzOC0yLjI2NjMtNS4yNjY4IDAuODcyMTItMy41NzA4IDMuODkwNCAxLjY5NTkgMy4wMTgzIDE2LjE2MyAxNy41NCAyMC4zMTggMjIuMTE3IDQuMTU1NCA0LjU3NyAxMS4zODktMi4xMDU2IDQuODU5NC01Ljg3MjctNi41My0zLjc2NzItMTguNzczLTE3Ljg2OS0yMS42MDctMjAuMTM1eiIvPgogIDxwYXRoIGQ9Im0yNS41NTkgODQuNDg2YzEuMTc3OCA0LjUxNDctNC4zNjI0IDkuOTI3NS03LjMyMDggMTIuNzEzLTMuODQ4IDMuNjIzIDAuMDk4MTQgNS41OTQzIDEuMzc0IDUuNDk2MiAxLjI3NTktMC4wOTggMTAuNzYyLTMuNTI4MyAxOC4xMjMgMC41OTM4MiIvPgogIDxwYXRoIGQ9Im03My4xMzEgMTEuMzM5Yy00LjMwNDctMC4wNDkwOC03LjMwNzQgNC44NDI5LTUuMDU4MyAxMC42IDEuMjg5MSAzLjI5OTkgOS43NjU4IDMuMTE4NyAxMC4zMDQtMC4zMTk4NSAwLjkxNzgyLTUuODY0My0wLjk4NzM3LTEwLjIzMi01LjI0NTYtMTAuMjh6Ii8+CiAgPHBhdGggZD0ibTcyLjc2MSAxNy4yOTFhMy4wMzgzIDMuNjg1OCAwIDAgMSA0LjI5MTEtMC4wMDc5IDMuMDM4MyAzLjY4NTggMCAwIDEgMC4wMTcyIDUuMjA1NSAzLjAzODMgMy42ODU4IDAgMCAxLTQuMjkxIDAuMDM0NjEgMy4wMzgzIDMuNjg1OCAwIDAgMS0wLjAzOTk2LTUuMjA1MyIvPgogIDxwYXRoIGQ9Im04MS40NjMgMzMuMDM2YzIuNzIyIDAuMDkwNjYgMTguODczLTMuMDg0OSAxOS4wNTQtNS4zNTMzIDAuMTgxNS0yLjI2ODMtMTEuMzQyLTMuMzU3MS0xMy42MS00LjM1NTItMi4yNjgzLTAuOTk4MDgtMTMuMjkzLTMuOTQxOS0xMy4xNTYgMy40NDc5IDAuMTM2NzkgNy4zODk3IDQuOTkwMyA2LjE2OTkgNy43MTIzIDYuMjYwNnoiLz4KICA8cGF0aCBkPSJtNzcuMzI0IDI4LjgwMmM1Ljc0MTMgMS4yNDY4IDEyLjcwMyAxLjY2ODQgMTYuNTUzIDEuMDI2NSIgc3Ryb2tlPSIjYWU5MzAwIiBzdHJva2Utd2lkdGg9IjMuMTg2NSIvPgogIDxwYXRoIGQ9Im04MS40NjMgMzMuMDM2YzIuNzIyIDAuMDkwNjYgMTguODczLTMuMDg0OSAxOS4wNTQtNS4zNTMzIDAuMTgxNS0yLjI2ODMtMTEuMzQyLTMuMzU3MS0xMy42MS00LjM1NTItMi4yNjgzLTAuOTk4MDgtMTMuMjkzLTMuOTQxOS0xMy4xNTYgMy40NDc5IDAuMTM2NzkgNy4zODk3IDQuOTkwMyA2LjE2OTkgNy43MTIzIDYuMjYwNnoiLz4KICA8cGF0aCBkPSJtNDUuODM2IDQwLjE2OGMtMTMuNTEyIDExLjQ0Mi0zNC43MjkgMzguNzktMzAuNDg1IDQxLjQ1IDMuNjYwMyAyLjI5MzQgMjUuNDc1LTE2LjYyMSAzNC43LTE4LjU1Ii8+CiAgPHBhdGggZD0ibTQwLjU1MyA0NS4xNjJjLTguNTU2NyA5LjA2NjctMjAuNzczIDIzLjQ2MS0yNC42MjUgMzEuMjY0LTMuODAyNCA2LjAxNzkgMC41OTYzMiA4LjI2MzQgNS43NTI1IDMuMzI2MiA3LjAwMzEtMy44NjY5IDE3LjUtMTMuMDQ0IDI0LjM4MS0xNC40ODMiLz4KICA8cGF0aCBkPSJtOTguNjQgODMuNjYxYzAuMzgxOTctNS40NTI2IDguMDE4Ni02LjM1ODYgNy45NzAyIDAuMzEyNjYtMC4wNTUxIDcuNTg3OS0xMC4zMzEgMjUuOTQ3LTE0LjIgMzAuNTMyLTMuNzI4NCA0LjQxODEtNy40MzE1IDAuOTYyNzQtNC44MTYyLTMuMzAyNiAyLjYxNDEtNC4yNjM0IDEwLjUzMS0yMC4xOSAxMS4wNDYtMjcuNTQyeiIvPgogIDxwYXRoIGQ9Im03OS42MDMgNTMuMTE3Yy0yLjU5MjctMS4xNDk4LTMuNTA4IDUuNTYzOS01LjY2MzQgOC43MDA2LTIuNTk2NyAzLjc3ODktNS4wOTg1IDcuNDE2NS0zLjE4NyAxMy4zOTJsMTkuNzU1IDEzLjcxMmMyLjU0NzYtMTAuMDI3LTQuMjgzOC0yNC42MjctMTAuOTA1LTM1LjgwNXoiLz4KICA8cGF0aCBkPSJtNzQuMTMzIDE2Ljk3YTEuMDM1NSAwLjY1OTExIDAgMCAxIDEuNDYyNC0wLjAwMTIgMS4wMzU1IDAuNjU5MTEgMCAwIDEgMC4wMDU4IDAuOTMwODggMS4wMzU1IDAuNjU5MTEgMCAwIDEtMS40NjI0IDAuMDA2MiAxLjAzNTUgMC42NTkxMSAwIDAgMS0wLjAxMzYtMC45MzA4NSIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjMxODkxIDAgMCAuMzE4OTEgMTEuMzYxIDExLjgzKSIgc3Ryb2tlLXdpZHRoPSIzLjEzNTYiPgogIDxwYXRoIGQ9Im02Ny43MTEgNzUuNTYyIDI3LjEwNSAxNy44ODktMy45NDcyIDkuNDUyNnMtMjIuNDU3LTE4LjAxLTIzLjE1OC0yNy4zNDJ6IiBmaWxsPSJ1cmwoI2YpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNzAuOTIyIDQ0LjUyMmMxMC4xMTktNi45MDg1IDI1LjAzOC0xOC43NTYgMjYuNjYxLTI0LjEzMSAxLjU1NjgtNS4xNTcgNy45Nzg4LTQuMTg0IDYuNTE5MiAxLjY1NDEtMS40NTk1IDUuODM4MS05LjQzODMgMjguODk5LTIxLjk5IDQ0LjI3MiIgZmlsbD0iIzE4MTgxOCIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTE5Ljc0MSA5Ni43NzRjNS43Mjc2LTEuNjgyNyA4LjkzMTItOC4yODcgMTMuMTIzLTEyLjQyMiA3LjU5NzIgNi45NzM5IDQ3LjE1MiAyMC4zODIgMjYuNTkyIDIwLjcyNC0xMC41NjUtMC42MDgzNy0xNi43MTIgNS4xMjg5LTIyLjQ2OCA5LjgwODl6IiBmaWxsPSIjMTgxODE4IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNjMuOTI2IDEuMzkzNmMtMTQuOTk5IDAuMjc1MjEtMTkuOTUzIDExLjY5Ny0xOS45NTMgMTcuMzM4IDAgNS42NDE4IDEuODUyOCAxNy4zNjktMi42ODgyIDI1LjA3NS0zIDUuMDkwOS0xMi41MDYgMTcuMTU2LTE1LjIwMSAyOC40NTQtMi42OTE4IDExLjI4NC0wLjU4OTggMzUuMDkgMzAuNjg2IDM1LjY0IDMyLjIgMC41NjY3IDI5Ljk4NyA3LjQ0NjIgMjkuOTg3IDcuNDQ2MmwxMS40MjYtMjEuODI3Yy0yLjk4NzQtMS40Mjc2LTcuNTU5LTMuNTkyOC03LjM2OTMtMy45OTQ5IDUuNzQyMy0xMi4xNzMtOS42MzA1LTM0LjgwNC0xMi41Mi00My42MTEtMi44ODk3LTguODA2OCAwLjUwNzI2LTEwLjk4NSAyLjg0NjYtMTYuMzUyIDIuMzM5My01LjM2NjYgMy4yODg3LTI4LjE2OS0xNy4yMTUtMjguMTY5eiIgZmlsbD0iIzIzMjMyMyIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTIxLjY4MSA5Ny4xNjdjLTIuODMzOC0yLjI2NjMtNS4yNjY4IDAuODcyMTItMy41NzA4IDMuODkwNCAxLjY5NTkgMy4wMTgzIDE2LjE2MyAxNy41NCAyMC4zMTggMjIuMTE3IDQuMTU1NCA0LjU3NyAxMS4zODktMi4xMDU2IDQuODU5NC01Ljg3MjctNi41My0zLjc2NzItMTguNzczLTE3Ljg2OS0yMS42MDctMjAuMTM1eiIgZmlsbD0idXJsKCNoKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTI1LjU1OSA4NC40ODZjMS4xNzc4IDQuNTE0Ny00LjM2MjQgOS45Mjc1LTcuMzIwOCAxMi43MTMtMy44NDggMy42MjMgMC4wOTgxNCA1LjU5NDMgMS4zNzQgNS40OTYyIDEuMjc1OS0wLjA5OCAxMC43NjItMy41MjgzIDE4LjEyMyAwLjU5MzgyIiBmaWxsPSIjMjMyMzIzIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KICA8cGF0aCBkPSJtNzMuMTMxIDExLjMzOWMtNC4zMDQ3LTAuMDQ5MDgtNy4zMDc0IDQuODQyOS01LjA1ODMgMTAuNiAxLjI4OTEgMy4yOTk5IDkuNzY1OCAzLjExODcgMTAuMzA0LTAuMzE5ODUgMC45MTc4Mi01Ljg2NDMtMC45ODczNy0xMC4yMzItNS4yNDU2LTEwLjI4eiIgZmlsbD0iI2ZkZmRmZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTcyLjc2MSAxNy4yOTFhMy4wMzgzIDMuNjg1OCAwIDAgMSA0LjI5MTEtMC4wMDc5IDMuMDM4MyAzLjY4NTggMCAwIDEgMC4wMTcyIDUuMjA1NSAzLjAzODMgMy42ODU4IDAgMCAxLTQuMjkxIDAuMDM0NjEgMy4wMzgzIDMuNjg1OCAwIDAgMS0wLjAzOTk2LTUuMjA1MyIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTgxLjQ2MyAzMy4wMzZjMi43MjIgMC4wOTA2NiAxOC44NzMtMy4wODQ5IDE5LjA1NC01LjM1MzMgMC4xODE1LTIuMjY4My0xMS4zNDItMy4zNTcxLTEzLjYxLTQuMzU1Mi0yLjI2ODMtMC45OTgwOC0xMy4yOTMtMy45NDE5LTEzLjE1NiAzLjQ0NzkgMC4xMzY3OSA3LjM4OTcgNC45OTAzIDYuMTY5OSA3LjcxMjMgNi4yNjA2eiIgZmlsbD0idXJsKCNlKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc3LjMyNCAyOC44MDJjNS43NDEzIDEuMjQ2OCAxMi43MDMgMS42Njg0IDE2LjU1MyAxLjAyNjUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FlOTMwMCIgc3Ryb2tlLXdpZHRoPSIuNjI3MTMiLz4KICA8cGF0aCBkPSJtODEuNDYzIDMzLjAzNmMyLjcyMiAwLjA5MDY2IDE4Ljg3My0zLjA4NDkgMTkuMDU0LTUuMzUzMyAwLjE4MTUtMi4yNjgzLTExLjM0Mi0zLjM1NzEtMTMuNjEtNC4zNTUyLTIuMjY4My0wLjk5ODA4LTEzLjI5My0zLjk0MTktMTMuMTU2IDMuNDQ3OSAwLjEzNjc5IDcuMzg5NyA0Ljk5MDMgNi4xNjk5IDcuNzEyMyA2LjI2MDZ6IiBmaWxsPSJub25lIi8+CiAgPHBhdGggZD0ibTQ1LjgzNiA0MC4xNjhjLTEzLjUxMiAxMS40NDItMzQuNzI5IDM4Ljc5LTMwLjQ4NSA0MS40NSAzLjY2MDMgMi4yOTM0IDI1LjQ3NS0xNi42MjEgMzQuNy0xOC41NSIgZmlsbD0idXJsKCNqKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTQwLjU1MyA0NS4xNjJjLTguNTU2NyA5LjA2NjctMjAuNzczIDIzLjQ2MS0yNC42MjUgMzEuMjY0LTMuODAyNCA2LjAxNzkgMC41OTYzMiA4LjI2MzQgNS43NTI1IDMuMzI2MiA3LjAwMzEtMy44NjY5IDE3LjUtMTMuMDQ0IDI0LjM4MS0xNC40ODMiIGZpbGw9Im5vbmUiLz4KICA8cGF0aCBkPSJtOTguNjQgODMuNjYxYzAuMzgxOTctNS40NTI2IDguMDE4Ni02LjM1ODYgNy45NzAyIDAuMzEyNjYtMC4wNTUxIDcuNTg3OS0xMC4zMzEgMjUuOTQ3LTE0LjIgMzAuNTMyLTMuNzI4NCA0LjQxODEtNy40MzE1IDAuOTYyNzQtNC44MTYyLTMuMzAyNiAyLjYxNDEtNC4yNjM0IDEwLjUzMS0yMC4xOSAxMS4wNDYtMjcuNTQyeiIgZmlsbD0idXJsKCNpKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc5LjYwMyA1My4xMTdjLTIuNTkyNy0xLjE0OTgtMy41MDggNS41NjM5LTUuNjYzNCA4LjcwMDYtMi41OTY3IDMuNzc4OS01LjA5ODUgNy40MTY1LTMuMTg3IDEzLjM5MmwxOS43NTUgMTMuNzEyYzIuNTQ3Ni0xMC4wMjctNC4yODM4LTI0LjYyNy0xMC45MDUtMzUuODA1eiIgZmlsbD0idXJsKCNnKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggZD0ibTc0LjEzMyAxNi45N2ExLjAzNTUgMC42NTkxMSAwIDAgMSAxLjQ2MjQtMC4wMDEyIDEuMDM1NSAwLjY1OTExIDAgMCAxIDAuMDA1OCAwLjkzMDg4IDEuMDM1NSAwLjY1OTExIDAgMCAxLTEuNDYyNCAwLjAwNjIgMS4wMzU1IDAuNjU5MTEgMCAwIDEtMC4wMTM2LTAuOTMwODUiIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"supertux2,supertux\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"supertux2.desktop\"\nLABEL oc.launch=\"supertux2.supertux2\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpinei.minimal\"\nLABEL oc.name=\"supertux2\"\nLABEL oc.displayname=\"supertux2\"\nLABEL oc.path=\"/usr/games/supertux2\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"supertux2\"\nENV APPBIN \"/usr/games/supertux2\"\nENV APP \"/usr/games/supertux2\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/supertux2/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/supertux2/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application supertux2

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/supertux2.d\n
"},{"location":"applications/supertux2/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f supertux2.d -t supertux2 .\n
"},{"location":"applications/supertux2/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect supertux2 > supertux2.json\ndocker image save supertux2 -o supertux2.tar\nctr -n k8s.io images import supertux2.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @supertux2.json\n\n
"},{"location":"applications/swell-foop/","title":"swell-foop","text":""},{"location":"applications/swell-foop/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/swell-foop/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/swell-foop/#ubuntu-packages","title":"Ubuntu packages","text":"
swell-foop\n
"},{"location":"applications/swell-foop/#displayname","title":"Displayname","text":"
swell-foop\n
"},{"location":"applications/swell-foop/#path","title":"Path","text":"
/usr/games/swell-foop\n
"},{"location":"applications/swell-foop/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/swell-foop/#wm_class","title":"WM_CLASS","text":"
swell-foop.Swell-foop\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/swell-foop/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.SwellFoop.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/swell-foop/#json-dump","title":"JSON dump","text":"

json source file swell-foop.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"swell-foop\",\n    \"icon\": \"circle_swell-foop.svg\",\n    \"keyword\": \"swell,foop\",\n    \"launch\": \"swell-foop.Swell-foop\",\n    \"name\": \"swell-foop\",\n    \"displayname\": \"swell-foop\",\n    \"path\": \"/usr/games/swell-foop\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.SwellFoop.desktop\"\n}\n
"},{"location":"applications/swell-foop/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output swell-foop.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/swell-foop.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @swell-foop.d.3.0.json\n\n
"},{"location":"applications/swell-foop/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends swell-foop && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_swell-foop.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNjhiMGUzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY4ODRlMyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMzQzNzQ5Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMzIiIHgyPSIzMiIgeTE9IjIiIHkyPSI2MiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMWQyMTIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMzkzZSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIxOC4wMDIiIHgyPSIxOC4wMDIiIHkxPSIxMiIgeTI9IjI0LjAwMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMzAuMDA0IiB4Mj0iMzAuMDA0IiB5MT0iMTIiIHkyPSIyNC4wMDMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9IjMwLjAwNCIgeDI9IjMwLjAwNCIgeTE9IjI0IiB5Mj0iMzUuOTk5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIxOC4wMDIiIHgyPSIxOC4wMDIiIHkxPSIyNCIgeTI9IjM1Ljk5OSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWVlZTRjIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZjA2ZiIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJoIiB4PSItLjA1OTk5NSIgeT0iLS4wNjAwMDUiIHdpZHRoPSIxLjEyIiBoZWlnaHQ9IjEuMTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzgyNjQxMjkiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxjaXJjbGUgdHJhbnNmb3JtPSJtYXRyaXgoLjA2Mjc0NSAwIDAgLjA2Mjc0NSAtLjEyNTQ5IC0uMTI1NDkpIiBjeD0iNTEyIiBjeT0iNTEyIiByPSI0NzguMTIiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjkzOCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsPSJ1cmwoI2IpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIG1hcmtlcnMgZmlsbCIvPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuODEzNiAxMS4wNjgpIiBmaWx0ZXI9InVybCgjaCkiIG9wYWNpdHk9Ii41Ij4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyA4LjUwOTIgLTEwLjM3MikiPgogICA8Zz4KICAgIDxnPgogICAgIDxwYXRoIGQ9Im0yNi40MDIgMTJoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0xNC4zOTggMTJoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0yNi40MDIgMjRoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgIDxwYXRoIGQ9Im0xNC4zOTggMjRoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIvPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuODEzNiAxMS4wNjgpIj4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMwNDMgMCAwIDEuMzA0MyA4LjUwOTIgLTEwLjM3MikiPgogICA8Zz4KICAgIDxwYXRoIGQ9Im0yNi40MDIgMTJoNy4yMDNjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwN2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwM2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDdjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIgZmlsbD0idXJsKCNlKSIvPgogICAgPHBhdGggZD0ibTE0LjM5OCAxMmg3LjIwN2MxLjMyNCAwIDIuMzk4IDEuMDc0IDIuMzk4IDIuMzk4djcuMjA3YzAgMS4zMjQtMS4wNzQgMi4zOTgtMi4zOTggMi4zOThoLTcuMjA3Yy0xLjMyNCAwLTIuMzk4LTEuMDc0LTIuMzk4LTIuMzk4di03LjIwN2MwLTEuMzI0IDEuMDc0LTIuMzk4IDIuMzk4LTIuMzk4IiBmaWxsPSJ1cmwoI2YpIi8+CiAgICA8cGF0aCBkPSJtMjYuNDAyIDI0aDcuMjAzYzEuMzI0IDAgMi4zOTggMS4wNzQgMi4zOTggMi4zOTh2Ny4yMDNjMCAxLjMyNC0xLjA3NCAyLjM5OC0yLjM5OCAyLjM5OGgtNy4yMDNjLTEuMzI0IDAtMi4zOTgtMS4wNzQtMi4zOTgtMi4zOTh2LTcuMjAzYzAtMS4zMjQgMS4wNzQtMi4zOTggMi4zOTgtMi4zOTgiIGZpbGw9InVybCgjZCkiLz4KICAgIDxwYXRoIGQ9Im0xNC4zOTggMjRoNy4yMDdjMS4zMjQgMCAyLjM5OCAxLjA3NCAyLjM5OCAyLjM5OHY3LjIwM2MwIDEuMzI0LTEuMDc0IDIuMzk4LTIuMzk4IDIuMzk4aC03LjIwN2MtMS4zMjQgMC0yLjM5OC0xLjA3NC0yLjM5OC0yLjM5OHYtNy4yMDNjMC0xLjMyNCAxLjA3NC0yLjM5OCAyLjM5OC0yLjM5OCIgZmlsbD0idXJsKCNjKSIvPgogICA8L2c+CiAgPC9nPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"swell-foop,swell,foop\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.SwellFoop.desktop\"\nLABEL oc.launch=\"swell-foop.Swell-foop\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"swell-foop\"\nLABEL oc.displayname=\"swell-foop\"\nLABEL oc.path=\"/usr/games/swell-foop\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"swell-foop\"\nENV APPBIN \"/usr/games/swell-foop\"\nENV APP \"/usr/games/swell-foop\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/swell-foop/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/swell-foop/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application swell-foop

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/swell-foop.d\n
"},{"location":"applications/swell-foop/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f swell-foop.d -t swell-foop .\n
"},{"location":"applications/swell-foop/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect swell-foop > swell-foop.json\ndocker image save swell-foop -o swell-foop.tar\nctr -n k8s.io images import swell-foop.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @swell-foop.json\n\n
"},{"location":"applications/taquin/","title":"taquin","text":""},{"location":"applications/taquin/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/taquin/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/taquin/#alpine-packages","title":"Alpine packages","text":"
gnome-taquin\n
"},{"location":"applications/taquin/#path","title":"Path","text":"
/usr/bin/gnome-taquin\n
"},{"location":"applications/taquin/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/taquin/#wm_class","title":"WM_CLASS","text":"
org.gnome.Taquin.org.gnome.Weather\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/taquin/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Taquin.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/taquin/#json-dump","title":"JSON dump","text":"

json source file taquin.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"gnome-taquin\",\n    \"icon\": \"org.gnome.Taquin.svg\",\n    \"keyword\": \"taquin\",\n    \"launch\": \"org.gnome.Taquin.org.gnome.Weather\",\n    \"name\": \"taquin\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-taquin\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Taquin.desktop\"\n}\n
"},{"location":"applications/taquin/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output taquin.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/taquin.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @taquin.d.3.0.json\n\n
"},{"location":"applications/taquin/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-taquin\nLABEL oc.icon=\"org.gnome.Taquin.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSI+PHN0b3Agc3RvcC1jb2xvcj0iI2ZkZmNmYiIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iI2YxZjBlZiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSI0OCIgeDI9IjQ2NCIgeTE9IjQ0IiB5Mj0iNDQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQuOTIzIDI1LjY1NSkgc2NhbGUoLjE0NDIzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNiYWJkYjYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNmY1ZjQiIG9mZnNldD0iLjA0MiIvPjxzdG9wIHN0b3AtY29sb3I9IiNkNWQzY2YiIG9mZnNldD0iLjA4MyIvPjxzdG9wIHN0b3AtY29sb3I9IiNkZWRkZGEiIG9mZnNldD0iLjkxNSIvPjxzdG9wIHN0b3AtY29sb3I9IiNlYmVhZTgiIG9mZnNldD0iLjk0NCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmNmY1ZjQiIG9mZnNldD0iLjk4NSIvPjxzdG9wIHN0b3AtY29sb3I9IiNiYWJkYjYiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iMzIuNTc3IiB4Mj0iMzIuNTc3IiB5MT0iMiIgeTI9IjU3Ljk2MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIC4wMDEpIHNjYWxlKC45OTk5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjUyLjE4MyIgeDI9IjUyLjE4MyIgeTE9IjMuODIiIHkyPSI1Ny45NjEiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAuMDAxKSBzY2FsZSguOTk5OTgpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz48bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIxMi4zODUiIHgyPSIxMi4zODUiIHkxPSIzLjQxNCIgeTI9IjU3LjE0MSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIC4wMDEpIHNjYWxlKC45OTk5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPjxmaWx0ZXIgaWQ9ImIiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ii44OSIvPjwvZmlsdGVyPjwvZGVmcz48cmVjdCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzg5LjMyIC00ODkuOTIpIHNjYWxlKDEuMDExNSkiIHg9IjM4Ni44NSIgeT0iNDg2LjMxIiB3aWR0aD0iNTkuMzE1IiBoZWlnaHQ9IjU5LjMxNSIgcnk9IjI5LjY1NyIgZmlsdGVyPSJ1cmwoI2IpIiBvcGFjaXR5PSIuMjUiLz48cGF0aCBkPSJNMjIuNzY5IDQxLjIzNGgxOS42MTV2MTguNDYxSDIyLjc2OXoiIGZpbGw9IiNkZWRkZGEiLz48Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMCIgZmlsbD0iI2M1YzRjMSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz48cGF0aCBkPSJNMzEuODU1IDJhMzAgMzAgMCAwIDAtOS4wODYgMS40NTV2NTcuMDgyYzIuOS45MyA1Ljk5MiAxLjQzOCA5LjIxIDEuNDM4aC4wMDFjMy42NiAwIDcuMTY1LS42NSAxMC40MDItMS44NFYzLjg1NUEzMCAzMCAwIDAgMCAzMiAyYTMwIDMwIDAgMCAwLS4xNDQgMHoiIGZpbGw9InVybCgjYykiLz48cGF0aCBkPSJNNDIuMzg0IDQxLjIzdjE4LjQ2MWgxLjEyNWEyOS45NDQgMjkuOTQ0IDAgMCAwIDE3LjAyLTE4LjQ2MXoiIGZpbGw9InVybCgjZCkiLz48cGF0aCBkPSJNNDIuMzg1IDMuODU2djU2LjI3NmEzMi4wMDIgMzIuMDAyIDAgMCAwIDMuODk3LTEuNzUgMzAgMzAgMCAwIDAgLjAwNy0uMDAzIDMwIDMwIDAgMCAwIC4yMTMtLjExOGMuMjUtLjEzNC40OTctLjI4Ni43NDYtLjQyN0EzMCAzMCAwIDAgMCA2MiAzMiAzMCAzMCAwIDAgMCA0Mi4zODUgMy44NTV6IiBmaWxsPSJ1cmwoI2UpIi8+PHBhdGggZD0iTTU1Ljc2NSAxMy42NjNhMjIuMDQ4IDIyLjA0OCAwIDAgMC00LjMzMiA2Ljc5OWgzLjc2NGExOC40NzkgMTguNDc5IDAgMCAxIDIuNTU4LTMuODczIDI5LjkwOSAyOS45MDkgMCAwIDAtMS45OS0yLjkyNnoiIGZpbGw9IiMxYTVmYjQiLz48cGF0aCBkPSJNMy40MTYgMjIuNzcxQTMwLjEwNCAzMC4xMDQgMCAwIDAgMiAzMS4yODF2MS4zOTRBMzAuMTYgMzAuMTYgMCAwIDAgMy4wODQgNDBIMjIuNzdWMjIuNzdIMy40MTZ6IiBvcGFjaXR5PSIuMTUiLz48cGF0aCBkPSJNMjIuNzY5IDMuNDE1QTI5LjkyIDI5LjkyIDAgMCAwIDIgMzEuMjh2MS4zOTVjLjA0OSAyLjE0OC4zMiA0LjIzOC43OTMgNi4yNUgyMi43N1YzLjQxNHoiIGZpbGw9InVybCgjZikiLz48cGF0aCBkPSJNMjIuNzY5IDEwLjcyOHYzLjk0N2EyNC4zMjIgMjQuMzIyIDAgMCAwIDEwLjQyIDIuMzI2IDI0LjM5OCAyNC4zOTggMCAwIDAgOS4xOTUtMS43ODV2LTMuODIyYTIwLjU1OCAyMC41NTggMCAwIDEtOS4xOTUgMi4xNDZjLTMuODMzIDAtNy40MDItMS4wMzItMTAuNDItMi44MTJ6bTAgMTYuMTUydjMuODIyYTE4LjQ3NiAxOC40NzYgMCAwIDEgNy45NTcgOC4yNGgzLjc2MUEyMi4wNDUgMjIuMDQ1IDAgMCAwIDIyLjc2OCAyNi44OHptMzAuMDM0LjUwNmMtMy43NDUgMC03LjI4Mi44NDItMTAuNDIgMi4zMjZ2My45NDdjMy4wMTctMS43OCA2LjU4Ni0yLjgxMiAxMC40Mi0yLjgxMiAzLjMwOCAwIDYuNDIuNzcgOS4xNSAyLjEyNS4wMS0uMzMxLjAyNi0uNjYxLjAyNi0uOTk0IDAtLjk2Ni0uMDUtMS45Mi0uMTQtMi44NjJhMjQuMzk4IDI0LjM5OCAwIDAgMC05LjAzNi0xLjczem0tLjg3MyAxMS41NDdhMjIuMDYgMjIuMDYgMCAwIDAgNi4xNzQgNy44MjggMjkuODA4IDI5LjgwOCAwIDAgMCAxLjU1OC0zLjE3NCAxOC40ODMgMTguNDgzIDAgMCAxLTMuODUxLTQuNjU0SDUxLjkzeiIgZmlsbD0iIzFhNWZiNCIvPjxwYXRoIGQ9Ik00LjUxIDE5Ljg4NmMtLjA4NS4xOTItLjE3LjM4Mi0uMjUuNTc2SDU5LjdjLS4wOC0uMTk0LS4xNjYtLjM4NC0uMjUtLjU3NnoiIGZpbGwtb3BhY2l0eT0iLjA4MSIvPjxwYXRoIGQ9Ik0xMC4zNDggMjAuNDY1YTE5LjY2IDE5LjY2IDAgMCAxIDEuOTczIDguNjE1IDE5LjYzIDE5LjYzIDAgMCAxLTIuNjMxIDkuODQ2aDQuMTRhMjMuMjMzIDIzLjIzMyAwIDAgMCAyLjE4NC05Ljg0NmMwLTIuOTUtLjU2MS01Ljg3NC0xLjY1NC04LjYxNWgtNC4wMTJ6bTI2LjMwNSAxOC40NjFDMzUuNTYgNDEuNjY2IDM0LjMwOCA0NSAzNC4zMDkgNTBjMCA1LjU5IDEuNDc4IDguNTczIDMuNzUyIDExLjM4MWEzMCAzMCAwIDAgMCAzLjM2NS0uOUMzOS4zOTggNTcuOTEgMzguMDAxIDU1IDM4LjAwMSA1MGMwLTUgMS40MDItOC40NzQgMi42NjYtMTEuMDc0aC00LjAxNHoiIGZpbGw9IiMxYTVmYjQiLz48cGF0aCBkPSJNMjMuMzQ2IDMuMjc1YTMwIDMwIDAgMCAwLS41NzYuMTh2NTcuMDgyYy4xOTIuMDYyLjM4My4xMjQuNTc2LjE4MlYzLjI3NnoiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjk1MyIgb3BhY2l0eT0iLjUiLz48cGF0aCBkPSJNMjIuNzY5IDMuNDE1Yy0uMTk0LjA2My0uMzg2LjEzLS41NzguMTk2djM1LjMxM2guNTc4VjMuNDE0eiIgZmlsbC1vcGFjaXR5PSIuMDgxIi8+PHBhdGggZD0iTTQyLjM4NSAzLjg1NnY1Ni4yODZhMzAgMzAgMCAwIDAgLjU3Ni0uMjE2VjQuMDc2YTMwIDMwIDAgMCAwLS41NzYtLjIyMXoiIGZpbGw9IiNmZmYiIG9wYWNpdHk9Ii41Ii8+PHBhdGggZD0iTTQxLjgwOSAzLjY1djU2LjY4MmMuMTkyLS4wNjYuMzg2LS4xMjkuNTc2LS4xOTlWMy44NTZhMzAgMzAgMCAwIDAtLjU3Ni0uMjA1eiIgb3BhY2l0eT0iLjEiLz48cGF0aCBkPSJNNC4yNiAyMC40NjJjLS4wOC4xOTEtLjE1Mi4zODUtLjIyNy41NzhoNTUuODk1Yy0uMDc1LS4xOTMtLjE1LS4zODctLjIyOC0uNTc4SDQuMjZ6bTE4LjUxIDE4LjQ2M3YuNTc2aDM4LjI2N2MuMDQ4LS4xOS4wODctLjM4NC4xMzItLjU3NkgyMi43N3oiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iLjU1NSIvPjxwYXRoIGQ9Ik0yLjY2IDM4LjM0NmMuMDQyLjE5NC4wODguMzg2LjEzMy41NzhoNTguMzc2Yy4wNDUtLjE5Mi4wOTEtLjM4NC4xMzMtLjU3OEgyLjY2eiIgZmlsbC1vcGFjaXR5PSIuMDgxIi8+PC9zdmc+\"\nLABEL oc.keyword=\"taquin,taquin\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"org.gnome.Taquin.desktop\"\nLABEL oc.launch=\"org.gnome.Taquin.org.gnome.Weather\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"taquin\"\nLABEL oc.displayname=\"taquin\"\nLABEL oc.path=\"/usr/bin/gnome-taquin\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"taquin\"\nENV APPBIN \"/usr/bin/gnome-taquin\"\nENV APP \"/usr/bin/gnome-taquin\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/taquin/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/taquin/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application taquin

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/taquin.d\n
"},{"location":"applications/taquin/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f taquin.d -t taquin .\n
"},{"location":"applications/taquin/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect taquin > taquin.json\ndocker image save taquin -o taquin.tar\nctr -n k8s.io images import taquin.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @taquin.json\n\n
"},{"location":"applications/teams/","title":"teams","text":""},{"location":"applications/teams/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/teams/#arguments","title":"Arguments","text":"

\"--disable-namespace-sandbox --disable-setuid-sandbox\"

"},{"location":"applications/teams/#displayname","title":"Displayname","text":"
Microsoft Teams\n
"},{"location":"applications/teams/#path","title":"Path","text":"
/usr/bin/teams\n
"},{"location":"applications/teams/#mimetype","title":"Mimetype","text":"
x-scheme-handler/msteams;\n
"},{"location":"applications/teams/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/teams/#wm_class","title":"WM_CLASS","text":"
microsoft teams - preview.Microsoft Teams - Preview\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/teams/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/teams.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/teams/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/teams/#json-dump","title":"JSON dump","text":"

json source file teams.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"\",\n    \"preruncommands\": [\n        \"RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\\\" > /etc/apt/sources.list.d/teams.list\",\n        \"RUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ],\n    \"icon\": \"teams.svg\",\n    \"keyword\": \"teams\",\n    \"launch\": \"microsoft teams - preview.Microsoft Teams - Preview\",\n    \"name\": \"teams\",\n    \"displayname\": \"Microsoft Teams\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/teams\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"args\": \"--disable-namespace-sandbox --disable-setuid-sandbox\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"x-scheme-handler/msteams;\",\n    \"desktopfile\": \"/usr/share/applications/teams.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/teams/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output teams.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/teams.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @teams.d.3.0.json\n\n
"},{"location":"applications/teams/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/ms-teams stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y teams && apt-get clean && rm -rf /var/lib/apt/lists/*\nLABEL oc.icon=\"teams.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjEyOCAxNjAgNzY4IDcwNCI+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSItLjIiIHkxPSItLjIiIHgyPSIuOCIgeTI9Ii44Ij4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNWE2MmM0Ii8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzM5NDBhYiIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGNsaXBQYXRoIGlkPSJjIj4KCQkJPHBhdGggZmlsbD0iI2ZmZiIgZD0iTTY4NCA0MzJINTEydi00OS4xNDNBMTEyIDExMiAwIDEgMCA0MTYgMjcyYTExMS41NTYgMTExLjU1NiAwIDAgMCAxMC43ODUgNDhIMTYwYTMyLjA5NCAzMi4wOTQgMCAwIDAtMzIgMzJ2MzIwYTMyLjA5NCAzMi4wOTQgMCAwIDAgMzIgMzJoMTc4LjY3YzE1LjIzNiA5MC44IDk0LjIgMTYwIDE4OS4zMyAxNjAgMTA2LjAzOSAwIDE5Mi04NS45NjEgMTkyLTE5MlY0NjhhMzYgMzYgMCAwIDAtMzYtMzZ6Ii8+CgkJPC9jbGlwUGF0aD4KCTwvZGVmcz4KCTxwYXRoIGZpbGw9IiM1MDU5YzkiIGQ9Ik02OTIgNDMyaDE2OGEzNiAzNiAwIDAgMSAzNiAzNnYxNjRhMTIwIDEyMCAwIDAgMS0xMjAgMTIwIDEyMCAxMjAgMCAwIDEtMTIwLTEyMFY0NjhhMzYgMzYgMCAwIDEgMzYtMzZ6Ii8+Cgk8Y2lyY2xlIGZpbGw9IiM1MDU5YzkiIGN4PSI3NzYiIGN5PSIzMDQiIHI9IjgwIi8+Cgk8cGF0aCBmaWxsPSIjN2I4M2ViIiBkPSJNMzcyIDQzMmgzMTJhMzYgMzYgMCAwIDEgMzYgMzZ2MjA0YTE5MiAxOTIgMCAwIDEtMTkyIDE5MiAxOTIgMTkyIDAgMCAxLTE5Mi0xOTJWNDY4YTM2IDM2IDAgMCAxIDM2LTM2eiIvPgoJPGNpcmNsZSBmaWxsPSIjN2I4M2ViIiBjeD0iNTI4IiBjeT0iMjcyIiByPSIxMTIiLz4KCTxnIGNsaXAtcGF0aD0idXJsKCNjKSI+CgkJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzIgLTI0KSBzY2FsZSAoNS45MDc3KSI+CgkJCTxwYXRoIG9wYWNpdHk9Ii4wNSIgZD0iTTg1IDYzdjU5LjYyYTUuMzgyIDUuMzgyIDAgMCAxLTUuMzggNS4zOEg0NS4yNWMtLjMtLjMzLS41OS0uNjYtLjg3LTFzLS41Ni0uNjYtLjgzLTEtLjUzLS42Ni0uNzktMS0uNTEtLjY2LS43Ni0xYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyYy4wNi0uMDguMTItLjE3LjE3LS4yNXMuMTItLjE3LjE5LS4yNS4xMi0uMTcuMTgtLjI1YTIuMzQ4IDIuMzQ4IDAgMCAxIC4xOS0uMjVoMzcuNjFjMi45NyAwIDUuMzggMy4wMyA1LjM4IDZ6IiBzdHlsZT0iJiMxMDsiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjA3NSIgZD0iTTg0LjI1IDYzLjF2NTguNTJhNS4zIDUuMyAwIDAgMS01LjI5IDUuMzhINDQuMzhjLS4yOS0uMzMtLjU2LS42Ni0uODMtMXMtLjUzLS42Ni0uNzktMS0uNTEtLjY2LS43Ni0xYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyYy4wNi0uMDguMTItLjE3LjE3LS4yNXMuMTItLjE3LjE5LS4yNS4xMi0uMTcuMTgtLjI1aDM3LjA1YzIuOTcgMCA1LjM4IDIuODcgNS4zOCA1Ljg1eiIvPgoJCQk8cGF0aCBvcGFjaXR5PSIuMSIgZD0iTTgzLjUgNjMuMTl2NTcuNDNhNS4yMjMgNS4yMjMgMCAwIDEtNS4xOSA1LjM4SDQzLjU1Yy0uMjctLjMzLS41My0uNjYtLjc5LTFzLS41MS0uNjYtLjc2LTFhNTYuMjU5IDU2LjI1OSAwIDAgMS0xMS0zMy41VjkwYTU2LjI1OSA1Ni4yNTkgMCAwIDEgMTAuMjgtMzJjLjA2LS4wOC4xMi0uMTcuMTctLjI1cy4xMi0uMTcuMTktLjI1aDM2LjQ4YTUuNjU1IDUuNjU1IDAgMCAxIDUuMzggNS42OXoiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjEyNSIgZD0iTTgyLjc1IDYzLjI4djU2LjM0YTUuMTQ0IDUuMTQ0IDAgMCAxLTUuMSA1LjM4SDQyLjc2Yy0uMjYtLjMzLS41MS0uNjYtLjc2LTFhNTYuMjU5IDU2LjI1OSAwIDAgMS0xMS0zMy41VjkwYTU2LjI1OSA1Ni4yNTkgMCAwIDEgMTAuMjgtMzJjLjA2LS4wOC4xMi0uMTcuMTctLjI1aDM1LjkyYTUuNTEyIDUuNTEyIDAgMCAxIDUuMzggNS41M3oiLz4KCQkJPHBhdGggb3BhY2l0eT0iLjIiIGQ9Ik04MiA2My4zOHY1NS4yNGE1LjA3IDUuMDcgMCAwIDEtNSA1LjM4SDQyYTU2LjI1OSA1Ni4yNTkgMCAwIDEtMTEtMzMuNVY5MGE1Ni4yNTkgNTYuMjU5IDAgMCAxIDEwLjI4LTMyaDM1LjM0QTUuMzgyIDUuMzgyIDAgMCAxIDgyIDYzLjM4eiIvPgoJCTwvZz4KCTwvZz4KCTxyZWN0IGZpbGw9InVybCgjZykiIHg9IjEyOCIgeT0iMzIwIiB3aWR0aD0iMzg0IiBoZWlnaHQ9IjM4NCIgcng9IjMyIiByeT0iMzIiLz4KCTxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0zOTkuMzY1IDQ0NS44NTVoLTYwLjI5M3YxNjQuMmgtMzguNDE4di0xNjQuMmgtNjAuMDJWNDE0aDE1OC43M3oiLz4KPC9zdmc+\"\nLABEL oc.keyword=\"teams,teams\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"teams.desktop\"\nLABEL oc.launch=\"microsoft teams - preview.Microsoft Teams - Preview\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--disable-namespace-sandbox --disable-setuid-sandbox\"\nLABEL oc.name=\"teams\"\nLABEL oc.displayname=\"Microsoft Teams\"\nLABEL oc.path=\"/usr/bin/teams\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/msteams;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"teams\"\nENV APPBIN \"/usr/bin/teams\"\nLABEL oc.args=\"--disable-namespace-sandbox --disable-setuid-sandbox\"\nENV APP \"/usr/bin/teams\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/teams/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/teams/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application teams

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/teams.d\n
"},{"location":"applications/teams/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f teams.d -t teams .\n
"},{"location":"applications/teams/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect teams > teams.json\ndocker image save teams -o teams.tar\nctr -n k8s.io images import teams.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @teams.json\n\n
"},{"location":"applications/terminal/","title":"Terminal","text":""},{"location":"applications/terminal/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.20.04

"},{"location":"applications/terminal/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/terminal/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\n
"},{"location":"applications/terminal/#arguments","title":"Arguments","text":"

\"--disable-factory\"

"},{"location":"applications/terminal/#displayname","title":"Displayname","text":"
Terminal sudo\n
"},{"location":"applications/terminal/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/terminal/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/terminal/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/terminal/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.Gnome-terminal\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/terminal/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/terminal/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\n
"},{"location":"applications/terminal/#json-dump","title":"JSON dump","text":"

json source file terminal.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"terminal,bash,shell,cmd,admin,ftp,telnet,netcat,sshfs,curl,wget,git,ssh\",\n    \"launch\": \"gnome-terminal-server.Gnome-terminal\",\n    \"name\": \"Terminal\",\n    \"displayname\": \"Terminal sudo\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"args\": \"--disable-factory\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.20.04\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\",\n    \"abcdesktop_release\": 3,\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\",\n        \"RUN mkdir -p /run/user\",\n        \"RUN chmod 777 /run/user\"\n    ]\n}\n
"},{"location":"applications/terminal/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output terminal.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminal.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminal.d.3.0.json\n\n
"},{"location":"applications/terminal/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.20.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-terminal sudo openssh-client telnet netcat sshcommand sshfs ftp-ssl wput curl wget tftp ncftp git git-ftp ftp dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminal,terminal,bash,shell,cmd,admin,ftp,telnet,netcat,sshfs,curl,wget,git,ssh\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.Gnome-terminal\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.20.04\"\nENV ARGS=\"--disable-factory\"\nLABEL oc.name=\"Terminal\"\nLABEL oc.displayname=\"Terminal sudo\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.showinview=\"dock\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Terminal\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory\"\nENV APP \"/usr/bin/gnome-terminal\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nRUN mkdir -p /run/user\nRUN chmod 777 /run/user\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/terminal/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminal/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Terminal

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Terminal.d\n
"},{"location":"applications/terminal/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Terminal.d -t Terminal .\n
"},{"location":"applications/terminal/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Terminal > Terminal.json\ndocker image save Terminal -o Terminal.tar\nctr -n k8s.io images import Terminal.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Terminal.json\n\n
"},{"location":"applications/terminalai/","title":"terminalai","text":""},{"location":"applications/terminalai/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.gtk.fulldev.ia

"},{"location":"applications/terminalai/#use-ubuntu-package","title":"use ubuntu package","text":"

gnome-terminal dbus-x11

"},{"location":"applications/terminalai/#arguments","title":"Arguments","text":"

\"--disable-factory --class=terminalai\"

"},{"location":"applications/terminalai/#display-name","title":"Display name","text":"

\"Shell AI\"

"},{"location":"applications/terminalai/#path","title":"path","text":"

\"/usr/bin/gnome-terminal\"

"},{"location":"applications/terminalephemeral/","title":"terminalephemeral","text":""},{"location":"applications/terminalephemeral/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/terminalephemeral/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/terminalephemeral/#ubuntu-packages","title":"Ubuntu packages","text":"
at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils\n
"},{"location":"applications/terminalephemeral/#arguments","title":"Arguments","text":"

\"--disable-factory --class=ephemeral\"

"},{"location":"applications/terminalephemeral/#displayname","title":"Displayname","text":"
Terminal [ephemeral container]\n
"},{"location":"applications/terminalephemeral/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/terminalephemeral/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/terminalephemeral/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.ephemeral\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/terminalephemeral/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/terminalephemeral/#json-dump","title":"JSON dump","text":"

json source file terminalephemeral.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"ephemeral,terminal,shell\",\n    \"launch\": \"gnome-terminal-server.ephemeral\",\n    \"name\": \"terminalephemeral\",\n    \"displayname\": \"Terminal [ephemeral container]\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false,\n        \"ipc_mode\": false\n    },\n    \"args\": \"--disable-factory --class=ephemeral\",\n    \"containerengine\": \"ephemeral_container\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\"\n}\n
"},{"location":"applications/terminalephemeral/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output terminalephemeral.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalephemeral.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalephemeral.d.3.0.json\n\n
"},{"location":"applications/terminalephemeral/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends at-spi2-core gnome-terminal dbus-x11 pulseaudio-utils && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminalephemeral,ephemeral,terminal,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.ephemeral\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=ephemeral\"\nLABEL oc.name=\"terminalephemeral\"\nLABEL oc.displayname=\"Terminal [ephemeral container]\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"terminalephemeral\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=ephemeral\"\nENV APP \"/usr/bin/gnome-terminal\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/terminalephemeral/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminalephemeral/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application terminalephemeral

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalephemeral.d\n
"},{"location":"applications/terminalephemeral/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f terminalephemeral.d -t terminalephemeral .\n
"},{"location":"applications/terminalephemeral/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect terminalephemeral > terminalephemeral.json\ndocker image save terminalephemeral -o terminalephemeral.tar\nctr -n k8s.io images import terminalephemeral.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalephemeral.json\n\n
"},{"location":"applications/terminalpod/","title":"terminalpod","text":""},{"location":"applications/terminalpod/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/terminalpod/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/terminalpod/#ubuntu-packages","title":"Ubuntu packages","text":"
pulseaudio-utils at-spi2-core gnome-terminal dbus-x11\n
"},{"location":"applications/terminalpod/#arguments","title":"Arguments","text":"

\"--disable-factory --class=pod\"

"},{"location":"applications/terminalpod/#displayname","title":"Displayname","text":"
Terminal [Pod]\n
"},{"location":"applications/terminalpod/#path","title":"Path","text":"
/usr/bin/gnome-terminal\n
"},{"location":"applications/terminalpod/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/terminalpod/#wm_class","title":"WM_CLASS","text":"
gnome-terminal-server.pod\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/terminalpod/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Terminal.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/terminalpod/#json-dump","title":"JSON dump","text":"

json source file terminalpod.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"pulseaudio-utils at-spi2-core gnome-terminal dbus-x11\",\n    \"icon\": \"pantheon-terminal-icons.svg\",\n    \"keyword\": \"pod,terminal,shell\",\n    \"launch\": \"gnome-terminal-server.pod\",\n    \"name\": \"terminalpod\",\n    \"displayname\": \"Terminal [Pod]\",\n    \"path\": \"/usr/bin/gnome-terminal\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"256M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false,\n        \"ipc_mode\": false\n    },\n    \"args\": \"--disable-factory --class=pod\",\n    \"containerengine\": \"pod_application\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Terminal.desktop\"\n}\n
"},{"location":"applications/terminalpod/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output terminalpod.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalpod.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalpod.d.3.0.json\n\n
"},{"location":"applications/terminalpod/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends pulseaudio-utils at-spi2-core gnome-terminal dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"pantheon-terminal-icons.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHZlcnNpb249IjEuMSIKICAgd2lkdGg9IjEyOCIKICAgaGVpZ2h0PSIxMjgiCiAgIGlkPSJzdmc0MTEzIgogICB2aWV3Qm94PSIwIDAgMTMyLjcyIDEyNy4yMTkiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MTE1Ij4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjIwIgogICAgICAgeTE9IjI2LjAwMDAwOCIKICAgICAgIHgyPSIyMCIKICAgICAgIHkyPSIxMy4wMDAwMDgiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MDE1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNjM3NTQzMSwwLDAsMi42Mzc1NDMxLDEuMzc4MDE4NCwtNjEuMjAyMTU4KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4MC02LTYtNi0zLTctMS05Ij4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjgyLTQtNi0xLTMtNy03LTEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkY2RjZGM7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNjg0LTgtNS04LTAtMi02LTciCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMy45OTk5OSIKICAgICAgIHkxPSI0Ljk5OTk4OSIKICAgICAgIHgyPSIyMy45OTk5OSIKICAgICAgIHkyPSI0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxMzYiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzOTI0IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuNzI5NzI5OCwwLDAsMi43Mjk3Mjk4LC0xLjUxMzUxODQsLTYyLjUxMTY3OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM5MjQiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MjYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTI4IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZmZmO3N0b3Atb3BhY2l0eTowLjIzNTI5NDEyIgogICAgICAgICBvZmZzZXQ9IjAuMDYzMTY0NTUiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzkzMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC4xNTY4NjI3NSIKICAgICAgICAgb2Zmc2V0PSIwLjk1MDU2MzMxIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM5MzIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMzkyMTU2ODciCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGN4PSI3LjExODM1MzQiCiAgICAgICBjeT0iOS45NTcxMDc1IgogICAgICAgcj0iMTIuNjcxODc1IgogICAgICAgZng9IjcuMTE4MzUzNCIKICAgICAgIGZ5PSI5Ljk1NzEwNzUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQzOTM2LTMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDI0LjEzOTYyMiwtMjkuNjM1NzQ1LDAsMzYxLjI4MTE2LC0yNjguNzI2ODEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyODY3LTQ0OS04OC04NzEtMzkwLTU5OC00NzYtNTkxLTQzNC0xNDgtNTctMTc3LTgtMy0zLTYtNC04LTgtOC01LTctOCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzc1MC0xLTAtNy02LTYtMS0zLTktMy05LTIiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1MDUwNTA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzNzUyLTMtNy00LTAtMzItOC05MjMtMC03LTAtMyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzJiMmIyYjtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwLjI2MjM4IiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTQtMS04LTUtMi03LTYtNy0xLTktMS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMGEwYTBhO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNzA0OTUyIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM3NTYtMS02LTItNi02LTEtOTYtNi0wLTEtNyIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgY3g9IjQuOTkyOTc4NiIKICAgICAgIGN5PSI0My41IgogICAgICAgcj0iMi41IgogICAgICAgZng9IjQuOTkyOTc4NiIKICAgICAgIGZ5PSI0My41IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50NDA5MyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM2ODgtMTY2LTc0OS01IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDAzNzg0LDAsMCwxLjQsMjcuOTg4MTMsLTE3LjQpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNjg4LTE2Ni03NDktNSI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4My0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg4NS01IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iNC45OTI5Nzg2IgogICAgICAgY3k9IjQzLjUiCiAgICAgICByPSIyLjUiCiAgICAgICBmeD0iNC45OTI5Nzg2IgogICAgICAgZnk9IjQzLjUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MDk1IgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMDM3ODQsMCwwLDEuNCwtMjAuMDExODcsLTEwNC40KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzY4OC00NjQtMzA5LTgiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4ODktOSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIwIiAvPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDI4OTEtNCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzE4MTgxODtzdG9wLW9wYWNpdHk6MCIKICAgICAgICAgb2Zmc2V0PSIxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgeDE9IjI1LjA1ODA5NiIKICAgICAgIHkxPSI0Ny4wMjc3MjkiCiAgICAgICB4Mj0iMjUuMDU4MDk2IgogICAgICAgeTI9IjM5Ljk5OTQ0MyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQwOTciCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNzAyLTUwMS03NTctMCI+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5NS0wIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjAiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjg5Ny0yIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTgxODE4O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAuNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AyODk5LTYiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxODE4MTg7c3RvcC1vcGFjaXR5OjAiCiAgICAgICAgIG9mZnNldD0iMSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4MTEiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDM4MTMiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzODE1IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIgogICAgICAgICBvZmZzZXQ9IjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBjeD0iLTQuMDI4Nzc3MSIKICAgICAgIGN5PSI5My40Njc2MjgiCiAgICAgICByPSIzNS4zMzgxMzEiCiAgICAgICBmeD0iLTQuMDI4Nzc3MSIKICAgICAgIGZ5PSI5My40Njc2MjgiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ0MTExIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzgxMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjM5MjQsMCwwLDAuMTY5Nzg4MjcsNzAuMjcwMzU1LDM4LjEzMjEwMSkiIC8+CiAgPC9kZWZzPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxMTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw2NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMTksNTQuMDAxODEgYSA1NSw2IDAgMCAxIC0xMDkuOTk5OTk4MiwwIDU1LDYgMCAxIDEgMTA5Ljk5OTk5ODIsMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtjb2xvcjojMDAwMDAwO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQxMTEpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8ZwogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMi42OTk5OTg5LDAsMCwwLjU1NTU1NjA3LC0wLjgwMDAwODEyLDMwLjg5MDY5MSkiCiAgICAgICBpZD0iZzIwMzYiCiAgICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgogICAgICA8ZwogICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjA1MjYzMiwwLDAsMS4yODU3MTMsLTEuMjYzMTU4LC0xMy40Mjg1NCkiCiAgICAgICAgIGlkPSJnMzcxMiIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC40Ij4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgICB4PSIzOCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDI4MDEiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDQwOTMpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICAgaGVpZ2h0PSI3IgogICAgICAgICAgIHg9Ii0xMCIKICAgICAgICAgICB5PSItNDciCiAgICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgICAgaWQ9InJlY3QzNjk2IgogICAgICAgICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ0MDk1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSIyOCIKICAgICAgICAgICBoZWlnaHQ9IjcuMDAwMDAwNSIKICAgICAgICAgICB4PSIxMCIKICAgICAgICAgICB5PSI0MCIKICAgICAgICAgICBpZD0icmVjdDM3MDAiCiAgICAgICAgICAgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDQwOTcpO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMyIKICAgICAgIGhlaWdodD0iMTAzIgogICAgICAgcng9IjYuMDU0NTQwNiIKICAgICAgIHJ5PSI2LjA1NDU0MDYiCiAgICAgICB4PSIxMi40OTk5ODgiCiAgICAgICB5PSItNDguNDk4MTkyIgogICAgICAgaWQ9InJlY3Q1NTA1LTIxLTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk7Y29sb3I6IzAwMDAwMDtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQzOTM2LTMpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjk5OTk5OTk0O21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiIC8+CiAgICA8cmVjdAogICAgICAgd2lkdGg9IjEwMSIKICAgICAgIGhlaWdodD0iMTAxIgogICAgICAgcng9IjUiCiAgICAgICByeT0iNSIKICAgICAgIHg9IjEzLjQ5OTk4OCIKICAgICAgIHk9Ii00Ny40OTgxOTIiCiAgICAgICBpZD0icmVjdDY3NDEtNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuMztmaWxsOm5vbmU7c3Ryb2tlOnVybCgjbGluZWFyR3JhZGllbnQ0MTM2KTtzdHJva2Utd2lkdGg6MC45OTk5OTk5NDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowIiAvPgogICAgPHJlY3QKICAgICAgIHdpZHRoPSIxMDMiCiAgICAgICBoZWlnaHQ9IjEwMyIKICAgICAgIHJ4PSI2LjA1NDU0MDYiCiAgICAgICByeT0iNi4wNTQ1NDA2IgogICAgICAgeD0iMTIuNDk5OTg4IgogICAgICAgeT0iLTQ4LjQ5ODE5MiIKICAgICAgIGlkPSJyZWN0NTUwNS0yMS0zLTEiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjc7Y29sb3I6IzAwMDAwMDtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Ik0gMzUuODEyNSwtMjkgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAzNSwtMjggbCAwLDEuMzc1IGMgLTEuOTY5Nzg4LDAuMjgwOTExIC0zLjk3ODQyNywwLjgwMzE0IC01LjYyNSwyLjE1NjI1IC0wLjAxMjExLDAuMDA5NCAtMC4wMTkyMywwLjAyMTgyIC0wLjAzMTI1LDAuMDMxMjUgLTIuODcyMTIsMi4yNTQwMjEgLTMuMDY2ODQ0LDYuNTM0MTQyIC0wLjk2ODc1LDkuMjgxMjUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjAzMTI1LDAuMDMxMjUgYyAxLjc3MDYxNCwyLjE0ODMyOCA0LjI3NjU1MywzLjEyMDc5OCA2LjU5Mzc1LDQgbCAwLDMuNzUgQyAzMi43MzY5ODQsLTcuNjgwODc2NSAzMC40OTY3MzcsLTguMzA2NzY1MSAyOC40MDYyNSwtOS4yNSBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDI3LC04LjMxMjUgbCAwLDQuNzE4NzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAwLjU5Mzc1LDAuOTM3NSBDIDI5Ljk1MTY4NywtMS42NTU3MDM2IDMyLjQ3MjQ0NiwtMS4yMDczOTEyIDM1LC0xLjA2MjUgTCAzNSwyIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwxIGwgMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMSwtMSBsIDAsLTMuMjE4NzUgYyAxLjUzNDUyNSwtMC4xNzU1MzIgMy4yMDc4LC0wLjQ1MzQzMzEgNC42NTYyNSwtMS4yMTg3NSAwLjAwNzksLTAuMDAzODggMC4wMjMzNywwLjAwMzkgMC4wMzEyNSwwIDIuMzgxODY0LC0xLjE3OTk4OTQgNC4wNjQ3MTQsLTMuNjIzMDIzNyAzLjk2ODc1LC02LjMxMjUgOC4yZS01LC0wLjAxMDU2NSAtMi4zZS01LC0wLjAyMDY5MyAwLC0wLjAzMTI1IDAuMDAyOSwtMS4zMDU0MzUgLTAuNDM3MDQ0LC0yLjU0Njk2NiAtMS4xODc1LC0zLjU5Mzc1IEMgNDQuNjAwNzA5LC0xNC44Njc3MjggNDEuNDY4Njc4LC0xNS44NjYxMTEgMzksLTE2LjgxMjUgbCAwLC0zLjQwNjI1IGMgMS43MDg4NCwwLjIyMTUwOSAzLjU3MjkxMywwLjUxNTUzMSA1LjAzMTI1LDEuMDkzNzUgYSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCAxLjMxMjUsLTAuNTMxMjUgbCAxLjc1LC00LjE4NzUgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA0Ni41NjI1LC0yNS4xODc1IEMgNDQuMjMzMzgxLC0yNi4xODUzMDMgNDEuNTA5NjI1LC0yNi42MDY2MTkgMzksLTI2Ljc4MTI1IEwgMzksLTI4IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTEsLTEgbCAtMiwwIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHogTSAzNSwtMjAuMDYyNSAzNSwtMTguNzUgYyAtMC4wMjYsLTAuMDE3NTQgLTAuMDY5NjEsLTAuMDQ0ODUgLTAuMDkzNzUsLTAuMDYyNSAtMC4zNjIwNzMsLTAuMjY0NzY4IC0wLjQ0NzAyLC0wLjM5MzMzMiAtMC40Mzc1LC0wLjY1NjI1IGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgMCwtMC4wNjI1IGMgLTAuMDA4MSwtMC4yMDU3MjkgMC4wNTcxNSwtMC4yNzY1OTYgMC4zNzUsLTAuNDY4NzUgMC4wMzk2OSwtMC4wMjM5OSAwLjExMDM3MywtMC4wMzk4OCAwLjE1NjI1LC0wLjA2MjUgeiBtIDQsMTAuODQzNzUgYyAwLjEwNTQ5NSwwLjA0ODM5MyAwLjI1MjgzMiwwLjEwNTgzNDQgMC4zNDM3NSwwLjE1NjI1IDAuMjM1NzAyLDAuMTMwNzAxIDAuNDIzMTI3LDAuMjUxODMxIDAuNSwwLjM0Mzc1IDAuMDc2ODcsMC4wOTE5MTkgMC4wOTIxLDAuMTI1NjEyIDAuMDkzNzUsMC4yMTg3NSAwLjAwOTUsMC4yMTUwMDcyIC0wLjExMTc0NywwLjM3NzY3ODQgLTAuNTMxMjUsMC42MjUgLTAuMTEwNjc4LDAuMDY1MjUxIC0wLjI3MDI2LDAuMDY5MjMxIC0wLjQwNjI1LDAuMTI1IGwgMCwtMS40Njg3NSB6IE0gNTIuODEyNSwzIEEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgNTIsNCBsIDAsNSBhIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDEsMSBsIDIxLDAgQSAxLjAxNDU2OCwxLjAxNDU2OCAwIDAgMCA3NSw5IEwgNzUsNCBBIDEuMDE0NTY4LDEuMDE0NTY4IDAgMCAwIDc0LDMgTCA1MywzIGEgMS4wMTQ1NjgsMS4wMTQ1NjggMCAwIDAgLTAuMTg3NSwwIHoiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNi4yNWUtNywyZS02KSIKICAgICAgIGlkPSJwYXRoNDA1NCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O29wYWNpdHk6MC4xNTtjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI3Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE0LjA4MTk4NyA0MC42MDEzMDEsLTE1LjA3NjI0IDM4LC0xNi4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjMxMTY5ODkxcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtvcGFjaXR5OjAuMztjb2xvcjojMDAwMDAwO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOk9wZW4gU2FucyBCb2xkIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzYsLTI4Ljk5OTk5OCAwLDIuMTg3NSBjIC0yLjE2NDYzNSwwLjIwNjgxIC00LjMxODcsMC43NjAyNzkgLTYsMi4xNTYyNSAtMi40MTMxMiwxLjg2NTAzMSAtMi41ODU0OTcsNS41NTM1NTMgLTAuODEyNSw3Ljg3NSAxLjcxNDMxNiwyLjA4MDAyIDQuMzI0NDQ2LDMuMDYwMzExIDYuODEyNSw0IGwgMCw1LjU5Mzc1IGMgLTIuNzc0MjE5LC0wLjIyNjYxOCAtNS40NzkxODMsLTAuOTg3NTk5IC04LC0yLjEyNSBsIDAsNC43MTg3NSBjIDIuNTIzMTQyLDEuMDcwNjQ4IDUuMjU3MTQ5LDEuNTcxMzU0IDgsMS42MjUgbCAwLDMuOTY4NzUgMiwwIDAsLTQuMDkzNzUgYyAxLjY3ODk1MSwtMC4xNTA4OTIgMy43MzIxMzYsLTAuNDU3MTgxIDUuMjE4NzUsLTEuMjUgMi4wNjUyMDEsLTEuMDEzOTE2IDMuNTI5MzQsLTMuMTYxODMzIDMuNDM3NSwtNS40MDYyNSAwLjAwODQsLTEuMDg1MTQ5IC0wLjM1NTQ1MiwtMi4xMzIxOTQgLTEsLTMuMDMxMjUgQyA0My45MzIwODUsLTE1LjA4MTk4NyA0MC42MDEzMDEsLTE2LjA3NjI0IDM4LC0xNy4xMjQ5OTggbCAwLC01LjM0Mzc1IGMgMi4wNjI0OCwwLjE2Nzc0OSA0LjQ5Mjc4NSwwLjY0NzU3NyA2LjQwNjI1LDEuNDA2MjUgbCAxLjc1LC00LjE4NzUgYyAtMi40NDMzNzIsLTEuMDQ2NzUgLTUuNDkyNDE3LC0xLjUxNTU0MyAtOC4xNTYyNSwtMS42MjUgbCAwLC0yLjEyNSAtMiwwIHogbSAwLDYuNTkzNzUgMCw0LjI4MTI1IGMgLTEuMDUwMTIsLTAuNDYxODUgLTIuNTc5MDE0LC0xLjA1NTg1MiAtMi41MzEyNSwtMi4zNzUgLTAuMDQ5MTMsLTEuMjQ1MjA3IDEuNDY4MTc1LC0xLjc4NjUwNyAyLjUzMTI1LC0xLjkwNjI1IHogbSAyLDEwLjYyNSBjIDEuMDQxNDc3LDAuNTA4MjQ5IDIuOTE0MDI2LDAuOTI1NTExIDIuOTM3NSwyLjI1IDAuMDU5ODUsMS4zNTE1NDIgLTEuNzU4NDc2LDEuOTk5MTMyIC0yLjkzNzUsMi4xNTYyNSBsIDAsLTQuNDA2MjUgeiBtIDE1LDE0Ljc4MTI1IDAsNSAyMSwwIDAsLTUgLTIxLDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDM5ODUtMCIKICAgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMzExNjk4OTFweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHJldGNoOm5vcm1hbDtsaW5lLWhlaWdodDoxMjUlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2NvbG9yOiMwMDAwMDA7ZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NDAxNSk7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpPcGVuIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpPcGVuIFNhbnMgQm9sZCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"terminalpod,pod,terminal,shell\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"org.gnome.Terminal.desktop\"\nLABEL oc.launch=\"gnome-terminal-server.pod\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nENV ARGS=\"--disable-factory --class=pod\"\nLABEL oc.name=\"terminalpod\"\nLABEL oc.displayname=\"Terminal [Pod]\"\nLABEL oc.path=\"/usr/bin/gnome-terminal\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"256M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false,\\\"ipc_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"terminalpod\"\nENV APPBIN \"/usr/bin/gnome-terminal\"\nLABEL oc.args=\"--disable-factory --class=pod\"\nENV APP \"/usr/bin/gnome-terminal\"\nLABEL oc.containerengine=\"pod_application\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/terminalpod/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/terminalpod/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application terminalpod

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/terminalpod.d\n
"},{"location":"applications/terminalpod/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f terminalpod.d -t terminalpod .\n
"},{"location":"applications/terminalpod/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect terminalpod > terminalpod.json\ndocker image save terminalpod -o terminalpod.tar\nctr -n k8s.io images import terminalpod.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @terminalpod.json\n\n
"},{"location":"applications/tetravex/","title":"Tetravex","text":""},{"location":"applications/tetravex/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.language-pack-all

"},{"location":"applications/tetravex/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/tetravex/#ubuntu-packages","title":"Ubuntu packages","text":"
gnome-tetravex\n
"},{"location":"applications/tetravex/#path","title":"Path","text":"
/usr/games/gnome-tetravex\n
"},{"location":"applications/tetravex/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/tetravex/#wm_class","title":"WM_CLASS","text":"
gnome-tetravex.Gnome-tetravex\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/tetravex/#json-dump","title":"JSON dump","text":"

json source file tetravex.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"debpackage\": \"gnome-tetravex\",\n    \"icon\": \"gnome-tetravex.svg\",\n    \"keyword\": \"game\",\n    \"launch\": \"gnome-tetravex.Gnome-tetravex\",\n    \"name\": \"Tetravex\",\n    \"path\": \"/usr/games/gnome-tetravex\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\",\n    \"desktop\": \"gnome-tetravex.desktop\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"384M\",\n        \"shm_size\": \"128M\",\n        \"pid_mode\": false\n    }\n}\n
"},{"location":"applications/tetravex/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output tetravex.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/tetravex.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @tetravex.d.3.0.json\n\n
"},{"location":"applications/tetravex/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.language-pack-all:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends gnome-tetravex && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"gnome-tetravex.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnIHN0YW5kYWxvbmU9J25vJz8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZyB4bWxuczpjYz0naHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjJyB4bWxuczpkYz0naHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nIHNvZGlwb2RpOmRvY25hbWU9J2dub21lLXRldHJhdmV4LXN5bWJvbGljLnN2ZycgaGVpZ2h0PScxNicgaWQ9J3N2ZzczODQnIHhtbG5zOmlua3NjYXBlPSdodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlJyB4bWxuczpvc2I9J2h0dHA6Ly93d3cub3BlbnN3YXRjaGJvb2sub3JnL3VyaS8yMDA5L29zYicgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyB4bWxuczpzb2RpcG9kaT0naHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQnIHhtbG5zOnN2Zz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgaW5rc2NhcGU6dmVyc2lvbj0nMC45MSByMTM3MjUnIHdpZHRoPScxNicgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PSIwIDAgMTYgMTYiPgogIDxtZXRhZGF0YSBpZD0nbWV0YWRhdGE5MCc+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsgcmRmOmFib3V0PScnPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0naHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UnLz4KICAgICAgICA8ZGM6dGl0bGU+R25vbWUgU3ltYm9saWMgSWNvbiBUaGVtZTwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcgaW5rc2NhcGU6YmJveC1wYXRocz0ndHJ1ZScgYm9yZGVyY29sb3I9JyM2NjY2NjYnIGJvcmRlcm9wYWNpdHk9JzEnIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9J2xheWVyOScgaW5rc2NhcGU6Y3g9JzIwOS42ODE0OScgaW5rc2NhcGU6Y3k9JzguOTU0NDEnIGdyaWR0b2xlcmFuY2U9JzEwJyBpbmtzY2FwZTpndWlkZS1iYm94PSd0cnVlJyBndWlkZXRvbGVyYW5jZT0nMTAnIGlkPSduYW1lZHZpZXc4OCcgaW5rc2NhcGU6b2JqZWN0LW5vZGVzPSdmYWxzZScgaW5rc2NhcGU6b2JqZWN0LXBhdGhzPSdmYWxzZScgb2JqZWN0dG9sZXJhbmNlPScxMCcgcGFnZWNvbG9yPScjNTU1NzUzJyBpbmtzY2FwZTpwYWdlb3BhY2l0eT0nMScgaW5rc2NhcGU6cGFnZXNoYWRvdz0nMicgc2hvd2JvcmRlcj0nZmFsc2UnIHNob3dncmlkPSdmYWxzZScgc2hvd2d1aWRlcz0ndHJ1ZScgaW5rc2NhcGU6c25hcC1iYm94PSd0cnVlJyBpbmtzY2FwZTpzbmFwLWJib3gtbWlkcG9pbnRzPSdmYWxzZScgaW5rc2NhcGU6c25hcC1nbG9iYWw9J3RydWUnIGlua3NjYXBlOnNuYXAtZ3JpZHM9J3RydWUnIGlua3NjYXBlOnNuYXAtbm9kZXM9J3RydWUnIGlua3NjYXBlOnNuYXAtb3RoZXJzPSdmYWxzZScgaW5rc2NhcGU6c25hcC10by1ndWlkZXM9J3RydWUnIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9JzEzNzYnIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9JzEnIGlua3NjYXBlOndpbmRvdy13aWR0aD0nMjU2MCcgaW5rc2NhcGU6d2luZG93LXg9JzAnIGlua3NjYXBlOndpbmRvdy15PScyNycgaW5rc2NhcGU6em9vbT0nMzInPgogICAgPGlua3NjYXBlOmdyaWQgZW1wc3BhY2luZz0nMicgZW5hYmxlZD0ndHJ1ZScgaWQ9J2dyaWQ0ODY2JyBvcmlnaW54PSctODAuOTk5OTk4JyBvcmlnaW55PSctMzYyJyBzbmFwdmlzaWJsZWdyaWRsaW5lc29ubHk9J3RydWUnIHNwYWNpbmd4PScxcHgnIHNwYWNpbmd5PScxcHgnIHR5cGU9J3h5Z3JpZCcgdmlzaWJsZT0ndHJ1ZScvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDx0aXRsZSBpZD0ndGl0bGU5MTY3Jz5Hbm9tZSBTeW1ib2xpYyBJY29uIFRoZW1lPC90aXRsZT4KICA8ZGVmcyBpZD0nZGVmczczODYnPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSdsaW5lYXJHcmFkaWVudDcyMTInIG9zYjpwYWludD0nc29saWQnPgogICAgICA8c3RvcCBpZD0nc3RvcDcyMTQnIG9mZnNldD0nMCcgc3R5bGU9J3N0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsnLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxnIGlua3NjYXBlOmdyb3VwbW9kZT0nbGF5ZXInIGlkPSdsYXllcjknIGlua3NjYXBlOmxhYmVsPSdhcHBzJyBzdHlsZT0nZGlzcGxheTppbmxpbmUnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKC0zMjIuMDAwMiwxNDUpJz4KCiAgICA8cGF0aCBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPScwJyBkPSdtIDMyNC4zNDM5NSwtMTQ0IDUuNjI1LDUuNjI1IDUuNjI1LC01LjYyNSAtMTEuMjUsMCB6IG0gNS42NTYyNSwxIGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSA3LDAuNDA2MjUgLTUuNjI1LDUuNjI1IDUuNjI1LDUuNjI1IDAsLTExLjI1IHogbSAtMTQsMC4wNjI1IDAsMTEuMTI1IDUuNTYyNSwtNS41NjI1IC01LjU2MjUsLTUuNTYyNSB6IG0gMiw0LjUzMTI1IGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSAxMCwwIGMgMC41NTIyOSwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcxLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHogbSAtNS4wMzEyNSwyLjQzNzUgLTUuNTYyNSw1LjU2MjUgMTEuMTI1LDAgLTUuNTYyNSwtNS41NjI1IHogbSAwLjAzMTIsMi41NjI1IGMgMC41NTIyOCwwIDEsMC40NDc3MiAxLDEgMCwwLjU1MjI4IC0wLjQ0NzcyLDEgLTEsMSAtMC41NTIyOCwwIC0xLC0wLjQ0NzcyIC0xLC0xIDAsLTAuNTUyMjggMC40NDc3MiwtMSAxLC0xIHonIGlkPSdyZWN0NzAyNicgc3R5bGU9J2ZpbGw6I2JlYmViZTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZScvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"tetravex,game\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"gnome-tetravex.Gnome-tetravex\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.language-pack-all\"\nLABEL oc.name=\"Tetravex\"\nLABEL oc.displayname=\"Tetravex\"\nLABEL oc.path=\"/usr/games/gnome-tetravex\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"384M\\\",\\\"shm_size\\\":\\\"128M\\\",\\\"pid_mode\\\":false}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"Tetravex\"\nENV APPBIN \"/usr/games/gnome-tetravex\"\nENV APP \"/usr/games/gnome-tetravex\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/tetravex/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/tetravex/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application Tetravex

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/Tetravex.d\n
"},{"location":"applications/tetravex/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f Tetravex.d -t Tetravex .\n
"},{"location":"applications/tetravex/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect Tetravex > Tetravex.json\ndocker image save Tetravex -o Tetravex.tar\nctr -n k8s.io images import Tetravex.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @Tetravex.json\n\n
"},{"location":"applications/thunderbird/","title":"thunderbird","text":""},{"location":"applications/thunderbird/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/thunderbird/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/thunderbird/#ubuntu-packages","title":"Ubuntu packages","text":"
tk thunderbird gnome-keyring\n
"},{"location":"applications/thunderbird/#displayname","title":"Displayname","text":"
Thunderbird\n
"},{"location":"applications/thunderbird/#path","title":"Path","text":"
/usr/bin/thunderbird\n
"},{"location":"applications/thunderbird/#mimetype","title":"Mimetype","text":"
x-scheme-handler/mailto\n
"},{"location":"applications/thunderbird/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/thunderbird/#wm_class","title":"WM_CLASS","text":"
Mail.Thunderbird\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/thunderbird/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/thunderbird.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/thunderbird/#json-dump","title":"JSON dump","text":"

json source file thunderbird.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"debpackage\": \"tk thunderbird gnome-keyring\",\n    \"icon\": \"thunderbird.svg\",\n    \"keyword\": \"mail\",\n    \"launch\": \"Mail.Thunderbird\",\n    \"name\": \"thunderbird\",\n    \"displayname\": \"Thunderbird\",\n    \"path\": \"/usr/bin/thunderbird\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"x-scheme-handler/mailto\",\n    \"desktopfile\": \"/usr/share/applications/thunderbird.desktop\"\n}\n
"},{"location":"applications/thunderbird/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output thunderbird.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/thunderbird.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @thunderbird.d.3.0.json\n\n
"},{"location":"applications/thunderbird/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends tk thunderbird gnome-keyring && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"thunderbird.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAyNDYuOTYgMjQyLjgwOCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjQ2Ljk2IDI0Mi44MDg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiMzNjM5NTk7fQ0KCS5zdDF7ZmlsbDp1cmwoI1NWR0lEXzFfKTt9DQoJLnN0MntmaWxsOiNGQkZCRkI7fQ0KCS5zdDN7ZmlsbDojOTk5OTk5O30NCgkuc3Q0e2ZpbGw6I0Y4RjhGODt9DQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMl8pO30NCgkuc3Q2e2ZpbGw6dXJsKCNTVkdJRF8zXyk7fQ0KCS5zdDd7ZmlsbDp1cmwoI1NWR0lEXzRfKTt9DQoJLnN0OHtmaWxsOiMzRjY0OTk7fQ0KCS5zdDl7ZmlsbDp1cmwoI1NWR0lEXzVfKTt9DQoJLnN0MTB7ZmlsbDp1cmwoI1NWR0lEXzZfKTt9DQoJLnN0MTF7ZmlsbDp1cmwoI1NWR0lEXzdfKTt9DQoJLnN0MTJ7ZmlsbDp1cmwoI1NWR0lEXzhfKTt9DQoJLnN0MTN7ZmlsdGVyOnVybCgjQWRvYmVfT3BhY2l0eU1hc2tGaWx0ZXIpO30NCgkuc3QxNHtmaWxsOnVybCgjU1ZHSURfMTBfKTt9DQoJLnN0MTV7bWFzazp1cmwoI1NWR0lEXzlfKTt9DQoJLnN0MTZ7b3BhY2l0eTowLjY7fQ0KCS5zdDE3e29wYWNpdHk6MC4yO30NCgkuc3QxOHtmaWxsOnVybCgjU1ZHSURfMTFfKTt9DQoJLnN0MTl7ZmlsbDp1cmwoI1NWR0lEXzEyXyk7fQ0KCS5zdDIwe29wYWNpdHk6MC4xO2ZpbGw6I0YyRjJGMjt9DQoJLnN0MjF7ZmlsbDojMkY0MjgyO30NCgkuc3QyMntmaWxsOnVybCgjU1ZHSURfMTNfKTt9DQoJLnN0MjN7ZmlsbDp1cmwoI1NWR0lEXzE0Xyk7fQ0KCS5zdDI0e2ZpbGw6I0ZGRkZGRjt9DQoJLnN0MjV7ZmlsbDp1cmwoI1NWR0lEXzE1Xyk7fQ0KCS5zdDI2e2ZpbGw6dXJsKCNTVkdJRF8xNl8pO30NCgkuc3QyN3tmaWxsOnVybCgjU1ZHSURfMTdfKTt9DQoJLnN0Mjh7ZmlsbDp1cmwoI1NWR0lEXzE4Xyk7fQ0KCS5zdDI5e2ZpbGw6dXJsKCNTVkdJRF8xOV8pO30NCgkuc3QzMHtmaWxsOnVybCgjU1ZHSURfMjBfKTt9DQoJLnN0MzF7ZmlsbDp1cmwoI1NWR0lEXzIxXyk7fQ0KCS5zdDMye2ZpbGw6dXJsKCNTVkdJRF8yMl8pO30NCgkuc3QzM3tmaWxsOnVybCgjU1ZHSURfMjNfKTt9DQoJLnN0MzR7ZmlsbDp1cmwoI1NWR0lEXzI0Xyk7fQ0KCS5zdDM1e2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyXzFfKTt9DQoJLnN0MzZ7ZmlsbDp1cmwoI1NWR0lEXzI2Xyk7fQ0KCS5zdDM3e21hc2s6dXJsKCNTVkdJRF8yNV8pO30NCgkuc3QzOHtmaWxsOnVybCgjU1ZHSURfMjdfKTt9DQoJLnN0Mzl7ZmlsbDp1cmwoI1NWR0lEXzI4Xyk7fQ0KCS5zdDQwe2ZpbGw6dXJsKCNTVkdJRF8yOV8pO30NCgkuc3Q0MXtmaWxsOnVybCgjU1ZHSURfMzBfKTt9DQoJLnN0NDJ7ZmlsbDp1cmwoI1NWR0lEXzMxXyk7fQ0KCS5zdDQze2ZpbGw6dXJsKCNTVkdJRF8zMl8pO30NCgkuc3Q0NHtmaWxsOnVybCgjU1ZHSURfMzNfKTt9DQoJLnN0NDV7ZmlsbDp1cmwoI1NWR0lEXzM0Xyk7fQ0KCS5zdDQ2e2ZpbGw6dXJsKCNTVkdJRF8zNV8pO30NCgkuc3Q0N3tmaWxsOnVybCgjU1ZHSURfMzZfKTt9DQoJLnN0NDh7ZmlsbDp1cmwoI1NWR0lEXzM3Xyk7fQ0KCS5zdDQ5e2ZpbGw6dXJsKCNTVkdJRF8zOF8pO30NCgkuc3Q1MHtmaWxsOnVybCgjU1ZHSURfMzlfKTt9DQoJLnN0NTF7ZmlsbDp1cmwoI1NWR0lEXzQwXyk7fQ0KCS5zdDUye2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyXzJfKTt9DQoJLnN0NTN7ZmlsbDp1cmwoI1NWR0lEXzQyXyk7fQ0KCS5zdDU0e21hc2s6dXJsKCNTVkdJRF80MV8pO30NCgkuc3Q1NXtmaWxsOnVybCgjU1ZHSURfNDNfKTt9DQoJLnN0NTZ7ZmlsbDp1cmwoI1NWR0lEXzQ0Xyk7fQ0KCS5zdDU3e2ZpbGw6dXJsKCNTVkdJRF80NV8pO30NCgkuc3Q1OHtmaWxsOnVybCgjU1ZHSURfNDZfKTt9DQoJLnN0NTl7ZmlsbDp1cmwoI1NWR0lEXzQ3Xyk7fQ0KCS5zdDYwe2ZpbGw6dXJsKCNTVkdJRF80OF8pO30NCjwvc3R5bGU+DQo8Zz4NCgk8Zz4NCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxOTkuNTMzIiB5MT0iMjAxLjkwNyIgeDI9IjM5LjY3ODciIHkyPSI0Mi4wNTI3Ij4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzAwMzYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMjI5NyIgc3R5bGU9InN0b3AtY29sb3I6IzE4MDIzQiIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC41MTIyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjYwOTRBIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjgyMTEiIHN0eWxlPSJzdG9wLWNvbG9yOiMzRDE1NjMiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM0RTFENzUiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTE4OC44ODcsMzUuNDkyYy0xNC41MDEtOS40NzItMzMuMDQ2LTEyLjUzOC00My4yODEtMTMuNjA5Yy0xMC45NTQtMS4xNDUtMjAuNDY4LTAuOTQzLTI4LjgzNiwwLjI4NQ0KCQkJYy0wLjcwOS0wLjAwOS0xLjQxNC0wLjAzNy0yLjEyNy0wLjAzN2MtMC41NDQsMC0xLjA4LDAuMDIzLTEuNjI3LDAuMDI5YzAuMjI1LTAuMjc1LDAuMzgxLTAuNDQ1LDAuMzgxLTAuNDQ1DQoJCQlzLTAuNDQsMC4wNjktMS4zMDQsMC40NmMtMi43MTcsMC4wNDQtNS40MjEsMC4xMzgtOC4wODUsMC4zMmMzLjcxMS00LjA2OCw2Ljc1MS02LjIsNi43NTEtNi4ycy0zLjYwOCwwLjUyOC0xMC4xOTIsNi40OTYNCgkJCWMtMy4xMzIsMC4yODgtNi4yMjEsMC42Ny05LjI1OCwxLjE0NWM2LjkxOC05LjM2MiwxNC4xNTUtMTMuMzA0LDE0LjE1NS0xMy4zMDRzLTguNzcyLTEuNzg2LTIyLjUwNywxMi4wMTYNCgkJCWMtMS4xNDksMS4xNTUtMi4yMTUsMi4zNTYtMy4yNDYsMy41NzJDMzkuNjgsMzUuOTA3LDExLjAzLDYxLjc1OCwxMS4wMyw5Mi4xMzljMCw1Ljk1OC0xLjgyOSwxMi41MTEsMC4xNDMsMTkuMDU0DQoJCQljLTAuNzg4LDEwLjQ1MywwLjg5LDM4Ljk3NSwwLjg5LDM4Ljk3NXMxMC44MzcsNTguNjQ5LDUyLjUxLDY4Ljg0NmMwLjY2MiwwLjE1OC04LjcwNy0xNC42Mi0xMi44NTEtMzIuNDQyDQoJCQljOC4wNjksOC4yMDgsMTcuNjg1LDE0LjY5OSwyOC40NzgsMTUuODI0YzEuMzI1LDAuMTM3LTYuMTY1LTguNjQtMTIuNzI1LTE5LjIzNGw5NC42OTgsMzEuOTA2DQoJCQljNDkuNTI5LTIxLjI3NCw0My43NjMtMTkuMzU3LDU0LjM5Ny0zMC44NzVjMjMuNDI4LTI1LjM2LDI2LjcwOC0zOS43NSwyMC44MDYtODIuMjM1DQoJCQlDMjMzLjM4Myw3My4yNzksMjEyLjIxNiw0NC44NzUsMTg4Ljg4NywzNS40OTJ6Ii8+DQoJCTxwb2x5Z29uIGNsYXNzPSJzdDIiIHBvaW50cz0iMjIuNjg3LDYyLjI3NiA4LjU0NiwxNDIuNjggMTYuMzg3LDE2Ni45NzQgMTcyLjkxMSwyMTkuMDE1IDIwMS45MzksOTUuNTkxIAkJIi8+DQoJCTxnPg0KCQkJPHBhdGggY2xhc3M9InN0MyIgZD0iTTIzLjEyOCw2NS4wMWMwLjc4NSwxLjY4OSwwLjU1NCwyLjA4OSwwLjA2NSwyLjA4OWMtMC4yMiwwLTAuNDkyLTAuMDgxLTAuNzQ3LTAuMTYxDQoJCQkJYy0wLjI1NS0wLjA4MS0wLjQ5NC0wLjE2MS0wLjY0OC0wLjE2MWMtMC40MzMsMC0wLjE4OSwwLjYzOSwyLjI2MywzLjcyYzMuNDY4LDQuNDA2LDU0LjM5OSw4MS4yOTMsNTcuMTgyLDgxLjI5Mw0KCQkJCWMwLjAxNSwwLDAuMDI4LTAuMDAyLDAuMDQtMC4wMDZjMjMuNzEtOC40NDgsMTI0LjU0My00My4wNTgsMTI0LjU0My00My4wNThMMTk1LjUxLDkzLjY5N0wyMy4xMjgsNjUuMDEiLz4NCgkJPC9nPg0KCQk8cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMjQuNjA3LDYzLjEyMWMwLDAsMC43NiwzLjkzMiw0LjI4MSw4LjI4NGMzLjUsNC4zOTIsNTAuNTEsNzUuNTcxLDUyLjg2OSw3NC45NDQNCgkJCWMzMC43OTUtOC4xNzYsMTQyLjUyNS01MS42NzQsMTQyLjUyNS01MS42NzRMMjQuNjA3LDYzLjEyMXoiLz4NCgkJPHBvbHlnb24gY2xhc3M9InN0MyIgcG9pbnRzPSIxNjcuMzIxLDIxNy4xNjEgMTguNTY4LDE2Ny43MDMgMTkuMDk0LDE3MS4xNzggMTY4Ljk3NiwyMjEuMDEyIAkJIi8+DQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMl8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTAuMjQyOCIgeTE9Ijk1LjMxMTMiIHgyPSI1Ny43MDM5IiB5Mj0iOTUuMzExMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMzE1NkE4Ii8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjI0NzQiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMzUxQTQiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuNTM2NSIgc3R5bGU9InN0b3AtY29sb3I6IzNCNDM5NyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC44NDUzIiBzdHlsZT0ic3RvcC1jb2xvcjojNDcyQzgyIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojNEUxRDc1Ii8+DQoJCTwvbGluZWFyR3JhZGllbnQ+DQoJCTxwYXRoIGNsYXNzPSJzdDUiIGQ9Ik01Ny43MDQsNTkuNzk1YzAsMC01NC4xMjIsMTUuODUtMjkuMjg4LDcxLjAzM2MwLDAtMTEuMzg3LTEwLjQyNi0xOC4xNjctMjMuNzU3DQoJCQlDOS45NDQsMTA2LjQ3NCwyMS41NSw2NS4yNDIsMjEuNTUsNjUuMjQyTDU3LjcwNCw1OS43OTV6Ii8+DQoJCQ0KCQkJPHJhZGlhbEdyYWRpZW50IGlkPSJTVkdJRF8zXyIgY3g9IjU5LjA3MzIiIGN5PSIxMTMuOTIzMiIgcj0iODUuMjQ2NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAxLjQ1IDAgLTUxLjI2NTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjE2NTQiIHN0eWxlPSJzdG9wLWNvbG9yOiMxNENEREEiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuNTQ3OCIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC42NTQ2IiBzdHlsZT0ic3RvcC1jb2xvcjojMjY1OEFDIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjg2NCIgc3R5bGU9InN0b3AtY29sb3I6IzM3M0Y4MSIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzQzMkQ2MiIvPg0KCQk8L3JhZGlhbEdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3Q2IiBkPSJNMjguNDE2LDEzMC44MjhjLTQuNzA3LTAuMDgxLTEyLjI2OS0zLjk2NC0xNC43MjItOC42NjVjLTMuMDY2LDUxLjA5OCwxNy43ODIsODAuOTM5LDUwLjg4LDk2Ljg1Mw0KCQkJQzUzLjc1OSwyMTcuNzc2LDAsMTg5LjQwNywwLDEyMS4xNEMwLDYzLjA5Myw0Ni4wNiwxMS4yMDgsMTE4LjE0Miw4LjgzMWMwLjQ0MiwzLjI1NC0zNS43MzYsMTEuNDE0LTM2Ljg5MywxNS4yNTENCgkJCWMtMS43OTYsNS45NzItNS45MjQsMTIuNDczLTkuNDA2LDE3LjY4NGMtNC43MTgsNy4wNjEsNi41NTcsMTMuMDk5LTEuNzI5LDE1LjAwMWMtMTIuNDY4LDIuODYxLTI5LjA5OCwxLjI3Ny00MS4zNjEsMTcuMjE5DQoJCQlDMTAuMzE5LDk3Ljk1MSwyMi42MiwxMjUuMzY1LDI4LjQxNiwxMzAuODI4eiIvPg0KCQk8Zz4NCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfNF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDQuNTM4NyIgeTE9IjU3Ljg5NzUiIHgyPSIxOTEuNTE1IiB5Mj0iNTcuODk3NSI+DQoJCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuMTg0NiIgc3R5bGU9InN0b3AtY29sb3I6IzJCNTFBQyIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuNjgyNiIgc3R5bGU9InN0b3AtY29sb3I6IzQ0MkM4NCIvPg0KCQkJCTxzdG9wICBvZmZzZXQ9IjAuOTQwOSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQkJPC9saW5lYXJHcmFkaWVudD4NCgkJCTxwYXRoIGNsYXNzPSJzdDciIGQ9Ik0xMzcuMDQ4LDEwLjY5OWMtNDYuNjgyLTMuNTgyLTcwLjcwNywxNS4wOTctODYuMTMsMzYuODE3Yy01LjYxNyw3LjkwNi01LjAwMiwxNS4xNjYtMy4wNjgsMjMuOTM3DQoJCQkJYzAuODMxLDMuNzQ0LDEuNjcxLDUuNTM4LDAuNjU5LDkuMzU1Yy0wLjU1OCwyLjEwNi0wLjQ2NSw0LjA3Mi0xLjE1OCw1LjMxNGMtMC45NTksMS43MTctMi4xOCwzLjU5NC0yLjU4OSw2LjY3Nw0KCQkJCWMtMS4wMjIsNy42OTksMS43MDMsMTAuMTUxLDMuNDA2LDEyLjc0MWMyLjQyNi0yLjQwOSw3LjE2NS04LjA3OSwxNS43MS0xMS40NjZjOC41NDUtMy4zODcsMTQuMTY3LTguNDc3LDI0Ljg3Ni0xMy45NDENCgkJCQljMTQuNjMyLTcuNDYzLDMxLjc4MiwzLjg1OSw2NC4zLTYuNzk2YzEwLjAwNi0zLjI3OSwzMy4wMDItMzcuMzQ0LDM4LjQ2MS0zOC42NTJDMTc2LjMxMiwxNy44NzMsMTUwLjQ0OCwxMS43MjYsMTM3LjA0OCwxMC42OTl6DQoJCQkJIi8+DQoJCTwvZz4NCgkJPHBhdGggY2xhc3M9InN0OCIgZD0iTTEwNi4yMDcsMC4wMzJjMCwwLTguMzM1LDQuMDI2LTExLjk2NSwxMS4zMDFjOC4zODEtNC4yMjUsMTMuMjQ2LTYuNTMzLDE1LjU0Ni02LjgwOA0KCQkJYzAsMC0yLjIwMywxLjA2Ny00LjkzNSw2Ljg3YzQuODMtMS41NDcsNi40OTMtMi41MjIsNy44MTktMi41MzdjMCwwLTAuMzg1LDAuNjEtMC43MzcsNi40MDINCgkJCWMtNy40MTctMi40MDQtMjEuNjkzLDAuMzk3LTI5LjI4Nyw1LjE1M0M4MC4wNzIsNi42NzgsMTA2LjIwNywwLjAzMiwxMDYuMjA3LDAuMDMyeiIvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzVfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjY2LjE3MzYiIHkxPSIyMy4yMDU2IiB4Mj0iMTY3LjI2NDIiIHkyPSIxMTEuMDgyMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjAyMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiM0OEE4RTAiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMzg4MyIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC40OTY4IiBzdHlsZT0ic3RvcC1jb2xvcjojMkI1MUFDIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjc4OTIiIHN0eWxlPSJzdG9wLWNvbG9yOiM0NDJDODQiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuOTQwOSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3Q5IiBkPSJNMTM5LjM3OSw4LjYzQzEyNS4wNyw2Ljc3NiwxMTMuMTA5LDcuMTQxLDEwMi45NCw5LjFjMy4xOTgtMy4wNjUsNi44OTgtNC41NzUsNi44OTgtNC41NzUNCgkJCWMtNC43OTUsMC40MjQtMTAuNzgxLDMuNTU0LTE1LjkxNyw2Ljg2OGMtMi41ODgsMC44MjYtNS4wNTQsMS43NTgtNy4zOSwyLjc5OWMxLjQzLTEuODg1LDMuMDk0LTMuODk5LDQuNzItNS40NDUNCgkJCWM2LjAzOS01Ljc0MywxNS4wMDYtOC43MTUsMTUuMDA2LTguNzE1Qzk4LjYwMy0wLjUzLDcyLjk4OSw2LjAyNyw1Ny41NzYsMzcuMjQ1Yy0yLjUyNiwzLjA3Ny00Ljg4Myw2LjIzNS03LjEyOSw5LjM5OA0KCQkJYy01Ljc5OCw4LjE2NC01LjE2MiwxNS42NTgtMy4xNjIsMjQuNzE1YzAuODUyLDMuODY3LDEuMDA5LDEwLjA0LDAuMTY4LDE0LjAyOWMtMC4xNjgsMC43OTktMi4zNjMsMi44NjMtMi45MjYsOC40MjgNCgkJCWMtMC42MDIsNS45MDUsMS41MDUsOC44MDQsMy41ODIsMTEuMjAzYzcuMzgtMTAuNzkyLDE0LjY2MS0xMi45MzEsMTQuNjYxLTEyLjkzMUM3My4xLDg3Ljg1NSw3Ny40LDgzLjMzNSw4OC40NTgsNzcuNjk0DQoJCQljMTUuMTA4LTcuNzA5LDY3LjkzOSwxNy40NSwxMDEuNTEyLDYuNDQ4YzEwLjMzMi0zLjM4NC0zLjk3Ny00Ny4zNTksMS42NjMtNDguNzA5QzE3NS45MzQsMTguMDczLDE1My4xMzksMTAuNDEzLDEzOS4zNzksOC42M3oiDQoJCQkvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzZfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjE5LjY3NjIiIHkxPSIzMzcuNDEzOSIgeDI9IjIxNy44MzUzIiB5Mj0iNDMuNjMwOSI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjM3ODciIHN0eWxlPSJzdG9wLWNvbG9yOiMzMTU2QTgiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM0RTFENzUiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MTAiIGQ9Ik0yNDQuMTc2LDEwMy4yODhjLTguMjc2LTQzLjIzNy00OC4wOTYtODIuNTcyLTgwLjExNy04NC43NTJjLTE0LjIxMS0wLjk2OC05Ljg0Nyw2LjMxOS0xOC43MzksOS4wOTQNCgkJCWMtMzguMzIsMTEuOTU5LTM4LjkwNiwxOC45NDEtMzguOTA2LDE4Ljk0MWM4MS4yNTIsMy44MTksODIuNDg0LDg0LjA2NCw2MC43MjQsMTA0LjM2NmM2LjEyMy0xLjQyOCwxMi43NjItOC45MTQsMTguODU5LTIwLjY2Ng0KCQkJYy0wLjczMiw0LjkzMS0xLjM2LDEwLjk4LTIuMjc0LDE3LjcyOWMtMi43ODgsMjAuNTk1LDAuODIzLDYzLjYxNC01OC4zNTYsOTIuNDA1YzAsMCwzMi4zNzItMi42NDYsNDguNDI1LTIwLjcxNw0KCQkJYy02LjUyOCwxNS4wMTItMjQuNDQxLDIzLjEyMS0yNC40NDEsMjMuMTIxYzEzLjE4Mi0xLjkyOCw0Ny44MS0xMi4xNDYsNjkuODY4LTM5LjczMg0KCQkJQzI0NC4xODUsMTcxLjg1MiwyNTEuNjkzLDE0Mi41NTgsMjQ0LjE3NiwxMDMuMjg4eiIvPg0KCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzdfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ijk2Ljc0NTIiIHkxPSIyNzguNjQ1OCIgeDI9IjIwNi4zMTc1IiB5Mj0iMzIuNTQyMyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMjlBQkUyIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjc3MzMiIHN0eWxlPSJzdG9wLWNvbG9yOiMzODVBQTYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuODU3NSIgc3R5bGU9InN0b3AtY29sb3I6IzQxNDI5MyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzRFMUQ3NSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QxMSIgZD0iTTE2NC45OTMsMTgyLjIyMWMwLDAsMjYuMzk2LTcuMzgsMzQuOTAzLTIxLjYzM2MtMS4wMzIsMTYuNjE5LTE2LjEwNywzMy42NjItMTYuMTA3LDMzLjY2Mg0KCQkJczIyLjAzOC00LjQ2LDMxLjQzNi0xOS45NjhjLTEuMjI0LDEzLjk5NC0xOC4xOTEsMzIuOTA3LTE4LjE5MSwzMi45MDdjMTcuMzQ2LTMuMTEzLDYwLjkzLTMwLjY0NSw0Ny4xNDMtMTAzLjkwMQ0KCQkJYy04LjE0Mi00My4yNjItNDguMDk2LTgyLjU3Mi04MC4xMTctODQuNzUyYy0xNC4yMTEtMC45NjgtOS44NDcsNi4zMTktMTguNzM5LDkuMDk0Yy0zOC4zMiwxMS45NTktMzguOTA2LDE4Ljk0MS0zOC45MDYsMTguOTQxDQoJCQljODEuMjUyLDMuODE5LDEwMi44NDQsNDYuMzQ0LDYwLjcyNCwxMDMuMjMxYzYuMTIzLTEuNDI5LDguNTc4LTQuNzk0LDEzLjE3OC0xMC4zMDENCgkJCUMxODAuMzE1LDEzOS41MDEsMTgyLjQwMSwxNjEuMjgxLDE2NC45OTMsMTgyLjIyMXoiLz4NCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF84XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0OC4yNjg2IiB5MT0iOTIuMDMzNyIgeDI9IjU0LjI0MTQiIHkyPSI5NS40NjgzIj4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNCMERDRDYiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiM1M0FDRTAiLz4NCgkJPC9saW5lYXJHcmFkaWVudD4NCgkJPHBhdGggY2xhc3M9InN0MTIiIGQ9Ik02MC42MDksODUuNTY3YzAsMC00LjcxOSwzLjMwMS04LjEzNiwyLjQ2Yy00LjA0NS0wLjk5My00LjczLTQuOTEzLTQuNzMtNC45MTMNCgkJCWMtMC4wODksMC44MDMtMC4xOTIsMS41NzgtMC4zNDEsMi4yNzNjLTAuMTY4LDAuNzk5LTIuMzYzLDIuODYzLTIuOTI2LDguNDI4Yy0wLjYwMiw1LjkwNSwxLjYxNSw5LjMyNSwzLjY5MiwxMS43MjQNCgkJCUM1NS41NDksOTQuNzQ3LDYyLjcyLDkyLjA4Nyw2Mi43Miw5Mi4wODdDNTkuOTExLDkxLjEwNSw2MC42MDksODUuNTY3LDYwLjYwOSw4NS41Njd6Ii8+DQoJCTxkZWZzPg0KCQkJPGZpbHRlciBpZD0iQWRvYmVfT3BhY2l0eU1hc2tGaWx0ZXIiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMTYyLjY4IiB5PSIxOC4zNTUiIHdpZHRoPSIxNC45MjciIGhlaWdodD0iNi42MjkiPg0KCQkJCTxmZUNvbG9yTWF0cml4ICB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMSAwIDAgMCAwICAwIDEgMCAwIDAgIDAgMCAxIDAgMCAgMCAwIDAgMSAwIi8+DQoJCQk8L2ZpbHRlcj4NCgkJPC9kZWZzPg0KCQk8bWFzayBtYXNrVW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4PSIxNjIuNjgiIHk9IjE4LjM1NSIgd2lkdGg9IjE0LjkyNyIgaGVpZ2h0PSI2LjYyOSIgaWQ9IlNWR0lEXzlfIj4NCgkJCTxnIGNsYXNzPSJzdDEzIj4NCgkJCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzEwXyIgY3g9IjE1NC4zODQiIGN5PSI2Ny45OTg1IiByPSI1MS45Njc1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQoJCQkJCTxzdG9wICBvZmZzZXQ9IjAuODY4IiBzdHlsZT0ic3RvcC1jb2xvcjojRkZGRkZGIi8+DQoJCQkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDAiLz4NCgkJCQk8L3JhZGlhbEdyYWRpZW50Pg0KCQkJCTxyZWN0IHg9IjkxLjI5NSIgeT0iLTcuMjE4IiBjbGFzcz0ic3QxNCIgd2lkdGg9IjEwMC4wMTUiIGhlaWdodD0iOTMuMzM5Ii8+DQoJCQk8L2c+DQoJCTwvbWFzaz4NCgkJPGcgY2xhc3M9InN0MTUiPg0KCQkJPGcgY2xhc3M9InN0MTYiPg0KCQkJCTxnIGNsYXNzPSJzdDE3Ij4NCgkJCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTc2LjIxMzkiIHkxPSIyMy4wODUxIiB4Mj0iMTY0LjI0MDMiIHkyPSIyMC41NTU0Ij4NCgkJCQkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMzMDkyQjkiLz4NCgkJCQkJCTxzdG9wICBvZmZzZXQ9IjAuMjE5OSIgc3R5bGU9InN0b3AtY29sb3I6IzI1OERCNiIvPg0KCQkJCQkJPHN0b3AgIG9mZnNldD0iMC42NTY0IiBzdHlsZT0ic3RvcC1jb2xvcjojMTY4NUIxIi8+DQoJCQkJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMTA4MkFGIi8+DQoJCQkJCTwvbGluZWFyR3JhZGllbnQ+DQoJCQkJCTxwYXRoIGNsYXNzPSJzdDE4IiBkPSJNMTYzLjUxMywxOC40MzRjMS4xMDYtMC4yODcsNS42MjEsMC4yMDQsOC41ODQsMS41MzNjMi45NjQsMS4zMjksOC4wNzMsMy42NzksMy45ODYsNC43MDENCgkJCQkJCWMtNC4wODgsMS4wMjItNi40MzgtMC42MTMtOC40ODItMi4zNTFTMTYwLjc1NCwxOS4xNDksMTYzLjUxMywxOC40MzR6Ii8+DQoJCQkJPC9nPg0KCQkJPC9nPg0KCQk8L2c+DQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMTJfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjgwLjc4MzgiIHkxPSIzOC4wMjUyIiB4Mj0iOTAuNjM3IiB5Mj0iNzcuNTQ0MyI+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjAwNzQiIHN0eWxlPSJzdG9wLWNvbG9yOiMxMzk4RDE7c3RvcC1vcGFjaXR5OjAiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMjQ4MiIgc3R5bGU9InN0b3AtY29sb3I6IzExODdDMjtzdG9wLW9wYWNpdHk6MC42MTk3Ii8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjY0MjIiIHN0eWxlPSJzdG9wLWNvbG9yOiMzRjY0OTk7c3RvcC1vcGFjaXR5OjAuNzEiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMyRjQyODI7c3RvcC1vcGFjaXR5OjAuNSIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QxOSIgZD0iTTYxLjA1MSw4NC45MjFjMCwwLDI1Ljg4OC00Mi42NjIsNDkuMjkyLTU0LjE3NWMyLjE3My0xLjA5My0zMi40MDUsOS4xOTEtNDYuMzIsMjQuNTUNCgkJCUM1NS43NTIsNjQuNDI1LDYwLjEzMiw4Mi4yOTgsNjEuMDUxLDg0LjkyMXoiLz4NCgkJPHBhdGggY2xhc3M9InN0MjAiIGQ9Ik02MS4wNTEsODQuOTIxYzAuMDI0LTAuMDE1LDAuMDUtMC4wMywwLjA3NS0wLjA0NWM2LjY5NC00LjEzNiwxOC4xNjYtNi41MTgsMjEuODY0LTE0LjAxNQ0KCQkJYzE0LjIzNy0yOC44NjksMjcuMzU0LTQwLjExNSwyNy4zNTQtNDAuMTE1Qzg2LjkzOSw0Mi4yNTksNjEuMDUxLDg0LjkyMSw2MS4wNTEsODQuOTIxeiIvPg0KCQk8cGF0aCBjbGFzcz0ic3QyMSIgZD0iTTYzLjUxMiw3Ny4xMThjMCwwLTQuNjY2LTcuMTU5LDIuMDUzLTEzLjY4N2MzLjU0Ni0zLjQ0LDguOTE5LTEuNTI5LDkuNTQtMC45MQ0KCQkJYzIuNjQ0LDIuNjIyLDAuOTgyLDguMTU2LTEuMzk4LDExLjI4OEM3Mi4zNjIsNzUuNTczLDY4LjQ0OCw3OC4zMTksNjMuNTEyLDc3LjExOHoiLz4NCgkJDQoJCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzEzXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI0OC43MzgzIiB5MT0iMTQuMzczIiB4Mj0iNDMuMTk5MyIgeTI9IjExLjMwMjciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC45OTk0IDAuMDM0OSAtMC4wMzQ5IDAuOTk5NCAyNC41OTA2IDU3LjEyMDIpIj4NCgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGOUMyMUIiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuMTQ3OSIgc3R5bGU9InN0b3AtY29sb3I6I0YzQkExQiIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMC4zNzg3IiBzdHlsZT0ic3RvcC1jb2xvcjojRTNBNDFCIi8+DQoJCQk8c3RvcCAgb2Zmc2V0PSIwLjY2MzQiIHN0eWxlPSJzdG9wLWNvbG9yOiNDOTgwMUMiLz4NCgkJCTxzdG9wICBvZmZzZXQ9IjAuOTg4NCIgc3R5bGU9InN0b3AtY29sb3I6I0E0NEUxQyIvPg0KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0EzNEMxQyIvPg0KCQk8L2xpbmVhckdyYWRpZW50Pg0KCQk8cGF0aCBjbGFzcz0ic3QyMiIgZD0iTTY2LjE4Nyw3Ni42NzRjMCwwLTMuMjI0LTQuOTQ5LDEuNDIyLTkuNDU5YzIuNDQ2LTIuMzc2LDYuMTYxLTEuMDU2LDYuNTkyLTAuNjMNCgkJCWMxLjgyNiwxLjgxMiwwLjY3Niw1LjYzNy0wLjk2OCw3LjhDNzIuMzA0LDc1LjYwOCw2OS41OTgsNzcuNTA0LDY2LjE4Nyw3Ni42NzR6Ii8+DQoJCTxwYXRoIGQ9Ik03Mi42MjMsNzEuMzkzYy0wLjA3MiwxLjk3OC0xLjc0NiwzLjUyMi0zLjczOCwzLjQ1NGMtMS45OTYtMC4wNjktMy41NTgtMS43MjYtMy40ODctMy43MDQNCgkJCWMwLjA3MS0xLjk3NywxLjc0NC0zLjUyMSwzLjc0MS0zLjQ1M0M3MS4xMzEsNjcuNzU5LDcyLjY5Miw2OS40MTcsNzIuNjIzLDcxLjM5M3oiLz4NCgk8L2c+DQoJPGNpcmNsZSBjbGFzcz0ic3QyNCIgY3g9IjY2LjcyNSIgY3k9IjcwLjI4NyIgcj0iMS4xMzYiLz4NCgk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE0XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyMDYuMjExMyIgeTE9IjEzMC4xMzkxIiB4Mj0iMTY5LjQyOTgiIHkyPSI0Ny41MjY0Ij4NCgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzQwOUVDMyIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjYyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjA2MUJEIi8+DQoJPC9saW5lYXJHcmFkaWVudD4NCgk8cGF0aCBjbGFzcz0ic3QyMyIgZD0iTTIyOC41MDUsNjUuMDFjLTE3LjcyMS0yNi45NzYtMzEuNzYxLTMzLjgzMS0zMS43NjEtMzMuODMxczAuNjQ1LDE5LjY1LDEwLjQ4NCwyOS4xMjgNCgkJYzEuMTI0LDEuMDgzLTExLjc3NC04LjQzMi0xMS43NzQtOC40MzJzLTIuNzU4LDkuMDc2LDMuNTYyLDE5LjUxYy0xLjgzNi0yLjQzOS0zLjA1MS0zLjM2My0zLjA1MS0zLjM2Mw0KCQlzLTExLjkwOCw1LjQ5MS0xNS40MjMsMTMuMTA5Yy0xLjgxNS0zLjQyNi0zLjE3Ni01LjQ0NC0zLjE3Ni01LjQ0NHMtOC4yMzYsMTYuNDM3LTcuMjAxLDM1LjQ5NQ0KCQljMS42ODQsMzAuOTg4LTUuODAzLDQyLjQwNC01LjgwMyw0Mi40MDRzMjAuMDU3LTcuNjk1LDI5LjY3Ni0zMi40NjhjMy45NzQsMTAuNTMzLTAuMTIxLDIxLjYxOS0wLjEyMSwyMS42MTkNCgkJczE2LjIwNi0xMi4xMDksMTkuNjkxLTM0LjE4YzMuODYzLDYuMjMsMi43MjcsMTguNjY0LDIuNzI3LDE4LjY2NHMxMC4zNDQtMTQuNDAyLDEwLjU5Ni0zMC4wODYNCgkJYzQuNzk0LDMuMzQzLDUuMjM1LDE2LjM5OSw1LjIzNSwxNi4zOTlTMjQ3LjUwMiw5My45MjgsMjI4LjUwNSw2NS4wMXoiLz4NCgk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzE1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxNzYuNzYwMyIgeTE9IjEwMy4wNjEiIHgyPSIxNTAuNDA2OSIgeTI9IjIxLjk1MzYiPg0KCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMTRCMkRBIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuNDAyOCIgc3R5bGU9InN0b3AtY29sb3I6IzI5N0NDQyIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjUwNzciIHN0eWxlPSJzdG9wLWNvbG9yOiMyNTZGQzUiLz4NCgkJPHN0b3AgIG9mZnNldD0iMC42NDkyIiBzdHlsZT0ic3RvcC1jb2xvcjojMjE2NEJGIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuODE2MiIgc3R5bGU9InN0b3AtY29sb3I6IzIwNjFCRCIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4MzUiIHN0eWxlPSJzdG9wLWNvbG9yOiMyMDYxQkQiLz4NCgk8L2xpbmVhckdyYWRpZW50Pg0KCTxwYXRoIGNsYXNzPSJzdDI1IiBkPSJNMjExLjI4Miw0Ni4xNThjLTQuNjMxLTguNjMtMTIuODAzLTE0LjEzLTE5Ljk4Ni0xOC41ODJjLTE3LjkwOS0xMS4xMDUtMjkuNDI3LTEyLjY2NS0yOS40MjctMTIuNjY1DQoJCXMtMTYuNTI4LDMuMDc0LTEzLjY4OSw3LjY3MmMwLjE0NiwwLjIzNiwwLjQ4NywwLjUzNSwwLjk2OCwwLjg3N2MtMTQuNDk4LTYuNjc4LTIyLjcyMiw4LjY3Ny0yMi43MjIsOC42NzcNCgkJYy04LjI4NC0wLjUwMy0xOC4zNzEsMy41NzUtMjEuMzEyLDE0LjQ5OWMtMC4zMDUsMS4xMzQsMy43MTEsMC40OTYsNS43NzcsMC45NDVjMTIuMDc5LDIuNjI2LDIzLjQ1LDguMzIsMjguNjc1LDExLjEzNA0KCQljMTIuMTU0LDYuNTQ4LDE5LjM2NSwxNy40NTEsMjMuNTI4LDI1LjYyOWM1LjAzNyw5Ljg5NCw3LjA5NCwyNy4zMDQsNy4wOTQsMjcuMzA0czEzLjI1My0xOC4yMDUsMTAuMDg2LTI3LjU1Mg0KCQljNS4yNDksMy4yNiw2LjI4NSwxNC44OTEsNi4yODUsMTQuODkxczguODM1LTEzLjgzOCw2LjIyMy0yNS44OTFjNi44MTUsNC4xNTMsNy4wNDIsMTIuNjAxLDcuMDQyLDEyLjYwMXM2LjkzOS05LjYzMSwzLjgwMy0yNS40MjcNCgkJYzYuODU4LDUuNDUzLDguMjkzLDEyLjUxNyw4LjI5MywxMi41MTdTMjE3LjUyNiw1Ny43OTQsMjExLjI4Miw0Ni4xNTh6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==\"\nLABEL oc.keyword=\"thunderbird,mail\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"thunderbird.desktop\"\nLABEL oc.launch=\"Mail.Thunderbird\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nLABEL oc.name=\"thunderbird\"\nLABEL oc.displayname=\"Thunderbird\"\nLABEL oc.path=\"/usr/bin/thunderbird\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/mailto\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"thunderbird\"\nENV APPBIN \"/usr/bin/thunderbird\"\nENV APP \"/usr/bin/thunderbird\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/thunderbird/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/thunderbird/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application thunderbird

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/thunderbird.d\n
"},{"location":"applications/thunderbird/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f thunderbird.d -t thunderbird .\n
"},{"location":"applications/thunderbird/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect thunderbird > thunderbird.json\ndocker image save thunderbird -o thunderbird.tar\nctr -n k8s.io images import thunderbird.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @thunderbird.json\n\n
"},{"location":"applications/vice/","title":"vice","text":""},{"location":"applications/vice/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.18.04

"},{"location":"applications/vice/#displayname","title":"Displayname","text":"
Commodore64\n
"},{"location":"applications/vice/#path","title":"Path","text":"
/usr/bin/x64\n
"},{"location":"applications/vice/#file-extensions","title":"File extensions","text":"

\"crt;bin\"

"},{"location":"applications/vice/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/vice/#wm_class","title":"WM_CLASS","text":"
x64.X64\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/vice/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/x64.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/vice/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install  --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\nRUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\nRUN mkdir /usr/lib/vice/C64/cartridge\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\n
"},{"location":"applications/vice/#json-dump","title":"JSON dump","text":"

json source file vice.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\",\n        \"RUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\",\n        \"RUN mkdir /usr/lib/vice/C64/cartridge\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\",\n        \"RUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"c64.svg\",\n    \"keyword\": \"x64,vice,commodore,c64\",\n    \"launch\": \"x64.X64\",\n    \"name\": \"vice\",\n    \"displayname\": \"Commodore64\",\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/x64\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.18.04\",\n    \"fileextensions\": \"crt;bin\",\n    \"desktopfile\": \"/usr/share/applications/x64.desktop\",\n    \"usedefaultapplication\": false\n}\n
"},{"location":"applications/vice/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output vice.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vice.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vice.d.3.0.json\n\n
"},{"location":"applications/vice/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.18.04:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes vice libmp3lame0 git wget && apt-get clean\nRUN git clone https://github.com/stuartcarnie/vice-emu/ && mv vice-emu/vice/data/DRIVES/* /usr/lib/vice/C64 && cd /vice-emu/vice/data/C64 && mv chargen kernal basic /usr/lib/vice/C64\nRUN mkdir /usr/lib/vice/C64/cartridge\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_1-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_1-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_2-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_2-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_3-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_3-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/Super_Games_4-8000.bin -O /usr/lib/vice/C64/cartridge/Super_Games_4-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/C64638_Jack_Attack-8000.bin -O /usr/lib/vice/C64/cartridge/C64638_Jack_Attack-8000.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315102-01.bin -O /usr/lib/vice/C64/cartridge/315102-01.bin\nRUN wget http://www.zimmers.net/anonftp/pub/cbm/firmware/misc/c64carts/315103-01.bin -O /usr/lib/vice/C64/cartridge/315103-01.bin\nLABEL oc.icon=\"c64.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIxNDAiPg0KICA8cGF0aCBkPSJNODMsOTcuMTEwOSBMODMsMTI4LjU4MzMgQTYxLDYxIDAgMSwxIDgzLDExLjQxNjcgTDgzLDQyLjg4OTEgQTMyLDMyIDAgMSwwIDgzLDk3LjExMDkiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMjI1NSIgLz4NCiAgPHBvbHlnb24gcG9pbnRzPSI4Myw0MyA4Myw2NyAxMTEsNjcgMTM1LDQzIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDIyNTUiIC8+DQogIDxwb2x5Z29uIHBvaW50cz0iODMsOTcgODMsNzMgMTExLDczIDEzNSw5NyIgc3Ryb2tlPSJub25lIiBmaWxsPSIjZmYwMDAwIiAvPg0KPC9zdmc+\"\nLABEL oc.keyword=\"vice,x64,vice,commodore,c64\"\nLABEL oc.cat=\"games\"\nLABEL oc.desktopfile=\"x64.desktop\"\nLABEL oc.launch=\"x64.X64\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.18.04\"\nLABEL oc.name=\"vice\"\nLABEL oc.displayname=\"Commodore64\"\nLABEL oc.path=\"/usr/bin/x64\"\nLABEL oc.type=app\nLABEL oc.fileextensions=\"crt;bin\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vice\"\nENV APPBIN \"/usr/bin/x64\"\nENV APP \"/usr/bin/x64\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vice/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vice/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application vice

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vice.d\n
"},{"location":"applications/vice/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f vice.d -t vice .\n
"},{"location":"applications/vice/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect vice > vice.json\ndocker image save vice -o vice.tar\nctr -n k8s.io images import vice.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vice.json\n\n
"},{"location":"applications/vlc/","title":"vlc","text":""},{"location":"applications/vlc/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/vlc/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/vlc/#alpine-packages","title":"Alpine packages","text":"
ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\n
"},{"location":"applications/vlc/#displayname","title":"Displayname","text":"
videolan\n
"},{"location":"applications/vlc/#path","title":"Path","text":"
/usr/bin/vlc\n
"},{"location":"applications/vlc/#mimetype","title":"Mimetype","text":"
video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\n
"},{"location":"applications/vlc/#file-extensions","title":"File extensions","text":"

\"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\"

"},{"location":"applications/vlc/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/vlc/#wm_class","title":"WM_CLASS","text":"
vlc.vlc\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/vlc/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/vlc.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/vlc/#json-dump","title":"JSON dump","text":"

json source file vlc.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office,graphics\",\n    \"apkpackage\": \"ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\",\n    \"icon\": \"circle_vlc.svg\",\n    \"keyword\": \"vlc, videolan, video, lan, dvd\",\n    \"launch\": \"vlc.vlc\",\n    \"name\": \"vlc\",\n    \"displayname\": \"videolan\",\n    \"path\": \"/usr/bin/vlc\",\n    \"mimetype\": \"video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\",\n    \"fileextensions\": \"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"desktopfile\": \"/usr/share/applications/vlc.desktop\",\n    \"quick\": true\n}\n
"},{"location":"applications/vlc/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output vlc.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vlc.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vlc.d.3.0.json\n\n
"},{"location":"applications/vlc/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update ffmpeg vlc-qt dbus dbus-x11 mesa-dri-gallium\nLABEL oc.icon=\"circle_vlc.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQ2FsY3VsYXRvciIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZlYzU4OSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iNTIwIiB4Mj0iNTIwIiB5MT0iNCIgeTI9IjEwMjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjZSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjUyMC4zMiIgeDI9IjUyMC4zMiIgeTE9Ii0xMzguNDYiIHkyPSIxNDg0LjgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmZGE2NCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjM1MTUyIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjQ0OTc2Ii8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNDkuNTgyIiB4Mj0iNDkuNTgyIiB5MT0iLTQwLjc2NCIgeTI9IjEyMC45MiIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIDMuMjQ1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIuNiIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDdkN2Q3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImYiIHg9Ii0uMDM0ODc1IiB5PSItLjAzNzIiIHdpZHRoPSIxLjA2OTgiIGhlaWdodD0iMS4wNzQ0IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjM5NDk5ODkiLz4KICA8L2ZpbHRlcj4KICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGN4PSI1MTEuOCIgY3k9IjUxMS4zNSIgcj0iNDcxLjQ1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDgwOCAuMDI0NDQyIC0uMDI0NDM5IDEuMDgwNiAtMjguODM5IC01My43NDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmRhNjQiIHN0b3Atb3BhY2l0eT0iLjA4NTU2MiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmYjdjMzgiIG9mZnNldD0iLjkxMDczIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmMzRmMTciIG9mZnNldD0iMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE0LjE0MzUiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM3NjIgMCAwIC4wNjM3NjIgLS42MTQyNCAtLjY3OCkiIHN0cm9rZS13aWR0aD0iMTUuNjgzIj4KICA8ZyBpZD0ic2hhZG93IiB0cmFuc2Zvcm09Im1hdHJpeCguOTk2MDkgMCAwIC45OTYwOSAyIDIpIj48L2c+CiAgPGcgaWQ9ImNpcmNsZSIgdHJhbnNmb3JtPSJtYXRyaXgoLjk5Nzk4IDAgMCAuOTk3OTggLjczMTMxIDIuMTgwNCkiIGZpbGw9InVybCgjZCkiPgogICA8ZyBzdHJva2Utd2lkdGg9IjE1LjY4MyI+CiAgICA8cGF0aCBkPSJtOTgzLjI1IDUxMS4zNWMwLTcuOTUtMC4yLTE1Ljg1LTAuNS0yMy41NXEtOC0xODAuMTUtMTM3LjU1LTMwOS44NWMtOTIuMDUtOTItMjAzLjItMTM4LjA1LTMzMy40LTEzOC4wNS0xMzAuMTUgMC0yNDEuMzUgNDYuMDUtMzMzLjM1IDEzOC4wNS05Mi4wNSA5Mi0xMzguMSAyMDMuMi0xMzguMSAzMzMuNCAwIDEzMC4xNSA0Ni4wNSAyNDEuMzUgMTM4LjEgMzMzLjM1IDg2LjE1IDg2LjMgMTg5LjM1IDEzMi4xNSAzMDkuMTUgMTM3LjYgOCAwLjMgMTYgMC41IDI0LjIgMC41IDEzMC4yIDAgMjQxLjM1LTQ2LjEgMzMzLjQtMTM4LjEgOTItOTIgMTM4LjA1LTIwMy4yIDEzOC4wNS0zMzMuMzV6IiBmaWxsPSIjMDAwIiBmaWx0ZXI9InVybCgjZykiIG9wYWNpdHk9Ii4yNSIvPgogICAgPHBhdGggZD0ibTk4My4yNSA1MTEuMzVjMC03Ljk1LTAuMi0xNS44NS0wLjUtMjMuNTVxLTgtMTgwLjE1LTEzNy41NS0zMDkuODVjLTkyLjA1LTkyLTIwMy4yLTEzOC4wNS0zMzMuNC0xMzguMDUtMTMwLjE1IDAtMjQxLjM1IDQ2LjA1LTMzMy4zNSAxMzguMDUtOTIuMDUgOTItMTM4LjEgMjAzLjItMTM4LjEgMzMzLjQgMCAxMzAuMTUgNDYuMDUgMjQxLjM1IDEzOC4xIDMzMy4zNSA4Ni4xNSA4Ni4zIDE4OS4zNSAxMzIuMTUgMzA5LjE1IDEzNy42IDggMC4zIDE2IDAuNSAyNC4yIDAuNSAxMzAuMiAwIDI0MS4zNS00Ni4xIDMzMy40LTEzOC4xIDkyLTkyIDEzOC4wNS0yMDMuMiAxMzguMDUtMzMzLjM1eiIgZmlsbD0idXJsKCNjKSIvPgogICAgPHBhdGggZD0ibTk4My4yNSA1MTEuMzVjMC03Ljk1LTAuMi0xNS44NS0wLjUtMjMuNTVxLTgtMTgwLjE1LTEzNy41NS0zMDkuODVjLTkyLjA1LTkyLTIwMy4yLTEzOC4wNS0zMzMuNC0xMzguMDUtMTMwLjE1IDAtMjQxLjM1IDQ2LjA1LTMzMy4zNSAxMzguMDUtOTIuMDUgOTItMTM4LjEgMjAzLjItMTM4LjEgMzMzLjQgMCAxMzAuMTUgNDYuMDUgMjQxLjM1IDEzOC4xIDMzMy4zNSA4Ni4xNSA4Ni4zIDE4OS4zNSAxMzIuMTUgMzA5LjE1IDEzNy42IDggMC4zIDE2IDAuNSAyNC4yIDAuNSAxMzAuMiAwIDI0MS4zNS00Ni4xIDMzMy40LTEzOC4xIDkyLTkyIDEzOC4wNS0yMDMuMiAxMzguMDUtMzMzLjM1eiIgZmlsbD0idXJsKCNhKSIgb3BhY2l0eT0iLjIiLz4KICAgPC9nPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCg2LjA1NjIgMCAwIDYuMDU2MiAyMTkuOSAxOTkuODMpIj4KICAgPGcgc3Ryb2tlLXdpZHRoPSIxNS42ODMiPgogICAgPHBhdGggZD0ibTQ3Ljk5OCA2My40MzRjMTEuOTUxIDAgMjEuOTU1LTQuMDYxIDIyLjU2MS05LjM2Mi0xLjc3Ny00Ljk4NS0zLjcxNS0xMC40MjEtNS42MTktMTUuNzY0LTEuMzIyIDMuODExLTguNjIzIDYuNDk4LTE2Ljk0MSA2LjQ5OC04LjMxNiAwLTE1LjYxNy0yLjY4OC0xNi45NDEtNi40OTctMS45MDQgNS4zNDItMy44NCAxMC43NzctNS42MTcgMTUuNzYzIDAuNjA0IDUuMzAxIDEwLjYwNiA5LjM2MiAyMi41NTcgOS4zNjJ6bTAtMzMuNTI2YzUuNjE3IDAgMTAuODM2LTEuNzM5IDEyLjM2My00LjQzOS0yLjEwNS01LjkxMy0zLjkxNC0xMC45ODYtNS4wNTctMTQuMTg3LTAuNzU5LTIuMTMzLTQuMjAxLTMuMjQxLTcuMzA2LTMuMjQxcy02LjU0NyAxLjEwOC03LjMwNyAzLjI0MWMtMS4xNDEgMy4yMDEtMi45NDkgOC4yNzQtNS4wNTcgMTQuMTg3IDEuNTI4IDIuNyA2Ljc0OSA0LjQzOSAxMi4zNjQgNC40Mzl6bTQzLjkwNCAzOC40NjUtMTguNzc3LTcuNTYzIDIuMTYyIDYuMDMzYy0wLjEwOSA2LjM5NC0xMi41MjEgMTEuNDg5LTI3LjI4OSAxMS40ODktMTQuNzY2IDAtMjcuMTgtNS4wOTUtMjcuMjg3LTExLjQ4OWwyLjE2LTYuMDMzLTE4Ljc3NSA3LjU2M2MtNS4yNjQgMi4xMjEtNS40ODQgNi4wNDktMC40OSA4LjcyNmwzNS4zMTIgMTguOTM1YzQuOTk0IDIuNjc3IDEzLjE2OCAyLjY3NyAxOC4xNjIgMGwzNS4zMTItMTguOTM1YzQuOTk1LTIuNjc3IDQuNzc0LTYuNjA1LTAuNDktOC43MjZ6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4yIi8+CiAgICA8cGF0aCBkPSJtNDcuOTk4IDYxLjYzN2MxMS45NTEgMCAyMS45NTUtNC4wNjEgMjIuNTYxLTkuMzYyLTEuNzc3LTQuOTg1LTMuNzE1LTEwLjQyMS01LjYxOS0xNS43NjQtMS4zMjIgMy44MTEtOC42MjMgNi40OTgtMTYuOTQxIDYuNDk4LTguMzE2IDAtMTUuNjE3LTIuNjg4LTE2Ljk0MS02LjQ5Ny0xLjkwNCA1LjM0Mi0zLjg0IDEwLjc3Ny01LjYxNyAxNS43NjMgMC42MDQgNS4zMDEgMTAuNjA2IDkuMzYyIDIyLjU1NyA5LjM2MnptMC0zMy41MjZjNS42MTcgMCAxMC44MzYtMS43MzkgMTIuMzYzLTQuNDM5LTIuMTA1LTUuOTEzLTMuOTE0LTEwLjk4Ni01LjA1Ny0xNC4xODctMC43NTktMi4xMzMtNC4yMDEtMy4yNDEtNy4zMDYtMy4yNDFzLTYuNTQ3IDEuMTA4LTcuMzA3IDMuMjQxYy0xLjE0MSAzLjIwMS0yLjk0OSA4LjI3NC01LjA1NyAxNC4xODcgMS41MjggMi43IDYuNzQ5IDQuNDM5IDEyLjM2NCA0LjQzOXptNDMuOTA0IDM4LjQ2NS0xOC43NzctNy41NjMgMi4xNjIgNi4wMzNjLTAuMTA5IDYuMzk0LTEyLjUyMSAxMS40ODktMjcuMjg5IDExLjQ4OS0xNC43NjYgMC0yNy4xOC01LjA5NS0yNy4yODctMTEuNDg5bDIuMTYtNi4wMzMtMTguNzc1IDcuNTYzYy01LjI2NCAyLjEyMS01LjQ4NCA2LjA0OS0wLjQ5IDguNzI2bDM1LjMxMiAxOC45MzVjNC45OTQgMi42NzcgMTMuMTY4IDIuNjc3IDE4LjE2MiAwbDM1LjMxMi0xOC45MzVjNC45OTUtMi42NzcgNC43NzQtNi42MDUtMC40OS04LjcyNnoiIGZpbGw9InVybCgjYikiLz4KICAgPC9nPgogIDwvZz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"vlc,vlc, videolan, video, lan, dvd\"\nLABEL oc.cat=\"utilities,office,graphics\"\nLABEL oc.desktopfile=\"vlc.desktop\"\nLABEL oc.launch=\"vlc.vlc\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"vlc\"\nLABEL oc.displayname=\"videolan\"\nLABEL oc.path=\"/usr/bin/vlc\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"video/3gpp;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/ogg;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/webm;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-ms-asx;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;\"\nLABEL oc.fileextensions=\"asx;dts;gxf;m2v;m3u;m4v;mpeg1;mpeg2;mts;mxf;ogm;pls;bup;a52;aac;b4s;cue;divx;dv;flv;m1v;m2ts;mkv;mov;mpeg4;oma;spx;ts,vlc,vob,xspf;dat;bin;ifo;part;3g2;avi;mpeg;mpg;flac;m4a;mp1;ogg;wav;xm;3gp;srt;wmv;ac3;asf;mod;mp2;mp3;mp4;wma;mka;m4p\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vlc\"\nENV APPBIN \"/usr/bin/vlc\"\nENV APP \"/usr/bin/vlc\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vlc/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vlc/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application vlc

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vlc.d\n
"},{"location":"applications/vlc/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f vlc.d -t vlc .\n
"},{"location":"applications/vlc/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect vlc > vlc.json\ndocker image save vlc -o vlc.tar\nctr -n k8s.io images import vlc.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vlc.json\n\n
"},{"location":"applications/vmmacos/","title":"vmmacos","text":""},{"location":"applications/vmmacos/#inherite-from","title":"inherite from","text":"

abcdesktop/docker-osx

"},{"location":"applications/vmmacos/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/vmmacos/#wm_class","title":"WM_CLASS","text":"
qemu.Qemu-system-x86_64\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/vmmacos/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN yes | sudo pacman -S xorg-xauth\n
"},{"location":"applications/vmmacos/#json-dump","title":"JSON dump","text":"

json source file vmmacos.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"RUN yes | sudo pacman -S xorg-xauth\"\n    ],\n    \"icon\": \"MacOS_logo.svg\",\n    \"keyword\": \"macos,apple\",\n    \"launch\": \"qemu.Qemu-system-x86_64\",\n    \"name\": \"vmmacos\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"devices\": [\n            \"/dev/kvm\"\n        ],\n        \"mem_limit\": \"16G\"\n    },\n    \"template\": \"abcdesktop/docker-osx\",\n    \"workdir\": \"/home/arch/OSX-KVM\",\n    \"user\": \"arch\",\n    \"home\": \"/home/arch\",\n    \"cmd\": [\n        \"/bin/bash\",\n        \"-c\",\n        \"sudo touch /dev/kvm /dev/snd \\\"${IMAGE_PATH}\\\" \\\"${BOOTDISK}\\\" \\\"${ENV}\\\" 2>/dev/null || true; sudo chown -R $(id -u):$(id -g) /dev/kvm /dev/snd \\\"${IMAGE_PATH}\\\" \\\"${BOOTDISK}\\\" \\\"${ENV}\\\" 2>/dev/null || true     ; [[ \\\"${NOPICKER}\\\" == true ]] && {         sed -i '/^.*InstallMedia.*/d' Launch.sh         && export BOOTDISK=\\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore-nopicker.qcow2}\\\"     ; }     || export BOOTDISK=\\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\"     ; [[ \\\"${GENERATE_UNIQUE}\\\" == true ]] && {         ./Docker-OSX/osx-serial-generator/generate-unique-machine-values.sh             --master-plist-url=\\\"${MASTER_PLIST_URL}\\\"             --count 1             --tsv ./serial.tsv             --bootdisks             --width \\\"${WIDTH:-1920}\\\" -height \\\"${HEIGHT:-1080}\\\"   --output-bootdisk \\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\"             --output-env \\\"${ENV:=/env}\\\" || exit 1 ; }     ; [[ \\\"${GENERATE_SPECIFIC}\\\" == true ]] && {             source \\\"${ENV:=/env}\\\" 2>/dev/null             ; ./Docker-OSX/osx-serial-generator/generate-specific-bootdisk.sh --master-plist-url=\\\"${MASTER_PLIST_URL}\\\" --model \\\"${DEVICE_MODEL}\\\"             --serial \\\"${SERIAL}\\\"             --board-serial \\\"${BOARD_SERIAL}\\\"             --uuid \\\"${UUID}\\\"             --mac-address \\\"${MAC_ADDRESS}\\\" --width \\\"${WIDTH:-1920}\\\"             --height \\\"${HEIGHT:-1080}\\\"             --output-bootdisk \\\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\\\" || exit 1 ; } ; ./abcdesktop_config.sh ;  ./Launch.sh\"\n    ]\n}\n
"},{"location":"applications/vmmacos/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output vmmacos.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmmacos.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmmacos.d.3.0.json\n\n
"},{"location":"applications/vmmacos/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktop/docker-osx:$TAG\nUSER root\nRUN yes | sudo pacman -S xorg-xauth\nLABEL oc.icon=\"MacOS_logo.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQyIDQyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0yMy4wOTEgMTQuMDE4di0wLjM0MmwtMS4wNjMgMC4wNzNjLTAuMzAxIDAuMDE5LTAuNTI3IDAuMDgzLTAuNjc5IDAuMTkxLTAuMTUyIDAuMTA5LTAuMjI4IDAuMjYtMC4yMjggMC40NTMgMCAwLjE4OCAwLjA3NSAwLjMzOCAwLjIyNiAwLjQ0OSAwLjE1IDAuMTEyIDAuMzUyIDAuMTY3IDAuNjA0IDAuMTY3IDAuMTYxIDAgMC4zMTItMC4wMjUgMC40NTEtMC4wNzRzMC4yNjEtMC4xMTggMC4zNjMtMC4yMDZjMC4xMDItMC4wODcgMC4xODItMC4xOTEgMC4yMzktMC4zMTIgMC4wNTgtMC4xMjEgMC4wODctMC4yNTQgMC4wODctMC4zOTl6bS0yLjA5MS0xMy43NjhjLTExLjU3OSAwLTIwLjc1IDkuMTcxLTIwLjc1IDIwLjc1IDAgMTEuNTggOS4xNzEgMjAuNzUgMjAuNzUgMjAuNzVzMjAuNzUtOS4xNyAyMC43NS0yMC43NWMwLTExLjU3OS05LjE3LTIwLjc1LTIwLjc1LTIwLjc1em00LjAyOCAxMi4yOTljMC4wOTgtMC4yNzUgMC4yMzYtMC41MTEgMC40MTUtMC43MDdzMC4zOTQtMC4zNDcgMC42NDYtMC40NTMgMC41MzMtMC4xNTkgMC44NDItMC4xNTljMC4yNzkgMCAwLjUzMSAwLjA0MiAwLjc1NSAwLjEyNSAwLjIyNSAwLjA4MyAwLjQxNyAwLjE5NSAwLjU3OCAwLjMzNnMwLjI4OSAwLjMwNSAwLjM4MyAwLjQ5MyAwLjE1IDAuMzg3IDAuMTY5IDAuNTk2aC0wLjgzM2MtMC4wMjEtMC4xMTUtMC4wNTktMC4yMjMtMC4xMTMtMC4zMjJzLTAuMTI1LTAuMTg1LTAuMjEzLTAuMjU4Yy0wLjA4OS0wLjA3My0wLjE5My0wLjEzLTAuMzEyLTAuMTcxLTAuMTItMC4wNDItMC4yNTQtMC4wNjItMC40MDUtMC4wNjItMC4xNzcgMC0wLjMzOCAwLjAzNi0wLjQ4MSAwLjEwNy0wLjE0NCAwLjA3MS0wLjI2NyAwLjE3Mi0wLjM2OSAwLjMwMnMtMC4xODEgMC4yODktMC4yMzcgMC40NzVjLTAuMDU3IDAuMTg3LTAuMDg1IDAuMzk0LTAuMDg1IDAuNjIyIDAgMC4yMzYgMC4wMjggMC40NDggMC4wODUgMC42MzQgMC4wNTYgMC4xODcgMC4xMzYgMC4zNDQgMC4yNCAwLjQ3MyAwLjEwMyAwLjEyOSAwLjIyOCAwLjIyOCAwLjM3MyAwLjI5NnMwLjMwNSAwLjEwMyAwLjQ3OSAwLjEwM2MwLjI4NSAwIDAuNTE3LTAuMDY3IDAuNjk3LTAuMjAxczAuMjk2LTAuMzMgMC4zNS0wLjU4OGgwLjgzNGMtMC4wMjQgMC4yMjgtMC4wODcgMC40MzYtMC4xODkgMC42MjRzLTAuMjM0IDAuMzQ4LTAuMzk2IDAuNDgxYy0wLjE2MyAwLjEzMy0wLjM1NCAwLjIzNi0wLjU3NCAwLjMwOHMtMC40NjIgMC4xMDktMC43MjUgMC4xMDljLTAuMzEyIDAtMC41OTMtMC4wNTItMC44NDYtMC4xNTUtMC4yNTItMC4xMDMtMC40NjktMC4yNTItMC42NDktMC40NDVzLTAuMzE5LTAuNDI4LTAuNDE3LTAuNzA1LTAuMTQ3LTAuNTg4LTAuMTQ3LTAuOTM1Yy0yZS0zIC0wLjMzOSAwLjA0Ny0wLjY0NyAwLjE0NS0wLjkyM3ptLTExLjg1My0xLjI2MmgwLjgzNHYwLjc0MWgwLjAxNmMwLjA1MS0wLjEyMyAwLjExOC0wLjIzNCAwLjItMC4zMyAwLjA4Mi0wLjA5NyAwLjE3Ni0wLjE3OSAwLjI4NC0wLjI0OCAwLjEwNy0wLjA2OSAwLjIyNi0wLjEyMSAwLjM1NC0wLjE1NyAwLjEyOS0wLjAzNiAwLjI2NS0wLjA1NCAwLjQwNy0wLjA1NCAwLjMwNiAwIDAuNTY1IDAuMDczIDAuNzc1IDAuMjE5IDAuMjExIDAuMTQ2IDAuMzYxIDAuMzU2IDAuNDQ5IDAuNjNoMC4wMjFjMC4wNTYtMC4xMzIgMC4xMy0wLjI1IDAuMjIxLTAuMzU0czAuMTk2LTAuMTk0IDAuMzE0LTAuMjY4IDAuMjQ4LTAuMTMgMC4zODktMC4xNjkgMC4yODktMC4wNTggMC40NDUtMC4wNThjMC4yMTUgMCAwLjQxIDAuMDM0IDAuNTg2IDAuMTAzczAuMzI2IDAuMTY1IDAuNDUxIDAuMjkgMC4yMjEgMC4yNzcgMC4yODggMC40NTUgMC4xMDEgMC4zNzYgMC4xMDEgMC41OTR2Mi45ODFoLTAuODd2LTIuNzcyYzAtMC4yODctMC4wNzQtMC41MS0wLjIyMi0wLjY2Ny0wLjE0Ny0wLjE1Ny0wLjM1OC0wLjIzNi0wLjYzMi0wLjIzNi0wLjEzNCAwLTAuMjU3IDAuMDI0LTAuMzY5IDAuMDcxLTAuMTExIDAuMDQ3LTAuMjA4IDAuMTEzLTAuMjg4IDAuMTk4LTAuMDgxIDAuMDg0LTAuMTQ0IDAuMTg2LTAuMTg5IDAuMzA0LTAuMDQ2IDAuMTE4LTAuMDY5IDAuMjQ3LTAuMDY5IDAuMzg3djIuNzE1aC0wLjg1OHYtMi44NDRjMC0wLjEyNi0wLjAyLTAuMjQtMC4wNTktMC4zNDJzLTAuMDk0LTAuMTg5LTAuMTY3LTAuMjYyYy0wLjA3Mi0wLjA3My0wLjE2MS0wLjEyOC0wLjI2NC0wLjE2Ny0wLjEwNC0wLjAzOS0wLjIyLTAuMDU5LTAuMzQ5LTAuMDU5LTAuMTM0IDAtMC4yNTggMC4wMjUtMC4zNzMgMC4wNzUtMC4xMTQgMC4wNS0wLjIxMiAwLjExOS0wLjI5NCAwLjIwNy0wLjA4MiAwLjA4OS0wLjE0NiAwLjE5My0wLjE5MSAwLjMxNC0wLjA0NCAwLjEyLTAuMTE2IDAuMjUyLTAuMTE2IDAuMzk0djIuNjgzaC0wLjgyNXYtNC4zNzR6bTEuODkzIDIwLjkzOWMtMy44MjUgMC02LjIyNC0yLjY1OC02LjIyNC02LjlzMi4zOTktNi45MDkgNi4yMjQtNi45MDkgNi4yMTUgMi42NjcgNi4yMTUgNi45MDljMCA0LjI0MS0yLjM5IDYuOS02LjIxNSA2Ljl6bTcuMDgyLTE2LjU3NWMtMC4xNDEgMC4wMzYtMC4yODUgMC4wNTQtMC40MzMgMC4wNTQtMC4yMTggMC0wLjQxNy0wLjAzMS0wLjU5OC0wLjA5My0wLjE4Mi0wLjA2Mi0wLjMzNy0wLjE0OS0wLjQ2Ny0wLjI2MnMtMC4yMzItMC4yNDktMC4zMDQtMC40MDljLTAuMDczLTAuMTYtMC4xMDktMC4zMzgtMC4xMDktMC41MzQgMC0wLjM4NCAwLjE0My0wLjY4NCAwLjQyOS0wLjlzMC43LTAuMzQyIDEuMjQzLTAuMzc3bDEuMTgtMC4wNjh2LTAuMzM4YzAtMC4yNTItMC4wOC0wLjQ0NS0wLjI0LTAuNTc2cy0wLjM4Ni0wLjE5Ny0wLjY3OS0wLjE5N2MtMC4xMTggMC0wLjIyOSAwLjAxNS0wLjMzMSAwLjA0NC0wLjEwMiAwLjAzLTAuMTkyIDAuMDcyLTAuMjcgMC4xMjdzLTAuMTQzIDAuMTIxLTAuMTkzIDAuMTk4Yy0wLjA1MSAwLjA3Ni0wLjA4NiAwLjE2Mi0wLjEwNSAwLjI1NmgtMC44MThjNWUtMyAtMC4xOTMgMC4wNTMtMC4zNzIgMC4xNDMtMC41MzZzMC4yMTItMC4zMDYgMC4zNjctMC40MjcgMC4zMzYtMC4yMTUgMC41NDYtMC4yODIgMC40MzgtMC4xMDEgMC42ODUtMC4xMDFjMC4yNjYgMCAwLjUwNyAwLjAzMyAwLjcyMyAwLjEwMXMwLjQwMSAwLjE2MyAwLjU1NCAwLjI4OCAwLjI3MSAwLjI3NSAwLjM1NCAwLjQ1MSAwLjEyNSAwLjM3MyAwLjEyNSAwLjU5djMuMDAxaC0wLjgzM3YtMC43MjloLTAuMDIxYy0wLjA2MiAwLjExOC0wLjE0IDAuMjI1LTAuMjM1IDAuMzItMC4wOTYgMC4wOTUtMC4yMDMgMC4xNzctMC4zMjIgMC4yNDQtMC4xMiAwLjA2Ny0wLjI1IDAuMTE5LTAuMzkxIDAuMTU1em01LjUwMyAxNi41NzVjLTIuOTE3IDAtNC45LTEuNTI4LTUuMDM4LTMuOTI3aDEuODk5YzAuMTQ4IDEuMzcxIDEuNDczIDIuMjc5IDMuMjg4IDIuMjc5IDEuNzQxIDAgMi45OTItMC45MDggMi45OTItMi4xNDkgMC0xLjA3NC0wLjc2LTEuNzIzLTIuNTE5LTIuMTY3bC0xLjcxNC0wLjQyNmMtMi40NjQtMC42MTEtMy41ODQtMS43MzItMy41ODQtMy41NzUgMC0yLjI2OSAxLjk4Mi0zLjg0NCA0LjgwNy0zLjg0NCAyLjc2IDAgNC42ODYgMS41ODQgNC43NiAzLjg2MmgtMS44OGMtMC4xMy0xLjM3MS0xLjI1LTIuMjE0LTIuOTE4LTIuMjE0LTEuNjU4IDAtMi44MDYgMC44NTItMi44MDYgMi4wODQgMCAwLjk3MiAwLjcyMiAxLjU0NyAyLjQ4MiAxLjk5MWwxLjQ0NSAwLjM2MWMyLjc1MSAwLjY2NyAzLjg4MSAxLjc1MSAzLjg4MSAzLjY5Ni0xZS0zIDIuNDgyLTEuOTY0IDQuMDI5LTUuMDk1IDQuMDI5em0tMTIuNTg1LTEyLjEwNmMtMi42MjEgMC00LjI2IDIuMDEtNC4yNiA1LjIwNSAwIDMuMTg2IDEuNjM5IDUuMTk2IDQuMjYgNS4xOTYgMi42MTIgMCA0LjI2LTIuMDEgNC4yNi01LjE5NiAxZS0zIC0zLjE5NS0xLjY0OC01LjIwNS00LjI2LTUuMjA1eiIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"vmmacos,macos,apple\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"qemu.Qemu-system-x86_64\"\nLABEL oc.template=\"abcdesktop/docker-osx\"\nLABEL oc.name=\"vmmacos\"\nLABEL oc.displayname=\"vmmacos\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"devices\\\":[\\\"/dev/kvm\\\"],\\\"mem_limit\\\":\\\"16G\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmmacos\"\nLABEL oc.home=\"/home/arch\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER arch\nCMD [ \"/bin/bash,-c,sudo touch /dev/kvm /dev/snd \"${IMAGE_PATH}\" \"${BOOTDISK}\" \"${ENV}\" 2>/dev/null || true; sudo chown -R $(id -u):$(id -g) /dev/kvm /dev/snd \"${IMAGE_PATH}\" \"${BOOTDISK}\" \"${ENV}\" 2>/dev/null || true     ; [[ \"${NOPICKER}\" == true ]] && {         sed -i '/^.*InstallMedia.*/d' Launch.sh         && export BOOTDISK=\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore-nopicker.qcow2}\"     ; }     || export BOOTDISK=\"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\"     ; [[ \"${GENERATE_UNIQUE}\" == true ]] && {         ./Docker-OSX/osx-serial-generator/generate-unique-machine-values.sh             --master-plist-url=\"${MASTER_PLIST_URL}\"             --count 1             --tsv ./serial.tsv             --bootdisks             --width \"${WIDTH:-1920}\" -height \"${HEIGHT:-1080}\"   --output-bootdisk \"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\"             --output-env \"${ENV:=/env}\" || exit 1 ; }     ; [[ \"${GENERATE_SPECIFIC}\" == true ]] && {             source \"${ENV:=/env}\" 2>/dev/null             ; ./Docker-OSX/osx-serial-generator/generate-specific-bootdisk.sh --master-plist-url=\"${MASTER_PLIST_URL}\" --model \"${DEVICE_MODEL}\"             --serial \"${SERIAL}\"             --board-serial \"${BOARD_SERIAL}\"             --uuid \"${UUID}\"             --mac-address \"${MAC_ADDRESS}\" --width \"${WIDTH:-1920}\"             --height \"${HEIGHT:-1080}\"             --output-bootdisk \"${BOOTDISK:=/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2}\" || exit 1 ; } ; ./abcdesktop_config.sh ;  ./Launch.sh\" ]\n\n
"},{"location":"applications/vmmacos/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmmacos/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application vmmacos

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmmacos.d\n
"},{"location":"applications/vmmacos/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f vmmacos.d -t vmmacos .\n
"},{"location":"applications/vmmacos/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect vmmacos > vmmacos.json\ndocker image save vmmacos -o vmmacos.tar\nctr -n k8s.io images import vmmacos.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmmacos.json\n\n
"},{"location":"applications/vmrc/","title":"vmrc","text":""},{"location":"applications/vmrc/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/vmrc/#licence","title":"Licence","text":"

** This application is NO FREE. ** You need to build it manually.

"},{"location":"applications/vmrc/#displayname","title":"Displayname","text":"
VMRC\n
"},{"location":"applications/vmrc/#path","title":"Path","text":"
/usr/bin/vmrc\n
"},{"location":"applications/vmrc/#mimetype","title":"Mimetype","text":"
x-scheme-handler/vmrc;\n
"},{"location":"applications/vmrc/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/vmrc/#wm_class","title":"WM_CLASS","text":"
vmrc.Vmrc\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/vmrc/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/vmware-vmrc.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/vmrc/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN apt-get update && apt-get install  --no-install-recommends --yes libaio1 && apt-get clean\nCOPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\nRUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\nRUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\n
"},{"location":"applications/vmrc/#json-dump","title":"JSON dump","text":"

json source file vmrc.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"licence\": \"non-free\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_vmware.svg\",\n    \"keyword\": \"vmrc,vmware,remote,console\",\n    \"launch\": \"vmrc.Vmrc\",\n    \"name\": \"vmrc\",\n    \"displayname\": \"VMRC\",\n    \"path\": \"/usr/bin/vmrc\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"mimetype\": \"x-scheme-handler/vmrc;\",\n    \"desktopfile\": \"/usr/share/applications/vmware-vmrc.desktop\",\n    \"preruncommands\": [\n        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libaio1 && apt-get clean\",\n        \"COPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\",\n        \"RUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\",\n        \"RUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\"\n    ]\n}\n
"},{"location":"applications/vmrc/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output vmrc.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmrc.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmrc.d.3.0.json\n\n
"},{"location":"applications/vmrc/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nRUN apt-get update && apt-get install  --no-install-recommends --yes libaio1 && apt-get clean\nCOPY VMware-Remote-Console-12.0.1-18113358.x86_64.bundle /tmp\nRUN chmod o+x /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle\nRUN /tmp/VMware-Remote-Console-12.0.1-18113358.x86_64.bundle --eulas-agreed --console --required --ignore-errors\nLABEL oc.icon=\"circle_vmware.svg\"\nLABEL oc.icondata=\"PHN2ZyBpZD0iQXBwLVN0b3JlIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMjQgMTAyNCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSI1MjAiIHgyPSI1MjAuMDMiIHkxPSI0NCIgeTI9Ijk4NS44NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0MjM3IC0uNTQyMzcpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxNWUxZmMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMTg2M2VlIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ii0xLjM1NTkiIHgyPSItMS4zNTU5IiB5MT0iLTU5LjExOSIgeTI9IjE5Ni44OCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZlYjQyIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmOTMxMSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI2Mi42NDQiIHgyPSI2Mi42NDQiIHkxPSItMTIzLjEyIiB5Mj0iMTMyLjg4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZThlOGU4IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImUiIHg9Ii0uMDc1IiB5PSItLjA3NSIgd2lkdGg9IjEuMTUiIGhlaWdodD0iMS4xNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNy45OTk5OTk4Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wNzUiIHk9Ii0uMDc1IiB3aWR0aD0iMS4xNSIgaGVpZ2h0PSIxLjE1IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI3Ljk5OTk5OTgiLz4KICA8L2ZpbHRlcj4KIDwvZGVmcz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM1NiAwIDAgLjA2MzU2IC0uNTQyMzcgLS41NDIzNykiIGQ9Im05NjkuNyAzOTJjLTEuMS00LjM1LTIuMzUtOS0zLjY1LTEzLjYtMi41LTguNzUtNS4zNS0xNy42LTguNDUtMjYuMzUtNi40NS0xOC4yNS0xNC4xNS0zNi4wNS0yMy4xNS01My42NS0zLjgtNy40LTcuOTUtMTQuOTUtMTIuMy0yMi40aC0wLjAyNXEtMzAuNjAxLTUyLjAxLTc2LjMyNS05Ny43NWMtOTIuMTUtOTIuMTUtMjAzLjQ1LTEzOC4yNS0zMzMuOC0xMzguMjVzLTI0MS42IDQ2LjEtMzMzLjc1IDEzOC4yNS0xMzguMjUgMjAzLjQtMTM4LjI1IDMzMy43NSA0Ni4xIDI0MS42NSAxMzguMjUgMzMzLjhjNjguMDUgNjguMDUgMTQ2LjUgMTEwLjk1IDIzNC45IDEyOC42NSAzMS45NSA2LjQgNjQuNzUgOS41NSA5OC44NSA5LjU1IDEzMC4zNSAwIDI0MS42NS00Ni4wNSAzMzMuOC0xMzguMiA0OC42LTQ4LjYgODQuNC0xMDIuNSAxMDcuMzUtMTYxLjggMTctNDMuOTUgMjctOTAuOCAyOS45NS0xNDAuNzUgMC42LTEwLjIgMC45LTIwLjY1IDAuOS0zMS4yNSAwLTQxLjc1LTQuNy04MS42LTE0LjMtMTIweiIgZmlsdGVyPSJ1cmwoI2cpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMTUuNjcyIi8+CiA8cGF0aCBkPSJtNjEuMDkxIDI0LjM3M2MtMC4wNjk5MTYtMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDQtMC4yMzE5OS0wLjg2NDQxLTAuMTU4OS0wLjU1NjE1LTAuMzQwMDQtMS4xMTg2LTAuNTM3MDgtMS42NzQ4LTAuNDA5OTYtMS4xNi0wLjg5OTM3LTIuMjkxMy0xLjQ3MTQtMy40MS0wLjI0MTUzLTAuNDcwMzQtMC41MDUzLTAuOTUwMjItMC43ODE3OC0xLjQyMzdoLTAuMDAxNnEtMS45NDUtMy4zMDU3LTQuODUxMi02LjIxMjljLTUuODU3LTUuODU3LTEyLjkzMS04Ljc4NzEtMjEuMjE2LTguNzg3MXMtMTUuMzU2IDIuOTMwMS0yMS4yMTMgOC43ODcxLTguNzg3MSAxMi45MjgtOC43ODcxIDIxLjIxMyAyLjkzMDEgMTUuMzU5IDguNzg3MSAyMS4yMTZjNC4zMjUyIDQuMzI1MiA5LjMxMTUgNy4wNTE5IDE0LjkzIDguMTc2OSAyLjAzMDcgMC40MDY3OCA0LjExNTUgMC42MDY5OSA2LjI4MjkgMC42MDY5OSA4LjI4NSAwIDE1LjM1OS0yLjkyNjkgMjEuMjE2LTguNzgzOSAzLjA4OS0zLjA4OSA1LjM2NDQtNi41MTQ4IDYuODIzMS0xMC4yODQgMS4wODA1LTIuNzkzNCAxLjcxNjEtNS43NzEyIDEuOTAzNi04Ljk0NiAwLjAzODE0LTAuNjQ4MzEgMC4wNTcyLTEuMzEyNSAwLjA1NzItMS45ODYyIDAtMi42NTM2LTAuMjk4NzMtNS4xODY1LTAuOTA4OS03LjYyNzF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTYxIi8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCguMSAwIDAgLjEgMjguOTM2IDI4LjMxMikiIHN0cm9rZS13aWR0aD0iMTMuMzMzIj4KICA8cGF0aCBkPSJtMTAyLjY0IDE5Ni44OGMxMy4yOTcgMCAyNC0xMC43MDMgMjQtMjR2LTIwOGMwLTEzLjI5Ny0xMC43MDMtMjQtMjQtMjRoLTIwOGMtMTMuMjk3IDAtMjQgMTAuNzAzLTI0IDI0djIwOGMwIDEzLjI5NyAxMC43MDMgMjQgMjQgMjR6bS00MC02NGgtMTI4di0xMjhoMTI4eiIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiLz4KICA8cGF0aCBkPSJtMTY2LjY0IDEzMi44OGMxMy4yOTcgMCAyNC0xMC43MDMgMjQtMjR2LTIwOGMwLTEzLjI5Ny0xMC43MDMtMjQtMjQtMjRoLTIwOGMtMTMuMjk3IDAtMjQgMTAuNzAzLTI0IDI0djQwaDE5MnYxMjhoLTEyOHYtNjRoLTY0djEwNGMwIDEzLjI5NyAxMC43MDMgMjQgMjQgMjR6IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4xNSIvPgogIDxwYXRoIGQ9Im0xMDIuNjQgMTk2Ljg4YzEzLjI5NyAwIDI0LTEwLjcwMyAyNC0yNHYtMjA4YzAtMTMuMjk3LTEwLjcwMy0yNC0yNC0yNGgtMjA4Yy0xMy4yOTcgMC0yNCAxMC43MDMtMjQgMjR2MjA4YzAgMTMuMjk3IDEwLjcwMyAyNCAyNCAyNHptLTQwLTY0aC0xMjh2LTEyOGgxMjh6IiBmaWxsPSJ1cmwoI2MpIi8+CiAgPHBhdGggZD0ibTE2Ni42NCAxMzIuODhjMTMuMjk3IDAgMjQtMTAuNzAzIDI0LTI0di0yMDhjMC0xMy4yOTctMTAuNzAzLTI0LTI0LTI0aC0yMDhjLTEzLjI5NyAwLTI0IDEwLjcwMy0yNCAyNHY0MGgxOTJ2MTI4aC0xMjh2LTY0aC02NHYxMDRjMCAxMy4yOTcgMTAuNzAzIDI0IDI0IDI0eiIgZmlsbD0idXJsKCNhKSIvPgogPC9nPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"vmrc,vmrc,vmware,remote,console\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"vmware-vmrc.desktop\"\nLABEL oc.launch=\"vmrc.Vmrc\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"vmrc\"\nLABEL oc.displayname=\"VMRC\"\nLABEL oc.path=\"/usr/bin/vmrc\"\nLABEL oc.type=app\nLABEL oc.licence=\"non-free\"\nLABEL oc.mimetype=\"x-scheme-handler/vmrc;\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmrc\"\nENV APPBIN \"/usr/bin/vmrc\"\nENV APP \"/usr/bin/vmrc\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vmrc/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmrc/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application vmrc

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmrc.d\n
"},{"location":"applications/vmrc/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f vmrc.d -t vmrc .\n
"},{"location":"applications/vmrc/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect vmrc > vmrc.json\ndocker image save vmrc -o vmrc.tar\nctr -n k8s.io images import vmrc.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmrc.json\n\n
"},{"location":"applications/vmubuntu/","title":"vmubuntu","text":""},{"location":"applications/vmubuntu/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.vm.ubuntu:22.04

"},{"location":"applications/vmubuntu/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/vmubuntu/#wm_class","title":"WM_CLASS","text":"
qemu.Qemu-system-x86_64\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/vmubuntu/#json-dump","title":"JSON dump","text":"

json source file vmubuntu.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"icon\": \"vm-linux-ubuntu.svg\",\n    \"keyword\": \"vm,ubuntu,jammy\",\n    \"launch\": \"qemu.Qemu-system-x86_64\",\n    \"name\": \"vmubuntu\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"host_config\": {\n        \"devices\": [\n            \"/dev/kvm\"\n        ],\n        \"mem_limit\": \"16G\"\n    },\n    \"template\": \"abcdesktopio/oc.vm.ubuntu:22.04\",\n    \"home\": \"/home/balloon\",\n    \"cmd\": \"/docker-entrypoint.sh\"\n}\n
"},{"location":"applications/vmubuntu/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output vmubuntu.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmubuntu.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmubuntu.d.3.0.json\n\n
"},{"location":"applications/vmubuntu/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.vm.ubuntu:22.04\nUSER root\nLABEL oc.icon=\"vm-linux-ubuntu.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+CjxjaXJjbGUgZmlsbD0iI2Y0NzQyMSIgY3k9IjUwIiBjeD0iNTAiIHI9IjQ1Ii8+CjxjaXJjbGUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjguNTUiIGN4PSI1MCIgY3k9IjUwIiByPSIyMS44MjUiLz4KPGcgaWQ9ImZyaWVuZCI+PGNpcmNsZSBmaWxsPSIjZjQ3NDIxIiBjeD0iMTkuNCIgY3k9IjUwIiByPSI4LjQzNzYiLz4KPHBhdGggc3Ryb2tlPSIjZjQ3NDIxIiBzdHJva2Utd2lkdGg9IjMuMjM3OCIgZD0iTTY3LDUwSDc3Ii8+CjxjaXJjbGUgZmlsbD0iI2ZmZmZmZiIgY3g9IjE5LjQiIGN5PSI1MCIgcj0iNi4wMDc0NSIvPjwvZz4KPHVzZSB4bGluazpocmVmPSIjZnJpZW5kIiB0cmFuc2Zvcm09InJvdGF0ZSgxMjAsNTAsNTApIi8+Cjx1c2UgeGxpbms6aHJlZj0iI2ZyaWVuZCIgdHJhbnNmb3JtPSJyb3RhdGUoMjQwLDUwLDUwKSIvPjwvc3ZnPg==\"\nLABEL oc.keyword=\"vmubuntu,vm,ubuntu,jammy\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"qemu.Qemu-system-x86_64\"\nLABEL oc.template=\"abcdesktopio/oc.vm.ubuntu:22.04\"\nLABEL oc.name=\"vmubuntu\"\nLABEL oc.displayname=\"vmubuntu\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"devices\\\":[\\\"/dev/kvm\\\"],\\\"mem_limit\\\":\\\"16G\\\"}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"vmubuntu\"\nLABEL oc.home=\"/home/balloon\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vmubuntu/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vmubuntu/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application vmubuntu

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vmubuntu.d\n
"},{"location":"applications/vmubuntu/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f vmubuntu.d -t vmubuntu .\n
"},{"location":"applications/vmubuntu/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect vmubuntu > vmubuntu.json\ndocker image save vmubuntu -o vmubuntu.tar\nctr -n k8s.io images import vmubuntu.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vmubuntu.json\n\n
"},{"location":"applications/vscode/","title":"VSCode","text":""},{"location":"applications/vscode/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/vscode/#arguments","title":"Arguments","text":"

\"--extensions-dir /usr/share/code/extensions --verbose\"

"},{"location":"applications/vscode/#path","title":"Path","text":"
/usr/bin/code\n
"},{"location":"applications/vscode/#mimetype","title":"Mimetype","text":"
text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\n
"},{"location":"applications/vscode/#file-extensions","title":"File extensions","text":"

\"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\"

"},{"location":"applications/vscode/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"c;cpp;py;json;java;md;yml;yaml;\"

"},{"location":"applications/vscode/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/vscode/#wm_class","title":"WM_CLASS","text":"
code.Code\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/vscode/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/code.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/vscode/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\n
"},{"location":"applications/vscode/#json-dump","title":"JSON dump","text":"

json source file vscode.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"\",\n    \"icon\": \"circle_visual-studio-code.svg\",\n    \"keyword\": \"ide,vscode,visual studio code,code\",\n    \"launch\": \"code.Code\",\n    \"name\": \"VSCode\",\n    \"path\": \"/usr/bin/code\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"desktop\": \"code.desktop\",\n    \"host_config\": {\n        \"mem_limit\": \"2G\",\n        \"shm_size\": \"2G\",\n        \"cpu_period\": 200000,\n        \"cpu_quota\": 200000,\n        \"cap_add\": [\n            \"SYS_ADMIN\"\n        ]\n    },\n    \"args\": \"--extensions-dir /usr/share/code/extensions --verbose\",\n    \"mimetype\": \"text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\",\n    \"legacyfileextensions\": \"c;cpp;py;json;java;md;yml;yaml;\",\n    \"fileextensions\": \"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\",\n    \"desktopfile\": \"/usr/share/applications/code.desktop\",\n    \"preruncommands\": [\n        \"RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\",\n        \"RUN echo \\\"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\\\" > /etc/apt/sources.list.d/teams.list\",\n        \"RUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\",\n        \"RUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\"\n    ],\n    \"quick\": true\n}\n
"},{"location":"applications/vscode/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output vscode.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/vscode.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @vscode.d.3.0.json\n\n
"},{"location":"applications/vscode/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nRUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-archive-keyring.gpg\nRUN echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main\" > /etc/apt/sources.list.d/teams.list\nRUN apt update && apt install -y --no-install-recommends code && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN mkdir -p /usr/share/code/extensions && chmod 777 /usr/share/code /usr/share/code/extensions\nLABEL oc.icon=\"circle_visual-studio-code.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiPgogICA8c3RvcCBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZyIgeDE9IjQwMi43MSIgeDI9IjQwMi43MSIgeTE9IjEzNy44OSIgeTI9IjQ2My4wNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTkxODkgMCAwIC4xOTE4OSAtNDQuNjY0IC0yNS41OTgpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMzIzMjMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNWM1YzVjIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjM4My41OCIgeDI9IjM4My41OCIgeTE9IjEzNy44OSIgeTI9IjQ2My4wNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMiAwIDAgLjIgLTQ4IC0yNy45OTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDg5ZDIiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMjZiMWYzIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImkiIHg9Ii0uMDM2IiB5PSItLjAzNiIgd2lkdGg9IjEuMDcyIiBoZWlnaHQ9IjEuMDcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0LjUiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSI4NiIgeDI9IjYzIiB5MT0iMTkuNDU4IiB5Mj0iMzkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwN2FiYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDZjYWYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iODYiIHgyPSI4MyIgeTE9IjIwIiB5Mj0iMjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjYSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZCIgeDE9Ijg3IiB4Mj0iNjMiIHkxPSI0NiIgeTI9IjI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDgwY2UiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMDA4ZmQ1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ijg2IiB4Mj0iODMiIHkxPSI0NCIgeTI9IjQ0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjA5NTkzNyIgeT0iLS4wOTYwNjMiIHdpZHRoPSIxLjE5MTkiIGhlaWdodD0iMS4xOTIxIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjk2MTUxODg1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaiIgeD0iLS4wOTU3OTYiIHk9Ii0uMDk2MjA1IiB3aWR0aD0iMS4xOTE2IiBoZWlnaHQ9IjEuMTkyNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS4yNzk0MTc3Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iaCIgeD0iLS4wNiIgeT0iLS4wNiIgd2lkdGg9IjEuMTIiIGhlaWdodD0iMS4xMiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS4zNSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHBhdGggY2xhc3M9InNocDEiIHRyYW5zZm9ybT0ibWF0cml4KC4yIDAgMCAuMiAtNDggLTI3Ljk5NCkiIGQ9Im00MDAgNDUwYzgyLjg0IDAgMTUwLTY3LjE2IDE1MC0xNTBzLTY3LjE2LTE1MC0xNTAtMTUwLTE1MCA2Ny4xNi0xNTAgMTUwIDY3LjE2IDE1MCAxNTAgMTUweiIgZmlsdGVyPSJ1cmwoI2kpIiBvcGFjaXR5PSIuMjUiIHN0cm9rZS13aWR0aD0iMTUuNjgzIi8+CiA8cGF0aCBjbGFzcz0ic2hwMSIgZD0ibTMyIDU4YzE0LjM1OSAwIDI2LTExLjY0MSAyNi0yNnMtMTEuNjQxLTI2LTI2LTI2Yy0xNC4zNTkgMC0yNiAxMS42NDEtMjYgMjZzMTEuNjQxIDI2IDI2IDI2eiIgZmlsbD0idXJsKCNnKSIvPgogPHBhdGggZD0ibTMyIDVjLTE0LjkxMSAwLTI3IDEyLjA4OS0yNyAyN3MxMi4wODkgMjcgMjcgMjdjMTQuOTExIDAgMjctMTIuMDg5IDI3LTI3cy0xMi4wODktMjctMjctMjd6bTAgMmMxMy44MDcgMCAyNSAxMS4xOTMgMjUgMjVzLTExLjE5MyAyNS0yNSAyNWMtMTMuODA3IDAtMjUtMTEuMTkzLTI1LTI1czExLjE5My0yNSAyNS0yNXoiIGZpbHRlcj0idXJsKCNoKSIgb3BhY2l0eT0iLjE1Ii8+CiA8cGF0aCBkPSJtMzIgMi4wMDU5Yy0xNi41NjggMC0zMCAxMy40MzQtMzAgMzAuMDAyIDAgMTYuNTY4IDEzLjQzMiAzMCAzMCAzMHMzMC4wMDItMTMuNDMyIDMwLjAwMi0zMGMwLTE2LjU2OC0xMy40MzQtMzAuMDAyLTMwLjAwMi0zMC4wMDJ6bTAgMy45OTQxYzE0LjM1OSAwIDI2IDExLjY0MSAyNiAyNnMtMTEuNjQxIDI2LTI2IDI2Yy0xNC4zNTkgMC0yNi0xMS42NDEtMjYtMjZzMTEuNjQxLTI2IDI2LTI2eiIgZmlsbD0idXJsKCNiKSIgc3Ryb2tlLXdpZHRoPSIzLjEzNjYiLz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00Ni4wMDEgLjAwMDY4OTcpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogIDxwYXRoIGQ9Im04NS4yMjMgMTYuMDUxYy0wLjM0MjE0IDAuMDM4MTgtMC42NzUwNyAwLjE1NTM4LTEuMDA3OCAwLjM3NSA0LjE3ZS00IDUuMmUtNCAwLjAwMTUgMC4wMDE0IDJlLTMgMmUtMyAtMC4xNDExMyAwLjA3NjY4LTAuMjgxNzcgMC4xNzI4LTAuNDE2MDIgMC4yOTY4OGwtMjEuMzU3IDE5Ljc0Yy0wLjQxNTY4IDAuMzg0MTctMC43MTM2NyAxLjA1NjMtMC4xODk0NSAxLjU1NDdsMS45OTYxIDEuODk4NGMwLjc4NTE1IDAuNzQ2NDcgMS42ODYgMC4wOTkzMSAyLjAzMTItMC4xNzE4OGwxOS43NDYtMTUuMTAydjE0LjcxMWwtMS42MTMzIDEuMjA5Yy0xLjI0MzMgMC45MzE1NyAwLjExMzI2IDYuMjk3OS0wLjIxMjg5IDYuOTg4MyAwLjM2MDMyIDAuMjE5OTEgMC44OTgxIDAuNDUzNzggMS4zNjkxIDAuMzk2NDggMC4xNTA4OS0wLjAxODM1IDAuMzAzNjItMC4wNjA1NCAwLjQ1NTA4LTAuMTM0NzdsNi41NjQ1LTMuMjE4OGMwLjcxNTQ0LTAuMzUwNjUgMS40Mzc1LTAuNjQwNzUgMS40Mzc1LTEuNDM3NXYtMjIuMzE2YzAtMC43OTY3NS0wLjcyMjA2LTEuMDg2OS0xLjQzNzUtMS40Mzc1bC02LjU2NDUtMy4yMTg4Yy0wLjE1MTQ2LTAuMDc0MjMtMC4zMDQxOS0wLjExNjQyLTAuNDU1MDgtMC4xMzQ3Ny0wLjExNzc2LTAuMDE0MzItMC4yMzM2MS0wLjAxMjczLTAuMzQ3NjYgMHoiIGZpbHRlcj0idXJsKCNqKSIgb3BhY2l0eT0iLjE1IiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogIDxwYXRoIGQ9Im04NS4yMjIgMTYuMDUxYy0wLjM0MjE0IDAuMDM4MTgtMC42NzUwNyAwLjE1NTM4LTEuMDA3OCAwLjM3NSAwLjUyMDU0IDAuNjQ3OTktMC41MzAyNiA2Ljc0ODMgMC43ODU2IDcuNTc0MmwxLjAyNjkgMC42NDQ1M3YxNC43MTFsLTEuNjEzMSAxLjIwODZjLTEuMjQzMyAwLjkzMTU3IDAuMTEyNTcgNi4yOTc0LTAuMjEzNTggNi45ODc3IDAuMzYwMzIgMC4yMTk5MSAwLjg5ODYgMC40NTQ2NiAxLjM2OTYgMC4zOTczOCAwLjE1MDg5LTAuMDE4MzUgMC4zMDM2Mi0wLjA2MDU0IDAuNDU1MDgtMC4xMzQ3N2w2LjU2NDUtMy4yMTg4YzAuNzE1NDQtMC4zNTA2NSAxLjQzNzUtMC42NDA3NSAxLjQzNzUtMS40Mzc1di0yMi4zMTZjMC0wLjc5Njc1LTAuNzIyMDYtMS4wODY5LTEuNDM3NS0xLjQzNzVsLTYuNTY0NS0zLjIxODhjLTAuMTUxNDYtMC4wNzQyMy0wLjMwNDE5LTAuMTE2NDItMC40NTUwOC0wLjEzNDc3LTAuMTE3NzYtMC4wMTQzMi0wLjIzMzYxLTAuMDEyNzMtMC4zNDc2NiAweiIgZmlsbD0iIzBkOTZkZCIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDM2LjQ2NSAyMS4zNTktMTkuNzRjMC45Njk3LTAuODk2MjEgMi4yMjU3LTAuNTc4NDIgMi4yMjU3IDEuMjc1M3Y2LjY0NDFsLTE5Ljc0NiAxNS4xMDJjLTAuMzQ1MjkgMC4yNzExOS0xLjI0NTEgMC45MTg5Mi0yLjAzMDIgMC4xNzI0NWwtMS45OTc3LTEuODk5M2MtMC41MjQyMi0wLjQ5ODQtMC4yMjYzMy0xLjE3MDIgMC4xODkzNS0xLjU1NDR6IiBmaWxsPSJ1cmwoI2YpIiBzdHlsZT0icGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogIDxwYXRoIGQ9Im02Mi40NDMgMjcuNTI1IDIxLjM1OSAxOS43NGMwLjk2OTcgMC44OTYyMSAyLjIyNTcgMC41Nzg0MiAyLjIyNTctMS4yNzUzdi02LjY0NDFsLTE5Ljc0Ni0xNS4xMDJjLTAuMzQ1MjktMC4yNzExOS0xLjI0NTEtMC45MTg5Mi0yLjAzMDItMC4xNzI0NWwtMS45OTc3IDEuODk5M2MtMC41MjQyMiAwLjQ5ODQtMC4yMjYzMyAxLjE3MDIgMC4xODkzNSAxLjU1NDR6IiBmaWx0ZXI9InVybCgjaykiIG9wYWNpdHk9Ii4yNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDI3LjUyNSAyMS4zNTkgMTkuNzRjMC45Njk3IDAuODk2MjEgMi4yMjU3IDAuNTc4NDIgMi4yMjU3LTEuMjc1M3YtNi42NDQxbC0xOS43NDYtMTUuMTAyYy0wLjM0NTI5LTAuMjcxMTktMS4yNDUxLTAuOTE4OTItMi4wMzAyLTAuMTcyNDVsLTEuOTk3NyAxLjg5OTNjLTAuNTI0MjIgMC40OTg0LTAuMjI2MzMgMS4xNzAyIDAuMTg5MzUgMS41NTQ0eiIgZmlsbD0idXJsKCNkKSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KICA8cGF0aCBkPSJtNjIuNDQzIDM2LjQ2NSAyMS4zNTktMTkuNzRjMC45Njk3LTAuODk2MjEgMi4yMjU3LTAuNTc4NDIgMi4yMjU3IDEuMjc1M3Y2LjY0NDFsLTE5Ljc0NiAxNS4xMDJjLTAuMzQ1MjkgMC4yNzExOS0xLjI0NTEgMC45MTg5Mi0yLjAzMDIgMC4xNzI0NWwtMS45OTc3LTEuODk5M2MtMC41MjQyMi0wLjQ5ODQtMC4yMjYzMy0xLjE3MDIgMC4xODkzNS0xLjU1NDR6IiBmaWxsPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMTUiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgZmlsbCBtYXJrZXJzIi8+CiAgPHBhdGggZD0ibTYyLjQ0MyAyNy41MjUgMjEuMzU5IDE5Ljc0YzAuOTY5NyAwLjg5NjIxIDIuMjI1NyAwLjU3ODQyIDIuMjI1Ny0xLjI3NTN2LTYuNjQ0MWwtMTkuNzQ2LTE1LjEwMmMtMC4zNDUyOS0wLjI3MTE5LTEuMjQ1MS0wLjkxODkyLTIuMDMwMi0wLjE3MjQ1bC0xLjk5NzcgMS44OTkzYy0wLjUyNDIyIDAuNDk4NC0wLjIyNjMzIDEuMTcwMiAwLjE4OTM1IDEuNTU0NHoiIGZpbGw9InVybCgjYykiIG9wYWNpdHk9Ii4xNSIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"vscode,ide,vscode,visual studio code,code\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"code.desktop\"\nLABEL oc.launch=\"code.Code\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"--extensions-dir /usr/share/code/extensions --verbose\"\nLABEL oc.name=\"VSCode\"\nLABEL oc.displayname=\"VSCode\"\nLABEL oc.path=\"/usr/bin/code\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/x-c;application/json;application/javascript;application/xml;text/xml;application/java-archive;text/x-java-source;text/plain;image/svg+xml;application/x-csh;text/x-yaml;application/x-yaml;application/x-python;\"\nLABEL oc.fileextensions=\"c;cpp;py;json;js;java;jav;md;xml;txt;svg;html;htm;sh;csh;css;jsx;tsx;vue;yml;yaml;\"\nLABEL oc.legacyfileextensions=\"c;cpp;py;json;java;md;yml;yaml;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"2G\\\",\\\"shm_size\\\":\\\"2G\\\",\\\"cpu_period\\\":200000,\\\"cpu_quota\\\":200000,\\\"cap_add\\\":[\\\"SYS_ADMIN\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"VSCode\"\nENV APPBIN \"/usr/bin/code\"\nLABEL oc.args=\"--extensions-dir /usr/share/code/extensions --verbose\"\nENV APP \"/usr/bin/code\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/vscode/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/vscode/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application VSCode

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/VSCode.d\n
"},{"location":"applications/vscode/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f VSCode.d -t VSCode .\n
"},{"location":"applications/vscode/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect VSCode > VSCode.json\ndocker image save VSCode -o VSCode.tar\nctr -n k8s.io images import VSCode.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @VSCode.json\n\n
"},{"location":"applications/weather/","title":"weather","text":""},{"location":"applications/weather/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/weather/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/weather/#alpine-packages","title":"Alpine packages","text":"
gnome-weather\n
"},{"location":"applications/weather/#path","title":"Path","text":"
/usr/bin/gnome-weather\n
"},{"location":"applications/weather/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/weather/#wm_class","title":"WM_CLASS","text":"
org.gnome.Weather.org.gnome.Weather\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/weather/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.gnome.Weather.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/weather/#json-dump","title":"JSON dump","text":"

json source file weather.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"gnome-weather\",\n    \"icon\": \"org.gnome.Weather.svg\",\n    \"keyword\": \"weather\",\n    \"launch\": \"org.gnome.Weather.org.gnome.Weather\",\n    \"name\": \"weather\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/gnome-weather\",\n    \"args\": \"\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/org.gnome.Weather.desktop\"\n}\n
"},{"location":"applications/weather/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output weather.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/weather.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @weather.d.3.0.json\n\n
"},{"location":"applications/weather/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update gnome-weather\nLABEL oc.icon=\"org.gnome.Weather.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGZpbHRlciBpZD0iYSIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjQyIi8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZiIgeD0iLS4wNSIgeT0iLS4wNzUiIHdpZHRoPSIxLjEiIGhlaWdodD0iMS4xNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIuNzc3Ii8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZSIgeD0iLS4wOTYiIHk9Ii0uMDk2IiB3aWR0aD0iMS4xOTIiIGhlaWdodD0iMS4xOTIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iLjg4Ii8+PC9maWx0ZXI+PGZpbHRlciBpZD0iZCIgeD0iLS4wOCIgeT0iLS4xMiIgd2lkdGg9IjEuMTYiIGhlaWdodD0iMS4yNCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjI0NCIvPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjM5OS41NyIgeDI9IjM5OS41NyIgeTE9IjU0NS44IiB5Mj0iNTE3LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgyNi4zNiAtMTEwNy41KSBzY2FsZSgyLjE0MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzVlYTVmYiIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuOTkiIHgyPSIzOTkuOTkiIHkxPSI1NDUuMTQiIHkyPSI1MTguMTQiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgyNi4zNiAtMTEwNy41KSBzY2FsZSgyLjE0MjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzdhZGNmYyIgb2Zmc2V0PSIwIi8+PHN0b3Agc3RvcC1jb2xvcj0iIzBhNzllZCIgb2Zmc2V0PSIxIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PGNpcmNsZSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODI2LjM2IC0xMTA3LjUpIHNjYWxlKDIuMTQyOSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjI1Ii8+PGcgc3Ryb2tlLXdpZHRoPSIxLjU3MSI+PGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbD0idXJsKCNiKSIvPjxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9Im5vbmUiLz48L2c+PHBhdGggZD0iTTMyLjQ3OCAyMi4xMTZhMTEuMTQ1IDExLjE0NSAwIDAgMC0xMS4xNDUgMTEuMTQ1IDExLjE0NSAxMS4xNDUgMCAwIDAgLjAxOC41MTIgNi42MzIgNi42MzIgMCAwIDAtNS45OTcgNi41OTVBNi42MzIgNi42MzIgMCAwIDAgMjEuOTg2IDQ3aDIxLjY0MmE5LjAxOCA5LjAxOCAwIDAgMCA5LjAxOC05LjAxOCA5LjAxOCA5LjAxOCAwIDAgMC05LjAxOC05LjAxOCA5LjAxOCA5LjAxOCAwIDAgMC0uODU3LjA0OSAxMS4xNDUgMTEuMTQ1IDAgMCAwLTEwLjI5NC02Ljg5N3oiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjEiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48Y2lyY2xlIGN4PSIyMiIgY3k9IjI4IiByPSIxMSIgZmlsdGVyPSJ1cmwoI2UpIiBvcGFjaXR5PSIuMjUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48Y2lyY2xlIGN4PSIyMiIgY3k9IjI4IiByPSIxMSIgZmlsbD0iI2ZmZDIwZiIgc3R5bGU9InBhaW50LW9yZGVyOm5vcm1hbCIvPjxwYXRoIGQ9Ik0zMi40NzggMjIuMTE2YTExLjE0NSAxMS4xNDUgMCAwIDAtMTEuMTQ1IDExLjE0NSAxMS4xNDUgMTEuMTQ1IDAgMCAwIC4wMTguNTEyIDYuNjMyIDYuNjMyIDAgMCAwLTUuOTk3IDYuNTk1QTYuNjMyIDYuNjMyIDAgMCAwIDIxLjk4NiA0N2gyMS42NDJhOS4wMTggOS4wMTggMCAwIDAgOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtLjg1Ny4wNDkgMTEuMTQ1IDExLjE0NSAwIDAgMC0xMC4yOTQtNi44OTd6IiBmaWx0ZXI9InVybCgjZikiIG9wYWNpdHk9Ii4xNSIgc3R5bGU9InBhaW50LW9yZGVyOm5vcm1hbCIvPjxwYXRoIGQ9Ik0zMi40NzggMjIuMTE2YTExLjE0NSAxMS4xNDUgMCAwIDAtMTEuMTQ1IDExLjE0NSAxMS4xNDUgMTEuMTQ1IDAgMCAwIC4wMTguNTEyIDYuNjMyIDYuNjMyIDAgMCAwLTUuOTk3IDYuNTk1QTYuNjMyIDYuNjMyIDAgMCAwIDIxLjk4NiA0N2gyMS42NDJhOS4wMTggOS4wMTggMCAwIDAgOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtOS4wMTgtOS4wMTggOS4wMTggOS4wMTggMCAwIDAtLjg1Ny4wNDkgMTEuMTQ1IDExLjE0NSAwIDAgMC0xMC4yOTQtNi44OTd6IiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIuODUiIHN0eWxlPSJwYWludC1vcmRlcjpub3JtYWwiLz48L3N2Zz4=\"\nLABEL oc.keyword=\"weather,weather\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"org.gnome.Weather.desktop\"\nLABEL oc.launch=\"org.gnome.Weather.org.gnome.Weather\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"weather\"\nLABEL oc.displayname=\"weather\"\nLABEL oc.path=\"/usr/bin/gnome-weather\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"weather\"\nENV APPBIN \"/usr/bin/gnome-weather\"\nENV APP \"/usr/bin/gnome-weather\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/weather/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/weather/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application weather

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/weather.d\n
"},{"location":"applications/weather/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f weather.d -t weather .\n
"},{"location":"applications/weather/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect weather > weather.json\ndocker image save weather -o weather.tar\nctr -n k8s.io images import weather.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @weather.json\n\n
"},{"location":"applications/whatsdesk/","title":"whatsdesk","text":""},{"location":"applications/whatsdesk/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk.20.04

"},{"location":"applications/whatsdesk/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/whatsdesk/#ubuntu-packages","title":"Ubuntu packages","text":"
dbus-x11\n
"},{"location":"applications/whatsdesk/#path","title":"Path","text":"
/opt/whatsdesk/whatsdesk\n
"},{"location":"applications/whatsdesk/#mimetype","title":"Mimetype","text":"
x-scheme-handler/whatsapp;\n
"},{"location":"applications/whatsdesk/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/whatsdesk/#wm_class","title":"WM_CLASS","text":"
whatsdesk.whatsdesk\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/whatsdesk/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/whatsdesk.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/whatsdesk/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

RUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\n
"},{"location":"applications/whatsdesk/#json-dump","title":"JSON dump","text":"

json source file whatsdesk.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities,office\",\n    \"debpackage\": \"dbus-x11\",\n    \"icon\": \"whatsapp.svg\",\n    \"keyword\": \"whatsapp,whatsdesk\",\n    \"launch\": \"whatsdesk.whatsdesk\",\n    \"name\": \"whatsdesk\",\n    \"path\": \"/opt/whatsdesk/whatsdesk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk.20.04\",\n    \"mimetype\": \"x-scheme-handler/whatsapp;\",\n    \"desktopfile\": \"/usr/share/applications/whatsdesk.desktop\",\n    \"preruncommands\": [\n        \"RUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\",\n        \"RUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\"\n    ]\n}\n
"},{"location":"applications/whatsdesk/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output whatsdesk.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/whatsdesk.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @whatsdesk.d.3.0.json\n\n
"},{"location":"applications/whatsdesk/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk.20.04:$TAG\nUSER root\nRUN curl -Ls -o /tmp/whatsdesk.deb https://zerkc.gitlab.io/whatsdesk/whatsdesk_0.3.9_amd64.deb\nRUN apt-get update && apt-get install --no-install-recommends --yes desktop-file-utils libasound2 && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN apt-get update && apt-get install --no-install-recommends --yes /tmp/whatsdesk.deb && apt-get clean && rm -rf /var/lib/apt/lists/*\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends dbus-x11 && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"whatsapp.svg\"\nLABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzUuMjE2IDE3NS41NTIiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ijg1LjkxNSIgeDI9Ijg2LjUzNSIgeTE9IjMyLjU2NyIgeTI9IjEzNy4wOTIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM1N2QxNjMiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyM2IzM2EiLz48L2xpbmVhckdyYWRpZW50PjxmaWx0ZXIgaWQ9ImEiIHdpZHRoPSIxLjExNSIgaGVpZ2h0PSIxLjExNCIgeD0iLS4wNTciIHk9Ii0uMDU3IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMuNTMxIi8+PC9maWx0ZXI+PC9kZWZzPjxwYXRoIGZpbGw9IiNiM2IzYjMiIGQ9Im01NC41MzIgMTM4LjQ1IDIuMjM1IDEuMzI0YzkuMzg3IDUuNTcxIDIwLjE1IDguNTE4IDMxLjEyNiA4LjUyM2guMDIzYzMzLjcwNyAwIDYxLjEzOS0yNy40MjYgNjEuMTUzLTYxLjEzNS4wMDYtMTYuMzM1LTYuMzQ5LTMxLjY5Ni0xNy44OTUtNDMuMjUxQTYwLjc1IDYwLjc1IDAgMCAwIDg3Ljk0IDI1Ljk4M2MtMzMuNzMzIDAtNjEuMTY2IDI3LjQyMy02MS4xNzggNjEuMTNhNjAuOTggNjAuOTggMCAwIDAgOS4zNDkgMzIuNTM1bDEuNDU1IDIuMzEyLTYuMTc5IDIyLjU1OHptLTQwLjgxMSAyMy41NDRMMjQuMTYgMTIzLjg4Yy02LjQzOC0xMS4xNTQtOS44MjUtMjMuODA4LTkuODIxLTM2Ljc3Mi4wMTctNDAuNTU2IDMzLjAyMS03My41NSA3My41NzgtNzMuNTUgMTkuNjgxLjAxIDM4LjE1NCA3LjY2OSA1Mi4wNDcgMjEuNTcyczIxLjUzNyAzMi4zODMgMjEuNTMgNTIuMDM3Yy0uMDE4IDQwLjU1My0zMy4wMjcgNzMuNTUzLTczLjU3OCA3My41NTNoLS4wMzJjLTEyLjMxMy0uMDA1LTI0LjQxMi0zLjA5NC0zNS4xNTktOC45NTR6bTAgMCIgZmlsdGVyPSJ1cmwoI2EpIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTEyLjk2NiAxNjEuMjM4IDEwLjQzOS0zOC4xMTRhNzMuNDIgNzMuNDIgMCAwIDEtOS44MjEtMzYuNzcyYy4wMTctNDAuNTU2IDMzLjAyMS03My41NSA3My41NzgtNzMuNTUgMTkuNjgxLjAxIDM4LjE1NCA3LjY2OSA1Mi4wNDcgMjEuNTcyczIxLjUzNyAzMi4zODMgMjEuNTMgNTIuMDM3Yy0uMDE4IDQwLjU1My0zMy4wMjcgNzMuNTUzLTczLjU3OCA3My41NTNoLS4wMzJjLTEyLjMxMy0uMDA1LTI0LjQxMi0zLjA5NC0zNS4xNTktOC45NTR6Ii8+PHBhdGggZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDE3ODApIiBkPSJNODcuMTg0IDI1LjIyN2MtMzMuNzMzIDAtNjEuMTY2IDI3LjQyMy02MS4xNzggNjEuMTNhNjAuOTggNjAuOTggMCAwIDAgOS4zNDkgMzIuNTM1bDEuNDU1IDIuMzEyLTYuMTc5IDIyLjU1OSAyMy4xNDYtNi4wNjkgMi4yMzUgMS4zMjRjOS4zODcgNS41NzEgMjAuMTUgOC41MTggMzEuMTI2IDguNTI0aC4wMjNjMzMuNzA3IDAgNjEuMTQtMjcuNDI2IDYxLjE1My02MS4xMzVhNjAuNzUgNjAuNzUgMCAwIDAtMTcuODk1LTQzLjI1MSA2MC43NSA2MC43NSAwIDAgMC00My4yMzUtMTcuOTI5eiIvPjxwYXRoIGZpbGw9InVybCgjYikiIGQ9Ik04Ny4xODQgMjUuMjI3Yy0zMy43MzMgMC02MS4xNjYgMjcuNDIzLTYxLjE3OCA2MS4xM2E2MC45OCA2MC45OCAwIDAgMCA5LjM0OSAzMi41MzVsMS40NTUgMi4zMTMtNi4xNzkgMjIuNTU4IDIzLjE0Ni02LjA2OSAyLjIzNSAxLjMyNGM5LjM4NyA1LjU3MSAyMC4xNSA4LjUxNyAzMS4xMjYgOC41MjNoLjAyM2MzMy43MDcgMCA2MS4xNC0yNy40MjYgNjEuMTUzLTYxLjEzNWE2MC43NSA2MC43NSAwIDAgMC0xNy44OTUtNDMuMjUxIDYwLjc1IDYwLjc1IDAgMCAwLTQzLjIzNS0xNy45Mjh6Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNjguNzcyIDU1LjYwM2MtMS4zNzgtMy4wNjEtMi44MjgtMy4xMjMtNC4xMzctMy4xNzZsLTMuNTI0LS4wNDNjLTEuMjI2IDAtMy4yMTguNDYtNC45MDIgMi4zcy02LjQzNSA2LjI4Ny02LjQzNSAxNS4zMzIgNi41ODggMTcuNzg1IDcuNTA2IDE5LjAxMyAxMi43MTggMjAuMzgxIDMxLjQwNSAyNy43NWMxNS41MjkgNi4xMjQgMTguNjg5IDQuOTA2IDIyLjA2MSA0LjZzMTAuODc3LTQuNDQ3IDEyLjQwOC04Ljc0IDEuNTMyLTcuOTcxIDEuMDczLTguNzQtMS42ODUtMS4yMjYtMy41MjUtMi4xNDYtMTAuODc3LTUuMzY3LTEyLjU2Mi01Ljk4MS0yLjkxLS45MTktNC4xMzcuOTIxLTQuNzQ2IDUuOTc5LTUuODE5IDcuMjA2LTIuMTQ0IDEuMzgxLTMuOTg0LjQ2Mi03Ljc2LTIuODYxLTE0Ljc4NC05LjEyNGMtNS40NjUtNC44NzMtOS4xNTQtMTAuODkxLTEwLjIyOC0xMi43M3MtLjExNC0yLjgzNS44MDgtMy43NTFjLjgyNS0uODI0IDEuODM4LTIuMTQ3IDIuNzU5LTMuMjJzMS4yMjQtMS44NCAxLjgzNi0zLjA2NS4zMDctMi4zMDEtLjE1My0zLjIyLTQuMDMyLTEwLjAxMS01LjY2Ni0xMy42NDciLz48L3N2Zz4=\"\nLABEL oc.keyword=\"whatsdesk,whatsapp,whatsdesk\"\nLABEL oc.cat=\"utilities,office\"\nLABEL oc.desktopfile=\"whatsdesk.desktop\"\nLABEL oc.launch=\"whatsdesk.whatsdesk\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk.20.04\"\nLABEL oc.name=\"whatsdesk\"\nLABEL oc.displayname=\"whatsdesk\"\nLABEL oc.path=\"/opt/whatsdesk/whatsdesk\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"x-scheme-handler/whatsapp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"whatsdesk\"\nENV APPBIN \"/opt/whatsdesk/whatsdesk\"\nENV APP \"/opt/whatsdesk/whatsdesk\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/whatsdesk/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/whatsdesk/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application whatsdesk

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/whatsdesk.d\n
"},{"location":"applications/whatsdesk/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f whatsdesk.d -t whatsdesk .\n
"},{"location":"applications/whatsdesk/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect whatsdesk > whatsdesk.json\ndocker image save whatsdesk -o whatsdesk.tar\nctr -n k8s.io images import whatsdesk.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @whatsdesk.json\n\n
"},{"location":"applications/winefile-wine/","title":"winefile-wine","text":""},{"location":"applications/winefile-wine/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.wine

"},{"location":"applications/winefile-wine/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/winefile-wine/#alpine-packages","title":"Alpine packages","text":"
wine\n
"},{"location":"applications/winefile-wine/#displayname","title":"Displayname","text":"
Winefile Wine (alpine)\n
"},{"location":"applications/winefile-wine/#path","title":"Path","text":"
/usr/bin/winefile\n
"},{"location":"applications/winefile-wine/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/winefile-wine/#wm_class","title":"WM_CLASS","text":"
winefile.exe.winefile.exe\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/winefile-wine/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV WINEDLLOVERRIDES=mscoree,mshtml=\n
"},{"location":"applications/winefile-wine/#json-dump","title":"JSON dump","text":"

json source file winefile-wine.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=mscoree,mshtml=\"\n    ],\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"wine\",\n    \"icon\": \"winefile.svg\",\n    \"keyword\": \"wine,winfile,winefile,file,manager\",\n    \"launch\": \"winefile.exe.winefile.exe\",\n    \"name\": \"winefile-wine\",\n    \"displayname\": \"Winefile Wine (alpine)\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/winefile\",\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/winefile-wine/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output winefile-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winefile-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winefile-wine.d.3.0.json\n\n
"},{"location":"applications/winefile-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=mscoree,mshtml=\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"winefile.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNDhweCIKICAgaGVpZ2h0PSI0OHB4IgogICBpZD0ic3ZnNDI4OSIKICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40NSIKICAgc29kaXBvZGk6ZG9jYmFzZT0iL2hvbWUvZG9iZXkvUHJvamVjdHMvZ25vbWUtaWNvbi10aGVtZS9zY2FsYWJsZS9hcHBzIgogICBzb2RpcG9kaTpkb2NuYW1lPSJzeXN0ZW0tZmlsZS1tYW5hZ2VyLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MjkxIj4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MTE5NTUiCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDExOTU3IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjYWNjYzY7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMTE5NTkiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6Izg4OGE4NTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyMTQwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMjIxNDIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjIxNDgiCiAgICAgICAgIG9mZnNldD0iMC41IgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjpibGFjaztzdG9wLW9wYWNpdHk6MTsiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDIyMTQ0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjIxNDAiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyMzA0NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjE4LjE0MjEzNiIKICAgICAgIHkxPSIzNSIKICAgICAgIHgyPSIxOC4xNDIxMzYiCiAgICAgICB5Mj0iNDIuMDQwNjYxIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyMjEyMiIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDIzMDQyIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAsLTEuMDAwMDAxLDEuMTQyODU2LDAsLTg5LjEwMjU5LC0zMS40OTk5OSkiCiAgICAgICBjeD0iNyIKICAgICAgIGN5PSIzOS40NjQ4MDYiCiAgICAgICBmeD0iNyIKICAgICAgIGZ5PSIzOS40NjQ4MDYiCiAgICAgICByPSIzLjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyMTIyIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6YmxhY2s7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMjIxMjQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOmJsYWNrO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDIyMTI2IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MjIxMjIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyMzA0MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLC0xLjAwMDAwMSwxLjE0Mjg1NiwwLC00MS4xMDI1OSw0NS41MDAwMSkiCiAgICAgICBjeD0iNyIKICAgICAgIGN5PSIzOS40NjQ4MDYiCiAgICAgICBmeD0iNyIKICAgICAgIGZ5PSIzOS40NjQ4MDYiCiAgICAgICByPSIzLjUiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDc5NTciCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcAogICAgICAgICBpZD0ic3RvcDc5NTkiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2RkZGRkOTtzdG9wLW9wYWNpdHk6MSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3OTYxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM1NTU3NTM7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3OTUxIgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3A3OTUzIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkNmQ2ZDA7c3RvcC1vcGFjaXR5OjEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wNzk1NSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNTU1NzUzO3N0b3Atb3BhY2l0eToxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk5NyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOndoaXRlO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNjk5OSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6d2hpdGU7c3RvcC1vcGFjaXR5OjAuNDY5OTQ1MzQiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A3MDAxIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk4NSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNjNGM2YzA7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A2OTg3IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojODg4YTg1O3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNjk4OSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDExOTU1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Njk5MSIKICAgICAgIHgxPSIxOS41NzE0MjgiCiAgICAgICB5MT0iMTguMjg1NzE1IgogICAgICAgeDI9IjQwLjEwOTkzNiIKICAgICAgIHkyPSI0Mi43ODIzNzkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50Njk5NyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDcwMDMiCiAgICAgICB4MT0iMjMuNzE0Mjg5IgogICAgICAgeTE9IjE4LjYxODA0NCIKICAgICAgIHgyPSIyMy44NTY4ODQiCiAgICAgICB5Mj0iNi45OTk5OTgxIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDc5NTciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ3MDI1IgogICAgICAgeDE9IjI1LjAwMDAwMiIKICAgICAgIHkxPSIzMy40NzkwNzMiCiAgICAgICB4Mj0iMjQuNTcyOTIyIgogICAgICAgeTI9IjMxLjM2MzcwMSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtNS45NjA0NjRlLTgsMS4wMDAwMDEpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ3OTUxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NzAzOSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjI2LjQ4OTg0NyIKICAgICAgIHkxPSIzMi40OTQ5MTkiCiAgICAgICB4Mj0iMjYuMjYyNjkxIgogICAgICAgeTI9IjMwLjk0NTg5NiIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTUuMTEyOTcyZS02LC0xMi45OTk5OSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDY5ODUiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ5NzQ1IgogICAgICAgeDE9IjE5LjE1MTc3NSIKICAgICAgIHkxPSIxNS45Njk1NDMiCiAgICAgICB4Mj0iNDAuNDg4NjA5IgogICAgICAgeTI9IjMwLjA4ODM5OCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2OTg1IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50OTc1MyIKICAgICAgIHgxPSIyNC4yMDI1NDEiCiAgICAgICB5MT0iMjkuOTc5Njk0IgogICAgICAgeDI9IjQwLjIyOTUxMSIKICAgICAgIHkyPSI0MS4wNzE0MyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMTQiCiAgICAgaW5rc2NhcGU6Y3g9IjI4LjI1MDg4NiIKICAgICBpbmtzY2FwZTpjeT0iMTkuMTMxOTUzIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBzaG93Z3VpZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOmd1aWRlLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMjgwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijk0OSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMjUiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDI5NCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8Y2M6bGljZW5zZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvR1BMLzIuMC8iIC8+CiAgICAgICAgPGRjOnRpdGxlPlN5c3RlbSBGaWxlIE1hbmFnZXI8L2RjOnRpdGxlPgogICAgICAgIDxkYzpkYXRlPkp1bHkgMjAwNjwvZGM6ZGF0ZT4KICAgICAgICA8ZGM6Y3JlYXRvcj4KICAgICAgICAgIDxjYzpBZ2VudD4KICAgICAgICAgICAgPGRjOnRpdGxlPkFuZHJlYXMgTmlsc3NvbjwvZGM6dGl0bGU+CiAgICAgICAgICA8L2NjOkFnZW50PgogICAgICAgIDwvZGM6Y3JlYXRvcj4KICAgICAgICA8ZGM6c291cmNlPmh0dHA6Ly93d3cuZ25vbWUub3JnPC9kYzpzb3VyY2U+CiAgICAgIDwvY2M6V29yaz4KICAgICAgPGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9HUEwvMi4wLyI+CiAgICAgICAgPGNjOnBlcm1pdHMKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjL1JlcHJvZHVjdGlvbiIgLz4KICAgICAgICA8Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvRGlzdHJpYnV0aW9uIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvTm90aWNlIiAvPgogICAgICAgIDxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9EZXJpdmF0aXZlV29ya3MiIC8+CiAgICAgICAgPGNjOnJlcXVpcmVzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vd2ViLnJlc291cmNlLm9yZy9jYy9TaGFyZUFsaWtlIiAvPgogICAgICAgIDxjYzpyZXF1aXJlcwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2MvU291cmNlQ29kZSIgLz4KICAgICAgPC9jYzpMaWNlbnNlPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpZD0ibGF5ZXIxIgogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiPgogICAgPGcKICAgICAgIGlkPSJnMjIxNTAiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjY4NzUsMCwwLDEuNDI4NTcsOCwtMTYuOTk5OTQpIj4KICAgICAgPHJlY3QKICAgICAgICAgeT0iMzUiCiAgICAgICAgIHg9IjAiCiAgICAgICAgIGhlaWdodD0iNyIKICAgICAgICAgd2lkdGg9IjQiCiAgICAgICAgIGlkPSJyZWN0MjIxMjAiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50MjMwNDApO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjEuMjAwMDAwNTc7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgtMSwtMSkiCiAgICAgICAgIHk9Ii00MiIKICAgICAgICAgeD0iLTQ4IgogICAgICAgICBoZWlnaHQ9IjciCiAgICAgICAgIHdpZHRoPSI0IgogICAgICAgICBpZD0icmVjdDIyMTM0IgogICAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDIzMDQyKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDoxLjIwMDAwMDU3O3N0cm9rZS1vcGFjaXR5OjEiIC8+CiAgICAgIDxyZWN0CiAgICAgICAgIHk9IjM1IgogICAgICAgICB4PSI0IgogICAgICAgICBoZWlnaHQ9IjciCiAgICAgICAgIHdpZHRoPSI0MCIKICAgICAgICAgaWQ9InJlY3QyMjEzOCIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyMzA0NCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MS4yMDAwMDA1NztzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ2OTkxKTtmaWxsLW9wYWNpdHk6MS4wO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNTU1NzUzO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMTQuNTcxNDI5LDYuNSBMIDM0LjU3MTQyOSw2LjUgTCAzOC41LDExIEwgMzguNSwzOS41NzE0MjkgQyAzOC41MTQ3ODIsMzkuOTM2NzQ1IDM3Ljk1ODEzNSw0MC41MTYzNDYgMzcuNDcyOTE3LDQwLjQ1MzA5IEwgMTEuNDI4NTcxLDQwLjQ1MzA5IEMgMTAuOTA0NzYyLDQwLjM5NzI5OCAxMC41MjM4MDksNDAuMDU1NzkyIDEwLjUsMzkuNDI4NTcxIEwgMTAuNSwxMSBMIDE0LjU3MTQyOSw2LjUgeiAiCiAgICAgICBpZD0icGF0aDQzMDciCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjYyIgLz4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDk3NDUpO2ZpbGwtb3BhY2l0eToxLjA7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiM2YzZmNmE7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgaWQ9InJlY3Q1MTk3IgogICAgICAgd2lkdGg9IjIwLjk5OTk5NiIKICAgICAgIGhlaWdodD0iMTEuMDAwMDAzIgogICAgICAgeD0iMTQuNDk5OTk4IgogICAgICAgeT0iMTMuNDk5OTk4IgogICAgICAgcng9IjEuMDcxNDI4NSIKICAgICAgIHJ5PSIxLjA3MTQyODUiIC8+CiAgICA8cmVjdAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ5NzUzKTtmaWxsLW9wYWNpdHk6MS4wO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojNmM2ZjZhO3N0cm9rZS13aWR0aDowLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NTE5OSIKICAgICAgIHdpZHRoPSIyMC45OTk5OTYiCiAgICAgICBoZWlnaHQ9IjExLjAwMDAwMyIKICAgICAgIHg9IjE0LjUiCiAgICAgICB5PSIyNi40OTk5OTgiCiAgICAgICByeD0iMS4wNzE0Mjg1IgogICAgICAgcnk9IjEuMDcxNDI4NSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7b3BhY2l0eTowLjUiCiAgICAgICBkPSJNIDExLjE0Mjg1NywxMSBMIDM3Ljg1NzE0MywxMC45Mjg1NzEgTCAzNC41LDcgTCAxNSw3IEwgMTEuMTQyODU3LDExIHogIgogICAgICAgaWQ9InBhdGg1MjAzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzAwMyk7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO29wYWNpdHk6MC41IgogICAgICAgZD0iTSAxNC45MjM0MzUsNy40OTk5OTggTCAzNC4yODAzOTEsNy40OTk5OTggTCAzNy40OTk3NDIsMTEuMjQwNTQ2IEwgMzcuNDk5NzQyLDM5LjQ1MDM3NSBMIDExLjUwMDAwMywzOS40OTQzMjQgTCAxMS41MDAwMDMsMTEuMjQwNTQ2IEwgMTQuOTIzNDM1LDcuNDk5OTk4IHogIgogICAgICAgaWQ9InBhdGg2OTkzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIiAvPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTp1cmwoI2xpbmVhckdyYWRpZW50NzAyNSk7c3Ryb2tlLXdpZHRoOjAuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NzAxNyIKICAgICAgIHdpZHRoPSI3LjAwMDAwNTIiCiAgICAgICBoZWlnaHQ9IjMuMDAwMDA1MiIKICAgICAgIHg9IjIxLjUiCiAgICAgICB5PSIzMS40OTk5OTQiCiAgICAgICByeD0iMS4wNzE0MjgyIgogICAgICAgcnk9IjEuMDcxNDI4OCIgLz4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6dXJsKCNsaW5lYXJHcmFkaWVudDcwMzkpO3N0cm9rZS13aWR0aDowLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDcwMzciCiAgICAgICB3aWR0aD0iNy4wMDAwMDUyIgogICAgICAgaGVpZ2h0PSIzLjAwMDAwNTIiCiAgICAgICB4PSIyMS40OTk5OTQiCiAgICAgICB5PSIxNy41IgogICAgICAgcng9IjEuMDcxNDI4MiIKICAgICAgIHJ5PSIxLjA3MTQyODgiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6d2hpdGU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtvcGFjaXR5OjAuNiIKICAgICAgIGQ9Ik0gMTIuNSwxMC41NzE0MjkgTCAzNi41NzE0MjksMTAuNTcxNDI5IgogICAgICAgaWQ9InBhdGg2MDkzIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"winefile-wine,wine,winfile,winefile,file,manager\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winefile.exe.winefile.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"winefile-wine\"\nLABEL oc.displayname=\"Winefile Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/winefile\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winefile-wine\"\nENV APPBIN \"/usr/bin/winefile\"\nENV APP \"/usr/bin/winefile\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winefile-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winefile-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application winefile-wine

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winefile-wine.d\n
"},{"location":"applications/winefile-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f winefile-wine.d -t winefile-wine .\n
"},{"location":"applications/winefile-wine/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect winefile-wine > winefile-wine.json\ndocker image save winefile-wine -o winefile-wine.tar\nctr -n k8s.io images import winefile-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winefile-wine.json\n\n
"},{"location":"applications/winemine-wine/","title":"winemine-wine","text":""},{"location":"applications/winemine-wine/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.wine

"},{"location":"applications/winemine-wine/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/winemine-wine/#alpine-packages","title":"Alpine packages","text":"
wine\n
"},{"location":"applications/winemine-wine/#displayname","title":"Displayname","text":"
WineMine Wine (alpine)\n
"},{"location":"applications/winemine-wine/#path","title":"Path","text":"
/usr/bin/winemine\n
"},{"location":"applications/winemine-wine/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/winemine-wine/#wm_class","title":"WM_CLASS","text":"
winemine.exe.winemine.exe\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/winemine-wine/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\n
"},{"location":"applications/winemine-wine/#json-dump","title":"JSON dump","text":"

json source file winemine-wine.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"games\",\n    \"apkpackage\": \"wine\",\n    \"preruncommands\": [\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\"\n    ],\n    \"icon\": \"winemine.svg\",\n    \"keyword\": \"wine,winemine,mine\",\n    \"launch\": \"winemine.exe.winemine.exe\",\n    \"name\": \"winemine-wine\",\n    \"displayname\": \"WineMine Wine (alpine)\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"path\": \"/usr/bin/winemine\",\n    \"template\": \"abcdesktopio/oc.template.alpine.wine\"\n}\n
"},{"location":"applications/winemine-wine/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output winemine-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winemine-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winemine-wine.d.3.0.json\n\n
"},{"location":"applications/winemine-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.wine:$TAG\nUSER root\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nRUN apk add --no-cache --update wine\nLABEL oc.icon=\"winemine.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4wIgogICB3aWR0aD0iNzBwdCIKICAgaGVpZ2h0PSI3MHB0IgogICBpZD0ic3ZnMiI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiIC8+CiAgPGcKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxnCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY2LjYxMywtOTAuNjM3NDkpIgogICAgICAgaWQ9ImcxMDc5NyI+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEzMi43NTc4LDMzLjkwOTg4KSIKICAgICAgICAgaWQ9InVzZTQ0NzkiPgogICAgICAgIDxnCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjIuMzkxODQsNC4wNzUyNTEpIgogICAgICAgICAgIGlkPSJnMTA3ODkiPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gMTguNTk3ODY5LDU4LjQwMDc1OCBMIDkzLjc1NjAxLDU4LjQwMDc1OCBDIDkzLjc2MTAxMSw1OC40MDA3NTggOTMuNzY1MDM4LDU4LjQwNDk4NiA5My43NjUwMzgsNTguNDEwMjQgTCA5My43NjUwMzgsMTMzLjM0NDcxIEMgOTMuNzY1MDM4LDEzMy4zNDk5NiA5My43NjEwMTEsMTMzLjM1NDE5IDkzLjc1NjAxLDEzMy4zNTQxOSBMIDE4LjU5Nzg2OSwxMzMuMzU0MTkgQyAxOC41OTI4NTksMTMzLjM1NDE5IDE4LjU4ODgzLDEzMy4zNDk5NiAxOC41ODg4MywxMzMuMzQ0NzEgTCAxOC41ODg4Myw1OC40MTAyNCBDIDE4LjU4ODgzLDU4LjQwNDk4NiAxOC41OTI4NTksNTguNDAwNzU4IDE4LjU5Nzg2OSw1OC40MDA3NTggeiAiCiAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiNmZGZjZmQ7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNiZmE2Yjc7c3Ryb2tlLXdpZHRoOjAuNDc3ODQ1ODU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgICBpZD0icGF0aDEwNzkxIiAvPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgIGQ9Ik0gOTMuNjM5MDI0LDU4LjQ4NDM0OSBDIDkzLjY0NDAzLDU4LjQ4NDM0OSA5My42NDgwNjEsNTguNDg4NTg0IDkzLjY0ODA2MSw1OC40OTM4NDQgTCA5My42NDgwNjEsMTMzLjU0NDI5IEMgOTMuNjQ4MDYxLDEzMy41NDk1NSA5My42NDQwMywxMzMuNTUzNzggOTMuNjM5MDI0LDEzMy41NTM3OCBMIDE4LjM5NTkxMiwxMzMuNTUzNzggQyAxOC4zOTA5MDYsMTMzLjU1Mzc4IDE4LjM4Njg3NiwxMzMuNTQ5NTUgMTguMzg2ODc2LDEzMy41NDQyOSBMIDkzLjYzOTAyNCw1OC40ODQzNDkgeiAiCiAgICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiMyNTI1MmE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNiZmE2Yjc7c3Ryb2tlLXdpZHRoOjAuNDc4NDg1NzM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO21hcmtlcjpub25lO21hcmtlci1zdGFydDpub25lO21hcmtlci1taWQ6bm9uZTttYXJrZXItZW5kOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgICBpZD0icGF0aDEwNzkzIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8cmVjdAogICAgICAgICAgIHdpZHRoPSI2NS43NjA5MDIiCiAgICAgICAgICAgaGVpZ2h0PSI2NS43NjA5MDIiCiAgICAgICAgICAgcnk9IjAuMDA4MTU0MDg0OSIKICAgICAgICAgICB4PSI0NS41ODcxODkiCiAgICAgICAgICAgeT0iNjcuMTcyMjI2IgogICAgICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2ZpbGw6I2IzYjFiYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I2JmYTZiNztzdHJva2Utd2lkdGg6MC40MjEyMTM2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgICBpZD0icmVjdDEwNzk1IiAvPgogICAgICA8L2c+CiAgICAgIDxnCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjg2NCwwLDAsMC41MDg3MjIsNTI4LjY4ODcsLTEwOS4zNzgpIgogICAgICAgICBpZD0iZzgxMTEiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgZD0iTSAtNDc5LjY5MjAxLDQyMS43ODc3NSBMIC00NzkuNjkyMDEsNDczLjc4Mzc1IEMgLTQ3Mi44NTAwNiw0NzAuODk2NjIgLTQ2Mi43Mzg3OSw0NjUuMTIzMTYgLTQ2MC45MjA1Nyw0NjQuMDg1MzQgQyAtNDU4LjMxMDIsNDYyLjU5NTM4IC00MzguNjAyMTQsNDUxLjM1MDU5IC00MzguNTcxODcsNDQ4LjMxNzYgQyAtNDM4LjU0MTYsNDQ1LjI4NDYxIC00NTguMDIwMTIsNDMzLjYzNzgzIC00NjAuNjAwMjIsNDMyLjA5NDggQyAtNDYyLjQ0MzUzLDQzMC45OTI0MSAtNDcyLjkxMTg0LDQyNC43MzA5OCAtNDc5LjY5MjAxLDQyMS43ODc3NSB6ICIKICAgICAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtmaWxsOiMwMDhmMGY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjUzMzAzODtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7bWFya2VyOm5vbmU7bWFya2VyLXN0YXJ0Om5vbmU7bWFya2VyLW1pZDpub25lO21hcmtlci1lbmQ6bm9uZTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGUiCiAgICAgICAgICAgaWQ9InBhdGg4MTEzIiAvPgogICAgICAgIDxyZWN0CiAgICAgICAgICAgd2lkdGg9IjYuODU1NjA4IgogICAgICAgICAgIGhlaWdodD0iMTEzLjIzNTc4IgogICAgICAgICAgIHJ5PSIwLjAwMTA0NDQzOTYiCiAgICAgICAgICAgeD0iLTQ4Ni41NDY4NCIKICAgICAgICAgICB5PSI0MjEuNzk3NjEiCiAgICAgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozLjAzODE4NDE3O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDttYXJrZXI6bm9uZTttYXJrZXItc3RhcnQ6bm9uZTttYXJrZXItbWlkOm5vbmU7bWFya2VyLWVuZDpub25lO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgICAgICBpZD0icmVjdDgxMTUiIC8+CiAgICAgIDwvZz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"winemine-wine,wine,winemine,mine\"\nLABEL oc.cat=\"games\"\nLABEL oc.launch=\"winemine.exe.winemine.exe\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.wine\"\nLABEL oc.name=\"winemine-wine\"\nLABEL oc.displayname=\"WineMine Wine (alpine)\"\nLABEL oc.path=\"/usr/bin/winemine\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winemine-wine\"\nENV APPBIN \"/usr/bin/winemine\"\nENV APP \"/usr/bin/winemine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winemine-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winemine-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application winemine-wine

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winemine-wine.d\n
"},{"location":"applications/winemine-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f winemine-wine.d -t winemine-wine .\n
"},{"location":"applications/winemine-wine/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect winemine-wine > winemine-wine.json\ndocker image save winemine-wine -o winemine-wine.tar\nctr -n k8s.io images import winemine-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winemine-wine.json\n\n
"},{"location":"applications/winhelp-wine/","title":"winhelp-wine","text":""},{"location":"applications/winhelp-wine/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.wine

"},{"location":"applications/winhelp-wine/#arguments","title":"Arguments","text":"

\"winhelp\"

"},{"location":"applications/winhelp-wine/#displayname","title":"Displayname","text":"
Winhelp Wine\n
"},{"location":"applications/winhelp-wine/#path","title":"Path","text":"
/usr/bin/wine\n
"},{"location":"applications/winhelp-wine/#mimetype","title":"Mimetype","text":"
application/hlp;\n
"},{"location":"applications/winhelp-wine/#file-extensions","title":"File extensions","text":"

\"hlp;\"

"},{"location":"applications/winhelp-wine/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/winhelp-wine/#wm_class","title":"WM_CLASS","text":"
winhlp32.exe.Wine\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/winhelp-wine/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\n
"},{"location":"applications/winhelp-wine/#json-dump","title":"JSON dump","text":"

json source file winhelp-wine.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"args\": \"winhelp\",\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"ENV WINEARCH=win64\",\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n        \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\"\n    ],\n    \"debpackage\": \"\",\n    \"icon\": \"winhelp.svg\",\n    \"keyword\": \"wine,winhelp,text,hlp,help,wine\",\n    \"launch\": \"winhlp32.exe.Wine\",\n    \"name\": \"winhelp-wine\",\n    \"displayname\": \"Winhelp Wine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"mimetype\": \"application/hlp;\",\n    \"fileextensions\": \"hlp;\",\n    \"path\": \"/usr/bin/wine\",\n    \"template\": \"abcdesktopio/oc.template.wine\"\n}\n
"},{"location":"applications/winhelp-wine/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output winhelp-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winhelp-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winhelp-wine.d.3.0.json\n\n
"},{"location":"applications/winhelp-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.wine:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\nLABEL oc.icon=\"winhelp.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBDcmVhdGVkIHdpdGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+Cjxzdmcgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA0OCA0OC4wMDAwMDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ0NTM3IiB4MT0iLTQ3IiB4Mj0iLTEiIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMGEwZDQiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDFhOGQ3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgIDxkYzp0aXRsZS8+CiAgIDwvY2M6V29yaz4KICA8L3JkZjpSREY+CiA8L21ldGFkYXRhPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzLjk0OWUtNSkiPgogIDxwYXRoIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00em0wIDAuNXYwLjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjVjMCAyLjIxNi0xLjc4NCA0LTQgNGgtMzhjLTIuMjE2IDAtNC0xLjc4NC00LTR6IiBvcGFjaXR5PSIuMDIiLz4KICA8cGF0aCBkPSJtMSA0My4yNXYwLjI1YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtMC4yNWMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIG9wYWNpdHk9Ii4wNSIvPgogIDxwYXRoIGQ9Im0xIDQzdjAuMjVjMCAyLjIxNiAxLjc4NCA0IDQgNGgzOGMyLjIxNiAwIDQtMS43ODQgNC00di0wLjI1YzAgMi4yMTYtMS43ODQgNC00IDRoLTM4Yy0yLjIxNiAwLTQtMS43ODQtNC00eiIgb3BhY2l0eT0iLjEiLz4KIDwvZz4KIDxyZWN0IHRyYW5zZm9ybT0icm90YXRlKC05MCkiIHg9Ii00NyIgeT0iMSIgd2lkdGg9IjQ2IiBoZWlnaHQ9IjQ2IiByeD0iNCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDQ1MzcpIi8+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDMuOTQ5ZS01KSI+CiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtMTAwNC40KSI+CiAgIDxwYXRoIGQ9Im0xIDEwNDMuNHY0YzAgMi4yMTYgMS43ODQgNCA0IDRoMzhjMi4yMTYgMCA0LTEuNzg0IDQtNHYtNGMwIDIuMjE2LTEuNzg0IDQtNCA0aC0zOGMtMi4yMTYgMC00LTEuNzg0LTQtNHoiIG9wYWNpdHk9Ii4xIi8+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEsLTEpIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLDEpIj4KICAgPGcgb3BhY2l0eT0iLjEiPjwhLS0gY29sb3I6ICM0MWE4ZDggLS0+CiAgICA8cGF0aCBkPSJtMjQgOWMtOC4yODUgMC0xNSA2LjcxNS0xNSAxNXM2LjcxNSAxNSAxNSAxNSAxNS02LjcxNSAxNS0xNS02LjcxNS0xNS0xNS0xNW0wIDZjNC45NjkgMCA5IDQuMDMgOSA5IDAgNC45NjktNC4wMyA5LTkgOS00Ljk2OSAwLTktNC4wMy05LTkgMC00Ljk2OSA0LjAzLTkgOS05Ii8+CiAgICA8cGF0aCBkPSJtMjQgOWMtOC4yODUgMC0xNSA2LjcxNS0xNSAxNSAwIDQuMzk4IDEuOTIyIDguMzIgNC45MzggMTEuMDYtMi40MjYtMi42NjQtMy45MzgtNi4xNzYtMy45MzgtMTAuMDYgMC04LjI4NSA2LjcxNS0xNSAxNS0xNSAzLjg4NyAwIDcuMzk4IDEuNTEyIDEwLjA2IDMuOTM4LTIuNzQyLTMuMDItNi42NjQtNC45MzgtMTEuMDYtNC45MzgiIGZpbGwtb3BhY2l0eT0iLjE0OSIvPgogICAgPHBhdGggZD0ibTM1LjA1IDIzLjg1Yy0wLjE2MjY0IDIuMDYzMy0xLjAzMDMgNC4wNzkzLTIuNjA3OCA1LjY1NjktMy41MTM2IDMuNTEzNi05LjIxMzYgMy41MTQzLTEyLjcyOCAwLTEuNTc2OC0xLjU3NjgtMi40NDQ1LTMuNTk0Mi0yLjYwNzgtNS42NTY5LTAuMTk2NTggMi41MzI5IDAuNjcxMDQgNS4xMzQzIDIuNjA3OCA3LjA3MTEgMy41MTM2IDMuNTEzNiA5LjIxMzYgMy41MTQzIDEyLjcyOCAwIDEuOTM2MS0xLjkzNjEgMi44MDMtNC41MzgyIDIuNjA3OC03LjA3MTEiIGZpbGwtb3BhY2l0eT0iLjE0OSIvPgogICA8L2c+CiAgPC9nPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMSkiPjwhLS0gY29sb3I6ICM0MWE4ZDggLS0+CiAgPHBhdGggZD0ibTI0IDljLTguMjg1IDAtMTUgNi43MTUtMTUgMTVzNi43MTUgMTUgMTUgMTUgMTUtNi43MTUgMTUtMTUtNi43MTUtMTUtMTUtMTVtMCA2YzQuOTY5IDAgOSA0LjAzIDkgOSAwIDQuOTY5LTQuMDMgOS05IDktNC45NjkgMC05LTQuMDMtOS05IDAtNC45NjkgNC4wMy05IDktOSIgZmlsbD0iI2VhNWM1MyIvPgogIDxnIGZpbGw9IiNlZWVjZTAiPgogICA8cGF0aCBkPSJtMTAuMzc1IDE3Ljc4MWMtMC44NjcgMS44OTUtMS4zNzUgNC0xLjM3NSA2LjIxOXMwLjUwOCA0LjMyNCAxLjM3NSA2LjIxOWw1LjI1LTNjLTAuMzgzLTEtMC42MjUtMi4wODItMC42MjUtMy4yMTlzMC4yNDItMi4yMTkgMC42MjUtMy4yMTltLTUuMjUtMyIvPgogICA8cGF0aCBkPSJtMzcuNjI1IDE3Ljc4MS01LjI1IDNjMC4zODMgMSAwLjYyNSAyLjA4MiAwLjYyNSAzLjIxOXMtMC4yNDIgMi4yMTktMC42MjUgMy4yMTlsNS4yNSAzYzAuODY3LTEuODk1IDEuMzc1LTQgMS4zNzUtNi4yMTlzLTAuNTA4LTQuMzI0LTEuMzc1LTYuMjE5Ii8+CiAgIDxwYXRoIGQ9Im0yMC43ODEgMzIuMzc1LTMgNS4yNWMxLjg5NSAwLjg2NyA0IDEuMzc1IDYuMjE5IDEuMzc1czQuMzI0LTAuNTA4IDYuMjE5LTEuMzc1bC0zLTUuMjVjLTEgMC4zODMtMi4wODIgMC42MjUtMy4yMTkgMC42MjVzLTIuMjE5LTAuMjQyLTMuMjE5LTAuNjI1Ii8+CiAgIDxwYXRoIGQ9Im0yNCA5Yy0yLjIxOSAwLTQuMzI0IDAuNTA4LTYuMjE5IDEuMzc1bDMgNS4yNWMxLTAuMzgzIDIuMDgyLTAuNjI1IDMuMjE5LTAuNjI1czIuMjE5IDAuMjQyIDMuMjE5IDAuNjI1bDMtNS4yNWMtMS44OTUtMC44NjctNC0xLjM3NS02LjIxOS0xLjM3NSIvPgogIDwvZz4KIDwvZz4KIDxwYXRoIGQ9Im0zMi45NzkgMjMuNDI0YTkgOSAwIDAgMSAtOC45Nzg1IDguNTc2MiA5IDkgMCAwIDEgLTguOTc4NSAtOC40MjM4IDkgOSAwIDAgMCAtMC4wMjE0ODQgMC40MjM4MyA5IDkgMCAwIDAgOSA5IDkgOSAwIDAgMCA5IC05IDkgOSAwIDAgMCAtMC4wMjE0ODQgLTAuNTc2MTd6IiBvcGFjaXR5PSIuMSIgc3Ryb2tlLXdpZHRoPSIuOTk4MjciLz4KIDxwYXRoIGQ9Ik0gMjQgOCBBIDE1IDE1IDAgMCAwIDkgMjMgQSAxNSAxNSAwIDAgMCA5LjAxOTUzMTIgMjMuNTg1OTM4IEEgMTUgMTUgMCAwIDEgMjQgOSBBIDE1IDE1IDAgMCAxIDM4Ljk4MDQ2OSAyMy40MTQwNjIgQSAxNSAxNSAwIDAgMCAzOSAyMyBBIDE1IDE1IDAgMCAwIDI0IDggeiAiIG9wYWNpdHk9Ii4xIiBzdHJva2Utd2lkdGg9IjQuMjYyMyIvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"winhelp-wine,wine,winhelp,text,hlp,help,wine\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winhlp32.exe.Wine\"\nLABEL oc.template=\"abcdesktopio/oc.template.wine\"\nENV ARGS=\"winhelp\"\nLABEL oc.name=\"winhelp-wine\"\nLABEL oc.displayname=\"Winhelp Wine\"\nLABEL oc.path=\"/usr/bin/wine\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/hlp;\"\nLABEL oc.fileextensions=\"hlp;\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winhelp-wine\"\nENV APPBIN \"/usr/bin/wine\"\nLABEL oc.args=\"winhelp\"\nENV APP \"/usr/bin/wine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winhelp-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winhelp-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application winhelp-wine

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winhelp-wine.d\n
"},{"location":"applications/winhelp-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f winhelp-wine.d -t winhelp-wine .\n
"},{"location":"applications/winhelp-wine/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect winhelp-wine > winhelp-wine.json\ndocker image save winhelp-wine -o winhelp-wine.tar\nctr -n k8s.io images import winhelp-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winhelp-wine.json\n\n
"},{"location":"applications/winscp-wine/","title":"winscp-wine","text":""},{"location":"applications/winscp-wine/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.wine

"},{"location":"applications/winscp-wine/#arguments","title":"Arguments","text":"

\"/composer/bin/winscp.exe\"

"},{"location":"applications/winscp-wine/#displayname","title":"Displayname","text":"
WinSCP\n
"},{"location":"applications/winscp-wine/#path","title":"Path","text":"
/usr/bin/wine\n
"},{"location":"applications/winscp-wine/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/winscp-wine/#wm_class","title":"WM_CLASS","text":"
winscp.exe.Wine\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/winscp-wine/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\n
"},{"location":"applications/winscp-wine/#json-dump","title":"JSON dump","text":"

json source file winscp-wine.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"template\": \"abcdesktopio/oc.template.wine\",\n    \"preruncommands\": [\n        \"ENV WINEARCH=win64\",\n        \"ENV WINEDLLOVERRIDES=\\\"mscoree,mshtml=\\\"\",\n        \"USER $BUSER\",\n        \"RUN wineboot --init\",\n        \"RUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\",\n        \"RUN echo disable > $WINEPREFIX/.update-timestamp\",\n        \"COPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\"\n    ],\n    \"args\": \"/composer/bin/winscp.exe\",\n    \"cat\": \"utilities\",\n    \"debpackage\": \"\",\n    \"icon\": \"winscp.svg\",\n    \"keyword\": \"wine,scp,sftp\",\n    \"launch\": \"winscp.exe.Wine\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"name\": \"winscp-wine\",\n    \"displayname\": \"WinSCP\",\n    \"path\": \"/usr/bin/wine\"\n}\n
"},{"location":"applications/winscp-wine/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output winscp-wine.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winscp-wine.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winscp-wine.d.3.0.json\n\n
"},{"location":"applications/winscp-wine/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.wine:$TAG\nUSER root\nENV WINEARCH=win64\nENV WINEDLLOVERRIDES=\"mscoree,mshtml=\"\nUSER $BUSER\nRUN wineboot --init\nRUN curl -Ls -o /tmp/winscp553.zip http://winscp.net/download/winscp553.zip && unzip /tmp/winscp553.zip -d /composer/bin/ && rm /tmp/winscp553.zip\nRUN echo disable > $WINEPREFIX/.update-timestamp\nCOPY --chown=$BUSER:$BUSER user.reg system.reg /composer/.wine/\nLABEL oc.icon=\"winscp.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMjAgMjAiCiAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiCiAgIHN0cm9rZS1saW5lam9pbj0icm91bmQiCiAgIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIKICAgaWQ9InN2ZzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJJRE8yLUtBS1VDSE8uc3ZnIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExMiI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczEwIiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlkPSJuYW1lZHZpZXc4IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIyMy42IgogICAgIGlua3NjYXBlOmN4PSI4LjkyMzgyNjMiCiAgICAgaW5rc2NhcGU6Y3k9IjguOTk0NTA1NyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTkiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii05IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIgLz4KICA8IS0tU2hhY2tsZS0tPgogIDwhLS1Cb2R5LS0+CiAgPHJlY3QKICAgICB4PSI1IgogICAgIHk9IjEuMjUwMDAwMSIKICAgICB3aWR0aD0iMTAiCiAgICAgaGVpZ2h0PSIxNSIKICAgICByeD0iNSIKICAgICByeT0iNSIKICAgICBpZD0icmVjdDQiCiAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzgwODA4MDtzdHJva2Utd2lkdGg6Mi41IiAvPgogIDxyZWN0CiAgICAgeD0iMi41IgogICAgIHk9IjcuNSIKICAgICB3aWR0aD0iMTUiCiAgICAgaGVpZ2h0PSIxMi41IgogICAgIHJ4PSIxLjI1IgogICAgIHJ5PSIxLjI1IgogICAgIHN0eWxlPSJmaWxsOiM5NmM0ODk7ZmlsbC1vcGFjaXR5OjEiCiAgICAgaWQ9InJlY3Q2LTgtOCIgLz4KICA8cGF0aAogICAgIHN0eWxlPSJmaWxsOiMxMDg4MTA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgZD0ibSAzLjc1LDcuNTAwMDAwMiAxMi41LDAgYyAwLjM0NjI1LDAgMC42NTg3NSwwLjEzOTM3NSAwLjg4NDY4NywwLjM2NTMxMjUgTCAyLjg2NTMxMjUsMTkuNjM0Njg3IEMgMi42MzkzNzUsMTkuNDA4NzUgMi41LDE5LjA5NjI1IDIuNSwxOC43NSBsIDAsLTkuOTk5OTk5OCBjIDAsLTAuNjkyNSAwLjU1NzUsLTEuMjUgMS4yNSwtMS4yNSB6IgogICAgIGlkPSJyZWN0Ni0wIgogICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJzc2Njc3NzIiAvPgogIDxwYXRoCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmIgogICAgIGQ9Im0gNi41LDEyLjc1IDMuNSwwIEwgOC41LDExLjI1IDEwLDkuNzQ5OTk5NyAxNC4yNSwxNCAxMCwxOC4yNSBsIC0xLjUsLTEuNSAxLjUsLTEuNSAtMy41LDAgbSAwLC0yLjUiCiAgICAgaWQ9InBhdGg4IiAvPgo8L3N2Zz4K\"\nLABEL oc.keyword=\"winscp-wine,wine,scp,sftp\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"winscp.exe.Wine\"\nLABEL oc.template=\"abcdesktopio/oc.template.wine\"\nENV ARGS=\"/composer/bin/winscp.exe\"\nLABEL oc.name=\"winscp-wine\"\nLABEL oc.displayname=\"WinSCP\"\nLABEL oc.path=\"/usr/bin/wine\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"winscp-wine\"\nENV APPBIN \"/usr/bin/wine\"\nLABEL oc.args=\"/composer/bin/winscp.exe\"\nENV APP \"/usr/bin/wine\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/winscp-wine/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/winscp-wine/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application winscp-wine

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/winscp-wine.d\n
"},{"location":"applications/winscp-wine/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f winscp-wine.d -t winscp-wine .\n
"},{"location":"applications/winscp-wine/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect winscp-wine > winscp-wine.json\ndocker image save winscp-wine -o winscp-wine.tar\nctr -n k8s.io images import winscp-wine.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @winscp-wine.json\n\n
"},{"location":"applications/wireshark/","title":"wireshark","text":""},{"location":"applications/wireshark/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.gtk

"},{"location":"applications/wireshark/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/wireshark/#alpine-packages","title":"Alpine packages","text":"
wireshark\n
"},{"location":"applications/wireshark/#displayname","title":"Displayname","text":"
wireshark (alpine)\n
"},{"location":"applications/wireshark/#path","title":"Path","text":"
/usr/bin/wireshark\n
"},{"location":"applications/wireshark/#mimetype","title":"Mimetype","text":"
application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\n
"},{"location":"applications/wireshark/#file-extensions","title":"File extensions","text":"

\"cap,pcap\"

"},{"location":"applications/wireshark/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"cap\"

"},{"location":"applications/wireshark/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/wireshark/#wm_class","title":"WM_CLASS","text":"
wireshark.Wireshark\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/wireshark/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/org.wireshark.Wireshark.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/wireshark/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

ENV QT_XCB_NO_MITSHM=1\n
"},{"location":"applications/wireshark/#json-dump","title":"JSON dump","text":"

json source file wireshark.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"preruncommands\": [\n        \"ENV QT_XCB_NO_MITSHM=1\"\n    ],\n    \"apkpackage\": \"wireshark\",\n    \"icon\": \"wireshark.svg\",\n    \"keyword\": \"capture,network,analyzer\",\n    \"launch\": \"wireshark.Wireshark\",\n    \"name\": \"wireshark\",\n    \"displayname\": \"wireshark (alpine)\",\n    \"path\": \"/usr/bin/wireshark\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.gtk\",\n    \"desktopfile\": \"/usr/share/applications/org.wireshark.Wireshark.desktop\",\n    \"mimetype\": \"application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\",\n    \"fileextensions\": \"cap,pcap\",\n    \"legacyfileextensions\": \"cap\"\n}\n
"},{"location":"applications/wireshark/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output wireshark.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/wireshark.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @wireshark.d.3.0.json\n\n
"},{"location":"applications/wireshark/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.gtk:$TAG\nUSER root\nENV QT_XCB_NO_MITSHM=1\nRUN apk add --no-cache --update wireshark\nLABEL oc.icon=\"wireshark.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iOTkuOTk2MzYxIgogICBoZWlnaHQ9Ijk5Ljg0MTkyNyIKICAgaWQ9InN2ZzEzMTUiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDQiCiAgIHNvZGlwb2RpOmRvY25hbWU9IndzaWNvbi5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIyMzAuNDEiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSIyMzAuNDEiCiAgIHZlcnNpb249IjEuMCI+CiAgPGRlZnMKICAgICBpZD0iZGVmczEzMTciPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzOTUzIj4KICAgICAgPHN0b3AKICAgICAgICAgaWQ9InN0b3AzOTU1IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNkOGQ4ZDg7c3RvcC1vcGFjaXR5OjAuODE5NjcyMTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMzk1NyIKICAgICAgICAgb2Zmc2V0PSIxLjAwMDAwMDAiCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMDEwOTI4OTYiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzNTAwIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZmZmZjtzdG9wLW9wYWNpdHk6MC43NDIyNjgwMzsiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDM1MDIiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmZmZmZmY7c3RvcC1vcGFjaXR5OjAuMjc4MzUwNTA7IgogICAgICAgICBvZmZzZXQ9IjEuMDAwMDAwMCIKICAgICAgICAgaWQ9InN0b3AzNTA0IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjAzMiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM0MGIyZTc7c3RvcC1vcGFjaXR5OjEuMDAwMDAwMDsiCiAgICAgICAgIG9mZnNldD0iMC4wMDAwMDAwIgogICAgICAgICBpZD0ic3RvcDIwMzQiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIGlkPSJzdG9wMjA0MCIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTY3OWE3O3N0b3Atb3BhY2l0eTowLjkzODE0NDMzOyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDIwMzIiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyNzcwIgogICAgICAgY3g9IjE4Ni44Njg1IgogICAgICAgY3k9IjMxOS42MjQ2OSIKICAgICAgIGZ4PSIxODYuODY4NSIKICAgICAgIGZ5PSIzMTkuNjI0NjkiCiAgICAgICByPSI0OS45OTgxOCIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC45OTg0NTYsMCwwLjUwMTI1NCkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50MzUwMCIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM1MDYiCiAgICAgICB4MT0iMTY4Ljg4NDkzIgogICAgICAgeTE9IjI4My4zNjIxOCIKICAgICAgIHgyPSIxNzMuNjM4ODQiCiAgICAgICB5Mj0iMzE3LjQzODIzIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDIzNjg0LDAsMCwxLC00LjM4Njg5MiwtMSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM5NTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzOTUxIgogICAgICAgeDE9IjE3MS40ODYzNiIKICAgICAgIHkxPSIyNzguNzUxMTMiCiAgICAgICB4Mj0iMTcxLjY5NjgyIgogICAgICAgeTI9IjI4Ni41Mzc3MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAwNDcwNSwwLDAsMS4zMDc3MDksLTAuNjc4MDc5LC04NS43MzMxNSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDM5NTMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMzMwIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDA0NzA1LDAsMCwxLjMwNzcwOSwtMC42NzgwNzksLTg1LjczMzE1KSIKICAgICAgIHgxPSIxNzEuNDg2MzYiCiAgICAgICB5MT0iMjc4Ljc1MTEzIgogICAgICAgeDI9IjE3Mi4wNjg2MiIKICAgICAgIHkyPSIyODkuODcwMjQiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIyLjAwNzgyMjUiCiAgICAgaW5rc2NhcGU6Y3g9IjE2OS4yNzkzNCIKICAgICBpbmtzY2FwZTpjeT0iMzUuNDY0NTg0IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9Ijg5MyIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3MzMiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjgzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSItMTMiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMTMyMCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEzMy44NzY4LC0yNzQuNjQxOCkiPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp1cmwoI3JhZGlhbEdyYWRpZW50Mjc3MCk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOmJsYWNrO3N0cm9rZS13aWR0aDo0LjU1Mzk5OTk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDU4MTEiCiAgICAgICB3aWR0aD0iOTUuNDQyMzYiCiAgICAgICBoZWlnaHQ9Ijk1LjI4NzkyNiIKICAgICAgIHg9IjEzNi4xNTM4MiIKICAgICAgIHk9IjI3Ni45MTg3OSIKICAgICAgIHJ4PSIxMCIKICAgICAgIHJ5PSIxMCIKICAgICAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iL2hvbWUvZ2VyYWxkL2RldmVsL3dzd2ViL2ltYWdlL3dzaWNvbjI1Ni5wbmciCiAgICAgICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMjMwLjQxIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjIzMC40MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpibGFjaztzdHJva2Utd2lkdGg6NC4yOTcyMzY5MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAxMzYuODgwNDUsMzQ3LjM2MjE4IEwgMTYwLjg4MDQ1LDM0Ny4zNjIxOCBDIDE2MC44ODA0NSwzNDcuMzYyMTggMTY0LjY2MzY1LDI5OS4xNzQ0OSAyMDYuNzMxODMsMjk4LjUxMDggQyAxOTMuMTYxNDYsMzE5Ljc0ODY4IDIwNS44ODA0NSwzNDcuMzYyMTggMjA1Ljg4MDQ1LDM0Ny4zNjIxOCBMIDIzMC44ODA0NSwzNDcuMzYyMTgiCiAgICAgICBpZD0icGF0aDEzMjgiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSIvaG9tZS9nZXJhbGQvZGV2ZWwvd3N3ZWIvaW1hZ2Uvd3NpY29uMjAwLnBuZyIKICAgICAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIxODAuMDA5OTkiCiAgICAgICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMTgwLjAwOTk5IiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxMzMwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAxNDEsMjc3LjM2MjE4IEMgMTQ4LjQzMzU4LDI3NS44NDQ2NSAyMTcuNDEwMjEsMjc1LjM2MjE4IDIyNiwyNzcuMzYyMTggQyAyMzQuMDMxMzksMjc5LjIzMjE2IDIwNCwzMDUuMzYyMTggMTg0LDMwNS4zNjIxOCBDIDE2NCwzMDUuMzYyMTggMTMzLjQ1NzYzLDI3OC45MDE5MiAxNDEsMjc3LjM2MjE4IHogIgogICAgICAgaWQ9InJlY3QzMDcwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjenp6IiAvPgogICAgPHJlY3QKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDp3aGl0ZTtmaWxsLW9wYWNpdHk6MC4wMTA5Mjg5NDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0NTcwNSIKICAgICAgIHdpZHRoPSIxIgogICAgICAgaGVpZ2h0PSIwIgogICAgICAgeD0iMTU3IgogICAgICAgeT0iMjg1LjM2MjE4IgogICAgICAgcng9IjguOTQ5NjkzNyIKICAgICAgIHJ5PSIwIiAvPgogIDwvZz4KPC9zdmc+Cg==\"\nLABEL oc.keyword=\"wireshark,capture,network,analyzer\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"org.wireshark.Wireshark.desktop\"\nLABEL oc.launch=\"wireshark.Wireshark\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.gtk\"\nLABEL oc.name=\"wireshark\"\nLABEL oc.displayname=\"wireshark (alpine)\"\nLABEL oc.path=\"/usr/bin/wireshark\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/vnd.tcpdump.pcap;application/x-pcapng;application/x-snoop;application/x-iptrace;application/x-lanalyzer;application/x-nettl;application/x-radcom;application/x-etherpeek;application/x-visualnetworks;application/x-netinstobserver;application/x-5view;application/x-tektronix-rf5;\"\nLABEL oc.fileextensions=\"cap,pcap\"\nLABEL oc.legacyfileextensions=\"cap\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"wireshark\"\nENV APPBIN \"/usr/bin/wireshark\"\nENV APP \"/usr/bin/wireshark\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/wireshark/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/wireshark/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application wireshark

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/wireshark.d\n
"},{"location":"applications/wireshark/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f wireshark.d -t wireshark .\n
"},{"location":"applications/wireshark/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect wireshark > wireshark.json\ndocker image save wireshark -o wireshark.tar\nctr -n k8s.io images import wireshark.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @wireshark.json\n\n
"},{"location":"applications/writer/","title":"writer","text":""},{"location":"applications/writer/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.libreoffice

"},{"location":"applications/writer/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/writer/#alpine-packages","title":"Alpine packages","text":"
libreoffice-gnome\n
"},{"location":"applications/writer/#arguments","title":"Arguments","text":"

\"--writer\"

"},{"location":"applications/writer/#displayname","title":"Displayname","text":"
Writer alpine\n
"},{"location":"applications/writer/#path","title":"Path","text":"
/usr/lib/libreoffice/program/soffice\n
"},{"location":"applications/writer/#uniquerunkey","title":"uniquerunkey","text":"

\"libreoffice\"

"},{"location":"applications/writer/#showinview","title":"Showinview","text":"

\"dock\"

"},{"location":"applications/writer/#mimetype","title":"Mimetype","text":"
application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\n
"},{"location":"applications/writer/#file-extensions","title":"File extensions","text":"

\"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\"

"},{"location":"applications/writer/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"odf;ott;fodt;uot\"

"},{"location":"applications/writer/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/writer/#wm_class","title":"WM_CLASS","text":"
libreoffice.libreoffice-writer\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/writer/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/libreoffice-writer.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/writer/#json-dump","title":"JSON dump","text":"

json source file writer.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"office\",\n    \"apkpackage\": \"libreoffice-gnome\",\n    \"icon\": \"circle_libreoffice_writer.svg\",\n    \"keyword\": \"libreoffice,office\",\n    \"launch\": \"libreoffice.libreoffice-writer\",\n    \"name\": \"writer\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"displayname\": \"Writer alpine\",\n    \"showinview\": \"dock\",\n    \"path\": \"/usr/lib/libreoffice/program/soffice\",\n    \"args\": \"--writer\",\n    \"uniquerunkey\": \"libreoffice\",\n    \"template\": \"abcdesktopio/oc.template.alpine.libreoffice\",\n    \"mimetype\": \"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\",\n    \"legacyfileextensions\": \"odf;ott;fodt;uot\",\n    \"fileextensions\": \"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\",\n    \"desktopfile\": \"/usr/share/applications/libreoffice-writer.desktop\",\n    \"usedefaultapplication\": true,\n    \"abcdesktop_release\": 3\n}\n
"},{"location":"applications/writer/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output writer.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/writer.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @writer.d.3.0.json\n\n
"},{"location":"applications/writer/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.libreoffice:$TAG\nUSER root\nRUN apk add --no-cache --update libreoffice-gnome\nLABEL oc.icon=\"circle_libreoffice_writer.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIzOTkuNTciIHgyPSIzOTkuNTciIHkxPSI1NDUuOCIgeTI9IjUxNy44IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSwwLDAsMi4xNDI5LC04MjYuMzYsLTExMDcuNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzM4ODllOSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1ZWE1ZmIiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iYyIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNDE5OTk4NzQiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSIzNDUiIHgyPSIzNDUiIHkxPSIxMTczIiB5Mj0iMTE3OCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjEyNSAwIDAgMi4xMzc0IC03MDIuMTIgLTI0ODcuOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzY2NiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iMjI5LjUzIiB4Mj0iMjI5LjUzIiB5MT0iLTU4MS42NCIgeTI9Ii01NzguNjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4xMjUgMCAwIDIgLTQ0MC43NSAxMTgxLjMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM2M2JiZWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjYWFkY2Y3IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9IjIxNy4yOSIgeDI9IjIxNy4yOSIgeTE9Ii03ODcuODQiIHkyPSItNzYzLjg0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTY4MyAwIDAgMi4zMjMzIC00MzguODcgMTgzMC42KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHhsaW5rOmhyZWY9IiNhIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAzNjlhMyIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMwNDdmYzYiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJnIiB4MT0iMzIuMDIiIHgyPSIzMi4wMiIgeTE9IjIuMDQzIiB5Mj0iNjIuMDQ1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2EiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImYiIHgxPSIzMiIgeDI9IjMyIiB5MT0iNyIgeTI9IjU3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNkMmYzZmMiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZmZmIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iZSIgeDE9IjQ1LjUwMSIgeDI9IjQ1LjUwMSIgeTE9IjcuMTA1NSIgeTI9IjI5Ljg5NiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZWJmYWZlIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U3ZjhmYyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJrIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC43NSIvPgogIDwvZmlsdGVyPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjM4LjA2NiIgY3k9IjI2LjE5MiIgcj0iMjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLS44IDIuOTg4NmUtOCAtMS45MjY1ZS04IC0xIDgwLjQ1MyA0MC4xOTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMxZTM1M2MiIHN0b3Atb3BhY2l0eT0iLjQ4NTM4IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE5MTkxOSIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImwiIHg9Ii0uMDU2MzY0IiB5PSItLjA2NDEzOCIgd2lkdGg9IjEuMTEyNyIgaGVpZ2h0PSIxLjEyODMiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNzc1Ii8+CiAgPC9maWx0ZXI+CiA8L2RlZnM+CiA8Y2lyY2xlIHRyYW5zZm9ybT0ibWF0cml4KDIuMTQyOSAwIDAgMi4xNDI5IC04MjYuMzYgLTExMDcuNSkiIGN4PSI0MDAuNTciIGN5PSI1MzEuOCIgcj0iMTQiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9Ii43MzMzMyIvPgogPGcgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiPgogIDxjaXJjbGUgY3g9IjMyLjAyIiBjeT0iMzIuMDQ0IiByPSIzMC4wMDEiIGZpbGw9InVybCgjZykiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbHRlcj0idXJsKCNrKSIgb3BhY2l0eT0iLjI1Ii8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjMwLjAwMSIgZmlsbC1vcGFjaXR5PSIwIi8+CiAgPGNpcmNsZSBjeD0iMzIuMDIiIGN5PSIzMi4wNDQiIHI9IjAiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzIgN2EyNSAyNSAwIDAgMC0yNSAyNSAyNSAyNSAwIDAgMCAyNSAyNSAyNSAyNSAwIDAgMCAyNS0yNSAyNSAyNSAwIDAgMC0wLjEwMzUyLTIuMTAzNWwtMjIuNzkxLTIyLjc5MWEyNSAyNSAwIDAgMC0yLjEwNTUtMC4xMDU0N3oiIGZpbGw9InVybCgjZikiLz4KIDwvZz4KIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMSkiIGZpbHRlcj0idXJsKCNsKSIgb3BhY2l0eT0iLjI1Ij4KICA8cGF0aCBkPSJtMTYgMTd2M2gxMXYtM3ptMTQgMHYxNGgxOXYtN2MtMy0zLTUtNC05LjUtN3ptLTE0IDV2My4wNDc5bDExLTAuMDQ3OTR2LTMuMDQ3OXptMCA1djMuMDQ3OWwxMS0wLjA0Nzk0di0zLjA0Nzl6bTAgNnYzbDMzLTAuMDQ3OTR2LTN6bTAgNXYzbDMzLTAuMDQ3OTR2LTN6bTAgNXYzaDI0di0zeiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz4KICA8cGF0aCBkPSJtMzEgMThoOC41YzMuNSAwIDguNSA0IDguNSA2djZoLTE3eiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciLz4KICA8cGF0aCBkPSJtNDAuOTE3IDI3LjIxMi00LjkxNy02LjIxMjEtNSA3LjYwNjF2MS4zOTM5aDE3di0xLjM5MzlsLTMuNTQxMy00LjE4MTh6IiBjb2xvcj0iIzAwMDAwMCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxKSI+CiAgPHBhdGggZD0ibTE2IDE3djNoMTF2LTN6bTE0IDB2MTRoMTl2LTdjLTMtMy01LTQtOS41LTd6bS0xNCA1djMuMDQ3OWwxMS0wLjA0Nzk0di0zLjA0Nzl6bTAgNXYzLjA0NzlsMTEtMC4wNDc5NHYtMy4wNDc5em0wIDZ2M2wzMy0wLjA0Nzk0di0zem0wIDV2M2wzMy0wLjA0Nzk0di0zem0wIDV2M2gyNHYtM3oiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2opIi8+CiAgPHBhdGggZD0ibTMxIDE4aDguNWMzLjUgMCA4LjUgNCA4LjUgNnY2aC0xN3oiIGNvbG9yPSIjMDAwMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IiBmaWxsPSJ1cmwoI2kpIi8+CiAgPHBhdGggZD0ibTQwLjkxNyAyNy4yMTItNC45MTctNi4yMTIxLTUgNy42MDYxdjEuMzkzOWgxN3YtMS4zOTM5bC0zLjU0MTMtNC4xODE4eiIgY29sb3I9IiMwMDAwMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXciIGZpbGw9InVybCgjaCkiLz4KIDwvZz4KIDxwYXRoIGQ9Im0zMiA3YTI1IDI1IDAgMCAwLTI1IDI1IDI1IDI1IDAgMCAwIDI1IDI1IDI1IDI1IDAgMCAwIDI1LTI1IDI1IDI1IDAgMCAwLTAuMTAzNTItMi4xMDM1bC0yMi43OTEtMjIuNzkxYTI1IDI1IDAgMCAwLTIuMTA1NS0wLjEwNTQ3eiIgZmlsbD0idXJsKCNkKSIgc3Ryb2tlLXdpZHRoPSIxLjU3MTUiLz4KIDxwYXRoIGQ9Im01Ni44OTYgMjkuODk2LTIyLjc5MS0yMi43OTFhMjUgMjUgMCAwIDAgMjIuNzkxIDIyLjc5MXoiIGZpbGw9InVybCgjZSkiIHN0cm9rZS13aWR0aD0iMS41NzE1Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"writer,libreoffice,office\"\nLABEL oc.cat=\"office\"\nLABEL oc.desktopfile=\"libreoffice-writer.desktop\"\nLABEL oc.launch=\"libreoffice.libreoffice-writer\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.libreoffice\"\nENV ARGS=\"--writer\"\nLABEL oc.name=\"writer\"\nLABEL oc.displayname=\"Writer alpine\"\nLABEL oc.path=\"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.type=app\nLABEL oc.uniquerunkey=\"libreoffice\"\nLABEL oc.showinview=\"dock\"\nLABEL oc.mimetype=\"application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.text-web;application/vnd.oasis.opendocument.text-master;application/vnd.oasis.opendocument.text-master-template;application/vnd.sun.xml.writer;application/vnd.sun.xml.writer.template;application/vnd.sun.xml.writer.global;application/msword;application/vnd.ms-word;application/x-doc;application/x-hwp;application/rtf;text/rtf;application/vnd.wordperfect;application/wordperfect;application/vnd.lotus-wordpro;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroenabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroenabled.12;application/vnd.stardivision.writer-global;application/x-extension-txt;application/x-t602;application/vnd.oasis.opendocument.text-flat-xml;application/x-fictionbook+xml;application/macwriteii;application/x-aportisdoc;application/prs.plucker;application/vnd.palm;application/clarisworks;application/x-sony-bbeb;application/x-abiword;application/x-iwork-pages-sffpages;application/x-mswrite;\"\nLABEL oc.fileextensions=\"sxw;stw;doc;dot;wps;rtf;602;wpd;docx;docm;dotx;dotm;abw;zabw;pages;dummy;lrf;cwk;hqx;fb2;mw;mcw;mwd;pdb;wn\"\nLABEL oc.legacyfileextensions=\"odf;ott;fodt;uot\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"writer\"\nENV APPBIN \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.args=\"--writer\"\nENV APP \"/usr/lib/libreoffice/program/soffice\"\nLABEL oc.usedefaultapplication=true\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/writer/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/writer/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application writer

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/writer.d\n
"},{"location":"applications/writer/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f writer.d -t writer .\n
"},{"location":"applications/writer/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect writer > writer.json\ndocker image save writer -o writer.tar\nctr -n k8s.io images import writer.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @writer.json\n\n
"},{"location":"applications/xclock/","title":"xclock","text":""},{"location":"applications/xclock/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine.minimal

"},{"location":"applications/xclock/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/xclock/#alpine-packages","title":"Alpine packages","text":"
xclock\n
"},{"location":"applications/xclock/#displayname","title":"Displayname","text":"
Xclock\n
"},{"location":"applications/xclock/#path","title":"Path","text":"
/usr/bin/xclock\n
"},{"location":"applications/xclock/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/xclock/#wm_class","title":"WM_CLASS","text":"
xclock.XClock\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/xclock/#json-dump","title":"JSON dump","text":"

json source file xclock.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"containerengine\": \"ephemeral_container\",\n    \"apkpackage\": \"xclock\",\n    \"icon\": \"xclock.svg\",\n    \"keyword\": \"clock,xclock,time\",\n    \"launch\": \"xclock.XClock\",\n    \"name\": \"xclock\",\n    \"displayname\": \"Xclock\",\n    \"path\": \"/usr/bin/xclock\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine.minimal\",\n    \"args\": \"\",\n    \"quick\": true\n}\n
"},{"location":"applications/xclock/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output xclock.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xclock.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xclock.d.3.0.json\n\n
"},{"location":"applications/xclock/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine.minimal:$TAG\nUSER root\nRUN apk add --no-cache --update xclock\nLABEL oc.icon=\"xclock.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJhIiBjeD0iNjMuMTI1IiBjeT0iNjMuMjA4IiByPSI2My4yMDg1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9Ii45MjM4Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iMCIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjMuMTI1IiBjeT0iNjMuMjA4IiByPSI2My4yMDgiIGZpbGw9InVybCgjYSkiIG9wYWNpdHk9Ii42MiIvPgogIDxjaXJjbGUgY3g9IjYyLjEyNSIgY3k9IjYxLjg3NSIgcj0iNjEuNjI1IiBmaWxsPSIjMEQzMTdEIi8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMjA5LjA5OTYiIHgyPSIyMDkuMDk5NiIgeTE9Ii0xMDYuMjEiIHkyPSItMjIzLjQ2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMWM3M2Q5Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNlNWY4ZmYiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjaXJjbGUgY3g9IjYxLjUiIGN5PSI2MS43NSIgcj0iNTkuMjUiIGZpbGw9InVybCgjYikiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIyMDYuOTEwMiIgeDI9IjIwNi45MTAyIiB5MT0iLTEwNy40MjY4IiB5Mj0iLTIxOS40ODIyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii41MTEiIHN0b3AtY29sb3I9IiMxZjdhZDQiLz4KICAgIDxzdG9wIG9mZnNldD0iLjU2NjMiIHN0b3AtY29sb3I9IiMyNTdlZDUiLz4KICAgIDxzdG9wIG9mZnNldD0iLjYzNzEiIHN0b3AtY29sb3I9IiMzNDg4ZDkiLz4KICAgIDxzdG9wIG9mZnNldD0iLjcxNjMiIHN0b3AtY29sb3I9IiM0Zjk4ZGUiLz4KICAgIDxzdG9wIG9mZnNldD0iLjgwMTciIHN0b3AtY29sb3I9IiM3M2IwZTYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjg5MTkiIHN0b3AtY29sb3I9IiNhMmNlZjEiLz4KICAgIDxzdG9wIG9mZnNldD0iLjk4NDkiIHN0b3AtY29sb3I9IiNkYmYyZmQiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2U1ZjhmZiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNjKSIgZD0iTTExMy44NyAzOS4xMDYgMTAzIDQwcy0zNi4yNTggNzctNDEuNjI1IDc3QzMwLjEwMiAxMTcgNC43NSA5MS42NDggNC43NSA2MC4zNzVTMzAuMTAyIDMuNzUgNjEuMzc1IDMuNzVjMjMuNzUxIDAgNDQuMDg3IDE0LjYyMyA1Mi40OTUgMzUuMzU2eiIvPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iZCIgY3g9IjIwOS40MzI2IiBjeT0iLTE2NS4xMjYiIHI9IjUzLjAwMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iLjk1MDUiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzI0NTBhMSIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjEuODMzIiBjeT0iNjIuMTY2IiByPSI1My4wMDEiIGZpbGw9InVybCgjZCkiLz4KICA8Y2lyY2xlIGN4PSI2MS42MjUiIGN5PSI2MS44NzUiIHI9IjUxLjM3NSIgZmlsbD0iI0EyRDJGRiIvPgogIDxkZWZzPgogICAgPGNpcmNsZSBpZD0iZSIgY3g9IjYxLjYyNSIgY3k9IjYxLjg3NSIgcj0iNTEuMzc1Ii8+CiAgPC9kZWZzPgogIDxjbGlwUGF0aCBpZD0iZyI+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNlIiBvdmVyZmxvdz0idmlzaWJsZSIvPgogIDwvY2xpcFBhdGg+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMjA5LjIyNDYiIHgyPSIyMDkuMjI0NiIgeTE9Ii0xMTYuMjEiIHkyPSItMjE3LjIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4xNDc4IiBzdG9wLWNvbG9yPSIjZTFmMWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4yMzYzIiBzdG9wLWNvbG9yPSIjZDRlYmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4zNTA1IiBzdG9wLWNvbG9yPSIjZTNmMmZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii41MjY0IiBzdG9wLWNvbG9yPSIjZjNmOWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii43MjYyIiBzdG9wLWNvbG9yPSIjZmNmZWZmIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmYiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxjaXJjbGUgY3g9IjYxLjYyNSIgY3k9IjYzLjg3NSIgcj0iNTEuMzc1IiBmaWxsPSJ1cmwoI2YpIiBjbGlwLXBhdGg9InVybCgjZykiLz4KICA8ZGVmcz4KICAgIDxjaXJjbGUgaWQ9ImgiIGN4PSI2MS42MjUiIGN5PSI2MS44NzUiIHI9IjUxLjM3NSIvPgogIDwvZGVmcz4KICA8Y2xpcFBhdGggaWQ9ImoiPgogICAgPHVzZSB4bGluazpocmVmPSIjaCIgb3ZlcmZsb3c9InZpc2libGUiLz4KICA8L2NsaXBQYXRoPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iaSIgeDE9IjIwNi42NDA2IiB4Mj0iMjA2LjY0MDYiIHkxPSItMTE2LjIxIiB5Mj0iLTIxNy4yMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMTQzNSIgc3RvcC1jb2xvcj0iI2VkZjdmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMjgwMiIgc3RvcC1jb2xvcj0iI2UwZjJmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMzA2MyIgc3RvcC1jb2xvcj0iI2UzZjNmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNDk0MiIgc3RvcC1jb2xvcj0iI2YzZmFmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNzA3NiIgc3RvcC1jb2xvcj0iI2ZjZmVmZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2kpIiBkPSJNMTA3LjgzMyA0MS45MTcgNjMuNSA2Mi41bC0xLjg3NSA1Mi43NWMtMjguMzczIDAtNTEuMzc1LTIzLjAwMS01MS4zNzUtNTEuMzc1UzMzLjI1MiAxMi41IDYxLjYyNSAxMi41YzIwLjkyOCAwIDM4LjE5NyAxMS40NjUgNDYuMjA4IDI5LjQxN3oiIGNsaXAtcGF0aD0idXJsKCNqKSIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iayIgeDE9IjIxOC40NzY2IiB4Mj0iMjE4LjQ3NjYiIHkxPSItMTIwLjM1MzUiIHkyPSItMTk2LjcxNTIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNrKSIgZD0iTTcwLjg3NyAxOS4xNjhjLS42MiAwLTEuMTI2LS41MDYtMS4xMjYtMS4xMjZzLjUwNi0xLjEyNiAxLjEyNi0xLjEyNmMuNjE5IDAgMS4xMjYuNTA2IDEuMTI2IDEuMTI2cy0uNTA3IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibCIgeDE9IjIxMy42NDI2IiB4Mj0iMjEzLjY0MjYiIHkxPSItMTIwLjI0OCIgeTI9Ii0xOTYuNDc3MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2wpIiBkPSJNNjYuMDQ0IDE4LjU4MmMtLjYyMSAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjMgMC0uNjIxLjUwNC0xLjEyNSAxLjEyNS0xLjEyNS42MTkgMCAxLjEyMy41MDQgMS4xMjMgMS4xMjUgMCAuNjE5LS41MDQgMS4xMjMtMS4xMjMgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJtIiB4MT0iMjIzLjA1ODYiIHgyPSIyMjMuMDU4NiIgeTE9Ii0xMjAuNTg2OSIgeTI9Ii0xOTYuOTgxNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI20pIiBkPSJNNzUuNDYgMjAuNDZjLS42MiAwLTEuMTI3LS41MDYtMS4xMjctMS4xMjZzLjUwNy0xLjEyNiAxLjEyNy0xLjEyNmMuNjE5IDAgMS4xMjYuNTA3IDEuMTI2IDEuMTI2IDAgLjYyLS41MDcgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJuIiB4MT0iMjI3LjIyNjYiIHgyPSIyMjcuMjI2NiIgeTE9Ii0xMjAuODgxOCIgeTI9Ii0xOTcuMjQzNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI24pIiBkPSJNNzkuNjI4IDIyLjA4NGMtLjYyIDAtMS4xMjctLjUwNS0xLjEyNy0xLjEyNXMuNTA3LTEuMTI3IDEuMTI3LTEuMTI3IDEuMTI1LjUwNyAxLjEyNSAxLjEyNy0uNTA1IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibyIgeDE9IjIzNS41MTg2IiB4Mj0iMjM1LjUxODYiIHkxPSItMTIxLjcxNzgiIHkyPSItMTk4LjAxMzMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNvKSIgZD0iTTg3LjkxOSAyNi42NjdjLS42MiAwLTEuMTI2LS41MDUtMS4xMjYtMS4xMjYgMC0uNjE5LjUwNi0xLjEyNCAxLjEyNi0xLjEyNC42MjEgMCAxLjEyNi41MDUgMS4xMjYgMS4xMjQgMCAuNjIxLS41MDUgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJwIiB4MT0iMjQyLjYwMTYiIHgyPSIyNDIuNjAxNiIgeTE9Ii0xMjIuODkyNiIgeTI9Ii0xOTkuMTg4MSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3ApIiBkPSJNOTUuMDAyIDMzLjEyNmMtLjYxOSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjUgMC0uNjIuNTA2LTEuMTI1IDEuMTI1LTEuMTI1czEuMTI1LjUwNSAxLjEyNSAxLjEyNWMwIC42MTktLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InEiIHgxPSIyNDUuNTYwNSIgeDI9IjI0NS41NjA1IiB5MT0iLTEyMy41NTU3IiB5Mj0iLTE5OS44Njc3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjcSkiIGQ9Ik05Ny45NiAzNi43OTJjLS42MTkgMC0xLjEyNS0uNTA2LTEuMTI1LTEuMTI1IDAtLjYyLjUwNi0xLjEyNSAxLjEyNS0xLjEyNS42MiAwIDEuMTI2LjUwNiAxLjEyNiAxLjEyNSAwIC42Mi0uNTA2IDEuMTI1LTEuMTI2IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iciIgeDE9IjI1MC40MzY1IiB4Mj0iMjUwLjQzNjUiIHkxPSItMTI1LjA4MTEiIHkyPSItMjAxLjM3NjQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNyKSIgZD0iTTEwMi44MzYgNDUuMTY3Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI0IDAtLjYyMi41MDQtMS4xMjYgMS4xMjQtMS4xMjYuNjIxIDAgMS4xMjYuNTA0IDEuMTI2IDEuMTI2IDAgLjYyLS41MDUgMS4xMjQtMS4xMjYgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJzIiB4MT0iMjUyLjE0MzYiIHgyPSIyNTIuMTQzNiIgeTE9Ii0xMjUuODcwMSIgeTI9Ii0yMDIuMTE1OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3MpIiBkPSJNMTA0LjU0NSA0OS40MTdjLS42MjIgMC0xLjEyNi0uNTA0LTEuMTI2LTEuMTI1IDAtLjYyLjUwNC0xLjEyNCAxLjEyNi0xLjEyNC42MiAwIDEuMTI0LjUwNCAxLjEyNCAxLjEyNHMtLjUwNCAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InQiIHgxPSIyNTMuMTQzNiIgeDI9IjI1My4xNDM2IiB5MT0iLTEyNi42MjExIiB5Mj0iLTIwMi45NDk3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjdCkiIGQ9Ik0xMDUuNTQ1IDUzLjcwOGMtLjYyMiAwLTEuMTI2LS41MDQtMS4xMjYtMS4xMjUgMC0uNjIyLjUwNC0xLjEyNiAxLjEyNi0xLjEyNi42MiAwIDEuMTI0LjUwNCAxLjEyNCAxLjEyNiAwIC42MjEtLjUwNCAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InUiIHgxPSIyNTQuMTAxNiIgeDI9IjI1NC4xMDE2IiB5MT0iLTEyNy41MzUyIiB5Mj0iLTIwMy43OTc1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjdSkiIGQ9Ik0xMDYuNTAzIDU4LjU4M2MtLjYyMiAwLTEuMTI3LS41MDQtMS4xMjctMS4xMjVzLjUwNS0xLjEyNSAxLjEyNy0xLjEyNWMuNjIgMCAxLjEyNC41MDQgMS4xMjQgMS4xMjVzLS41MDQgMS4xMjUtMS4xMjQgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJ2IiB4MT0iMjU0LjAxOTUiIHgyPSIyNTQuMDE5NSIgeTE9Ii0xMjkuMjY2NiIgeTI9Ii0yMDUuNTI4OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3YpIiBkPSJNMTA2LjQyIDY4LjA4NGMtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA1LTEuMTI0IDEuMTI1LTEuMTI0IDEuMTI0LjUwNCAxLjEyNCAxLjEyNC0uNTA0IDEuMTI1LTEuMTI0IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0idyIgeDE9IjI1My4xODU1IiB4Mj0iMjUzLjE4NTUiIHkxPSItMTMwLjA3MDMiIHkyPSItMjA2LjM5ODgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCN3KSIgZD0iTTEwNS41ODUgNzIuNzFjLS42MiAwLTEuMTI0LS41MDUtMS4xMjQtMS4xMjcgMC0uNjIuNTA0LTEuMTI0IDEuMTI0LTEuMTI0LjYyMiAwIDEuMTI2LjUwNCAxLjEyNiAxLjEyNCAwIC42MjItLjUwNCAxLjEyNy0xLjEyNiAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IngiIHgxPSIyNTIuMDE5NSIgeDI9IjI1Mi4wMTk1IiB5MT0iLTEzMC45MzI2IiB5Mj0iLTIwNy4yNjExIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjeCkiIGQ9Ik0xMDQuNDE4IDc3LjQ2Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI2IDAtLjYyLjUwNC0xLjEyNSAxLjEyNC0xLjEyNS42MjIgMCAxLjEyNy41MDUgMS4xMjcgMS4xMjUgMCAuNjIyLS41MDUgMS4xMjYtMS4xMjcgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJ5IiB4MT0iMjUwLjAxOTUiIHgyPSIyNTAuMDE5NSIgeTE9Ii0xMzEuNzI0NiIgeTI9Ii0yMDguMDIwMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI3kpIiBkPSJNMTAyLjQxOSA4MS43MDljLS42MiAwLTEuMTI0LS41MDQtMS4xMjQtMS4xMjQgMC0uNjIyLjUwNC0xLjEyNiAxLjEyNC0xLjEyNi42MjIgMCAxLjEyNi41MDQgMS4xMjYgMS4xMjYgMCAuNjItLjUwNCAxLjEyNC0xLjEyNiAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9InoiIHgxPSIyNDUuNTU4NiIgeDI9IjI0NS41NTg2IiB5MT0iLTEzMy4yMTQ4IiB5Mj0iLTIwOS41NDM0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjeikiIGQ9Ik05Ny45NTkgOTAuMDQyYy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNXMuNTA2LTEuMTI2IDEuMTI1LTEuMTI2Yy42MiAwIDEuMTI2LjUwNyAxLjEyNiAxLjEyNnMtLjUwNiAxLjEyNS0xLjEyNiAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkEiIHgxPSIyNDIuNTE4NiIgeDI9IjI0Mi41MTg2IiB5MT0iLTEzMy45MDcyIiB5Mj0iLTIxMC4yMDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjQSkiIGQ9Ik05NC45MTkgOTMuNzA4Yy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNSAwLS42Mi41MDYtMS4xMjUgMS4xMjUtMS4xMjVzMS4xMjUuNTA1IDEuMTI1IDEuMTI1YzAgLjYxOS0uNTA2IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iQiIgeDE9IjIzOS4yMjg1IiB4Mj0iMjM5LjIyODUiIHkxPSItMTM0LjUwNDkiIHkyPSItMjEwLjgwMDQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNCKSIgZD0iTTkxLjYyOSA5N2MtLjYyIDAtMS4xMjYtLjUwNi0xLjEyNi0xLjEyNXMuNTA2LTEuMTI1IDEuMTI2LTEuMTI1Yy42MTkgMCAxLjEyNS41MDYgMS4xMjUgMS4xMjVTOTIuMjQ4IDk3IDkxLjYyOSA5N3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkMiIHgxPSIyMzUuNjAzNSIgeDI9IjIzNS42MDM1IiB5MT0iLTEzNS4wODY5IiB5Mj0iLTIxMS4zNDkyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjQykiIGQ9Ik04OC4wMDIgMTAwLjA0Yy0uNjE5IDAtMS4xMjMtLjUwNC0xLjEyMy0xLjEyMyAwLS42Mi41MDQtMS4xMjYgMS4xMjMtMS4xMjYuNjIgMCAxLjEyNi41MDYgMS4xMjYgMS4xMjYgMCAuNjE5LS41MDYgMS4xMjMtMS4xMjYgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJEIiB4MT0iMjI3LjE0MjYiIHgyPSIyMjcuMTQyNiIgeTE9Ii0xMzUuODc3IiB5Mj0iLTIxMi4yMDU2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjRCkiIGQ9Ik03OS41NDUgMTA0LjcwOWMtLjYyMiAwLTEuMTI3LS41MDUtMS4xMjctMS4xMjcgMC0uNjE5LjUwNS0xLjEyNCAxLjEyNy0xLjEyNC42MTkgMCAxLjEyNC41MDUgMS4xMjQgMS4xMjQgMCAuNjIyLS41MDUgMS4xMjctMS4xMjQgMS4xMjd6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJFIiB4MT0iMjIyLjk3NjYiIHgyPSIyMjIuOTc2NiIgeTE9Ii0xMzYuMjE2OCIgeTI9Ii0yMTIuNTQ1NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI0UpIiBkPSJNNzUuMzc3IDEwNi41ODRjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjcgMC0uNjIuNTA1LTEuMTI0IDEuMTI1LTEuMTI0czEuMTI0LjUwNCAxLjEyNCAxLjEyNGMwIC42MjItLjUwNCAxLjEyNy0xLjEyNCAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkYiIHgxPSIyMTguMTg0NiIgeDI9IjIxOC4xODQ2IiB5MT0iLTEzNi40Njk3IiB5Mj0iLTIxMi43MzIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNGKSIgZD0iTTcwLjU4NSAxMDcuNjI1Yy0uNjIgMC0xLjEyNC0uNTA0LTEuMTI0LTEuMTI0cy41MDQtMS4xMjUgMS4xMjQtMS4xMjUgMS4xMjQuNTA1IDEuMTI0IDEuMTI1LS41MDQgMS4xMjQtMS4xMjQgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJHIiB4MT0iMjEzLjY4NTUiIHgyPSIyMTMuNjg1NSIgeTE9Ii0xMzYuNjM2NyIgeTI9Ii0yMTIuODk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjRykiIGQ9Ik02Ni4wODYgMTA4LjU0MmMtLjYyIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNSAwLS42Mi41MDUtMS4xMjQgMS4xMjUtMS4xMjRzMS4xMjQuNTA0IDEuMTI0IDEuMTI0YzAgLjYyMS0uNTA0IDEuMTI1LTEuMTI0IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iSCIgeDE9IjE5OS4xNDE2IiB4Mj0iMTk5LjE0MTYiIHkxPSItMTIwLjM1MzUiIHkyPSItMTk2LjY2NTUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNIKSIgZD0iTTUxLjU0MiAxOS4xNjdjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjVzLjUwNS0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNS41MDUgMS4xMjUgMS4xMjUtLjUwNCAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IkkiIHgxPSIyMDMuOTc0NiIgeDI9IjIwMy45NzQ2IiB5MT0iLTEyMC4yNDgiIHkyPSItMTk2LjQ3NzIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNJKSIgZD0iTTU2LjM3NiAxOC41ODJjLS42MjEgMC0xLjEyNi0uNTAzLTEuMTI2LTEuMTI0cy41MDUtMS4xMjQgMS4xMjYtMS4xMjQgMS4xMjQuNTAzIDEuMTI0IDEuMTI0LS41MDMgMS4xMjQtMS4xMjQgMS4xMjR6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJKIiB4MT0iMTk0LjU1ODYiIHgyPSIxOTQuNTU4NiIgeTE9Ii0xMjAuNTg5OCIgeTI9Ii0xOTYuODUyMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI0opIiBkPSJNNDYuOTU5IDIwLjQ1OGMtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA0LTEuMTI1IDEuMTI1LTEuMTI1Yy42MiAwIDEuMTI1LjUwNSAxLjEyNSAxLjEyNXMtLjUwNSAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IksiIHgxPSIxOTAuMzkyNiIgeDI9IjE5MC4zOTI2IiB5MT0iLTEyMC44ODQ4IiB5Mj0iLTE5Ny4xODAzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjSykiIGQ9Ik00Mi43OTIgMjIuMDg0Yy0uNjE5IDAtMS4xMjQtLjUwNS0xLjEyNC0xLjEyNiAwLS42Mi41MDQtMS4xMjQgMS4xMjQtMS4xMjQuNjIyIDAgMS4xMjYuNTA0IDEuMTI2IDEuMTI0IDAgLjYyMS0uNTA1IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iTCIgeDE9IjE4Mi4wOTk2IiB4Mj0iMTgyLjA5OTYiIHkxPSItMTIxLjcxNjgiIHkyPSItMTk4LjAxMjMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNMKSIgZD0iTTM0LjUgMjYuNjY3Yy0uNjIxIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNXMuNTA0LTEuMTI1IDEuMTI1LTEuMTI1IDEuMTI1LjUwNCAxLjEyNSAxLjEyNS0uNTA0IDEuMTI1LTEuMTI1IDEuMTI1eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iTSIgeDE9IjE3NS4wMTU2IiB4Mj0iMTc1LjAxNTYiIHkxPSItMTIyLjg4MzgiIHkyPSItMTk5LjIyODkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNNKSIgZD0iTTI3LjQxNyAzMy4xMjZjLS42MjEgMC0xLjEyNi0uNTA2LTEuMTI2LTEuMTI2IDAtLjYyMS41MDYtMS4xMjUgMS4xMjYtMS4xMjVzMS4xMjUuNTA0IDEuMTI1IDEuMTI1LS41MDQgMS4xMjYtMS4xMjUgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJOIiB4MT0iMTc4LjU3ODEiIHgyPSIxNzguNTc4MSIgeTE9Ii0xMjIuMjYzMiIgeTI9Ii0xOTguNTkxOCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI04pIiBkPSJNMzAuOTc5IDI5LjY4OWMtLjYyMSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjZzLjUwNC0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNC41MDQgMS4xMjQgMS4xMjUtLjUwMyAxLjEyNi0xLjEyNCAxLjEyNnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9Ik8iIHgxPSIxNzIuMDU3NiIgeDI9IjE3Mi4wNTc2IiB5MT0iLTEyMy41NTQ3IiB5Mj0iLTE5OS44NjY3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjTykiIGQ9Ik0yNC40NTcgMzYuNzkyYy0uNjE5IDAtMS4xMjMtLjUwNC0xLjEyMy0xLjEyNXMuNTA0LTEuMTI1IDEuMTIzLTEuMTI1Yy42MjEgMCAxLjEyNS41MDQgMS4xMjUgMS4xMjVzLS41MDQgMS4xMjUtMS4xMjUgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJQIiB4MT0iMTY3LjE4MzYiIHgyPSIxNjcuMTgzNiIgeTE9Ii0xMjUuMDc3MSIgeTI9Ii0yMDEuMzg5MiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1ApIiBkPSJNMTkuNTgzIDQ1LjE2N2MtLjYyIDAtMS4xMjUtLjUwNC0xLjEyNS0xLjEyNiAwLS42Mi41MDUtMS4xMjUgMS4xMjUtMS4xMjUuNjIyIDAgMS4xMjYuNTA1IDEuMTI2IDEuMTI1LS4wMDEuNjIyLS41MDUgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJRIiB4MT0iMTY1LjQ3NDYiIHgyPSIxNjUuNDc0NiIgeTE9Ii0xMjUuODU5NCIgeTI9Ii0yMDIuMTM4MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1EpIiBkPSJNMTcuODc1IDQ5LjQxN2MtLjYyIDAtMS4xMjUtLjUwNS0xLjEyNS0xLjEyNXMuNTA1LTEuMTI1IDEuMTI1LTEuMTI1UzE5IDQ3LjY3MiAxOSA0OC4yOTJjLS4wMDEuNjItLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlIiIHgxPSIxNjQuNDc0NiIgeDI9IjE2NC40NzQ2IiB5MT0iLTEyNi42NTMzIiB5Mj0iLTIwMi44OTkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNSKSIgZD0iTTE2Ljg3NSA1My43MDhjLS42MiAwLTEuMTI1LS41MDUtMS4xMjUtMS4xMjVzLjUwNS0xLjEyMyAxLjEyNS0xLjEyMyAxLjEyNC41MDMgMS4xMjQgMS4xMjMtLjUwMyAxLjEyNS0xLjEyNCAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlMiIHgxPSIxNjMuNTE2NiIgeDI9IjE2My41MTY2IiB5MT0iLTEyNy41MjA1IiB5Mj0iLTIwMy44MTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNTKSIgZD0iTTE1LjkxNyA1OC41ODRjLS42MjEgMC0xLjEyNC0uNTA2LTEuMTI0LTEuMTI2IDAtLjYyMS41MDMtMS4xMjQgMS4xMjQtMS4xMjRzMS4xMjQuNTAzIDEuMTI0IDEuMTI0YzAgLjYyLS41MDQgMS4xMjYtMS4xMjQgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJUIiB4MT0iMTYzLjU5OTYiIHgyPSIxNjMuNTk5NiIgeTE9Ii0xMjkuMjY1NiIgeTI9Ii0yMDUuNTI3OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1QpIiBkPSJNMTYgNjguMDgzYy0uNjE5IDAtMS4xMjQtLjUwNS0xLjEyNC0xLjEyNCAwLS42MjEuNTA0LTEuMTI1IDEuMTI0LTEuMTI1LjYyMSAwIDEuMTI1LjUwNCAxLjEyNSAxLjEyNSAwIC42MTktLjUwNCAxLjEyNC0xLjEyNSAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlUiIHgxPSIxNjQuNDMyNiIgeDI9IjE2NC40MzI2IiB5MT0iLTEzMC4wNTA4IiB5Mj0iLTIwNi40MTI1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjVSkiIGQ9Ik0xNi44MzMgNzIuNzExYy0uNjIgMC0xLjEyNi0uNTA3LTEuMTI2LTEuMTI2IDAtLjYyLjUwNi0xLjEyNiAxLjEyNi0xLjEyNnMxLjEyNi41MDYgMS4xMjYgMS4xMjZjMCAuNjE5LS41MDYgMS4xMjYtMS4xMjYgMS4xMjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJWIiB4MT0iMTY1LjU5OTYiIHgyPSIxNjUuNTk5NiIgeTE9Ii0xMzAuOTMyNiIgeTI9Ii0yMDcuMjYxMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1YpIiBkPSJNMTggNzcuNDZjLS42MiAwLTEuMTI3LS41MDctMS4xMjctMS4xMjcgMC0uNjE5LjUwNy0xLjEyNCAxLjEyNy0xLjEyNHMxLjEyNi41MDUgMS4xMjYgMS4xMjRjMCAuNjItLjUwNiAxLjEyNy0xLjEyNiAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IlciIHgxPSIxNjcuNTk5NiIgeDI9IjE2Ny41OTk2IiB5MT0iLTEzMS43MjQ2IiB5Mj0iLTIwOC4wMjAxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjVykiIGQ9Ik0xOS45OTkgODEuNzA5Yy0uNjIgMC0xLjEyNS0uNTA0LTEuMTI1LTEuMTI1IDAtLjYyLjUwNS0xLjEyNSAxLjEyNS0xLjEyNS42MjEgMCAxLjEyNy41MDUgMS4xMjcgMS4xMjUgMCAuNjIxLS41MDYgMS4xMjUtMS4xMjcgMS4xMjV6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJYIiB4MT0iMTcyLjA1ODYiIHgyPSIxNzIuMDU4NiIgeTE9Ii0xMzMuMTg5NSIgeTI9Ii0yMDkuNTUxMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI1gpIiBkPSJNMjQuNDU4IDkwLjA0M2MtLjYxOSAwLTEuMTI0LS41MDUtMS4xMjQtMS4xMjZzLjUwNS0xLjEyNiAxLjEyNC0xLjEyNmMuNjIxIDAgMS4xMjYuNTA1IDEuMTI2IDEuMTI2cy0uNTA1IDEuMTI2LTEuMTI2IDEuMTI2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iWSIgeDE9IjE3NS4wOTk2IiB4Mj0iMTc1LjA5OTYiIHkxPSItMTMzLjg3OTkiIHkyPSItMjEwLjIwODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNZKSIgZD0iTTI3LjUgOTMuNzA4Yy0uNjE5IDAtMS4xMjUtLjUwNi0xLjEyNS0xLjEyNSAwLS42MjEuNTA2LTEuMTI2IDEuMTI1LTEuMTI2czEuMTI1LjUwNSAxLjEyNSAxLjEyNmMwIC42MTktLjUwNiAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9IloiIHgxPSIxNzguMzg5NiIgeDI9IjE3OC4zODk2IiB5MT0iLTEzNC41MDQ5IiB5Mj0iLTIxMC44MDA0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjWikiIGQ9Ik0zMC43OSA5N2MtLjYxOSAwLTEuMTI1LS41MDYtMS4xMjUtMS4xMjVzLjUwNi0xLjEyNSAxLjEyNS0xLjEyNWMuNjIgMCAxLjEyNS41MDYgMS4xMjUgMS4xMjVTMzEuNDEgOTcgMzAuNzkgOTd6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhYSIgeDE9IjE4Mi4wMTU2IiB4Mj0iMTgyLjAxNTYiIHkxPSItMTM1LjA4NjkiIHkyPSItMjExLjM0OTIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhYSkiIGQ9Ik0zNC40MTcgMTAwLjA0Yy0uNjIgMC0xLjEyNS0uNTA0LTEuMTI1LTEuMTIzIDAtLjYyLjUwNi0xLjEyNiAxLjEyNS0xLjEyNnMxLjEyNC41MDYgMS4xMjQgMS4xMjZjMCAuNjE5LS41MDQgMS4xMjMtMS4xMjQgMS4xMjN6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhYiIgeDE9IjE5MC40NzQ2IiB4Mj0iMTkwLjQ3NDYiIHkxPSItMTM1Ljg3NyIgeTI9Ii0yMTIuMjA1NiIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FiKSIgZD0iTTQyLjg3NSAxMDQuNzA5Yy0uNjIgMC0xLjEyNC0uNTA1LTEuMTI0LTEuMTI3IDAtLjYxOS41MDQtMS4xMjQgMS4xMjQtMS4xMjRzMS4xMjQuNTA1IDEuMTI0IDEuMTI0YzAgLjYyMi0uNTA0IDEuMTI3LTEuMTI0IDEuMTI3eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYWMiIHgxPSIxOTQuNjQwNiIgeDI9IjE5NC42NDA2IiB5MT0iLTEzNi4yMTY4IiB5Mj0iLTIxMi41NDU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWMpIiBkPSJNNDcuMDQyIDEwNi41ODRjLS42MjIgMC0xLjEyNi0uNTA1LTEuMTI2LTEuMTI3IDAtLjYyLjUwNC0xLjEyNCAxLjEyNi0xLjEyNC42MiAwIDEuMTI1LjUwNCAxLjEyNSAxLjEyNCAwIC42MjItLjUwNCAxLjEyNy0xLjEyNSAxLjEyN3oiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFkIiB4MT0iMTk5LjQzMzYiIHgyPSIxOTkuNDMzNiIgeTE9Ii0xMzYuNDY5NyIgeTI9Ii0yMTIuNzMyIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWQpIiBkPSJNNTEuODM0IDEwNy42MjVjLS42MiAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjRzLjUwNC0xLjEyNSAxLjEyNS0xLjEyNSAxLjEyNS41MDUgMS4xMjUgMS4xMjUtLjUwNCAxLjEyNC0xLjEyNSAxLjEyNHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFlIiB4MT0iMjAzLjkzMzYiIHgyPSIyMDMuOTMzNiIgeTE9Ii0xMzYuNjM2NyIgeTI9Ii0yMTIuODk5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWUpIiBkPSJNNTYuMzM0IDEwOC41NDJjLS42MiAwLTEuMTI1LS41MDQtMS4xMjUtMS4xMjUgMC0uNjIuNTA0LTEuMTI0IDEuMTI1LTEuMTI0czEuMTI1LjUwNCAxLjEyNSAxLjEyNGMtLjAwMS42MjEtLjUwNSAxLjEyNS0xLjEyNSAxLjEyNXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFmIiB4MT0iMjA5LjQ3NDYiIHgyPSIyMDkuNDc0NiIgeTE9Ii0xMTYuMjEiIHkyPSItMjEzLjIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIC0xNDcuNjAwMSAtMTAyLjk2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNjA5OGUzIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiMWNlZjQiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxwYXRoIGZpbGw9InVybCgjYWYpIiBkPSJNNjAuODc0IDExMS4yNXYtOC42MjZoMi4wMDF2OC42MjZ6Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhZyIgeDE9IjIwOS40NzM2IiB4Mj0iMjA5LjQ3MzYiIHkxPSItMTE1Ljc2MzciIHkyPSItMjE2LjUwMzQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2MDk4ZTMiLz4KICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2IxY2VmNCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhZykiIGQ9Ik02MC44NzQgMjEuNDU4VjEyLjVoMnY4Ljk1OHoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFoIiB4MT0iMjU0LjMwNzYiIHgyPSIyNTQuMzA3NiIgeTE9Ii0xMTYuMjEwNCIgeTI9Ii0yMTMuMjEwNCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FoKSIgZD0iTTEwMi4zOTUgNjMuMTA0di0yLjAwMWg4LjYyNnYyLjAwMXoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFpIiB4MT0iMTY0LjY0MDYiIHgyPSIxNjQuNjQwNiIgeTE9Ii0xMTYuMjEwNCIgeTI9Ii0yMTMuMjEwNCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FpKSIgZD0iTTEyLjcyOCA2My4xMDR2LTJoOC42MjZ2MnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFqIiB4MT0iMjA5LjM4OTYiIHgyPSIyMDkuMzg5NSIgeTE9Ii0xMTUuNDYwNCIgeTI9Ii0yMTMuNzA5OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzYwOThlMyIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYjFjZWY0Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FqKSIgZD0ibTI2LjM1OSA0Mi4zOTMuODY3LTEuNTE5LTcuNzU0LTQuNDM1LS44NjggMS41MTcuMzI2LjE4OCA3LjQyOSA0LjI0OXpNMzYuNDIzIDE5LjUzbC4xODkuMzI0IDQuMjgxIDcuNDA4IDEuNTE2LS44NzUtNC40NzItNy43MzItMS41MTQuODc1em0wIDg0Ljg0Mi4zMjQuMTg3IDEuMTk0LjY4MyA0LjQzNC03Ljc1Ny0xLjUxOS0uODY4LTQuNDMzIDcuNzU1ek0xOC42MzYgODUuOTA2bC4xODguMzI2LjY4NyAxLjE5IDcuNzM1LTQuNDc0LS44NzgtMS41MTQtNy43MzIgNC40NzJ6bTc4LjU4MS00My41MTQgNy43NTgtNC40MzQtLjg3MS0xLjUxOS03Ljc1NCA0LjQzNi4xODcuMzI1LjY4IDEuMTkyek04Mi42ODYgMjcuMjY1bDQuNDY5LTcuNzM3LTEuNTE4LS44NzQtNC40NjggNy43MzMuMzI0LjE5IDEuMTkzLjY4OHptLTEuNDg0IDcwLjIxOS4xODcuMzI2IDQuMjQ1IDcuNDMgMS41MjEtLjg2OC00LjQzNC03Ljc1Ny0xLjUxOS44Njl6bTE1LjEzLTE0LjUzNC4zMjIuMTg4IDcuNDA4IDQuMjg0Ljg4MS0xLjUxNy03LjczNy00LjQ3MS0uODc0IDEuNTE2eiIvPgogIDxwYXRoIGQ9Ik02MC42MTMgMzAuODc2di04LjIyOGgtLjY0OGMtLjE3NS4zNTQtLjQ3My43MTktLjg5NCAxLjA5Ni0uNDIxLjM3Ni0uOTEzLjY5Ny0xLjQ3Ni45NjF2Ljk3M2MuMzEzLS4xMTYuNjY2LS4yODkgMS4wNTktLjUyLjM5My0uMjMxLjcxMS0uNDYyLjk1My0uNjkzdjYuNDExaDEuMDA2em00LjI3MS0xLjUxMmMuMTcyLS4xODEuNTYtLjUyNCAxLjE2My0xLjAzMS43MjMtLjYxMSAxLjI0LTEuMDkyIDEuNTUxLTEuNDQyLjMxMi0uMzUuNTM0LS42ODQuNjY4LTEgLjEzNS0uMzE3LjIwMS0uNjM5LjIwMS0uOTY3IDAtLjY0NS0uMjI5LTEuMTg1LS42ODgtMS42MjEtLjQ1OC0uNDM2LTEuMDgtLjY1NC0xLjg2Ny0uNjU0LS43NzggMC0xLjM5OC4yMDItMS44NjEuNjA2LS40NjIuNDA1LS43MjkuOTkyLS43OTkgMS43NjRsMS4wMzQuMTA2Yy4wMDMtLjUxNS4xNTEtLjkxNy40NDEtMS4yMDguMjkxLS4yOTEuNjc4LS40MzYgMS4xNjMtLjQzNi40NTggMCAuODMuMTM3IDEuMTE0LjQxMS4yODUuMjc0LjQyOC42MS40MjggMS4wMDkgMCAuMzgtLjE1Ni43ODMtLjQ2OSAxLjIxLS4zMTMuNDI3LS45MTUgMS4wMDUtMS44MDYgMS43MzUtLjU3NC40Ny0xLjAxMy44ODMtMS4zMTYgMS4yNDEtLjMwNC4zNTctLjUyNS43MjEtLjY2MyAxLjA5LS4wODYuMjI0LS4xMjUuNDU3LS4xMTcuNjk5aDUuNDE3di0uOTY3aC00LjAxOWMuMTEyLS4xODIuMjU0LS4zNjQuNDI1LS41NDV6bTE3LjE1My4zOTJ2Ni40MTFoMS4wMDZ2LTguMjI4aC0uNjQ4Yy0uMTc2LjM1NC0uNDc0LjcxOS0uODk1IDEuMDk2LS40MjIuMzc2LS45MTMuNjk3LTEuNDc2Ljk2MXYuOTczYy4zMTMtLjExNi42NjYtLjI4OSAxLjA2LS41Mi4zOTMtLjIzMS43MTEtLjQ2Mi45NTMtLjY5M3ptMTQuMjYyIDE4LjA5aC00LjAyYy4xMTItLjE4My4yNTQtLjM2NC40MjYtLjU0NS4xNzEtLjE4MS41NTktLjUyNCAxLjE2Mi0xLjAzMS43MjMtLjYxMSAxLjI0LTEuMDkyIDEuNTUxLTEuNDQycy41MzQtLjY4NC42NjgtMWMuMTM1LS4zMTcuMjAxLS42MzkuMjAxLS45NjcgMC0uNjQ1LS4yMjktMS4xODUtLjY4OC0xLjYyMS0uNDU4LS40MzYtMS4wOC0uNjU0LTEuODY3LS42NTQtLjc3OCAwLTEuMzk4LjIwMi0xLjg2MS42MDYtLjQ2MS40MDUtLjcyOS45OTItLjc5OSAxLjc2NGwxLjAzNC4xMDZjLjAwMy0uNTE1LjE1MS0uOTE3LjQ0MS0xLjIwOHMuNjc5LS40MzYgMS4xNjMtLjQzNmMuNDU4IDAgLjgzLjEzNyAxLjExNS40MTEuMjg1LjI3NC40MjguNjEuNDI4IDEuMDA5IDAgLjM4LS4xNTcuNzgzLS40NzEgMS4yMS0uMzEzLjQyNy0uOTE0IDEuMDA1LTEuODA1IDEuNzM1LS41NzQuNDctMS4wMTMuODgzLTEuMzE2IDEuMjQxLS4zMDQuMzU3LS41MjUuNzIxLS42NjIgMS4wOS0uMDg2LjIyNC0uMTI1LjQ1Ny0uMTE3LjY5OWg1LjQxNnYtLjk2N3ptMy45MjIgMTQuMjQ3Yy0uMjctLjM1Mi0uNjQ2LS41ODQtMS4xMy0uNjk2LjM3Mi0uMTcxLjY1NC0uNDAyLjg0NS0uNjkzLjE4OS0uMjkxLjI4NS0uNjEzLjI4NS0uOTY3IDAtLjM3My0uMS0uNzI1LS4zLTEuMDU3LS4xOTktLjMzMi0uNDg3LS41OTMtLjg2My0uNzg1cy0uNzg4LS4yODgtMS4yMzUtLjI4OGMtLjY0OCAwLTEuMTkuMTg2LTEuNjI3LjU1Ni0uNDM2LjM3MS0uNzE1Ljg5NC0uODM4IDEuNTY4bDEuMDA2LjE3OWMuMDc0LS40OTIuMjQyLS44NjEuNTAzLTEuMTA3cy41ODctLjM2OS45NzktLjM2OWMuMzk1IDAgLjcxOC4xMjEuOTY3LjM2M3MuMzc0LjU0OC4zNzQuOTE3YzAgLjQ2Ni0uMTcxLjgxMS0uNTE0IDEuMDM0cy0uNzI5LjMzNS0xLjE1Ny4zMzVjLS4wNDEgMC0uMDk1LS4wMDQtLjE2Mi0uMDExbC0uMTEyLjg4M2MuMjgzLS4wNzQuNTIxLS4xMTEuNzExLS4xMTEuNDY1IDAgLjg1LjE1IDEuMTUuNDUuMzAzLjMuNDUzLjY4MS40NTMgMS4xNDMgMCAuNDg0LS4xNjIuODkxLS40ODggMS4yMTlzLS43MjcuNDkyLTEuMTk5LjQ5MmMtLjM5OCAwLS43MzctLjEyNy0xLjAxNS0uMzc4LS4yNzgtLjI1MS0uNDc1LS42NjItLjU5LTEuMjMybC0xLjAwNy4xMzRjLjA2OC42ODIuMzM5IDEuMjM4LjgxNCAxLjY2Ni40NzUuNDI5IDEuMDcyLjY0MyAxLjc5MS42NDMuNzk3IDAgMS40NTctLjI0OCAxLjk3OS0uNzQ2LjUyMS0uNDk3Ljc4My0xLjEwNC43ODMtMS44MTktLjAwMS0uNTMtLjEzNi0uOTcxLS40MDMtMS4zMjN6bS00LjgyNSAxNC4wMDRoLS44MjJsLTMuNzM4IDUuMzExdi45MjJoMy41NTV2MS45NjJoMS4wMDZWODIuMzNoMS4xMDZ2LS45MjJoLTEuMTA2di01LjMxMXptLTEuMDA2IDUuMzFoLTIuNTY2bDIuNTY2LTMuNjk1djMuNjk1em0tMTIuNzg2IDkuMDM0Yy0uNTQgMC0xLjA1Ny4xNzItMS41NDguNTE1bC40NDEtMi4yMDJoMy4yNzF2LS45NjFoLTQuMDc1bC0uNzk0IDQuMjA5Ljk0NS4xMjNjLjE0OC0uMjM1LjM1NC0uNDI2LjYxNC0uNTc0LjI2MS0uMTQ2LjU1NC0uMjIxLjg3OC0uMjIxLjUyMSAwIC45NDMuMTY2IDEuMjY2LjQ5OHMuNDgzLjc4NS40ODMgMS4zNThjMCAuNjA0LS4xNjcgMS4wODgtLjUwMyAxLjQ1M3MtLjc0NS41NDgtMS4yMjkuNTQ4Yy0uNDAyIDAtLjc0Ni0uMTI5LTEuMDMxLS4zODktLjI4NS0uMjU5LS40NjctLjY0Ni0uNTQ1LTEuMTZsLTEuMDU3LjA5Yy4wNjcuNjg5LjMzNyAxLjI0Mi44MDggMS42Ni40NzIuNDE4IDEuMDguNjI2IDEuODI1LjYyNi45MDkgMCAxLjYyNi0uMzMxIDIuMTUxLS45OTUuNDMzLS41NC42NDgtMS4xODIuNjQ4LTEuOTIyIDAtLjc3OS0uMjQ2LTEuNDE2LS43MzctMS45MTItLjQ5Mi0uNDk2LTEuMDk2LS43NDQtMS44MTEtLjc0NHptLTE4Ljk1OSA0LjI4NGMtLjM4NCAwLS43NTEuMDktMS4xMDEuMjY4LS4zNTEuMTgtLjY0Ni40NTMtLjg4OS44MjIuMDA3LS44Mi4xMDItMS40NTEuMjg1LTEuODk1cy40MzMtLjc4MS43NDktMS4wMTJjLjI0Mi0uMTguNTIzLS4yNjkuODQ0LS4yNjkuMzk4IDAgLjczNC4xNDQgMS4wMDYuNDMxLjE2NC4xNzguMjkxLjQ2NS4zOC44NmwxLjAwMS0uMDc4Yy0uMDgyLS42MzgtLjMzLTEuMTM3LS43NDEtMS40OTgtLjQxMi0uMzYxLS45NC0uNTQyLTEuNTg0LS41NDItLjg2NSAwLTEuNTUyLjMxMy0yLjA2My45MzktLjU4NS43MTktLjg3OCAxLjg3LS44NzggMy40NTMgMCAxLjQxNi4yNjUgMi40MzQuNzk0IDMuMDVzMS4yMTMuOTI1IDIuMDUxLjkyNWMuNDkyIDAgLjkzMi0uMTE3IDEuMzE5LS4zNTIuMzg3LS4yMzUuNjkxLS41NzMuOTE0LTEuMDE2LjIyMS0uNDQxLjMzMi0uOTE5LjMzMi0xLjQzNCAwLS43ODItLjIzNS0xLjQyLS43MDctMS45MTQtLjQ3MS0uNDkyLTEuMDQyLS43MzgtMS43MTItLjczOHptLjkzMyA0LjExM2MtLjMwNi4zNDQtLjY3MS41MTUtMS4wOTYuNTE1LS4yOTEgMC0uNTY4LS4wODMtLjgzMy0uMjQ5cy0uNDctLjQwNi0uNjE4LS43MjRjLS4xNDctLjMxNi0uMjIxLS42NDgtLjIyMS0uOTk1IDAtLjUyOS4xNTgtLjk1Ny40NzUtMS4yODMuMzE3LS4zMjUuNzAzLS40ODggMS4xNTctLjQ4OC40NTggMCAuODM4LjE2MyAxLjE0LjQ4OC4zMDIuMzI2LjQ1My43NzMuNDUzIDEuMzQuMDAxLjU4Ny0uMTUyIDEuMDU0LS40NTcgMS4zOTZ6TTQyLjM0OSA4OC4wMDRoNC4wMTRjLS41MTEuNTgyLS45OTIgMS4yOTYtMS40NDUgMi4xNDQtLjQ1My44NDgtLjggMS43MjgtMS4wNDIgMi42NDItLjI0My45MTItLjM2OSAxLjY5MS0uMzggMi4zMzZoMS4wMzRjLjA1Ni0uODE2LjE4NS0xLjU2Ni4zODYtMi4yNTIuMjc5LS45NzMuNjc1LTEuOTIgMS4xODgtMi44NC41MTMtLjkyIDEuMDI5LTEuNjU4IDEuNTUxLTIuMjE0di0uNzgySDQyLjM1di45NjZ6bS04Ljk1MS0xMC4wNTNjLjQwNi0uMTUyLjcwOS0uMzY5LjkwOC0uNjVzLjI5OS0uNjEyLjI5OS0uOTkyYzAtLjU5Ni0uMjE4LTEuMTAyLS42NTQtMS41MThzLTEuMDEyLS42MjMtMS43MjctLjYyM2MtLjcxMiAwLTEuMjgyLjIwMy0xLjcxLjYwOXMtLjY0My45MDctLjY0MyAxLjUwNGMwIC4zOTUuMTAxLjczMy4zMDIgMS4wMTdzLjUxLjUwMS45MjguNjUzYy0uNS4xMzEtLjg4NC4zNzYtMS4xNTQuNzM2LS4yNy4zNTktLjQwNS44MDUtLjQwNSAxLjMzOCAwIC43MTYuMjQ4IDEuMzEzLjc0NCAxLjc5MS40OTYuNDc5IDEuMTQ3LjcxOSAxLjk1Ni43MTlzMS40NjEtLjIzOCAxLjk1Ny0uNzE1Yy40OTYtLjQ3OC43NDMtMS4wNjYuNzQzLTEuNzY3IDAtLjUwNy0uMTMxLS45NDItLjM5NC0xLjMwOHMtLjY0Ny0uNjMtMS4xNS0uNzk0ek0zMC45IDc2LjI0N2MwLS4zNDMuMTI2LS42MzguMzgtLjg4NHMuNTcyLS4zNjguOTU2LS4zNjhjLjM4IDAgLjY5OC4xMjYuOTUzLjM3N3MuMzgzLjU2Mi4zODMuOTMxYzAgLjM1NC0uMTI0LjY1My0uMzcyLjg5N3MtLjU2NS4zNjYtLjk1My4zNjZjLS4zOTkgMC0uNzIzLS4xMjMtLjk3My0uMzY5cy0uMzc0LS41NjItLjM3NC0uOTV6bTIuNTQzIDQuOTk3Yy0uMzEzLjMwOS0uNzA5LjQ2NC0xLjE5LjQ2NC0uMzA5IDAtLjU5OC0uMDczLS44NjYtLjIyMS0uMjY5LS4xNDctLjQ3MS0uMzU0LS42MDYtLjYyNC0uMTM2LS4yNjgtLjIwNC0uNTQ1LS4yMDQtLjgzMiAwLS40Ny4xNTUtLjg2MS40NjctMS4xNzQuMzExLS4zMTMuNzAzLS40NyAxLjE3Ni0uNDcuNDg0IDAgLjg4OC4xNTkgMS4yMS40NzZzLjQ4My43MTcuNDgzIDEuMjAxYzAgLjQ3Ny0uMTU3Ljg3MS0uNDcgMS4xOHpNMzAuNjcgNjEuNTY5YzAtMS4wMDYtLjExNC0xLjc3NS0uMzQ0LTIuMzA2LS4yMjktLjUzMS0uNTY0LS45NC0xLjAwNi0xLjIyNy0uNDQyLS4yODctLjkyOS0uNDMxLTEuNDYyLS40MzEtLjczOCAwLTEuMzUyLjI1My0xLjg0Mi43NnMtLjczNSAxLjE3Ni0uNzM1IDIuMDA3YzAgLjgwNS4yMzUgMS40NTMuNzA0IDEuOTQ1LjQ3LjQ5MiAxLjA0My43MzggMS43MjIuNzM4LjQwNiAwIC43ODQtLjEgMS4xMzItLjI5OS4zNDktLjE5OS42MjQtLjQ1OS44MjUtLjc4LjAwMy4wODkuMDA1LjE1Ny4wMDUuMjAxIDAgLjQxNy0uMDUuODI4LS4xNTEgMS4yM3MtLjIyNi43MjItLjM3NS45NThjLS4xNDkuMjM3LS4zNC40MjYtLjU3My41NjctLjIzMy4xNDMtLjUwNC4yMTMtLjgxMy4yMTMtLjM2MSAwLS42NTgtLjEwMy0uODg5LS4zMDgtLjIzMS0uMjA0LS4zODgtLjUzNS0uNDY5LS45ODlsLS45NjcuMDg5Yy4wODIuNjQ1LjMyNiAxLjE0NS43MzIgMS41LjQwNi4zNTYuOTMuNTM0IDEuNTcuNTM0LjYwNCAwIDEuMTMtLjE2MiAxLjU3OS0uNDg2LjQ0OS0uMzI0Ljc4Ny0uNzk2IDEuMDE1LTEuNDE3LjIyOC0uNjE4LjM0Mi0xLjQ1Mi4zNDItMi40OTl6bS0xLjU2OC4xMDljLS4zLjMyNi0uNjgzLjQ4OS0xLjE0OC40ODktLjQ2MiAwLS44NTEtLjE2My0xLjE2Ni0uNDg5cy0uNDcyLS43NS0uNDcyLTEuMjcxYzAtLjU4Mi4xNjYtMS4wNTUuNDk4LTEuNDIuMzMyLS4zNjUuNzIxLS41NDggMS4xNjgtLjU0OC40MzIgMCAuODAyLjE2OSAxLjEwOS41MDkuMzA4LjMzOS40NjEuNzk3LjQ2MSAxLjM3NXMtLjE1IDEuMDI5LS40NSAxLjM1NXpNMzkuMTE1IDM5LjcyYy0uMjE2LS4zMzMtLjQ5LS41ODgtLjgyMS0uNzY2LS4zMzItLjE3Ny0uNzE4LS4yNjYtMS4xNTctLjI2Ni0uNTk2IDAtMS4wOTEuMTYxLTEuNDg0LjQ4MS0uMzk0LjMyLS42ODkuNzc2LS44ODkgMS4zNjctLjE5OS41OS0uMjk5IDEuMzctLjI5OSAyLjMzOSAwIDEuNTM5LjI3IDIuNjQ5LjgxMSAzLjMzMS40NTEuNTY2IDEuMDcxLjg1IDEuODYxLjg1LjYgMCAxLjA5Ni0uMTYxIDEuNDktLjQ4My4zOTMtLjMyMi42ODgtLjc3OS44ODYtMS4zNy4xOTctLjU5LjI5Ni0xLjM2Ny4yOTYtMi4zMjggMC0uODEzLS4wNjItMS40NTgtLjE4NS0xLjkzN3MtLjI5Mi0uODg0LS41MDktMS4yMTh6bS0uODEzIDUuODM5Yy0uMzE1LjQ0Ny0uNzA0LjY3MS0xLjE2Ni42NzFzLS44NTEtLjIyMy0xLjE2Ni0uNjY4LS40NzItMS4zNC0uNDcyLTIuNjg2LjE3My0yLjI2OC41Mi0yLjc2N2MuMjc2LS4zOTEuNjQ1LS41ODcgMS4xMDctLjU4Ny40NyAwIC44NjIuMjIyIDEuMTc3LjY2NS4zMTQuNDQ0LjQ3MiAxLjM0LjQ3MiAyLjY4OSAwIDEuMzQxLS4xNTcgMi4yMzUtLjQ3MiAyLjY4M3ptLTcuNDItNS4wNTN2Ni40MTFoMS4wMDZ2LTguMjI4aC0uNjQ4Yy0uMTc1LjM1NC0uNDczLjcxOS0uODk0IDEuMDk2LS40MjEuMzc2LS45MTMuNjk3LTEuNDc2Ljk2MXYuOTczYy4zMTMtLjExNi42NjYtLjI4OSAxLjA1OS0uNTIuMzkzLS4yMzEuNzExLS40NjIuOTUzLS42OTN6bTEzLjM5NC0xMS4yNXY2LjQxMWgxLjAwNnYtOC4yMjhoLS42NDhjLS4xNzUuMzU0LS40NzMuNzE5LS44OTQgMS4wOTYtLjQyMS4zNzYtLjkxMy42OTctMS40NzYuOTYxdi45NzNjLjMxMy0uMTE2LjY2Ni0uMjg5IDEuMDU5LS41Mi4zOTMtLjIzMS43MTEtLjQ2Mi45NTMtLjY5M3ptNC45OC0uNzIxYy0uNDIxLjM3Ni0uOTEzLjY5Ny0xLjQ3Ni45NjF2Ljk3M2MuMzEzLS4xMTYuNjY2LS4yODkgMS4wNTktLjUyLjM5My0uMjMxLjcxMS0uNDYyLjk1My0uNjkzdjYuNDExaDEuMDA2di04LjIyOGgtLjY0OGMtLjE3NC4zNTQtLjQ3My43MTktLjg5NCAxLjA5NnoiLz4KICA8cGF0aCBmaWxsPSIjRkY4MDY1IiBkPSJNNjIuOTMgNTQuNjIyYy40OTMuOTg4LjA5MiAyLjE4OS0uODk2IDIuNjgzbC0yLjA4OCAxLjA0MmMtLjk4OC40OTMtMi4xODkuMDkyLTIuNjgzLS44OTZsLTUuMzU5LTEwLjczN2MtLjQ5My0uOTg4LS4wOTItMi4xODkuODk2LTIuNjgzbDIuMDg4LTEuMDQyYy45ODgtLjQ5MyAyLjE4OS0uMDkyIDIuNjgzLjg5Nmw1LjM1OSAxMC43Mzd6Ii8+CiAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRkY4MDY1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTYwLjM3NSA1Ni4zOTYgODQuMjUgMTA0Ljc1Ii8+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJhayIgeDE9IjEyNi4yMzgzIiB4Mj0iMTI2LjIzODMiIHkxPSItMjA1LjQyMTkiIHkyPSItMjA3Ljk0MTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk3OTYgLS4yMDA4IC0uMjAwOCAtLjk3OTYgLTExMi4wMjkgLTExMy45ODA0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNTI0YWM5Ii8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4wOTU3IiBzdG9wLWNvbG9yPSIjNTg1NWJjIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4yMzUyIiBzdG9wLWNvbG9yPSIjNWQ2MGFmIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii4zNjgxIiBzdG9wLWNvbG9yPSIjNWY2NGFiIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ii43MjUzIiBzdG9wLWNvbG9yPSIjMTkwYzdmIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cGF0aCBmaWxsPSJ1cmwoI2FrKSIgZD0iTTY5LjAzMyA1OS45OTRjLjE4Ljg3OS0uMzg3IDEuNzM3LTEuMjY2IDEuOTE4bC0yOC41NiA1Ljg4Yy0uODc5LjE4MS0xLjczOC0uMzg3LTEuOTE4LTEuMjY3LS4xOC0uODc5LjM4Ni0xLjczOCAxLjI2NS0xLjkxOGwyOC41Ni01Ljg3OWMuODgtLjE4IDEuNzQuMzg2IDEuOTE5IDEuMjY2eiIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYWwiIHgxPSItMTEzLjk1NzUiIHgyPSItMTEzLjk1NzUiIHkxPSItMTk4LjY2OTQiIHkyPSItMjAxLjg4NTEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjY1NTIgLS43NTU1IC0uNzU1NSAtLjY1NTIgLS45Nzc0IC0xNzAuNjU5OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzUyNGFjOSIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMDk1NyIgc3RvcC1jb2xvcj0iIzU4NTViYyIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMjM1MiIgc3RvcC1jb2xvcj0iIzVkNjBhZiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuMzY4MSIgc3RvcC1jb2xvcj0iIzVmNjRhYiIvPgogICAgPHN0b3Agb2Zmc2V0PSIuNzI1MyIgc3RvcC1jb2xvcj0iIzE5MGM3ZiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHBhdGggZmlsbD0idXJsKCNhbCkiIGQ9Ik05My4zNzMgMjYuNjE5Yy40MTcuMzYyLjQ2My45OTMuMTAyIDEuNDFMNjAuMDE3IDY3LjE1MmMtLjM2Mi40MTgtLjk5NC40NjMtMS40MTEuMTAybC0uNzU1LS42NTZjLS40MTctLjM2MS0uNDYzLS45OTItLjEwMS0xLjQxbDMzLjQ1OC0zOS4xMjRjLjM2LS40MTguOTkzLS40NjIgMS40MDktLjEwMWwuNzU2LjY1NnoiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImFtIiB4MT0iMjEwLjAwNTkiIHgyPSIyMTAuMDA1OSIgeTE9Ii0xNTkuOTYwNCIgeTI9Ii0xNjguMTQ3NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAtMTQ3LjYwMDEgLTEwMi45NikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzhiYTRkNiIvPgogICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMWIzZWE2Ii8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8Y2lyY2xlIGN4PSI2Mi40MDYiIGN5PSI2MS4yODEiIHI9IjQuNDY5IiBmaWxsPSJ1cmwoI2FtKSIvPgogIDxyYWRpYWxHcmFkaWVudCBpZD0iYW4iIGN4PSIyMDguOTY0OCIgY3k9Ii0xNjAuMjUyIiByPSI3LjU2NTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgLTE0Ny42MDAxIC0xMDIuOTYpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjA1MTUiIHN0b3AtY29sb3I9IiNmNmZhZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjEzNjEiIHN0b3AtY29sb3I9IiNkZWYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjI0MzIiIHN0b3AtY29sb3I9IiNiNWQ5ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjM2ODgiIHN0b3AtY29sb3I9IiM3ZGJkZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjUwODEiIHN0b3AtY29sb3I9IiMzNjk5ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjU3MTQiIHN0b3AtY29sb3I9IiMxNDg3ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjgxMzIiIHN0b3AtY29sb3I9IiMwZjg1ZmYiLz4KICAgIDxzdG9wIG9mZnNldD0iLjk2NyIgc3RvcC1jb2xvcj0iIzMzOTdmZiIvPgogIDwvcmFkaWFsR3JhZGllbnQ+CiAgPGNpcmNsZSBjeD0iNjIuMzY1IiBjeT0iNjEuMjkyIiByPSIzLjc1IiBmaWxsPSJ1cmwoI2FuKSIvPgo8L3N2Zz4=\"\nLABEL oc.keyword=\"xclock,clock,xclock,time\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xclock.XClock\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine.minimal\"\nLABEL oc.name=\"xclock\"\nLABEL oc.displayname=\"Xclock\"\nLABEL oc.path=\"/usr/bin/xclock\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xclock\"\nENV APPBIN \"/usr/bin/xclock\"\nENV APP \"/usr/bin/xclock\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xclock/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xclock/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application xclock

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xclock.d\n
"},{"location":"applications/xclock/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f xclock.d -t xclock .\n
"},{"location":"applications/xclock/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect xclock > xclock.json\ndocker image save xclock -o xclock.tar\nctr -n k8s.io images import xclock.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xclock.json\n\n
"},{"location":"applications/xedit/","title":"xedit","text":""},{"location":"applications/xedit/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.18.04

"},{"location":"applications/xedit/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/xedit/#ubuntu-packages","title":"Ubuntu packages","text":"
x11-apps x11-utils xbitmaps\n
"},{"location":"applications/xedit/#displayname","title":"Displayname","text":"
Xedit\n
"},{"location":"applications/xedit/#path","title":"Path","text":"
/usr/bin/xedit\n
"},{"location":"applications/xedit/#mimetype","title":"Mimetype","text":"
application/text;\n
"},{"location":"applications/xedit/#file-extensions","title":"File extensions","text":"

\"txt;log;md\"

"},{"location":"applications/xedit/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/xedit/#wm_class","title":"WM_CLASS","text":"
xedit.Xedit\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/xedit/#json-dump","title":"JSON dump","text":"

json source file xedit.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"containerengine\": \"ephemeral_container\",\n    \"debpackage\": \"x11-apps x11-utils xbitmaps\",\n    \"icon\": \"circle_xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.18.04\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\": \"txt;log;md\",\n    \"args\": \"\",\n    \"quick\": true\n}\n
"},{"location":"applications/xedit/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output xedit.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xedit.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xedit.d.3.0.json\n\n
"},{"location":"applications/xedit/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps x11-utils xbitmaps && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_xedit.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMC45NzMiIHgyPSIzNi45MzciIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTAyIDAgMCAxLjUwMzcgLTMuOTgyNyAtMy4zNDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyYTJjMmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDI0NjQ5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjMxOS4yMSIgeDI9IjY1Ny42NSIgeTE9IjIzNS4xNSIgeTI9IjI2OS40OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTMyMzUgMCAwIC4xMzA3NSAtMzIuMzc5IDEuMDg3MykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U1NGMxOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZWMzNTAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYsMCwwLDEuMzI3NiwtNTEwLjY0LC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgeD0iLS4wNDk4OTciIHk9Ii0uMDc1MjMyIiB3aWR0aD0iMS4wOTk4IiBoZWlnaHQ9IjEuMTUwNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MzU1MzYwOCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDU1MzE5IiB5PSItLjA2NTU2MyIgd2lkdGg9IjEuMTEwNiIgaGVpZ2h0PSIxLjEzMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTA2MjkxMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5LDAsMCwxLjQ5OTksLTU4MC44MSwtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5IDAgMCAxLjQ5OTkgLTU4MC44MSAtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPHJlY3QgeD0iNjQuOTY1IiB5PSIyOS43OTMiIHdpZHRoPSIuMDY3NDk1IiBoZWlnaHQ9IjAiIGZpbGw9IiMwMDBjZmYiIG9wYWNpdHk9Ii40MDc0MSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuMjU2MyI+CiAgPHBhdGggZD0ibTEyLjkzNCA1Mi45ODIgMTQuNzI0LTE5LjI3NC0xNS4xNTktMjEuMTkyIDkuNzQzMSAwLjAwODEgMTIuMDc5IDE2LjY2My0xOC4wNiAyMy43OTRoLTMuMzI3em0yOC44MTkgMC4wMTM2OC0xMS45OTUtMTYuNjkyIDE4LjIxMS0yMy44MDVoMy4yNDQ3bC0xNC43ODQgMTkuMzY0IDE1LjA2OCAyMS4xMzJ6Ii8+CiAgPHBhdGggZD0ibTMxLjk5NiAxOS44OTJjLTEuMTcxNCAwLTIuNDIyOSAwLjA4OTYtMy41NDk2IDAuMTk2NDYgMi4wMDcyIDIuNTg2MiAzLjY3MjYgNC43NzYyIDUuNTg5NCA3LjI2MzQtMS4wNzU4LTIuMjg3Mi0zLjI4NjktNC40ODA1LTIuNTIyNS01LjYwODQgMC43NTY2NS0xLjExNjYgMi4xNTA4LTAuOTI4NjIgMi4yNTctMC45Mjg2MiAyLjIzNTEgMCA0LjM4NjcgMC4yNDkzOSA2LjM5ODEgMC43MTA5NWwwLjQ3MTQ4LTAuNjQxNDljLTIuNjgyOC0wLjY4MjI4LTUuNTk2Ny0wLjk5MjIxLTguNjQzOS0wLjk5MjIxem0xMi4xMDYgMi4wODcyLTAuNDM0MjYgMC42MTI4OWM2LjE5NzIgMi4zOTc1IDEwLjM4OSA2Ljk3NjggMTAuMzg5IDEyLjIyNSAwIDcuNzI4MS05LjA4NzYgMTMuOTk4LTIwLjI4NiAxMy45OTgtMTEuMTk5IDAtMjAuMjktNi4yNzAzLTIwLjI5LTEzLjk5OCAxZS02IC00LjIwODUgMi42OTYxLTcuOTg2MiA2Ljk2MDYtMTAuNTU0bC0xLjMxMTEtMS45NzM1Yy02LjY4OTYgMi44MDIyLTExLjEzIDcuNzIwNy0xMS4xMyAxMy4zMiAwIDguNzEyMyAxMC43NSAxNS43OCAyMy45OTYgMTUuNzggMTMuMjQ3IDAgMjQtNy4wNjc1IDI0LTE1Ljc4IDAtNS44MDk2LTQuNzgwNy0xMC44OS0xMS44OTUtMTMuNjMxeiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIHN0cm9rZS13aWR0aD0iMS4yNTYzIj4KICA8cGF0aCBkPSJtMTIuOTM0IDUyLjk4MiAxNC43MjQtMTkuMjc0LTE1LjE1OS0yMS4xOTIgOS43NDMxIDAuMDA4MSAxMi4wNzkgMTYuNjYzLTE4LjA2IDIzLjc5NGgtMy4zMjd6bTI4LjgxOSAwLjAxMzY4LTExLjk5NS0xNi42OTIgMTguMjExLTIzLjgwNWgzLjI0NDdsLTE0Ljc4NCAxOS4zNjQgMTUuMDY4IDIxLjEzMnoiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzEuOTk2IDE5Ljg5MmMtMS4xNzE0IDAtMi40MjI5IDAuMDg5Ni0zLjU0OTYgMC4xOTY0NiAyLjAwNzIgMi41ODYyIDMuNjcyNiA0Ljc3NjIgNS41ODk0IDcuMjYzNC0xLjA3NTgtMi4yODcyLTMuMjg2OS00LjQ4MDUtMi41MjI1LTUuNjA4NCAwLjc1NjY1LTEuMTE2NiAyLjE1MDgtMC45Mjg2MiAyLjI1Ny0wLjkyODYyIDIuMjM1MSAwIDQuMzg2NyAwLjI0OTM5IDYuMzk4MSAwLjcxMDk1bDAuNDcxNDgtMC42NDE0OWMtMi42ODI4LTAuNjgyMjgtNS41OTY3LTAuOTkyMjEtOC42NDM5LTAuOTkyMjF6bTEyLjEwNiAyLjA4NzItMC40MzQyNiAwLjYxMjg5YzYuMTk3MiAyLjM5NzUgMTAuMzg5IDYuOTc2OCAxMC4zODkgMTIuMjI1IDAgNy43MjgxLTkuMDg3NiAxMy45OTgtMjAuMjg2IDEzLjk5OC0xMS4xOTkgMC0yMC4yOS02LjI3MDMtMjAuMjktMTMuOTk4IDFlLTYgLTQuMjA4NSAyLjY5NjEtNy45ODYyIDYuOTYwNi0xMC41NTRsLTEuMzExMS0xLjk3MzVjLTYuNjg5NiAyLjgwMjItMTEuMTMgNy43MjA3LTExLjEzIDEzLjMyIDAgOC43MTIzIDEwLjc1IDE1Ljc4IDIzLjk5NiAxNS43OCAxMy4yNDcgMCAyNC03LjA2NzUgMjQtMTUuNzggMC01LjgwOTYtNC43ODA3LTEwLjg5LTExLjg5NS0xMy42MzF6IiBmaWxsPSJ1cmwoI2EpIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xedit,text,notepad,edit,txt,editor,xedit\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xedit.Xedit\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.18.04\"\nLABEL oc.name=\"xedit\"\nLABEL oc.displayname=\"Xedit\"\nLABEL oc.path=\"/usr/bin/xedit\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/text;\"\nLABEL oc.fileextensions=\"txt;log;md\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xedit\"\nENV APPBIN \"/usr/bin/xedit\"\nENV APP \"/usr/bin/xedit\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xedit/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xedit/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application xedit

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xedit.d\n
"},{"location":"applications/xedit/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f xedit.d -t xedit .\n
"},{"location":"applications/xedit/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect xedit > xedit.json\ndocker image save xedit -o xedit.tar\nctr -n k8s.io images import xedit.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xedit.json\n\n
"},{"location":"applications/xeyes/","title":"xeyes","text":""},{"location":"applications/xeyes/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/xeyes/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/xeyes/#alpine-packages","title":"Alpine packages","text":"
xeyes\n
"},{"location":"applications/xeyes/#path","title":"Path","text":"
/usr/bin/xeyes\n
"},{"location":"applications/xeyes/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/xeyes/#wm_class","title":"WM_CLASS","text":"
xeyes.XEyes\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/xeyes/#json-dump","title":"JSON dump","text":"

json source file xeyes.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"apkpackage\": \"xeyes\",\n    \"icon\": \"circle_xfce4-eyes.svg\",\n    \"keyword\": \"eyes\",\n    \"launch\": \"xeyes.XEyes\",\n    \"name\": \"xeyes\",\n    \"path\": \"/usr/bin/xeyes\",\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"quick\": true\n}\n
"},{"location":"applications/xeyes/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output xeyes.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xeyes.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xeyes.d.3.0.json\n\n
"},{"location":"applications/xeyes/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update xeyes\nLABEL oc.icon=\"circle_xfce4-eyes.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogPGRlZnM+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDk0MSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM0N2M0ZTUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDc4YmU1IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MzUiIHgxPSIyOS41NjUiIHgyPSIyOS43MjgiIHkxPSIxMS4wNDgiIHkyPSI1My41NTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ViZWJlYiIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNjN2M3YzciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNTIwIiB4Mj0iNTIwLjAzIiB5MT0iNDQiIHkyPSI5ODUuODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA2MzU2IDAgMCAuMDYzNTYgLS41NDIzNyAtLjU0MjM3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzUzNTM1IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzZkNmQ2ZCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJnIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTQuMTYiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI4OTEiIHg9Ii0uMTQwMzEiIHk9Ii0uMTQwMzEiIHdpZHRoPSIxLjI4MDYiIGhlaWdodD0iMS4yODA2IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjY2NDA5MjUiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI4OTUiIHg9Ii0uMTc2NTIiIHk9Ii0uMTc2NTIiIHdpZHRoPSIxLjM1MyIgaGVpZ2h0PSIxLjM1MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMS42NjQwOTI1Ii8+CiAgPC9maWx0ZXI+CiAgPGZpbHRlciBpZD0iZmlsdGVyOTA3IiB4PSItLjAyODUzIiB5PSItLjA1NTM5NSIgd2lkdGg9IjEuMDU3MSIgaGVpZ2h0PSIxLjExMDgiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuMzM4Mzc1MzgiLz4KICA8L2ZpbHRlcj4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MTEiIHg9Ii0uMDM1ODkzIiB5PSItLjA2OTE3IiB3aWR0aD0iMS4wNzE4IiBoZWlnaHQ9IjEuMTM4MyIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC4zMzgzNzUzOCIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ5MjEiIHgxPSIxMC44NzkiIHgyPSIzMy41MDUiIHkxPSIyOC4yNTYiIHkyPSIyOC4yNTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ5MzUiLz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50OTI5IiB4MT0iMjQuOTg5IiB4Mj0iNTMuNDU0IiB5MT0iMzQuMDk1IiB5Mj0iMzQuMDk1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTM1Ii8+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJyYWRpYWxHcmFkaWVudDk0MyIgY3g9IjIyLjE5MiIgY3k9IjI2LjA2NiIgcj0iNC4wMTQzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTQxIi8+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJyYWRpYWxHcmFkaWVudDk1MSIgY3g9IjQxLjE2OCIgY3k9IjMxLjkwNSIgcj0iNi4yMDM5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50OTQxIi8+CiA8L2RlZnM+CiA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCguMDYzNTYgMCAwIC4wNjM1NiAtLjU0MjM3IC0uNTQyMzcpIiBkPSJtOTY5LjcgMzkyYy0xLjEtNC4zNS0yLjM1LTktMy42NS0xMy42LTIuNS04Ljc1LTUuMzUtMTcuNi04LjQ1LTI2LjM1LTYuNDUtMTguMjUtMTQuMTUtMzYuMDUtMjMuMTUtNTMuNjUtMy44LTcuNC03Ljk1LTE0Ljk1LTEyLjMtMjIuNGgtMC4wMjVxLTMwLjYwMS01Mi4wMS03Ni4zMjUtOTcuNzVjLTkyLjE1LTkyLjE1LTIwMy40NS0xMzguMjUtMzMzLjgtMTM4LjI1cy0yNDEuNiA0Ni4xLTMzMy43NSAxMzguMjUtMTM4LjI1IDIwMy40LTEzOC4yNSAzMzMuNzUgNDYuMSAyNDEuNjUgMTM4LjI1IDMzMy44YzY4LjA1IDY4LjA1IDE0Ni41IDExMC45NSAyMzQuOSAxMjguNjUgMzEuOTUgNi40IDY0Ljc1IDkuNTUgOTguODUgOS41NSAxMzAuMzUgMCAyNDEuNjUtNDYuMDUgMzMzLjgtMTM4LjIgNDguNi00OC42IDg0LjQtMTAyLjUgMTA3LjM1LTE2MS44IDE3LTQzLjk1IDI3LTkwLjggMjkuOTUtMTQwLjc1IDAuNi0xMC4yIDAuOS0yMC42NSAwLjktMzEuMjUgMC00MS43NS00LjctODEuNi0xNC4zLTEyMHoiIGZpbHRlcj0idXJsKCNnKSIgb3BhY2l0eT0iLjI1IiBzdHJva2Utd2lkdGg9IjE1LjY3MiIvPgogPHBhdGggZD0ibTYxLjA5MSAyNC4zNzNjLTAuMDY5OTItMC4yNzY0OC0wLjE0OTM2LTAuNTcyMDQtMC4yMzE5OS0wLjg2NDQxLTAuMTU4OS0wLjU1NjE1LTAuMzQwMDQtMS4xMTg2LTAuNTM3MDgtMS42NzQ4LTAuNDA5OTYtMS4xNi0wLjg5OTM3LTIuMjkxMy0xLjQ3MTQtMy40MS0wLjI0MTUzLTAuNDcwMzQtMC41MDUzLTAuOTUwMjItMC43ODE3OC0xLjQyMzdoLTAuMDAxNnEtMS45NDUtMy4zMDU3LTQuODUxMi02LjIxMjljLTUuODU3LTUuODU3LTEyLjkzMS04Ljc4NzEtMjEuMjE2LTguNzg3MXMtMTUuMzU2IDIuOTMwMS0yMS4yMTMgOC43ODcxLTguNzg3MSAxMi45MjgtOC43ODcxIDIxLjIxMyAyLjkzMDEgMTUuMzU5IDguNzg3MSAyMS4yMTZjNC4zMjUyIDQuMzI1MiA5LjMxMTUgNy4wNTE5IDE0LjkzIDguMTc2OSAyLjAzMDcgMC40MDY3OCA0LjExNTUgMC42MDY5OSA2LjI4MjkgMC42MDY5OSA4LjI4NSAwIDE1LjM1OS0yLjkyNjkgMjEuMjE2LTguNzgzOSAzLjA4OS0zLjA4OSA1LjM2NDQtNi41MTQ4IDYuODIzMS0xMC4yODQgMS4wODA1LTIuNzkzNCAxLjcxNjEtNS43NzEyIDEuOTAzNi04Ljk0NiAwLjAzODE0LTAuNjQ4MzEgMC4wNTcyLTEuMzEyNSAwLjA1NzItMS45ODYyIDAtMi42NTM2LTAuMjk4NzMtNS4xODY1LTAuOTA4OS03LjYyNzF6IiBmaWxsPSJ1cmwoI2IpIiBzdHJva2Utd2lkdGg9Ii45OTYxIi8+CiA8Y2lyY2xlIGN4PSIyMi4xOTIiIGN5PSIyOC45ODYiIHI9IjExLjMxMyIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjg5NSkiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjguMjU2IiByPSIxMS4zMTMiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ5MjEpIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPHBhdGggZD0ibTIyLjE5MiAxNi45NDNhMTEuMzEzIDExLjMxMyAwIDAgMC0xMS4zMTMgMTEuMzEzIDExLjMxMyAxMS4zMTMgMCAwIDAgMC4wMTU2OCAwLjQyNzY2IDExLjMxMyAxMS4zMTMgMCAwIDEgMTEuMjk3LTExLjAxMSAxMS4zMTMgMTEuMzEzIDAgMCAxIDExLjI5NyAxMC44ODUgMTEuMzEzIDExLjMxMyAwIDAgMCAwLjAxNTY4LTAuMzAyMjEgMTEuMzEzIDExLjMxMyAwIDAgMC0xMS4zMTMtMTEuMzEzeiIgZmlsbD0iI2ZmZmZmZiIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjkxMSkiIG9wYWNpdHk9Ii4yIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjYuMDY2IiByPSI0LjAxNDMiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQ5NDMpIiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPGNpcmNsZSBjeD0iMjIuMTkyIiBjeT0iMjYuMDY2IiByPSIxLjA5NDgiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9Ii43NSIgc3Ryb2tlLXdpZHRoPSIuNzI5ODciLz4KIDxjaXJjbGUgY3g9IjM5LjIyMiIgY3k9IjM0LjgyNSIgcj0iMTQuMjMyIiBmaWx0ZXI9InVybCgjZmlsdGVyODkxKSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSIzOS4yMjIiIGN5PSIzNC4wOTUiIHI9IjE0LjIzMiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDkyOSkiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSI0MS4xNjgiIGN5PSIzMS45MDUiIHI9IjYuMjAzOSIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudDk1MSkiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+CiA8Y2lyY2xlIGN4PSI0MS4xNjgiIGN5PSIzMS45MDUiIHI9IjEuODI0NyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iLjc1IiBzdHJva2Utd2lkdGg9Ii43Mjk4NyIvPgogPHBhdGggZD0ibTM5LjIyMyAxOS44NjJhMTQuMjMyIDE0LjIzMiAwIDAgMC0xNC4yMzIgMTQuMjMyIDE0LjIzMiAxNC4yMzIgMCAwIDAgMC4wMTU2OCAwLjQyNzY2IDE0LjIzMiAxNC4yMzIgMCAwIDEgMTQuMjE3LTEzLjkzIDE0LjIzMiAxNC4yMzIgMCAwIDEgMTQuMjE3IDEzLjgwNSAxNC4yMzIgMTQuMjMyIDAgMCAwIDAuMDE1NjgtMC4zMDIyMSAxNC4yMzIgMTQuMjMyIDAgMCAwLTE0LjIzMi0xNC4yMzJ6IiBmaWxsPSIjZmZmZmZmIiBmaWx0ZXI9InVybCgjZmlsdGVyOTA3KSIgb3BhY2l0eT0iLjIiIHN0cm9rZS13aWR0aD0iLjcyOTg3Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xeyes,eyes\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"xeyes.XEyes\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nLABEL oc.name=\"xeyes\"\nLABEL oc.displayname=\"xeyes\"\nLABEL oc.path=\"/usr/bin/xeyes\"\nLABEL oc.type=app\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xeyes\"\nENV APPBIN \"/usr/bin/xeyes\"\nENV APP \"/usr/bin/xeyes\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xeyes/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xeyes/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application xeyes

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xeyes.d\n
"},{"location":"applications/xeyes/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f xeyes.d -t xeyes .\n
"},{"location":"applications/xeyes/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect xeyes > xeyes.json\ndocker image save xeyes -o xeyes.tar\nctr -n k8s.io images import xeyes.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xeyes.json\n\n
"},{"location":"applications/xman/","title":"xman","text":""},{"location":"applications/xman/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.18.04

"},{"location":"applications/xman/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/xman/#ubuntu-packages","title":"Ubuntu packages","text":"
x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev\n
"},{"location":"applications/xman/#displayname","title":"Displayname","text":"
Xman\n
"},{"location":"applications/xman/#path","title":"Path","text":"
/usr/bin/xman\n
"},{"location":"applications/xman/#mimetype","title":"Mimetype","text":"
application/x-troff;application/x-troff-man;\n
"},{"location":"applications/xman/#file-extensions","title":"File extensions","text":"

\"man;roff\"

"},{"location":"applications/xman/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/xman/#wm_class","title":"WM_CLASS","text":"
topBox.Xman\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/xman/#json-dump","title":"JSON dump","text":"

json source file xman.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"containerengine\": \"ephemeral_container\",\n    \"debpackage\": \"x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev\",\n    \"icon\": \"circle_xorg.svg\",\n    \"keyword\": \"man,xman,help\",\n    \"launch\": \"topBox.Xman\",\n    \"name\": \"xman\",\n    \"displayname\": \"Xman\",\n    \"path\": \"/usr/bin/xman\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.18.04\",\n    \"mimetype\": \"application/x-troff;application/x-troff-man;\",\n    \"fileextensions\": \"man;roff\",\n    \"args\": \"\"\n}\n
"},{"location":"applications/xman/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output xman.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xman.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xman.d.3.0.json\n\n
"},{"location":"applications/xman/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.18.04:$TAG\nUSER root\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps man-db manpages manpages-posix manpages-dev manpages-posix-dev && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_xorg.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8ZGVmcz4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxMC45NzMiIHgyPSIzNi45MzciIHkxPSIyNCIgeTI9IjI0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuNTAyIDAgMCAxLjUwMzcgLTMuOTgyNyAtMy4zNDIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiMyYTJjMmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjNDI0NjQ5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjMxOS4yMSIgeDI9IjY1Ny42NSIgeTE9IjIzNS4xNSIgeTI9IjI2OS40OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMTMyMzUgMCAwIC4xMzA3NSAtMzIuMzc5IDEuMDg3MykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2U1NGMxOCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZWMzNTAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGZpbHRlciBpZD0iZCIgeD0iLS4wMzYiIHk9Ii0uMDM2IiB3aWR0aD0iMS4wNzIiIGhlaWdodD0iMS4wNzIiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuODg5NzI0NDkiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImUiIHgxPSI0MDguMjUiIHgyPSI0MDcuOTQiIHkxPSI1NDcuNiIgeTI9IjQ5OC44OSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjMyNzYsMCwwLDEuMzI3NiwtNTEwLjY0LC02NjMuNTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNmZmYiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZTZlNmU2IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgeD0iLS4wNDk4OTciIHk9Ii0uMDc1MjMyIiB3aWR0aD0iMS4wOTk4IiBoZWlnaHQ9IjEuMTUwNSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MzU1MzYwOCIvPgogIDwvZmlsdGVyPgogIDxmaWx0ZXIgaWQ9ImMiIHg9Ii0uMDU1MzE5IiB5PSItLjA2NTU2MyIgd2lkdGg9IjEuMTEwNiIgaGVpZ2h0PSIxLjEzMTEiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEuMTA2MjkxMiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMTE1LDAsMCwxLjAxMTUsLTM4OS4zMiwtNDg5LjkyKSIgeD0iMzg2Ljg1IiB5PSI0ODYuMzEiIHdpZHRoPSI1OS4zMTUiIGhlaWdodD0iNTkuMzE1IiByeT0iMjkuNjU3IiBmaWx0ZXI9InVybCgjZCkiIG9wYWNpdHk9Ii4yNSIvPgogPHJlY3QgeD0iMS45ODI2IiB5PSIxLjk3ODQiIHdpZHRoPSI1OS45OTciIGhlaWdodD0iNTkuOTk3IiByeT0iMjkuOTk4IiBmaWxsPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjEuMDExNSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5LDAsMCwxLjQ5OTksLTU4MC44MSwtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS40OTk5IDAgMCAxLjQ5OTkgLTU4MC44MSAtNzUzLjY0KSIgZm9udC1zaXplPSIxMi42NjZweCIgc3Ryb2tlLXdpZHRoPSIuNjY2NzIiPgogIDx0ZXh0IHg9IjczMC44OCIgeT0iMTMyLjE5IiBmb250LWZhbWlseT0iJ0Ryb2lkIFNhbnMnIiBzdHJva2Utd2lkdGg9Ii42NjY3MiIvPgogPC9nPgogPHJlY3QgeD0iNjQuOTY1IiB5PSIyOS43OTMiIHdpZHRoPSIuMDY3NDk1IiBoZWlnaHQ9IjAiIGZpbGw9IiMwMDBjZmYiIG9wYWNpdHk9Ii40MDc0MSIvPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIGZpbHRlcj0idXJsKCNjKSIgb3BhY2l0eT0iLjE1IiBzdHJva2Utd2lkdGg9IjEuMjU2MyI+CiAgPHBhdGggZD0ibTEyLjkzNCA1Mi45ODIgMTQuNzI0LTE5LjI3NC0xNS4xNTktMjEuMTkyIDkuNzQzMSAwLjAwODEgMTIuMDc5IDE2LjY2My0xOC4wNiAyMy43OTRoLTMuMzI3em0yOC44MTkgMC4wMTM2OC0xMS45OTUtMTYuNjkyIDE4LjIxMS0yMy44MDVoMy4yNDQ3bC0xNC43ODQgMTkuMzY0IDE1LjA2OCAyMS4xMzJ6Ii8+CiAgPHBhdGggZD0ibTMxLjk5NiAxOS44OTJjLTEuMTcxNCAwLTIuNDIyOSAwLjA4OTYtMy41NDk2IDAuMTk2NDYgMi4wMDcyIDIuNTg2MiAzLjY3MjYgNC43NzYyIDUuNTg5NCA3LjI2MzQtMS4wNzU4LTIuMjg3Mi0zLjI4NjktNC40ODA1LTIuNTIyNS01LjYwODQgMC43NTY2NS0xLjExNjYgMi4xNTA4LTAuOTI4NjIgMi4yNTctMC45Mjg2MiAyLjIzNTEgMCA0LjM4NjcgMC4yNDkzOSA2LjM5ODEgMC43MTA5NWwwLjQ3MTQ4LTAuNjQxNDljLTIuNjgyOC0wLjY4MjI4LTUuNTk2Ny0wLjk5MjIxLTguNjQzOS0wLjk5MjIxem0xMi4xMDYgMi4wODcyLTAuNDM0MjYgMC42MTI4OWM2LjE5NzIgMi4zOTc1IDEwLjM4OSA2Ljk3NjggMTAuMzg5IDEyLjIyNSAwIDcuNzI4MS05LjA4NzYgMTMuOTk4LTIwLjI4NiAxMy45OTgtMTEuMTk5IDAtMjAuMjktNi4yNzAzLTIwLjI5LTEzLjk5OCAxZS02IC00LjIwODUgMi42OTYxLTcuOTg2MiA2Ljk2MDYtMTAuNTU0bC0xLjMxMTEtMS45NzM1Yy02LjY4OTYgMi44MDIyLTExLjEzIDcuNzIwNy0xMS4xMyAxMy4zMiAwIDguNzEyMyAxMC43NSAxNS43OCAyMy45OTYgMTUuNzggMTMuMjQ3IDAgMjQtNy4wNjc1IDI0LTE1Ljc4IDAtNS44MDk2LTQuNzgwNy0xMC44OS0xMS44OTUtMTMuNjMxeiIvPgogPC9nPgogPGcgdHJhbnNmb3JtPSJtYXRyaXgoLjc5NzAyIDAgMCAuNzk0OTIgNS44OTk3IDUuNjYwMykiIHN0cm9rZS13aWR0aD0iMS4yNTYzIj4KICA8cGF0aCBkPSJtMTIuOTM0IDUyLjk4MiAxNC43MjQtMTkuMjc0LTE1LjE1OS0yMS4xOTIgOS43NDMxIDAuMDA4MSAxMi4wNzkgMTYuNjYzLTE4LjA2IDIzLjc5NGgtMy4zMjd6bTI4LjgxOSAwLjAxMzY4LTExLjk5NS0xNi42OTIgMTguMjExLTIzLjgwNWgzLjI0NDdsLTE0Ljc4NCAxOS4zNjQgMTUuMDY4IDIxLjEzMnoiIGZpbGw9InVybCgjYikiLz4KICA8cGF0aCBkPSJtMzEuOTk2IDE5Ljg5MmMtMS4xNzE0IDAtMi40MjI5IDAuMDg5Ni0zLjU0OTYgMC4xOTY0NiAyLjAwNzIgMi41ODYyIDMuNjcyNiA0Ljc3NjIgNS41ODk0IDcuMjYzNC0xLjA3NTgtMi4yODcyLTMuMjg2OS00LjQ4MDUtMi41MjI1LTUuNjA4NCAwLjc1NjY1LTEuMTE2NiAyLjE1MDgtMC45Mjg2MiAyLjI1Ny0wLjkyODYyIDIuMjM1MSAwIDQuMzg2NyAwLjI0OTM5IDYuMzk4MSAwLjcxMDk1bDAuNDcxNDgtMC42NDE0OWMtMi42ODI4LTAuNjgyMjgtNS41OTY3LTAuOTkyMjEtOC42NDM5LTAuOTkyMjF6bTEyLjEwNiAyLjA4NzItMC40MzQyNiAwLjYxMjg5YzYuMTk3MiAyLjM5NzUgMTAuMzg5IDYuOTc2OCAxMC4zODkgMTIuMjI1IDAgNy43MjgxLTkuMDg3NiAxMy45OTgtMjAuMjg2IDEzLjk5OC0xMS4xOTkgMC0yMC4yOS02LjI3MDMtMjAuMjktMTMuOTk4IDFlLTYgLTQuMjA4NSAyLjY5NjEtNy45ODYyIDYuOTYwNi0xMC41NTRsLTEuMzExMS0xLjk3MzVjLTYuNjg5NiAyLjgwMjItMTEuMTMgNy43MjA3LTExLjEzIDEzLjMyIDAgOC43MTIzIDEwLjc1IDE1Ljc4IDIzLjk5NiAxNS43OCAxMy4yNDcgMCAyNC03LjA2NzUgMjQtMTUuNzggMC01LjgwOTYtNC43ODA3LTEwLjg5LTExLjg5NS0xMy42MzF6IiBmaWxsPSJ1cmwoI2EpIi8+CiA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xman,man,xman,help\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.launch=\"topBox.Xman\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.18.04\"\nLABEL oc.name=\"xman\"\nLABEL oc.displayname=\"Xman\"\nLABEL oc.path=\"/usr/bin/xman\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"application/x-troff;application/x-troff-man;\"\nLABEL oc.fileextensions=\"man;roff\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xman\"\nENV APPBIN \"/usr/bin/xman\"\nENV APP \"/usr/bin/xman\"\nLABEL oc.containerengine=\"ephemeral_container\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xman/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xman/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application xman

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xman.d\n
"},{"location":"applications/xman/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f xman.d -t xman .\n
"},{"location":"applications/xman/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect xman > xman.json\ndocker image save xman -o xman.tar\nctr -n k8s.io images import xman.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xman.json\n\n
"},{"location":"applications/xpad/","title":"xpad","text":""},{"location":"applications/xpad/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/xpad/#distribution","title":"Distribution","text":"

ubuntu

NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/xpad/#ubuntu-packages","title":"Ubuntu packages","text":"
xpad\n
"},{"location":"applications/xpad/#displayname","title":"Displayname","text":"
Xpad\n
"},{"location":"applications/xpad/#path","title":"Path","text":"
/usr/bin/xpad\n
"},{"location":"applications/xpad/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/xpad/#wm_class","title":"WM_CLASS","text":"
xpad.xpad\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/xpad/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/xpad.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/xpad/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

COPY composer/init.d/init.xpad /composer/init.d/init.xpad\n
"},{"location":"applications/xpad/#json-dump","title":"JSON dump","text":"

json source file xpad.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"xpad\",\n    \"icon\": \"xpad.svg\",\n    \"keyword\": \"xpad, note, sticky, postit\",\n    \"launch\": \"xpad.xpad\",\n    \"name\": \"xpad\",\n    \"displayname\": \"Xpad\",\n    \"path\": \"/usr/bin/xpad\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.gtk\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"fileextensions\": \"\",\n    \"args\": \"\",\n    \"desktopfile\": \"/usr/share/applications/xpad.desktop\",\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.xpad /composer/init.d/init.xpad\"\n    ]\n}\n
"},{"location":"applications/xpad/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output xpad.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xpad.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xpad.d.3.0.json\n\n
"},{"location":"applications/xpad/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.gtk:$TAG\nUSER root\nCOPY composer/init.d/init.xpad /composer/init.d/init.xpad\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends xpad && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"xpad.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIFNvZGlwb2RpICgiaHR0cDovL3d3dy5zb2RpcG9kaS5jb20vIikgLS0+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIGlkPSJzdmcxMTQiCiAgIHNvZGlwb2RpOnZlcnNpb249IjAuMzIiCiAgIHdpZHRoPSI3NTAiCiAgIGhlaWdodD0iNzUwIgogICBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS9taWtlL0NvZGUveHBhZC9pbWFnZXMvaGljb2xvci9zY2FsYWJsZS9hcHBzLyIKICAgc29kaXBvZGk6ZG9jbmFtZT0ieHBhZC5zdmciCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDYiCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTIzIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzMTE2Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA0NjguNzUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iOTM3LjUgOiA0NjguNzUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjQ2OC43NSA6IDMxMi41IDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1IiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MjAiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZWVkZDg4O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDYyMSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY2NTUwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MjIiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ2MTciPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZlZTk5O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDYxOCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2VlZGQ4ODtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A2MTkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjciPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojY2NjZDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEyOCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzY1NjcwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMjkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMTkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZmZjMyO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDEyMCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2Q3ZDUwYTtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxMjEiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjciCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxMjIiCiAgICAgICB4MT0iNi44NjM1ODg4ZS0wOSIKICAgICAgIHkxPSI4LjAwNzgzNzllLTA5IgogICAgICAgeDI9IjEiCiAgICAgICB5Mj0iOC4wMDc4Mzc5ZS0wOSIgLz4KICAgIDxyYWRpYWxHcmFkaWVudAogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjE3IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTI0IgogICAgICAgY3g9IjAuMTEyMTg4MDkiCiAgICAgICBjeT0iLTAuMjA4MTMwOTMiCiAgICAgICBmeD0iMC4xMTIxODgwOSIKICAgICAgIGZ5PSItMC4yMDgxMzA5MyIKICAgICAgIHI9IjEuNTc0MDgiCiAgICAgICBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ2MjAiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQxMjYiCiAgICAgICBjeD0iMS4yMjQ0OCIKICAgICAgIGN5PSIwLjExNjk3NjU5IgogICAgICAgZng9IjEuMjI0NDgiCiAgICAgICBmeT0iMC4xMTY5NzY1OSIKICAgICAgIHI9IjEuNDk2ODciCiAgICAgICBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQxMjciCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQ2MTYiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDYyMCIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI0MDIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIgogICAgICAgY3g9IjU4Mi44MDUyNCIKICAgICAgIGN5PSIxOTMuMDU0NCIKICAgICAgIGZ4PSI1ODIuODA1MjQiCiAgICAgICBmeT0iMTkzLjA1NDQiCiAgICAgICByPSI1ODcuNjQwMzgiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ic2NhbGUoMC45MzcwMTk4LDEuMDY3MjEzMykiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDYxNyIKICAgICAgIGlkPSJyYWRpYWxHcmFkaWVudDI0MDQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHNwcmVhZE1ldGhvZD0icGFkIgogICAgICAgY3g9IjE5Ni40Njk1NiIKICAgICAgIGN5PSItMzYuODYzNTg2IgogICAgICAgZng9IjE5Ni40Njk1NiIKICAgICAgIGZ5PSItMzYuODYzNTg2IgogICAgICAgcj0iMTEzMi45ODA1IgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InNjYWxlKDEuMDAyMjkzNiwwLjk5NzcxMTYpIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuNDkyOCIKICAgICBpbmtzY2FwZTpjeD0iNDY4Ljc1IgogICAgIGlua3NjYXBlOmN5PSI0MTkuODYyODEiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSI2NDAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNjgwIgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNiIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmcxMTQiIC8+CiAgPGcKICAgICBpZD0iZzIzOTgiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NjU0MTY2LDAuMjYwNzExNywtMC4yNjA3MTE3LDAuOTY1NDE2Niw1NS41NzEwNywtMjUxLjkyMDE1KSI+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42NjMwMDIsLTAuMjE2MzUzLDAuMTg3NTksMC41NzQ4NTQsODEuNTUyNiw2MTkuMjY3KSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjYyIKICAgICAgIGlkPSJwYXRoMTI1IgogICAgICAgZD0iTSA5NS42NjkzLDE1Ny4wMjEgTCA0NjMuNTI0LDU3NS45ODcgTCA0NjEuODUyLDE1OC45NSBMIDk1LjY2OTMsMTU3LjAyMSB6IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0MDIpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDoxcHQiIC8+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45NTgzNjIsLTAuMjg1NTU2LDAuMjg1NTU2LDAuOTU4MzYyLC0xMjAuNDkyLDIwNi4xNzQpIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjIgogICAgICAgaWQ9InBhdGgxMTgiCiAgICAgICBkPSJNIDEyNS4zNiwxMjIuMDYgTCAxMjUuMzYsNDcxLjc0OCBDIDEyNS4zNiw1ODguMzExIDI0OC44OTQsNjEwLjE3NSAzNzcuNTUyLDU2OC4zODkgQyAzMjEuNDE1LDY1MS4yNjYgMzU5LjU4NSw4MjEuNDM2IDQ3Ni42OTcsODIxLjQzNiBMIDgyOC4wMzQsODIxLjQzNiBMIDgyOC4wMzQsMTIyLjA2IEwgMTI1LjM2LDEyMi4wNiB6IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDI0MDQpO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxOC43NTtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICA8L2c+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xpad,xpad, note, sticky, postit\"\nLABEL oc.cat=\"utilities\"\nLABEL oc.desktopfile=\"xpad.desktop\"\nLABEL oc.launch=\"xpad.xpad\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.gtk\"\nLABEL oc.name=\"xpad\"\nLABEL oc.displayname=\"Xpad\"\nLABEL oc.path=\"/usr/bin/xpad\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xpad\"\nENV APPBIN \"/usr/bin/xpad\"\nENV APP \"/usr/bin/xpad\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xpad/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xpad/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application xpad

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xpad.d\n
"},{"location":"applications/xpad/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f xpad.d -t xpad .\n
"},{"location":"applications/xpad/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect xpad > xpad.json\ndocker image save xpad -o xpad.tar\nctr -n k8s.io images import xpad.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xpad.json\n\n
"},{"location":"applications/xterm/","title":"xterm","text":""},{"location":"applications/xterm/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.alpine

"},{"location":"applications/xterm/#distribution","title":"Distribution","text":"

alpine

NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.1\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/xterm/#alpine-packages","title":"Alpine packages","text":"
xterm sudo\n
"},{"location":"applications/xterm/#arguments","title":"Arguments","text":"

\"-xrm 'XTerm*selectToClipboard:true'\"

"},{"location":"applications/xterm/#displayname","title":"Displayname","text":"
Xterm (sudo)\n
"},{"location":"applications/xterm/#path","title":"Path","text":"
/usr/bin/xterm\n
"},{"location":"applications/xterm/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/xterm/#wm_class","title":"WM_CLASS","text":"
xterm.XTerm\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/xterm/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/xterm.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/xterm/#post-run-command","title":"POST run command","text":"

POST run command are run after the package install comman

RUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\n
"},{"location":"applications/xterm/#json-dump","title":"JSON dump","text":"

json source file xterm.d.3.0.json

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"icon\": \"circle_xterm.svg\",\n    \"apkpackage\": \"xterm sudo\",\n    \"keyword\": \"xterm,shell,cmd\",\n    \"launch\": \"xterm.XTerm\",\n    \"name\": \"xterm\",\n    \"displayname\": \"Xterm (sudo)\",\n    \"path\": \"/usr/bin/xterm\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": true\n        }\n    },\n    \"template\": \"abcdesktopio/oc.template.alpine\",\n    \"desktopfile\": \"/usr/share/applications/xterm.desktop\",\n    \"args\": \"-xrm 'XTerm*selectToClipboard:true'\",\n    \"postruncommands\": [\n        \"RUN echo \\\"ALL ALL=(ALL:ALL) ALL\\\">/etc/sudoers.d/all\"\n    ],\n    \"quick\": true\n}\n
"},{"location":"applications/xterm/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output xterm.d.3.0.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xterm.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xterm.d.3.0.json\n\n
"},{"location":"applications/xterm/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.alpine:$TAG\nUSER root\nRUN apk add --no-cache --update xterm sudo\nLABEL oc.icon=\"circle_xterm.svg\"\nLABEL oc.icondata=\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iSXRlcm0iIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTAyNCAxMDI0IiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiA8bWV0YWRhdGE+CiAgPHJkZjpSREY+CiAgIDxjYzpXb3JrIHJkZjphYm91dD0iIj4KICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgPGRjOnR5cGUgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIvPgogICAgPGRjOnRpdGxlLz4KICAgPC9jYzpXb3JrPgogIDwvcmRmOlJERj4KIDwvbWV0YWRhdGE+CiA8ZGVmcz4KICA8ZmlsdGVyIGlkPSJlIiB4PSItLjA0MjY1MSIgeT0iLS4wMzExNDQiIHdpZHRoPSIxLjA4NTMiIGhlaWdodD0iMS4wNjIzIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0LjkzMTA4OTEiLz4KICA8L2ZpbHRlcj4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSItNTA2LjQ1IiB4Mj0iLTUwNi40NSIgeTE9Ii0xOS4xMDEiIHkyPSIxMDEzLjYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjA1ODgyNCAwIDAgLjA1ODgyNCA2MS43OTEgMy4xMjM2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMyIgb2Zmc2V0PSIuNTA3NjkiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzRhNGE0YSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJkIiB4PSItLjAzNiIgeT0iLS4wMzYiIHdpZHRoPSIxLjA3MiIgaGVpZ2h0PSIxLjA3MiIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMC45MDAwMDAwNiIvPgogIDwvZmlsdGVyPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4NjYiIHgxPSIyNC4zOTYiIHgyPSIyNC4zOTYiIHkxPSIzMy43NzUiIHkyPSIyMi45NDkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3Agc3RvcC1jb2xvcj0iIzU4ZmYwMCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiNhMGZmMDAiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDg2OCIgeDE9IjQyLjQzNCIgeDI9IjM4LjU5OSIgeTE9Ii0zMy4wMzMiIHkyPSItMzMuMDMzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIHN0b3AtY29sb3I9IiM1OGZmMDAiIG9mZnNldD0iMCIvPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjY2YwIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogPC9kZWZzPgogPG1hc2s+CiAgPGcgaWQ9ImciPgogICA8cGF0aCBkPSJtOTY5Ljc1IDM5Mi4wNWMtMS4xLTQuMzUtMi4zNS05LTMuNjUtMTMuNi0xLTMuNC0yLTYuODUtMy4xNS0xMC41LTEuNi01LjE1LTMuNC0xMC41LTUuMy0xNS44NS02LjQ1LTE4LjI1LTE0LjE1LTM2LjA1LTIzLjE1LTUzLjY1LTMuOC03LjQtNy45NS0xNC45NS0xMi4zLTIyLjQtMjAuMy0zNC41LTQ1LjgtNjcuMi03Ni4zNS05Ny43NS03Mi42LTcyLjYtMTU3LjE1LTExNi42NS0yNTMuNjUtMTMyLjA1LTE2LjI1LTIuNi0zMi44LTQuNC01MC4wNS01LjM1LTkuNy0wLjU1LTE5Ljg1LTAuODUtMzAuMS0wLjg1LTkuMzUgMC0xOC42IDAuMjUtMjcuOSAwLjc1LTExOC4zNSA2LjEtMjIwLjMgNTEuOTUtMzA1Ljg1IDEzNy41cS0xMzguMjUgMTM4LjI1LTEzOC4yNSAzMzMuNzVjMCAxMzAuMzUgNDYuMSAyNDEuNjUgMTM4LjI1IDMzMy44IDU2LjcgNTYuNjUgMTIwLjU1IDk1LjkgMTkxLjEgMTE3LjU1IDM2Ljc1IDExLjI1IDc0LjggMTcuODUgMTE0Ljc1IDE5Ljk1aDAuNGM4LjUgMC40NSAxNi42IDAuNyAyNC41IDAuN2gzYzEwLjMgMCAyMC41LTAuMyAzMC4xLTAuOCAyLjUtMC4xNSA0Ljc1LTAuMyA2Ljk1LTAuNDUgMjAuMi0xLjQ1IDM5LjktNC4wNSA1OC43LTcuNyA3Ljk1LTEuNTUgMTUuOC0zLjMgMjMuNC01LjE1IDgwLjgtMjAuMyAxNTIuMTUtNjEuNiAyMTQuNjUtMTI0LjEgNDguNi00OC42IDg0LjQtMTAyLjUgMTA3LjM1LTE2MS44IDE4LjQ1LTQ3LjY1IDI4LjY1LTk4LjggMzAuNTUtMTUzLjUgMC4yLTYuMDUgMC4zLTEyLjI1IDAuMy0xOC41di0zYy0wLjItNDAuNjUtNC45NS03OS41LTE0LjMtMTE3eiIgZmlsbD0iI2ZmZiIvPgogIDwvZz4KIDwvbWFzaz4KIDxjaXJjbGUgY3g9IjMyIiBjeT0iMzIiIHI9IjMwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNkKSIgb3BhY2l0eT0iLjI1IiBzdHlsZT0icGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIvPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9InVybCgjYikiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3R5bGU9InBhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiLz4KIDxwYXRoIHRyYW5zZm9ybT0ibWF0cml4KC4wNjM4MyAwIDAgLjA2MzgzIC0uMDY2NDkyIC0xLjIyNjEpIiBkPSJtMzUwLjg2IDM4OC43NGMtNC45IDAtOS4wOTk2IDEuNzUtMTIuNiA1LjI1LTMuNDUgMy40NS01LjIwMTIgNy42NTA4LTUuMjAxMiAxMi41NTFzMS43NTEyIDkuMTAwOCA1LjIwMTIgMTIuNTUxbDU0LjQ0OSA1NC40NDktNTQuNCA1NC40Yy0zLjUgMy41LTUuMjQ4OCA3LjY5OTYtNS4yOTg4IDEyLjYgMC4wNSA0LjkgMS44IDkuMTAwOCA1LjI1IDEyLjU1MSAzLjUgMy40NSA3LjY5ODggNS4yIDEyLjU0OSA1LjI1IDQuOTUgMCA5LjE1MDQtMS43NSAxMi42NS01LjI1bDYwLjUtNjAuNTUxYzEyLjctMTIuNjUgMTIuNy0yNS4zNTEgMC0zOC4wNTFsLTYwLjU1MS02MC41NDljLTMuNDY2Ny0zLjQ2NjctNy42NDg4LTUuMjAxMi0xMi41NDktNS4yMDEyeiIgZmlsdGVyPSJ1cmwoI2UpIiBzdHJva2Utd2lkdGg9IjE1LjY2NyIvPgogPHJlY3QgdHJhbnNmb3JtPSJtYXRyaXgoMCAuMDYzODMgLS4wNjM4MyAwIDY1LjM0NyAtMS4wNzEpIiB4PSI2MzcuNzgiIHk9IjMxNC43OCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjM4MCIgcng9IjIwIiBmaWx0ZXI9InVybCgjZSkiIG9wYWNpdHk9Ii41IiBzdHJva2Utd2lkdGg9IjE1LjY2NyIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBtYXJrZXJzIGZpbGwiLz4KIDxwYXRoIGQ9Im0yMi4zMjkgMjIuOTQ5Yy0wLjMxMjc3IDAtMC41ODA4MiAwLjExMTctMC44MDQyNiAwLjMzNTEtMC4yMjAyMSAwLjIyMDIxLTAuMzMxOTkgMC40ODgzNS0wLjMzMTk5IDAuODAxMTNzMC4xMTE3OCAwLjU4MDkgMC4zMzE5OSAwLjgwMTEzbDMuNDc1NSAzLjQ3NTUtMy40NzIzIDMuNDcyM2MtMC4yMjM0IDAuMjIzNC0wLjMzNTAzIDAuNDkxNDYtMC4zMzgyMiAwLjgwNDI1IDAuMDAzMiAwLjMxMjc3IDAuMTE0ODkgMC41ODA5IDAuMzM1MTEgMC44MDExMyAwLjIyMzQgMC4yMjAyMSAwLjQ5MTQxIDAuMzMxOTEgMC44MDEgMC4zMzUxMSAwLjMxNTk2IDAgMC41ODQwNy0wLjExMTcxIDAuODA3NDUtMC4zMzUxMWwzLjg2MTctMy44NjVjMC44MTA2NC0wLjgwNzQ1IDAuODEwNjQtMS42MTgyIDAtMi40Mjg4bC0zLjg2NS0zLjg2NDhjLTAuMjIxMjgtMC4yMjEyNy0wLjQ4ODIyLTAuMzMxOTktMC44MDEtMC4zMzE5OXoiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ4NjYpIi8+CiA8cmVjdCB0cmFuc2Zvcm09InJvdGF0ZSg5MCkiIHg9IjM5IiB5PSItNDUuMjU1IiB3aWR0aD0iMi41NTMyIiBoZWlnaHQ9IjI0LjI1NSIgcng9IjEuMjc2NiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDg2OCkiIHN0eWxlPSJwYWludC1vcmRlcjpzdHJva2UgbWFya2VycyBmaWxsIi8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"xterm,xterm,shell,cmd\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"xterm.desktop\"\nLABEL oc.launch=\"xterm.XTerm\"\nLABEL oc.template=\"abcdesktopio/oc.template.alpine\"\nENV ARGS=\"-xrm 'XTerm*selectToClipboard:true'\"\nLABEL oc.name=\"xterm\"\nLABEL oc.displayname=\"Xterm (sudo)\"\nLABEL oc.path=\"/usr/bin/xterm\"\nLABEL oc.type=app\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":true}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nRUN for d in /usr/share/icons /usr/share/pixmaps ; do echo \"testing link in $d\"; if [ -d $d ] && [ -x /composer/safelinks.sh ] ; then echo \"fixing link in $d\"; cd $d ; /composer/safelinks.sh ; fi; done\nENV APPNAME \"xterm\"\nENV APPBIN \"/usr/bin/xterm\"\nLABEL oc.args=\"-xrm 'XTerm*selectToClipboard:true'\"\nENV APP \"/usr/bin/xterm\"\nRUN echo \"ALL ALL=(ALL:ALL) ALL\">/etc/sudoers.d/all\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount\nRUN for f in passwd shadow group gshadow ; do if [ -f /etc/$f ] ; then  cp /etc/$f /var/secrets/abcdesktop/localaccount; rm -f /etc/$f; ln -s /var/secrets/abcdesktop/localaccount/$f /etc/$f; fi; done\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/xterm/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/xterm/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application xterm

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/xterm.d\n
"},{"location":"applications/xterm/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f xterm.d -t xterm .\n
"},{"location":"applications/xterm/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect xterm > xterm.json\ndocker image save xterm -o xterm.tar\nctr -n k8s.io images import xterm.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @xterm.json\n\n
"},{"location":"applications/youtube/","title":"youtube","text":""},{"location":"applications/youtube/#inherite-from","title":"inherite from","text":"

abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/youtube/#distribution","title":"Distribution","text":"

ubuntu

PRETTY_NAME=\"Ubuntu 22.04.1 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.1 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/youtube/#ubuntu-packages","title":"Ubuntu packages","text":"
firefox\n
"},{"location":"applications/youtube/#arguments","title":"Arguments","text":"

\"-P youtube --class=youtube https://www.youtube.com/\"

"},{"location":"applications/youtube/#displayname","title":"Displayname","text":"
Youtube\n
"},{"location":"applications/youtube/#path","title":"Path","text":"
/usr/bin/firefox\n
"},{"location":"applications/youtube/#mimetype","title":"Mimetype","text":"
text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\n
"},{"location":"applications/youtube/#file-extensions","title":"File extensions","text":"

\"html;xml;gif\"

"},{"location":"applications/youtube/#legacy-file-extensions","title":"Legacy file extensions","text":"

\"html;xml\"

"},{"location":"applications/youtube/#acl","title":"ACL","text":"
{\n    \"permit\": [\n        \"all\"\n    ]\n}\n
"},{"location":"applications/youtube/#wm_class","title":"WM_CLASS","text":"
Navigator.youtube\n

The WM_CLASS property (of type STRING without control characters) contains two consecutive null-terminated strings. These specify the Instance and Class names to be used by both the client and the window manager for looking up resources for the application or as identifying information. to get the WM_CLASS property of an application, use the command line wmctrl -lx

"},{"location":"applications/youtube/#desktopfile","title":"Desktopfile","text":"
/usr/share/applications/firefox.desktop\n

A .desktop file is a simple text file that holds information about a program. It is usually placed in \u201c/usr/share/applications/\u201d.

"},{"location":"applications/youtube/#pre-run-command","title":"PRE run command","text":"

PRE run command are run before the package install command

COPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\n
"},{"location":"applications/youtube/#json-dump","title":"JSON dump","text":"

json source file

{\n    \"acl\": {\n        \"permit\": [\n            \"all\"\n        ]\n    },\n    \"cat\": \"development\",\n    \"debpackage\": \"firefox\",\n    \"icon\": \"circle_youtube.svg\",\n    \"keyword\": \"youtube,tube\",\n    \"launch\": \"Navigator.youtube\",\n    \"args\": \"-P youtube --class=youtube https://www.youtube.com/\",\n    \"name\": \"youtube\",\n    \"displayname\": \"Youtube\",\n    \"rules\": {\n        \"homedir\": {\n            \"default\": false\n        }\n    },\n    \"host_config\": {\n        \"mem_limit\": \"2G\",\n        \"shm_size\": \"2G\"\n    },\n    \"installrecommends\": true,\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.ubuntu.minimal.22.04\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"html;xml\",\n    \"fileextensions\": \"html;xml;gif\",\n    \"desktopfile\": \"/usr/share/applications/firefox.desktop\",\n    \"preventhomemount\": false,\n    \"quick\": true,\n    \"preruncommands\": [\n        \"COPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\"\n    ]\n}\n
"},{"location":"applications/youtube/#install-the-builded-image","title":"Install the builded image","text":"

Replace the ABCHOST var set to localhost by default to your own server ip address

ABCHOST=localhost\ncurl --output youtube.json https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/youtube.d.3.0.json\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @youtube.json\n\n
"},{"location":"applications/youtube/#generated-dockerfile-source-code","title":"Generated DockerFile source code","text":"
# Dynamic DockerFile application file for abcdesktopio generated by abcdesktopio/oc.apps/make.js\n# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\nARG TAG=dev\nFROM abcdesktopio/oc.template.ubuntu.minimal.22.04:$TAG\nUSER root\nCOPY composer/init.d/init.firefox.youtube /composer/init.d/init.firefox\nRUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y firefox && apt-get clean\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\nLABEL oc.icon=\"circle_youtube.svg\"\nLABEL oc.icondata=\"PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ4OTkiIHgxPSItMzkuNjA1IiB4Mj0iLTM5LjYwNSIgeTE9IjU4LjI0NyIgeTI9IjYuOTg3NyIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg3MC41NDMgLjQxOTc1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICA8c3RvcCBzdG9wLWNvbG9yPSIjZDAwYzIzIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3Agc3RvcC1jb2xvcj0iI2ZmNTE1MSIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8ZmlsdGVyIGlkPSJmaWx0ZXI5MzAiIHg9Ii0uMDM4ODgiIHk9Ii0uMDM4ODgiIHdpZHRoPSIxLjA3NzgiIGhlaWdodD0iMS4wNzc4IiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIwLjk3MiIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9IiMwMDAwMDAiIGZpbHRlcj0idXJsKCNmaWx0ZXI5MzApIiBvcGFjaXR5PSIuMTUiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIHN0cm9rZS13aWR0aD0iMi4yODgxIiBzdHlsZT0iaXNvbGF0aW9uOmlzb2xhdGU7cGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIvPgogPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzAiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ4OTkpIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjIuMjg4MSIgc3R5bGU9Imlzb2xhdGlvbjppc29sYXRlO3BhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KIDxpbWFnZSB4PSIxMC41IiB5PSIxOSIgd2lkdGg9IjQzIiBoZWlnaHQ9IjMyIiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplUXVhbGl0eSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDc0FBQUFnQ0FZQUFBQ0xtb0VEQUFBQUNYQklXWE1BQUE3REFBQU93d0hIYjZoa0FBQUEgR1hSRldIUlRiMlowZDJGeVpRQjNkM2N1YVc1cmMyTmhjR1V1YjNKbm0rNDhHZ0FBQWg5SlJFRlVXSVcxbU8yV2hDQUlodCttWnZmKyBiM2VhY24va1c0UllnaTNuY1ByUTdJa1FrUUh0TWpqNmVpWDFBQXpHdWRVMzhnRVdXRExhaW41VEJXQUE4TXJLYTZoejZ6a1BJTzhuIGRiNW1MWjdUTHlEa0JHQVVPcUNFYmdXdEFXdklCR0FSK3MzUSszUFNzZ1I5QS9qSnh6ZHM2N1lDM29GcllFTE9lZnhaQW12WU1RUCsgWnAxUVd2VktyRDR0azBlNndJTE5RTHplWFlXdzh2Zi80TEFzWGFCRklqNXI5Wk9naXdTMkxEdmg4TmxXaTk2Slp3eUxBY0QyRlJ6cyBwZlFwVUkvb1NDUlpDcDg4TlRwRWhxQW5KcUFWT2dmdEJoRnJ5dGlZeEl1aTQxVjU5S0xnZllFT09Tc08zeDl4V0lkamgwRTFiTlFLIGhKMnpjbHlwRVdESnRROGFIWVJDNjM0QmZMQlpsek9hQzR1RTlscDRQOVp5Z3dndzQrSlg2WUl0YmllY1YwUzNXTEE5UW1qZ25KQncgMG5YRjd0ZDlsNURVa3BZdXNTemJNN0FNVzB5S21CaDFyNGlFN2YxeS9ac2xLQ2NZUTFrM0xDVUNUV3VOMkN3SUhObWJoSXl1alB0eCBxalU0WVFsS3NONUZRWXFaZk11R1ZtQUM4UGN6MStoZGJ1WHVZUmR0MmFKRGcwZzRHTWVvRkR5VHVpa1RFbzg4blU1cWxnUWd2WXpHIEZYSG9KeUVMRHUwR1RFZ2k2emd1K251Mk5TdU9UZU1DWTRMcFRxTm90L3pSQTNzSEtpYzE4NHRQNWpodHh5M0xmdkwxQ25zdlpsVnIgUEdKVlhlU2NtWVdlTEZzcmNqREYwd0g5cVNKSHJXN0F2MnNXT1dyMUs3M0d0NFNsTytCYUhhdFdQaXJDNk5VTFd1T214eFd1YWw3NiB2T2dieWRyL1E1cWl4Ujhhbk1NQzBGUlNNZ0FBQUFCSlJVNUVya0pnZ2c9PSAiLz4KIDxwYXRoIGQ9Im0zMi4wMDMgMTkuMTQyYy02LjQ0OTQgMC0xMi40NDUgMC4yMjU1MS0xMy43NzEgMC41MTczMS0wLjg4ODY5IDAuMTk1NDktMS41OTI3IDAuNTY2MDctMi4yMzM3IDEuMTc1Mi0wLjUxMDAxIDAuNDg0Ny0wLjc5MDIzIDAuOTI0NDYtMS4wOTc0IDEuNzIxNC0wLjMzNzI4IDAuODc1MTMtMC41MTU5NCAxLjcwMDEtMC42MzkxIDIuOTQxOS0wLjIzNDg2IDIuMzY4Ny0wLjI3NzExIDMuNTM4MS0wLjI1NjE0IDcuMTA2NyAwLjAxNzggMy4wMzQ1IDAuMDMwNzEgMy4zODc0IDAuMjAyMTUgNS4zMzUxIDAuMTUxOTIgMS43MjU4IDAuMzE3OTMgMi41NDA5IDAuNzI0NDggMy41Njg0IDAuNDQ0NjcgMS4xMjM5IDEuMDYwOSAxLjgyMTggMi4wNTE3IDIuMzIxNiAwLjU5OTg3IDAuMzAyNjQgMS4xMzE4IDAuNDQzNyAyLjIxNDkgMC41ODg4OCAxLjQ3NjkgMC4xOTc5NiAzLjg5MTEgMC4zMDAyIDkuODQxNCAwLjQxNTYgNC43ODg0IDAuMDkyODggMTMuMS0wLjEwNjI2IDE1LjgyMi0wLjM3OTE5IDAuODc4MzctMC4wODgwOCAxLjQyMzMtMC4yMjU0NSAxLjk5NTItMC41MDA5OCAwLjU2NDc3LTAuMjcyMTEgMS4yMzk5LTAuODEyMDggMS41ODIxLTEuMjY1NiAwLjQ5ODY3LTAuNjYxMSAwLjk0MTI1LTEuODI0MyAxLjE2NjUtMy4wNjYyIDAuMDg3Ni0wLjQ4MzA0IDAuMjE5MjUtMS44MzI4IDAuMzI2NDYtMy4zNDg3IDAuMDkxNjEtMS4yOTU4IDAuMDkxNjItNy4yNjQyIDAtOC41NjA3LTAuMTkyOTQtMi43MzAxLTAuMzIzNC0zLjY1MjItMC42NjI5Ni00LjY5NDctMC4zMjk1NC0xLjAxMTctMC42MDYyLTEuNTA5OC0xLjE0MzktMi4wNTc5LTAuNjg2OTQtMC43MDAzNi0xLjM5MTItMS4wODk4LTIuMzUwNS0xLjMwMDgtMS4zMjY1LTAuMjkxNzktNy4zMjItMC41MTczMS0xMy43NzEtMC41MTczMXptLTMuMTkxNyA3LjcxNDRjMC4wNDM1NS0wLjAyOTU0IDguOTc1IDUuMTAzNSA4Ljk3NSA1LjE1OCAwIDAuMDU4MjkgMC4xMDkwNi0wLjAwNTItNC45OTM1IDIuODk3OS0yLjEyODUgMS4yMTEtMy44OTE5IDIuMjExLTMuOTE4NyAyLjIyMjQtMC4wMjY4OCAwLjAxMTM3LTAuMDU4MTMgMC4wMTA1Ny0wLjA2OTA1LTAuMDAxMi0wLjAyODk3LTAuMDMyMjctMC4wMjMxNC0xMC4yNTcgMC4wMDYzLTEwLjI3N3oiIGZpbGw9IiNmZmYiIHN0cm9rZS13aWR0aD0iLjY0Mjg3Ii8+Cjwvc3ZnPgo=\"\nLABEL oc.keyword=\"youtube,youtube,tube\"\nLABEL oc.cat=\"development\"\nLABEL oc.desktopfile=\"firefox.desktop\"\nLABEL oc.launch=\"Navigator.youtube\"\nLABEL oc.template=\"abcdesktopio/oc.template.ubuntu.minimal.22.04\"\nENV ARGS=\"-P youtube --class=youtube https://www.youtube.com/\"\nLABEL oc.name=\"youtube\"\nLABEL oc.displayname=\"Youtube\"\nLABEL oc.path=\"/usr/bin/firefox\"\nLABEL oc.type=app\nLABEL oc.mimetype=\"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\"\nLABEL oc.fileextensions=\"html;xml;gif\"\nLABEL oc.legacyfileextensions=\"html;xml\"\nLABEL oc.rules=\"{\\\"homedir\\\":{\\\"default\\\":false}}\"\nLABEL oc.acl=\"{\\\"permit\\\":[\\\"all\\\"]}\"\nLABEL oc.host_config=\"{\\\"mem_limit\\\":\\\"2G\\\",\\\"shm_size\\\":\\\"2G\\\"}\"\nRUN  if [ -d /usr/share/icons ]   && [ -x /composer/safelinks.sh ] && [ -d /usr/share/icons   ];  then cd /usr/share/icons;    /composer/safelinks.sh; fi \nRUN  if [ -d /usr/share/pixmaps ] && [ -x /composer/safelinks.sh ] && [ -d /usr/share/pixmaps ];  then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi \nENV APPNAME \"youtube\"\nENV APPBIN \"/usr/bin/firefox\"\nLABEL oc.args=\"-P youtube --class=youtube https://www.youtube.com/\"\nENV APP \"/usr/bin/firefox\"\nUSER root\nRUN mkdir -p /var/secrets/abcdesktop/localaccount && cp /etc/passwd /etc/group /etc/shadow /var/secrets/abcdesktop/localaccount\nRUN rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nRUN rm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nRUN rm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nRUN rm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\nUSER balloon\nCMD [ \"/composer/appli-docker-entrypoint.sh\" ]\n\n
"},{"location":"applications/youtube/#rebuild-the-image-manually","title":"Rebuild the image manually","text":""},{"location":"applications/youtube/#download-the-dockerfile-manually","title":"Download the Dockerfile manually","text":"

Dockerfile for application youtube

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/youtube.d\n
"},{"location":"applications/youtube/#build-the-dockerfile-to-create-a-container-image","title":"build the Dockerfile to create a container image","text":"
docker build --build-arg TAG=3.0 -f youtube.d -t youtube .\n
"},{"location":"applications/youtube/#install-the-new-image","title":"Install the new image","text":"

If you are using containerd as container runtime, use the ctr command line

If you are not running this bash command on your abcdesktop node Replace the ABCHOST variable set to localhost by default to your own server ip address

ABCHOST=localhost\ndocker inspect youtube > youtube.json\ndocker image save youtube -o youtube.tar\nctr -n k8s.io images import youtube.tar\ncurl -X PUT -H 'Content-Type: text/javascript' http://$ABCHOST:30443/API/manager/image -d @youtube.json\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/","title":"oc.template.alpine.3.17","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#from","title":"from","text":"

inherit abcdesktopio/oc.template.alpine.minimal.3.17

"},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.7\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.17/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

file oc.template.alpine.3.17.md is created at Wed Jan 31 2024 13:51:22 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/","title":"oc.template.alpine.3.18","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#from","title":"from","text":"

inherit abcdesktopio/oc.template.alpine.minimal.3.18

"},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.6\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.3.18/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

file oc.template.alpine.3.18.md is created at Wed Jan 31 2024 13:51:24 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/","title":"oc.template.alpine.edge.gtk.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#from","title":"from","text":"

inherit abcdesktopio/oc.template.alpine.edge.gtk

"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk.libreoffice/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update  \\\n   openjdk21 \\\n   mesa-vulkan-swrast \\  \n   faenza-icon-theme-libreoffice \\\n   libreoffice           \\\n   libreoffice-gtk\n\n

file oc.template.alpine.edge.gtk.libreoffice.md is created at Wed Jan 31 2024 14:02:02 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/","title":"oc.template.alpine.edge.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#from","title":"from","text":"

inherit abcdesktopio/oc.template.alpine.edge

"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n        mesa-dri-gallium \\\n        adwaita-icon-theme \\\n        libadwaita\n\n

file oc.template.alpine.edge.gtk.md is created at Wed Jan 31 2024 13:53:07 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.edge/","title":"oc.template.alpine.edge","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#from","title":"from","text":"

inherit abcdesktopio/oc.template.alpine.minimal.edge

"},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.edge/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

file oc.template.alpine.edge.md is created at Wed Jan 31 2024 13:51:22 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/","title":"oc.template.alpine.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#from","title":"from","text":"

inherite abcdesktopio/oc.template.alpine

"},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.2\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n        mesa-dri-gallium \\\n        adwaita-icon-theme \\\n        libadwaita\n\n

file oc.template.alpine.gtk.md is created at Fri Jun 23 2023 16:35:23 GMT+0000 (Coordinated Universal Time) by make-docs.js

\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# add mesa-dri\n# add adwaita theme\nRUN apk add --no-cache --update \\\n        mesa-dri-gallium \\\n        adwaita-icon-theme \\\n        libadwaita\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/","title":"oc.template.alpine.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#from","title":"from","text":"

inherite abcdesktopio/oc.template.alpine

"},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.2\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.libreoffice/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update  \\\n   faenza-icon-theme-libreoffice \\\n   libreoffice           \\\n   libreoffice-gtk\n\n

file oc.template.alpine.libreoffice.md is created at Fri Jun 23 2023 16:46:45 GMT+0000 (Coordinated Universal Time) by make-docs.js

\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add libreoffice\nRUN apk add --no-cache --update  \\\n   faenza-icon-theme-libreoffice \\\n   libreoffice           \\\n   libreoffice-gtk\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine/","title":"oc.template.alpine","text":""},{"location":"applications/abcdesktopio/oc.template.alpine/#from","title":"from","text":"

inherit abcdesktopio/oc.template.alpine.minimal

"},{"location":"applications/abcdesktopio/oc.template.alpine/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.19.1\nPRETTY_NAME=\"Alpine Linux v3.19\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n\n# add some fonts\nRUN apk add  --no-cache --update  \\\n    font-opensans \\\n    font-adobe-100dpi \\\n    font-noto   \\\n    font-ubuntu-nerd \\\n    font-dejavu-sans-mono-nerd \\\n    font-adobe-utopia-100dpi \\\n    font-xfree86-type1 \\\n    ttf-freefont \\\n    font-ibm-type1 \\\n    font-liberation \\\n    font-sony-misc\n\n

file oc.template.alpine.md is created at Wed Jan 31 2024 13:51:26 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/","title":"oc.template.alpine.minimal.3.17","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#from","title":"from","text":"

Docker official images alpine:3.17

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.17.7\nPRETTY_NAME=\"Alpine Linux v3.17\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.17/#dockerfile-source-code","title":"DockerFile source code","text":"
\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

file oc.template.alpine.minimal.3.17.md is created at Wed Jan 31 2024 13:43:38 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/","title":"oc.template.alpine.minimal.3.18","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#from","title":"from","text":"

Docker official images alpine:3.18

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.18.6\nPRETTY_NAME=\"Alpine Linux v3.18\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.3.18/#dockerfile-source-code","title":"DockerFile source code","text":"
\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

file oc.template.alpine.minimal.3.18.md is created at Wed Jan 31 2024 13:43:44 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/","title":"oc.template.alpine.minimal.edge","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#from","title":"from","text":"

Docker official images alpine:edge

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.20.0_alpha20231219\nPRETTY_NAME=\"Alpine Linux edge\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal.edge/#dockerfile-source-code","title":"DockerFile source code","text":"
\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

file oc.template.alpine.minimal.edge.md is created at Wed Jan 31 2024 13:43:44 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/","title":"oc.template.alpine.minimal","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#from","title":"from","text":"

Docker official images alpine

"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.19.1\nPRETTY_NAME=\"Alpine Linux v3.19\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.minimal/#dockerfile-source-code","title":"DockerFile source code","text":"
\nARG BASE_IMAGE=alpine\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\nENV TERM linux\n\n\n# add core lib and bin\nRUN  apk add --no-cache         \\\n     gnupg                              \\\n     cups-client            \\\n     libpulse               \\\n     curl               \\\n     openssl                \\\n     xauth\n\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN apk add --no-cache --update bash nodejs npm\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\nENV BGROUP balloon\nENV BUID 4096\nENV BGID 4096\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN addgroup --gid $BGID $BGROUP\nRUN adduser -D -h /home/balloon -s /bin/sh -u $BUID -G balloon $BUSER\n\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n

file oc.template.alpine.minimal.md is created at Wed Jan 31 2024 13:43:34 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.alpine.wine/","title":"oc.template.alpine.wine","text":""},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#from","title":"from","text":"

inherit abcdesktopio/oc.template.alpine

"},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Alpine Linux\"\nID=alpine\nVERSION_ID=3.19.1\nPRETTY_NAME=\"Alpine Linux v3.19\"\nHOME_URL=\"https://alpinelinux.org/\"\nBUG_REPORT_URL=\"https://gitlab.alpinelinux.org/alpine/aports/-/issues\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.alpine.wine/#dockerfile-source-code","title":"DockerFile source code","text":"
\n# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\n# \n# from https://wiki.alpinelinux.org/wiki/Repositories#Enabling_the_community_repository\n#\n# RUN echo https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/main/ >> /etc/apk/repositories && \\\n#    echo https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/community/ >> /etc/apk/repositories && \\\n#    echo https://dl-cdn.alpinelinux.org/alpine/edge/testing/ >> /etc/apk/repositories \n\n\n#\n# add wine\n#\n# wine packge does not exist on alpine aarch64\n# install only x86_64 architecture\nRUN if [ $(uname -m) == 'aarch64' ]; then echo 'WARNING wine package does not exist on alpine aarch64'; fi\nRUN if [ $(uname -m) == 'x86_64'  ]; then apk add --no-cache --update wine; fi\n\n

file oc.template.alpine.wine.md is created at Wed Jan 31 2024 14:06:58 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.debian.gtk/","title":"oc.template.debian.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#from","title":"from","text":"

inherit abcdesktopio/oc.template.debian

"},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#container-distribution-release","title":"Container distribution release","text":"
PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.debian.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gir1.2-javascriptcoregtk-4.0        \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     fonts-noto                 \\\n     xfonts-base        \\\n     xfonts-encodings       \\\n     xfonts-scalable        \\\n     xfonts-utils       \\\n     fonts-beng         \\\n     fonts-beng-extra   \\\n     fonts-dejavu-core  \\\n     fonts-deva \\\n     fonts-deva-extra   \\\n     fonts-droid-fallback   \\\n     fonts-freefont-ttf \\\n     fonts-gargi    \\\n     fonts-gubbi    \\\n     fonts-gujr \\\n     fonts-gujr-extra   \\\n     fonts-guru \\\n     fonts-guru-extra   \\\n     fonts-indic    \\\n     fonts-kacst    \\\n     fonts-kacst-one    \\\n     fonts-kalapi   \\\n     fonts-knda \\\n     fonts-lao  \\\n     fonts-lato \\\n     fonts-liberation   \\\n     fonts-liberation2  \\\n     fonts-lklug-sinhala    \\\n     fonts-lohit-beng-assamese  \\\n     fonts-lohit-beng-bengali   \\\n     fonts-lohit-deva   \\\n     fonts-lohit-gujr   \\\n     fonts-lohit-guru   \\\n     fonts-lohit-knda   \\\n     fonts-lohit-mlym   \\\n     fonts-lohit-orya   \\\n     fonts-lohit-taml   \\\n     fonts-lohit-taml-classical \\\n     fonts-lohit-telu   \\\n     fonts-mlym \\\n     fonts-nakula   \\\n     fonts-navilu   \\\n     fonts-noto-cjk \\\n     fonts-noto-color-emoji \\\n     fonts-noto-mono    \\\n     fonts-opensymbol   \\\n     fonts-orya \\\n     fonts-orya-extra   \\\n     fonts-pagul    \\\n     fonts-sahadeva \\\n     fonts-samyak-deva  \\\n     fonts-samyak-gujr  \\\n     fonts-samyak-mlym  \\\n     fonts-samyak-taml  \\\n     fonts-sarai    \\\n     fonts-sil-abyssinica   \\\n     fonts-sil-padauk   \\\n     fonts-smc  \\\n     fonts-smc-anjalioldlipi    \\\n     fonts-smc-chilanka \\\n     fonts-smc-dyuthi   \\\n     fonts-smc-karumbi  \\\n     fonts-smc-keraleeyam   \\\n     fonts-smc-manjari  \\\n     fonts-smc-meera    \\\n     fonts-smc-rachana  \\\n     fonts-smc-raghumalayalamsans   \\\n     fonts-smc-suruma   \\\n     fonts-smc-uroob    \\\n     fonts-taml \\\n     fonts-telu \\\n     fonts-telu-extra   \\\n     fonts-thai-tlwg    \\\n     fonts-tibetan-machine  \\\n     fonts-tlwg-garuda  \\\n     fonts-tlwg-garuda-ttf  \\\n     fonts-tlwg-kinnari \\\n     fonts-tlwg-kinnari-ttf \\\n     fonts-tlwg-laksaman    \\\n     fonts-tlwg-laksaman-ttf    \\\n     fonts-tlwg-loma    \\\n     fonts-tlwg-loma-ttf    \\\n     fonts-tlwg-mono    \\\n     fonts-tlwg-mono-ttf    \\\n     fonts-tlwg-norasi  \\\n     fonts-tlwg-norasi-ttf  \\\n     fonts-tlwg-purisa  \\\n     fonts-tlwg-purisa-ttf  \\\n     fonts-tlwg-sawasdee    \\\n     fonts-tlwg-sawasdee-ttf    \\\n     fonts-tlwg-typewriter  \\\n     fonts-tlwg-typewriter-ttf  \\\n     fonts-tlwg-typist  \\\n     fonts-tlwg-typist-ttf  \\\n     fonts-tlwg-typo    \\\n     fonts-tlwg-typo-ttf    \\\n     fonts-tlwg-umpush  \\\n     fonts-tlwg-umpush-ttf  \\\n     fonts-tlwg-waree   \\\n     fonts-tlwg-waree-ttf   \\\n     fonts-urw-base35   \\\n     fonts-yrsa-rasa    \\\n     && apt-get clean                                   \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

file oc.template.debian.gtk.md is created at Wed Jan 31 2024 13:57:34 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.debian/","title":"oc.template.debian","text":""},{"location":"applications/abcdesktopio/oc.template.debian/#from","title":"from","text":"

inherit abcdesktopio/oc.template.debian.minimal

"},{"location":"applications/abcdesktopio/oc.template.debian/#container-distribution-release","title":"Container distribution release","text":"
PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.debian/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

file oc.template.debian.md is created at Wed Jan 31 2024 13:51:43 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.debian.minimal/","title":"oc.template.debian.minimal","text":""},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#from","title":"from","text":"

Docker official images debian:stable-slim

"},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#container-distribution-release","title":"Container distribution release","text":"
PRETTY_NAME=\"Debian GNU/Linux 12 (bookworm)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"12\"\nVERSION=\"12 (bookworm)\"\nVERSION_CODENAME=bookworm\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"\n\n
"},{"location":"applications/abcdesktopio/oc.template.debian.minimal/#dockerfile-source-code","title":"DockerFile source code","text":"
\nARG BASE_IMAGE=ubuntu:20.04\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg                              \\\n     software-properties-common         \\\n     locales                \\\n     cups-client            \\\n     libpulse0              \\\n     curl               \\\n     xauth              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\nENV LANG en_US.utf8\n\n############\nCOPY composer /composer\n\nRUN curl -sL https://deb.nodesource.com/setup_16.x | bash - \\\n        && apt-get update && \\\n        apt-get install -y --no-install-recommends \\\n        nodejs \\\n        npm \\\n    && apt-get clean \\\n    && rm -rf /var/lib/apt/lists/*\n\n\n\n# Add nodejs service\nRUN cd /composer/node/ocrun      && npm install  \n# RUN cd /composer/node/ocdownload && npm install\n\n\n##########\n# Next command use $BUSER context\nENV BUSER balloon\n# RUN adduser --disabled-password --gecos '' $BUSER\n# RUN id -u $BUSER &>/dev/null || \nRUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER\n# create an ubuntu user\n# PASS=`pwgen -c -n -1 10`\n# PASS=ballon\n# Change password for user balloon\n\n# if --build-arg BUILD_BALLON_PASSWORD=1, set NODE_ENV to 'development' or set to null otherwise.\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:+development}\n# if BUILD_BALLOON_PASSWORD is null, set it to 'abcdesktop' (or leave as is otherwise).\n#ENV BALLOON_PASSWORD=${BUILD_BALLOON_PASSWORD:-abcdesktop}\n\nRUN echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n\nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

file oc.template.debian.minimal.md is created at Wed Jan 31 2024 13:50:28 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/","title":"oc.template.ubuntu.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.minimal.18.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.18.04/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

file oc.template.ubuntu.18.04.md is created at Wed Jan 31 2024 13:51:46 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/","title":"oc.template.ubuntu.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.minimal.20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

file oc.template.ubuntu.20.04.md is created at Wed Jan 31 2024 13:51:38 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/","title":"oc.template.ubuntu.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.minimal.22.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#container-distribution-release","title":"Container distribution release","text":"
PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     openssl                \\\n     sudo               \\\n     krb5-user              \\\n     && apt-get clean           \\\n     && rm -rf /var/lib/apt/lists/  \n\n

file oc.template.ubuntu.22.04.md is created at Wed Jan 31 2024 13:51:51 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/","title":"oc.template.ubuntu.gtk.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.18.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.18.04/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gir1.2-javascriptcoregtk-4.0        \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     fonts-noto                 \\\n     xfonts-base        \\\n     xfonts-encodings       \\\n     xfonts-scalable        \\\n     xfonts-utils       \\\n     fonts-beng         \\\n     fonts-beng-extra   \\\n     fonts-dejavu-core  \\\n     fonts-deva \\\n     fonts-deva-extra   \\\n     fonts-droid-fallback   \\\n     fonts-freefont-ttf \\\n     fonts-gargi    \\\n     fonts-gubbi    \\\n     fonts-gujr \\\n     fonts-gujr-extra   \\\n     fonts-guru \\\n     fonts-guru-extra   \\\n     fonts-indic    \\\n     fonts-kacst    \\\n     fonts-kacst-one    \\\n     fonts-kalapi   \\\n     fonts-knda \\\n     fonts-lao  \\\n     fonts-lato \\\n     fonts-liberation   \\\n     fonts-liberation2  \\\n     fonts-lklug-sinhala    \\\n     fonts-lohit-beng-assamese  \\\n     fonts-lohit-beng-bengali   \\\n     fonts-lohit-deva   \\\n     fonts-lohit-gujr   \\\n     fonts-lohit-guru   \\\n     fonts-lohit-knda   \\\n     fonts-lohit-mlym   \\\n     fonts-lohit-orya   \\\n     fonts-lohit-taml   \\\n     fonts-lohit-taml-classical \\\n     fonts-lohit-telu   \\\n     fonts-mlym \\\n     fonts-nakula   \\\n     fonts-navilu   \\\n     fonts-noto-cjk \\\n     fonts-noto-color-emoji \\\n     fonts-noto-mono    \\\n     fonts-opensymbol   \\\n     fonts-orya \\\n     fonts-orya-extra   \\\n     fonts-pagul    \\\n     fonts-sahadeva \\\n     fonts-samyak-deva  \\\n     fonts-samyak-gujr  \\\n     fonts-samyak-mlym  \\\n     fonts-samyak-taml  \\\n     fonts-sarai    \\\n     fonts-sil-abyssinica   \\\n     fonts-sil-padauk   \\\n     fonts-smc  \\\n     fonts-smc-anjalioldlipi    \\\n     fonts-smc-chilanka \\\n     fonts-smc-dyuthi   \\\n     fonts-smc-karumbi  \\\n     fonts-smc-keraleeyam   \\\n     fonts-smc-manjari  \\\n     fonts-smc-meera    \\\n     fonts-smc-rachana  \\\n     fonts-smc-raghumalayalamsans   \\\n     fonts-smc-suruma   \\\n     fonts-smc-uroob    \\\n     fonts-taml \\\n     fonts-telu \\\n     fonts-telu-extra   \\\n     fonts-thai-tlwg    \\\n     fonts-tibetan-machine  \\\n     fonts-tlwg-garuda  \\\n     fonts-tlwg-garuda-ttf  \\\n     fonts-tlwg-kinnari \\\n     fonts-tlwg-kinnari-ttf \\\n     fonts-tlwg-laksaman    \\\n     fonts-tlwg-laksaman-ttf    \\\n     fonts-tlwg-loma    \\\n     fonts-tlwg-loma-ttf    \\\n     fonts-tlwg-mono    \\\n     fonts-tlwg-mono-ttf    \\\n     fonts-tlwg-norasi  \\\n     fonts-tlwg-norasi-ttf  \\\n     fonts-tlwg-purisa  \\\n     fonts-tlwg-purisa-ttf  \\\n     fonts-tlwg-sawasdee    \\\n     fonts-tlwg-sawasdee-ttf    \\\n     fonts-tlwg-typewriter  \\\n     fonts-tlwg-typewriter-ttf  \\\n     fonts-tlwg-typist  \\\n     fonts-tlwg-typist-ttf  \\\n     fonts-tlwg-typo    \\\n     fonts-tlwg-typo-ttf    \\\n     fonts-tlwg-umpush  \\\n     fonts-tlwg-umpush-ttf  \\\n     fonts-tlwg-waree   \\\n     fonts-tlwg-waree-ttf   \\\n     fonts-urw-base35   \\\n     fonts-yrsa-rasa    \\\n     && apt-get clean                                   \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

file oc.template.ubuntu.gtk.18.04.md is created at Wed Jan 31 2024 13:59:21 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/","title":"oc.template.ubuntu.gtk.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gir1.2-javascriptcoregtk-4.0        \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     fonts-noto                 \\\n     xfonts-base        \\\n     xfonts-encodings       \\\n     xfonts-scalable        \\\n     xfonts-utils       \\\n     fonts-beng         \\\n     fonts-beng-extra   \\\n     fonts-dejavu-core  \\\n     fonts-deva \\\n     fonts-deva-extra   \\\n     fonts-droid-fallback   \\\n     fonts-freefont-ttf \\\n     fonts-gargi    \\\n     fonts-gubbi    \\\n     fonts-gujr \\\n     fonts-gujr-extra   \\\n     fonts-guru \\\n     fonts-guru-extra   \\\n     fonts-indic    \\\n     fonts-kacst    \\\n     fonts-kacst-one    \\\n     fonts-kalapi   \\\n     fonts-knda \\\n     fonts-lao  \\\n     fonts-lato \\\n     fonts-liberation   \\\n     fonts-liberation2  \\\n     fonts-lklug-sinhala    \\\n     fonts-lohit-beng-assamese  \\\n     fonts-lohit-beng-bengali   \\\n     fonts-lohit-deva   \\\n     fonts-lohit-gujr   \\\n     fonts-lohit-guru   \\\n     fonts-lohit-knda   \\\n     fonts-lohit-mlym   \\\n     fonts-lohit-orya   \\\n     fonts-lohit-taml   \\\n     fonts-lohit-taml-classical \\\n     fonts-lohit-telu   \\\n     fonts-mlym \\\n     fonts-nakula   \\\n     fonts-navilu   \\\n     fonts-noto-cjk \\\n     fonts-noto-color-emoji \\\n     fonts-noto-mono    \\\n     fonts-opensymbol   \\\n     fonts-orya \\\n     fonts-orya-extra   \\\n     fonts-pagul    \\\n     fonts-sahadeva \\\n     fonts-samyak-deva  \\\n     fonts-samyak-gujr  \\\n     fonts-samyak-mlym  \\\n     fonts-samyak-taml  \\\n     fonts-sarai    \\\n     fonts-sil-abyssinica   \\\n     fonts-sil-padauk   \\\n     fonts-smc  \\\n     fonts-smc-anjalioldlipi    \\\n     fonts-smc-chilanka \\\n     fonts-smc-dyuthi   \\\n     fonts-smc-karumbi  \\\n     fonts-smc-keraleeyam   \\\n     fonts-smc-manjari  \\\n     fonts-smc-meera    \\\n     fonts-smc-rachana  \\\n     fonts-smc-raghumalayalamsans   \\\n     fonts-smc-suruma   \\\n     fonts-smc-uroob    \\\n     fonts-taml \\\n     fonts-telu \\\n     fonts-telu-extra   \\\n     fonts-thai-tlwg    \\\n     fonts-tibetan-machine  \\\n     fonts-tlwg-garuda  \\\n     fonts-tlwg-garuda-ttf  \\\n     fonts-tlwg-kinnari \\\n     fonts-tlwg-kinnari-ttf \\\n     fonts-tlwg-laksaman    \\\n     fonts-tlwg-laksaman-ttf    \\\n     fonts-tlwg-loma    \\\n     fonts-tlwg-loma-ttf    \\\n     fonts-tlwg-mono    \\\n     fonts-tlwg-mono-ttf    \\\n     fonts-tlwg-norasi  \\\n     fonts-tlwg-norasi-ttf  \\\n     fonts-tlwg-purisa  \\\n     fonts-tlwg-purisa-ttf  \\\n     fonts-tlwg-sawasdee    \\\n     fonts-tlwg-sawasdee-ttf    \\\n     fonts-tlwg-typewriter  \\\n     fonts-tlwg-typewriter-ttf  \\\n     fonts-tlwg-typist  \\\n     fonts-tlwg-typist-ttf  \\\n     fonts-tlwg-typo    \\\n     fonts-tlwg-typo-ttf    \\\n     fonts-tlwg-umpush  \\\n     fonts-tlwg-umpush-ttf  \\\n     fonts-tlwg-waree   \\\n     fonts-tlwg-waree-ttf   \\\n     fonts-urw-base35   \\\n     fonts-yrsa-rasa    \\\n     && apt-get clean                                   \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

file oc.template.ubuntu.gtk.20.04.md is created at Wed Jan 31 2024 13:57:49 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/","title":"oc.template.ubuntu.gtk.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.22.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#container-distribution-release","title":"Container distribution release","text":"
PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gir1.2-javascriptcoregtk-4.0        \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     fonts-noto                 \\\n     xfonts-base        \\\n     xfonts-encodings       \\\n     xfonts-scalable        \\\n     xfonts-utils       \\\n     fonts-beng         \\\n     fonts-beng-extra   \\\n     fonts-dejavu-core  \\\n     fonts-deva \\\n     fonts-deva-extra   \\\n     fonts-droid-fallback   \\\n     fonts-freefont-ttf \\\n     fonts-gargi    \\\n     fonts-gubbi    \\\n     fonts-gujr \\\n     fonts-gujr-extra   \\\n     fonts-guru \\\n     fonts-guru-extra   \\\n     fonts-indic    \\\n     fonts-kacst    \\\n     fonts-kacst-one    \\\n     fonts-kalapi   \\\n     fonts-knda \\\n     fonts-lao  \\\n     fonts-lato \\\n     fonts-liberation   \\\n     fonts-liberation2  \\\n     fonts-lklug-sinhala    \\\n     fonts-lohit-beng-assamese  \\\n     fonts-lohit-beng-bengali   \\\n     fonts-lohit-deva   \\\n     fonts-lohit-gujr   \\\n     fonts-lohit-guru   \\\n     fonts-lohit-knda   \\\n     fonts-lohit-mlym   \\\n     fonts-lohit-orya   \\\n     fonts-lohit-taml   \\\n     fonts-lohit-taml-classical \\\n     fonts-lohit-telu   \\\n     fonts-mlym \\\n     fonts-nakula   \\\n     fonts-navilu   \\\n     fonts-noto-cjk \\\n     fonts-noto-color-emoji \\\n     fonts-noto-mono    \\\n     fonts-opensymbol   \\\n     fonts-orya \\\n     fonts-orya-extra   \\\n     fonts-pagul    \\\n     fonts-sahadeva \\\n     fonts-samyak-deva  \\\n     fonts-samyak-gujr  \\\n     fonts-samyak-mlym  \\\n     fonts-samyak-taml  \\\n     fonts-sarai    \\\n     fonts-sil-abyssinica   \\\n     fonts-sil-padauk   \\\n     fonts-smc  \\\n     fonts-smc-anjalioldlipi    \\\n     fonts-smc-chilanka \\\n     fonts-smc-dyuthi   \\\n     fonts-smc-karumbi  \\\n     fonts-smc-keraleeyam   \\\n     fonts-smc-manjari  \\\n     fonts-smc-meera    \\\n     fonts-smc-rachana  \\\n     fonts-smc-raghumalayalamsans   \\\n     fonts-smc-suruma   \\\n     fonts-smc-uroob    \\\n     fonts-taml \\\n     fonts-telu \\\n     fonts-telu-extra   \\\n     fonts-thai-tlwg    \\\n     fonts-tibetan-machine  \\\n     fonts-tlwg-garuda  \\\n     fonts-tlwg-garuda-ttf  \\\n     fonts-tlwg-kinnari \\\n     fonts-tlwg-kinnari-ttf \\\n     fonts-tlwg-laksaman    \\\n     fonts-tlwg-laksaman-ttf    \\\n     fonts-tlwg-loma    \\\n     fonts-tlwg-loma-ttf    \\\n     fonts-tlwg-mono    \\\n     fonts-tlwg-mono-ttf    \\\n     fonts-tlwg-norasi  \\\n     fonts-tlwg-norasi-ttf  \\\n     fonts-tlwg-purisa  \\\n     fonts-tlwg-purisa-ttf  \\\n     fonts-tlwg-sawasdee    \\\n     fonts-tlwg-sawasdee-ttf    \\\n     fonts-tlwg-typewriter  \\\n     fonts-tlwg-typewriter-ttf  \\\n     fonts-tlwg-typist  \\\n     fonts-tlwg-typist-ttf  \\\n     fonts-tlwg-typo    \\\n     fonts-tlwg-typo-ttf    \\\n     fonts-tlwg-umpush  \\\n     fonts-tlwg-umpush-ttf  \\\n     fonts-tlwg-waree   \\\n     fonts-tlwg-waree-ttf   \\\n     fonts-urw-base35   \\\n     fonts-yrsa-rasa    \\\n     && apt-get clean                                   \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

file oc.template.ubuntu.gtk.22.04.md is created at Wed Jan 31 2024 13:57:23 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/","title":"oc.template.ubuntu.gtk.java","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.gtk.20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.java/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:$TAG\nMAINTAINER Alexandre DEVELY \nENV DEBIAN_FRONTEND noninteractive\nRUN apt-get update && apt-get install -y --install-recommends \\\n        default-jre \\\n        gsfonts-x11     \\\n    && rm -rf /var/lib/apt/lists/*  \n\n

file oc.template.ubuntu.gtk.java.md is created at Wed Jan 31 2024 14:02:12 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/","title":"oc.template.ubuntu.gtk.language-pack-all","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#from","title":"from","text":"

inherite abcdesktopio/oc.template.ubuntu.gtk

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.language-pack-all/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nENV DEBIAN_FRONTEND noninteractive  \n# install help in all languages for gnome\n#RUN apt-get update && apt-get install -y  --no-install-recommends       \\\n#        $(apt-cache search language-pack-gnome | awk '{print $1 }')                \\\n#        && rm -rf /var/lib/apt/lists/*\n#\n#\n#\nRUN apt-get update && apt-get install -y  --no-install-recommends                       \\\n        $(apt-cache search \"language-pack-\" | grep -v \"gnome\" | grep -v \"kde\" | awk '{print $1 }')      \\\n        && apt-get clean                                        \\\n        && rm -rf /var/lib/apt/lists/*\n\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/","title":"oc.template.ubuntu.gtk.libreoffice","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#from","title":"from","text":"

inherite abcdesktopio/oc.template.ubuntu.gtk.20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.5 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.5 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk.libreoffice/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG}\n\nENV DEBIAN_FRONTEND noninteractive\n\n# install help in all language\n#RUN DEBIAN_FRONTEND=noninteractive  apt-get update && apt-get install -y  --no-install-recommends       \\\n#        $(apt-cache search language-pack-gnome | awk '{print $1 }')                \\\n#        && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && apt install -y                \\\n    at-spi2-core                        \\\n        libreoffice                         \\\n    libreoffice-gtk3                    \\\n    libreoffice-style-elementary                \\\n    libreoffice-base-drivers                \\\n    libreoffice-sdbc-hsqldb                 \\\n    libghc-hdbc-dev                     \\   \n    && apt-get clean\n\n# install help in all language\n#RUN apt-get update && apt-get install -y  --no-install-recommends  \\\n#   $(apt-cache search libreoffice-help | awk '{print $1 }')    \\\n#   && apt-get clean\n\n# install myspell-dictionary packages when available\n#RUN DEBIAN_FRONTEND=noninteractive  apt-get update && apt-get install -y   \\       \n#        $(apt-cache search myspell-dictionary | awk '{print $1 }')     \\\n#       && rm -rf /var/lib/apt/lists/*\n\n# install hyphen when available\n#RUN apt-get update && apt-get install -y --no-install-recommends           \\       \n#        $(apt-cache search hyphen | awk '{print $1 }')                 \\\n#    && apt-get clean\n\n\n# install ibreoffice-grammarcheck when available\n#RUN apt-get update && apt-get install -y  --no-install-recommends       \\\n#        $(apt-cache search libreoffice-grammarcheck | awk '{print $1 }') \\\n#    && apt-get clean\n\n\n# l10n files are loaded by libreoffice-help packages when available\n#RUN apt-get update && apt-get install -y  --no-install-recommends  \\\n#   $(apt-cache search libreoffice-l10n | awk '{print $1 }')    \\\n#    && apt-get clean\n\n#\n# install xfonts\n# install dbus\nRUN apt-get update && apt-get install -y --no-install-recommends    \\\n        xfonts-base \\\n        dbus-x11    \\\n    && apt-get clean\n\nRUN mkdir -p /run/user/ && chmod 777 /run/user/\n\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/","title":"oc.template.ubuntu.gtk","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.gtk/#dockerfile-source-code","title":"DockerFile source code","text":"
# default TAG is dev\nARG TAG=dev\nARG BASE_IMAGE=abcdesktopio/oc.template.22.04\nFROM ${BASE_IMAGE}:${TAG} \n\n# install gtk lib\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n    gir1.2-gtk-3.0              \\\n    gir1.2-gtkclutter-1.0           \\\n    gir1.2-javascriptcoregtk-4.0        \\\n    gtk2-engines-murrine            \\\n    gtk2-engines-pixbuf         \\\n    libclutter-gtk-1.0-0            \\\n    libcolord-gtk1              \\\n    libgtk-3-0              \\\n     && apt-get clean                           \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\n\n#\n# install fonts\nRUN apt-get update && apt-get install -y --no-install-recommends        \\\n     fonts-noto                 \\\n     xfonts-base        \\\n     xfonts-encodings       \\\n     xfonts-scalable        \\\n     xfonts-utils       \\\n     fonts-beng         \\\n     fonts-beng-extra   \\\n     fonts-dejavu-core  \\\n     fonts-deva \\\n     fonts-deva-extra   \\\n     fonts-droid-fallback   \\\n     fonts-freefont-ttf \\\n     fonts-gargi    \\\n     fonts-gubbi    \\\n     fonts-gujr \\\n     fonts-gujr-extra   \\\n     fonts-guru \\\n     fonts-guru-extra   \\\n     fonts-indic    \\\n     fonts-kacst    \\\n     fonts-kacst-one    \\\n     fonts-kalapi   \\\n     fonts-knda \\\n     fonts-lao  \\\n     fonts-lato \\\n     fonts-liberation   \\\n     fonts-liberation2  \\\n     fonts-lklug-sinhala    \\\n     fonts-lohit-beng-assamese  \\\n     fonts-lohit-beng-bengali   \\\n     fonts-lohit-deva   \\\n     fonts-lohit-gujr   \\\n     fonts-lohit-guru   \\\n     fonts-lohit-knda   \\\n     fonts-lohit-mlym   \\\n     fonts-lohit-orya   \\\n     fonts-lohit-taml   \\\n     fonts-lohit-taml-classical \\\n     fonts-lohit-telu   \\\n     fonts-mlym \\\n     fonts-nakula   \\\n     fonts-navilu   \\\n     fonts-noto-cjk \\\n     fonts-noto-color-emoji \\\n     fonts-noto-mono    \\\n     fonts-opensymbol   \\\n     fonts-orya \\\n     fonts-orya-extra   \\\n     fonts-pagul    \\\n     fonts-sahadeva \\\n     fonts-samyak-deva  \\\n     fonts-samyak-gujr  \\\n     fonts-samyak-mlym  \\\n     fonts-samyak-taml  \\\n     fonts-sarai    \\\n     fonts-sil-abyssinica   \\\n     fonts-sil-padauk   \\\n     fonts-smc  \\\n     fonts-smc-anjalioldlipi    \\\n     fonts-smc-chilanka \\\n     fonts-smc-dyuthi   \\\n     fonts-smc-karumbi  \\\n     fonts-smc-keraleeyam   \\\n     fonts-smc-manjari  \\\n     fonts-smc-meera    \\\n     fonts-smc-rachana  \\\n     fonts-smc-raghumalayalamsans   \\\n     fonts-smc-suruma   \\\n     fonts-smc-uroob    \\\n     fonts-taml \\\n     fonts-telu \\\n     fonts-telu-extra   \\\n     fonts-thai-tlwg    \\\n     fonts-tibetan-machine  \\\n     fonts-tlwg-garuda  \\\n     fonts-tlwg-garuda-ttf  \\\n     fonts-tlwg-kinnari \\\n     fonts-tlwg-kinnari-ttf \\\n     fonts-tlwg-laksaman    \\\n     fonts-tlwg-laksaman-ttf    \\\n     fonts-tlwg-loma    \\\n     fonts-tlwg-loma-ttf    \\\n     fonts-tlwg-mono    \\\n     fonts-tlwg-mono-ttf    \\\n     fonts-tlwg-norasi  \\\n     fonts-tlwg-norasi-ttf  \\\n     fonts-tlwg-purisa  \\\n     fonts-tlwg-purisa-ttf  \\\n     fonts-tlwg-sawasdee    \\\n     fonts-tlwg-sawasdee-ttf    \\\n     fonts-tlwg-typewriter  \\\n     fonts-tlwg-typewriter-ttf  \\\n     fonts-tlwg-typist  \\\n     fonts-tlwg-typist-ttf  \\\n     fonts-tlwg-typo    \\\n     fonts-tlwg-typo-ttf    \\\n     fonts-tlwg-umpush  \\\n     fonts-tlwg-umpush-ttf  \\\n     fonts-tlwg-waree   \\\n     fonts-tlwg-waree-ttf   \\\n     fonts-urw-base35   \\\n     fonts-yrsa-rasa    \\\n     && apt-get clean                                   \\\n     && rm -rf /var/lib/apt/lists/*\n\nRUN apt-get update && \\\n    curl -Ls https://mirrors.kernel.org/ubuntu/pool/main/u/ubuntu-font-family-sources/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb -o /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get install -f /tmp/ttf-ubuntu-font-family_0.83-0ubuntu2_all.deb && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/* /tmp/*\n\n\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n# install https://github.com/vinceliuice/Mojave-gtk-theme\n#\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    sassc           \\\n        optipng         \\\n    gtk2-engines-murrine    \\\n    gtk2-engines-pixbuf \\\n    gnome-themes-extra \n\n\nCOPY --from=abcdesktopio/oc.themes /usr/share/icons  /usr/share/icons\nCOPY --from=abcdesktopio/oc.themes /usr/share/themes /usr/share/themes\n\n

file oc.template.ubuntu.gtk.md is created at Wed Jan 31 2024 13:57:46 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/","title":"oc.template.ubuntu.minimal.18.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#from","title":"from","text":"

Docker official images ubuntu:18.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"18.04.6 LTS (Bionic Beaver)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 18.04.6 LTS\"\nVERSION_ID=\"18.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=bionic\nUBUNTU_CODENAME=bionic\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.18.04/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

file oc.template.ubuntu.minimal.18.04.md is created at Wed Jan 31 2024 13:46:40 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/","title":"oc.template.ubuntu.minimal.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#from","title":"from","text":"

Docker official images ubuntu:20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

file oc.template.ubuntu.minimal.20.04.md is created at Wed Jan 31 2024 13:47:38 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/","title":"oc.template.ubuntu.minimal.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#from","title":"from","text":"

Docker official images ubuntu:22.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#container-distribution-release","title":"Container distribution release","text":"
PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.minimal.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

file oc.template.ubuntu.minimal.22.04.md is created at Wed Jan 31 2024 13:47:17 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/","title":"oc.template.ubuntu.nvidia.20.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#from","title":"from","text":"

inherit nvidia/cuda:12.0.0-base-ubuntu20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.20.04/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

file oc.template.ubuntu.nvidia.20.04.md is created at Wed Jan 31 2024 13:46:51 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/","title":"oc.template.ubuntu.nvidia.22.04","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#from","title":"from","text":"

inherit nvidia/cuda:12.0.0-base-ubuntu22.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#container-distribution-release","title":"Container distribution release","text":"
PRETTY_NAME=\"Ubuntu 22.04.3 LTS\"\nNAME=\"Ubuntu\"\nVERSION_ID=\"22.04\"\nVERSION=\"22.04.3 LTS (Jammy Jellyfish)\"\nVERSION_CODENAME=jammy\nID=ubuntu\nID_LIKE=debian\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nUBUNTU_CODENAME=jammy\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.nvidia.22.04/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG BASE_IMAGE\nFROM ${BASE_IMAGE}\n\nMAINTAINER Alexandre DEVELY \nRUN mkdir -p /composer/init.d\nCOPY etc/ /etc\n\n# correct debconf: (TERM is not set, so the dialog frontend is not usable.)\nENV DEBCONF_FRONTEND noninteractive\nENV TERM linux\nRUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n     gnupg \\\n     software-properties-common \\\n     locales \\\n     cups-client \\\n     libpulse0 \\\n     curl \\\n     xauth \\\n     && apt-get clean \\\n     && rm -rf /var/lib/apt/lists/ \\\n     && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8\n# default LANG is en_US\nENV LANG en_US.utf8\n\n# copy compser source code\nCOPY composer /composer\n\n# install nodejs and npm\n# the default install version is 20\n#\n# read from https://github.com/nodesource/distributions\n#\n# | Distro Name          | Node 16x | Node 18x | Node 20x |\n# | :------------------- | :------: | :------: | :------: |\n# | Ubuntu Bionic ^18.04 |    OK    |    KO    |    KO    |\n# | Ubuntu Focal ^20.04  |    OK    |    OK    |    OK    |\n# | Ubuntu Jammy ^22.04  |    OK    |    OK    |    OK    |\n#\n# if VERSION_ID == 18.04 then install nodejs 16 else install nodejs 20\nRUN NODE_MAJOR=20; if [ \"18.04\" = \"$(. /etc/os-release;echo $VERSION_ID)\" ]; then NODE_MAJOR=16; fi; echo \"node version install $NODE_MAJOR\" && \\\n    mkdir -p /etc/apt/keyrings && \\\n    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \\ \n    echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list && \\\n    apt-get update && \\\n    apt-get install -y --no-install-recommends nodejs && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Add nodejs service\n# ocrun can call create another container or pod\nRUN cd /composer/node/ocrun && npm install  \n\n#\n# create account \n# Next command use $BUSER context\n# this is the default user if no user defined\nENV BUSER balloon\n# create group, user, set password\nRUN groupadd --gid 4096 $BUSER && \\\n    useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups $BUSER $BUSER && \\\n    echo \"balloon:lmdpocpetit\" | chpasswd $BUSER\n# allow default user to write in /var/log/desktop  if no user defined \nRUN mkdir -p /var/log/desktop && \\\n    chown -R $BUSER:$BUSER /home/$BUSER /var/log/desktop\n\n\n

file oc.template.ubuntu.nvidia.22.04.md is created at Wed Jan 31 2024 13:46:36 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/","title":"oc.template.ubuntu.wine","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.20.04

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:$TAG\nMAINTAINER Alexandre DEVELY \n\n# install wget\nRUN apt-get update && apt-get install --no-install-recommends --yes \\\n       wget                             \\\n       && apt-get clean\n\n\n# set arch to i386\nRUN if [ $(dpkg --print-architecture) == 'amd64' ]; then dpkg --add-architecture i386; fi\n\n# only to use wine repo\n# RUN wget -qO - https://dl.winehq.org/wine-builds/winehq.key | apt-key add -\n# RUN apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ focal main'\n\n\n# tools for winetricks\n# Uses the following non-POSIX system tools:\n# - wine is used to execute Win32 apps except on Cygwin.\n# - ar, cabextract, unrar, unzip, and 7z are needed by some verbs.\n# - aria2c, wget, curl, or fetch is needed for downloading.\n# - fuseiso, archivemount (Linux), or hdiutil (macOS) is used to mount .iso images.\n# - perl is used to munge steam config files.\n# - pkexec, sudo, or kdesu (gksu/gksudo/kdesudo are deprecated upstream but also still supported)\n#   are used to mount .iso images if the user cached them with -k option.\n# - sha256sum, sha256, or shasum (OSX 10.5 does not support these, 10.6+ is required)\n# - torify is used with option \"--torify\" if sites are blocked in single countries.\n# - xdg-open (if present) or open (for OS X) is used to open download pages\n#   for the user when downloads cannot be fully automated.\n# - xz is used by some verbs to decompress tar archives.\n# - zenity is needed by the GUI, though it can limp along somewhat with kdialog/xmessage.\n\n\n#RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes aria2 \\\n#    apt-get clean \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes binutils \\\n#    apt-get clean \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes cabextract fuseiso p7zip-full policykit-1 && \\\n#    apt-get clean     \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes fuseiso && \\\n#    apt-get clean  \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes  p7zip-full policykit-1 && \\\n#    apt-get clean  \n\n# RUN apt-get update && \\\n#     apt-get install --no-install-recommends --yes  policykit-1 && \\\n#    apt-get clean  \n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes tor unrar unzip xdg-utils xz-utils zenity && \\\n#    apt-get clean \n\n# gir1.2-gtk-3.0:i386 gir1.2-pango-1.0:i386 used by crossover\n\n# add for 20.04\n# apt-get install --no-install-recommends --yes libgcc-s1:i386 && \\\n\n# RUN apt-get update && \\\n#    apt-get install --no-install-recommends --yes aptitude libnss-mdns:i386 libsdl2-2.0-0 libsdl2-2.0-0:i386 gir1.2-gtk-3.0:i386 gir1.2-pango-1.0:i386 && \\\n#    apt-get clean \n\n# add dns support for 32 apps running on 64 bits\n#RUN apt-get update && apt-get install -y   \\\n#   libnss-mdns-i386            \\\n#   libnss-mdns             \\ \n#   wine-stable &&          \\\n#   apt-get clean       \n\n# RUN wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/amd64/libfaudio0_19.07-0~bionic_amd64.deb   &&  \\\n#     dpkg -i libfaudio0_19.07-0~bionic_amd64.deb                                           &&  \\\n#    rm libfaudio0_19.07-0~bionic_amd64.deb\n\n#RUN wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/i386/libfaudio0_19.07-0~bionic_i386.deb  &&  \\\n#    dpkg -i libfaudio0_19.07-0~bionic_i386.deb                                             &&  \\\n#    rm libfaudio0_19.07-0~bionic_i386.deb\n\n\n###\n#RUN mkdir -p /composer/.cache\n#RUN mkdir -p /composer/.cache/wine && \\\n#   wget  -O  /composer/.cache/wine/wine-gecko-2.47.1-x86.msi http://dl.winehq.org/wine/wine-gecko/2.47.1/wine-gecko-2.47.1-x86.msi && \\\n#   wget  -O  /composer/.cache/wine/wine-gecko-2.47.1-x86_64.msi http://dl.winehq.org/wine/wine-gecko/2.47.1/wine-gecko-2.47.1-x86_64.msi && \\\n#   wget  -O  /composer/.cache/wine/wine-mono-4.9.4.msi https://dl.winehq.org/wine/wine-mono/4.9.4/wine-mono-4.9.4.msi      \n##\n\nRUN mkdir -p /composer/.cache/fontconfig\n# COPY composer/.cache/fontconfig /composer/.cache/fontconfig\n\nRUN apt-get update && \\\n    apt-get install --yes wine && \\\n    apt-get clean\n\n# add xrdb for playonlinux\n# xrdb is in x11-xserver-utils\nRUN apt-get update && \\\n    apt-get install --no-install-recommends --yes libpython3.6 playonlinux x11-xserver-utils && \\\n    apt-get clean\n\n\nRUN apt-get update && \\\n    apt-get install --no-install-recommends --yes mono-runtime winetricks && \\\n    apt-get clean\n\nCOPY composer/updatereg.py              /composer\nCOPY composer/init.d/init.wine      /composer/init.d/init.wine\nCOPY composer/init.d/_init.wine         /composer/init.d/_init.wine\nRUN  mkdir /composer/.wine /composer/bin && chmod 777 /composer/.wine /composer/bin\n\n# Set for each app \nENV WINEPREFIX=/composer/.wine\n#ENV WINEARCH win32\n\n

file oc.template.ubuntu.wine.md is created at Wed Jan 31 2024 14:06:00 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/","title":"oc.template.ubuntu.wine.mswindow","text":""},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#from","title":"from","text":"

inherit abcdesktopio/oc.template.ubuntu.wine

"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#container-distribution-release","title":"Container distribution release","text":"
NAME=\"Ubuntu\"\nVERSION=\"20.04.6 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04.6 LTS\"\nVERSION_ID=\"20.04\"\nHOME_URL=\"https://www.ubuntu.com/\"\nSUPPORT_URL=\"https://help.ubuntu.com/\"\nBUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\nPRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\nVERSION_CODENAME=focal\nUBUNTU_CODENAME=focal\n\n
"},{"location":"applications/abcdesktopio/oc.template.ubuntu.wine.mswindow/#dockerfile-source-code","title":"DockerFile source code","text":"
ARG TAG=dev\nARG BASE_IMAGE\nFROM ${BASE_IMAGE}:${TAG} \n\nENV DEBIAN_FRONTEND noninteractive \nRUN apt-get update && \\\n    apt-get install --install-recommends -y \\\n    xterm \\\n    wget \\\n    netcat \\\n    file \\\n    winbind \\\n    gettext \\ \n    libgettextpo-dev \\\n    && rm -rf /var/lib/apt/lists/*  \n\n# set arch to i386\nRUN dpkg --add-architecture i386\n\n# install play\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    libosmesa6:i386 \\\n        libnss-mdns \\\n    libnss-mdns:i386 \\\n    libncurses5:i386 \\\n    libodbc1:i386 \\\n    libxext6:i386 \\\n    libxi6:i386 \\\n    libfreetype6:i386 \\\n    libx11-6:i386 \\\n    libz1:i386 \\\n    libcups2:i386 \\\n    liblcms2-2:i386 \\\n    libglu1-mesa:i386 \\\n    libxcursor1:i386 \\\n    libxrandr2:i386 \\\n    libxml2:i386 \\\n    libgl1-mesa-dri:i386 \\\n    libgl1-mesa-glx:i386 \\\n    && rm -rf /var/lib/apt/lists/*\n\n# add source play on linux \nRUN apt-get update && \\\n   wget https://www.playonlinux.com/script_files/PlayOnLinux/4.3.4/PlayOnLinux_4.3.4.deb && \\\n   apt-get install --allow-downgrades -y ./PlayOnLinux_4.3.4.deb && \\\n   rm PlayOnLinux_4.3.4.deb && \\\n   rm -rf /var/lib/apt/lists/*\n\n

file oc.template.ubuntu.wine.mswindow.md is created at Wed Jan 31 2024 14:08:19 GMT+0000 (Coordinated Universal Time) by make-docs.js

"},{"location":"cheatsheets/bash/","title":"Bash scripting","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#getting-started","title":"Getting started","text":"

{: .-three-column}

","tags":["Featured"]},{"location":"cheatsheets/bash/#example","title":"Example","text":"
#!/usr/bin/env bash\n\nNAME=\"John\"\necho \"Hello $NAME!\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#variables","title":"Variables","text":"
NAME=\"John\"\necho $NAME\necho \"$NAME\"\necho \"${NAME}!\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#string-quotes","title":"String quotes","text":"
NAME=\"John\"\necho \"Hi $NAME\"  #=> Hi John\necho 'Hi $NAME'  #=> Hi $NAME\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#shell-execution","title":"Shell execution","text":"
echo \"I'm in $(pwd)\"\necho \"I'm in `pwd`\"\n# Same\n

See Command substitution

","tags":["Featured"]},{"location":"cheatsheets/bash/#conditional-execution","title":"Conditional execution","text":"
git commit && git push\ngit commit || echo \"Commit failed\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#functions","title":"Functions","text":"

{: id='functions-example'}

get_name() {\n  echo \"John\"\n}\n\necho \"You are $(get_name)\"\n

See: Functions

","tags":["Featured"]},{"location":"cheatsheets/bash/#conditionals","title":"Conditionals","text":"

{: id='conditionals-example'}

if [[ -z \"$string\" ]]; then\n  echo \"String is empty\"\nelif [[ -n \"$string\" ]]; then\n  echo \"String is not empty\"\nfi\n

See: Conditionals

","tags":["Featured"]},{"location":"cheatsheets/bash/#strict-mode","title":"Strict mode","text":"
set -euo pipefail\nIFS=$'\\n\\t'\n

See: Unofficial bash strict mode

","tags":["Featured"]},{"location":"cheatsheets/bash/#brace-expansion","title":"Brace expansion","text":"
echo {A,B}.js\n

| {A,B} | Same as A B | | {A,B}.js | Same as A.js B.js | | {1..5} | Same as 1 2 3 4 5 |

See: Brace expansion

","tags":["Featured"]},{"location":"cheatsheets/bash/#parameter-expansions","title":"Parameter expansions","text":"

{: .-three-column}

","tags":["Featured"]},{"location":"cheatsheets/bash/#basics","title":"Basics","text":"
name=\"John\"\necho ${name}\necho ${name/J/j}    #=> \"john\" (substitution)\necho ${name:0:2}    #=> \"Jo\" (slicing)\necho ${name::2}     #=> \"Jo\" (slicing)\necho ${name::-1}    #=> \"Joh\" (slicing)\necho ${name:(-1)}   #=> \"n\" (slicing from right)\necho ${name:(-2):1} #=> \"h\" (slicing from right)\necho ${food:-Cake}  #=> $food or \"Cake\"\n
length=2\necho ${name:0:length}  #=> \"Jo\"\n

See: Parameter expansion

STR=\"/path/to/foo.cpp\"\necho ${STR%.cpp}    # /path/to/foo\necho ${STR%.cpp}.o  # /path/to/foo.o\n\necho ${STR##*.}     # cpp (extension)\necho ${STR##*/}     # foo.cpp (basepath)\n\necho ${STR#*/}      # path/to/foo.cpp\necho ${STR##*/}     # foo.cpp\n\necho ${STR/foo/bar} # /path/to/bar.cpp\n
STR=\"Hello world\"\necho ${STR:6:5}   # \"world\"\necho ${STR:-5:5}  # \"world\"\n
SRC=\"/path/to/foo.cpp\"\nBASE=${SRC##*/}   #=> \"foo.cpp\" (basepath)\nDIR=${SRC%$BASE}  #=> \"/path/to/\" (dirpath)\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#substitution","title":"Substitution","text":"Code Description ${FOO%suffix} Remove suffix ${FOO#prefix} Remove prefix --- --- ${FOO%%suffix} Remove long suffix ${FOO##prefix} Remove long prefix --- --- ${FOO/from/to} Replace first match ${FOO//from/to} Replace all --- --- ${FOO/%from/to} Replace suffix ${FOO/#from/to} Replace prefix","tags":["Featured"]},{"location":"cheatsheets/bash/#comments","title":"Comments","text":"
# Single line comment\n
: '\nThis is a\nmulti line\ncomment\n'\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#substrings","title":"Substrings","text":"

| ${FOO:0:3} | Substring (position, length) | | ${FOO:-3:3} | Substring from the right |

","tags":["Featured"]},{"location":"cheatsheets/bash/#length","title":"Length","text":"

| ${#FOO} | Length of $FOO |

","tags":["Featured"]},{"location":"cheatsheets/bash/#manipulation","title":"Manipulation","text":"
STR=\"HELLO WORLD!\"\necho ${STR,}   #=> \"hELLO WORLD!\" (lowercase 1st letter)\necho ${STR,,}  #=> \"hello world!\" (all lowercase)\n\nSTR=\"hello world!\"\necho ${STR^}   #=> \"Hello world!\" (uppercase 1st letter)\necho ${STR^^}  #=> \"HELLO WORLD!\" (all uppercase)\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#default-values","title":"Default values","text":"

| ${FOO:-val} | $FOO, or val if not set | | ${FOO:=val} | Set $FOO to val if not set | | ${FOO:+val} | val if $FOO is set | | ${FOO:?message} | Show error message and exit if $FOO is not set |

The : is optional (eg, ${FOO=word} works)

","tags":["Featured"]},{"location":"cheatsheets/bash/#loops","title":"Loops","text":"

{: .-three-column}

","tags":["Featured"]},{"location":"cheatsheets/bash/#basic-for-loop","title":"Basic for loop","text":"
for i in /etc/rc.*; do\n  echo $i\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#c-like-for-loop","title":"C-like for loop","text":"
for ((i = 0 ; i < 100 ; i++)); do\n  echo $i\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#ranges","title":"Ranges","text":"
for i in {1..5}; do\n    echo \"Welcome $i\"\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#with-step-size","title":"With step size","text":"
for i in {5..50..5}; do\n    echo \"Welcome $i\"\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#reading-lines","title":"Reading lines","text":"
cat file.txt | while read line; do\n  echo $line\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#forever","title":"Forever","text":"
while true; do\n  \u00b7\u00b7\u00b7\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#functions_1","title":"Functions","text":"

{: .-three-column}

","tags":["Featured"]},{"location":"cheatsheets/bash/#defining-functions","title":"Defining functions","text":"
myfunc() {\n    echo \"hello $1\"\n}\n
# Same as above (alternate syntax)\nfunction myfunc() {\n    echo \"hello $1\"\n}\n
myfunc \"John\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#returning-values","title":"Returning values","text":"
myfunc() {\n    local myresult='some value'\n    echo $myresult\n}\n
result=\"$(myfunc)\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#raising-errors","title":"Raising errors","text":"
myfunc() {\n  return 1\n}\n
if myfunc; then\n  echo \"success\"\nelse\n  echo \"failure\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#arguments","title":"Arguments","text":"Expression Description $# Number of arguments $* All arguments $@ All arguments, starting from first $1 First argument $_ Last argument of the previous command

See Special parameters.

","tags":["Featured"]},{"location":"cheatsheets/bash/#conditionals_1","title":"Conditionals","text":"

{: .-three-column}

","tags":["Featured"]},{"location":"cheatsheets/bash/#conditions","title":"Conditions","text":"

Note that [[ is actually a command/program that returns either 0 (true) or 1 (false). Any program that obeys the same logic (like all base utils, such as grep(1) or ping(1)) can be used as condition, see examples.

Condition Description [[ -z STRING ]] Empty string [[ -n STRING ]] Not empty string [[ STRING == STRING ]] Equal [[ STRING != STRING ]] Not Equal --- --- [[ NUM -eq NUM ]] Equal [[ NUM -ne NUM ]] Not equal [[ NUM -lt NUM ]] Less than [[ NUM -le NUM ]] Less than or equal [[ NUM -gt NUM ]] Greater than [[ NUM -ge NUM ]] Greater than or equal --- --- [[ STRING =~ STRING ]] Regexp --- --- (( NUM < NUM )) Numeric conditions Condition Description [[ -o noclobber ]] If OPTIONNAME is enabled --- --- [[ ! EXPR ]] Not [[ X ]] && [[ Y ]] And [[ X ]] || [[ Y ]] Or","tags":["Featured"]},{"location":"cheatsheets/bash/#file-conditions","title":"File conditions","text":"Condition Description [[ -e FILE ]] Exists [[ -r FILE ]] Readable [[ -h FILE ]] Symlink [[ -d FILE ]] Directory [[ -w FILE ]] Writable [[ -s FILE ]] Size is > 0 bytes [[ -f FILE ]] File [[ -x FILE ]] Executable --- --- [[ FILE1 -nt FILE2 ]] 1 is more recent than 2 [[ FILE1 -ot FILE2 ]] 2 is more recent than 1 [[ FILE1 -ef FILE2 ]] Same files","tags":["Featured"]},{"location":"cheatsheets/bash/#example_1","title":"Example","text":"
# String\nif [[ -z \"$string\" ]]; then\n  echo \"String is empty\"\nelif [[ -n \"$string\" ]]; then\n  echo \"String is not empty\"\nfi\n
# Combinations\nif [[ X ]] && [[ Y ]]; then\n  ...\nfi\n
# Equal\nif [[ \"$A\" == \"$B\" ]]\n
# Regex\nif [[ \"A\" =~ . ]]\n
if (( $a < $b )); then\n   echo \"$a is smaller than $b\"\nfi\n
if [[ -e \"file.txt\" ]]; then\n  echo \"file exists\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#arrays","title":"Arrays","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#defining-arrays","title":"Defining arrays","text":"
Fruits=('Apple' 'Banana' 'Orange')\n
Fruits[0]=\"Apple\"\nFruits[1]=\"Banana\"\nFruits[2]=\"Orange\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#working-with-arrays","title":"Working with arrays","text":"
echo ${Fruits[0]}           # Element #0\necho ${Fruits[@]}           # All elements, space-separated\necho ${#Fruits[@]}          # Number of elements\necho ${#Fruits}             # String length of the 1st element\necho ${#Fruits[3]}          # String length of the Nth element\necho ${Fruits[@]:3:2}       # Range (from position 3, length 2)\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#operations","title":"Operations","text":"
Fruits=(\"${Fruits[@]}\" \"Watermelon\")    # Push\nFruits+=('Watermelon')                  # Also Push\nFruits=( ${Fruits[@]/Ap*/} )            # Remove by regex match\nunset Fruits[2]                         # Remove one item\nFruits=(\"${Fruits[@]}\")                 # Duplicate\nFruits=(\"${Fruits[@]}\" \"${Veggies[@]}\") # Concatenate\nlines=(`cat \"logfile\"`)                 # Read from file\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#iteration","title":"Iteration","text":"
for i in \"${arrayName[@]}\"; do\n  echo $i\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#dictionaries","title":"Dictionaries","text":"

{: .-three-column}

","tags":["Featured"]},{"location":"cheatsheets/bash/#defining","title":"Defining","text":"
declare -A sounds\n
sounds[dog]=\"bark\"\nsounds[cow]=\"moo\"\nsounds[bird]=\"tweet\"\nsounds[wolf]=\"howl\"\n

Declares sound as a Dictionary object (aka associative array).

","tags":["Featured"]},{"location":"cheatsheets/bash/#working-with-dictionaries","title":"Working with dictionaries","text":"
echo ${sounds[dog]} # Dog's sound\necho ${sounds[@]}   # All values\necho ${!sounds[@]}  # All keys\necho ${#sounds[@]}  # Number of elements\nunset sounds[dog]   # Delete dog\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#iteration_1","title":"Iteration","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#iterate-over-values","title":"Iterate over values","text":"
for val in \"${sounds[@]}\"; do\n  echo $val\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#iterate-over-keys","title":"Iterate over keys","text":"
for key in \"${!sounds[@]}\"; do\n  echo $key\ndone\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#options","title":"Options","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#options_1","title":"Options","text":"
set -o noclobber  # Avoid overlay files (echo \"hi\" > foo)\nset -o errexit    # Used to exit upon error, avoiding cascading errors\nset -o pipefail   # Unveils hidden failures\nset -o nounset    # Exposes unset variables\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#glob-options","title":"Glob options","text":"
shopt -s nullglob    # Non-matching globs are removed  ('*.foo' => '')\nshopt -s failglob    # Non-matching globs throw errors\nshopt -s nocaseglob  # Case insensitive globs\nshopt -s dotglob     # Wildcards match dotfiles (\"*.sh\" => \".foo.sh\")\nshopt -s globstar    # Allow ** for recursive matches ('lib/**/*.rb' => 'lib/a/b/c.rb')\n

Set GLOBIGNORE as a colon-separated list of patterns to be removed from glob matches.

","tags":["Featured"]},{"location":"cheatsheets/bash/#history","title":"History","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#commands","title":"Commands","text":"

| history | Show history | | shopt -s histverify | Don't execute expanded result immediately |

","tags":["Featured"]},{"location":"cheatsheets/bash/#expansions","title":"Expansions","text":"

| !$ | Expand last parameter of most recent command | | !* | Expand all parameters of most recent command | | !-n | Expand nth most recent command | | !n | Expand nth command in history | | !<command> | Expand most recent invocation of command <command> |

","tags":["Featured"]},{"location":"cheatsheets/bash/#operations_1","title":"Operations","text":"

| !! | Execute last command again | | !!:s/<FROM>/<TO>/ | Replace first occurrence of <FROM> to <TO> in most recent command | | !!:gs/<FROM>/<TO>/ | Replace all occurrences of <FROM> to <TO> in most recent command | | !$:t | Expand only basename from last parameter of most recent command | | !$:h | Expand only directory from last parameter of most recent command |

!! and !$ can be replaced with any valid expansion.

","tags":["Featured"]},{"location":"cheatsheets/bash/#slices","title":"Slices","text":"

| !!:n | Expand only nth token from most recent command (command is 0; first argument is 1) | | !^ | Expand first argument from most recent command | | !$ | Expand last token from most recent command | | !!:n-m | Expand range of tokens from most recent command | | !!:n-$ | Expand nth token to last from most recent command |

!! can be replaced with any valid expansion i.e. !cat, !-2, !42, etc.

","tags":["Featured"]},{"location":"cheatsheets/bash/#miscellaneous","title":"Miscellaneous","text":"","tags":["Featured"]},{"location":"cheatsheets/bash/#numeric-calculations","title":"Numeric calculations","text":"
$((a + 200))      # Add 200 to $a\n
$((RANDOM%=200))  # Random number 0..200\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#subshells","title":"Subshells","text":"
(cd somedir; echo \"I'm now in $PWD\")\npwd # still in first directory\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#redirection","title":"Redirection","text":"
python hello.py > output.txt   # stdout to (file)\npython hello.py >> output.txt  # stdout to (file), append\npython hello.py 2> error.log   # stderr to (file)\npython hello.py 2>&1           # stderr to stdout\npython hello.py 2>/dev/null    # stderr to (null)\npython hello.py &>/dev/null    # stdout and stderr to (null)\n
python hello.py < foo.txt      # feed foo.txt to stdin for python\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#inspecting-commands","title":"Inspecting commands","text":"
command -V cd\n#=> \"cd is a function/alias/whatever\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#trap-errors","title":"Trap errors","text":"
trap 'echo Error at about $LINENO' ERR\n

or

traperr() {\n  echo \"ERROR: ${BASH_SOURCE[1]} at about ${BASH_LINENO[0]}\"\n}\n\nset -o errtrace\ntrap traperr ERR\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#caseswitch","title":"Case/switch","text":"
case \"$1\" in\n  start | up)\n    vagrant up\n    ;;\n\n  *)\n    echo \"Usage: $0 {start|stop|ssh}\"\n    ;;\nesac\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#source-relative","title":"Source relative","text":"
source \"${0%/*}/../share/foo.sh\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#printf","title":"printf","text":"
printf \"Hello %s, I'm %s\" Sven Olga\n#=> \"Hello Sven, I'm Olga\n\nprintf \"1 + 1 = %d\" 2\n#=> \"1 + 1 = 2\"\n\nprintf \"This is how you print a float: %f\" 2\n#=> \"This is how you print a float: 2.000000\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#directory-of-script","title":"Directory of script","text":"
DIR=\"${0%/*}\"\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#getting-options","title":"Getting options","text":"
while [[ \"$1\" =~ ^- && ! \"$1\" == \"--\" ]]; do case $1 in\n  -V | --version )\n    echo $version\n    exit\n    ;;\n  -s | --string )\n    shift; string=$1\n    ;;\n  -f | --flag )\n    flag=1\n    ;;\nesac; shift; done\nif [[ \"$1\" == '--' ]]; then shift; fi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#heredoc","title":"Heredoc","text":"
cat <<END\nhello world\nEND\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#reading-input","title":"Reading input","text":"
echo -n \"Proceed? [y/n]: \"\nread ans\necho $ans\n
read -n 1 ans    # Just one character\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#special-variables","title":"Special variables","text":"

| $? | Exit status of last task | | $! | PID of last background task | | $$ | PID of shell | | $0 | Filename of the shell script |

See Special parameters.

","tags":["Featured"]},{"location":"cheatsheets/bash/#go-to-previous-directory","title":"Go to previous directory","text":"
pwd # /home/user/foo\ncd bar/\npwd # /home/user/foo/bar\ncd -\npwd # /home/user/foo\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#check-for-commands-result","title":"Check for command's result","text":"
if ping -c 1 google.com; then\n  echo \"It appears you have a working internet connection\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#grep-check","title":"Grep check","text":"
if grep -q 'foo' ~/.bash_history; then\n  echo \"You appear to have typed 'foo' in the past\"\nfi\n
","tags":["Featured"]},{"location":"cheatsheets/bash/#also-see","title":"Also see","text":"

{: .-one-column}

","tags":["Featured"]},{"location":"cheatsheets/docker/","title":"Docker scripting cheatsheets","text":""},{"location":"cheatsheets/docker/#common-docker-commands","title":"Common Docker commands","text":""},{"location":"cheatsheets/docker/#update-all-images","title":"update all images","text":"
docker images |grep -v REPOSITORY|awk '{print $1}'|xargs -L1 docker pull\n
"},{"location":"cheatsheets/docker/#remove-exited-container","title":"Remove exited container","text":"
docker rm `docker ps -a -q -f \"status=exited\"`\n
"},{"location":"cheatsheets/docker/#remove-dangling-images","title":"Remove dangling images","text":"
docker rmi `docker images -q --filter \"dangling=true\"`\n
"},{"location":"cheatsheets/macos/","title":"Macos","text":"

Docker For Mac embeds a hypervisor (based on xhyve), a Linux distribution which runs on LinuxKit and filesystem & network sharing that is much more Mac native. Docker For Mac is a Mac native application in /Applications.

At installation time, it creates symlinks in /usr/local/bin for docker and docker-compose, to the commands in the application bundle, in /Applications/Docker.app/Contents/Resources/bin.

To install dockerd on MacOS/X, use Docker for Desktop. Get Docker for MacOS on the docker website docker-for-mac

To get a shell to the LinuxKit docker-desktop, run the docker command

docker run -it --rm --privileged --pid=host justincormack/nsenter1\n

more info: https://github.com/justincormack/nsenter1

"},{"location":"common/acl/","title":"Define access control list for application","text":""},{"location":"common/acl/#goals","title":"Goals","text":""},{"location":"common/acl/#requirements","title":"Requirements","text":""},{"location":"common/acl/#update-applistjson-file","title":"Update applist.json file","text":"

To restrict access to applications using authentication label, you need to define an acl entry in the application dictionary object.

    \"acl\": { \"permit\": [ \"tag\" ] },\n

For example using the application xedit

all is a special label for everything. The xedit application can be run for all tags.

{\n    \"acl\": { \"permit\": [ \"all\" ] },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"x11-apps\",\n    \"icon\": \"xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\":\"txt;log;md\"\n}\n

To restrict access to applications using authentication label, you have to define label using rules during authentification step, and define label to the application.

"},{"location":"common/acl/#define-authenticated-label-using-rules","title":"Define authenticated label using rules","text":"

You can read the chapter authentification-rules to define some autenticated labels.

Update the od.config file, to add a label mylocal if the source ip address is in local network 192.168.0.0/16

authmanagers: {\n 'external': {},\n 'explicit': {},\n 'implicit': {\n   'providers': {\n     'anonymous': {\n        'displayname': 'Anonymous',\n        'caption': 'Have a look !',\n        'userid': 'anonymous',\n        'username': 'Anonymous',\n        'policies': { \n          'acl'   : { 'permit': [ 'all' ] }, \n            'rules' : \n                { 'rule-net-home': {  \n                    'conditions' : [ { 'network': '192.168.0.0/16', 'expected' : True } ],\n                    'expected'   : True,\n                    'label'      : 'localnet'\n                   } \n                } \n        } \n     } \n    } \n  } \n} \n\n

Restart the pyos service

kubectl delete pod -l run-pyos-od -n abcdesktop\n

When your services are restarted, launch your web browser

Login to your abcdesktop service and choose anonymous authentication

Check the label set during the authentication process

Goto the menu option at the right up corner, choose Settings | User | Session

You should read the label localnet in the Anonymous user information.

"},{"location":"common/acl/#define-the-acl-label-to-the-application","title":"Define the acl label to the application","text":"

You can read the chapter Build your own application image , if your are building user docker abcdsktop application image for the first time.

"},{"location":"common/acl/#create-a-xeditjson-file","title":"Create a xedit.json file","text":"

Create a edit.json file with the content :

{\n    \"acl\": { \"permit\": [ \"localhost\", \"localnet\"  ] },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"x11-apps\",\n    \"icon\": \"xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\":\"txt;log;md\"\n}\n

To build your new image, download the make.js script file. make.js is located in the oc.apps repository. Look at https://github.com/abcdesktopio/oc.apps if you can't download this file.

Make sure that you have installed nodejs

To install make.js command

wget https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/make.js\n

Create icons directory

mkdir -p icons\ncurl --output icons/xedit.svg https://raw.githubusercontent.com/abcdesktopio/oc.apps/main/icons/xedit.svg \n

Run the make command

node make.js -f xedit.json Dockerfile\n

You should read on standard output

myArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nopening file xedit.json\napplist.json entries: 1\nmyArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nBuilding file Dockerfile as output\n{\n  acl: { permit: [ 'all' ] },\n  cat: 'utilities',\n  debpackage: 'x11-apps',\n  icon: 'xedit.svg',\n  keyword: 'text,notepad,edit,txt,editor,xedit',\n  launch: 'xedit.Xedit',\n  name: 'xedit',\n  displayname: 'Xedit',\n  path: '/usr/bin/xedit',\n  template: 'abcdesktopio/oc.template.gtk',\n  mimetype: 'application/text;',\n  fileextensions: 'txt;log;md'\n}\nBuilding xedit.Xedit\n

Look at the new Dockerfile, and build the new docker image for xedit

docker build -t xedit.d .\n

You should read on standard output

[+] Building 13.0s (11/11) FINISHED                                                                                                                                                                     \n => [internal] load build definition from Dockerfile                                                                                                                                               0.0s\n => => transferring dockerfile: 2.01kB                                                                                                                                                             0.0s\n => [internal] load .dockerignore                                                                                                                                                                  0.0s\n => => transferring context: 2B                                                                                                                                                                    0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:dev                                                                                                                        2.3s\n => [auth] abcdesktopio/oc.template.gtk:pull token for registry-1.docker.io                                                                                                                        0.0s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79                                                                  0.4s\n => => resolve docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79                                                                  0.0s\n => => sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79 3.88kB / 3.88kB                                                                                                     0.0s\n => => sha256:fe01ec1c214baf8b3e86255ac7dbca3157be4932ae19dfe07bbcf7d8c8839b07 7.80kB / 7.80kB                                                                                                     0.0s\n => [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps && apt-get clean                                                               8.7s\n => [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections                                                                                                       0.4s\n => [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                                                                                               0.3s \n => [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                                                                                               0.3s \n => [6/6] WORKDIR /home/balloon                                                                                                                                                                    0.0s \n => exporting to image                                                                                                                                                                             0.3s \n => => exporting layers                                                                                                                                                                            0.3s \n => => writing image sha256:0b7cb908c88bf6301eb0555e558e99436e40bd5604e7ffebd12f137e9b5f9878                                                                                                       0.0s\n => => naming to docker.io/library/xedit.d  \n

Then look at the acl label

docker inspect xedit.d | grep oc.acl\n
                \"oc.acl\": \"{\\\"permit\\\":[\\\"localhost\\\",\\\"localnet\\\"]}\",\n                \"oc.acl\": \"{\\\"permit\\\":[\\\"localhost\\\",\\\"localnet\\\"]}\",\n

The acl is stringified json object.

"},{"location":"common/acl/#run-the-xedit-application-from-your-local-network","title":"Run the xedit application from your local network","text":"

The xedit application is listed only if your are connected from a local network matching the previous rules.

Look for the application xedit, using the quick launch search text area on the bottom right corner. Insert the first character of xedit :

Launch the xedit application

"},{"location":"common/acl/#run-the-application-from-another-source-ip-address-or-update-the-acl-application","title":"Run the application from another source IP address or update the acl application","text":""},{"location":"common/acl/#update-acl-of-xedit-application","title":"Update acl of xedit application","text":"

To update the acl of xedit application, edit the edit.json file with the content, and set nowhere tag in acl array :

{\n    \"acl\": { \"permit\": [ \"nowhere\"  ] },\n    \"cat\": \"utilities\",\n    \"debpackage\": \"x11-apps\",\n    \"icon\": \"xedit.svg\",\n    \"keyword\": \"text,notepad,edit,txt,editor,xedit\",\n    \"launch\": \"xedit.Xedit\",\n    \"name\": \"xedit\",\n    \"displayname\": \"Xedit\",\n    \"path\": \"/usr/bin/xedit\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"application/text;\",\n    \"fileextensions\":\"txt;log;md\"\n}\n

Then, rebuild Dockerfile and the docker image of the xedit application

node make.js -f xedit.json Dockerfile\ndocker build -t xedit.d .\n
% node make.js -f xedit.json Dockerfile\nmyArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nopening file xedit.json\napplist.json entries: 1\nmyArgs:  [ '-f', 'xedit.json', 'Dockerfile' ]\nBuilding file Dockerfile as output\n{\n  acl: { permit: [ 'nowhere' ] },\n  cat: 'utilities',\n  debpackage: 'x11-apps',\n  icon: 'xedit.svg',\n  keyword: 'text,notepad,edit,txt,editor,xedit',\n  launch: 'xedit.Xedit',\n  name: 'xedit',\n  displayname: 'Xedit',\n  path: '/usr/bin/xedit',\n  template: 'abcdesktopio/oc.template.gtk',\n  mimetype: 'application/text;',\n  fileextensions: 'txt;log;md'\n}\nBuilding xedit.Xedit\n\n% docker build -t xedit.d .\n[+] Building 1.5s (11/11) FINISHED                                                                                                                                                                      \n => [internal] load build definition from Dockerfile                                                                                                                                               0.0s\n => => transferring dockerfile: 4.19kB                                                                                                                                                             0.0s\n => [internal] load .dockerignore                                                                                                                                                                  0.0s\n => => transferring context: 2B                                                                                                                                                                    0.0s\n => [internal] load metadata for docker.io/abcdesktopio/oc.template.gtk:dev                                                                                                                        1.4s\n => [auth] abcdesktopio/oc.template.gtk:pull token for registry-1.docker.io                                                                                                                        0.0s\n => [1/6] FROM docker.io/abcdesktopio/oc.template.gtk:dev@sha256:4aac32209c27a3e88906f39aecdfee6833bed022871366356bfd5518e2248b79                                                                  0.0s\n => CACHED [2/6] RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y  --no-install-recommends x11-apps && apt-get clean                                                        0.0s\n => CACHED [3/6] RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections                                                                                                0.0s\n => CACHED [4/6] RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi                                                                                        0.0s\n => CACHED [5/6] RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi                                                                                        0.0s\n => CACHED [6/6] WORKDIR /home/balloon                                                                                                                                                             0.0s\n => exporting to image                                                                                                                                                                             0.0s\n => => exporting layers                                                                                                                                                                            0.0s\n => => writing image sha256:640a4dd66b03420c4128e2fcd920dc5749cc5b687abc62b68e52f3c562943903                                                                                                       0.0s\n => => naming to docker.io/library/xedit.d       \n

Launch your web browser, and log in to your abcdesktop service

Check that xedit is not found and not listed.

The new acl does not allow the xedit application to be run and show. You can now define your own rules, add set the access control list to your applications.

"},{"location":"common/custom-wallpaper/","title":"Customize default wallpaper","text":""},{"location":"common/custom-wallpaper/#requirements","title":"Requirements","text":""},{"location":"common/custom-wallpaper/#goals","title":"Goals","text":""},{"location":"common/custom-wallpaper/#change-odconfig-file","title":"Change od.config file","text":"

To update the default wallpaper file, add a ENV variable in the desktop.envlocal dictionary.

desktop.envlocal :  {   'DISPLAY'               : ':0.0',\n                        'USER'                  : 'balloon',\n                        'LOGNAME'               : 'balloon',\n                        'LIBOVERLAY_SCROLLBAR'  : '0',\n                        'UBUNTU_MENUPROXY'      : '0',\n                        'HOME'                  : '/home/balloon',\n                          'SET_DEFAULT_WALLPAPER' : 'welcometoabcdesktop.png'\n                    } \n

"},{"location":"common/custom-wallpaper/#update-ocuser-image-to-add-your-own-wallpaper","title":"Update oc.user image to add your own wallpaper","text":""},{"location":"common/custom-wallpaper/#find-a-new-wallpaper-image","title":"Find a new wallpaper image","text":""},{"location":"common/custom-wallpaper/#create-a-new-ocuser-image","title":"Create a new oc.user image","text":"

Not For a development environment, add the TAG dev

FROM abcdesktopio/oc.user.18.04:dev \nUSER root\nCOPY silas-baisch-unsplash.jpg /composer/wallpapers\nUSER balloon\n

To build the new docker image, run the command line

docker build -t abcdesktopio/oc.user.18.04 .\n

You should read on the standard output :

Sending build context to Docker daemon  3.184MB\nStep 1/4 : FROM abcdesktopio/oc.user.18.04:dev\n ---> 61bfdb4e71d4\nStep 2/4 : USER root\n ---> Using cache\n ---> c1aa17b9999c\nStep 3/4 : COPY silas-baisch-unsplash.jpg /composer/wallpapers\n ---> 73c786ecca04\nStep 4/4 : USER balloon\n ---> Running in 1e0ad794c0cb\nRemoving intermediate container 1e0ad794c0cb\n ---> a0b12a183b47\nSuccessfully built a0b12a183b47\nSuccessfully tagged abcdesktopio/oc.user.18.04:dev\n
"},{"location":"common/custom-wallpaper/#change-odconfig-file_1","title":"Change od.config file","text":"

To update the default wallpaper file, add a ENV variable in the desktop.envlocal dictionary.

desktop.envlocal :  {   'DISPLAY'               : ':0.0',\n                        'USER'                  : 'balloon',\n                        'LOGNAME'               : 'balloon',\n                        'LIBOVERLAY_SCROLLBAR'  : '0',\n                        'UBUNTU_MENUPROXY'      : '0',\n                        'HOME'                  : '/home/balloon',\n                          'SET_DEFAULT_WALLPAPER' : 'silas-baisch-unsplash.jpg'\n                    } \n

"},{"location":"common/debug_application/","title":"How to debug containerised application","text":""},{"location":"common/debug_application/#requirements","title":"Requirements","text":""},{"location":"common/debug_application/#goals","title":"Goals","text":""},{"location":"common/debug_application/#read-log-from-web-interface","title":"Read log from web interface","text":"

Start an containerised application, I choose 2048 application, for example.

Using the web browser, choose Settings in the menu.

Choose Tasks to list all running containers

Choose Logs to read the stdout log file of an application

This application write on stdout

Error setting cipher RC4\n40F7D1D5D07F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:349:Global default library context, Algorithm (RC4 : 37), Properties ()\nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n
"},{"location":"common/debug_application/#read-log-from-daemon-interface-optionnal","title":"Read log from daemon interface (optionnal)","text":"

You will read the sample stdout line, using a docker logs command, open a shell on you host.

In a shell on your host, look for the container id of the 2048 containerised application

$ docker ps -a|grep 2048\n01579054a1f6   abcdesktopio/ubuntu-2048.d:3.0   \"/composer/appli-doc\u2026\"   21 minutes ago     Up 21 minutes                                                                   anonymous-ubuntu-2048-37830ad00d9f473aa4d0c7872089c6b8\n

Read the log file form the docker logs command

$ docker logs 01579054a1f6\n

You should read on output the same lines written on the web interface

Error setting cipher RC4\n40F7D1D5D07F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:349:Global default library context, Algorithm (RC4 : 37), Properties ()\nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n
"},{"location":"common/debug_application/#read-log-files-from-an-application-using-the-redirected-stderr-and-stdout","title":"Read log files from an application using the redirected stderr and stdout","text":"

The main log files are lastcmd.log lastcmdenv.log and $APPBIN.log:

By default, with all abcdesktop templates, applications redirect stderr to stdout and pipe to a tee.

${APP} ${ARGS} \"${APPARGS}\" 2>&1 | tee /tmp/$BASENAME_APP.log\n

By default, the /tmp volume is shared with all containers. So to debug and read log applications, you can run a webshell to have an access to stdout and stderr content.

The var $BASENAME_APP is the name of your application

BASENAME_APP=$(basename \"$APPBIN\")\n

and APPBIN is path to the binary

Example with the 2048-qt application

APPBIN=/usr/games/2048-qt\n

The /tmp directory, you can read the log file '/tmp/2048-qt.log'. Look at the /tmp directory

balloon:~$ ls -la /tmp/\ntotal 20\ndrwxrwxrwt 5 root    root     260 Dec  1 09:58 .\ndrwxr-xr-x 1 root    root    4096 Dec  1 09:55 ..\n-rw-r--r-- 1 balloon balloon  102 Dec  1 09:58 2048-qt.log\nsrwxrwxrwx 1 root    root       0 Dec  1 09:55 .cups.sock\n-rw-r--r-- 1 balloon balloon    0 Dec  1 09:57 gnome-2048.log\n-rw-r--r-- 1 balloon balloon 1175 Dec  1 09:58 lastcmdenv.log\n-rw-r--r-- 1 balloon balloon  437 Dec  1 09:58 lastcmd.log\ndrwx------ 2 balloon balloon   60 Dec  1 09:55 pulse-jkzlygT9Y7lT\nsrwxrwxrwx 1 balloon balloon    0 Dec  1 09:55 .pulse.sock\ndrwx------ 2 balloon balloon   40 Dec  1 09:58 runtime-balloon\n-r--r--r-- 1 balloon balloon   11 Dec  1 09:55 .X0-lock\ndrwxrwxrwt 2 root    root      60 Dec  1 09:55 .X11-unix\nsrw------- 1 balloon balloon    0 Dec  1 09:55 .x11vnc\nballoon:~$\n

The files are /tmp/lastcmd.log, /tmp/lastcmdenv.log and /tmp/2048-qt.log.

Dump the /tmp/2048-qt.log, with a cat command cat /tmp/2048-qt.log. Replace /tmp/2048-qt.log by your own application (binary) if you choose another application.

You can run all bash commands inside the webshell.

balloon:~$ cat /tmp/2048-qt.log \nQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-balloon'\nqml: Started a new game\n

Dump the /composer/appli-docker-entrypoint.sh result in /tmp/lastcmd.log, with a cat command cat /tmp/lastcmd.log.

balloon:~$ cat /tmp/lastcmd.log \nAPP=/usr/bin/gnome-2048\nARGS=\nAPPARGS=\nrun previous init overlay stack\nrun init app if exists\nBASENAME_APP=gnome-2048\nxauth add :0.0 MIT-MAGIC-COOKIE-1 55dd9838e9404e3b13b635153365d3\nsetting pulseaudio cookie\nend of app exit_code=0\n

Dump all environment variables in file /tmp/lastcmdenv.log.

balloon:/tmp$ cat /tmp/lastcmdenv.log \nBUSER=balloon\nSENDCUTTEXT=enabled\nPARENT_ID=2eecb67f5408c2552e7ee78b4fa2c9a419e9af9557c12c4d2f9f5c4fd1af70f4\nAPPBIN=/usr/games/2048-qt\nHOSTNAME=c477d8983486\nLANGUAGE=en_US\nSTDOUT_LOGFILE=/tmp/lastcmd.log\nLC_ADDRESS=en_US.UTF-8\nCUPS_SERVER=/tmp/.cups.sock\nLIBOVERLAY_SCROLLBAR=0\nLC_MONETARY=en_US.UTF-8\nPULSEAUDIO_COOKIE=17de4db317fbf10624911dbe28c528bd\nPWD=/home/balloon\nLOGNAME=balloon\nXAUTH_KEY=55dd9838e9404e3b13b635153365d3\nTZ=Europe/Paris\nHOME=/home/balloon\nLC_PAPER=en_US.UTF-8\nLANG=en_US.UTF-8\nACCEPTCUTTEXT=enabled\nAPP=/usr/games/2048-qt\nAPPNAME=ubuntu-2048\nDEBCONF_FRONTEND=noninteractive\nSET_DEFAULT_WALLPAPER=welcometoabcdesktop.png\nTERM=linux\nLC_IDENTIFICATION=en_US.UTF-8\nUSER=balloon\nDISPLAY=:0.0\nSHLVL=1\nLC_TELEPHONE=en_US.UTF-8\nLC_MEASUREMENT=en_US.UTF-8\nUBUNTU_MENUPROXY=0\nSTDOUT_ENVLOGFILE=/tmp/lastcmdenv.log\nBROADCAST_COOKIE=b7bc93457df5aa6bedb5ad2fe972268fa268bf3439b4024c\nLC_TIME=en_US.UTF-8\nLC_ALL=en_US.UTF-8\nPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nPULSE_SERVER=/tmp/.pulse.sock\nLC_NUMERIC=en_US.UTF-8\n

We describe how to read the environment variables, the stdout file and the stderr file, to get some information and error for a containerised application.

In next chapter we will start an application from a fresh ubuntu image, to get more details.

"},{"location":"common/firefox-extension/","title":"Mozilla Firefox clipboard extension","text":""},{"location":"common/firefox-extension/#install-firefox-extension-file","title":"Install Firefox Extension file","text":""},{"location":"common/firefox-extension/#download-the-mozilla-firefox-clipboard-extension-for-abcdesktop","title":"Download the Mozilla Firefox clipboard extension for abcdesktop","text":"
  1. Download the firefox clipboard extension abcdesktop_clipboard_helper.xpi and press Continue to Installation button.

  2. Choose Add as a response to the question Add abcdesktop Clipboad Helper ?

  3. Press OKay, Got it to confirm the abcdesktop Clipboad helper insallation

"},{"location":"common/firefox-extension/#use-fully-qualified-domain-name-filter","title":"Use fully qualified domain name filter","text":"

Firefox clipboard extension runs ONLY if the hostname contains desktop string.

The URL must matches *://*desktop*/*\" to run the clipboard extension.

"},{"location":"common/firefox-extension/#run-firefox-clipboard-extension-for-abcdesktop","title":"Run firefox clipboard extension for abcdesktop","text":"

Firefox clipboard extension syncs only text data, binary data like images are not yet supported.

"},{"location":"common/flash-firefox-esr/","title":"How to build and run abcdesktop firefox-esr image to run flash application","text":"

Adobe no longer supports Flash Player after December 31, 2020 and blocked Flash content from running in Flash Player beginning January 12, 2021.

Lot of applications need to be rewrite, this can take time to rewrite application using HTML5.

Abcdesktop can be use to run Abode Flash application, using Firefox ESR web browser.

Firefox Extended Support Release (ESR) is an official version of Firefox developed for large organizations like universities and businesses that need to set up and maintain Firefox on a large scale. Firefox ESR does not come with the latest features but it has the latest security and stability fixes.

"},{"location":"common/flash-firefox-esr/#goals","title":"Goals","text":""},{"location":"common/flash-firefox-esr/#requirements","title":"Requirements","text":""},{"location":"common/flash-firefox-esr/#edit-the-mmscfg-file","title":"Edit the mms.cfg file","text":"

Edit the mms.cfg file, and add your own website url

EOLUninstallDisable=1\nSilentAutoUpdateEnable=0\nAutoUpdateDisable=1\nEnableAllowList=1\nAllowListURLPattern=*://*.adobe.com\nAllowListURLPattern=https://*.abcdesktop.io\n

Add the a new line and replace https://www.domain.comby your own web site

AllowListURLPattern=https://www.domain.com\n
"},{"location":"common/flash-firefox-esr/#create-file-firefox-esrd","title":"Create file firefox-esr.d","text":"

Create a Dockerfile firefox-esr.d

FROM abcdesktopio/firefox-esr.d\nUSER 0\nCOPY mms.cfg /etc/adobe/mms.cfg\nUSER balloon\n
"},{"location":"common/flash-firefox-esr/#build-the-new-firefox-esr-abcdesktop-image","title":"Build the new firefox-esr abcdesktop image","text":"

Run the docker build command

docker build -t firefox-esr.d -f firefox-esr.d .\n
"},{"location":"common/flash-firefox-esr/#run-the-firefox-esr-application","title":"Run the firefox-esr application","text":""},{"location":"common/flash-firefox-esr/#login-to-your-abcdesktop-service","title":"Login to your abcdesktop service","text":"

Using you web browser, log in to your abcdesktop service

Look at the twice firefox icon for Firefox and Firefox-esr application.

Start the application Firefox-esr

Open you own flash website, or go to https://www.abcdesktop.io/flash sample web site

Click to the Run Adobe Flash plugins

And Allow the Adobe Flash to run

Great, you can run the Adobe Flash plugins.

"},{"location":"common/non-free-applications/","title":"Install non-free applications","text":""},{"location":"common/non-free-applications/#install-and-build-citrix-receiver-for-abcdesktop","title":"Install and build Citrix Receiver for abcdesktop","text":"

Citrix Workspace App or Citrix Receiver does not exist in official debian repository. You need to download the deb package from the www.citrix.com website manually.

git clone https://github.com/abcdesktopio/oc.apps.git\n
cd oc.apps\ncp ~/Download/icaclient_13.10.0.20_amd64.deb icaclient_amd64.deb \n
docker build --build-arg TAG=dev -t abcdesktopio/citrix.d:dev -f citrix.d .\n
Sending build context to Docker daemon  29.13MB\nStep 1/28 : ARG TAG=dev\nStep 2/28 : FROM abcdesktopio/oc.template.gtk.18.04:$TAG\n ---> c66ccd2edc52\nStep 3/28 : COPY icaclient_amd64.deb /tmp/icaclient_amd64.deb\n ---> Using cache\n ---> de6a2bcaa7c0\nStep 4/28 : RUN apt-get install  --no-install-recommends --yes /tmp/icaclient_amd64.deb && apt-get clean && rm /tmp/icaclient_amd64.deb\n ---> Using cache\n ---> 87e1ce530e44\nStep 5/28 : ENV BUSER balloon\n ---> Using cache\n ---> e4f474a17688\nStep 6/28 : LABEL oc.icon=\"icaclient.svg\"\n ---> Using cache\n ---> c6b12ecd898c\nStep 7/28 : LABEL oc.icondata=\"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmVyc2lvbj0iMSI+CiA8cmVjdCBzdHlsZT0ib3BhY2l0eTouMiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiB4PSItNTkiIHk9Ii02MCIgcng9IjI4IiByeT0iMjgiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTEsLTEsMCwwLDApIi8+CiA8cmVjdCBzdHlsZT0iZmlsbDojNGY0ZjRmIiB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHg9Ii01OCIgeT0iLTYwIiByeD0iMjgiIHJ5PSIyOCIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMSwtMSwwLDAsMCkiLz4KIDxwYXRoIHN0eWxlPSJvcGFjaXR5Oi4yIiBkPSJtMzIgMTFhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMTE3MmMtMTAuOTMzMjI0IDAuMTA0NTM5LTE5LjgwODYgOS4wMzA5Ny0xOS44MDg2IDE5Ljk4ODI4IDAgMTEuMDIyMDA2IDguOTc3OTk0IDIwIDIwIDIwIDEwLjk1NDY3OCAwIDE5Ljg3OTUyNC04Ljg3MTE4IDE5Ljk4ODI4Mi0xOS44MDA3ODJhMiAyIDAgMCAwIDAuMDExNzE4IC0wLjE5OTIxOCAyIDIgMCAwIDAgLTIgLTIgMiAyIDAgMCAwIC0yIDJjMCA4Ljg2MDI0Ni03LjEzOTc1NCAxNi0xNiAxNnMtMTYtNy4xMzk3NTQtMTYtMTYgNy4xMzk3NTQtMTYgMTYtMTZhMiAyIDAgMCAwIDIgLTIgMiAyIDAgMCAwIC0yIC0yem0wIDhhMiAyIDAgMCAwIC0wLjE5MTQgMC4wMDc4Yy02LjUxNTM3NCAwLjEwNDEyNi0xMS44MDg2IDUuNDUzMDUyLTExLjgwODYgMTEuOTkyMiAwIDYuNjAzNzI4IDUuMzk2MjcyIDEyIDEyIDEyIDYuNTM2NDUyIDAgMTEuODc5ODgtNS4yODkxMTIgMTEuOTg4MjgyLTExLjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDQuNDQxOTY4LTMuNTU4MDMyIDgtOCA4cy04LTMuNTU4MDMyLTgtOCAzLjU1ODAzMi04IDgtOGEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGE0IDQgMCAwIDAgLTQgNCA0IDQgMCAwIDAgNCA0IDQgNCAwIDAgMCA0IC00IDQgNCAwIDAgMCAtNCAtNHoiLz4KIDxwYXRoIHN0eWxlPSJmaWxsOiNmZmZmZmYiIGQ9Im0zMiAxMGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAxMTcyYy0xMC45MzMyMjQgMC4xMDQ1MzktMTkuODA4NiA5LjAzMDk3LTE5LjgwODYgMTkuOTg4MjggMCAxMS4wMjIwMDYgOC45Nzc5OTQgMjAgMjAgMjAgMTAuOTU0Njc4IDAgMTkuODc5NTI0LTguODcxMTggMTkuOTg4MjgyLTE5LjgwMDc4MmEyIDIgMCAwIDAgMC4wMTE3MTggLTAuMTk5MjE4IDIgMiAwIDAgMCAtMiAtMiAyIDIgMCAwIDAgLTIgMmMwIDguODYwMjQ2LTcuMTM5NzU0IDE2LTE2IDE2cy0xNi03LjEzOTc1NC0xNi0xNiA3LjEzOTc1NC0xNiAxNi0xNmEyIDIgMCAwIDAgMiAtMiAyIDIgMCAwIDAgLTIgLTJ6bTAgOGEyIDIgMCAwIDAgLTAuMTkxNCAwLjAwNzhjLTYuNTE1Mzc0IDAuMTA0MTI2LTExLjgwODYgNS40NTMwNTItMTEuODA4NiAxMS45OTIyIDAgNi42MDM3MjggNS4zOTYyNzIgMTIgMTIgMTIgNi41MzY0NTIgMCAxMS44Nzk4OC01LjI4OTExMiAxMS45ODgyODItMTEuODAwNzgyYTIgMiAwIDAgMCAwLjAxMTcxOCAtMC4xOTkyMTggMiAyIDAgMCAwIC0yIC0yIDIgMiAwIDAgMCAtMiAyYzAgNC40NDE5NjgtMy41NTgwMzIgOC04IDhzLTgtMy41NTgwMzItOC04IDMuNTU4MDMyLTggOC04YTIgMiAwIDAgMCAyIC0yIDIgMiAwIDAgMCAtMiAtMnptMCA4YTQgNCAwIDAgMCAtNCA0IDQgNCAwIDAgMCA0IDQgNCA0IDAgMCAwIDQgLTQgNCA0IDAgMCAwIC00IC00eiIvPgogPHBhdGggc3R5bGU9Im9wYWNpdHk6LjE7ZmlsbDojZmZmZmZmIiBkPSJtMzIgMmMtMTUuNTEyIDAtMjggMTIuNDg4LTI4IDI4IDAgMC4xMTM0NSAwLjAxMTI4MDUgMC4yMjQxMTMgMC4wMTc1NzgxIDAuMzM1OTM4IDAuMzUxNTQzMi0xNS4yMDE3NTcgMTIuNjkzMTQ5OS0yNy4zMzU5MzggMjcuOTgyNDIxOS0yNy4zMzU5MzhzMjcuNjMwODc5IDEyLjEzNDE4MSAyNy45ODI0MjIgMjcuMzM1OTM4YzAuMDA2Mjk4LTAuMTExODI1IDAuMDE3NTc4LTAuMjIyNDg4IDAuMDE3NTc4LTAuMzM1OTM4IDAtMTUuNTEyLTEyLjQ4OC0yOC0yOC0yOHoiLz4KPC9zdmc+Cg==\"\n ---> Using cache\n ---> cb5821f26574\nStep 8/28 : LABEL oc.keyword=\"ica,citrix,icaclient,\"\n ---> Using cache\n ---> 841fc5293542\nStep 9/28 : LABEL oc.cat=\"office\"\n ---> Using cache\n ---> b02b64fab112\nStep 10/28 : LABEL oc.desktopfile=\"wfica.desktop\"\n ---> Using cache\n ---> d8929c453992\nStep 11/28 : LABEL oc.launch=\"Wfica.Wfica\"\n ---> Using cache\n ---> 3c0001542ee6\nStep 12/28 : LABEL oc.template=\"abcdesktopio/oc.template.gtk.18.04\"\n ---> Using cache\n ---> c48014944a74\nStep 13/28 : ENV ARGS=\"-icaroot /opt/Citrix/ICAClient\"\n ---> Using cache\n ---> d242eb681417\nStep 14/28 : LABEL oc.name=\"citrix\"\n ---> Using cache\n ---> fee77a4b23d6\nStep 15/28 : LABEL oc.displayname=\"citrix-client\"\n ---> Using cache\n ---> 1fb6f9642a9f\nStep 16/28 : LABEL oc.path=\"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 0cba59460d1a\nStep 17/28 : LABEL oc.type=app\n ---> Using cache\n ---> a14be19dc259\nStep 18/28 : LABEL oc.showinview=\"dock\"\n ---> Using cache\n ---> 9ee26ab86b1d\nStep 19/28 : LABEL oc.mimetype=\"application/x-ica;\"\n ---> Using cache\n ---> 5536706365ef\nStep 20/28 : RUN  if [ -d /usr/share/icons ];   then cd /usr/share/icons;    /composer/safelinks.sh; fi\n ---> Using cache\n ---> 49a06d7adf22\nStep 21/28 : RUN  if [ -d /usr/share/pixmaps ]; then cd /usr/share/pixmaps;  /composer/safelinks.sh; fi\n ---> Using cache\n ---> 5090828ce15e\nStep 22/28 : WORKDIR /home/balloon\n ---> Using cache\n ---> ac6821413e1f\nStep 23/28 : USER balloon\n ---> Using cache\n ---> 7cbea5e541e8\nStep 24/28 : ENV APPNAME \"citrix\"\n ---> Using cache\n ---> a6662e5e1ea4\nStep 25/28 : ENV APPBIN \"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 475f164cc974\nStep 26/28 : LABEL oc.args=\"-icaroot /opt/Citrix/ICAClient\"\n ---> Using cache\n ---> b085c5a7c97d\nStep 27/28 : ENV APP \"/opt/Citrix/ICAClient/wfica\"\n ---> Using cache\n ---> 534994e86953\nStep 28/28 : LABEL oc.usedefaultapplication=true\n ---> Using cache\n ---> 5cd6ea7a4228\nSuccessfully built 5cd6ea7a4228\nSuccessfully tagged abcdesktopio/citrix.d:dev\n
"},{"location":"common/shm/","title":"IPC and pod","text":"

Does a pod can share memory between his container ? Does Posix shared memory work with containers ? Does System V shared memory work with containers ?

Let's have a look !

There are two ways to use shared memory in Linux: System V and POSIX.

"},{"location":"common/shm/#requirements","title":"Requirements","text":""},{"location":"common/shm/#install-the-bash-and-yaml-files","title":"Install the bash and yaml files","text":"

To install the bash and yaml files, run the command

git clone https://github.com/abcdesktopio/podshmtest.git\ncd podshmtest\n
"},{"location":"common/shm/#shared-memory","title":"Shared memory","text":""},{"location":"common/shm/#system-v-shared-memory","title":"System V shared memory","text":"

Goal: Test System V shared memory between two containers inside the same pod

This test creates two containers a sender and a receiver. The sender writes a string in a share memory and the receiver read the string.

The test is successful if there is no system error and the strings are equals.

The string MemContents stored in the shared memory is : This is the way the world ends...

    int exit_code = -1;\n    // ftok to generate unique key \n    key_t key = ftok(\"/shared/shmfile\",65);\n    // shmget returns an identifier in shmid \n    int shmid = shmget(key,1024,0666|IPC_CREAT);\n    // shmat to attach to shared memory \n    char *str = (char*) shmat(shmid,(void*)0,0);\n    strcpy( str, MemContents );\n    //detach from shared memory  \n    exit_code = shmdt(str);\n
    // ftok to generate unique key \n    key_t key = ftok(\"/shared/shmfile\",65);\n    // shmget returns an identifier in shmid \n    int shmid = shmget(key,1024,0666|IPC_CREAT);\n    // shmat to attach to shared memory \n    char *str = (char*) shmat(shmid,(void*)0,0);\n    printf(\"%s\\n\",str);\n    cmp_code = strcmp( str, MemContents );\n    //detach from shared memory  \n    exit_code = shmdt(str);\n

To run the System V tests

"},{"location":"common/shm/#run-a-shared-memory-test-access-using-a-shared-path","title":"Run a shared memory test access using a shared path","text":"

In this yaml file, sender and receiver containers share a file. This file is /shared/me and it is the first parameter to ftok system V call.

apiVersion: v1\nkind: Pod\nmetadata:\n  name: podsysvsendershmtest\nspec:\n  shareProcessNamespace: true\n  restartPolicy : Never\n  volumes:\n    - name: shared \n      emptyDir: {}\n  containers:\n    - name: sender\n      imagePullPolicy: IfNotPresent\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/shared/me\"\n    - name: receiver\n      imagePullPolicy: IfNotPresent\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/shared/me\"\n

The env var FTOK_PATH set the first parameter to ftok system V call.

Run the test

# this test result is success\n./runtest.sh podsendershared_success.yaml\n

You can read the same string from sender to receive container.

This test is OK.

pod/podsysvsendershmtest created\npod/podsysvsendershmtest condition met\n**** Start sender ****\nsender starts\nidentity of the file named FTOK_PATH=/shared/me\nsending success This is the way the world ends...\n**** Read on receiver **** \nreceive starts\nidentity of the file named FTOK_PATH=/shared/me\nread This is the way the world ends...\n
"},{"location":"common/shm/#run-a-shared-memory-test-access-without-shared-path","title":"Run a shared memory test access without shared path","text":"

In this yaml file, sender and receiver do not share file. /dummy filename is the first parameter to ftok system V call.

apiVersion: v1\nkind: Pod\nmetadata:\n  name: podsysvsendershmtest\nspec:\n  shareProcessNamespace: true\n  restartPolicy : Never\n  volumes:\n    - name: shared \n      emptyDir: {}\n  containers:\n    - name: sender\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/dummy\"\n    - name: receiver\n      image: abcdesktopio/ipctest\n      command: [ \"/bin/sleep\", \"1d\" ]\n      volumeMounts:\n      - name: shared\n        mountPath: /shared\n      env:\n      - name: FTOK_PATH\n        value: \"/dummy\"\n

The env var FTOK_PATH set the first parameter to ftok system V call.

Run the test

# this test result is failed\n./runtest.sh podsendershared_failed.yaml\n

You can read that the sender write a string. The receiver does not read this string.

This test is KO.

pod \"podsysvsendershmtest\" deleted\npod/podsysvsendershmtest created\npod/podsysvsendershmtest condition met\n**** Start sender ****\nsender starts\nidentity of the file named FTOK_PATH=/dummy\nsending success This is the way the world ends...\n**** Read on receiver **** \nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\nreceive starts\nidentity of the file named FTOK_PATH=/dummy\nmain: ftok() for shm failed\nthis is an unlimited loop, waiting 5s\n...\n^C\ncommand terminated with exit code 130\n

The ftok() function uses the identity of the file named by the given pathname (which must refer to an existing, accessible file) The file named by the given pathname must be shared by using a volume between containers

"},{"location":"common/shm/#posix-shared-memory","title":"POSIX shared memory","text":"

Goal: Test Posix shared memory between two containers inside the same pod

The source code is from inter-process communication in Linux: Shared storage Learn how processes synchronize with each other in Linux . The author is Marty Kalin

This test creates two containers a sender and a receiver to read a shared memory in /dev/shm, it uses a semaphore as a mutex (lock) by waiting for writer to increment it.

The string MemContents stored in the shared memory is : This is the way the world ends...

  int fd = shm_open(BackingFile,      /* name from smem.h */\n                    O_RDWR | O_CREAT, /* read/write, create if needed */\n                    AccessPerms);     /* access permissions (0644) */\n  if (fd < 0) report_and_exit(\"Can't open shared mem segment...\");\n\n  ftruncate(fd, ByteSize); /* get the bytes */\n\n  caddr_t memptr = mmap(NULL,       /* let system pick where to put segment */\n                        ByteSize,   /* how many bytes */\n                        PROT_READ | PROT_WRITE, /* access protections */\n                        MAP_SHARED, /* mapping visible to other processes */\n                        fd,         /* file descriptor */\n                        0);         /* offset: start at 1st byte */\n  if ((caddr_t) -1  == memptr) report_and_exit(\"Can't get segment...\");\n\n  fprintf(stderr, \"shared mem address: %p [0..%d]\\n\", memptr, ByteSize - 1);\n  fprintf(stderr, \"backing file:       /dev/shm%s\\n\", BackingFile );\n\n  /* semahore code to lock the shared mem */\n  sem_t* semptr = sem_open(SemaphoreName, /* name */\n                           O_CREAT,       /* create the semaphore */\n                           AccessPerms,   /* protection perms */\n                           0);            /* initial value */\n  if (semptr == (void*) -1) report_and_exit(\"sem_open\");\n\n  strcpy(memptr, MemContents); /* copy some ASCII bytes to the segment */\n\n  /* increment the semaphore so that memreader can read */\n  if (sem_post(semptr) < 0) report_and_exit(\"sem_post\");\n\n  sleep(12); /* give reader a chance */\n\n  /* clean up */\n  munmap(memptr, ByteSize); /* unmap the storage */\n  close(fd);\n  sem_close(semptr);\n  shm_unlink(BackingFile); /* unlink from the backing file */\n\n
  int fd = shm_open(BackingFile, O_RDWR, AccessPerms);  /* empty to begin */\n  if (fd < 0) report_and_exit(\"Can't get file descriptor...\");\n\n  /* get a pointer to memory */\n  caddr_t memptr = mmap(NULL,       /* let system pick where to put segment */\n                        ByteSize,   /* how many bytes */\n                        PROT_READ | PROT_WRITE, /* access protections */\n                        MAP_SHARED, /* mapping visible to other processes */\n                        fd,         /* file descriptor */\n                        0);         /* offset: start at 1st byte */\n  if ((caddr_t) -1 == memptr) report_and_exit(\"Can't access segment...\");\n\n  /* create a semaphore for mutual exclusion */\n  sem_t* semptr = sem_open(SemaphoreName, /* name */\n                           O_CREAT,       /* create the semaphore */\n                           AccessPerms,   /* protection perms */\n                           0);            /* initial value */\n  if (semptr == (void*) -1) report_and_exit(\"sem_open\");\n\n  /* use semaphore as a mutex (lock) by waiting for writer to increment it */\n  if (!sem_wait(semptr)) { /* wait until semaphore != 0 */\n    int i;\n    for (i = 0; i < strlen(MemContents); i++)\n      write(STDOUT_FILENO, memptr + i, 1); /* one byte at a time */\n    sem_post(semptr);\n  }\n\n  /* cleanup */\n  munmap(memptr, ByteSize);\n  close(fd);\n  sem_close(semptr);\n  unlink(BackingFile);\n

To run the POSIX test

kubectl create -f podposixshm.yaml \npod/podposixshm created\n

The podposixshm pod status must be Completed

kubectl get pods podposixshm  \nNAME          READY   STATUS      RESTARTS   AGE\npodposixshm   0/2     Completed   0          27s\n

The podposixshm sender log file should be :

kubectl logs pod/podposixshm sender\nshared mem address: 0x7fc0ea582000 [0..511]\nbacking file:       /dev/shm/shMemEx\n

The pod/podposixshm receiver log file should be :

kubectl logs pod/podposixshm receiver\nThis is the way the world ends...\n

Delete the podposixshm pod

kubectl delete pods podposixshm \npod \"podposixshm\" deleted\n
"},{"location":"common/shm/#read-the-shared-memory-default-limit","title":"Read the shared memory default limit","text":"

On a pod, we can see that the default size of /dev/shm is 64MB, when running the df /dev/shm command.

kubectl run -it --image alpine:edge shmtest -- sh\nIf you don't see a command prompt, try pressing enter.\n
df /dev/shm\nFilesystem           1K-blocks      Used Available Use% Mounted on\nshm                      65536     65536         0 100% /dev/shm\n

A dd command confirm this limit. it will throw an exception when it reaches 64MB: \u201cNo space left on device\u201d.

Run the dd command

dd if=/dev/zero of=/dev/shm/test\ndd: error writing '/dev/shm/test': No space left on device\n131073+0 records in\n131072+0 records out\n

Run the df /dev/shm command

df /dev/shm\nFilesystem           1K-blocks      Used Available Use% Mounted on\nshm                      65536     65536         0 100% /dev/shm\n

Delete the shmtest pod

kubectl delete pods shmtest\npod \"shmtest\" deleted\n

The default size is 64 MB.

"},{"location":"common/shm/#increase-the-shared-memory-default-limit","title":"Increase the shared memory default limit","text":"

Create a updateshm.yaml file with the yaml content

apiVersion: v1\nkind: Pod\nmetadata:\n  labels:\n    run: updateshm\n  name: updateshm\nspec:\n  volumes:                          \n    - name: volumeshm\n      emptyDir:\n        medium: Memory\n  containers:\n  - image: alpine:edge\n    name: updateshm\n    args: \n      - 1d \n    command: \n      - /bin/sleep\n    volumeMounts:                 \n        - mountPath: /dev/shm\n          name: volumeshm\n  dnsPolicy: ClusterFirst\n  restartPolicy: Never\n

Create the new pod updateshm

kubectl apply -f updateshm.yaml \npod/updateshm created\n

Execute a df /dev/shm command inside this pods to read the size of /dev/shm

kubectl exec updateshm -- df /dev/shm\nFilesystem           1K-blocks      Used Available Use% Mounted on\ntmpfs                 16176264         0  16176264   0% /dev/shm\n

The size of /dev/shm is 16176264 of 1K blocks. The new default size is 16 GB.

To set a fixed limit use the sizeLimit in the spec.volumes

apiVersion: v1\nkind: Pod\nmetadata:\n  labels:\n    run: updateshm512\n  name: updateshm512\nspec:\n  volumes:                          \n    - name: updateshm512\n      emptyDir:\n        medium: Memory\n        sizeLimit: 512Mi\n  containers:\n  - image: alpine:edge\n    name: updateshm\n    args: \n      - 1d \n    command: \n      - /bin/sleep\n    volumeMounts:                 \n        - mountPath: /dev/shm\n          name: updateshm512\n  dnsPolicy: ClusterFirst\n  restartPolicy: Never\n
"},{"location":"common/upload_and_download_files/","title":"Upload and Download files in your desktop","text":""},{"location":"common/upload_and_download_files/#goals","title":"Goals","text":""},{"location":"common/upload_and_download_files/#upload-file-in-your-desktop","title":"Upload file in your desktop","text":"

To upload file into your local storage, just use a drag & drop, from your device to you adcdesktop

Then, start the filemanager, your new file is located in your home directory

"},{"location":"common/upload_and_download_files/#download-file-from-your-desktop","title":"Download file from your desktop","text":"

To download file from your abcdesktop to you local storage, just start the file manager.

Choose your file and using the right mouse button, choose the menu option Download for Desktop as describe :

The file is downloaded by your web browser

The file is located in your Downloads directory

Great, you have uploaded and downloaded files with your abcdesktop, you can now use abcdesktop.io applications to edit all your files.

"},{"location":"common/1.0/abcdesktop.bastion/","title":"Setup guide to use abcdesktop.io as bastion service","text":""},{"location":"common/1.0/abcdesktop.bastion/#design","title":"Design","text":"

The goal of this setup guide is to install abcdesktio.io as a bastion service, with only one virtual machine

"},{"location":"common/1.0/abcdesktop.bastion/#script-and-vagrant-file","title":"script and vagrant file","text":""},{"location":"common/1.0/abcdesktop.bastion/#get-script-and-vagrant-file","title":"get script and vagrant file","text":"

To get the installation script and the vagrant file, run the command

git clone https://github.com/abcdesktopio/vagrant.git\n
"},{"location":"common/1.0/abcdesktop.bastion/#start-vagrant-file-to-run-the-kmaster-vm","title":"start vagrant file to run the kmaster vm","text":"

Run the command to run the vagrant file

$ cd vagrant\n$ VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant up\n

This vagrant file defines a vm kmaster :

kmaster.vm.box = \"hashicorp/bionic64\"\nkmaster.vm.hostname = \"kmaster.example.com\"\n# By default, Vagrant uses a netmask of 255.255.255.0\n# config.vm.network :hostonly, \"10.11.12.13\", :netmask => \"255.255.0.0\"\nkmaster.vm.network \"private_network\", ip: \"172.42.42.100\"\nkmaster.vm.network \"private_network\", ip: \"10.9.1.100\", virtualbox__intnet: true\nkmaster.vm.network \"private_network\", ip: \"192.168.29.100\", virtualbox__intnet: true\nkmaster.vm.network \"forwarded_port\", guest: 30443, host: 30443\nkmaster.vm.provider \"virtualbox\" do |v|\n  v.name = \"kmaster\"\n  v.memory = 4096\n  v.cpus = 4\nend\nkmaster.vm.provision \"shell\", path: \"abcdesktop_kubernetes_bastion.sh\"\n

It forward the host tcp port 30443 to guest port 30443 ( mapped as a host port in kubernetes )

All networks are defined as private_network to make it simplest as possible.

"},{"location":"common/1.0/abcdesktop.bastion/#abcdesktop_kubernetes_bastionsh-description","title":"abcdesktop_kubernetes_bastion.sh description","text":"

abcdesktop_kubernetes_bastion.sh takes more than eight minutes to install all services, from an ubuntu bionic 64 hashicorp/bionic64 :

Read step by step the abcdesktop_kubernetes_bastion.sh content to get more details.

You can read the vagrant stdout file as example abcdesktop kubernetes bastion install log file

"},{"location":"common/1.0/abcdesktop.bastion/#login-to-get-a-ssh-into-the-kmaster-vm","title":"login to get a ssh into the kmaster vm","text":"
VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n

List kube-system pods and abcdesktop pods

To run kubectl commands inside the master virtual machine

export KUBECONFIG=/etc/kubernetes/admin.conf \n
vagrant@kmaster:~$ kubectl get pods -n kube-system\nNAME                              READY   STATUS    RESTARTS   AGE\ncoredns-64897985d-4d57p           1/1     Running   0          11h\ncoredns-64897985d-qtmkq           1/1     Running   0          11h\netcd-kmaster                      1/1     Running   0          11h\nkube-apiserver-kmaster            1/1     Running   0          11h\nkube-controller-manager-kmaster   1/1     Running   0          11h\nkube-flannel-ds-gskrs             1/1     Running   0          11h\nkube-proxy-c566l                  1/1     Running   0          11h\nkube-scheduler-kmaster            1/1     Running   0          11h\n
vagrant@kmaster:~$ kubectl get pods -n abcdesktop\nNAME                            READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-pt2j6           1/1     Running   0          11h\ndaemonset-pyos-zqpf7            1/1     Running   0          11h\nmemcached-od-78578c879-kstcl    1/1     Running   0          11h\nmongodb-od-5c68794bb8-wf6sm     1/1     Running   0          11h\nopenldap-od-558f7959d5-vhbln    1/1     Running   0          11h\nspeedtest-od-7b66cc656b-fh97g   1/1     Running   0          11h\n
"},{"location":"common/1.0/abcdesktop.bastion/#login-as-a-user","title":"Login as a user","text":""},{"location":"common/1.0/abcdesktop.bastion/#connect-your-local-abcdesktop","title":"Connect your local abcdesktop","text":"

Open your web browser to

http://[your-ip-hostname]:30443/\n

Replace [your-ip-hostname] by the host node IP address

You should get the web page

"},{"location":"common/1.0/abcdesktop.bastion/#log-in-as","title":"Log in as","text":"

abcdesktop adds an OpenLDAP server for testing LDAP applications, i.e. unit tests. The ldap server is used to authenticate user. To get more informations about the OpenLDAP server and the account detail, read ldap server

Login Accounts Login Password Hubert J. Farnsworth professor Philip J. Fry fry Hermes Conrad hermes Turanga Leela leela Bender Bending Rodr\u00edguez bende

Use the credentials, to login

"},{"location":"common/1.0/abcdesktop.bastion/#get-the-default-desktop","title":"Get the default desktop","text":"

After the login, you should get the default desktop.

"},{"location":"common/1.0/abcdesktop.bastion/#run-a-web-shell-process","title":"Run a web shell process","text":"

To start a shell, insert webshell as keywords in the search text area :

"},{"location":"common/1.0/abcdesktop.bastion/#run-ifconfig-command-to-list-network-interfaces","title":"Run ifconfig command to list network interfaces","text":"

In the web shell, run the command

$ ifconfig -a\n

This command shows the network interfaces net1 and net2 with the associated ip address

"},{"location":"common/1.0/abcdesktop.bastion/#tag-and-rules","title":"Tag and rules","text":"
VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
vagrant@kmaster:~$ sudo bash\n
"},{"location":"common/1.0/abcdesktop.bastion/#config-file-abcdesktopyaml","title":"Config file abcdesktop.yaml","text":"

Open the abcdesktop.yaml configuration file, and look at ldapconfig

    ldapconfig : { 'planet': {  'default'       : True,\n                                'ldap_timeout'  : 15,\n                                'ldap_protocol' : 'ldap',\n                                'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                                'servers'       : [ 'openldap.abcdesktop.svc.cluster.local' ],\n                                'secure'        : False,\n                                'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n                                'policies': {\n                                    'acls': None,\n                                    'rules' : {\n                                        'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com',   'expected' : True  } ], 'expected' : True, 'label': 'shipcrew'   },\n                                        'rule-test': { 'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com', 'expected' : True  } ], 'expected' : True, 'label': 'adminstaff' } } } } }\n
"},{"location":"common/1.0/abcdesktop.bastion/#rules-description","title":"Rules description","text":"

In the abcdesktop.yaml configuration file, and look at the desktop.policies and the network option

 desktop.policies: {\n        'rules': {\n            'network': {\n                'shipcrew': {\n                    'annotations' : {\n                        'k8s.v1.cni.cncf.io/networks': '[ {\"name\":\"macvlan-conf-eth3\"}, { \"name\":\"macvlan-conf-eth2\", \"default-route\": [\"10.9.1.100\"] } ]'\n                    }\n                }\n            }\n        },\n        'acls' : {} }\n

If a pod as the 'shipcrew' tag, then add the network annotations

[ \n    {   \"name\": \"macvlan-conf-eth3\"}, \n    {   \"name\": \"macvlan-conf-eth2\", \"default-route\": [\"10.9.1.100\"] }\n]\n
"},{"location":"common/1.0/abcdesktop.bastion/#list-pods-and-labels-in-abcdesktop-namespace","title":"List pods and labels in abcdesktop namespace","text":"

To list pod in the abcdesktop namespace, run the command

export KUBECONFIG=/etc/kubernetes/admin.conf \nkubectl get pods -n abcdesktop \n
root@kmaster:~# export KUBECONFIG=/etc/kubernetes/admin.conf \nroot@kmaster:~# kubectl get pods -n abcdesktop\nNAME                                       READY   STATUS    RESTARTS   AGE\ndaemonset-nginx-5dzjc                      1/1     Running   0          151m\ndaemonset-pyos-szs8h                       1/1     Running   0          151m\nfry-02579a7f-a464-4cdb-bb79-5d4d4a844308   3/3     Running   0          86m\nmemcached-od-78578c879-vx26h               1/1     Running   0          151m\nmongodb-od-6568f85897-tgfjb                1/1     Running   0          151m\nopenldap-od-558f7959d5-qz2kg               1/1     Running   0          151m\nspeedtest-od-76d578578d-rl8k8              1/1     Running   0          151m\n
"},{"location":"common/1.0/abcdesktop.bastion/#describe-pods-fry","title":"Describe pods fry","text":"

Run the command

kubectl describe pods YOUR_POD\n

Replace YOUR_POD by your pod

root@kmaster:~# kubectl describe pods fry-02579a7f-a464-4cdb-bb79-5d4d4a844308 -n abcdesktop\nName:         fry-02579a7f-a464-4cdb-bb79-5d4d4a844308\nNamespace:    abcdesktop\nPriority:     0\nNode:         kmaster/10.0.2.15\nStart Time:   Mon, 31 Jan 2022 16:14:16 +0000\nLabels:       access_provider=planet\n              access_userid=FRY\n              access_username=philip_j__fry\n              broadcast_cookie=f7ee45615acce9c5fbed2607d35471264d6c6c14b5cd5778\n              domain=desktop\n              netpol/ocuser=true\n              pulseaudio_cookie=f7cfdfb7b4227e816f3ad59f9d122fac49674a1a60455951\n              shipcrew=true\n              type=x11server\n              xauthkey=ad9e3675cb184db9b6c9eee4852a94est-od-76d578578d-rl8k8\n

The label shipcrew=true is set

Annotations:  k8s.v1.cni.cncf.io/network-status:\n                [{\n                    \"name\": \"cbr0\",\n                    \"interface\": \"eth0\",\n                    \"ips\": [\n                        \"10.244.0.12\"\n                    ],\n                    \"mac\": \"06:17:a7:0c:24:9b\",\n                    \"default\": true,\n                    \"dns\": {}\n                },{\n                    \"name\": \"abcdesktop/macvlan-conf-eth3\",\n                    \"interface\": \"net1\",\n                    \"ips\": [\n                        \"192.168.29.12\"\n                    ],\n                    \"mac\": \"3a:db:a1:33:53:72\",\n                    \"dns\": {}\n                },{\n                    \"name\": \"abcdesktop/macvlan-conf-eth2\",\n                    \"interface\": \"net2\",\n                    \"ips\": [\n                        \"10.9.1.12\"\n                    ],\n                    \"mac\": \"86:eb:43:fe:db:e7\",\n                    \"dns\": {}\n                }]\n

The Annotations k8s.v1.cni.cncf.io/network-status describes the network interfaces inside the pod.

"},{"location":"common/1.0/abcdesktop.bastion/#look-at-the-pre-installed-network-rules","title":"Look at the pre installed network rules","text":"

Run the command

kubectl get net-attach-def -n abcdesktop\n
root@kmaster:~#  kubectl get net-attach-def -n abcdesktop\nNAME                AGE\nmacvlan-conf-eth2   154m\nmacvlan-conf-eth3   154m\n

Get more details about macvlan-conf-eth3

root@kmaster:~# kubectl describe net-attach-def macvlan-conf-eth3 -n abcdesktop\nName:         macvlan-conf-eth3\nNamespace:    abcdesktop\nLabels:       <none>\nAnnotations:  <none>\nAPI Version:  k8s.cni.cncf.io/v1\nKind:         NetworkAttachmentDefinition\nMetadata:\n  Creation Timestamp:  2022-01-31T15:10:38Z\n  Generation:          1\n  Managed Fields:\n    API Version:  k8s.cni.cncf.io/v1\n    Fields Type:  FieldsV1\n    fieldsV1:\n      f:metadata:\n        f:annotations:\n          .:\n          f:kubectl.kubernetes.io/last-applied-configuration:\n      f:spec:\n        .:\n        f:config:\n    Manager:         kubectl-client-side-apply\n    Operation:       Update\n    Time:            2022-01-31T15:10:38Z\n  Resource Version:  1008\n  UID:               a5b0d3a0-52c4-42da-887b-8de73cff2b1c\nSpec:\n  Config:  { \"cniVersion\": \"0.3.0\", \"type\": \"macvlan\", \"master\": \"eth3\", \"mode\": \"bridge\", \"ipam\": { \"type\": \"host-local\", \"subnet\": \"192.168.29.0/24\", \"rangeStart\": \"192.168.29.10\", \"rangeEnd\": \"192.168.29.99\", \"gateway\": \"192.168.29.100\" } }\nEvents:    <none>\n

macvlan-conf-eth3 is used by the user's pod.

"},{"location":"common/1.0/abcdesktop.bastion/#list-multi-policy","title":"List multi-policy","text":"

To list multi-policy, run the command

kubectl get multi-policy -n abcdesktop\n
root@kmaster:~# kubectl get multi-policy -n abcdesktop\nNAME                  AGE\nmnp-permit-shipcrew   3h\n

And get description about the policy mnp-permit-shipcrew

apiVersion: k8s.cni.cncf.io/v1beta1\nkind: MultiNetworkPolicy\nmetadata:\n  name: mnp-permit-shipcrew\n  namespace: abcdesktop \n  annotations:\n    k8s.v1.cni.cncf.io/policy-for: macvlan-conf-eth3\nspec:\n  podSelector:\n    matchLabels:\n      shipcrew: 'true' \n  policyTypes:\n  - Egress\n  egress:\n  - to:\n    - ipBlock: \n        cidr: 192.168.55.21/32\n    - ipBlock:\n        cidr: 192.168.55.22/32\n    ports:\n      - protocol: TCP\n        port: 22\n

If a pod in the abcdesktop namespace, contains a label shipcrew: 'true' set the iptables to permit egress to host 192.168.55.21/32 and 192.168.55.22/32 using protocol TCP destination port 22.

"},{"location":"common/1.0/abcdesktop.bastion/#dump-the-generated-by-iptables-in-varlibmulti-networkpolicyiptables","title":"dump the generated by iptables in /var/lib/multi-networkpolicy/iptables/","text":"
VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
vagrant@kmaster:~$ sudo bash\n
root@kmaster:~# ls /var/lib/multi-networkpolicy/iptables/\nafe82680-77b4-4bac-ad2b-8be9488402fb\n

A new afe82680-77b4-4bac-ad2b-8be9488402fb exists

root@kmaster:~# cat /var/lib/multi-networkpolicy/iptables/afe82680-77b4-4bac-ad2b-8be9488402fb/current.iptables \n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*mangle\n:PREROUTING ACCEPT [441:57462]\n:INPUT ACCEPT [441:57462]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [370:150632]\n:POSTROUTING ACCEPT [367:150476]\nCOMMIT\n# Completed on Mon Jan 31 16:16:22 2022\n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*filter\n:INPUT ACCEPT [0:0]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [0:0]\n:MULTI-0-EGRESS - [0:0]\n:MULTI-0-EGRESS-0-PORTS - [0:0]\n:MULTI-0-EGRESS-0-TO - [0:0]\n:MULTI-EGRESS - [0:0]\n:MULTI-INGRESS - [0:0]\n-A INPUT -i net2 -j MULTI-INGRESS\n-A INPUT -i net1 -j MULTI-INGRESS\n-A OUTPUT -o net2 -j MULTI-EGRESS\n-A OUTPUT -o net1 -j MULTI-EGRESS\n-A MULTI-0-EGRESS -j MARK --set-xmark 0x0/0x30000\n-A MULTI-0-EGRESS -j MULTI-0-EGRESS-0-PORTS\n-A MULTI-0-EGRESS -j MULTI-0-EGRESS-0-TO\n-A MULTI-0-EGRESS -m mark --mark 0x30000/0x30000 -j RETURN\n-A MULTI-0-EGRESS -j DROP\n-A MULTI-0-EGRESS-0-PORTS -o net1 -p tcp -m tcp --dport 22 -j MARK --set-xmark 0x10000/0x10000\n-A MULTI-0-EGRESS-0-TO -d 192.168.55.21/32 -o net1 -j MARK --set-xmark 0x20000/0x20000\n-A MULTI-0-EGRESS-0-TO -d 192.168.55.22/32 -o net1 -j MARK --set-xmark 0x20000/0x20000\n-A MULTI-EGRESS -o net1 -m comment --comment \"policy:mnp-permit-shipcrew net-attach-def:abcdesktop/macvlan-conf-eth3\" -j MULTI-0-EGRESS\nCOMMIT\n# Completed on Mon Jan 31 16:16:22 2022\n# Generated by iptables-save v1.4.21 on Mon Jan 31 16:16:22 2022\n*nat\n
"},{"location":"common/1.0/abcdesktop.bastion/#add-some-applications-to-your-desktop","title":"Add some applications to your desktop","text":"

For abcdesktop a desktop application is a container image. To add an application you just need to pull an container image.

VAGRANT_VAGRANTFILE=Vagrantfile.kubernetes.bastion vagrant ssh\n
vagrant@kmaster:~$ sudo bash\n
root@kmaster:~# docker images\nREPOSITORY                                                  TAG       IMAGE ID       CREATED         SIZE\nabcdesktopio/oc.pyos                                        dev       6bd8b8d33b73   19 hours ago    1.17GB\nrancher/mirrored-flannelcni-flannel                         v0.16.3   8cb5de74f107   3 days ago      59.7MB\nmemcached                                                   latest    fa6cf68061c2   5 days ago      89.1MB\nk8s.gcr.io/kube-apiserver                                   v1.23.3   f40be0088a83   6 days ago      135MB\nk8s.gcr.io/kube-controller-manager                          v1.23.3   b07520cd7ab7   6 days ago      125MB\nk8s.gcr.io/kube-scheduler                                   v1.23.3   99a3486be4f2   6 days ago      53.5MB\nk8s.gcr.io/kube-proxy                                       v1.23.3   9b7cc9982109   6 days ago      112MB\nabcdesktopio/oc.user.18.04                                  latest    52176672cf2e   7 days ago      1.79GB\nabcdesktopio/oc.user.ssh.18.04                              dev       52176672cf2e   7 days ago      1.79GB\nghcr.io/k8snetworkplumbingwg/multi-networkpolicy-iptables   latest    54838d8bbd14   10 days ago     408MB\nrancher/mirrored-flannelcni-flannel-cni-plugin              v1.0.1    ac40ce625740   12 days ago     8.1MB\nabcdesktopio/oc.nginx                                       dev       fe71c8621ef2   12 days ago     506MB\nabcdesktopio/oc.pulseaudio.18.04                            dev       d44997a46969   2 months ago    170MB\nabcdesktopio/oc.pulseaudio.18.04                            latest    d44997a46969   2 months ago    170MB\nk8s.gcr.io/etcd                                             3.5.1-0   25f8c7f3da61   3 months ago    293MB\nghcr.io/k8snetworkplumbingwg/multus-cni                     stable    e6cafb5d5aa1   3 months ago    290MB\nk8s.gcr.io/coredns/coredns                                  v1.8.6    a4ca41631cc7   3 months ago    46.8MB\nabcdesktopio/oc.cupsd.18.04                                 dev       095105a59722   4 months ago    745MB\nabcdesktopio/oc.cupsd.18.04                                 latest    095105a59722   4 months ago    745MB\nk8s.gcr.io/pause                                            3.6       6270bb605e12   5 months ago    683kB\nrroemhild/test-openldap                                     latest    c6b1bec361ca   10 months ago   144MB\nabcdesktopio/oc.mongo                                       latest    802219537d3b   12 months ago   493MB\nabcdesktopio/oc.speedtest                                   dev       298a391cfb5b   3 years ago     355MB\n

To add an application like Firefox, run the docker pull command :

root@kmaster:~# docker pull abcdesktopio/firefox.d:dev\n
docker pull abcdesktopio/firefox.d:dev\ndev: Pulling from abcdesktopio/firefox.d\n7b1a6ab2e44d: Already exists \n2371f0a6d5ec: Already exists \nb55247ebc792: Already exists \n38b40dedf719: Already exists \na609cdbac5b4: Already exists \nf2e98da86f69: Already exists \n8589cdafb8d3: Already exists \nf110041cad0c: Already exists \n8d2557b365eb: Already exists \n0de73c57e07d: Already exists \n165ea38f2f53: Already exists \n66b43fff8150: Already exists \nccc0386d04e3: Already exists \n26d822b9fccb: Already exists \nd489c5be8f43: Already exists \nc342009660e3: Already exists \ne2006e25f603: Already exists \n612638393a03: Already exists \ndae51e73d8bc: Already exists \n07243e67b561: Pull complete \n2ee8a212fe21: Pull complete \n19e557a0567c: Pull complete \nff417f05521e: Pull complete \n539fd422158e: Pull complete \nef5cf2280d59: Pull complete \n24d2ecc0cc9a: Pull complete \n9dc58ab20296: Pull complete \naba0cc69761b: Pull complete \nDigest: sha256:454657f20f7a09d45dc8ac4f4d3263360480c15f69bece280dd06b8d1647ad7f\nStatus: Downloaded newer image for abcdesktopio/firefox.d:dev\ndocker.io/abcdesktopio/firefox.d:dev\n
"},{"location":"common/1.0/abcdesktop.bastion/#reload-the-web-browser-page","title":"Reload the web browser page","text":""},{"location":"common/1.0/abcdesktop.bastion/#connect-your-local-abcdesktop_1","title":"Connect your local abcdesktop","text":"

Reload or open your web browser

http://[your-ip-hostname]:30443/\n

Firefox is added to your desktop dock. Start Firefox application

No rule has be defined to allow http request from your pod to a web site

All http requests are denied

The firefox application inherits from the pod's the network rules.

"},{"location":"common/1.0/abcdesktop.bastion/#troubleshooting","title":"Troubleshooting","text":"

If you choose to use VMware instead of VirtualBox hypervisor

"},{"location":"common/1.0/abcdesktop.bastion/#notes-about-the-macvlan-driver","title":"Notes about the macvlan driver :","text":"

Macvlan allows you to configure sub-interfaces of a parent, physical Ethernet interface, each with its own unique MAC address, and consequently its own IP address. Applications, VMs and containers can then bind to a specific sub-interface to connect directly to the physical network, using their own MAC and IP address.

"},{"location":"common/1.0/abcdesktop.bastion/#macvlan-driver-on-vswitch-vmware","title":"macvlan driver on vSwitch VMware","text":"

The security policy of a virtual switch includes a MAC address changes option. This option allows virtual machines to receive frames with a Mac Address that is different from the one configured in the VMX.

When the Mac address changes option is set to Accept, ESXi accepts requests to change the effective MAC address of a virtual machine to a different address than the initial MAC address.

Set the Mac address changes option is set to Accept

"},{"location":"common/1.0/docker_macvlan/","title":"Using docker network for an application","text":""},{"location":"common/1.0/docker_macvlan/#requirements","title":"Requirements","text":""},{"location":"common/1.0/docker_macvlan/#goals","title":"Goals","text":""},{"location":"common/1.0/docker_macvlan/#architecture","title":"Architecture","text":"

When abcdesktop create a docker container, abcdesktop can set a dedicated network for this container.

"},{"location":"common/1.0/docker_macvlan/#create-a-dedicated-network-for-your-application","title":"Create a dedicated network for your application","text":"

On your worker nodes :

You have to choose a nework driver for example

network driver macvlan ipvlan docker-sriov-plugin

Only the name of the network is used by abcdesktop.

Create a network with macvlan or ipvlan driver

In these two examples :

"},{"location":"common/1.0/docker_macvlan/#example-with-macvlan","title":"Example with macvlan :","text":"

Create a network abcnetfirefox with the driver macvlan and bridge the network interface eno1 with the vlan 123

docker network create --label type=oc.app -d macvlan --subnet=192.168.8.0/24 --gateway=192.168.8.254 --ip-range=192.168.8.0/27 -o parent=eno1.123 abcnetfirefox\n
"},{"location":"common/1.0/docker_macvlan/#example-with-ipvlan-ipvlan_model2","title":"Example with ipvlan ipvlan_mode=l2 :","text":"

Create a network abcnetfirefox with the driver ipvlan with ipvlan_mode=l2 option and bridge the network interface eno1 with the vlan 123.

docker network create --label type=oc.app -d ipvlan  -o ipvlan_mode=l2 --subnet=192.168.8.0/24 --gateway=192.168.8.254 --ip-range=192.168.8.0/27 -o parent=eno1.123 abcnetfirefox\n
"},{"location":"common/1.0/docker_macvlan/#test-your-new-network-macvlan-or-ipvlan","title":"Test your new network (macvlan or ipvlan):","text":"

Make sure that's you can reach the default gateway and the dns server for container. In this example, just start a busybox to :

export GATEWAY=192.168.8.254\ndocker run --rm --network abcnetfirefox busybox ping $GATEWAY\n# Google\u2019s public DNS server 8.8.8.8 is added\ndocker run --rm --network abcnetfirefox --dns 8.8.8.8 busybox ping www.google.com\n
"},{"location":"common/1.0/docker_macvlan/#applications-rules","title":"Applications rules","text":"

Update your applist.json file and add a specific rule into the firefox application description

git clone https://github.com/abcdesktopio/oc.apps.git\ncd oc.apps\n

Specific rules entry example

\"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": false, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } },\n

In this example, if the current user token contains the tag label internet when the firefox application use abcnetfirefox and the dns 8.8.8.8

"},{"location":"common/1.0/docker_macvlan/#edit-the-applistjson-file","title":"Edit the applist.json file","text":"

Edit the applist.json file, and add rules to the application firefox for example

The new firefox dictionary with rules :

{\n    \"cat\": \"office\",\n    \"preruncommands\": [ \"RUN DEBIAN_FRONTEND=noninteractive echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes ttf-mscorefonts-installer ttf-bitstream-vera ttf-dejavu ttf-xfree86-nonfree && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes winbind firefox $(apt-cache search firefox-locale | awk '{print $1 }') && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes flashplugin-installer ubuntu-restricted-extras libavc1394-0 && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libasound2-plugins libgail-common libgtk2.0-bin chromium-codecs-ffmpeg-extra gstreamer1.0-libav gstreamer1.0-plugins-ugly gstreamer1.0-vaapi libavcodec-extra && apt-get clean\",\n                        \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n                        \"COPY policies.json /usr/lib/firefox/distribution\",\n                        \"COPY /ntlm_auth /usr/bin/ntlm_auth.abcdesktop\",\n                        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.abcdesktop\",\n                        \"ENV NSS_SDB_USE_CACHE=yes\" ],\n    \"debpackage\": \"\",\n    \"icon\": \"firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.Firefox\",\n    \"name\": \"Firefox\",\n    \"displayname\": \"Firefox\",\n    \"showinview\": \"dock\",\n    \"splash\": \"enable\",\n    \"mem_limit\": \"16gb\",\n    \"oomkilldisable\": true,\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\":\"/usr/share/applications/firefox.desktop\",\n    \"shm_size\": \"2gb\",\n    \"usedefaultapplication\": true,\n    \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": false, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } }\n}\n

Save your changes, and run make dockerfile, next docker build

Build and update your new firefox application

# create the Dockerfile firefox.d \nmake dockerfile\n\n# build the new image\ndocker build -f firefox.d -t firefox.d .\n

Check that the oc.rules label in new firefox.d image

docker inspect firefox.d \n

The oc.rules label is a string json formated

\"oc.rules\": \"{\\\"homedir\\\":{\\\"default\\\":true,\\\"ship\\\":true},\\\"network\\\":{\\\"default\\\":false,\\\"internet\\\":{\\\"name\\\":\\\"abcnetfirefox\\\",\\\"dns\\\":[\\\"8.8.8.8\\\"]}}}\"\n
"},{"location":"common/1.0/docker_macvlan/#add-tag-the-user-auth","title":"Add tag the user auth","text":"

Add a tag internet to the user auth provider

"},{"location":"common/1.0/docker_macvlan/#update-authprovider-in-odconfig-file","title":"Update authprovider in od.config file","text":"

Update the ldapconfig for planet with the new policies dict

  'policies': { 'acls': None, \n              'rules'   : { 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True  } ],\n              'expected' : True, \n              'label': 'internet' },\n

The complete ldapconfig for planet is

ldapconfig : { 'planet': {    'default'       : True,\n                        'ldap_timeout'  : 15,\n                        'ldap_protocol' : 'ldap',\n                        'ldap_basedn'   : 'ou=people,dc=planetexpress,dc=com',\n                        'servers'       : [ '192.168.7.69' ],\n                        'secure'        : False,\n                        'auth_protocol' : { 'ntlm': True, 'cntlm': False, 'kerberos': False, 'citrix': False},\n                        'citrix_all_regions' : 'Hello, {{ domain }}\\\\{{ user }}:{{ password }}',  \n                        'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n\n                        'policies': { 'acls': None, \n             'rules'    : { 'rule-ship': { 'conditions' : [ { 'memberOf': 'cn=ship_crew,ou=people,dc=planetexpress,dc=com', 'expected' : True  } ], 'expected' : True, 'label': 'internet' } \n      } } } }\n

Restart your kubernetes pyos pod, to reload new the od.config configuration file.

"},{"location":"common/1.0/docker_macvlan/#use-the-philip-j-fry-user-context","title":"Use the Philip J. Fry user context.","text":"

Open a web browser, go to the abcdesktop login page.

Login Accounts

Login Password Philip J. Fry. fry Hubert J. Farnsworth professor

Note: the user Philip J. Fry is member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

Note: the user Hubert J. Farnsworth is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

Login as the Philip J. Fry user account.

During the user login process, pyos tag the user authentification with the 'label': 'internet'

Start the new application firefox, the docker network for this application use the abcnetfirefox

Run the command

docker network inspect abcnetfirefox\n

abcdesktop start a new container \"Name\": \"philip-j--fry-firefox-d2c22d9912fc4a489a1224237af9a3e0\" and bind the abcnetfirefox to user container.

[\n    {\n        \"Name\": \"abcnetfirefox\",\n        \"Id\": \"69c5ac0996226654635377458c044675114d5feb742a8a56d8a228180829d9cd\",\n        \"Created\": \"2021-02-05T16:24:41.781733948+01:00\",\n        \"Scope\": \"local\",\n        \"Driver\": \"macvlan\",\n        \"EnableIPv6\": false,\n        \"IPAM\": {\n            \"Driver\": \"default\",\n            \"Options\": {},\n            \"Config\": [\n                {\n                    \"Subnet\": \"192.168.8.0/24\",\n                    \"Gateway\": \"192.168.8.254\"\n                }\n            ]\n        },\n        \"Internal\": false,\n        \"Attachable\": false,\n        \"Ingress\": false,\n        \"ConfigFrom\": {\n            \"Network\": \"\"\n        },\n        \"ConfigOnly\": false,\n        \"Containers\": {\n            \"05f88ee41055b209e7599a455705088cf633f6458313508ce867d13b8d39014a\": {\n                \"Name\": \"philip-j--fry-firefox-d2c22d9912fc4a489a1224237af9a3e0\",\n                \"EndpointID\": \"ae0271ed73aa5478ac364444b29342278b82bc710bd4e4eeb64a51d7eeec4d9c\",\n                \"MacAddress\": \"02:42:a1:69:d0:82\",\n                \"IPv4Address\": \"192.168.8.1/24\",\n                \"IPv6Address\": \"\"\n            }\n        },\n        \"Options\": {\n            \"parent\": \"eno1.106\"\n        },\n        \"Labels\": {\n            \"type\": \"oc.app\"\n        }\n    }\n]\n

Close the firefox application.

Logoff, to remove the user pod Philip J. Fry.

"},{"location":"common/1.0/docker_macvlan/#use-the-hubert-j-farnsworth-user-context","title":"Use the `Hubert J. Farnsworth user context.","text":"

Login as the Hubert J. Farnsworth user account.

Note: the user Hubert J. Farnsworth is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

Start the new application firefox, the docker network for this application do NOT use the abcnetfirefox

Run the command

docker network inspect abcnetfirefox\n

abcnetfirefox description :

docker network inspect abcnetfirefox\n[\n    {\n        \"Name\": \"abcnetfirefox\",\n        \"Id\": \"69c5ac0996226654635377458c044675114d5feb742a8a56d8a228180829d9cd\",\n        \"Created\": \"2021-02-05T16:24:41.781733948+01:00\",\n        \"Scope\": \"local\",\n        \"Driver\": \"macvlan\",\n        \"EnableIPv6\": false,\n        \"IPAM\": {\n            \"Driver\": \"default\",\n            \"Options\": {},\n            \"Config\": [\n                {\n                    \"Subnet\": \"192.168.8.0/24\",\n                    \"Gateway\": \"192.168.8.254\"\n                }\n            ]\n        },\n        \"Internal\": false,\n        \"Attachable\": false,\n        \"Ingress\": false,\n        \"ConfigFrom\": {\n            \"Network\": \"\"\n        },\n        \"ConfigOnly\": false,\n        \"Containers\": {},\n        \"Options\": {\n            \"parent\": \"eno1.106\"\n        },\n        \"Labels\": {\n            \"type\": \"oc.app\"\n        }\n    }\n]\n

The new firefox container doesn't use the docker network abcnetfirefox, because the Hubert J. Farnsworth user account is NOT member of cn=ship_crew,ou=people,dc=planetexpress,dc=com

The network is disabled by default.

Inspect the Hubert J. Farnsworth firefox container

        \"NetworkSettings\": {\n            \"Bridge\": \"\",\n            \"SandboxID\": \"\",\n            \"HairpinMode\": false,\n            \"LinkLocalIPv6Address\": \"\",\n            \"LinkLocalIPv6PrefixLen\": 0,\n            \"Ports\": {},\n            \"SandboxKey\": \"\",\n            \"SecondaryIPAddresses\": null,\n            \"SecondaryIPv6Addresses\": null,\n            \"EndpointID\": \"\",\n            \"Gateway\": \"\",\n            \"GlobalIPv6Address\": \"\",\n            \"GlobalIPv6PrefixLen\": 0,\n            \"IPAddress\": \"\",\n            \"IPPrefixLen\": 0,\n            \"IPv6Gateway\": \"\",\n            \"MacAddress\": \"\",\n            \"Networks\": {}\n        }\n

The network access is disable for this application

\"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": false, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } }\n

In this case, only users with the label tag internet, can bind the network name abcnetfirefox.

"},{"location":"common/1.0/docker_macvlan/#enable-network-for-hubert-j-farnsworth","title":"Enable network for Hubert J. Farnsworth","text":"

Update the application firefox rules

Now it's time to permit network access to

Update the applist.json file :

Specific rules entry example

\"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": true, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } },\n

The new firefox dictionary with network rules set with \"default\": true :

{\n    \"cat\": \"office\",\n    \"preruncommands\": [ \"RUN DEBIAN_FRONTEND=noninteractive echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes ttf-mscorefonts-installer ttf-bitstream-vera ttf-dejavu ttf-xfree86-nonfree && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes winbind firefox $(apt-cache search firefox-locale | awk '{print $1 }') && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes flashplugin-installer ubuntu-restricted-extras libavc1394-0 && apt-get clean\",\n                        \"RUN apt-get update && apt-get install  --no-install-recommends --yes libasound2-plugins libgail-common libgtk2.0-bin chromium-codecs-ffmpeg-extra gstreamer1.0-libav gstreamer1.0-plugins-ugly gstreamer1.0-vaapi libavcodec-extra && apt-get clean\",\n                        \"COPY composer/init.d/init.firefox /composer/init.d/init.firefox\",\n                        \"COPY policies.json /usr/lib/firefox/distribution\",\n                        \"COPY /ntlm_auth /usr/bin/ntlm_auth.abcdesktop\",\n                        \"RUN chown root:root /usr/bin/ntlm_auth.desktop && chmod 111 /usr/bin/ntlm_auth.abcdesktop\",\n                        \"ENV NSS_SDB_USE_CACHE=yes\" ],\n    \"debpackage\": \"\",\n    \"icon\": \"firefox.svg\",\n    \"keyword\": \"firefox,mozilla,web,internet\",\n    \"launch\": \"Navigator.Firefox\",\n    \"name\": \"Firefox\",\n    \"displayname\": \"Firefox\",\n    \"showinview\": \"dock\",\n    \"splash\": \"enable\",\n    \"mem_limit\": \"16gb\",\n    \"oomkilldisable\": true,\n    \"path\": \"/usr/bin/firefox\",\n    \"template\": \"abcdesktopio/oc.template.gtk\",\n    \"mimetype\": \"text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;video/webm;application/x-xpinstall;\",\n    \"legacyfileextensions\": \"htm;html;xml\",\n    \"fileextensions\": \"htm;html;xml;gif\",\n    \"desktopfile\":\"/usr/share/applications/firefox.desktop\",\n    \"shm_size\": \"2gb\",\n    \"usedefaultapplication\": true,\n    \"rules\": { \"homedir\": { \"default\": true, \"ship\": true }, \n           \"network\": { \"default\": true, \n                        \"internet\": { \n                                    \"name\": \"abcnetfirefox\", \n                                    \"dns\": [ \"8.8.8.8\" ] } } }\n}\n

Save your changes, and run make dockerfile, next docker build

Build and update your new firefox application

# create the Dockerfile firefox.d \nmake dockerfile\n\n# build the new image\ndocker build -f firefox.d -t firefox.d .\n

Check that the oc.rules label in new firefox.d image

docker inspect firefox.d \n

The oc.rules label is a string json formated

 \"oc.rules\": \"{\\\"homedir\\\":{\\\"default\\\":true,\\\"ship\\\":true},\\\"network\\\":{\\\"default\\\":true,\\\"internet\\\":{\\\"name\\\":\\\"abcnetfirefox\\\",\\\"dns\\\":[\\\"8.8.8.8\\\"]}}}\",\n

Request the abcdesktop core service to update the application cache data

Replace MY_FQDN by your own hostname

export MY_FQDN=localhost\ncurl http://$MY_FQDN/API/manager/buildapplist \n

You do not need to logoff the Hubert J. Farnsworth, just close Firefox application and start it again. The new firefox container use the default network.

Now default user has a network access, and member of cn=ship_crew,ou=people,dc=planetexpress,dc=com use the abcnetfirefox network.

"},{"location":"common/1.0/docker_macvlan/#webhook-events-create-and-destroy-application","title":"Webhook events create and destroy application","text":"

A rule support a specific bash command to notify external security equipment like firewalls, by sending create and destroy events.

\"rules\": {  \"homedir\": { \"default\": false, \"ship\": true }, \n                \"network\": { \"default\": false, \n                    \"ship\": { \"name\": \"abcnetfirefox\", \n                                \"dns\": [ \"8.8.8.8\" ], \n                                \"webhook\": { \n                                    \"create\": \"/usr/bin/curl 'http://firewall.domain.local/update?action=create&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\", \n                                    \"destroy\": \"/usr/bin/curl 'http://firewall.domain.local/update?action=destroy&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\" \n                                } \n                    }\n                }\n}\n
/usr/bin/curl 'http://firewall.domain.local/update?action=create&key={{ key }}&name={{ name }}&ip={{ container_ip }}\n
/usr/bin/curl 'http://firewall.domain.local/update?action=destroy&key={{ key }}&name={{ name }}&ip={{ container_ip }}'\n

Each {{ $label }} is a mustached value.

Label name description example container_ip container ip addr 192.168.8.130 provider authentification provider name planet providertype authentification provider type ldap userid authentification provider user id fry name username Philip J. Fry sha_id sha of the container image sha256%3A5c754563b357bfde4a3762728c686fe0001d10e43835b9468d5218e663b844e8 id name of the application image abcdesktopio/firefox-esr.d:dev launch WM_CLASS of the X11 application Navigator.Firefox icon icon file name firefox.svg keyword docker image label keywords firefox mozilla web internet cat docker image label category office displayname docker image label displayname Firefox-esr path binary path of the application /usr/bin/firefox-esr desktopfile desktop filename of the application firefox.desktop executablefilename binary file name of the application \u00a0firefox-esr locale user current locale settings en_US"},{"location":"common/1.0/docker_macvlan/#events","title":"Events :","text":""},{"location":"common/1.0/docker_macvlan/#create-event","title":"create event:","text":"

The control plane pyos replace the mustached url string /usr/bin/curl 'http://firewall.domain.local/update?action=create&name={{ name }}&ip={{ container_ip }}' as /usr/bin/curl 'http://firewall.domain.local/update?action=create&name=Philip%20J.%20Fry&ip=192.168.8.130'

"},{"location":"common/1.0/docker_macvlan/#destroy-event","title":"destroy event:","text":"

The control plane pyos replace the mustached url string /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&name={{ name }}&ip={{ container_ip }}' as /usr/bin/curl 'http://firewall.domain.local/update?action=destroy&name=Philip%20J.%20Fry&ip=192.168.8.130'

"},{"location":"common/1.0/docker_macvlan/#desktopwebhook-options-in-odconfig-file","title":"desktop.webhook options in od.config file","text":""},{"location":"common/1.0/docker_macvlan/#url-encoding-parameters","title":"url encoding parameters","text":"

To encode url parameters use the option desktop.webhookencodeparams. Set desktop.webhookencodeparams to True to encode label name. The default value is False

"},{"location":"common/1.0/docker_macvlan/#additional-dict-datas","title":"additional dict datas","text":"

Additional datas can be set using the desktop.webhookdict option in od.config file

desktop.webhookdict: { \n        'api_key': 'supersecret', \n        'firewall_manage_ip': '161.105.208.129'  \n}\n

The command line

/usr/bin/curl 'http://{{ firewall_manage_ip }}/update?action=destroy&key={{ api_key }}&name={{ name }}&ip={{ container_ip }}'\n

becomes

/usr/bin/curl 'http://161.105.208.129/update?action=destroy&key=supersecret&name={{ name }}&ip={{ container_ip }}'\n
"},{"location":"common/1.0/update_frontend_image/","title":"Update and custom front end image","text":""},{"location":"common/1.0/update_frontend_image/#requirements","title":"Requirements","text":""},{"location":"common/1.0/update_frontend_image/#goals","title":"Goals","text":""},{"location":"common/1.0/update_frontend_image/#build-images","title":"Build images","text":"

Build image process from abcdesktopio docker registry to your private registry

"},{"location":"common/1.0/update_frontend_image/#update-ocnginx-image","title":"Update oc.nginx image","text":"

Goal :

Only the name of the network is used by abcdesktop.

"},{"location":"common/1.0/update_frontend_image/#clone-default-webmodules","title":"Clone default webmodules","text":"
git clone https://github.com/abcdesktopio/webModules.git\n
"},{"location":"common/1.0/update_frontend_image/#locate-project-and-ui-files","title":"Locate project and ui files","text":""},{"location":"common/1.0/update_frontend_image/#update-uijson-file","title":"Update ui.json file","text":"

Update your ui.json file. ui.json is located in var/webModules/transpile/config directory.

# cd var/webModules/transpile/config\nvar/webModules/transpile/config# ls -la\ntotal 204\ndrwxrwxr-x   1 root root   4096 Feb  1 15:14 .\ndrwxr-xr-x   1 root root   4096 Feb  1 15:14 ..\n-rw-rw-r--   1 root root     34 Feb  1 15:14 .cache.json\n-rw-rw-r--   1 root root   2215 Feb  1 15:11 modules.json\n-rw-rw-r--   1 root root   1044 Feb  1 15:11 ui.json\n

ui.json is a json dictionary file

The main entry is name, name is the project name:

entry default value example name abcdesktop.io acmedesktop.io
{\n  \"name\": \"abcdesktop.io\",\n  \"colors\": [\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\"\n}\n
"},{"location":"common/1.0/update_frontend_image/#colors-dictionary-entries","title":"Colors dictionary entries","text":"entry default value example @primary #474B55 #474B55 @secondatry #2D2D2D #2D2D2D @tertiary #6EC6F0 #6EC6F0"},{"location":"common/1.0/update_frontend_image/#create-a-new-dockerfile-to-build-changes","title":"Create a new Dockerfile to build changes","text":""},{"location":"common/1.0/update_frontend_image/#update-the-uijson-with-your-own-values","title":"Update the ui.json with your own values","text":"

Change for example the name to

\"name\": \"acmedesktop.io\"\n

and the

@tertiary \"value\": \"#00BCD4\"\n

Example

{\n  \"name\": \"acmedesktop.io\",\n  \"colors\": [\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#00FCD4\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\"\n}\n
"},{"location":"common/1.0/update_frontend_image/#write-your-dockerfile","title":"Write your Dockerfile","text":"
FROM abcdesktopio/oc.nginx:builder as builder\n\n# copy data files\nCOPY --from=abcdesktopio/oc.nginx:dev var/webModules /var/webModules\n# copy updated file ui.json \nCOPY ui.json /var/webModules/transpile/config/ui.json\n# run makefile \nRUN cd /var/webModules && make css\n\n\n# --- START Build image ---\nFROM abcdesktopio/oc.nginx\n\n# COPY generated web site from builder container\nCOPY --from=builder var/webModules /var/webModules\n
"},{"location":"common/1.0/update_frontend_image/#docker-build","title":"Docker build","text":"

Run the docker build command to build the new oc.nginx:acme image

docker build -t oc.nginx:acme .\n
Sending build context to Docker daemon  258.3MB\nStep 1/6 : FROM abcdesktopio/oc.nginx:builder as builder\n ---> b04ba79c6b97\nStep 2/6 : COPY --from=abcdesktopio/oc.nginx var/webModules /var/webModules\n ---> Using cache\n ---> 3c16ce97b6b5\nStep 3/6 : COPY ui.json /var/webModules/transpile/config/ui.json\n ---> Using cache\n ---> 3c8e48730bb0\nStep 4/6 : RUN cd /var/webModules && make css\n ---> Running in b9660fb676b2\nBuild css: 1.005s\nTotal duration: 1.007s\nRemoving intermediate container b9660fb676b2\n ---> febdb98ad1aa\nStep 5/6 : FROM abcdesktopio/oc.nginx\n ---> 2b311b600a4e\nStep 6/6 : COPY --from=builder var/webModules /var/webModules\n ---> Using cache\n ---> c9545d07f825\nSuccessfully built c9545d07f825\nSuccessfully tagged oc.nginx:acme\n

Run the docker images command to read the new oc.nginx image

docker images \n\nREPOSITORY                   TAG       IMAGE ID       CREATED             SIZE\noc.nginx                     acme      4de1755b60d7   About an hour ago   746MB\n
"},{"location":"common/1.0/update_frontend_image/#update-the-dockercompose-or-the-abcdesktopyaml-file","title":"Update the dockercompose or the abcdesktop.yaml file","text":"

Update the dockercompose or the abcdesktop.yaml file to replace the default abcdesktopio/oc.nginx by the new image oc.nginx:acme name.

version: '3'\nservices:\n  pyos:\n    depends_on:\n      - memcached\n      - mongodb\n    image: 'abcdesktopio/oc.pyos'\n    networks:\n      - netback\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n  speedtest:\n    image: 'abcdesktopio/oc.speedtest'\n    networks:\n      - netuser\n  nginx:\n    depends_on:\n      - memcached\n      - pyos\n    image: 'oc.nginx:acme'\n    ports:\n      - '80:80'\n      - '443:443'\n    networks:\n      - netuser\n      - netback\n  memcached:\n    image: memcached\n    networks:\n      - netback\n  mongodb:\n    image: mongo\n    networks:\n      - netback\nnetworks:\n  netuser:\n    driver: bridge\n  netback:\n    internal: true\n

The run the docker-compose up, and start you web browser. You can read the new project name at the home page.

We define the new tertiary color as #00FCD4 in dict { \"name\": \"@tertiary\", \"value\": \"#00FCD4\" }

Old tertiary color has been replace by #00FCD4.

"},{"location":"common/3.0/createcontainerisedapplicationdebug/","title":"How to create containerised application from scratch for troubleshooting","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#requirements","title":"Requirements","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#goals","title":"Goals","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#create-an-application-using-a-new-container","title":"Create an application using a new container","text":"

We are starting a new containerised application from a fresh ubuntu:20.04 image and bind the X11 socket to use the pod DISPLAY.

We start a new container one as root, and another one as current user hermes

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-abcdesktop-session","title":"Start a new abcdesktop session","text":"

Open a web browser and go to abcdesktop service url

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#login-in-as-hermes","title":"Login in as hermes","text":"

In the example we use LDAP authentification.

The login is Hermes Conrad, the password is hermes

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-hermess-pod-variables-name-uid-xauth_key","title":"Get hermes's pod variables: name, uid, XAUTH_KEY","text":"

Get a shell to your host. All next command use a host shell.

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-name","title":"Get the hermes's pod name","text":"

To read the hermes pod name, MIT-MAGIC-COOKIE-1, and uid

kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.name}' -n abcdesktop\n

We save this value in the pod variable, for next usage

POD=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.name}' -n abcdesktop)\necho $POD\n

You should read on stdout

hermes-da0ca3c8-48ba-4736-85a9-d3fd2c85f009\n

We save this value in the $POD for a next usage.

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-xauth_key","title":"Get the hermes's XAUTH_KEY","text":"

The release 3.0 need the MIT-MAGIC-COOKIE-1 to reach the x11 DISPLAY.

Run the command echo $XAUTH_KEY to read the $XAUTH_KEY value inside the hermes's pod

export XAUTH_KEY=$(kubectl exec -n abcdesktop -it $POD -- bash -c 'echo $XAUTH_KEY')\n
Defaulted container \"x-planet-hermes\" out of: x-planet-hermes, c-planet-hermes, f-planet-hermes, o-planet-hermes, hermes-conrad-xterm-9e2589dc0da0473da8e33d3ab98abedc (ephem), i-planet-hermes (init)\n

The XAUTH_KEY variable is exported for a next usage.

echo $XAUTH_KEY\n306908f8e4d4768c7595ce5ad53479\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-uid","title":"Get the hermes's pod uid","text":"
kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.uid}' -n abcdesktop\n

We save this value in the PODUID exported variable, for next usage

export PODUID=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].metadata.uid}' -n abcdesktop)\n
echo $PODUID\nc6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#inspect-the-hermess-pod-to-look-for-binding-volume-mapping","title":"Inspect the Hermes's pod to look for Binding volume mapping","text":""},{"location":"common/3.0/createcontainerisedapplicationdebug/#list-files-in-varlibkubeletpodspoduid","title":"List files in /var/lib/kubelet/pods/$PODUID","text":"

The default kubelet's pod directory is /var/lib/kubelet/pods/. If you change it during the installation process replace /var/lib/kubelet/pods/ by your own directory.

ls -la /var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket\n
ls -la /var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~empty-dir/x11socket\ntotal 4\ndrwxrwxrwt 2 root root   60 Dec  8 19:43 .\ndrwxr-xr-x 9 root root 4096 Dec  8 19:43 ..\nsrwxrwxrwx 1 1051 2051    0 Dec  8 19:43 X0\n

X0 is a file unix socket, we will bind the X0 socket in the next podapp.

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-the-hermess-pod-home-hermes-volume-location","title":"Get the hermes's pod home-hermes volume location","text":"
kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].spec.volumes[?(@.name==\"home-hermes\")].hostPath.path}' -n abcdesktop\n

Description of this query

We save this value in the PODHOME exported variable, for next usage

export PODHOME=$(kubectl get pod -l=access_userid=hermes -o jsonpath='{.items[0].spec.volumes[?(@.name==\"home-hermes\")].hostPath.path}' -n abcdesktop)\n

Check the value with a echo

echo $PODHOME\n/tmp/hermes-conrad\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-container-from-ubuntu2004","title":"Start a new container from ubuntu:20.04","text":"

Now we've got the all volumes path and XAUTH_KEY, let's start a new container with mounted volume

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#create-container-in-the-pod-sandbox-with-config-file","title":"Create container in the pod sandbox with config file","text":"

We use envsubst to replace variable content in a template yaml file.

Some systems have gettext with envsubst preinstalled. However, if it is missing, you can install it using a package manager. For macOS you can use homebrew:

brew install gettext

The variables ${PODUID}, ${PODHOME} and ${XAUTH_KEY} are exported.

Make sure to use export, otherwise your variables are considered shell variables and might not be accessible to envsubst

Create a file podapp.template.yaml

apiVersion: v1\nkind: Pod\nmetadata:\n  name: podapp\n  namespace: abcdesktop\nspec:\n  volumes:\n  - name: x11socket\n    hostPath:\n      # x11 directory location on host ${PODUID}\n      path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # home directory location on host\n      path: ${PODHOME}\n      # this field is optional\n      type: Directory\n  containers:\n  - name: abccontainer\n    image: ubuntu:20.04\n    command: [\"/bin/sleep\"]\n    args: [\"1d\"]\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n    env:\n    - name: XAUTH_KEY\n      value: ${XAUTH_KEY}\n

Run the envsubst command to replace ${PODUID}, ${PODHOME} and ${XAUTH_KEY}

envsubst < podapp.template.yaml > podapp.yaml \n

Dump the podapp.yaml file content, and check that the volumes are set with the new values.

# cat podapp.yaml \n
apiVersion: v1\nkind: Pod\nmetadata:\n  name: podapp\n  namespace: abcdesktop\nspec:\n  volumes:\n  - name: x11socket\n    hostPath:\n      # directory location on host\n      path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # directory location on host\n      path: /tmp/hermes-conrad\n      # this field is optional\n      type: Directory\n  containers:\n  - name: abccontainer\n    image: ubuntu:20.04\n    command: /bin/sleep 1d\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n

Create the application pod

kubectl apply -f podapp.yaml \npod/podapp created\n

Check that your pod podapp is Running

kubectl get pods podapp  -n abcdesktop\nNAME     READY   STATUS    RESTARTS   AGE\npodapp   1/1     Running   0          32s\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#get-a-shell-in-podapp","title":"Get a shell in podapp","text":"

You get a shell command inside the container.

kubectl exec -it podapp  -n abcdesktop -- bash \n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#for-release-30-set-the-mit-magic-cookie-1","title":"for release 3.0 set the MIT-MAGIC-COOKIE-1","text":"
apt-get update && apt-get install -y xauth\n
export DISPLAY=:0.0\necho $XAUTH_KEY\nxauth add $DISPLAY MIT-MAGIC-COOKIE-1 $XAUTH_KEY\n

You can read on stdout

root@podapp:/# export DISPLAY=:0.0\nroot@podapp:/# echo $XAUTH_KEY\n306908f8e4d4768c7595ce5ad53479\nroot@podapp:/# xauth add $DISPLAY MIT-MAGIC-COOKIE-1 $XAUTH_KEY\nxauth:  file /root/.Xauthority does not exist\nroot@podapp:/#\n

The file /root/.Xauthority does not exist, it has been created.

"},{"location":"common/3.0/createcontainerisedapplicationdebug/#install-your-x11-applications","title":"Install your X11 applications","text":"

For example, I choose to install the x11-apps package

Replace x11-apps by your own application

apt-get install -y x11-apps\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-your-x11-application","title":"Start your X11 application","text":"

To start the X11 application, just run it. Your DISPLAY is set to :0.0, (for release 3.0, you've already added the MIT-MAGIC-COOKIE-1).

But remember you a running a container as root, and all commands are running as root inside the container.

Start xedit

xedit\n

Go back to your web browser.

A new x11 window xedit should be present on your display

xedit doesn't write any error message in the bash container.

You've get a shell inside a container to run and start any application. You can also install and start any others applications.

To clean the running pod podapp

kubectl delete pods podapp -n abcdesktop \n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-a-new-container-from-ubuntu2004-as-hermes","title":"Start a new container from ubuntu:20.04 as hermes","text":"

To start a new container from ubuntu:20.04 as hermes, we have to add the localaccount secret volume to the previous container

Read the securityContext from the hermes pod

export PODRUNASUSER=$(kubectl get pods -l=access_userid=hermes -o json  -n abcdesktop | jq -r '.items[0].spec.securityContext.runAsUser')\nexport PODRUNASGROUP=$(kubectl get pods -l=access_userid=hermes -o json  -n abcdesktop | jq -r '.items[0].spec.securityContext.runAsGroup')\n

Check the uidNumber and the gidNumber values

echo PODRUNASUSER:$PODRUNASUSER PODRUNASGROUP:$PODRUNASGROUP\nPODRUNASUSER:1051 PODRUNASGROUP:2051\n

Create a file hermespodapp.template.yaml

apiVersion: v1\nkind: Pod\nmetadata:\n  name: hermespodapp\n  namespace: abcdesktop\nspec:\n  securityContext:\n    runAsUser: ${PODRUNASUSER}\n    runAsGroup: ${PODRUNASGROUP}\n  volumes:\n  - name: x11socket\n    hostPath:\n      # x11 directory location on host ${PODUID}\n      path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # home directory location on host\n      path: ${PODHOME}\n      # this field is optional\n      type: Directory\n  - name: localaccount\n    hostPath:\n      # localaccount directory location on host\n      path: /var/lib/kubelet/pods/${PODUID}/volumes/kubernetes.io~secret/auth-localaccount-hermes\n      # this field is optional\n      type: Directory\n  containers:\n  - name: hermescontainer\n    image: ubuntu:20.04\n    command: [\"/bin/sleep\"]\n    args: [\"1d\"]\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n    - mountPath: /var/secrets/abcdesktop/localaccount\n      name: localaccount\n    env:\n    - name: XAUTH_KEY\n      value: ${XAUTH_KEY}\n

Create your hermespodapp.yaml file from the previous template

envsubst < hermespodapp.template.yaml > hermespodapp.yaml \n

Look at your hermespodapp.yaml

cat hermespodapp.yaml \n
apiVersion: v1\nkind: Pod\nmetadata:\n  name: hermespodapp\n  namespace: abcdesktop\nspec:\n  securityContext:\n    runAsUser: 1051\n    runAsGroup: 2051\n  volumes:\n  - name: x11socket\n    hostPath:\n      # x11 directory location on host c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf\n      path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~empty-dir/x11socket\n      # this field is optional\n      type: Directory\n  - name: home\n    hostPath:\n      # home directory location on host\n      path: /tmp/hermes-conrad\n      # this field is optional\n      type: Directory\n  - name: localaccount\n    hostPath:\n      # localaccount directory location on host\n      path: /var/lib/kubelet/pods/c6d2f8a7-eb7d-4a25-9a9c-9778ca9e35cf/volumes/kubernetes.io~secret/auth-localaccount-hermes\n      # this field is optional\n      type: Directory\n  containers:\n  - name: hermescontainer\n    image: ubuntu:20.04\n    command: [\"/bin/sleep\"]\n    args: [\"1d\"]\n    volumeMounts:\n    - mountPath: /tmp/.X11-unix\n      name: x11socket\n    - mountPath: /home/hermes\n      name: home\n    - mountPath: /var/secrets/abcdesktop/localaccount\n      name: localaccount\n    env:\n    - name: XAUTH_KEY\n      value: 306908f8e4d4768c7595ce5ad53479\n

Create the hermespodapp

kubectl apply -f hermespodapp.yaml \npod/hermespodapp created\n

To install the x11 application package, we need a root access to the pod/hermespodapp. We use runc to get a rooted shell.

Read the containerID of the pod hermespodapp

CONTAINER=$(kubectl -n abcdesktop  get pod hermespodapp -o jsonpath=\"{.status.containerStatuses[].containerID}\" |sed 's/.*\\/\\///')\n

Get the shell with runc command

runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 $CONTAINER bash\ngroups: cannot find name for group ID 2051\nroot@hermespodapp:/# \n

This is correct group ID 2051 does not exit. Let's patch your file system with hermes credentials

rm -f /etc/passwd && ln -s /var/secrets/abcdesktop/localaccount/passwd /etc/passwd\nrm -f /etc/group && ln -s /var/secrets/abcdesktop/localaccount/group  /etc/group\nrm -f /etc/shadow && ln -s /var/secrets/abcdesktop/localaccount/shadow /etc/shadow\nrm -f /etc/gshadow && ln -s /var/secrets/abcdesktop/localaccount/gshadow /etc/gshadow\n

Now your files are updated. You can exit, and reopen a bash to your container

root@hermespodapp:/# exit\n
# runc --root /run/containerd/runc/k8s.io/ exec -t -u 0 $CONTAINER bash\nroot@hermespodapp:/# \n

The error message does not appear anymore.

Install your X11 applications as root

apt-get update && apt-get install -y x11-apps\n

Quit the root session

exit\n
"},{"location":"common/3.0/createcontainerisedapplicationdebug/#start-your-x11-application-as-hermes","title":"Start your X11 application as hermes","text":"

Start a new session to the pod hermespodapp

kubectl -n abcdesktop exec -it hermespodapp -- bash \n

You get a shell prompt as as hermes. Check the hermes homedirectory and id number

hermes@hermespodapp:/$\nhermes@hermespodapp:/$ cd\nhermes@hermespodapp:~$ pwd\n/home/hermes\nhermes@hermespodapp:~$ id \nuid=1051(hermes) gid=2051(hermes) groups=2051(hermes)\n

Export the var DISPLAY and start the edit application. You don't need to create the .Xauthority file. /home/hermes is already mounted as a volume.

hermes@hermespodapp:~$ export DISPLAY=:0.0\nhermes@hermespodapp:~$ xedit &\n[1] 699\n

This process is running as hermes :

hermes@hermespodapp:~$ ps -ef\nUID          PID    PPID  C STIME TTY          TIME CMD\nhermes         1       0  0 15:57 ?        00:00:00 /bin/sleep 1d\nhermes       690       0  0 16:47 pts/0    00:00:00 bash\nhermes       699     690  0 16:48 pts/0    00:00:00 xedit\nhermes       700     690  0 16:49 pts/0    00:00:00 ps -ef\n

Go back to your web browser.

A new x11 window xedit should be present on your display

The name of the edit window is the name of your pod (hermespodapp).

To clean the running pod hermespodapp

kubectl delete -f hermespodapp.yaml \n

You have created a pod to run an X11 application as a user in LDAP Directory. You get a root shell inside the pod, to patch, update or install other applications.

"},{"location":"common/3.0/mount_nfs_tag/","title":"Define rules to mount a nfs volume inside user pod","text":"

Only supported in abcdesktop release 3.0

An nfs volume allows an existing NFS (Network File System) share to be mounted into a Pod. NFS volume can be pre-populated with data, and can be shared between pods. NFS can be mounted by multiple writers simultaneously.

You must have your own NFS server running with the share exported before you can use it.

"},{"location":"common/3.0/mount_nfs_tag/#update-the-odconfig-file","title":"Update the od.config file","text":"

Update the od.config to add

"},{"location":"common/3.0/mount_nfs_tag/#add-a-label-in-the-auth-provider","title":"Add a label in the auth provider","text":"

In this example, we add a label nfsuser as a condition to mount nfs resource

In the auth provider add a dummy condition or a memberOf condition. All types of conditions are supported, the goal is only to get a label.

Update the od.config file and look for the default ldapconfig dictionnary

"},{"location":"common/3.0/mount_nfs_tag/#add-a-dummy-condition","title":"Add a dummy condition","text":"
ldapconfig : { \n  'planet': {  \n    'default'       : True,\n    'ldap_timeout'  : 15,\n    'ldap_basedn'   : 'dc=planetexpress,dc=com',\n    'users_ou'      : 'ou=people,dc=planetexpress,dc=com',\n    'servers'       : [ 'ldap://openldap.abcdesktop.svc.cluster.local:30389' ],\n    'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n    'policies': { \n       'acls': None, \n       'rules' : { \n          'rule-dummy': { \n             'conditions' : [ { 'boolean': True, 'expected' : True  } ],\n             'expected' : True,\n             'label': 'nfsuser' } } } } } }\n
"},{"location":"common/3.0/mount_nfs_tag/#or-add-a-memberof-condition","title":"Or Add a memberOf condition","text":"
ldapconfig : { \n  'planet': {  \n    'default'       : True,\n    'ldap_timeout'  : 15,\n    'ldap_basedn'   : 'dc=planetexpress,dc=com',\n    'users_ou'      : 'ou=people,dc=planetexpress,dc=com',\n    'servers'       : [ 'ldap://openldap.abcdesktop.svc.cluster.local:30389' ],\n    'serviceaccount': { 'login': 'cn=admin,dc=planetexpress,dc=com', 'password': 'GoodNewsEveryone' },\n    'policies': { \n       'acls': None, \n       'rules' : { \n          'rule-nfsuser':  { \n              'conditions' : [ { 'memberOf': 'cn=admin_staff,ou=people,dc=planetexpress,dc=com',   'expected' : True  } ],\n              'expected' : True, \n              'label': 'nfsuser' } } } } }\n
"},{"location":"common/3.0/mount_nfs_tag/#add-a-rule-in-the-desktoppolicies","title":"Add a rule in the desktop.policies","text":"

In this example, we define entries :

The mount command become like:

mount -t nfs 192.168.7.101:/volume1/isostore /mnt/iso\n

Update the desktop.policies dictionnary and add a new key rules. In the new rules define a new entry nfsuser.

The name of the entry MUST match a user label tag, else the mount point is not created.

In this example the label is defined as nfsuser, but you can set differents values. Then set nfs descriptions as you can read in kubernetes nfs volume

desktop.policies: {  \n'acls' : {},\n'rules': { \n  'volumes': { \n    'nfsuser': {\n      'type': 'nfs', \n      'name': 'isostore', \n      'server': '192.168.7.101',\n      'path': '/volume1/isostore',\n      'mountPath': '/mnt/iso',\n      'readOnly': True } } } } \n
"},{"location":"common/3.0/mount_nfs_tag/#apply-the-new-odconfig-file","title":"Apply the new od.config file","text":"

Save your local changes in od.config, and update the new configmap abcdesktop-config

kubectl delete configmap abcdesktop-config -n abcdesktop\nkubectl create --from-file=od.config -n abcdesktop\n
"},{"location":"common/3.0/mount_nfs_tag/#restart-pyos","title":"Restart pyos","text":"

Restart pyos pods

kubectl delete pod -l run=pyos-od -n abcdesktop\n
pod \"pyos-od-5586b88767-64jwt\" deleted\n
"},{"location":"common/3.0/mount_nfs_tag/#create-a-new-desktop-for-hermes-conrad-and-list-nfs-files","title":"Create a new desktop for Hermes Conrad and list nfs files","text":"

Open the url http://localhost:30443, in your web browser, to start a simple user's pod.

http://localhost:30443\n

You can define many rules from LDAP groups. To get more informations about rules, read the authentification rules section

"},{"location":"common/3.0/multiplegroupsfeature/","title":"The multiple groups features for RFC 2307 support","text":"

Let talk about a common features with multiple groups and user securityContext on pods

"},{"location":"common/3.0/multiplegroupsfeature/#context","title":"context","text":""},{"location":"common/3.0/multiplegroupsfeature/#goal","title":"Goal","text":""},{"location":"common/3.0/multiplegroupsfeature/#check-the-kubernetes-supplementalgroups-support","title":"Check the kubernetessupplementalGroups support","text":"

Let's create a yaml file to define pod with securityContext and supplementalGroups

apiVersion: v1\nkind: Pod\nmetadata:\n  name: security-context-supplementalgroups-demo\nspec:\n  securityContext:\n    runAsUser: 1000\n    runAsGroup: 3000\n    supplementalGroups: [2000,4000,5000,6000]\n  volumes:\n  - name: sec-ctx-vol\n    emptyDir: {}\n  containers:\n  - name: sec-ctx-demo\n    image: busybox:1.28\n    command: [ \"sh\", \"-c\", \"sleep 1h\" ]\n    volumeMounts:\n    - name: sec-ctx-vol\n      mountPath: /data/demo\n    securityContext:\n      allowPrivilegeEscalation: false\n

Create the pod security-context-supplementalgroups-demo

$ kubectl create -f https://raw.githubusercontent.com/abcdesktopio/conf/main/kubernetes/security-context-supplementalgroups-demo.yaml\n

The pod is created

pod/security-context-supplementalgroups-demo created\n

Test the id command, you get the list uid=1000 gid=3000 groups=2000,4000,5000,6000

$ kubectl exec -it pod/security-context-supplementalgroups-demo -- id\nuid=1000 gid=3000 groups=2000,4000,5000,6000\n

Run the group command inside the pod

$ kubectl exec -it pod/security-context-supplementalgroups-demo -- groups\n

The result exit with code 1. The groups do not exist in /etc/group

 3000groups: unknown ID 3000\n 2000groups: unknown ID 2000\n 4000groups: unknown ID 4000\n 5000groups: unknown ID 5000\n 6000groups: unknown ID 6000\n command terminated with exit code 1\n

This is what you want to do with abcdesktop, the id numbers are replaced by strings. The uid, gid and supplementalgroups are read from posixAccount and posixGroup in the directory service.

"},{"location":"common/3.0/multiplegroupsfeature/#read-specsecuritycontext-from-a-pod","title":"Read .spec.securityContext from a pod","text":"

kubectl command to read .spec.securityContext

kubectl get pod/security-context-supplementalgroups-demo -o json | jq '.spec.securityContext' \n

You read as output

{\n  \"runAsGroup\": 3000,\n  \"runAsUser\": 1000,\n  \"supplementalGroups\": [\n    2000,\n    4000,\n    5000,\n    6000\n  ]\n}\n
"},{"location":"common/3.0/multiplegroupsfeature/#accounts-description","title":"Accounts description","text":"

The complete ldif file can be downloaded at the end of this page.

The ldif set :

Create a posixAccount : cn=hermes,ou=people,dc=planetexpress,dc=com - gidNumber: 1036 - uid: hermes - uidNumber: 1035

Create a posixGroup for hermes : cn=hermes,ou=groups,dc=planetexpress,dc=com

Create a posixGroup : cn=accountant,ou=groups,dc=planetexpress,dc=com

Create a posixGroup cn=humans,ou=groups,dc=planetexpress,dc=com

"},{"location":"common/3.0/multiplegroupsfeature/#login-to-abcdesktop","title":"Login to abcdesktop","text":"

Login to abcdesktop as Hermes Conrad account

Inside the user pod, the unix group file contains :

cat /etc/group\n
hermes:x:1036:\nhumans:x:20467:hermes,fry\naccountant:x:18430:hermes\n

This is correct.

The user's pod is defined with a securityContext

In this example you can replace hermes-d1411d93-8922-4c33-81d7-3c085f381a27 by your own pod's name

kubectl get pods hermes-d1411d93-8922-4c33-81d7-3c085f381a27 -n abcdesktop -o json| jq '.spec.securityContext'  \n

You can read on stdout

{\n  \"runAsGroup\": 1036,\n  \"runAsUser\": 1035,\n  \"supplementalGroups\": [\n    20467,\n    18430\n  ]\n}\n

This is correct. supplementalGroups defines the others groups from LDAP for DN:cn=hermes,ou=groups,dc=planetexpress,dc=com

Inside the user pod run the id command

hermes:~$ id\nuid=1035(hermes) gid=1036(hermes) groups=1036(hermes),18430(accountant),20467(humans)\nhermes:~$ groups\nhermes accountant humans\nhermes:~$\n

This is correct.

"},{"location":"common/3.0/multiplegroupsfeature/#create-new-file-on-host","title":"Create new file on host","text":"

The default home directory in od.config is a volume hostPath set to /tmp

desktop.homedirectorytype: 'hostPath' \ndesktop.hostPathRoot: '/tmp'\n

On your host server, get a shell with as root account, create a file humansfile with restricted access to member of humans group.

cd /mnt/hermes-conrad\necho 'hello' > humansfile\nchown 0:20467 humansfile\nchmod 070 humansfile \n

Check the owner and group of the new file humansfile

ls -la humansfile\n----rwx--- 1 root 20467 6 nov.  23 17:16 humansfile\n

Check inside the user pod check that hermes account can write data in the new file humansfile.

This is correct hermes is member of humans group.

hermes:~$ ls -la humansfile \n=======\n- memberUid: `hermes`\n\nInside the user pod, the unix group file contains : \n\n```bash\ncat /etc/group\n
hermes:x:1036:\nhumans:x:20467:hermes,fry\naccountant:x:18430:hermes\n

This is correct.

The user's pod is defined with a securityContext

'securityContext': {\n  'runAsUser': 1035,\n  'runAsGroup': 1036,\n  'supplementalGroups': [20467, 18430] \n}\n

This is correct. supplementalGroups defines the others groups from LDAP

Inside the user pod run the id command

hermes:~$ id\nuid=1035(hermes) gid=1036(hermes) groups=1036(hermes),18430(accountant),20467(humans)\nhermes:~$ groups\nhermes accountant humans\nhermes:~$\n

This is correct.

"},{"location":"common/3.0/multiplegroupsfeature/#create-new-file-on-host_1","title":"Create new file on host","text":"

The default home directory in od.config is a volume hostPath set to /tmp

desktop.homedirectorytype: 'hostPath' \ndesktop.hostPathRoot: '/tmp'\n

On your host server, using a root account, create a file humansfile with restricted access to member of humans group.

cd /mnt/hermes-conrad\necho 'hello' > humansfile\nchown 0:20467 humansfile\nchmod 070 humansfile \n

Check the owner and group

ls -la humansfile\n----rwx--- 1 root 20467 6 nov.  23 17:16 humansfile\n

Check inside the user pod check that hermes account can to write data in file humansfile, because hermes is member of humans group.

hermes:~$ ls -la humansfile \n>>>>>>> 612b52bcffb502a9d934c0cbba40a43d553fc731\n----rwx--- 1 root humans 6 Nov 23 16:16 humansfile\nhermes:~$ echo 'hello from hermes' >> humansfile \nhermes:~$ more humansfile \nhello\nhello from hermes\n<<<<<<< HEAD\nhermes:~$ \n

This is correct.

We describe a common features with multiple groups and user securityContext on pods and abcdesktop support multiple groups with posixGroup define in RFC2307.

"},{"location":"common/3.0/multiplegroupsfeature/#ldap-ldif-dump","title":"LDAP ldif dump","text":"

To get more details about the ldif and ldap datas, you can download the ldif file planetexpress.

version: 1\n=======\nhermes:~$ \n

This is correct.

We describe a common features with multiple groups and user securityContext on pods and abcdesktop support multiple groups with posixGroup define in RFC2307.

"},{"location":"common/3.0/multiplegroupsfeature/#ldif-dump","title":"ldif dump","text":"

To get more details about the ldif and ldap datas, you can download the ldif file planetexpress.

version: 1\n>>>>>>> 612b52bcffb502a9d934c0cbba40a43d553fc731\n\ndn: dc=planetexpress,dc=com\nobjectClass: dcObject\nobjectClass: organization\nobjectClass: top\ndc: planetexpress\no: Planet Express, Inc.\n\ndn: ou=people,dc=planetexpress,dc=com\nobjectClass: organizationalUnit\nobjectClass: top\nou: people\ndescription: Planet Express crew\n\ndn: cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com\nobjectClass: inetOrgPerson\nobjectClass: organizationalPerson\nobjectClass: person\nobjectClass: posixAccount\nobjectClass: top\ncn: Hermes Conrad\ngidNumber: 1036\nhomeDirectory: /home/hermes\nsn: Conrad\nuid: hermes\nuidNumber: 1035\ndescription: Human\nemployeeType: Accountant\nemployeeType: Bureaucrat\ngivenName: Hermes\nmail: hermes@planetexpress.com\nou: Office Management\n\ndn: ou=groups,dc=planetexpress,dc=com\nobjectClass: organizationalUnit\nobjectClass: top\nou: groups\n\ndn: cn=fry,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: fry\ngidNumber: 1025\nmemberUid: fry\n\ndn: cn=humans,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: humans\ngidNumber: 20467\nmemberUid: fry\nmemberUid: hermes\n\ndn: cn=hermes,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: hermes\ngidNumber: 1036\n\ndn: cn=accountant,ou=groups,dc=planetexpress,dc=com\nobjectClass: posixGroup\nobjectClass: top\ncn: accountant\ngidNumber: 18430\nmemberUid: hermes\n
"},{"location":"common/3.0/update_frontend_image/","title":"Update and custom frontend web page","text":"

abcdesktop uses a front HTML web site and X11 Linux application. So, to get a new graphic design, you have to define it twice in HTML (CSS) files and in X11 config.

"},{"location":"common/3.0/update_frontend_image/#requirements","title":"Requirements","text":""},{"location":"common/3.0/update_frontend_image/#goals","title":"Goals","text":""},{"location":"common/3.0/update_frontend_image/#configure-odconfig-to-use-the-new-color","title":"Configure od.config to use the new color","text":"

In the od.config, add the env var ABCDESKTOP_BG_COLOR

desktop.envlocal :  {\n  'X11LISTEN':'tcp', \n  'WEBSOCKIFY_HEARTBEAT':'30',\n  'TURN_PROTOCOL': 'tcp',\n  'ABCDESKTOP_BG_COLOR': \u2018#18974c\u2019 }\n

Then update the config map abcdesktop-config and restart deployment pyos-od

kubectl create -n abcdesktop configmap abcdesktop-config --from-file=od.config -o yaml --dry-run=client | kubectl replace -n abcdesktop -f -\nkubectl rollout restart deployment pyos-od -n abcdesktop\n

You should read on stdout

configmap/abcdesktop-config replaced\ndeployment.apps/pyos-od restarted\n
"},{"location":"common/3.0/update_frontend_image/#create-new-image-for-abcdesktop-ocnginx","title":"Create new image for abcdesktop oc.nginx","text":""},{"location":"common/3.0/update_frontend_image/#download-uijson-file","title":"Download ui.json file","text":"

Download the ui.json file. ui.json is located in webModules/transpile/config directory of webModules abcdesktop's repository.

mkdir build\ncd build\nwget https://raw.githubusercontent.com/abcdesktopio/webModules/3.2/transpile/config/ui.json\n

ui.json is a json dictionary file

The main entres are :

entry default value example name abcdesktop.io acmedesktop.io projectNameSplitedHTML <span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>b</span><span id='projectNameSplitedStagec'>c</span><span id='projectNameSplitedStaged'>desktop</span><span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>
{\n  \"name\": \"abcdesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>a</span><span id='projectNameSplitedStageb'>b</span><span id='projectNameSplitedStagec'>c</span><span id='projectNameSplitedStaged'>desktop</span>\",\n  \"colors\": [\n    {\n      \"name\": \"@x11bgcolor\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#6EC6F0\"\n    },\n    {\n      \"name\": \"@quaternary\",\n      \"value\": \"#1E1E1E\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#527EDB\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\",\n  \"urlusermanual\":  \"https://www.abcdesktop.io/\",\n  \"urlusersupport\": \"https://www.abcdesktop.io/\",\n  \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
"},{"location":"common/3.0/update_frontend_image/#update-the-uijson-with-your-own-values","title":"Update the ui.json with your own values","text":"

Change for example the name of the project, and projectNameSplitedHTML to

  \"name\": \"acmedesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>\",\n

Change the color @x11bgcolor with your own.

entry name new color value @x11bgcolor #18974c

You should use the same value for ABCDESKTOP_BG_COLOR and for @x11bgcolor.

Example

{\n  \"name\": \"acmedesktop.io\",\n  \"projectNameSplitedHTML\": \"<span id='projectNameSplitedStagea'>A</span><span id='projectNameSplitedStageb'>c</span><span id='projectNameSplitedStagec'>me</span><span id='projectNameSplitedStaged'>desktop</span>\",\n   \"colors\": [\n    {\n      \"name\": \"@x11bgcolor\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@primary\",\n      \"value\": \"#474B55\"\n    },\n    {\n      \"name\": \"@secondary\",\n      \"value\": \"#2D2D2D\"\n    },\n    {\n      \"name\": \"@tertiary\",\n      \"value\": \"#18974C\"\n    },\n    {\n      \"name\": \"@quaternary\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@svgColor\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@danger\",\n      \"value\": \"#CD3C14\"\n    },\n    {\n      \"name\": \"@success\",\n      \"value\": \"#32C832\"\n    },\n    {\n      \"name\": \"@info\",\n      \"value\": \"#18974c\"\n    },\n    {\n      \"name\": \"@warning\",\n      \"value\": \"#FFCC00\"\n    },\n    {\n      \"name\": \"@light\",\n      \"value\": \"#FFFFFF\"\n    },\n    {\n      \"name\": \"@dark\",\n      \"value\": \"#666666\"\n    },\n    {\n      \"name\": \"@blue\",\n      \"value\": \"#4BB4E6\"\n    },\n    {\n      \"name\": \"@green\",\n      \"value\": \"#50BE87\"\n    },\n    {\n      \"name\": \"@purple\",\n      \"value\": \"#A885D8\"\n    },\n    {\n      \"name\": \"@pink\",\n      \"value\": \"#FFB4E6\"\n    },\n    {\n      \"name\": \"@yellow\",\n      \"value\": \"#FFD200\"\n    }\n  ],\n  \"urlcannotopensession\": \"/identification/site/\",\n  \"urlusermanual\":  \"https://www.abcdesktop.io/\",\n  \"urlusersupport\": \"https://www.abcdesktop.io/\",\n  \"urlopensourceproject\": \"https://www.abcdesktop.io/\"\n}\n
"},{"location":"common/3.0/update_frontend_image/#create-a-new-dockerfile-to-build-changes","title":"Create a new Dockerfile to build changes","text":""},{"location":"common/3.0/update_frontend_image/#write-your-dockerfile-to-build-the-new-image","title":"Write your Dockerfile to build the new image","text":"

Dockerfile

#\n# --- update oc.nginx:builder image start here ---\n# use the abcdesktopio/oc.nginx:builder\n# oc.nginx:builder contains Makefile and tools like nodejs, lessc need to update the ui.json file\n# oc.nginx:builder source https://raw.githubusercontent.com/abcdesktopio/oc.nginx/main/Dockerfile.builder          \n\n#######\nFROM abcdesktopio/oc.nginx:builder as builder\n# copy data files /var/webModules\nCOPY --from=abcdesktopio/oc.nginx:3.2 var/webModules /var/webModules\n# copy updated file ui.json with your own custom values\nCOPY ui.json /var/webModules/transpile/config/\n\n# run makefile\n# make dev (for dev)\n# make prod (for prod)\nRUN cd /var/webModules && make dev\n# make version to update the version number from .git commit\nRUN cd /var/webModules && ./mkversion.sh\n\n#######\n#\n# --- oc.nginx image start here ---\n#\nFROM abcdesktopio/oc.nginx:3.2\n# COPY updated files from builder container to oc.nginx\nCOPY --from=builder var/webModules /var/webModules\nRUN cat /var/webModules/index.html\n
"},{"location":"common/3.0/update_frontend_image/#docker-build","title":"Docker build","text":"

Run the docker build command to build the new oc.nginx:acme image

docker build -t oc.nginx:acme .\n
# docker build -t oc.nginx:acme .\nSending build context to Docker daemon  21.88MB\nStep 1/8 : FROM abcdesktopio/oc.nginx:builder as builder\nbuilder: Pulling from abcdesktopio/oc.nginx\neaead16dc43b: Pull complete \n2b469c68b643: Pull complete \n5cee1fa1576f: Pull complete \n359c5b0dcf0a: Pull complete \nDigest: sha256:b9b2c232a885405df39e146d7ac02f3da034a5addc78c00faca59e2d8934ec5b\nStatus: Downloaded newer image for abcdesktopio/oc.nginx:builder\n ---> ef7e71c277b9\nStep 2/8 : COPY --from=abcdesktopio/oc.nginx:3.2 var/webModules /var/webModules\n3.0: Pulling from abcdesktopio/oc.nginx\neaead16dc43b: Already exists \nd78e49ae48aa: Pull complete \n5a1b3cde12da: Pull complete \nd46852e47788: Pull complete \n301ba448a167: Pull complete \ne352a410ea9e: Pull complete \n6478c15f8c14: Pull complete \n52697000c467: Pull complete \n4f346a00bc16: Pull complete \n9d4bc434c5bb: Pull complete \nDigest: sha256:d8692b633b221654899d8dbe7987330f878364d7288ec5628f7aa47152ce4ea6\nStatus: Downloaded newer image for abcdesktopio/oc.nginx:3.2\n\n ---> c5a084901830\nStep 3/8 : COPY ui.json /var/webModules/transpile/config/\n ---> cbb23fb8634e\nStep 4/8 : RUN cd /var/webModules && make prod\n ---> Running in 976ee31ac5db\ncreate html page /var/webModules/demo.html\ncreate html page /var/webModules/index.session.mustache.html\ncreate html page /var/webModules/app.html\ncreate html page /var/webModules/app.session.mustache.html\ncreate html page /var/webModules/index.html\ncreate html page /var/webModules/description.html\nApply userInterface conf: 1.355s\nTransform and copy js files:\nBuild svg: 2.034s\nBuild css: 2.041s\n[...]\nTotal duration copy and transform: 10.430s\nWriting /var/webModules/app.js\nWriting /var/webModules/index.html: 0.975ms\nWriting /var/webModules/app.html: 0.855ms\nWriting /var/webModules/index.session.mustache.html: 0.781ms\nBuild app.js file: 11.362s\nremove out dir base /var/webModules/build: 9.129ms\nTotal duration: 12.752s\nRemoving intermediate container 976ee31ac5db\n ---> 784902ce50c1\nStep 5/8 : FROM abcdesktopio/oc.nginx:3.2\n ---> c77f6c5ca8a1\nStep 6/8 : COPY --from=builder var/webModules /var/webModules\n ---> 68474a5ee2d5\nStep 7/8 : RUN cat /var/webModules/index.html\n ---> Running in ddb958078b50\n [...]\nRemoving intermediate container ddb958078b50\n ---> f02e3c57ec7e\nStep 8/8 : LABEL name=\"frontend acmedesktop base image\"       maintainer=\"acmedesktop\"       version=\"3.0\"\n ---> Running in da5363dcf434\nRemoving intermediate container da5363dcf434\n ---> b5449d85393f\nSuccessfully built b5449d85393f\nSuccessfully tagged oc.nginx:acme\n

Run the docker images command to read the new oc.nginx image

docker images \n\nREPOSITORY              TAG       IMAGE ID       CREATED         SIZE\noc.nginx                acme      b5449d85393f   2 minutes ago   685MB\n
"},{"location":"common/3.0/update_frontend_image/#save-the-container-image-to-a-file","title":"Save the container image to a file","text":"
docker image save oc.nginx:acme -o oc.nginx.acme\n
"},{"location":"common/3.0/update_frontend_image/#import-the-file-ocnginxacme-in-k8sio-namespace-for-containerd","title":"Import the file oc.nginx.acme in k8s.io namespace for containerd","text":"

The oc.nginx.acme not is listed in the k8s.io namespace.

Run the ctr command line to import oc.nginx.acme

ctr -n k8s.io images import oc.nginx.acme \nunpacking docker.io/library/oc.nginx:acme (sha256:5c3debc775894d079fa61be7f8217be0ecc7b2e7c47f0318bc1c94921c278e14)...done\n

Check that your new image is listed

ctr -n k8s.io images ls |grep oc.nginx:acme\ndocker.io/library/oc.nginx:acme                                                                                                  application/vnd.docker.distribution.manifest.v2+json      sha256:5c3debc775894d079fa61be7f8217be0ecc7b2e7c47f0318bc1c94921c278e14 384.9 MiB linux/amd64                                                                                                                        io.cri-containerd.image=managed \n
"},{"location":"common/3.0/update_frontend_image/#update-abcdesktopyaml-file","title":"Update abcdesktop.yaml` file","text":"

Update your own abcdesktop.yaml file to replace the default image abcdesktopio/oc.nginx:3.0 by the new container image oc.nginx:acme name.

 containers:\n      - name: nginx\n        imagePullPolicy: Always\n        image: abcdesktopio/oc.nginx:3.2\n

Replace :

 containers:\n      - name: nginx\n        image: oc.nginx:acme\n

Apply the new abcdesktop.yaml file

kubectl apply -f abcdesktop.yaml \n

The deployment.apps/nginx-od is configured

clusterrole.rbac.authorization.k8s.io/pyos-role unchanged\nclusterrolebinding.rbac.authorization.k8s.io/pyos-rbac unchanged\nserviceaccount/pyos-serviceaccount unchanged\nstorageclass.storage.k8s.io/storage-local-abcdesktop unchanged\nconfigmap/nginx-config unchanged\ndeployment.apps/memcached-od unchanged\nsecret/mongodb-secret configured\ndeployment.apps/mongodb-od unchanged\ndeployment.apps/nginx-od configured\ndeployment.apps/speedtest-od unchanged\ndeployment.apps/nginx-od configured\nendpoints/desktop unchanged\nservice/desktop unchanged\nservice/memcached unchanged\nservice/mongodb unchanged\nservice/speedtest unchanged\nservice/nginx unchanged\nservice/pyos unchanged\ndeployment.apps/openldap-od unchanged\nservice/openldap unchanged\n

Start you web browser. You can read the new project name at the home page. After login you get the new color.

You have updated the html web page for abcdesktop release 3.X

"},{"location":"core/memcached/","title":"Memcached","text":"

The memcached container comes from the public docker registry. This service is attend to the netback network.

memcached store pods and containers message during the create process.

"},{"location":"core/memcached/#create-desktop","title":"create desktop","text":""},{"location":"core/memcached/#create-desktop-message","title":"create desktop message","text":"

Messages stored into memcache

status user message OK 'Looking for your desktop' OK 'Looking for your desktop done' OK 'Building desktop' OK 'Starting network services, it will take a while...' OK 'Network services started.' OK 'Starting desktop graphical service %ds / %d' % (nCount,nCountMax) OK 'Starting desktop spawner service %ds / %d' % (nCount,nCountMax) OK 'Desktop services are ready after %d s' Error 'createDesktop error - myOrchestrator.createDesktop %s'"},{"location":"core/mongodb/","title":"Mongodb","text":"

Mongodb is an open-source document database that provides high performance, high availability, and automatic scaling.

The mongodb container comes from the public docker registry. This service is attend to the netback network.

"},{"location":"core/mongodb/#collections","title":"Collections","text":"

abcdesktop.io uses the colections mongodb to store

"},{"location":"core/mongodb/#dock-state","title":"dock state","text":"
[ \n    \"keyboard\",\n    \"frontendjs.filemanager\",\n    \"Mail.Thunderbird\",\n    \"libreoffice.libreoffice-calc\",\n    \"libreoffice.libreoffice-writer\",\n    \"Navigator.Firefox\",\n    \"gimp.Gimp\",\n    \"gnome-terminal.Gnome-terminal\"\n]\n
"},{"location":"core/mongodb/#loginhistory","title":"loginHistory","text":"

The object's format is :

{\n \"picture\":\"https://scontent.xx.fbcdn.net/v/t1.0-1/p480x480/1452008_10202217750222019_1258804247_n.jpg?oh=a96b2290e63e1e81525ede1a5b073853&oe=59184A75\",\n \"sub\":\"10208942501856324\",\n \"ipaddr\":\"181.125.208.3, 10.255.0.3\",\n \"provider\":\"facebook\",\n \"date\":\"2017-01-12 11:19:57.946554\",\n \"useragent\":\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36\",\n \"_id\":\"5877665d0790160b0d59efd0\",\n \"name\":\"Alexandre Devely\"}\n
"},{"location":"core/mongodb/#method","title":"method","text":"

The method getCollection, is a ligth way to get a collection on the fron-end side.

For exemple this method is use by whoami.js to obtain the login's history using the key 'loginHistory'.

 getCollection('loginHistory', function(msg) {\n            if (msg.status === 200) {\n                var history = msg.result;\n                loginHistory = history;\n                buildHtmlTable(history);\n            }\n        })\n
"},{"location":"core/nginx/","title":"Nginx oc.nginx","text":"

Nginx is used as a reverse proxy server for HTTP, HTTPS protocols, as well as a load balancer, HTTP cache, and a web server (origin server).

"},{"location":"core/nginx/#nginx-routing","title":"Nginx routing","text":""},{"location":"core/nginx/#nginx-configuration","title":"Nginx Configuration","text":""},{"location":"core/nginx/#web-site","title":"web site","text":"

The static files (html, css, js) are stored in the local /var/webModules directory.

"},{"location":"core/nginx/#main-reverse-proxy","title":"main reverse proxy","text":""},{"location":"core/nginx/#lua-scripts","title":"LUA scripts","text":"

The /etc/nginx/get.targetmap.lua read the jwt_token and return the ip address or the pod's fqdn, using the jwt_desktop_signing_public_key and the jwt_desktop_payload_private_key

It uses a targetmap (dict) as first cache level.

lua_shared_dict targetmap 1m;\n

Read the lua script get.targetmap.lua to get details jwt token data and payload encryption.

"},{"location":"core/ocuser/","title":"The POD User","text":"

After the login process, if no associated pod is all ready running, a new user pod is started. This pod starts at least a container with the graphical image.

"},{"location":"core/ocuser/#inside-the-pod-user","title":"Inside the POD User","text":"

The pod user runs by default a container with the graphical image : the oc.user.18.04.

A pod can also runs sound container image, and a printer container. These options are defined in the od.config configuration file [ section desktop.soundimage and desktop.printerimage].

"},{"location":"core/ocuser/#processes-running-inside-the-user-container","title":"Processes running inside the user container","text":"

All processes are running as the user named balloon, because none of theme need to run as root.

The userid and the guid are 4096.

"},{"location":"core/ocuser/#supervisord","title":"Supervisord","text":"

Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems. All process running inside the user container, are started by supervisord.

/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf\n

Supervisor is the parent of all running process

docker-entrypoi---supervisord-+-Xvnc\n                              |-node---10*[{node}]\n                              |-4*[nodejs---10*[{nodejs}]]\n                              |-nodejs---6*[{nodejs}]\n                              |-nodejs-+-bash---pstree\n                              |        `-11*[{nodejs}]\n                              |-openbox\n                              `-xsettingsd\n
"},{"location":"core/ocuser/#tigervnc-xvnc","title":"TigerVNC Xvnc","text":"

TigerVNC is a high-performance, platform-neutral implementation of VNC (Virtual Network Computing), a client/server application that allows users to launch and interact with graphical applications on remote machines. TigerVNC provides the levels of performance necessary to run 3D and video applications, and it attempts to maintain a common look and feel and re-use components, where possible, across the various platforms that it supports. TigerVNC also provides extensions for advanced authentication methods and TLS encryption.

Starts parameters

command=Xvnc :0 -geometry 3840x2160 -SendPrimary=0 -depth 24 -rfbunixpath /tmp/.x11vnc -pn -rfbauth /composer/run/.vnc/passwd```\n

The default DISPLAY is :0. Xvnc listen on unix socket file /tmp/.x11vnc.

"},{"location":"core/ocuser/#openbox","title":"Openbox","text":"

Openbox is the window manager, it supports extensive standards support.

Openbox is patched with few line to send SIG_USR1 and SIG_USR2 messages to internal spawner service. This patch is only required to send message (Create/Close) to the abcdesktop.io web front.

This patch add notification when X11/window change :

The notify patch send signals SIGUSR1 and SIGUSR2 to a process (pid)

#define SIG_MANAGED_WINDOW   SIGUSR1\n#define SIG_UNMANAGED_WINDOW SIGUSR2\n

Openbox is started by supervisord using the command :

command=/usr/bin/openbox --sm-disable --config-file /etc/X11/openbox/rc.xml --startup /composer/openbox/autostart.sh\n
"},{"location":"core/ocuser/#ws-tcp-bridge","title":"ws-tcp-bridge","text":"

ws-tcp-bridge A websocket to tcp proxy server, using nodejs which bridges websockets and tcp servers in either direction.

ws-tcp-bridge is started by supervisord using the command :

/composer/node/ws-tcp-bridge/ws-tcp-bridge --method=ws2tcp --lport 6081 --rhost=unix:/tmp/.x11vnc\n
"},{"location":"core/ocuser/#spawner-servicejs","title":"Spawner-service.js","text":"

spawner-service.js is a daemon written in nodejs, this daemon listen for messages on the tcp port 8001. spawner-service offers methods to interact with the container and the X11 server :

spawner-service.js is started by supervisord using the command :

command=nodejs /composer/node/spawner-service/spawner-service.js\n
"},{"location":"core/ocuser/#printer-servicejs","title":"Printer-service.js","text":"

Printer-service.js waits for a file in /home/balloon/.printer-queue directory. Printer-service.js use broadcastevent to notify the web browser to download new files to print. Printer-service.js is started by supervisord using the command :

command=nodejs /composer/node/printer-service/printer-service.js\n
"},{"location":"core/ocuser/#broadcast-servicejs","title":"Broadcast-service.js","text":"

Broadcast-service.js allows to broadcast messages between all user sharing the same session.

Broadcast-service.js is started by supervisord using the command :

command=nodejs /composer/node/broadcast-service/broadcast-service.js\n
"},{"location":"core/ocuser/#file-servicejs","title":"File-service.js","text":"

File-service.js is a upload/download service to tranfert files between the browser and the user home directory. File-service.js supports the HTTP method POST to uploadFile and GET to respond data file. File-service.js is used for printer-service.js to download PDF printed files. File-service.js use the tcp port 8080.

http.createServer(function(req, res) {\n  if (req.method === 'POST') {\n    uploadFile( req, res );\n  } \n  else if (req.method === 'GET') {\n        respondFile( req, res );\n  }\n}).listen(8080, function() {\n  console.log('Listening for requests');\n});\n

File-service.js is started by supervisord using the command :

command=nodejs /composer/node/file-service/file-service.js\n
"},{"location":"core/ocuser/#pulseaudio","title":"Pulseaudio","text":"

PulseAudio is a sound system for POSIX, and is a proxy for sound applications. It allows you to do advanced operations on your sound data as it passes between applications. Pulseaudio is use as server to forward sound between X11 applications and the user browser. It supports also virtual local sound.

file etc/pulse/default.pa

load-module module-native-protocol-unix\nload-module module-always-sink\nload-module module-native-protocol-tcp\n

Pulseaudio is started by supervisord using the command :

command=/usr/bin/pulseaudio\n
"},{"location":"core/ocuser/#xsettingsd","title":"Xsettingsd","text":"

Xsettingsd is a daemon that implements the XSETTINGS specification. Xsettingsd is use to run GTK+ applications, to configure things such as themes, font antialiasing/hinting, and UI sound effects without we using the GNOME desktop environment. Xsettingsd set the default GTK theme and color pallette:

Net/ThemeName \"Numix-Flatstudio\"\nNet/IconThemeName \"Numix-Light\"\nGtk/ColorPalette \"black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90\"\n

Xsettingsd is started by supervisord using the command.

command=/usr/bin/xsettingsd -c /home/balloon/.xsettings\n
"},{"location":"core/ocuser/#build-the-user-container-image","title":"Build the user container image","text":"

The image oc.user.XX.YY is based from the oc.software.XX.YY witch came from oc.ubuntu.XX.YY. For example : * The image oc.user.18.04 is based from the oc.software.18.04 witch came from oc.ubuntu.18.04. * The image oc.user.20.04 is based from the oc.software.20.04 witch came from oc.ubuntu.20.04. * The image oc.user.21.04 is based from the oc.software.21.04 witch came from oc.ubuntu.21.04.

+-------------------+\n| oc.user.18.04     |       (abcdesktop.io custom software component)\n+---------+---------+\n          |\n+---------+---------+\n| oc.software.18.04 |       (abcdesktop.io ubuntu software component)\n+---------+---------+\n          |\n+---------+---------+\n| oc.ubuntu.18.04   |       (abcdesktop.io ubuntu service)\n+-------------------+\n          |\n+---------+---------+\n|   ubuntu:18.04    |   (official ubuntu images from dockerhub)\n+-------------------+\n

To build the image oc.user container from scratch, you need to build there 3 images. Build oc.ubuntu.18.04 first, next oc.software.18.04, and finish by oc.user.18.04. This is done by the Makefile command.

docker build -t oc.ubuntu.18.04 -f oc.ubuntu.18.04 .\ndocker build -t oc.software.18.04 -f oc.software.18.04 .\ndocker build -t oc.user.18.04   -f oc.user.18.04 .\n

To do it automaticly, clone composer/dockerbuild and run the Makefile

git clone https://github.com/abcdesktopio/oc.user.git \nmake\n
"},{"location":"core/ocuser/#dockerfile-ocubuntuxxyy","title":"Dockerfile oc.ubuntu.XX.YY.","text":"

oc.ubuntu.XX.YY is a Dockerfile, it starts 'FROM ubuntu:XX.YY' and installs core services and libs:

"},{"location":"core/ocuser/#dockerfile-ocsoftwarexxyy","title":"Dockerfile oc.software.XX.YY","text":"

oc.software.XX.YY is a Dockerfile, it starts 'FROM oc.ubuntu.XX.YY' and installs software components:

"},{"location":"core/ocuser/#dockerfile-ocuserxxyy","title":"Dockerfile oc.user.XX.YY","text":"

oc.user.XX.YY is a Dockerfile, it starts 'FROM oc.software.XX.YY' and installs user software components:

"},{"location":"core/ocuser/#install-nodejs-dev","title":"Install nodejs dev","text":"
# Add nodejs service\nRUN cd /composer/node/broadcast-service && npm install  \nRUN cd /composer/node/file-service      && npm install\nRUN cd /composer/node/printer-service   && npm install\nRUN cd /composer/node/spawner-service   && npm install  \\\nRUN cd /composer/node/spawner-service/node_modules/geoip-lite && npm run-script updatedb\nRUN cd /composer/node/angular-filemanager-nodejs-bridge && npm install \nRUN cd /composer/node/livesound-service && npm install\n
"},{"location":"core/ocuser/#create-the-balloon-user","title":"Create the balloon user","text":"
RUN groupadd --gid 4096 $BUSER\nRUN useradd --create-home --shell /bin/bash --uid 4096 -g $BUSER --groups lpadmin,sudo $BUSER\n
"},{"location":"core/ocuser/#change-default-permission-to-run-cupsd","title":"Change default permission to run cupsd","text":"
# change acces right for printer support\nRUN addgroup $BUSER lpadmin\nRUN mkdir /var/run/cups \nRUN     chown -R $BUSER:$BUSER /var/spool/cups            && \\\n        chown -R $BUSER:$BUSER /var/spool/cups-pdf      && \\\n        chown -R $BUSER:$BUSER /var/log/cups                && \\\n        chown -R $BUSER:$BUSER /var/cache/cups          && \\\n        chown -R $BUSER:$BUSER /etc/cups/printers.conf  && \\\n        chown -R $BUSER:$BUSER /var/run/cups/\n
"},{"location":"core/ocuser/#set-the-exposed-tcp-port","title":"Set the exposed tcp port","text":"

Datas to these tcp ports are routed by nginx

PULSEAUDIO_HTTP_PORT                4714\nWS_TCP_BRIDGE_SERVICE_TCP_PORT      6081\nRESERVED_FOR_NEXT_VERSION           29780\nXTERM_TCP_PORT                      29781\nFILE_SERVICE_TCP_PORT               29783\nBROADCAST_SERVICE_TCP_PORT          29784\nRESERVED FOR CUPSD                  29785\nSPAWNER_SERVICE_TCP_PORT            29786\n
"},{"location":"core/pyos/","title":"pyos","text":"

oc.pyos is the application server for abcdesktop.io. oc.pyos is the abcdesktop control plane that configures and shuts down user desktops. This repository oc.pyos is the container of pyos. os.py is python script based on cherrypy framework and listen tcp port 8000. os.py daemon waits for json request from the javascript web client scripts, and implements methods :

"},{"location":"core/speedtest/","title":"SpeedTest","text":"

The speedtest container comes from the public docker registry.

"},{"location":"core/speedtest/#libretest-speedtest","title":"LibreTest SpeedTest","text":"

LibreSpeed/SpeedTest is a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers. LibreSpeed/SpeedTest works with no Flash, no Java, no Websocket.

"},{"location":"services/file-service/","title":"File service v1.0.0","text":""},{"location":"services/file-service/#file-service","title":"File service v1.0.0","text":"

Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

A sample API

Base URLs:

"},{"location":"services/file-service/#file-service-default","title":"Default","text":""},{"location":"services/file-service/#get__","title":"get__","text":"

GET /

Get file from the home directory

Example responses

403 Response

"},{"location":"services/file-service/#get__-responses","title":"Responses","text":"Status Meaning Description Schema 403 Forbidden none Inline 404 Not Found none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#get__-responseschema","title":"Response Schema","text":"

Status Code 403

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 404

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 500

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data any false none none This operation does not require authentication"},{"location":"services/file-service/#post__","title":"post__","text":"

POST /

Upload a file at a given path

Body parameter

Example responses

200 Response

"},{"location":"services/file-service/#post__-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 403 Forbidden none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#post__-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 403

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 500

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/file-service/#delete__","title":"delete__","text":"

DELETE /

Remove a given file wich is present in home directory

Body parameter

{\n  \"myFilename\": \"string\"\n}\n
"},{"location":"services/file-service/#delete__-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb myFilename body string true none

Example responses

200 Response

"},{"location":"services/file-service/#delete__-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 400 Bad Request none Inline 403 Forbidden none Inline 404 Not Found none Inline 500 Internal Server Error none Inline"},{"location":"services/file-service/#delete__-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 400

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 403

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 404

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 500

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data strin false none none This operation does not require authentication"},{"location":"services/file-service/#get__directory_list","title":"get__directory_list","text":"

GET /directory/list

List files in a given directory

"},{"location":"services/file-service/#get__directory_list-parameters","title":"Parameters","text":"Name In Type Required Description directoryName query string true none"},{"location":"services/file-service/#get__directory_list-responses","title":"Responses","text":"Status Meaning Description Schema default Default Default response None This operation does not require authentication"},{"location":"services/spawner-service/","title":"Spawner service v1.0.0","text":""},{"location":"services/spawner-service/#spawner-service","title":"Spawner service v1.0.0","text":"

Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

A sample API

Base URLs:

"},{"location":"services/spawner-service/#spawner-service-default","title":"Default","text":""},{"location":"services/spawner-service/#get__version","title":"get__version","text":"

GET /version

Get User container version

Example responses

200 Response

{\n  \"date\": null,\n  \"commit\": \"string\",\n  \"version\": \"string\"\n}\n
"},{"location":"services/spawner-service/#get__version-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__version-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb date Date false none none \u00bb commit string false none none \u00bb version string false none none

Status Code 404

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__launch","title":"post__launch","text":"

POST /launch

Used to run builtin application process

Body parameter

{\n  \"command\": \"string\",\n  \"args\": [\n    \"string\"\n  ]\n}\n
"},{"location":"services/spawner-service/#post__launch-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb command body string true none \u00bb args body [string] false none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": {}\n}\n
"},{"location":"services/spawner-service/#post__launch-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none launch 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setaudioquality","title":"post__setAudioQuality","text":"

POST /setAudioQuality

Set the audio quality

Body parameter

{\n  \"sink\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setaudioquality-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb sink body string true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": {}\n}\n
"},{"location":"services/spawner-service/#post__setaudioquality-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none processResult 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__playaudiosample","title":"post__playAudioSample","text":"

POST /playAudioSample

Play a sample audio

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": {}\n}\n
"},{"location":"services/spawner-service/#post__playaudiosample-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none processResult 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#put__configurepulse","title":"put__configurePulse","text":"

PUT /configurePulse

Configure pulse audio for Janus

Body parameter

{\n  \"destinationIp\": \"string\",\n  \"port\": \"string\"\n}\n
"},{"location":"services/spawner-service/#put__configurepulse-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb destinationIp body string true none \u00bb port body string true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#put__configurepulse-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__broadcastwindowslist","title":"post__broadcastwindowslist","text":"

POST /broadcastwindowslist

Emit a broadcast with window list as data

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__broadcastwindowslist-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__clipboardsync","title":"post__clipboardsync","text":"

POST /clipboardsync

Synchronize X11 and gtk clipboard

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__clipboardsync-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setdesktop","title":"post__setDesktop","text":"

POST /setDesktop

Store a data as json file in desktop

Body parameter

{\n  \"key\": \"string\",\n  \"value\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setdesktop-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb key body string true none \u00bb value body string true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setdesktop-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__getdesktop","title":"get__getDesktop","text":"

GET /getDesktop

Get a data stored as json file

"},{"location":"services/spawner-service/#get__getdesktop-parameters","title":"Parameters","text":"Name In Type Required Description key query string true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": {}\n}\n
"},{"location":"services/spawner-service/#get__getdesktop-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getdesktop-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data object false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getmimeforfile","title":"get__getmimeforfile","text":"

GET /getmimeforfile

Get a mime for a given filename

"},{"location":"services/spawner-service/#get__getmimeforfile-parameters","title":"Parameters","text":"Name In Type Required Description filename query string true none

Example responses

200 Response

{\n  \"data\": {}\n}\n
"},{"location":"services/spawner-service/#get__getmimeforfile-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none MIME 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__filesearch","title":"get__filesearch","text":"

GET /filesearch

Used for list files by dock

"},{"location":"services/spawner-service/#get__filesearch-parameters","title":"Parameters","text":"Name In Type Required Description maxfile query integer false none keywords query string true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": [\n    {\n      \"file\": \"string\",\n      \"mime\": \"string\"\n    }\n  ]\n}\n
"},{"location":"services/spawner-service/#get__filesearch-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__filesearch-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [object] false none none \u00bb\u00bb file string false none none \u00bb\u00bb mime string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__generatedesktopfiles","title":"post__generateDesktopFiles","text":"

POST /generateDesktopFiles

Build desktop files to run containerized applications

Body parameter

{\n  \"list\": [\n    {\n      \"mimetype\": \"string\",\n      \"path\": \"string\",\n      \"executablefilename\": \"string\",\n      \"icon\": \"string\",\n      \"name\": \"string\",\n      \"launch\": \"string\"\n    }\n  ]\n}\n
"},{"location":"services/spawner-service/#post__generatedesktopfiles-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb list body [object] true none \u00bb\u00bb mimetype body string false none \u00bb\u00bb path body string false none \u00bb\u00bb executablefilename body string false none \u00bb\u00bb icon body string false none \u00bb\u00bb name body string false none \u00bb\u00bb launch body string false none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__generatedesktopfiles-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__getappforfile","title":"get__getappforfile","text":"

GET /getappforfile

Allow to get the app necessary

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": [\n    {\n      \"command\": \"string\",\n      \"args\": \"string\"\n    }\n  ]\n}\n
"},{"location":"services/spawner-service/#get__getappforfile-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none AppForFile 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#get__about","title":"get__about","text":"

GET /about

Get system informations

Example responses

200 Response

{\n  \"hostname\": \"string\",\n  \"ipaddr\": \"string\",\n  \"plateform\": \"string\",\n  \"arch\": \"string\",\n  \"release\": \"string\",\n  \"cpu\": \"string\",\n  \"clientipaddr\": \"string\",\n  \"country\": \"string\",\n  \"language\": \"string\",\n  \"build\": \"string\",\n  \"POD_NAMESPACE\": \"string\",\n  \"POD_NAME\": \"string\",\n  \"NODE_NAME\": \"string\",\n  \"POD_IP\": \"string\",\n  \"KUBERNETES_SERVICE_HOST\": \"string\"\n}\n
"},{"location":"services/spawner-service/#get__about-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__about-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb hostname string false none none \u00bb ipaddr string false none none \u00bb plateform string false none none \u00bb arch string false none none \u00bb release string false none none \u00bb cpu string false none none \u00bb clientipaddr string false none none \u00bb country string false none none \u00bb language string false none none \u00bb build string false none none \u00bb POD_NAMESPACE string false none none \u00bb POD_NAME string false none none \u00bb NODE_NAME string false none none \u00bb POD_IP string false none none \u00bb KUBERNETES_SERVICE_HOST string false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getsettings","title":"get__getSettings","text":"

GET /getSettings

Get configuration for settings window

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": [\n    {\n      \"tab\": \"string\",\n      \"enabled\": true\n    }\n  ]\n}\n
"},{"location":"services/spawner-service/#get__getsettings-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getsettings-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [any] false none none \u00bb\u00bb tab string false none none \u00bb\u00bb enabled boolean false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__setbackgroundcolor","title":"post__setBackgroundColor","text":"

POST /setBackgroundColor

Change the background color

Body parameter

{\n  \"color\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundcolor-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb color body string true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundcolor-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__setbackgroundimage","title":"post__setBackgroundImage","text":"

POST /setBackgroundImage

Set the background image

Body parameter

{\n  \"imgName\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundimage-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb imgName body string true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": {\n    \"color\": \"string\",\n    \"subData\": {\n      \"code\": 0,\n      \"data\": \"string\"\n    }\n  }\n}\n
"},{"location":"services/spawner-service/#post__setbackgroundimage-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#post__setbackgroundimage-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data object false none none \u00bb\u00bb color string false none none \u00bb\u00bb subData Success false none All operations completed with success \u00bb\u00bb\u00bb code integer false none none \u00bb\u00bb\u00bb data string false none none

Status Code 404

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__setdefaultimage","title":"post__setDefaultImage","text":"

POST /setDefaultImage

Set the default image as background

Example responses

200 Response

"},{"location":"services/spawner-service/#post__setdefaultimage-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 404 Not Found none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#post__setdefaultimage-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none

Status Code 404

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data string false none none This operation does not require authentication"},{"location":"services/spawner-service/#get__getwindowslist","title":"get__getwindowslist","text":"

GET /getwindowslist

Get window list

Example responses

200 Response

"},{"location":"services/spawner-service/#get__getwindowslist-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Inline 500 Internal Server Error none InternalError"},{"location":"services/spawner-service/#get__getwindowslist-responseschema","title":"Response Schema","text":"

Status Code 200

Name Type Required Restrictions Description \u00bb code integer false none none \u00bb data [any] false none none \u00bb\u00bb id integer false none none \u00bb\u00bb pid integer false none none \u00bb\u00bb wm_class string false none none \u00bb\u00bb title string false none none \u00bb\u00bb machine_name string false none none This operation does not require authentication"},{"location":"services/spawner-service/#post__activatewindows","title":"post__activatewindows","text":"

POST /activatewindows

Activate windows

Body parameter

{\n  \"windowsid\": [\n    0\n  ]\n}\n
"},{"location":"services/spawner-service/#post__activatewindows-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb windowsid body [integer] true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__activatewindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__closewindows","title":"post__closewindows","text":"

POST /closewindows

Close windows

Body parameter

{\n  \"windowsid\": [\n    0\n  ]\n}\n
"},{"location":"services/spawner-service/#post__closewindows-parameters","title":"Parameters","text":"Name In Type Required Description body body object false none \u00bb windowsid body [integer] true none

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__closewindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#post__placeallwindows","title":"post__placeAllWindows","text":"

POST /placeAllWindows

Place and resize all windows

Example responses

200 Response

{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n
"},{"location":"services/spawner-service/#post__placeallwindows-responses","title":"Responses","text":"Status Meaning Description Schema 200 OK none Success 500 Internal Server Error none InternalError This operation does not require authentication"},{"location":"services/spawner-service/#schemas","title":"Schemas","text":""},{"location":"services/spawner-service/#tocS_InternalError","title":"InternalError","text":"
{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n\n
"},{"location":"services/spawner-service/#properties","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data string false none none"},{"location":"services/spawner-service/#tocS_Success","title":"Success","text":"
{\n  \"code\": 0,\n  \"data\": \"string\"\n}\n\n

All operations completed with success

"},{"location":"services/spawner-service/#properties_1","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data string false none none"},{"location":"services/spawner-service/#tocS_processResult","title":"processResult","text":"
{\n  \"code\": 0,\n  \"data\": {}\n}\n\n
"},{"location":"services/spawner-service/#properties_2","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data object false none none"},{"location":"services/spawner-service/#tocS_launch","title":"launch","text":"
{\n  \"code\": 0,\n  \"data\": {}\n}\n\n
"},{"location":"services/spawner-service/#properties_3","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data object false none none"},{"location":"services/spawner-service/#tocS_MIME","title":"MIME","text":"
{\n  \"data\": {}\n}\n\n
"},{"location":"services/spawner-service/#properties_4","title":"Properties","text":"Name Type Required Restrictions Description data object false none none"},{"location":"services/spawner-service/#tocS_AppForFile","title":"AppForFile","text":"
{\n  \"code\": 0,\n  \"data\": [\n    {\n      \"command\": \"string\",\n      \"args\": \"string\"\n    }\n  ]\n}\n\n
"},{"location":"services/spawner-service/#properties_5","title":"Properties","text":"Name Type Required Restrictions Description code integer false none none data [object] false none none \u00bb command string false none none \u00bb args string false none none"},{"location":"setup/kubernetes_flexvolume/","title":"CIFS Flexvolume Plugin for Kubernetes","text":"

Driver for CIFS (SMB, Samba, Windows Share) network filesystems as Kubernetes volumes.

abcdesktop team is not the authors of the CIFS Flexvolume Plugin for kubernetes. This file is an update from the original source file https://raw.githubusercontent.com/fstab/cifs/. The original source code is https://github.com/fstab/cifs The author is Fabian St\u00e4ber. The update is part for abcdesktop.io

This article is just an update from Fabian St\u00e4ber work.

"},{"location":"setup/kubernetes_flexvolume/#background","title":"Background","text":"

Docker containers running in Kubernetes have an ephemeral file system: Once a container is terminated, all files are gone. In order to store persistent data in Kubernetes, you need to mount a Persistent Volume into your container. Kubernetes has built-in support for network filesystems found in the most common cloud providers, like Amazon's EBS, Microsoft's Azure disk, etc. However, some cloud hosting services, like the Hetzner cloud, provide network storage using the CIFS (SMB, Samba, Windows Share) protocol, which is not natively supported in Kubernetes.

Fortunately, Kubernetes provides Flexvolume, which is a plugin mechanism enabling users to write their own drivers. There are a few flexvolume drivers for CIFS out there, but for different reasons none of them seemed to work for me. So Fabian St\u00e4ber wrote this driver.

"},{"location":"setup/kubernetes_flexvolume/#installing","title":"Installing","text":"

The flexvolume plugin is a single shell script named cifs. This shell script must be available on the Kubernetes master and on each of the Kubernetes nodes. By default, Kubernetes searches for third party volume plugins in /usr/libexec/kubernetes/kubelet-plugins/volume/exec/.

The plugin directory can be configured with the kubelet's --volume-plugin-dir parameter, run ps aux | grep kubelet to learn the location of the plugin directory on your system (see [#1][9]). The cifs script must be located in a subdirectory named abcdesktop~cifs/. The directory name abcdesktop~cifs/ will be mapped to the Flexvolume driver name abcdesktop/cifs.

On the Kubernetes master and on each Kubernetes node run the following commands:

VOLUME_PLUGIN_DIR=\"/usr/libexec/kubernetes/kubelet-plugins/volume/exec\"\nmkdir -p \"$VOLUME_PLUGIN_DIR/abcdesktop~cifs\"\ncd \"$VOLUME_PLUGIN_DIR/abcdesktop~cifs\"\ncurl -L -O https://raw.githubusercontent.com/abcdesktop/cifs/main/cifs\nchmod 755 cifs\n

The cifs script requires a few executables to be available on each host system:

apt-get install cifs-utils jq util-linux coreutils\n\n

To check if the installation was successful, run the following command:

VOLUME_PLUGIN_DIR=\"/usr/libexec/kubernetes/kubelet-plugins/volume/exec\"\n$VOLUME_PLUGIN_DIR/abcdestkop~cifs/cifs init\n\n

It should output a JSON string containing \"status\": \"Success\". This command is also run by Kubernetes itself when the cifs plugin is detected on the file system.

"},{"location":"setup/kubernetes_flexvolume/#update-your-odconfig-file","title":"Update your od.config file","text":"

In this example, we use a Microsoft Active Directory as a LDAP Server.

CIFS is supported with kubernetes configuration, CIFS is not supported in docker non-cluster mode

Add a new policy to add a label TAG during the user's authentification process.

\n# Add an explicit authmanagers\nauthmanagers: { \n    'explicit': {\n        'show_domains': True,\n        'default_domain': 'AD',\n        'providers': {\n          'AD': { \n            'config_ref': 'adconfig', \n            'enabled': True\n           }\n        }\n    }\n}\n\n\n# add the configuration reference for adconfig\nadconfig : { 'AD': {   'default'       : True, \n                       'ldap_timeout'  : 15,\n                       'ldap_protocol' : 'ldap',\n                       'ldap_basedn'   : 'DC=ad,DC=domain,DC=local',\n                       'ldap_fqdn'     : '_ldap._tcp.ad.domain.local',\n                       'domain'        : 'AD',\n                       'domain_fqdn'   : 'AD.DOMAIN.LOCAL',\n                       'servers'       : [ '192.168.7.12' ],\n                       'kerberos_realm': 'AD.DOMAIN.LOCAL',\n                       'policies'      : { 'acls': None,\n                                           'rules' : { 'rule-domainuser' : {\n                                                  'conditions' : [ { 'primarygroupid': '513', 'expected' : True  } ],\n                                                  'expected'   : True,\n                                                  'label'      : 'domainuser' } \n} } } } } } }\n\n

In this example :

Then in the same od.config file, add rules to the desktop object to match this label domainuser

desktop.policies: { 'rules': { 'volumes': { 'domainuser':  { 'type': 'cifs', 'name': 'homedirectory', 'volumename': 'homedir' } } },\n                        'acls' : {} }\n\n

In this example :

"},{"location":"setup/kubernetes_flexvolume/#testing","title":"Testing","text":""},{"location":"setup/kubernetes_flexvolume/#apply-new-configuration-file","title":"Apply new configuration file","text":"
kubectl apply -f abcdesktop.yml\n

Open you abcdesktop website and fill the authentation form with your Microsoft Active Direcotry Service or Samba server credentials.

Run authentification on the Microsoft Active Direcotry Service or on your Samba server

Start the File Manager application. In this example, the homeDir is set to U:, the mount entry become the letter U.

Click on the homeDir to read the CIFS ressource data. In this example, the shared ressource //192.168.7.101/alex contains a file ```NAS-file.ods'

"},{"location":"setup/kubernetes_flexvolume/#troubleshooting","title":"Troubleshooting","text":"

Logs files are stored in host directory /var/log/abcdesktop/cifs

# ls -la /var/log/abcdesktop/cifs\ntotal 36\ndrwxr-xr-x 2 root root 4096 janv. 28 16:39 .\ndrwxr-xr-x 3 root root 4096 d\u00e9c.   1 12:00 ..\n-rw-r--r-- 1 root root  288 janv. 28 16:39 alex.log\n-rw-r--r-- 1 root root  832 janv. 28 16:39 cifs.log\n-rw-r--r-- 1 root root 1264 d\u00e9c.   1 14:25 error.alex.json\n-rw-r--r-- 1 root root  834 d\u00e9c.   1 14:25 error.alex.log\n-rw-r--r-- 1 root root   50 janv. 28 16:39 mount.counter\n-rw-r--r-- 1 root root   44 d\u00e9c.  22 12:20 umount.counter\n

Check the file sAMAccountName.log, cifs.log

If there is an error, look at the error.$sAMAccountName.json and error.$sAMAccountName.log

Example

-rw-r--r-- 1 root root 1264 d\u00e9c.   1 14:25 error.alex.json\n-rw-r--r-- 1 root root  834 d\u00e9c.   1 14:25 error.alex.log\n

Run mount command

mount

In this example :

# mount | grep 192.168.7.101\n//192.168.7.101/alex on /var/lib/kubelet/pods/b7530cc0-6903-458a-a133-d8a8450e3af4/volumes/abcdesktop~cifs/flexvol-cifs-homedir-alex type cifs (rw,relatime,vers=1.0,cache=strict,username=alex,uid=4096,forceuid,gid=4096,forcegid,addr=192.168.7.101,soft,unix,posixpaths,serverino,mapposix,acl,rsize=1048576,wsize=1048576,bsize=1048576,echo_interval=60,actimeo=1)\n

Check that the kubernetes secrets exist

kubectl get secrets -n abcdesktop\nNAME                                  TYPE                                  DATA   AGE\nabcdesktopjwtdesktoppayload           Opaque                                2      65d\nabcdesktopjwtdesktopsigning           Opaque                                2      65d\nabcdesktopjwtusersigning              Opaque                                2      65d\nauth-cifs-alex-flexvol-cifs-homedir   abcdesktop/cifs                       4      10m\nauth-ldif-alex                        abcdesktop/ldif                       11     10m\n
"},{"location":"setup/kubernetes_networkpolicies/","title":"Setup Network policy","text":""},{"location":"setup/kubernetes_networkpolicies/#network-policy-group","title":"Network Policy group","text":"

File need to be written

"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index e1b5816dad3725a31412846112f52f02fc808b04..d3dac6469f9baf170e6d3f0af2bb64e50b63cfb7 100644 GIT binary patch delta 14 Vcmew?^jU~izMF$%=0?^$P5>t=1dsp# delta 14 Vcmew?^jU~izMF$1ZX;_RCjce`1XTb4